chef-apply 0.1.17 → 0.1.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -7
  3. data/Gemfile.lock +176 -84
  4. data/chef-apply.gemspec +2 -2
  5. data/lib/chef_apply/version.rb +1 -1
  6. data/spec/fixtures/custom_config.toml +2 -0
  7. data/spec/integration/chef-run_spec.rb +41 -0
  8. data/spec/integration/fixtures/chef_help.out +69 -0
  9. data/spec/integration/fixtures/chef_version.out +1 -0
  10. data/spec/integration/spec_helper.rb +55 -0
  11. data/spec/spec_helper.rb +114 -0
  12. data/spec/support/matchers/output_to_terminal.rb +36 -0
  13. data/spec/unit/action/base_spec.rb +89 -0
  14. data/spec/unit/action/converge_target_spec.rb +292 -0
  15. data/spec/unit/action/generate_local_policy_spec.rb +114 -0
  16. data/spec/unit/action/generate_temp_cookbook_spec.rb +75 -0
  17. data/spec/unit/action/install_chef/base_spec.rb +234 -0
  18. data/spec/unit/action/install_chef_spec.rb +69 -0
  19. data/spec/unit/cli/options_spec.rb +75 -0
  20. data/spec/unit/cli/validation_spec.rb +78 -0
  21. data/spec/unit/cli_spec.rb +440 -0
  22. data/spec/unit/config_spec.rb +70 -0
  23. data/spec/unit/errors/ccr_failure_mapper_spec.rb +103 -0
  24. data/spec/unit/file_fetcher_spec.rb +40 -0
  25. data/spec/unit/fixtures/multi-error.out +2 -0
  26. data/spec/unit/log_spec.rb +37 -0
  27. data/spec/unit/recipe_lookup_spec.rb +122 -0
  28. data/spec/unit/startup_spec.rb +283 -0
  29. data/spec/unit/target_host_spec.rb +231 -0
  30. data/spec/unit/target_resolver_spec.rb +380 -0
  31. data/spec/unit/telemeter/sender_spec.rb +140 -0
  32. data/spec/unit/telemeter_spec.rb +191 -0
  33. data/spec/unit/temp_cookbook_spec.rb +199 -0
  34. data/spec/unit/ui/error_printer_spec.rb +173 -0
  35. data/spec/unit/ui/terminal_spec.rb +109 -0
  36. data/spec/unit/version_spec.rb +31 -0
  37. data/warning.txt +3 -0
  38. metadata +34 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 134e2e8349e0bc6292d2204260039cd37df9397d69b186b0d5696cae7c674f4b
4
- data.tar.gz: d827cba5714b35c3b0e012c0a7fd77f853c81f99f73db2386cd036d0fc1ccc5c
3
+ metadata.gz: 1e4309991a02465e139c4ac2da82cf3bc9acfa164b564fa7428b80cc7122d6f4
4
+ data.tar.gz: c60806b1eb3ad8e93fe66b7821b5545ca407db5acecd167cbb3e5ad07d7086e4
5
5
  SHA512:
6
- metadata.gz: 2db8c676473b41e0463a66d1556bbffce87a6da79d6c544425276ee7f73de9370681904f1ffa6fe03ab88d407ed84edde305e4fae60675b0188d553166e390d7
7
- data.tar.gz: 59f4fe3808f5670bea9c32a584405e16a30b95934f58d4dbc427126e80cdcdc77ac01c85ec3169e577aa2344b895363be3fc7d503be41079eeca260233e9df61
6
+ metadata.gz: d281858ffdf9616b2cba493e364ae4d3f938abd227f9a012d5e13d5bbaa0f8433a1ea2ddf9c795fb83b85e57b97c2fee10403bce1eac6b98daaf34c7f5cfae67
7
+ data.tar.gz: bf94d6c3ce3834c207ef83ac887a808a2fd26f7fbfaa5d6ca5438a7f7b119bc402755cc93feac477e66a5b2379760b0726aaff50c434b8f3fdf7eeb4b4c31013
data/Gemfile CHANGED
@@ -17,10 +17,3 @@
17
17
 
18
18
  source "https://rubygems.org"
19
19
  gemspec
20
-
21
- # Pinning Train to 1.4.6 because newer versions cause healthcheck related build failures
22
- gem "train", git: "https://github.com/chef/train.git", branch: "v1.4.6"
23
-
24
- group :localdev do
25
- gem "irbtools-more", require: "irbtools/binding"
26
- end
@@ -1,24 +1,7 @@
1
- GIT
2
- remote: https://github.com/chef/train.git
3
- revision: daefae3357bdaa903ec75da9ab6b222073f6fa07
4
- branch: v1.4.6
5
- specs:
6
- train (1.4.6)
7
- aws-sdk (~> 2)
8
- azure_mgmt_resources (~> 0.15)
9
- docker-api (~> 1.26)
10
- inifile
11
- json (>= 1.8, < 3.0)
12
- mixlib-shellout (~> 2.0)
13
- net-scp (~> 1.2)
14
- net-ssh (>= 2.9, < 5.0)
15
- winrm (~> 2.0)
16
- winrm-fs (~> 1.0)
17
-
18
1
  PATH
19
2
  remote: .
20
3
  specs:
21
- chef-apply (0.1.17)
4
+ chef-apply (0.1.18)
22
5
  chef (>= 14.0)
23
6
  chef-dk (>= 3.0)
24
7
  chef-telemetry
@@ -48,13 +31,10 @@ GEM
48
31
  aws-sigv4 (1.0.3)
49
32
  azure_mgmt_resources (0.16.0)
50
33
  ms_rest_azure (~> 0.10.0)
51
- binding.repl (3.0.0)
52
34
  binding_of_caller (0.8.0)
53
35
  debug_inspector (>= 0.0.1)
54
- bond (0.5.1)
55
36
  builder (3.2.3)
56
37
  byebug (10.0.2)
57
- cd (1.0.1)
58
38
  chef (14.3.37)
59
39
  addressable
60
40
  bundler (>= 1.10)
@@ -131,22 +111,15 @@ GEM
131
111
  chefstyle (0.10.0)
132
112
  rubocop (= 0.55.0)
133
113
  citrus (3.0.2)
134
- clipboard (1.1.2)
135
- code (0.9.2)
136
- coderay (~> 1.1)
137
- method_source (~> 0.9)
138
114
  coderay (1.1.2)
139
115
  concurrent-ruby (1.0.5)
140
116
  cookbook-omnifetch (0.8.0)
141
117
  mixlib-archive (~> 0.4)
142
- core_docs (0.9.3)
143
- yard (~> 0.8)
144
118
  debug_inspector (0.0.3)
145
- debugging (1.1.1)
146
- binding.repl (~> 3.0)
147
- paint (>= 0.9, < 3.0)
148
- did_you_mean (1.2.1)
119
+ declarative (0.0.10)
120
+ declarative-option (0.1.0)
149
121
  diff-lcs (1.3)
122
+ digest-crc (0.4.1)
150
123
  docile (1.3.1)
151
124
  docker-api (1.34.2)
152
125
  excon (>= 0.47.0)
@@ -155,12 +128,7 @@ GEM
155
128
  unf (>= 0.0.5, < 1.0.0)
156
129
  equatable (0.5.0)
157
130
  erubis (2.7.0)
158
- every_day_irb (2.0.0)
159
- cd (~> 1.0)
160
131
  excon (0.62.0)
161
- fancy_irb (1.1.0)
162
- paint (>= 0.9, < 3.0)
163
- unicode-display_width (~> 1.1)
164
132
  faraday (0.15.2)
165
133
  multipart-post (>= 1.2, < 3)
166
134
  faraday-cookie_jar (0.0.6)
@@ -170,13 +138,147 @@ GEM
170
138
  ffi-yajl (2.3.1)
171
139
  libyajl2 (~> 1.2)
172
140
  fuzzyurl (0.9.0)
141
+ google-api-client (0.19.8)
142
+ addressable (~> 2.5, >= 2.5.1)
143
+ googleauth (>= 0.5, < 0.7.0)
144
+ httpclient (>= 2.8.1, < 3.0)
145
+ mime-types (~> 3.0)
146
+ representable (~> 3.0)
147
+ retriable (>= 2.0, < 4.0)
148
+ google-cloud (0.51.1)
149
+ google-cloud-bigquery (~> 1.1)
150
+ google-cloud-bigquery-data_transfer (~> 0.1)
151
+ google-cloud-container (~> 0.1)
152
+ google-cloud-dataproc (~> 0.1)
153
+ google-cloud-datastore (~> 1.4)
154
+ google-cloud-dlp (~> 0.1)
155
+ google-cloud-dns (~> 0.28)
156
+ google-cloud-error_reporting (~> 0.30)
157
+ google-cloud-firestore (~> 0.21)
158
+ google-cloud-language (~> 0.30)
159
+ google-cloud-logging (~> 1.5)
160
+ google-cloud-monitoring (~> 0.27)
161
+ google-cloud-os_login (~> 0.1)
162
+ google-cloud-pubsub (~> 0.30)
163
+ google-cloud-resource_manager (~> 0.29)
164
+ google-cloud-spanner (~> 1.3)
165
+ google-cloud-speech (~> 0.29)
166
+ google-cloud-storage (~> 1.10)
167
+ google-cloud-trace (~> 0.31)
168
+ google-cloud-translate (~> 1.2)
169
+ google-cloud-video_intelligence (~> 1.0)
170
+ google-cloud-vision (~> 0.28)
171
+ google-cloud-bigquery (1.5.0)
172
+ concurrent-ruby (~> 1.0)
173
+ google-api-client (~> 0.19.8)
174
+ google-cloud-core (~> 1.2)
175
+ googleauth (~> 0.6.2)
176
+ google-cloud-bigquery-data_transfer (0.1.0)
177
+ google-gax (~> 1.0)
178
+ google-cloud-container (0.1.0)
179
+ google-gax (~> 1.0.1)
180
+ google-cloud-core (1.2.2)
181
+ google-cloud-env (~> 1.0)
182
+ google-cloud-dataproc (0.1.0)
183
+ google-gax (~> 1.0.0)
184
+ google-cloud-datastore (1.4.0)
185
+ google-cloud-core (~> 1.2)
186
+ google-gax (~> 1.0)
187
+ google-protobuf (~> 3.3)
188
+ google-cloud-dlp (0.4.0)
189
+ google-gax (~> 1.0)
190
+ google-cloud-dns (0.28.0)
191
+ google-api-client (~> 0.19.0)
192
+ google-cloud-core (~> 1.2)
193
+ googleauth (~> 0.6.2)
194
+ zonefile (~> 1.04)
195
+ google-cloud-env (1.0.2)
196
+ faraday (~> 0.11)
197
+ google-cloud-error_reporting (0.30.1)
198
+ google-cloud-core (~> 1.2)
199
+ google-gax (~> 1.0)
200
+ stackdriver-core (~> 1.3)
201
+ google-cloud-firestore (0.22.0)
202
+ concurrent-ruby (~> 1.0)
203
+ google-cloud-core (~> 1.2)
204
+ google-gax (~> 1.0)
205
+ google-cloud-language (0.30.0)
206
+ google-gax (~> 1.0)
207
+ google-cloud-logging (1.5.1)
208
+ google-cloud-core (~> 1.2)
209
+ google-gax (~> 1.0)
210
+ stackdriver-core (~> 1.3)
211
+ google-cloud-monitoring (0.28.0)
212
+ google-gax (~> 1.0)
213
+ google-cloud-os_login (0.1.0)
214
+ google-gax (~> 1.0.0)
215
+ google-cloud-pubsub (0.31.0)
216
+ concurrent-ruby (~> 1.0)
217
+ google-cloud-core (~> 1.2)
218
+ google-gax (~> 1.0)
219
+ grpc-google-iam-v1 (~> 0.6.9)
220
+ google-cloud-resource_manager (0.29.0)
221
+ google-api-client (~> 0.19.8)
222
+ google-cloud-core (~> 1.2)
223
+ googleauth (~> 0.6.2)
224
+ google-cloud-spanner (1.6.0)
225
+ concurrent-ruby (~> 1.0)
226
+ google-cloud-core (~> 1.2)
227
+ google-gax (~> 1.0)
228
+ grpc-google-iam-v1 (~> 0.6.9)
229
+ google-cloud-speech (0.30.0)
230
+ google-gax (~> 1.0)
231
+ google-cloud-storage (1.12.0)
232
+ digest-crc (~> 0.4)
233
+ google-api-client (~> 0.19.0)
234
+ google-cloud-core (~> 1.2)
235
+ googleauth (~> 0.6.2)
236
+ google-cloud-trace (0.33.1)
237
+ google-cloud-core (~> 1.2)
238
+ google-gax (~> 1.0)
239
+ stackdriver-core (~> 1.3)
240
+ google-cloud-translate (1.2.0)
241
+ faraday (~> 0.13)
242
+ google-cloud-core (~> 1.2)
243
+ googleauth (~> 0.6.2)
244
+ google-cloud-video_intelligence (1.0.0)
245
+ google-gax (~> 1.0)
246
+ google-cloud-vision (0.29.0)
247
+ google-cloud-core (~> 1.2)
248
+ google-gax (~> 1.0)
249
+ google-gax (1.0.1)
250
+ google-protobuf (~> 3.2)
251
+ googleapis-common-protos (>= 1.3.5, < 2.0)
252
+ googleauth (~> 0.6.2)
253
+ grpc (>= 1.7.2, < 2.0)
254
+ rly (~> 0.2.3)
255
+ google-protobuf (3.6.0)
256
+ googleapis-common-protos (1.3.7)
257
+ google-protobuf (~> 3.0)
258
+ googleapis-common-protos-types (~> 1.0)
259
+ grpc (~> 1.0)
260
+ googleapis-common-protos-types (1.0.1)
261
+ google-protobuf (~> 3.0)
262
+ googleauth (0.6.2)
263
+ faraday (~> 0.12)
264
+ jwt (>= 1.4, < 3.0)
265
+ logging (~> 2.0)
266
+ memoist (~> 0.12)
267
+ multi_json (~> 1.11)
268
+ os (~> 0.9)
269
+ signet (~> 0.7)
270
+ grpc (1.13.0)
271
+ google-protobuf (~> 3.1)
272
+ googleapis-common-protos-types (~> 1.0.0)
273
+ grpc-google-iam-v1 (0.6.9)
274
+ googleapis-common-protos (>= 1.3.1, < 2.0)
275
+ grpc (~> 1.0)
173
276
  gssapi (1.2.0)
174
277
  ffi (>= 1.0.1)
175
278
  gyoku (1.3.1)
176
279
  builder (>= 2.1.2)
177
280
  hashie (3.5.7)
178
281
  highline (1.7.10)
179
- hirb (0.7.3)
180
282
  http (2.2.2)
181
283
  addressable (~> 2.3)
182
284
  http-cookie (~> 1.0)
@@ -189,49 +291,21 @@ GEM
189
291
  httpclient (2.8.3)
190
292
  inifile (3.0.0)
191
293
  iniparse (1.4.4)
192
- instance (0.2.0)
193
- interactive_editor (0.0.11)
194
- spoon (>= 0.0.1)
195
294
  ipaddress (0.8.3)
196
- irbtools (2.2.1)
197
- binding.repl (~> 3.0)
198
- clipboard (~> 1.1)
199
- code (~> 0.9)
200
- coderay (~> 1.1)
201
- debugging (~> 1.1)
202
- every_day_irb (~> 2.0)
203
- fancy_irb (~> 1.1)
204
- hirb (~> 0.7, >= 0.7.3)
205
- instance (~> 0.2)
206
- interactive_editor (~> 0.0, >= 0.0.10)
207
- method_locator (~> 0.0, >= 0.0.4)
208
- methodfinder (~> 2.0)
209
- ori (~> 0.1.0)
210
- os
211
- paint (>= 0.9, < 3.0)
212
- ruby_engine (~> 1.0)
213
- ruby_info (~> 1.0)
214
- ruby_version (~> 1.0)
215
- wirb (~> 2.0)
216
- irbtools-more (2.2.1)
217
- binding_of_caller (~> 0.7)
218
- bond (~> 0.5)
219
- core_docs (>= 0.9.2)
220
- did_you_mean (~> 1.0)
221
- irbtools (~> 2.0)
222
- looksee (~> 4.0)
223
295
  iso8601 (0.9.1)
224
296
  jmespath (1.4.0)
225
297
  json (2.1.0)
298
+ jwt (2.1.0)
226
299
  libyajl2 (1.2.0)
227
300
  little-plugger (1.1.4)
228
301
  logging (2.2.2)
229
302
  little-plugger (~> 1.1)
230
303
  multi_json (~> 1.10)
231
- looksee (4.0.0)
232
- method_locator (0.0.4)
304
+ memoist (0.16.0)
233
305
  method_source (0.9.0)
234
- methodfinder (2.2.1)
306
+ mime-types (3.1)
307
+ mime-types-data (~> 3.2015)
308
+ mime-types-data (3.2016.0521)
235
309
  minitar (0.6.1)
236
310
  mixlib-archive (0.4.8)
237
311
  mixlib-log
@@ -282,11 +356,10 @@ GEM
282
356
  plist (~> 3.1)
283
357
  systemu (~> 2.6.4)
284
358
  wmi-lite (~> 1.0)
285
- ori (0.1.0)
286
- os (1.0.0)
359
+ os (0.9.6)
287
360
  paint (1.0.1)
288
361
  parallel (1.12.1)
289
- parser (2.5.1.0)
362
+ parser (2.5.1.2)
290
363
  ast (~> 2.4.0)
291
364
  pastel (0.7.2)
292
365
  equatable (~> 0.5.0)
@@ -310,6 +383,12 @@ GEM
310
383
  rack (2.0.5)
311
384
  rainbow (3.0.0)
312
385
  rake (12.3.1)
386
+ representable (3.0.4)
387
+ declarative (< 0.1.0)
388
+ declarative-option (< 0.2.0)
389
+ uber (< 0.2.0)
390
+ retriable (3.1.2)
391
+ rly (0.2.3)
313
392
  rspec (3.7.0)
314
393
  rspec-core (~> 3.7.0)
315
394
  rspec-expectations (~> 3.7.0)
@@ -337,9 +416,6 @@ GEM
337
416
  ruby-progressbar (~> 1.7)
338
417
  unicode-display_width (~> 1.0, >= 1.0.1)
339
418
  ruby-progressbar (1.9.0)
340
- ruby_engine (1.0.1)
341
- ruby_info (1.0.1)
342
- ruby_version (1.0.1)
343
419
  rubyntlm (0.6.2)
344
420
  rubyzip (1.2.1)
345
421
  semverse (2.0.0)
@@ -349,6 +425,11 @@ GEM
349
425
  rspec-its
350
426
  specinfra (~> 2.72)
351
427
  sfl (2.3)
428
+ signet (0.8.1)
429
+ addressable (~> 2.3)
430
+ faraday (~> 0.9)
431
+ jwt (>= 1.5, < 3.0)
432
+ multi_json (~> 1.10)
352
433
  simplecov (0.16.1)
353
434
  docile (~> 1.1)
354
435
  json (>= 1.8, < 3)
@@ -362,8 +443,8 @@ GEM
362
443
  net-ssh (>= 2.7)
363
444
  net-telnet
364
445
  sfl
365
- spoon (0.0.6)
366
- ffi
446
+ stackdriver-core (1.3.0)
447
+ google-cloud-core (~> 1.2)
367
448
  syslog-logger (1.6.8)
368
449
  systemu (2.6.5)
369
450
  thor (0.20.0)
@@ -371,10 +452,25 @@ GEM
371
452
  toml-rb (1.1.1)
372
453
  citrus (~> 3.0, > 3.0)
373
454
  tomlrb (1.2.7)
455
+ train (1.4.24)
456
+ aws-sdk (~> 2)
457
+ azure_mgmt_resources (~> 0.15)
458
+ docker-api (~> 1.26)
459
+ google-api-client (~> 0.19.8)
460
+ google-cloud (~> 0.51.1)
461
+ googleauth (~> 0.6.2)
462
+ inifile
463
+ json (>= 1.8, < 3.0)
464
+ mixlib-shellout (~> 2.0)
465
+ net-scp (~> 1.2)
466
+ net-ssh (>= 2.9, < 5.0)
467
+ winrm (~> 2.0)
468
+ winrm-fs (~> 1.0)
374
469
  tty-color (0.4.3)
375
470
  tty-cursor (0.6.0)
376
471
  tty-spinner (0.8.0)
377
472
  tty-cursor (>= 0.5.0)
473
+ uber (0.1.0)
378
474
  unf (0.1.4)
379
475
  unf_ext
380
476
  unf_ext (0.0.7.5)
@@ -392,15 +488,13 @@ GEM
392
488
  winrm-elevated (1.1.0)
393
489
  winrm (~> 2.0)
394
490
  winrm-fs (~> 1.0)
395
- winrm-fs (1.2.0)
491
+ winrm-fs (1.2.1)
396
492
  erubis (~> 2.7)
397
493
  logging (>= 1.6.1, < 3.0)
398
494
  rubyzip (~> 1.1)
399
495
  winrm (~> 2.0)
400
- wirb (2.1.2)
401
- paint (>= 0.9, < 3.0)
402
496
  wmi-lite (1.0.0)
403
- yard (0.9.14)
497
+ zonefile (1.06)
404
498
 
405
499
  PLATFORMS
406
500
  ruby
@@ -409,7 +503,6 @@ DEPENDENCIES
409
503
  bundler
410
504
  chef-apply!
411
505
  chefstyle
412
- irbtools-more
413
506
  pry
414
507
  pry-byebug
415
508
  pry-stack_explorer
@@ -417,7 +510,6 @@ DEPENDENCIES
417
510
  rspec
418
511
  rspec_junit_formatter
419
512
  simplecov
420
- train!
421
513
 
422
514
  BUNDLED WITH
423
515
  1.16.2
@@ -31,10 +31,10 @@ Gem::Specification.new do |spec|
31
31
  spec.license = "Apache-2.0"
32
32
  spec.required_ruby_version = ">= 2.5.0"
33
33
 
34
- spec.files = %w{Rakefile LICENSE README.md} +
34
+ spec.files = %w{Rakefile LICENSE README.md warning.txt} +
35
35
  Dir.glob("Gemfile*") + # Includes Gemfile and locks
36
36
  Dir.glob("*.gemspec") +
37
- Dir.glob("{lib,bin,vendor,i18n}/**/*", File::FNM_DOTMATCH).reject { |f| File.directory?(f) }
37
+ Dir.glob("{bin,i18n,lib,spec}/**/*", File::FNM_DOTMATCH).reject { |f| File.directory?(f) }
38
38
  spec.bindir = "bin"
39
39
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
40
40
  spec.require_paths = ["lib"]
@@ -16,5 +16,5 @@
16
16
  #
17
17
 
18
18
  module ChefApply
19
- VERSION = "0.1.17"
19
+ VERSION = "0.1.18"
20
20
  end
@@ -0,0 +1,2 @@
1
+ [telemetry]
2
+ dev = true
@@ -0,0 +1,41 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2018 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "spec_helper"
19
+ require "integration/spec_helper"
20
+ require "chef_apply/cli"
21
+ require "chef_apply/version"
22
+
23
+ RSpec.describe "chef_appl" do
24
+ context "help output" do
25
+ context "at the top level" do
26
+ ["-h", "--help", ""].each do |arg|
27
+ it "#{arg} displays correct help" do
28
+ expect { run_cli_with(arg) }.to output(fixture_content("chef_help")).to_stdout
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ context "version output" do
35
+ ["-v", "--version"].each do |arg|
36
+ it "#{arg} displays correct version" do
37
+ expect { run_cli_with(arg) }.to output(fixture_content("chef_version")).to_stdout
38
+ end
39
+ end
40
+ end
41
+ end