rbbt-util 2.1.0 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/rbbt_query.rb +63 -0
- data/lib/rbbt-util.rb +5 -5
- data/lib/rbbt.rb +2 -11
- data/lib/rbbt/util/cmd.rb +1 -1
- data/lib/rbbt/util/fix_width_table.rb +9 -3
- data/lib/rbbt/util/log.rb +23 -7
- data/lib/rbbt/util/misc.rb +121 -15
- data/lib/rbbt/util/open.rb +14 -4
- data/lib/rbbt/util/persistence.rb +52 -21
- data/lib/rbbt/util/rake.rb +108 -21
- data/lib/rbbt/util/resource.rb +338 -0
- data/lib/rbbt/util/simpleDSL.rb +1 -1
- data/lib/rbbt/util/simpleopt.rb +1 -1
- data/lib/rbbt/util/task.rb +340 -0
- data/lib/rbbt/util/tc_hash.rb +19 -2
- data/lib/rbbt/util/tsv.rb +15 -10
- data/lib/rbbt/util/tsv/accessor.rb +16 -7
- data/lib/rbbt/util/tsv/attach.rb +220 -17
- data/lib/rbbt/util/tsv/index.rb +6 -1
- data/lib/rbbt/util/tsv/manipulate.rb +4 -5
- data/lib/rbbt/util/tsv/parse.rb +45 -21
- data/lib/rbbt/util/tsv/resource.rb +74 -0
- data/lib/rbbt/util/workflow.rb +99 -75
- data/test/rbbt/util/test_filecache.rb +2 -2
- data/test/rbbt/util/test_misc.rb +7 -2
- data/test/rbbt/util/test_persistence.rb +40 -5
- data/test/rbbt/util/test_resource.rb +92 -0
- data/test/rbbt/util/test_task.rb +118 -0
- data/test/rbbt/util/test_tsv.rb +5 -1
- data/test/rbbt/util/test_workflow.rb +77 -62
- data/test/rbbt/util/tsv/test_attach.rb +95 -7
- data/test/rbbt/util/tsv/test_index.rb +0 -1
- data/test/rbbt/util/tsv/test_manipulate.rb +20 -0
- data/test/rbbt/util/tsv/test_resource.rb +9 -0
- data/test/test_helper.rb +10 -0
- data/test/test_rbbt.rb +2 -37
- metadata +16 -18
- data/lib/rbbt/util/data_module.rb +0 -93
- data/lib/rbbt/util/path.rb +0 -155
- data/lib/rbbt/util/pkg_config.rb +0 -78
- data/lib/rbbt/util/pkg_data.rb +0 -119
- data/lib/rbbt/util/pkg_software.rb +0 -145
- data/test/rbbt/util/test_data_module.rb +0 -50
- data/test/rbbt/util/test_path.rb +0 -10
- data/test/rbbt/util/test_pkg_data.rb +0 -129
- data/test/test_pkg.rb +0 -28
data/lib/rbbt/util/rake.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'rake'
|
1
2
|
require 'rbbt/util/tsv'
|
2
3
|
require 'rbbt/util/open'
|
3
4
|
require 'rbbt/util/log'
|
@@ -29,7 +30,11 @@ module RakeHelper
|
|
29
30
|
end
|
30
31
|
|
31
32
|
def self.files
|
32
|
-
@@files
|
33
|
+
if defined? @@files
|
34
|
+
@@files
|
35
|
+
else
|
36
|
+
@@file = []
|
37
|
+
end
|
33
38
|
end
|
34
39
|
end
|
35
40
|
|
@@ -48,41 +53,123 @@ module RakeHelper
|
|
48
53
|
end
|
49
54
|
|
50
55
|
def self.run(rakefile, task = :default, chdir = nil)
|
51
|
-
|
52
|
-
|
53
|
-
|
56
|
+
require 'rake'
|
57
|
+
old_pwd = FileUtils.pwd
|
58
|
+
FileUtils.chdir chdir if chdir
|
54
59
|
|
55
|
-
|
60
|
+
Rake::FileTask.module_eval do
|
61
|
+
if not self.respond_to? :old_define_task
|
56
62
|
class << self
|
57
63
|
alias_method :old_define_task, :define_task
|
58
64
|
end
|
65
|
+
|
59
66
|
def self.define_task(file, *args, &block)
|
60
67
|
@@files ||= []
|
61
68
|
@@files << file
|
62
69
|
old_define_task(file, *args, &block)
|
63
70
|
end
|
64
|
-
|
65
|
-
def self.files
|
66
|
-
@@files
|
67
|
-
end
|
68
71
|
end
|
69
72
|
|
70
|
-
|
71
|
-
|
72
|
-
else
|
73
|
-
load rakefile
|
73
|
+
def self.files
|
74
|
+
@@files
|
74
75
|
end
|
75
|
-
|
76
|
-
|
77
|
-
|
76
|
+
|
77
|
+
def self.clear_files
|
78
|
+
@@files = []
|
78
79
|
end
|
80
|
+
end
|
79
81
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
82
|
+
Rake::Task.clear
|
83
|
+
Rake::FileTask.clear_files
|
84
|
+
if block_given?
|
85
|
+
yield
|
86
|
+
else
|
87
|
+
load rakefile
|
88
|
+
end
|
89
|
+
|
90
|
+
task(:default) do |t|
|
91
|
+
Rake::FileTask.files.each do |file| Rake::Task[file].invoke end
|
92
|
+
end
|
93
|
+
|
94
|
+
Rake::Task[task].invoke
|
95
|
+
|
96
|
+
Rake::Task.clear
|
97
|
+
Rake::FileTask.clear_files
|
98
|
+
|
99
|
+
FileUtils.chdir old_pwd
|
100
|
+
end
|
84
101
|
|
85
|
-
|
102
|
+
module WorkFlow
|
103
|
+
attr_accessor :default_persistence, :stage_options, :run_options
|
104
|
+
|
105
|
+
def stage_options(stage = :next)
|
106
|
+
@stage_options ||= {}
|
107
|
+
@stage_options[stage] ||= []
|
108
|
+
end
|
109
|
+
|
110
|
+
def run_options
|
111
|
+
@run_options ||= {}
|
112
|
+
end
|
113
|
+
|
114
|
+
def stage(stage_name, options = nil)
|
115
|
+
dependencies, options = case
|
116
|
+
when ((String === options or Symbol === options) and %w(string marshal yaml tsv tsv_string).include? options.to_s)
|
117
|
+
[nil, {:persistence_type => options}]
|
118
|
+
when Hash === options
|
119
|
+
[nil, options]
|
120
|
+
else
|
121
|
+
[options, {}]
|
122
|
+
end
|
123
|
+
|
124
|
+
@stage_options[stage_name] = @stage_options[:next]
|
125
|
+
|
126
|
+
options = Misc.add_defaults options, :persistence_type => default_persistence || :string
|
127
|
+
persistence_type = Misc.process_options options, :persistence_type
|
128
|
+
dependencies = Misc.process_options options, :dependencies if options.include? :dependencies
|
129
|
+
|
130
|
+
re = Regexp.new(/(?:^|\/)#{Regexp.quote stage_name.to_s}\/.*$/)
|
131
|
+
|
132
|
+
@last_step = nil unless defined? @last_step
|
133
|
+
@last_persistence_type = nil unless defined? @last_persistence_type
|
134
|
+
|
135
|
+
if dependencies.nil? && ! @last_step.nil?
|
136
|
+
dependencies = @last_step
|
137
|
+
end
|
138
|
+
@last_step = stage_name
|
139
|
+
|
140
|
+
# Generate the Hash definition
|
141
|
+
rule_def = case
|
142
|
+
when dependencies.nil?
|
143
|
+
re
|
144
|
+
when String === dependencies
|
145
|
+
{re => dependencies}
|
146
|
+
when Symbol === dependencies
|
147
|
+
{re => lambda{|filename| filename.sub(stage_name.to_s, dependencies.to_s) }}
|
148
|
+
when Array === dependencies
|
149
|
+
{re => lambda{|filename| dependencies.collect{|dep| filename.sub(stage_name.to_s, dep.to_s) } }}
|
150
|
+
when Proc === dependencies
|
151
|
+
{re => dependencies}
|
152
|
+
end
|
153
|
+
|
154
|
+
@last_step = stage_name
|
155
|
+
last_persistence_type, @last_persistence_type = @last_persistence_type, persistence_type
|
156
|
+
|
157
|
+
rule rule_def do |t|
|
158
|
+
Persistence.persist(t, "", persistence_type, :persistence_file => t.name) do |t, options|
|
159
|
+
data = case
|
160
|
+
when (t.prerequisites.nil? or (Array === t.prerequisites and t.prerequisites.empty?))
|
161
|
+
nil
|
162
|
+
else
|
163
|
+
Persistence.persist(t.prerequisites.first, "", last_persistence_type, :persistence_file => t.prerequisites.first) do
|
164
|
+
raise "Error, this file should be produced already"
|
165
|
+
end
|
166
|
+
end
|
167
|
+
options = @run_options.values_at *stage_options
|
168
|
+
step stage_name, "Executing step [#{ stage_name }]"
|
169
|
+
yield t, *options
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
86
173
|
end
|
87
174
|
end
|
88
175
|
|
@@ -0,0 +1,338 @@
|
|
1
|
+
require 'rbbt/util/open'
|
2
|
+
require 'rbbt/util/rake'
|
3
|
+
|
4
|
+
module Resource
|
5
|
+
class << self
|
6
|
+
attr_accessor :resources, :rake_dirs
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.extended(base)
|
10
|
+
class << base
|
11
|
+
attr_accessor :pkgdir, :lib_dir, :base, :offsetdir, :namespace
|
12
|
+
end
|
13
|
+
base.base = base
|
14
|
+
base.lib_dir = caller_lib_dir
|
15
|
+
base.pkgdir = base.to_s.downcase unless base.to_s == "Rbbt"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.caller_base_dir(file = nil)
|
19
|
+
file = caller.reject{|l| l =~ /\/util\/(?:resource\.rb|progress-monitor\.rb|workflow\.rb)/ }.first.sub(/\.rb.*/,'.rb') if file.nil?
|
20
|
+
File.dirname(File.expand_path(file))
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.caller_lib_dir(file = nil)
|
24
|
+
file = caller.reject{|l| l =~ /\/util\/(?:resource\.rb|progress-monitor\.rb|workflow\.rb)/ }.first.sub(/\.rb.*/,'.rb') if file.nil?
|
25
|
+
|
26
|
+
file = File.expand_path file
|
27
|
+
while file != '/'
|
28
|
+
dir = File.dirname file
|
29
|
+
return dir if File.exists? File.join(dir, 'lib')
|
30
|
+
file = File.dirname file
|
31
|
+
end
|
32
|
+
return nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.resolve(path, pkgdir, type = :find, lib_dir = nil)
|
36
|
+
if path.match(/(.*?)\/(.*)/)
|
37
|
+
location, subpath = path.match(/(.*?)\/(.*)/).values_at 1, 2
|
38
|
+
else
|
39
|
+
location, subpath = path, ""
|
40
|
+
end
|
41
|
+
|
42
|
+
case type.to_sym
|
43
|
+
when :user
|
44
|
+
pkgdir = 'rbbt' if pkgdir.nil? or pkgdir.empty?
|
45
|
+
File.join(ENV['HOME'], '.' + pkgdir, location, subpath)
|
46
|
+
when :local
|
47
|
+
File.join('/usr/local', location, pkgdir, subpath)
|
48
|
+
when :global
|
49
|
+
File.join('/', location, pkgdir, subpath)
|
50
|
+
when :lib
|
51
|
+
if not caller_lib_dir.nil? and not caller_lib_dir == "/"
|
52
|
+
path = File.join(caller_lib_dir, location, subpath)
|
53
|
+
return path if File.exists?(path) or lib_dir.nil?
|
54
|
+
end
|
55
|
+
raise "Root of library not found" if lib_dir.nil?
|
56
|
+
File.join(lib_dir, location, subpath)
|
57
|
+
when :find
|
58
|
+
%w(user local global lib).each do |_type|
|
59
|
+
file = resolve(path, pkgdir, _type.to_sym, lib_dir)
|
60
|
+
return file if File.exists? file
|
61
|
+
end
|
62
|
+
|
63
|
+
resolve(path, pkgdir, :user)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.define_rake(path, rakefile)
|
68
|
+
@rake_dirs ||= {}
|
69
|
+
@rake_dirs[path.find] = rakefile
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.define_resource(path, type, content)
|
73
|
+
@resources ||= {}
|
74
|
+
@resources[path.find] = [type, content]
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.set_software_env(software_dir)
|
78
|
+
bin_dir = File.join(software_dir, 'bin')
|
79
|
+
opt_dir = File.join(software_dir, 'opt')
|
80
|
+
|
81
|
+
Misc.env_add 'PATH', bin_dir
|
82
|
+
|
83
|
+
FileUtils.mkdir_p opt_dir unless File.exists? opt_dir
|
84
|
+
%w(.ld-paths .pkgconfig-paths .aclocal-paths .java-classpaths).each do |file|
|
85
|
+
filename = File.join(opt_dir, file)
|
86
|
+
FileUtils.touch filename unless File.exists? filename
|
87
|
+
end
|
88
|
+
|
89
|
+
if not File.exists? File.join(opt_dir,'.post_install')
|
90
|
+
Open.write(File.join(opt_dir,'.post_install'),"#!/bin/bash\n")
|
91
|
+
end
|
92
|
+
|
93
|
+
Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
|
94
|
+
Misc.env_add('LD_LIBRARY_PATH',line.chomp)
|
95
|
+
Misc.env_add('LD_RUN_PATH',line.chomp)
|
96
|
+
end
|
97
|
+
|
98
|
+
Open.read(File.join opt_dir, '.pkgconfig-paths').split(/\n/).each do |line|
|
99
|
+
Misc.env_add('PKG_CONFIG_PATH',line.chomp)
|
100
|
+
end
|
101
|
+
|
102
|
+
Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
|
103
|
+
Misc.env_add('LD_LIBRARY_PATH',line.chomp)
|
104
|
+
end
|
105
|
+
|
106
|
+
Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
|
107
|
+
Misc.env_add('LD_LIBRARY_PATH',line.chomp)
|
108
|
+
end
|
109
|
+
|
110
|
+
Open.read(File.join opt_dir, '.aclocal-paths').split(/\n/).each do |line|
|
111
|
+
Misc.env_add('ACLOCAL_FLAGS', "-I#{File.join(opt_dir, line.chomp)}", ' ')
|
112
|
+
end
|
113
|
+
|
114
|
+
Open.read(File.join opt_dir, '.java-classpaths').split(/\n/).each do |line|
|
115
|
+
Misc.env_add('CLASSPATH', "#{File.join(opt_dir,'java', 'lib', line.chomp)}")
|
116
|
+
end
|
117
|
+
|
118
|
+
Dir.glob(File.join opt_dir, 'jars', '*').each do |file|
|
119
|
+
Misc.env_add('CLASSPATH', "#{File.expand_path(file)}")
|
120
|
+
end
|
121
|
+
|
122
|
+
File.chmod 0774, File.join(opt_dir, '.post_install')
|
123
|
+
|
124
|
+
CMD.cmd(File.join(opt_dir, '.post_install'))
|
125
|
+
end
|
126
|
+
|
127
|
+
def self.produce(resource)
|
128
|
+
resource = resource.find if Path === resource
|
129
|
+
return resource if File.exists? resource
|
130
|
+
|
131
|
+
@resources ||= {}
|
132
|
+
@rake_dirs ||= {}
|
133
|
+
case
|
134
|
+
when @resources.include?(resource)
|
135
|
+
type, content = @resources[resource]
|
136
|
+
|
137
|
+
case type
|
138
|
+
when :string
|
139
|
+
Open.write(resource, content)
|
140
|
+
when :url
|
141
|
+
Open.write(resource, Open.read(content))
|
142
|
+
when :proc
|
143
|
+
Open.write(resource, content.call)
|
144
|
+
when :install
|
145
|
+
software_dir = File.dirname(File.dirname(resource.to_s))
|
146
|
+
preamble = <<-EOF
|
147
|
+
#!/bin/bash
|
148
|
+
|
149
|
+
RBBT_SOFTWARE_DIR="#{software_dir}"
|
150
|
+
|
151
|
+
INSTALL_HELPER_FILE="#{Rbbt.share.install.software.lib.install_helpers.find :lib, caller_lib_dir(__FILE__)}"
|
152
|
+
source "$INSTALL_HELPER_FILE"
|
153
|
+
EOF
|
154
|
+
|
155
|
+
CMD.cmd('bash', :in => preamble + "\n" + content.read)
|
156
|
+
set_software_env(software_dir)
|
157
|
+
else
|
158
|
+
raise "Could not produce #{ resource }. (#{ type }, #{ content })"
|
159
|
+
end
|
160
|
+
resource
|
161
|
+
|
162
|
+
when @rake_dirs.select{|dir,rakefile| resource.in_dir?(dir)}.any?
|
163
|
+
dir, rakefile = @rake_dirs.select{|dir,rakefile| resource.in_dir?(dir)}.first
|
164
|
+
file = resource.sub(dir, '').sub(/^\//,'')
|
165
|
+
rakefile = rakefile.find if Resource::Path === rakefile
|
166
|
+
dir = dir.find if Resource::Path === dir
|
167
|
+
FileUtils.mkdir_p dir unless File.exists? dir
|
168
|
+
RakeHelper.run(rakefile, file, dir)
|
169
|
+
resource
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def relative_to(klass, path)
|
174
|
+
self.offsetdir = path
|
175
|
+
if Rbbt == klass
|
176
|
+
self.pkgdir = ""
|
177
|
+
else
|
178
|
+
self.pkgdir = klass.to_s.downcase
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def data_module(klass)
|
183
|
+
relative_to klass, "share/#{self.to_s.downcase}"
|
184
|
+
rakefile = klass.share.install[self.to_s].Rakefile
|
185
|
+
rakefile.lib_dir = Resource.caller_lib_dir
|
186
|
+
|
187
|
+
self[''].define_as_rake rakefile
|
188
|
+
self.namespace = base.to_s
|
189
|
+
self.lib_dir = caller_lib_dir
|
190
|
+
end
|
191
|
+
|
192
|
+
module Path
|
193
|
+
attr_accessor :pkgdir, :namespace, :lib_dir
|
194
|
+
|
195
|
+
def self.path(name = nil, pkgdir = nil, namespace = nil, lib_dir = nil)
|
196
|
+
name = name.nil? ? "" : name.to_s
|
197
|
+
name.extend Path
|
198
|
+
name.pkgdir = pkgdir
|
199
|
+
name.namespace = namespace
|
200
|
+
name.lib_dir = lib_dir
|
201
|
+
name
|
202
|
+
end
|
203
|
+
|
204
|
+
def find(type = :find, lib_dir = nil)
|
205
|
+
lib_dir ||= @lib_dir
|
206
|
+
return self if pkgdir.nil?
|
207
|
+
path = Path.path(Resource.resolve(self, pkgdir, type, lib_dir), nil)
|
208
|
+
path.namespace = namespace
|
209
|
+
path
|
210
|
+
end
|
211
|
+
|
212
|
+
def produce
|
213
|
+
Resource.produce self.find
|
214
|
+
end
|
215
|
+
|
216
|
+
def dirname
|
217
|
+
Path.path(File.dirname(self), pkgdir, namespace, lib_dir)
|
218
|
+
end
|
219
|
+
|
220
|
+
def join(name)
|
221
|
+
Path.path(File.join(self, name.to_s), pkgdir, namespace, lib_dir)
|
222
|
+
end
|
223
|
+
|
224
|
+
def [](name)
|
225
|
+
join name
|
226
|
+
end
|
227
|
+
|
228
|
+
def method_missing(name, prev = nil)
|
229
|
+
join prev unless prev.nil?
|
230
|
+
join name
|
231
|
+
end
|
232
|
+
|
233
|
+
def open(*args)
|
234
|
+
Resource.produce self.find
|
235
|
+
Open.open self.find, *args
|
236
|
+
end
|
237
|
+
|
238
|
+
def read(*args)
|
239
|
+
Resource.produce self.find
|
240
|
+
Open.read self.find, *args
|
241
|
+
end
|
242
|
+
|
243
|
+
def write(content, *args)
|
244
|
+
FileUtils.mkdir_p File.dirname(self.find) unless File.exists? self.find
|
245
|
+
Open.write(self.find, content, *args)
|
246
|
+
end
|
247
|
+
|
248
|
+
def define_as_string(content)
|
249
|
+
Resource.define_resource(self, :string, content)
|
250
|
+
end
|
251
|
+
|
252
|
+
def define_as_url(url)
|
253
|
+
Resource.define_resource(self, :url, url)
|
254
|
+
end
|
255
|
+
|
256
|
+
def define_as_rake(rakefile)
|
257
|
+
Resource.define_rake(self, rakefile)
|
258
|
+
end
|
259
|
+
|
260
|
+
def define_as_proc(&block)
|
261
|
+
Resource.define_resource(self, :proc, &block)
|
262
|
+
end
|
263
|
+
|
264
|
+
|
265
|
+
def define_as_install(install_file)
|
266
|
+
Resource.define_resource(self, :install, install_file.find)
|
267
|
+
self.produce
|
268
|
+
software_dir = File.dirname(File.dirname(self.to_s))
|
269
|
+
Resource.set_software_env(software_dir)
|
270
|
+
end
|
271
|
+
|
272
|
+
def in_dir?(dir)
|
273
|
+
! ! File.expand_path(self).match(/^#{Regexp.quote dir}/)
|
274
|
+
end
|
275
|
+
|
276
|
+
def to_s
|
277
|
+
self.find
|
278
|
+
end
|
279
|
+
|
280
|
+
def filename
|
281
|
+
self.find
|
282
|
+
end
|
283
|
+
|
284
|
+
def exists?
|
285
|
+
begin
|
286
|
+
self.produce
|
287
|
+
File.exists? self.find
|
288
|
+
rescue
|
289
|
+
false
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
module WithKey
|
295
|
+
def self.extended(base)
|
296
|
+
class << base
|
297
|
+
attr_accessor :klass, :key
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
def method_missing(name, *args)
|
302
|
+
if key
|
303
|
+
klass.send(name, key, *args)
|
304
|
+
else
|
305
|
+
klass.send(name, *args)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
def with_key(key)
|
311
|
+
klass = self
|
312
|
+
o = Object.new
|
313
|
+
o.extend WithKey
|
314
|
+
o.klass = self
|
315
|
+
o.key = key
|
316
|
+
o
|
317
|
+
end
|
318
|
+
|
319
|
+
def [](name)
|
320
|
+
if pkgdir.nil?
|
321
|
+
@pkgdir = (base == Rbbt ? '' : base.to_s.downcase)
|
322
|
+
end
|
323
|
+
name = File.join(offsetdir.to_s, name.to_s) unless offsetdir.nil? or offsetdir.empty?
|
324
|
+
Path.path(name, pkgdir, namespace, lib_dir)
|
325
|
+
end
|
326
|
+
|
327
|
+
def method_missing(name, prev = nil)
|
328
|
+
if prev
|
329
|
+
self[prev][name]
|
330
|
+
else
|
331
|
+
self[name]
|
332
|
+
end
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
def resource_path(path)
|
337
|
+
Resource::Path.path(path)
|
338
|
+
end
|