| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package UR::Namespace::Command::Base; |
|
2
|
8
|
|
|
8
|
|
190
|
use strict; |
|
|
8
|
|
|
|
|
15
|
|
|
|
8
|
|
|
|
|
205
|
|
|
3
|
7
|
|
|
7
|
|
23
|
use warnings; |
|
|
7
|
|
|
|
|
8
|
|
|
|
7
|
|
|
|
|
165
|
|
|
4
|
7
|
|
|
7
|
|
24
|
use UR; |
|
|
7
|
|
|
|
|
8
|
|
|
|
7
|
|
|
|
|
41
|
|
|
5
|
|
|
|
|
|
|
|
|
6
|
7
|
|
|
7
|
|
25
|
use Cwd; |
|
|
7
|
|
|
|
|
10
|
|
|
|
7
|
|
|
|
|
425
|
|
|
7
|
7
|
|
|
7
|
|
27
|
use Carp; |
|
|
7
|
|
|
|
|
7
|
|
|
|
7
|
|
|
|
|
319
|
|
|
8
|
7
|
|
|
7
|
|
24
|
use File::Find; |
|
|
7
|
|
|
|
|
8
|
|
|
|
7
|
|
|
|
|
9753
|
|
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
our $VERSION = "0.46"; # UR $VERSION; |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
UR::Object::Type->define( |
|
13
|
|
|
|
|
|
|
class_name => __PACKAGE__, |
|
14
|
|
|
|
|
|
|
is => 'Command::V1', |
|
15
|
|
|
|
|
|
|
is_abstract => 1, |
|
16
|
|
|
|
|
|
|
has => [ |
|
17
|
|
|
|
|
|
|
namespace_name => { type => 'String', |
|
18
|
|
|
|
|
|
|
is_optional => 1, |
|
19
|
|
|
|
|
|
|
doc => 'Name of the Namespace to work in. Auto-detected if within a Namespace directory' |
|
20
|
|
|
|
|
|
|
}, |
|
21
|
|
|
|
|
|
|
lib_path => { type => "FilesystemPath", |
|
22
|
|
|
|
|
|
|
doc => "The directory in which the namespace module resides. Auto-detected normally.", |
|
23
|
|
|
|
|
|
|
is_constant => 1, |
|
24
|
|
|
|
|
|
|
calculate_from => ['namespace_name'], |
|
25
|
|
|
|
|
|
|
calculate => q( # the namespace module should have gotten loaded in create() |
|
26
|
|
|
|
|
|
|
my $namespace_module = $namespace_name; |
|
27
|
|
|
|
|
|
|
$namespace_module =~ s#::#/#g; |
|
28
|
|
|
|
|
|
|
my $namespace_path = Cwd::abs_path($INC{$namespace_module . ".pm"}); |
|
29
|
|
|
|
|
|
|
unless ($namespace_path) { |
|
30
|
|
|
|
|
|
|
Carp::croak("Namespace module $namespace_name has not been loaded yet"); |
|
31
|
|
|
|
|
|
|
} |
|
32
|
|
|
|
|
|
|
$namespace_path =~ s/\/[^\/]+.pm$//; |
|
33
|
|
|
|
|
|
|
return $namespace_path; |
|
34
|
|
|
|
|
|
|
), |
|
35
|
|
|
|
|
|
|
}, |
|
36
|
|
|
|
|
|
|
working_subdir => { type => "FilesystemPath", |
|
37
|
|
|
|
|
|
|
doc => 'The current working directory relative to lib_path', |
|
38
|
|
|
|
|
|
|
calculate => q( my $lib_path = $self->lib_path; |
|
39
|
|
|
|
|
|
|
return UR::Util::path_relative_to($lib_path, Cwd::abs_path(Cwd::getcwd)); |
|
40
|
|
|
|
|
|
|
), |
|
41
|
|
|
|
|
|
|
}, |
|
42
|
|
|
|
|
|
|
namespace_path => { type => 'FilesystemPath', |
|
43
|
|
|
|
|
|
|
doc => "The directory under which all the namespace's modules reside", |
|
44
|
|
|
|
|
|
|
is_constant => 1, |
|
45
|
|
|
|
|
|
|
calculate_from => ['namespace_name'], |
|
46
|
|
|
|
|
|
|
calculate => q( my $lib_path = $self->lib_path; |
|
47
|
|
|
|
|
|
|
return $lib_path . '/' . $namespace_name; |
|
48
|
|
|
|
|
|
|
), |
|
49
|
|
|
|
|
|
|
}, |
|
50
|
|
|
|
|
|
|
verbose => { type => "Boolean", is_optional => 1, |
|
51
|
|
|
|
|
|
|
doc => "Causes the command to show more detailed output." |
|
52
|
|
|
|
|
|
|
}, |
|
53
|
|
|
|
|
|
|
], |
|
54
|
|
|
|
|
|
|
doc => 'a command which operates on classes/modules in a UR namespace directory' |
|
55
|
|
|
|
|
|
|
); |
|
56
|
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
sub create { |
|
58
|
11
|
|
|
11
|
1
|
2477
|
my $class = shift; |
|
59
|
|
|
|
|
|
|
|
|
60
|
11
|
|
|
|
|
118
|
my ($rule,%extra) = $class->define_boolexpr(@_); |
|
61
|
11
|
|
|
|
|
34
|
my($namespace_name, $lib_path); |
|
62
|
11
|
100
|
|
|
|
46
|
if ($rule->specifies_value_for('namespace_name')) { |
|
63
|
6
|
|
|
|
|
31
|
$namespace_name = $rule->value_for('namespace_name'); |
|
64
|
6
|
|
|
|
|
46
|
$lib_path = $class->resolve_lib_path_for_namespace_name($namespace_name); |
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
} else { |
|
67
|
5
|
|
|
|
|
40
|
($namespace_name,$lib_path) = $class->resolve_namespace_name_from_cwd(); |
|
68
|
5
|
100
|
|
|
|
26
|
unless ($namespace_name) { |
|
69
|
1
|
|
|
|
|
23
|
$class->error_message("Could not determine namespace name."); |
|
70
|
1
|
|
|
|
|
3
|
$class->error_message("Run this command from within a namespace subdirectory or use the --namespace-name command line option"); |
|
71
|
1
|
|
|
|
|
13
|
return; |
|
72
|
|
|
|
|
|
|
} |
|
73
|
4
|
|
|
|
|
38
|
$rule = $rule->add_filter(namespace_name => $namespace_name); |
|
74
|
|
|
|
|
|
|
} |
|
75
|
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
# Use the namespace. |
|
77
|
10
|
50
|
|
|
|
93
|
$class->status_message("Loading namespace module $namespace_name") if ($rule->value_for('verbose')); |
|
78
|
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
# Ensure the right modules are visible to the command. |
|
80
|
|
|
|
|
|
|
# Make the module accessible. |
|
81
|
|
|
|
|
|
|
# We'd like to "use lib" this directory, but any other -I/use-lib |
|
82
|
|
|
|
|
|
|
# requests should still come ahead of it. This requires a little munging. |
|
83
|
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
# Find the first thing in the compiled_inc list that exists |
|
85
|
10
|
|
|
|
|
29
|
my $compiled = ''; |
|
86
|
10
|
|
|
|
|
75
|
for my $path ( UR::Util::compiled_inc() ) { |
|
87
|
10
|
50
|
|
|
|
401
|
next unless -d $path; |
|
88
|
10
|
|
|
|
|
563
|
$compiled = Cwd::abs_path($path); |
|
89
|
10
|
50
|
|
|
|
51
|
last if defined $compiled; |
|
90
|
|
|
|
|
|
|
} |
|
91
|
|
|
|
|
|
|
|
|
92
|
10
|
|
|
|
|
34
|
my $perl5lib = ''; |
|
93
|
10
|
|
|
|
|
72
|
foreach my $path ( split(':', $ENV{'PERL5LIB'}) ) { |
|
94
|
10
|
50
|
|
|
|
160
|
next unless -d $path; |
|
95
|
10
|
|
|
|
|
404
|
$perl5lib = Cwd::abs_path($path); |
|
96
|
10
|
50
|
|
|
|
40
|
last if defined $perl5lib; |
|
97
|
|
|
|
|
|
|
} |
|
98
|
|
|
|
|
|
|
|
|
99
|
10
|
|
|
|
|
30
|
my $i; |
|
100
|
10
|
|
|
|
|
47
|
for ($i = 0; $i < @INC; $i++) { |
|
101
|
|
|
|
|
|
|
# Find the index in @INC that's the first thing in |
|
102
|
|
|
|
|
|
|
# compiled-in module paths |
|
103
|
|
|
|
|
|
|
# |
|
104
|
|
|
|
|
|
|
# since abs_path returns undef for non-existant dirs, |
|
105
|
|
|
|
|
|
|
# skip the comparison if either is undef |
|
106
|
45
|
|
|
|
|
1387
|
my $inc = Cwd::abs_path($INC[$i]); |
|
107
|
45
|
50
|
|
|
|
300
|
next unless defined $inc; |
|
108
|
45
|
100
|
66
|
|
|
228
|
last if ($inc eq $compiled or $inc eq $perl5lib); |
|
109
|
|
|
|
|
|
|
} |
|
110
|
10
|
|
|
|
|
55
|
splice(@INC, $i, 0, $lib_path); |
|
111
|
6
|
|
|
6
|
|
798
|
eval "use $namespace_name"; |
|
|
6
|
|
|
3
|
|
70
|
|
|
|
6
|
|
|
|
|
76
|
|
|
|
3
|
|
|
|
|
32
|
|
|
|
3
|
|
|
|
|
10
|
|
|
|
3
|
|
|
|
|
44
|
|
|
|
10
|
|
|
|
|
1151
|
|
|
112
|
10
|
50
|
|
|
|
44
|
if ($@) { |
|
113
|
0
|
|
|
|
|
0
|
$class->error_message("Error using namespace module '$namespace_name': $@"); |
|
114
|
0
|
|
|
|
|
0
|
return; |
|
115
|
|
|
|
|
|
|
} |
|
116
|
|
|
|
|
|
|
|
|
117
|
10
|
|
|
|
|
157
|
my $self = $class->SUPER::create($rule); |
|
118
|
10
|
50
|
|
|
|
41
|
return unless $self; |
|
119
|
|
|
|
|
|
|
|
|
120
|
10
|
50
|
|
|
|
17
|
unless (eval { UR::Namespace->get($namespace_name) }) { |
|
|
10
|
|
|
|
|
103
|
|
|
121
|
0
|
|
|
|
|
0
|
$self->error_message("Namespace '$namespace_name' was not found"); |
|
122
|
0
|
|
|
|
|
0
|
return; |
|
123
|
|
|
|
|
|
|
} |
|
124
|
|
|
|
|
|
|
|
|
125
|
10
|
50
|
|
|
|
103
|
if ($namespace_name->can("_set_context_for_schema_updates")) { |
|
126
|
0
|
|
|
|
|
0
|
$namespace_name->_set_context_for_schema_updates(); |
|
127
|
|
|
|
|
|
|
} |
|
128
|
|
|
|
|
|
|
|
|
129
|
10
|
|
|
|
|
971
|
return $self; |
|
130
|
|
|
|
|
|
|
} |
|
131
|
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
sub command_name { |
|
133
|
1
|
|
|
1
|
0
|
4
|
my $class = shift; |
|
134
|
1
|
50
|
|
|
|
5
|
return "ur" if $class eq __PACKAGE__; |
|
135
|
1
|
|
|
|
|
12
|
my $name = $class->SUPER::command_name; |
|
136
|
1
|
|
|
|
|
4
|
$name =~ s/^u-r namespace/ur/; |
|
137
|
1
|
|
|
|
|
5
|
return $name; |
|
138
|
|
|
|
|
|
|
} |
|
139
|
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
sub help_detail { |
|
141
|
|
|
|
|
|
|
return shift->help_brief |
|
142
|
0
|
|
|
0
|
0
|
0
|
} |
|
143
|
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
# Return a list of module pathnames relative to lib_path |
|
145
|
|
|
|
|
|
|
sub _modules_in_tree { |
|
146
|
4
|
|
|
4
|
|
547
|
my $self = shift; |
|
147
|
4
|
|
|
|
|
7
|
my @modules; |
|
148
|
|
|
|
|
|
|
|
|
149
|
4
|
|
|
|
|
16
|
my $lib_path = $self->lib_path; |
|
150
|
4
|
|
|
|
|
16
|
my $namespace_path = $self->namespace_path; |
|
151
|
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
my $wanted_closure = sub { |
|
153
|
594
|
100
|
100
|
594
|
|
9585
|
if (-f $_ and m/\.pm$/) { |
|
154
|
44
|
|
|
|
|
74
|
push @modules, UR::Util::path_relative_to($lib_path, $_); |
|
155
|
|
|
|
|
|
|
} |
|
156
|
4
|
|
|
|
|
19
|
}; |
|
157
|
4
|
100
|
|
|
|
12
|
unless (@_) { |
|
158
|
2
|
|
|
|
|
182
|
File::Find::find({ no_chdir => 1, |
|
159
|
|
|
|
|
|
|
wanted => $wanted_closure, |
|
160
|
|
|
|
|
|
|
}, |
|
161
|
|
|
|
|
|
|
$namespace_path); |
|
162
|
|
|
|
|
|
|
} |
|
163
|
|
|
|
|
|
|
else { |
|
164
|
|
|
|
|
|
|
# this method takes either module paths or class names as params |
|
165
|
|
|
|
|
|
|
# normalize to module paths |
|
166
|
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
NAME: |
|
169
|
2
|
|
|
|
|
18
|
for (my $i = 0; $i < @_; $i++) { |
|
170
|
7
|
|
|
|
|
13
|
my $name = $_[$i]; |
|
171
|
|
|
|
|
|
|
|
|
172
|
7
|
100
|
|
|
|
20
|
if ($name =~ m/::/) { |
|
173
|
|
|
|
|
|
|
# It's a class name |
|
174
|
4
|
|
|
|
|
11
|
my @name_parts = split(/::/, $name); |
|
175
|
4
|
50
|
|
|
|
14
|
unless ($self->namespace_name eq $name_parts[0]) { |
|
176
|
0
|
|
|
|
|
0
|
$self->warning_message("Skipping class name $name: Not in namespace ".$self->namespace_name); |
|
177
|
0
|
|
|
|
|
0
|
next NAME; |
|
178
|
|
|
|
|
|
|
} |
|
179
|
4
|
|
|
|
|
12
|
$name = join('/', @name_parts) . ".pm"; |
|
180
|
|
|
|
|
|
|
} |
|
181
|
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
# First, check the pathname relative to the cwd |
|
183
|
|
|
|
|
|
|
CHECK_LIB_PATH: |
|
184
|
7
|
|
|
|
|
22
|
foreach my $check_name ( $name, $lib_path.'/'.$name, $namespace_path.'/'.$name) { |
|
185
|
16
|
100
|
|
|
|
152
|
if (-e $check_name) { |
|
186
|
5
|
50
|
33
|
|
|
69
|
if (-f $check_name and $check_name =~ m/\.pm$/) { |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
187
|
5
|
|
|
|
|
19
|
push @modules, UR::Util::path_relative_to($lib_path, $check_name); |
|
188
|
5
|
|
|
|
|
14
|
next NAME; # found it, don't check the other $check_name |
|
189
|
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
} elsif (-d $check_name) { |
|
191
|
0
|
|
|
|
|
0
|
File::Find::find({ no_chdir => 1, |
|
192
|
|
|
|
|
|
|
wanted => $wanted_closure, |
|
193
|
|
|
|
|
|
|
}, |
|
194
|
|
|
|
|
|
|
$check_name); |
|
195
|
|
|
|
|
|
|
} elsif (-e $check_name) { |
|
196
|
0
|
|
|
|
|
0
|
$self->warning_message("Ignoring non-module $check_name"); |
|
197
|
0
|
|
|
|
|
0
|
next CHECK_LIB_PATH; |
|
198
|
|
|
|
|
|
|
} |
|
199
|
|
|
|
|
|
|
} |
|
200
|
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
} |
|
202
|
|
|
|
|
|
|
} |
|
203
|
|
|
|
|
|
|
} |
|
204
|
4
|
|
|
|
|
44
|
return @modules; |
|
205
|
|
|
|
|
|
|
} |
|
206
|
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
sub _class_names_in_tree { |
|
208
|
2
|
|
|
2
|
|
640
|
my $self = shift; |
|
209
|
2
|
|
|
|
|
12
|
my @modules = $self->_modules_in_tree(@_); |
|
210
|
2
|
|
|
|
|
13
|
my $lib_path = $self->lib_path; |
|
211
|
2
|
|
|
|
|
8
|
my @class_names; |
|
212
|
2
|
|
|
|
|
8
|
for my $module (@modules) { |
|
213
|
23
|
|
|
|
|
20
|
my $class = $module; |
|
214
|
23
|
|
|
|
|
90
|
$class =~ s/^$lib_path\///; |
|
215
|
23
|
|
|
|
|
36
|
$class =~ s/\//::/g; |
|
216
|
23
|
|
|
|
|
39
|
$class =~ s/\.pm$//; |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
# Paths can have invalid package names so are therefore packages in |
|
219
|
|
|
|
|
|
|
# another "namespace" and should not be included. |
|
220
|
23
|
50
|
|
|
|
46
|
next unless UR::Util::is_valid_class_name($class); |
|
221
|
|
|
|
|
|
|
|
|
222
|
23
|
|
|
|
|
27
|
push @class_names, $class; |
|
223
|
|
|
|
|
|
|
} |
|
224
|
2
|
|
|
|
|
19
|
return @class_names; |
|
225
|
|
|
|
|
|
|
} |
|
226
|
|
|
|
|
|
|
|
|
227
|
|
|
|
|
|
|
sub _class_objects_in_tree { |
|
228
|
1
|
|
|
1
|
|
2
|
my $self = shift; |
|
229
|
1
|
|
|
|
|
10
|
my @class_names = $self->_class_names_in_tree(@_); |
|
230
|
1
|
|
|
|
|
1
|
my @class_objects; |
|
231
|
1
|
|
|
|
|
5
|
for my $class_name (sort { uc($a) cmp uc($b) } @class_names) { |
|
|
0
|
|
|
|
|
0
|
|
|
232
|
1
|
50
|
|
|
|
9
|
unless(UR::Object::Type->use_module_with_namespace_constraints($class_name)) { |
|
233
|
|
|
|
|
|
|
#if ($@) { |
|
234
|
0
|
|
|
|
|
0
|
print STDERR "Failed to use class $class_name!\n"; |
|
235
|
0
|
|
|
|
|
0
|
print STDERR $@,"\n"; |
|
236
|
0
|
|
|
|
|
0
|
next; |
|
237
|
|
|
|
|
|
|
} |
|
238
|
1
|
|
|
|
|
4
|
my $c = UR::Object::Type->is_loaded(class_name => $class_name); |
|
239
|
1
|
50
|
|
|
|
4
|
unless ($c) { |
|
240
|
|
|
|
|
|
|
#print STDERR "Failed to find class object for class $class_name\n"; |
|
241
|
0
|
|
|
|
|
0
|
next; |
|
242
|
|
|
|
|
|
|
} |
|
243
|
1
|
|
|
|
|
2
|
push @class_objects, $c; |
|
244
|
|
|
|
|
|
|
#print $class_name,"\n"; |
|
245
|
|
|
|
|
|
|
} |
|
246
|
1
|
|
|
|
|
5
|
return @class_objects; |
|
247
|
|
|
|
|
|
|
} |
|
248
|
|
|
|
|
|
|
|
|
249
|
|
|
|
|
|
|
# Tries to guess what namespace you are in from your current working |
|
250
|
|
|
|
|
|
|
# directory. When called in list context, it also returns the directroy |
|
251
|
|
|
|
|
|
|
# name the namespace module was found in |
|
252
|
|
|
|
|
|
|
sub resolve_namespace_name_from_cwd { |
|
253
|
13
|
|
|
13
|
0
|
21
|
my $class = shift; |
|
254
|
13
|
|
|
|
|
20
|
my $cwd = shift; |
|
255
|
13
|
|
33
|
|
|
41548
|
$cwd ||= Cwd::cwd(); |
|
256
|
|
|
|
|
|
|
|
|
257
|
13
|
|
|
|
|
127
|
my @lib = grep { length($_) } split(/\//,$cwd); |
|
|
69
|
|
|
|
|
145
|
|
|
258
|
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
SUBDIR: |
|
260
|
13
|
|
|
|
|
79
|
while (@lib) { |
|
261
|
36
|
|
|
|
|
73
|
my $namespace_name = pop @lib; |
|
262
|
|
|
|
|
|
|
|
|
263
|
36
|
|
|
|
|
111
|
my $lib_path = "/" . join("/",@lib); |
|
264
|
36
|
|
|
|
|
80
|
my $namespace_module_path = $lib_path . '/' . $namespace_name . '.pm'; |
|
265
|
36
|
100
|
|
|
|
767
|
if (-e $namespace_module_path) { |
|
266
|
4
|
50
|
|
|
|
67
|
if ($class->_is_file_the_namespace_module($namespace_name, $namespace_module_path)) { |
|
267
|
4
|
50
|
|
|
|
22
|
if (wantarray) { |
|
268
|
4
|
|
|
|
|
30
|
return ($namespace_name, $lib_path); |
|
269
|
|
|
|
|
|
|
} else { |
|
270
|
0
|
|
|
|
|
0
|
return $namespace_name; |
|
271
|
|
|
|
|
|
|
} |
|
272
|
|
|
|
|
|
|
} |
|
273
|
|
|
|
|
|
|
} |
|
274
|
|
|
|
|
|
|
} |
|
275
|
9
|
|
|
|
|
71
|
return; |
|
276
|
|
|
|
|
|
|
} |
|
277
|
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
# Returns true if the given file is the namespace module we're looking for. |
|
279
|
|
|
|
|
|
|
# The only certain way is to go ahead and load it, but this should be good |
|
280
|
|
|
|
|
|
|
# enough for ligitimate use cases. |
|
281
|
|
|
|
|
|
|
sub _is_file_the_namespace_module { |
|
282
|
11
|
|
|
11
|
|
50
|
my($class,$namespace_name,$namespace_module_path) = @_; |
|
283
|
|
|
|
|
|
|
|
|
284
|
11
|
|
|
|
|
217
|
my $fh = IO::File->new($namespace_module_path); |
|
285
|
11
|
50
|
|
|
|
1996
|
return unless $fh; |
|
286
|
11
|
|
|
|
|
624
|
while (my $line = $fh->getline) { |
|
287
|
38
|
100
|
|
|
|
1704
|
if ($line =~ m/package\s+$namespace_name\s*;/) { |
|
288
|
|
|
|
|
|
|
# At this point $namespace_name should be a plain word with no ':'s |
|
289
|
|
|
|
|
|
|
# and if the file sets the package to a single word with no colons, |
|
290
|
|
|
|
|
|
|
# it's pretty likely that it's a namespace module. |
|
291
|
11
|
|
|
|
|
183
|
return 1; |
|
292
|
|
|
|
|
|
|
} |
|
293
|
|
|
|
|
|
|
} |
|
294
|
0
|
|
|
|
|
0
|
return; |
|
295
|
|
|
|
|
|
|
} |
|
296
|
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
# Return the pathname that the specified namespace module can be found |
|
299
|
|
|
|
|
|
|
sub resolve_lib_path_for_namespace_name { |
|
300
|
7
|
|
|
7
|
0
|
476
|
my($class,$namespace_name,$cwd) = @_; |
|
301
|
|
|
|
|
|
|
|
|
302
|
7
|
50
|
|
|
|
31
|
unless ($namespace_name) { |
|
303
|
0
|
|
|
|
|
0
|
Carp::croak('namespace name is a required argument for UR::Util::resolve_lib_path_for_namespace_name()'); |
|
304
|
|
|
|
|
|
|
} |
|
305
|
|
|
|
|
|
|
|
|
306
|
|
|
|
|
|
|
# first, see if we're in a namespace dir |
|
307
|
7
|
|
|
|
|
37
|
my($resolved_ns_name, $lib_path ) = $class->resolve_namespace_name_from_cwd($cwd); |
|
308
|
7
|
50
|
33
|
|
|
63
|
return $lib_path if (defined($resolved_ns_name) and $resolved_ns_name eq $namespace_name); |
|
309
|
|
|
|
|
|
|
|
|
310
|
7
|
|
|
|
|
41
|
foreach $lib_path ( @main::INC ) { |
|
311
|
7
|
|
|
|
|
40
|
my $expected_namespace_module = $lib_path . '/' . $namespace_name . '.pm'; |
|
312
|
7
|
|
|
|
|
39
|
$expected_namespace_module =~ s/::/\//g; # swap :: for / |
|
313
|
7
|
50
|
|
|
|
145
|
if ( $class->_is_file_the_namespace_module($namespace_name, $expected_namespace_module)) { |
|
314
|
7
|
|
|
|
|
53
|
return $lib_path; |
|
315
|
|
|
|
|
|
|
} |
|
316
|
|
|
|
|
|
|
} |
|
317
|
0
|
|
|
|
|
|
return; |
|
318
|
|
|
|
|
|
|
} |
|
319
|
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
1; |
|
321
|
|
|
|
|
|
|
|
|
322
|
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
=pod |
|
324
|
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
=head1 NAME |
|
326
|
|
|
|
|
|
|
|
|
327
|
|
|
|
|
|
|
UR::Namespace::Command - Top-level Command module for the UR namespace commands |
|
328
|
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
330
|
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
This class is the parent class for all the namespace-manipluation command |
|
332
|
|
|
|
|
|
|
modules, and the root for command handling behind the 'ur' command-line |
|
333
|
|
|
|
|
|
|
script. |
|
334
|
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
There are several sub-commands for manipluating a namespace's metadata. |
|
336
|
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
=over 4 |
|
338
|
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
=item browser |
|
340
|
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
Start a lightweight web server for viewing class and schema information |
|
342
|
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
=item commit |
|
344
|
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
Update data source schemas based on the current class structure |
|
346
|
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
=item define |
|
348
|
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
Define metadata instances such as classes, data sources or namespaces |
|
350
|
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
=item describe |
|
352
|
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
Get detailed information about a class |
|
354
|
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
=item diff |
|
356
|
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
Show a diff for various kinds of other ur commands. |
|
358
|
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
=item info |
|
360
|
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
Show brief information about class or schema metadata |
|
362
|
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
=item list |
|
364
|
|
|
|
|
|
|
|
|
365
|
|
|
|
|
|
|
List various types of things |
|
366
|
|
|
|
|
|
|
|
|
367
|
|
|
|
|
|
|
=item redescribe |
|
368
|
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
Outputs class description(s) formatted to the latest standard |
|
370
|
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
=item rename |
|
372
|
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
Rename logical schema elements. |
|
374
|
|
|
|
|
|
|
|
|
375
|
|
|
|
|
|
|
=item rewrite |
|
376
|
|
|
|
|
|
|
|
|
377
|
|
|
|
|
|
|
Rewrites class descriptions headers to normalize manual changes. |
|
378
|
|
|
|
|
|
|
|
|
379
|
|
|
|
|
|
|
=item test |
|
380
|
|
|
|
|
|
|
|
|
381
|
|
|
|
|
|
|
Sub-commands related to testing |
|
382
|
|
|
|
|
|
|
|
|
383
|
|
|
|
|
|
|
=item update |
|
384
|
|
|
|
|
|
|
|
|
385
|
|
|
|
|
|
|
Update metadata based on external data sources |
|
386
|
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
=back |
|
388
|
|
|
|
|
|
|
|
|
389
|
|
|
|
|
|
|
Some of these commands have sub-commands of their own. You can get more |
|
390
|
|
|
|
|
|
|
detailed information by typing 'ur --help' at the command line. |
|
391
|
|
|
|
|
|
|
|
|
392
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
393
|
|
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
Command, UR, UR::Namespace |
|
395
|
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
=cut |
|
397
|
|
|
|
|
|
|
|