chef-cli 1.0.3

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.
Files changed (372) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +32 -0
  3. data/LICENSE +201 -0
  4. data/Rakefile +70 -0
  5. data/bin/chef +25 -0
  6. data/chef-cli.gemspec +53 -0
  7. data/lib/chef-cli.rb +19 -0
  8. data/lib/chef-cli/authenticated_http.rb +22 -0
  9. data/lib/chef-cli/builtin_commands.rb +62 -0
  10. data/lib/chef-cli/chef_runner.rb +114 -0
  11. data/lib/chef-cli/chef_server_api_multi.rb +73 -0
  12. data/lib/chef-cli/cli.rb +206 -0
  13. data/lib/chef-cli/command/base.rb +89 -0
  14. data/lib/chef-cli/command/clean_policy_cookbooks.rb +115 -0
  15. data/lib/chef-cli/command/clean_policy_revisions.rb +112 -0
  16. data/lib/chef-cli/command/delete_policy.rb +121 -0
  17. data/lib/chef-cli/command/delete_policy_group.rb +121 -0
  18. data/lib/chef-cli/command/describe_cookbook.rb +98 -0
  19. data/lib/chef-cli/command/diff.rb +316 -0
  20. data/lib/chef-cli/command/env.rb +99 -0
  21. data/lib/chef-cli/command/exec.rb +45 -0
  22. data/lib/chef-cli/command/export.rb +156 -0
  23. data/lib/chef-cli/command/gem.rb +48 -0
  24. data/lib/chef-cli/command/generate.rb +123 -0
  25. data/lib/chef-cli/command/generator_commands.rb +83 -0
  26. data/lib/chef-cli/command/generator_commands/attribute.rb +37 -0
  27. data/lib/chef-cli/command/generator_commands/base.rb +157 -0
  28. data/lib/chef-cli/command/generator_commands/build_cookbook.rb +126 -0
  29. data/lib/chef-cli/command/generator_commands/chef_exts/generator_desc_resource.rb +40 -0
  30. data/lib/chef-cli/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -0
  31. data/lib/chef-cli/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -0
  32. data/lib/chef-cli/command/generator_commands/cookbook.rb +251 -0
  33. data/lib/chef-cli/command/generator_commands/cookbook_code_file.rb +100 -0
  34. data/lib/chef-cli/command/generator_commands/cookbook_file.rb +46 -0
  35. data/lib/chef-cli/command/generator_commands/generator_generator.rb +175 -0
  36. data/lib/chef-cli/command/generator_commands/helpers.rb +37 -0
  37. data/lib/chef-cli/command/generator_commands/policyfile.rb +125 -0
  38. data/lib/chef-cli/command/generator_commands/recipe.rb +37 -0
  39. data/lib/chef-cli/command/generator_commands/repo.rb +140 -0
  40. data/lib/chef-cli/command/generator_commands/resource.rb +37 -0
  41. data/lib/chef-cli/command/generator_commands/template.rb +47 -0
  42. data/lib/chef-cli/command/install.rb +121 -0
  43. data/lib/chef-cli/command/provision.rb +38 -0
  44. data/lib/chef-cli/command/push.rb +118 -0
  45. data/lib/chef-cli/command/push_archive.rb +126 -0
  46. data/lib/chef-cli/command/shell_init.rb +185 -0
  47. data/lib/chef-cli/command/show_policy.rb +164 -0
  48. data/lib/chef-cli/command/undelete.rb +155 -0
  49. data/lib/chef-cli/command/update.rb +140 -0
  50. data/lib/chef-cli/command/verify.rb +548 -0
  51. data/lib/chef-cli/commands_map.rb +113 -0
  52. data/lib/chef-cli/completions/bash.sh.erb +5 -0
  53. data/lib/chef-cli/completions/chef.fish.erb +10 -0
  54. data/lib/chef-cli/completions/zsh.zsh.erb +21 -0
  55. data/lib/chef-cli/component_test.rb +226 -0
  56. data/lib/chef-cli/configurable.rb +88 -0
  57. data/lib/chef-cli/cookbook_metadata.rb +45 -0
  58. data/lib/chef-cli/cookbook_omnifetch.rb +32 -0
  59. data/lib/chef-cli/cookbook_profiler/git.rb +152 -0
  60. data/lib/chef-cli/cookbook_profiler/identifiers.rb +72 -0
  61. data/lib/chef-cli/cookbook_profiler/null_scm.rb +31 -0
  62. data/lib/chef-cli/dist.rb +31 -0
  63. data/lib/chef-cli/exceptions.rb +153 -0
  64. data/lib/chef-cli/generator.rb +165 -0
  65. data/lib/chef-cli/helpers.rb +170 -0
  66. data/lib/chef-cli/pager.rb +104 -0
  67. data/lib/chef-cli/policyfile/artifactory_cookbook_source.rb +102 -0
  68. data/lib/chef-cli/policyfile/attribute_merge_checker.rb +110 -0
  69. data/lib/chef-cli/policyfile/chef_repo_cookbook_source.rb +138 -0
  70. data/lib/chef-cli/policyfile/chef_server_cookbook_source.rb +99 -0
  71. data/lib/chef-cli/policyfile/chef_server_lock_fetcher.rb +167 -0
  72. data/lib/chef-cli/policyfile/community_cookbook_source.rb +95 -0
  73. data/lib/chef-cli/policyfile/comparison_base.rb +123 -0
  74. data/lib/chef-cli/policyfile/cookbook_location_specification.rb +154 -0
  75. data/lib/chef-cli/policyfile/cookbook_locks.rb +466 -0
  76. data/lib/chef-cli/policyfile/cookbook_sources.rb +23 -0
  77. data/lib/chef-cli/policyfile/delivery_supermarket_source.rb +89 -0
  78. data/lib/chef-cli/policyfile/differ.rb +263 -0
  79. data/lib/chef-cli/policyfile/dsl.rb +288 -0
  80. data/lib/chef-cli/policyfile/git_lock_fetcher.rb +265 -0
  81. data/lib/chef-cli/policyfile/included_policies_cookbook_source.rb +156 -0
  82. data/lib/chef-cli/policyfile/lister.rb +229 -0
  83. data/lib/chef-cli/policyfile/local_lock_fetcher.rb +132 -0
  84. data/lib/chef-cli/policyfile/lock_applier.rb +80 -0
  85. data/lib/chef-cli/policyfile/lock_fetcher_mixin.rb +37 -0
  86. data/lib/chef-cli/policyfile/null_cookbook_source.rb +49 -0
  87. data/lib/chef-cli/policyfile/policyfile_location_specification.rb +128 -0
  88. data/lib/chef-cli/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -0
  89. data/lib/chef-cli/policyfile/remote_lock_fetcher.rb +108 -0
  90. data/lib/chef-cli/policyfile/reports/install.rb +69 -0
  91. data/lib/chef-cli/policyfile/reports/table_printer.rb +57 -0
  92. data/lib/chef-cli/policyfile/reports/upload.rb +70 -0
  93. data/lib/chef-cli/policyfile/solution_dependencies.rb +311 -0
  94. data/lib/chef-cli/policyfile/source_uri.rb +57 -0
  95. data/lib/chef-cli/policyfile/storage_config.rb +112 -0
  96. data/lib/chef-cli/policyfile/undo_record.rb +139 -0
  97. data/lib/chef-cli/policyfile/undo_stack.rb +128 -0
  98. data/lib/chef-cli/policyfile/uploader.rb +222 -0
  99. data/lib/chef-cli/policyfile_compiler.rb +528 -0
  100. data/lib/chef-cli/policyfile_lock.rb +581 -0
  101. data/lib/chef-cli/policyfile_services/clean_policies.rb +95 -0
  102. data/lib/chef-cli/policyfile_services/clean_policy_cookbooks.rb +123 -0
  103. data/lib/chef-cli/policyfile_services/export_repo.rb +419 -0
  104. data/lib/chef-cli/policyfile_services/install.rb +167 -0
  105. data/lib/chef-cli/policyfile_services/push.rb +112 -0
  106. data/lib/chef-cli/policyfile_services/push_archive.rb +164 -0
  107. data/lib/chef-cli/policyfile_services/rm_policy.rb +141 -0
  108. data/lib/chef-cli/policyfile_services/rm_policy_group.rb +85 -0
  109. data/lib/chef-cli/policyfile_services/show_policy.rb +234 -0
  110. data/lib/chef-cli/policyfile_services/undelete.rb +108 -0
  111. data/lib/chef-cli/policyfile_services/update_attributes.rb +110 -0
  112. data/lib/chef-cli/service_exception_inspectors.rb +24 -0
  113. data/lib/chef-cli/service_exception_inspectors/base.rb +39 -0
  114. data/lib/chef-cli/service_exception_inspectors/http.rb +119 -0
  115. data/lib/chef-cli/service_exceptions.rb +142 -0
  116. data/lib/chef-cli/shell_out.rb +36 -0
  117. data/lib/chef-cli/skeletons/code_generator/files/default/Berksfile +3 -0
  118. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/README.md +146 -0
  119. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/kitchen.yml +21 -0
  120. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +8 -0
  121. data/lib/chef-cli/skeletons/code_generator/files/default/chefignore +110 -0
  122. data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -0
  123. data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -0
  124. data/lib/chef-cli/skeletons/code_generator/files/default/delivery-config.json +17 -0
  125. data/lib/chef-cli/skeletons/code_generator/files/default/delivery-project.toml +34 -0
  126. data/lib/chef-cli/skeletons/code_generator/files/default/gitignore +22 -0
  127. data/lib/chef-cli/skeletons/code_generator/files/default/repo/README.md +20 -0
  128. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -0
  129. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
  130. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +6 -0
  131. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
  132. data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -0
  133. data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
  134. data/lib/chef-cli/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -0
  135. data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/README.md +9 -0
  136. data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
  137. data/lib/chef-cli/skeletons/code_generator/files/default/repo/policyfiles/README.md +24 -0
  138. data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/README.md +9 -0
  139. data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
  140. data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper.rb +2 -0
  141. data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -0
  142. data/lib/chef-cli/skeletons/code_generator/metadata.rb +8 -0
  143. data/lib/chef-cli/skeletons/code_generator/recipes/attribute.rb +11 -0
  144. data/lib/chef-cli/skeletons/code_generator/recipes/build_cookbook.rb +175 -0
  145. data/lib/chef-cli/skeletons/code_generator/recipes/cookbook.rb +167 -0
  146. data/lib/chef-cli/skeletons/code_generator/recipes/cookbook_file.rb +23 -0
  147. data/lib/chef-cli/skeletons/code_generator/recipes/helpers.rb +19 -0
  148. data/lib/chef-cli/skeletons/code_generator/recipes/policyfile.rb +7 -0
  149. data/lib/chef-cli/skeletons/code_generator/recipes/recipe.rb +50 -0
  150. data/lib/chef-cli/skeletons/code_generator/recipes/repo.rb +71 -0
  151. data/lib/chef-cli/skeletons/code_generator/recipes/resource.rb +12 -0
  152. data/lib/chef-cli/skeletons/code_generator/recipes/template.rb +31 -0
  153. data/lib/chef-cli/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -0
  154. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -0
  155. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -0
  156. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -0
  157. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -0
  158. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -0
  159. data/lib/chef-cli/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -0
  160. data/lib/chef-cli/skeletons/code_generator/templates/default/README.md.erb +4 -0
  161. data/lib/chef-cli/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
  162. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -0
  163. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -0
  164. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +9 -0
  165. data/lib/chef-cli/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
  166. data/lib/chef-cli/skeletons/code_generator/templates/default/helpers.rb.erb +39 -0
  167. data/lib/chef-cli/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +16 -0
  168. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen.yml.erb +38 -0
  169. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_dokken.yml.erb +36 -0
  170. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +32 -0
  171. data/lib/chef-cli/skeletons/code_generator/templates/default/metadata.rb.erb +20 -0
  172. data/lib/chef-cli/skeletons/code_generator/templates/default/recipe.rb.erb +5 -0
  173. data/lib/chef-cli/skeletons/code_generator/templates/default/recipe_spec.rb.erb +29 -0
  174. data/lib/chef-cli/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -0
  175. data/lib/chef-cli/skeletons/code_generator/templates/default/resource.rb.erb +1 -0
  176. data/lib/chef-cli/skeletons/code_generator/templates/default/template.erb +0 -0
  177. data/lib/chef-cli/ui.rb +57 -0
  178. data/lib/chef-cli/version.rb +20 -0
  179. data/lib/kitchen/provisioner/policyfile_zero.rb +195 -0
  180. data/spec/shared/a_file_generator.rb +125 -0
  181. data/spec/shared/a_generated_file.rb +12 -0
  182. data/spec/shared/command_with_ui_object.rb +11 -0
  183. data/spec/shared/custom_generator_cookbook.rb +136 -0
  184. data/spec/shared/fixture_cookbook_checksums.rb +46 -0
  185. data/spec/shared/setup_git_committer_config.rb +54 -0
  186. data/spec/shared/setup_git_cookbooks.rb +53 -0
  187. data/spec/spec_helper.rb +51 -0
  188. data/spec/test_helpers.rb +84 -0
  189. data/spec/unit/chef_runner_spec.rb +139 -0
  190. data/spec/unit/chef_server_api_multi_spec.rb +120 -0
  191. data/spec/unit/cli_spec.rb +375 -0
  192. data/spec/unit/command/base_spec.rb +195 -0
  193. data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -0
  194. data/spec/unit/command/clean_policy_revisions_spec.rb +180 -0
  195. data/spec/unit/command/delete_policy_group_spec.rb +206 -0
  196. data/spec/unit/command/delete_policy_spec.rb +206 -0
  197. data/spec/unit/command/diff_spec.rb +311 -0
  198. data/spec/unit/command/env_spec.rb +86 -0
  199. data/spec/unit/command/exec_spec.rb +178 -0
  200. data/spec/unit/command/export_spec.rb +199 -0
  201. data/spec/unit/command/generate_spec.rb +142 -0
  202. data/spec/unit/command/generator_commands/attribute_spec.rb +31 -0
  203. data/spec/unit/command/generator_commands/base_spec.rb +180 -0
  204. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -0
  205. data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +77 -0
  206. data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -0
  207. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -0
  208. data/spec/unit/command/generator_commands/cookbook_spec.rb +769 -0
  209. data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -0
  210. data/spec/unit/command/generator_commands/helpers_spec.rb +31 -0
  211. data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -0
  212. data/spec/unit/command/generator_commands/recipe_spec.rb +37 -0
  213. data/spec/unit/command/generator_commands/repo_spec.rb +374 -0
  214. data/spec/unit/command/generator_commands/resource_spec.rb +31 -0
  215. data/spec/unit/command/generator_commands/template_spec.rb +31 -0
  216. data/spec/unit/command/install_spec.rb +179 -0
  217. data/spec/unit/command/push_archive_spec.rb +153 -0
  218. data/spec/unit/command/push_spec.rb +198 -0
  219. data/spec/unit/command/shell_init_spec.rb +339 -0
  220. data/spec/unit/command/show_policy_spec.rb +234 -0
  221. data/spec/unit/command/undelete_spec.rb +244 -0
  222. data/spec/unit/command/update_spec.rb +283 -0
  223. data/spec/unit/command/verify_spec.rb +341 -0
  224. data/spec/unit/commands_map_spec.rb +57 -0
  225. data/spec/unit/component_test_spec.rb +128 -0
  226. data/spec/unit/configurable_spec.rb +68 -0
  227. data/spec/unit/cookbook_metadata_spec.rb +96 -0
  228. data/spec/unit/cookbook_profiler/git_spec.rb +176 -0
  229. data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -0
  230. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -0
  231. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -0
  232. data/spec/unit/fixtures/command/cli_test_command.rb +26 -0
  233. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -0
  234. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -0
  235. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -0
  236. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
  237. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -0
  238. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
  239. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -0
  240. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
  241. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
  242. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -0
  243. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -0
  244. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -0
  245. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -0
  246. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -0
  247. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -0
  248. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -0
  249. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -0
  250. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -0
  251. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/kitchen.yml +16 -0
  252. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -0
  253. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -0
  254. data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -0
  255. data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -0
  256. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1322 -0
  257. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -0
  258. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -0
  259. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -0
  260. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -0
  261. data/spec/unit/fixtures/dev_cookbooks/bar-cookbook.gitbundle +0 -0
  262. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/bin/.keep +0 -0
  263. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/.keep +0 -0
  264. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/bin/.keep +0 -0
  265. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/bin/.keep +0 -0
  266. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/berkshelf/.keep +0 -0
  267. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/test-kitchen/.keep +0 -0
  268. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/bin/.keep +0 -0
  269. data/spec/unit/fixtures/eg_omnibus_dir/valid/bin/.keep +0 -0
  270. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -0
  271. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -0
  272. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef-dk/.keep +0 -0
  273. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -0
  274. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -0
  275. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/bin/.keep +0 -0
  276. data/spec/unit/fixtures/example_app/Policyfile.rb +0 -0
  277. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -0
  278. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -0
  279. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -0
  280. data/spec/unit/fixtures/example_cookbook/README.md +4 -0
  281. data/spec/unit/fixtures/example_cookbook/chefignore +96 -0
  282. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -0
  283. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -0
  284. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -0
  285. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -0
  286. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -0
  287. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -0
  288. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -0
  289. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -0
  290. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -0
  291. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -0
  292. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -0
  293. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -0
  294. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -0
  295. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -0
  296. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -0
  297. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -0
  298. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -0
  299. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -0
  300. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -0
  301. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -0
  302. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -0
  303. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -0
  304. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -0
  305. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -0
  306. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -0
  307. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -0
  308. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -0
  309. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -0
  310. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/extra/extra_file.txt +0 -0
  311. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -0
  312. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -0
  313. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -0
  314. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
  315. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
  316. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
  317. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
  318. data/spec/unit/generator_spec.rb +119 -0
  319. data/spec/unit/pager_spec.rb +117 -0
  320. data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -0
  321. data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -0
  322. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -0
  323. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -0
  324. data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -0
  325. data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -0
  326. data/spec/unit/policyfile/comparison_base_spec.rb +340 -0
  327. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -0
  328. data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -0
  329. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -0
  330. data/spec/unit/policyfile/differ_spec.rb +686 -0
  331. data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -0
  332. data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -0
  333. data/spec/unit/policyfile/lister_spec.rb +268 -0
  334. data/spec/unit/policyfile/local_lock_fetcher_spec.rb +199 -0
  335. data/spec/unit/policyfile/lock_applier_spec.rb +100 -0
  336. data/spec/unit/policyfile/lock_fetcher_mixin_spec.rb +60 -0
  337. data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -0
  338. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -0
  339. data/spec/unit/policyfile/remote_lock_fetcher_spec.rb +129 -0
  340. data/spec/unit/policyfile/reports/install_spec.rb +114 -0
  341. data/spec/unit/policyfile/reports/upload_spec.rb +94 -0
  342. data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -0
  343. data/spec/unit/policyfile/source_uri_spec.rb +36 -0
  344. data/spec/unit/policyfile/storage_config_spec.rb +180 -0
  345. data/spec/unit/policyfile/undo_record_spec.rb +258 -0
  346. data/spec/unit/policyfile/undo_stack_spec.rb +265 -0
  347. data/spec/unit/policyfile/uploader_spec.rb +410 -0
  348. data/spec/unit/policyfile_demands_spec.rb +1197 -0
  349. data/spec/unit/policyfile_evaluation_spec.rb +628 -0
  350. data/spec/unit/policyfile_includes_dsl_spec.rb +220 -0
  351. data/spec/unit/policyfile_includes_spec.rb +720 -0
  352. data/spec/unit/policyfile_install_with_includes_spec.rb +232 -0
  353. data/spec/unit/policyfile_lock_build_spec.rb +1065 -0
  354. data/spec/unit/policyfile_lock_install_spec.rb +137 -0
  355. data/spec/unit/policyfile_lock_serialization_spec.rb +424 -0
  356. data/spec/unit/policyfile_lock_validation_spec.rb +608 -0
  357. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -0
  358. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -0
  359. data/spec/unit/policyfile_services/export_repo_spec.rb +473 -0
  360. data/spec/unit/policyfile_services/install_spec.rb +209 -0
  361. data/spec/unit/policyfile_services/push_archive_spec.rb +359 -0
  362. data/spec/unit/policyfile_services/push_spec.rb +249 -0
  363. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -0
  364. data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -0
  365. data/spec/unit/policyfile_services/show_policy_spec.rb +887 -0
  366. data/spec/unit/policyfile_services/undelete_spec.rb +302 -0
  367. data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -0
  368. data/spec/unit/policyfile_services/update_spec.rb +162 -0
  369. data/spec/unit/service_exception_inspectors/base_spec.rb +41 -0
  370. data/spec/unit/service_exception_inspectors/http_spec.rb +138 -0
  371. data/spec/unit/shell_out_spec.rb +34 -0
  372. metadata +796 -0
@@ -0,0 +1,142 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-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 "stringio"
20
+ require "chef-cli/command/generate"
21
+
22
+ class ChefCLI::Command::GeneratorCommands::Example < ChefCLI::Command::GeneratorCommands::Base
23
+
24
+ option :one,
25
+ long: "--option-one",
26
+ description: "one"
27
+
28
+ option :two,
29
+ long: "--option-two",
30
+ description: "two"
31
+
32
+ option :arg,
33
+ short: "-a ARG",
34
+ long: "--arg ARG",
35
+ description: "an option that takes an argument"
36
+
37
+ def initialize(argv)
38
+ super # required by mixlib-cli
39
+ @argv = argv
40
+ end
41
+
42
+ def run
43
+ parse_options(@argv)
44
+ { argv: @argv, ran_cmd: "example" }
45
+ end
46
+ end
47
+
48
+ describe ChefCLI::Command::Generate do
49
+
50
+ # Use a subclass so we have a clean slate of defined generators
51
+ let(:generator_class) { Class.new(ChefCLI::Command::Generate) }
52
+
53
+ let(:stdout_io) { StringIO.new }
54
+ let(:stderr_io) { StringIO.new }
55
+
56
+ def stdout
57
+ stdout_io.string
58
+ end
59
+
60
+ def stderr
61
+ stderr_io.string
62
+ end
63
+
64
+ subject(:generate) do
65
+ g = generator_class.new
66
+ allow(g).to receive(:stdout).and_return(stdout_io)
67
+ allow(g).to receive(:stderr).and_return(stderr_io)
68
+ g
69
+ end
70
+
71
+ it "has a list of generators" do
72
+ expect(generator_class.generators).to eq([])
73
+ end
74
+
75
+ context "with a generator defined" do
76
+ let(:expected_help_message) do
77
+ <<~E
78
+ Usage: chef generate GENERATOR [options]
79
+
80
+ Available generators:
81
+ example this is a test
82
+ E
83
+ end
84
+
85
+ before do
86
+ generator_class.generator(:example, :Example, "this is a test")
87
+ end
88
+
89
+ it "includes the generator in the list" do
90
+ expect(generator_class.generators.size).to eq(1)
91
+ generator_spec = generator_class.generators.first
92
+ expect(generator_spec.name).to eq(:example)
93
+ expect(generator_spec.class_name).to eq(:Example)
94
+ expect(generator_spec.description).to eq("this is a test")
95
+ end
96
+
97
+ it "includes the generator in the help output" do
98
+ expect(generator_class.banner).to eq(expected_help_message)
99
+ end
100
+
101
+ it "prints usage when running an unknown generator" do
102
+ generate.run(%w{ancient-aliens})
103
+ expect(stdout).to include(expected_help_message)
104
+ end
105
+
106
+ it "runs the generator sub-command" do
107
+ result = generate.run(%w{example})
108
+ expect(result[:ran_cmd]).to eq("example")
109
+ end
110
+
111
+ it "removes the subcommand name from argv" do
112
+ result = generate.run(%w{example})
113
+ expect(result[:argv]).to eq([])
114
+ end
115
+
116
+ it "passes extra arguments and options to the subcommand" do
117
+ result = generate.run(%w{example argument_one argument_two --option-one --option-two})
118
+ expect(result[:argv]).to eq(%w{argument_one argument_two --option-one --option-two})
119
+ end
120
+
121
+ describe "when an invalid option is passed to the subcommand" do
122
+
123
+ it "prints usage and returns non-zero" do
124
+ result = generate.run(%w{example --nope})
125
+ expect(result).to eq(1)
126
+ expect(stderr).to eq("ERROR: invalid option: --nope\n\n")
127
+ end
128
+
129
+ end
130
+
131
+ describe "when an option requires an argument but none is given" do
132
+
133
+ it "prints usage and returns non-zero" do
134
+ result = generate.run(%w{example --arg})
135
+ expect(result).to eq(1)
136
+ expect(stderr).to eq("ERROR: missing argument: --arg\n\n")
137
+ end
138
+
139
+ end
140
+
141
+ end
142
+ end
@@ -0,0 +1,31 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-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 "shared/a_file_generator"
20
+ require "chef-cli/command/generator_commands/attribute"
21
+
22
+ describe ChefCLI::Command::GeneratorCommands::Attribute do
23
+
24
+ include_examples "a file generator" do
25
+
26
+ let(:generator_name) { "attribute" }
27
+ let(:generated_files) { [ "attributes/new_attribute_file.rb" ] }
28
+ let(:new_file_name) { "new_attribute_file" }
29
+
30
+ end
31
+ end
@@ -0,0 +1,180 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-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 "chef-cli/command/generator_commands/base"
20
+
21
+ describe ChefCLI::Command::GeneratorCommands::Base do
22
+ describe "parsing Chef configuration" do
23
+ let(:cli_args) do
24
+ [
25
+ "-C", "Business Man",
26
+ "-I", "Serious Business",
27
+ "-m", "business.man@corporation.com"
28
+ ]
29
+ end
30
+
31
+ before do
32
+ Chef::Config.reset
33
+ end
34
+
35
+ context "when generator configuration is defined" do
36
+ before do
37
+ Chef::Config.reset
38
+ Chef::Config.chefcli.generator.copyright_holder = "This Guy"
39
+ Chef::Config.chefcli.generator.email = "this.guy@twothumbs.net"
40
+ Chef::Config.chefcli.generator.license = "Two Thumbs License"
41
+ end
42
+
43
+ it "uses the defined values" do
44
+ cmd = ChefCLI::Command::GeneratorCommands::Base.new([])
45
+ cmd.parse_options
46
+ cmd.setup_context
47
+ cfg = cmd.config
48
+ expect(cfg[:copyright_holder]).to eq("This Guy")
49
+ expect(cfg[:email]).to eq("this.guy@twothumbs.net")
50
+ expect(cfg[:license]).to eq("Two Thumbs License")
51
+ end
52
+
53
+ context "when cli overrides are provided" do
54
+ before do
55
+ Chef::Config.reset
56
+ Chef::Config.chefcli.generator.copyright_holder = "This Guy"
57
+ Chef::Config.chefcli.generator.email = "this.guy@twothumbs.net"
58
+ Chef::Config.chefcli.generator.license = "Two Thumbs License"
59
+ end
60
+
61
+ it "uses the cli args" do
62
+ cmd = ChefCLI::Command::GeneratorCommands::Base.new(cli_args)
63
+ cmd.parse_options(cli_args)
64
+ cmd.setup_context
65
+ cfg = cmd.config
66
+ expect(cfg[:copyright_holder]).to eq("Business Man")
67
+ expect(cfg[:email]).to eq("business.man@corporation.com")
68
+ expect(cfg[:license]).to eq("Serious Business")
69
+ end
70
+ end
71
+
72
+ context "when knife configuration is also defined" do
73
+
74
+ before do
75
+ Chef::Config.reset
76
+ Chef::Config.chefcli.generator.copyright_holder = "This Guy"
77
+ Chef::Config.chefcli.generator.email = "this.guy@twothumbs.net"
78
+ Chef::Config.chefcli.generator.license = "Two Thumbs License"
79
+ Chef::Config.knife.cookbook_copyright = "Knife User"
80
+ Chef::Config.knife.cookbook_email = "knife.user@example.com"
81
+ Chef::Config.knife.cookbook_license = "GPLv9000"
82
+ end
83
+
84
+ it "uses the generator configuration" do
85
+ cmd = ChefCLI::Command::GeneratorCommands::Base.new([])
86
+ cmd.parse_options
87
+ cmd.setup_context
88
+ cfg = cmd.config
89
+ expect(cfg[:copyright_holder]).to eq("This Guy")
90
+ expect(cfg[:email]).to eq("this.guy@twothumbs.net")
91
+ expect(cfg[:license]).to eq("Two Thumbs License")
92
+ end
93
+ end
94
+ end
95
+
96
+ context "when knife configuration is defined" do
97
+ before do
98
+ Chef::Config.reset
99
+ Chef::Config.knife.cookbook_copyright = "Knife User"
100
+ Chef::Config.knife.cookbook_email = "knife.user@example.com"
101
+ Chef::Config.knife.cookbook_license = "GPLv9000"
102
+ end
103
+
104
+ it "uses the defined values" do
105
+ cmd = ChefCLI::Command::GeneratorCommands::Base.new([])
106
+ cmd.parse_options
107
+ cmd.setup_context
108
+ cfg = cmd.config
109
+ expect(cfg[:copyright_holder]).to eq("Knife User")
110
+ expect(cfg[:email]).to eq("knife.user@example.com")
111
+ expect(cfg[:license]).to eq("GPLv9000")
112
+ end
113
+
114
+ context "when cli overrides are provided" do
115
+
116
+ before do
117
+ Chef::Config.reset
118
+ Chef::Config.knife.cookbook_copyright = "Knife User"
119
+ Chef::Config.knife.cookbook_email = "knife.user@example.com"
120
+ Chef::Config.knife.cookbook_license = "GPLv9000"
121
+ end
122
+
123
+ it "uses the cli args" do
124
+ cmd = ChefCLI::Command::GeneratorCommands::Base.new(cli_args)
125
+ cmd.parse_options(cli_args)
126
+ cmd.setup_context
127
+ cfg = cmd.config
128
+ expect(cfg[:copyright_holder]).to eq("Business Man")
129
+ expect(cfg[:email]).to eq("business.man@corporation.com")
130
+ expect(cfg[:license]).to eq("Serious Business")
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ describe "#have_git?" do
137
+ let(:cmd) { described_class.new([]) }
138
+ let(:path) { "bin_path" }
139
+
140
+ before do
141
+ allow(File).to receive(:exist?)
142
+ allow(ENV).to receive(:[]).with("PATH").and_return(path)
143
+ allow(ENV).to receive(:[]).with("PATHEXT").and_return(nil)
144
+ allow(RbConfig::CONFIG).to receive(:[]).with("EXEEXT").and_return("")
145
+ end
146
+
147
+ describe "when git executable exists" do
148
+ it "returns true" do
149
+ allow(File).to receive(:exist?).and_return(true)
150
+ expect(cmd.have_git?).to eq(true)
151
+ end
152
+ end
153
+
154
+ describe "when git executable does not exist" do
155
+ it "returns false" do
156
+ allow(File).to receive(:exist?).and_return(false)
157
+ expect(cmd.have_git?).to eq(false)
158
+ end
159
+ end
160
+
161
+ it "checks PATH for git executable" do
162
+ expect(File).to receive(:exist?).with(File.join(path, "git"))
163
+ cmd.have_git?
164
+ end
165
+
166
+ describe "when on Windows" do
167
+ before do
168
+ allow(ENV).to receive(:[]).with("PATHEXT").and_return(".com;.exe;.bat")
169
+ allow(RbConfig::CONFIG).to receive(:[]).with("EXEEXT").and_return(".exe")
170
+ end
171
+
172
+ it "checks PATH for git executable with an extension found in PATHEXT" do
173
+ expect(File).to receive(:exist?).with(File.join(path, "git.com"))
174
+ expect(File).to receive(:exist?).with(File.join(path, "git.exe"))
175
+ expect(File).to receive(:exist?).with(File.join(path, "git.bat"))
176
+ cmd.have_git?
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,377 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-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 "shared/custom_generator_cookbook"
20
+ require "shared/setup_git_committer_config"
21
+ require "chef-cli/command/generator_commands/build_cookbook"
22
+ require "mixlib/shellout"
23
+
24
+ describe ChefCLI::Command::GeneratorCommands::BuildCookbook do
25
+
26
+ include_context("setup_git_committer_config")
27
+
28
+ let(:argv) { %w{workflow_project} }
29
+
30
+ let(:stdout_io) { StringIO.new }
31
+ let(:stderr_io) { StringIO.new }
32
+
33
+ let(:expected_cookbook_file_relpaths) do
34
+ %w{
35
+ kitchen.yml
36
+ data_bags
37
+ data_bags/keys
38
+ data_bags/keys/delivery_builder_keys.json
39
+ test
40
+ test/fixtures
41
+ test/fixtures/cookbooks
42
+ test/fixtures/cookbooks/test
43
+ test/fixtures/cookbooks/test/metadata.rb
44
+ test/fixtures/cookbooks/test/recipes
45
+ test/fixtures/cookbooks/test/recipes/default.rb
46
+ Berksfile
47
+ chefignore
48
+ metadata.rb
49
+ README.md
50
+ LICENSE
51
+ recipes
52
+ recipes/default.rb
53
+ recipes/deploy.rb
54
+ recipes/functional.rb
55
+ recipes/lint.rb
56
+ recipes/provision.rb
57
+ recipes/publish.rb
58
+ recipes/quality.rb
59
+ recipes/security.rb
60
+ recipes/smoke.rb
61
+ recipes/syntax.rb
62
+ recipes/unit.rb
63
+ secrets
64
+ secrets/fakey-mcfakerton
65
+ }
66
+ end
67
+
68
+ let(:expected_cookbook_files) do
69
+ expected_cookbook_file_relpaths.map do |relpath|
70
+ File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", relpath)
71
+ end
72
+ end
73
+
74
+ subject(:cookbook_generator) do
75
+ described_class.new(argv)
76
+ end
77
+
78
+ def generator_context
79
+ ChefCLI::Generator.context
80
+ end
81
+
82
+ before do
83
+ ChefCLI::Generator.reset
84
+ end
85
+
86
+ it "configures the chef runner" do
87
+ expect(cookbook_generator.chef_runner).to be_a(ChefCLI::ChefRunner)
88
+ expect(cookbook_generator.chef_runner.cookbook_path).to eq(File.expand_path("lib/chef-cli/skeletons", project_root))
89
+ end
90
+
91
+ context "when given invalid/incomplete arguments" do
92
+
93
+ let(:expected_help_message) do
94
+ "Usage: chef generate build-cookbook NAME [options]\n"
95
+ end
96
+
97
+ def with_argv(argv)
98
+ generator = described_class.new(argv)
99
+ allow(generator).to receive(:stdout).and_return(stdout_io)
100
+ allow(generator).to receive(:stderr).and_return(stderr_io)
101
+ generator
102
+ end
103
+
104
+ it "prints usage when args are empty" do
105
+ with_argv([]).run
106
+ expect(stderr_io.string).to include(expected_help_message)
107
+ end
108
+
109
+ end
110
+
111
+ context "when given the name of the delivery project" do
112
+
113
+ let(:argv) { %w{workflow_project} }
114
+
115
+ let(:project_dir) { File.join(tempdir, "workflow_project") }
116
+
117
+ before do
118
+ reset_tempdir
119
+ Dir.mkdir(project_dir)
120
+ end
121
+
122
+ it "configures the generator context" do
123
+ cookbook_generator.read_and_validate_params
124
+ cookbook_generator.setup_context
125
+ expect(generator_context.workflow_project_dir).to eq(File.join(Dir.pwd, "workflow_project"))
126
+ end
127
+
128
+ it "creates a build cookbook" do
129
+ Dir.chdir(tempdir) do
130
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
131
+ expect(cookbook_generator.run).to eq(0)
132
+ end
133
+ generated_files = Dir.glob("#{tempdir}/workflow_project/**/*", File::FNM_DOTMATCH)
134
+ expected_cookbook_files.each do |expected_file|
135
+ expect(generated_files).to include(expected_file)
136
+ end
137
+ end
138
+
139
+ shared_examples_for "a generated file" do |context_var|
140
+ before do
141
+ Dir.chdir(tempdir) do
142
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
143
+ expect(cookbook_generator.run).to eq(0)
144
+ end
145
+ end
146
+
147
+ it "should contain #{context_var} from the generator context" do
148
+ expect(File.read(file)).to include(line)
149
+ end
150
+ end
151
+
152
+ # This shared example group requires a let binding for
153
+ # `expected_kitchen_yml_content`
154
+ shared_examples_for "kitchen_yml_and_integration_tests" do
155
+
156
+ describe "Generating Test Kitchen and integration testing files" do
157
+
158
+ before do
159
+ Dir.chdir(tempdir) do
160
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
161
+ expect(cookbook_generator.run).to eq(0)
162
+ end
163
+ end
164
+
165
+ let(:file) { File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", "kitchen.yml") }
166
+
167
+ it "creates a kitchen.yml with the expected content" do
168
+ expect(IO.read(file)).to eq(expected_kitchen_yml_content)
169
+ end
170
+
171
+ end
172
+ end
173
+
174
+ context "when the delivery project is a cookbook" do
175
+
176
+ let(:parent_metadata_rb) { File.join(tempdir, "workflow_project", "metadata.rb") }
177
+
178
+ before do
179
+ FileUtils.touch(parent_metadata_rb)
180
+ end
181
+
182
+ it "detects that the parent project is a cookbook" do
183
+ Dir.chdir(tempdir) do
184
+ cookbook_generator.read_and_validate_params
185
+ cookbook_generator.setup_context
186
+ expect(generator_context.build_cookbook_parent_is_cookbook).to eq(true)
187
+ end
188
+ end
189
+
190
+ describe "metadata.rb" do
191
+ let(:file) { File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", "metadata.rb") }
192
+
193
+ include_examples "a generated file", :cookbook_name do
194
+ let(:line) do
195
+ <<~METADATA
196
+ name 'build_cookbook'
197
+ maintainer 'The Authors'
198
+ maintainer_email 'you@example.com'
199
+ license 'all_rights'
200
+ version '0.1.0'
201
+ chef_version '>= 14.0'
202
+
203
+ depends 'delivery-truck'
204
+ METADATA
205
+ end
206
+ end
207
+ end
208
+
209
+ describe "delivery phase recipes" do
210
+
211
+ before do
212
+ Dir.chdir(tempdir) do
213
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
214
+ expect(cookbook_generator.run).to eq(0)
215
+ end
216
+ end
217
+
218
+ it "generates phase recipes which include the corresponding delivery truck recipe" do
219
+ %w{
220
+ deploy.rb
221
+ functional.rb
222
+ lint.rb
223
+ provision.rb
224
+ publish.rb
225
+ quality.rb
226
+ security.rb
227
+ smoke.rb
228
+ syntax.rb
229
+ unit.rb
230
+ }.each do |phase_recipe|
231
+ recipe_file = File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", "recipes", phase_recipe)
232
+ phase = File.basename(phase_recipe, ".rb")
233
+ expected_content = %Q{include_recipe 'delivery-truck::#{phase}'}
234
+ expect(IO.read(recipe_file)).to include(expected_content)
235
+ end
236
+ end
237
+
238
+ end
239
+
240
+ end
241
+
242
+ context "when the delivery project is not a cookbook" do
243
+
244
+ it "detects that the parent project is not a cookbook" do
245
+ cookbook_generator.read_and_validate_params
246
+ cookbook_generator.setup_context
247
+ expect(generator_context.build_cookbook_parent_is_cookbook).to eq(false)
248
+ end
249
+
250
+ describe "metadata.rb" do
251
+ let(:file) { File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", "metadata.rb") }
252
+
253
+ include_examples "a generated file", :cookbook_name do
254
+ let(:line) do
255
+ <<~METADATA
256
+ name 'build_cookbook'
257
+ maintainer 'The Authors'
258
+ maintainer_email 'you@example.com'
259
+ license 'all_rights'
260
+ version '0.1.0'
261
+ METADATA
262
+ end
263
+ end
264
+ end
265
+
266
+ describe "delivery phase recipes" do
267
+
268
+ before do
269
+ Dir.chdir(tempdir) do
270
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
271
+ expect(cookbook_generator.run).to eq(0)
272
+ end
273
+ end
274
+
275
+ it "generates phase recipes that are empty" do
276
+ %w{
277
+ deploy.rb
278
+ functional.rb
279
+ lint.rb
280
+ provision.rb
281
+ publish.rb
282
+ quality.rb
283
+ security.rb
284
+ smoke.rb
285
+ syntax.rb
286
+ unit.rb
287
+ }.each do |phase_recipe|
288
+ recipe_file = File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", "recipes", phase_recipe)
289
+ expect(IO.read(recipe_file)).to_not include("include_recipe")
290
+ end
291
+ end
292
+
293
+ end
294
+
295
+ end
296
+
297
+ context "when the delivery project is a git repo" do
298
+
299
+ let(:readme) { File.join(project_dir, "README.md") }
300
+
301
+ def git!(cmd)
302
+ Mixlib::ShellOut.new("git #{cmd}", cwd: project_dir).tap do |c|
303
+ c.run_command
304
+ c.error!
305
+ end
306
+ end
307
+
308
+ before do
309
+ FileUtils.touch(readme)
310
+
311
+ git!("init .")
312
+ git!("add .")
313
+ git!("commit --no-gpg-sign -m \"initial commit\"")
314
+
315
+ Dir.chdir(tempdir) do
316
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
317
+ expect(cookbook_generator.run).to eq(0)
318
+ end
319
+ end
320
+
321
+ it "creates delivery config in a feature branch and merges it" do
322
+ expect(git!("log").stdout).to include("Merge branch 'add-delivery-configuration'")
323
+ end
324
+
325
+ end
326
+
327
+ context "when the delivery project has already a config.json and project.toml" do
328
+
329
+ let(:dot_delivery) { File.join(project_dir, ".delivery") }
330
+ let(:config_json) { File.join(dot_delivery, "config.json") }
331
+ let(:project_toml) { File.join(dot_delivery, "project.toml") }
332
+
333
+ def git!(cmd)
334
+ Mixlib::ShellOut.new("git #{cmd}", cwd: project_dir).tap do |c|
335
+ c.run_command
336
+ c.error!
337
+ end
338
+ end
339
+
340
+ before do
341
+ FileUtils.mkdir_p(dot_delivery)
342
+ FileUtils.touch(config_json)
343
+ FileUtils.touch(project_toml)
344
+
345
+ git!("init .")
346
+ git!("add .")
347
+ git!("commit --no-gpg-sign -m \"initial commit\"")
348
+
349
+ Dir.chdir(tempdir) do
350
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
351
+ expect(cookbook_generator.run).to eq(0)
352
+ end
353
+ end
354
+
355
+ it "does not overwrite the delivery config" do
356
+ expect(git!("log").stdout).to_not include("Add generated delivery configuration")
357
+ end
358
+
359
+ end
360
+ end
361
+
362
+ context "when given a path including the .delivery directory" do
363
+ let(:argv) { [ File.join(tempdir, "workflow_project", ".delivery", "build_cookbook") ] }
364
+
365
+ before do
366
+ reset_tempdir
367
+ end
368
+
369
+ it "correctly sets the delivery project dir to the parent of the .delivery dir" do
370
+ cookbook_generator.read_and_validate_params
371
+ cookbook_generator.setup_context
372
+ expect(generator_context.workflow_project_dir).to eq(File.join(tempdir, "workflow_project"))
373
+ end
374
+
375
+ end
376
+
377
+ end