ceedling 0.15.4 → 0.15.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Ceedling Build Status](https://api.travis-ci.org/ThrowTheSwitch/Ceedling.png?branch=master)](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
|