ceedling 0.15.4 → 0.15.5
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.
- checksums.yaml +7 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +9 -13
- data/README.md +0 -4
- data/Rakefile +2 -6
- data/bin/ceedling +1 -1
- data/ceedling.gemspec +2 -3
- data/lib/ceedling/configurator_builder.rb +70 -63
- data/lib/ceedling/defaults.rb +21 -17
- data/lib/ceedling/dependinator.rb +12 -4
- data/lib/ceedling/generator.rb +1 -3
- data/lib/ceedling/generator_test_runner.rb +2 -2
- data/lib/ceedling/tasks_base.rake +16 -9
- data/lib/ceedling/version.rb +1 -1
- data/lib/ceedling/version.rb.erb +16 -0
- data/release/build.info +2 -0
- data/release/version.info +1 -0
- data/spec/ceedling_spec.rb +27 -27
- data/spec/par_map_spec.rb +8 -8
- data/spec/preprocessinator_extractor_spec.rb +2 -2
- data/spec/preprocessinator_includes_handler_spec.rb +24 -24
- data/spec/spec_helper.rb +3 -3
- data/spec/spec_system_helper.rb +13 -13
- data/spec/system/deployment_spec.rb +9 -9
- data/test_graveyard/unit/busted/configurator_builder_test.rb +70 -68
- metadata +17 -20
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 820de69c03254ab70dba861eb547edfbcd6ca948
|
4
|
+
data.tar.gz: 91817c1f9ba91ad922daa5a9af3d87af69b5f602
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 12582b3bd3f143baf7c53ee33cbf806a69899c769d9da0067e1501ac4ad73ffe117554e915826b325dfb8e694afe6786773464c2c90dba023b06ba2566f5298c
|
7
|
+
data.tar.gz: 279615504d80ac07420f568a5efe4ca275677ab4649cbb865ab835ccee003ceeb2aadd11b7e8983350f7a206ea50b9206cf38caf9b631f3e683bb66a609e4c28
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -8,18 +8,14 @@ GEM
|
|
8
8
|
rake (10.3.2)
|
9
9
|
require_all (1.3.2)
|
10
10
|
rr (1.1.2)
|
11
|
-
rspec (
|
12
|
-
rspec-core (~>
|
13
|
-
rspec-expectations (~>
|
14
|
-
rspec-mocks (~>
|
15
|
-
rspec-core (
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
rspec-support (~> 3.0.0)
|
20
|
-
rspec-mocks (3.0.3)
|
21
|
-
rspec-support (~> 3.0.0)
|
22
|
-
rspec-support (3.0.3)
|
11
|
+
rspec (2.14.1)
|
12
|
+
rspec-core (~> 2.14.0)
|
13
|
+
rspec-expectations (~> 2.14.0)
|
14
|
+
rspec-mocks (~> 2.14.0)
|
15
|
+
rspec-core (2.14.8)
|
16
|
+
rspec-expectations (2.14.5)
|
17
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
18
|
+
rspec-mocks (2.14.6)
|
23
19
|
thor (0.19.1)
|
24
20
|
|
25
21
|
PLATFORMS
|
@@ -32,5 +28,5 @@ DEPENDENCIES
|
|
32
28
|
rake (>= 0.9.2.2)
|
33
29
|
require_all
|
34
30
|
rr
|
35
|
-
rspec (~>
|
31
|
+
rspec (~> 2.14.1)
|
36
32
|
thor
|
data/README.md
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
Ceedling - Build/test system for C based on Ruby/Rake
|
2
2
|
=====================================================
|
3
3
|
|
4
|
-
[](https://travis-ci.org/ThrowTheSwitch/Ceedling)
|
5
|
-
|
6
|
-
Ceedling is a build system for C projects that is something of an extension around Ruby’s Rake (make-ish) build system. Ceedling also makes TDD (Test-Driven Development) in C a breeze by integrating [CMock](https://github.com/throwtheswitch/cmock), [Unity](https://github.com/throwtheswitch/unity), and [CException](https://github.com/throwtheswitch/cexception) -- three other awesome open-source projects you can’t live without if you're creating awesomeness in the C language. Ceedling is also extensible with a handy plugin mechanism.
|
7
|
-
|
8
4
|
Usage Documentation
|
9
5
|
===================
|
10
6
|
|
data/Rakefile
CHANGED
@@ -1,14 +1,10 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
require 'bundler'
|
3
|
-
|
4
|
-
task :ci => [:bundle_install, :spec]
|
5
|
-
|
6
3
|
require 'rspec/core/rake_task'
|
4
|
+
|
7
5
|
desc "Run all rspecs"
|
8
6
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
9
7
|
t.pattern = 'spec/**/*_spec.rb'
|
10
8
|
end
|
11
9
|
|
12
|
-
task :
|
13
|
-
sh 'bundle install'
|
14
|
-
end
|
10
|
+
task :ci => [:spec]
|
data/bin/ceedling
CHANGED
data/ceedling.gemspec
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), 'lib'))
|
3
3
|
require "ceedling/version"
|
4
|
+
require 'date'
|
4
5
|
|
5
6
|
Gem::Specification.new do |s|
|
6
7
|
s.name = "ceedling"
|
@@ -13,14 +14,12 @@ Gem::Specification.new do |s|
|
|
13
14
|
s.description = %q{Ceedling provides a set of tools to deploy its guts in a folder or which can be required in a Rakefile}
|
14
15
|
s.licenses = ['MIT']
|
15
16
|
|
16
|
-
s.rubyforge_project = "ceedling"
|
17
|
-
|
18
17
|
s.add_dependency "thor", ">= 0.14.5"
|
19
18
|
s.add_dependency "rake", ">= 0.8.7"
|
20
19
|
|
21
20
|
# Files needed from submodules
|
22
21
|
s.files = []
|
23
|
-
s.files += Dir['vendor/**/docs/**/*.pdf', 'docs/**/*.pdf'
|
22
|
+
s.files += Dir['vendor/**/docs/**/*.pdf', 'docs/**/*.pdf']
|
24
23
|
s.files += Dir['vendor/cmock/lib/**/*.rb']
|
25
24
|
s.files += Dir['vendor/cmock/config/**/*.rb']
|
26
25
|
s.files += Dir['vendor/cmock/release/**/*.info']
|
@@ -7,10 +7,10 @@ require 'ceedling/constants' # for Verbosity constants class & base file p
|
|
7
7
|
|
8
8
|
|
9
9
|
class ConfiguratorBuilder
|
10
|
-
|
10
|
+
|
11
11
|
constructor :file_system_utils, :file_wrapper, :system_wrapper
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
|
14
14
|
def build_global_constants(config)
|
15
15
|
config.each_pair do |key, value|
|
16
16
|
formatted_key = key.to_s.upcase
|
@@ -21,7 +21,7 @@ class ConfiguratorBuilder
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
|
25
25
|
def build_accessor_methods(config, context)
|
26
26
|
config.each_pair do |key, value|
|
27
27
|
# fill configurator object with accessor methods
|
@@ -29,11 +29,11 @@ class ConfiguratorBuilder
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
|
33
33
|
# create a flattened hash from the original configuration structure
|
34
34
|
def flattenify(config)
|
35
35
|
new_hash = {}
|
36
|
-
|
36
|
+
|
37
37
|
config.each_key do | parent |
|
38
38
|
|
39
39
|
# gracefully handle empty top-level entries
|
@@ -54,13 +54,13 @@ class ConfiguratorBuilder
|
|
54
54
|
else
|
55
55
|
new_hash["#{parent.to_s.downcase}".to_sym] = config[parent]
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
return new_hash
|
61
61
|
end
|
62
62
|
|
63
|
-
|
63
|
+
|
64
64
|
def populate_defaults(config, defaults)
|
65
65
|
defaults.keys.sort.each do |section|
|
66
66
|
defaults[section].keys.sort.each do |entry|
|
@@ -118,7 +118,7 @@ class ConfiguratorBuilder
|
|
118
118
|
build_path_name = path[0]
|
119
119
|
build_path = path[1]
|
120
120
|
build_path_add_condition = path[2]
|
121
|
-
|
121
|
+
|
122
122
|
# insert path into build paths if associated with true condition
|
123
123
|
out_hash[:project_build_paths] << build_path if build_path_add_condition
|
124
124
|
# set path symbol name and path for each entry in paths array
|
@@ -131,7 +131,7 @@ class ConfiguratorBuilder
|
|
131
131
|
|
132
132
|
def set_force_build_filepaths(in_hash)
|
133
133
|
out_hash = {}
|
134
|
-
|
134
|
+
|
135
135
|
out_hash[:project_test_force_rebuild_filepath] = File.join( in_hash[:project_test_dependencies_path], 'force_build' )
|
136
136
|
out_hash[:project_release_force_rebuild_filepath] = File.join( in_hash[:project_release_dependencies_path], 'force_build' ) if (in_hash[:project_release_build])
|
137
137
|
|
@@ -141,7 +141,7 @@ class ConfiguratorBuilder
|
|
141
141
|
|
142
142
|
def set_rakefile_components(in_hash)
|
143
143
|
out_hash = {
|
144
|
-
:project_rakefile_component_files =>
|
144
|
+
:project_rakefile_component_files =>
|
145
145
|
[File.join(CEEDLING_LIB, 'ceedling', 'tasks_base.rake'),
|
146
146
|
File.join(CEEDLING_LIB, 'ceedling', 'tasks_filesystem.rake'),
|
147
147
|
File.join(CEEDLING_LIB, 'ceedling', 'tasks_tests.rake'),
|
@@ -160,72 +160,79 @@ class ConfiguratorBuilder
|
|
160
160
|
|
161
161
|
return out_hash
|
162
162
|
end
|
163
|
-
|
163
|
+
|
164
164
|
|
165
165
|
def set_library_build_info_filepaths(hash)
|
166
|
+
|
166
167
|
# Notes:
|
167
|
-
# - Dependency on a change to our input configuration hash is handled elsewhere as it is
|
168
|
+
# - Dependency on a change to our input configuration hash is handled elsewhere as it is
|
168
169
|
# dynamically formed during ceedling's execution
|
169
170
|
# - Compiled vendor dependencies like cmock.o, unity.o, cexception.o are handled below;
|
170
171
|
# here we're interested only in ceedling-based code generation dependencies
|
172
|
+
|
173
|
+
ceedling_build_info_filepath = File.join(CEEDLING_RELEASE, 'build.info')
|
174
|
+
cmock_build_info_filepath = FilePathUtils::form_ceedling_vendor_path('cmock/release', 'build.info')
|
175
|
+
|
171
176
|
out_hash = {
|
172
|
-
:
|
177
|
+
:ceedling_build_info_filepath => ceedling_build_info_filepath,
|
178
|
+
:cmock_build_info_filepath => cmock_build_info_filepath
|
173
179
|
}
|
180
|
+
|
174
181
|
return out_hash
|
175
182
|
end
|
176
183
|
|
177
|
-
|
184
|
+
|
178
185
|
def set_release_target(in_hash)
|
179
186
|
return {} if (not in_hash[:project_release_build])
|
180
|
-
|
187
|
+
|
181
188
|
release_target_file = ((in_hash[:release_build_output].nil?) ? (DEFAULT_RELEASE_TARGET_NAME.ext(in_hash[:extension_executable])) : in_hash[:release_build_output])
|
182
189
|
release_map_file = ((in_hash[:release_build_output].nil?) ? (DEFAULT_RELEASE_TARGET_NAME.ext(in_hash[:extension_map])) : in_hash[:release_build_output].ext(in_hash[:extension_map]))
|
183
|
-
|
190
|
+
|
184
191
|
return {
|
185
192
|
# tempted to make a helper method in file_path_utils? stop right there, pal. you'll introduce a cyclical dependency
|
186
193
|
:project_release_build_target => File.join(in_hash[:project_build_release_root], release_target_file),
|
187
194
|
:project_release_build_map => File.join(in_hash[:project_build_release_root], release_map_file)
|
188
195
|
}
|
189
196
|
end
|
190
|
-
|
197
|
+
|
191
198
|
|
192
199
|
def collect_project_options(in_hash)
|
193
200
|
options = []
|
194
|
-
|
201
|
+
|
195
202
|
in_hash[:project_options_paths].each do |path|
|
196
203
|
options << @file_wrapper.directory_listing( File.join(path, '*.yml') )
|
197
204
|
end
|
198
|
-
|
205
|
+
|
199
206
|
return {
|
200
207
|
:collection_project_options => options.flatten
|
201
208
|
}
|
202
209
|
end
|
203
|
-
|
210
|
+
|
204
211
|
|
205
212
|
def expand_all_path_globs(in_hash)
|
206
213
|
out_hash = {}
|
207
214
|
path_keys = []
|
208
|
-
|
215
|
+
|
209
216
|
in_hash.each_key do |key|
|
210
217
|
next if (not key.to_s[0..4] == 'paths')
|
211
218
|
path_keys << key
|
212
219
|
end
|
213
|
-
|
220
|
+
|
214
221
|
# sorted to provide assured order of traversal in test calls on mocks
|
215
222
|
path_keys.sort.each do |key|
|
216
223
|
out_hash["collection_#{key.to_s}".to_sym] = @file_system_utils.collect_paths( in_hash[key] )
|
217
224
|
end
|
218
|
-
|
225
|
+
|
219
226
|
return out_hash
|
220
227
|
end
|
221
228
|
|
222
229
|
|
223
230
|
def collect_source_and_include_paths(in_hash)
|
224
231
|
return {
|
225
|
-
:collection_paths_source_and_include =>
|
226
|
-
( in_hash[:collection_paths_source] +
|
232
|
+
:collection_paths_source_and_include =>
|
233
|
+
( in_hash[:collection_paths_source] +
|
227
234
|
in_hash[:collection_paths_include] ).select {|x| File.directory?(x)}
|
228
|
-
}
|
235
|
+
}
|
229
236
|
end
|
230
237
|
|
231
238
|
|
@@ -234,38 +241,38 @@ class ConfiguratorBuilder
|
|
234
241
|
extra_paths << FilePathUtils::form_ceedling_vendor_path(CEXCEPTION_LIB_PATH) if (in_hash[:project_use_exceptions])
|
235
242
|
|
236
243
|
return {
|
237
|
-
:collection_paths_source_include_vendor =>
|
238
|
-
in_hash[:collection_paths_source_and_include] +
|
244
|
+
:collection_paths_source_include_vendor =>
|
245
|
+
in_hash[:collection_paths_source_and_include] +
|
239
246
|
extra_paths
|
240
|
-
}
|
247
|
+
}
|
241
248
|
end
|
242
249
|
|
243
250
|
|
244
251
|
def collect_test_support_source_include_paths(in_hash)
|
245
252
|
return {
|
246
|
-
:collection_paths_test_support_source_include =>
|
253
|
+
:collection_paths_test_support_source_include =>
|
247
254
|
(in_hash[:collection_paths_test] +
|
248
255
|
in_hash[:collection_paths_support] +
|
249
|
-
in_hash[:collection_paths_source] +
|
256
|
+
in_hash[:collection_paths_source] +
|
250
257
|
in_hash[:collection_paths_include] ).select {|x| File.directory?(x)}
|
251
|
-
}
|
258
|
+
}
|
252
259
|
end
|
253
260
|
|
254
261
|
|
255
262
|
def collect_vendor_paths(in_hash)
|
256
263
|
return {:collection_paths_vendor => get_vendor_paths(in_hash)}
|
257
264
|
end
|
258
|
-
|
265
|
+
|
259
266
|
|
260
267
|
def collect_test_support_source_include_vendor_paths(in_hash)
|
261
268
|
return {
|
262
|
-
:collection_paths_test_support_source_include_vendor =>
|
269
|
+
:collection_paths_test_support_source_include_vendor =>
|
263
270
|
in_hash[:collection_paths_test_support_source_include] +
|
264
271
|
get_vendor_paths(in_hash)
|
265
|
-
}
|
272
|
+
}
|
266
273
|
end
|
267
|
-
|
268
|
-
|
274
|
+
|
275
|
+
|
269
276
|
def collect_tests(in_hash)
|
270
277
|
all_tests = @file_wrapper.instantiate_file_list
|
271
278
|
|
@@ -283,11 +290,11 @@ class ConfiguratorBuilder
|
|
283
290
|
all_assembly = @file_wrapper.instantiate_file_list
|
284
291
|
|
285
292
|
return {:collection_all_assembly => all_assembly} if (not in_hash[:release_build_use_assembly])
|
286
|
-
|
293
|
+
|
287
294
|
in_hash[:collection_paths_source].each do |path|
|
288
295
|
all_assembly.include( File.join(path, "*#{in_hash[:extension_assembly]}") )
|
289
296
|
end
|
290
|
-
|
297
|
+
|
291
298
|
@file_system_utils.revise_file_list( all_assembly, in_hash[:files_assembly] )
|
292
299
|
|
293
300
|
return {:collection_all_assembly => all_assembly}
|
@@ -304,7 +311,7 @@ class ConfiguratorBuilder
|
|
304
311
|
end
|
305
312
|
end
|
306
313
|
@file_system_utils.revise_file_list( all_source, in_hash[:files_source] )
|
307
|
-
|
314
|
+
|
308
315
|
return {:collection_all_source => all_source}
|
309
316
|
end
|
310
317
|
|
@@ -312,18 +319,18 @@ class ConfiguratorBuilder
|
|
312
319
|
def collect_headers(in_hash)
|
313
320
|
all_headers = @file_wrapper.instantiate_file_list
|
314
321
|
|
315
|
-
paths =
|
322
|
+
paths =
|
316
323
|
in_hash[:collection_paths_test] +
|
317
324
|
in_hash[:collection_paths_support] +
|
318
|
-
in_hash[:collection_paths_source] +
|
325
|
+
in_hash[:collection_paths_source] +
|
319
326
|
in_hash[:collection_paths_include]
|
320
|
-
|
327
|
+
|
321
328
|
paths.each do |path|
|
322
329
|
all_headers.include( File.join(path, "*#{in_hash[:extension_header]}") )
|
323
330
|
end
|
324
331
|
|
325
332
|
@file_system_utils.revise_file_list( all_headers, in_hash[:files_include] )
|
326
|
-
|
333
|
+
|
327
334
|
return {:collection_all_headers => all_headers}
|
328
335
|
end
|
329
336
|
|
@@ -331,13 +338,13 @@ class ConfiguratorBuilder
|
|
331
338
|
def collect_all_existing_compilation_input(in_hash)
|
332
339
|
all_input = @file_wrapper.instantiate_file_list
|
333
340
|
|
334
|
-
paths =
|
335
|
-
in_hash[:collection_paths_test] +
|
336
|
-
in_hash[:collection_paths_support] +
|
337
|
-
in_hash[:collection_paths_source] +
|
341
|
+
paths =
|
342
|
+
in_hash[:collection_paths_test] +
|
343
|
+
in_hash[:collection_paths_support] +
|
344
|
+
in_hash[:collection_paths_source] +
|
338
345
|
in_hash[:collection_paths_include] +
|
339
346
|
[FilePathUtils::form_ceedling_vendor_path(UNITY_LIB_PATH)]
|
340
|
-
|
347
|
+
|
341
348
|
paths << FilePathUtils::form_ceedling_vendor_path(CEXCEPTION_LIB_PATH) if (in_hash[:project_use_exceptions])
|
342
349
|
paths << FilePathUtils::form_ceedling_vendor_path(CMOCK_LIB_PATH) if (in_hash[:project_use_mocks])
|
343
350
|
|
@@ -349,14 +356,14 @@ class ConfiguratorBuilder
|
|
349
356
|
all_input.include( File.join(path, "*#{in_hash[:extension_source]}") )
|
350
357
|
end
|
351
358
|
end
|
352
|
-
|
359
|
+
|
353
360
|
@file_system_utils.revise_file_list( all_input, in_hash[:files_test] )
|
354
361
|
@file_system_utils.revise_file_list( all_input, in_hash[:files_support] )
|
355
362
|
@file_system_utils.revise_file_list( all_input, in_hash[:files_source] )
|
356
363
|
@file_system_utils.revise_file_list( all_input, in_hash[:files_include] )
|
357
364
|
# finding assembly files handled explicitly through other means
|
358
365
|
|
359
|
-
return {:collection_all_existing_compilation_input => all_input}
|
366
|
+
return {:collection_all_existing_compilation_input => all_input}
|
360
367
|
end
|
361
368
|
|
362
369
|
|
@@ -366,16 +373,16 @@ class ConfiguratorBuilder
|
|
366
373
|
test_defines.concat(in_hash[:unity_defines])
|
367
374
|
test_defines.concat(in_hash[:cmock_defines]) if (in_hash[:project_use_mocks])
|
368
375
|
test_defines.concat(in_hash[:cexception_defines]) if (in_hash[:project_use_exceptions])
|
369
|
-
|
376
|
+
|
370
377
|
return {:collection_defines_test_and_vendor => test_defines}
|
371
378
|
end
|
372
379
|
|
373
380
|
|
374
381
|
def collect_release_and_vendor_defines(in_hash)
|
375
382
|
release_defines = in_hash[:defines_release].clone
|
376
|
-
|
383
|
+
|
377
384
|
release_defines.concat(in_hash[:cexception_defines]) if (in_hash[:project_use_exceptions])
|
378
|
-
|
385
|
+
|
379
386
|
return {:collection_defines_release_and_vendor => release_defines}
|
380
387
|
end
|
381
388
|
|
@@ -388,29 +395,29 @@ class ConfiguratorBuilder
|
|
388
395
|
|
389
396
|
return {:collection_release_artifact_extra_link_objects => objects}
|
390
397
|
end
|
391
|
-
|
398
|
+
|
392
399
|
|
393
400
|
def collect_test_fixture_extra_link_objects(in_hash)
|
394
401
|
# Note: Symbols passed to compiler at command line can change Unity and CException behavior / configuration;
|
395
402
|
# we also handle those dependencies elsewhere in compilation dependencies
|
396
|
-
|
403
|
+
|
397
404
|
objects = [UNITY_C_FILE]
|
398
|
-
|
405
|
+
|
399
406
|
# we don't include paths here because use of plugins or mixing different compilers may require different build paths
|
400
407
|
objects << CEXCEPTION_C_FILE if (in_hash[:project_use_exceptions])
|
401
408
|
objects << CMOCK_C_FILE if (in_hash[:project_use_mocks])
|
402
|
-
|
409
|
+
|
403
410
|
# if we're using mocks & a unity helper is defined & that unity helper includes a source file component (not only a header of macros),
|
404
411
|
# then link in the unity_helper object file too
|
405
412
|
if ( in_hash[:project_use_mocks] and
|
406
|
-
in_hash[:cmock_unity_helper] and
|
413
|
+
in_hash[:cmock_unity_helper] and
|
407
414
|
@file_wrapper.exist?(in_hash[:cmock_unity_helper].ext(in_hash[:extension_source])) )
|
408
415
|
objects << File.basename(in_hash[:cmock_unity_helper])
|
409
416
|
end
|
410
417
|
|
411
418
|
# no build paths here so plugins can remap if necessary (i.e. path mapping happens at runtime)
|
412
419
|
objects.map! { |object| object.ext(in_hash[:extension_object]) }
|
413
|
-
|
420
|
+
|
414
421
|
return { :collection_test_fixture_extra_link_objects => objects }
|
415
422
|
end
|
416
423
|
|
@@ -426,5 +433,5 @@ class ConfiguratorBuilder
|
|
426
433
|
|
427
434
|
return vendor_paths
|
428
435
|
end
|
429
|
-
|
436
|
+
|
430
437
|
end
|