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,77 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2016 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
+
21
+ require "chef/run_context"
22
+ require "chef/cookbook/cookbook_collection"
23
+ require "chef/node"
24
+ require "chef/event_dispatch/dispatcher"
25
+ require "chef/formatters/base"
26
+
27
+ require "ohai/system"
28
+
29
+ require "chef-cli/command/generator_commands/chef_exts/generator_desc_resource"
30
+
31
+ describe ChefCLI::ChefResource::GeneratorDesc do
32
+
33
+ let(:node) { Chef::Node.new }
34
+
35
+ let(:stdout) { StringIO.new }
36
+
37
+ let(:stderr) { StringIO.new }
38
+
39
+ let(:null_formatter) { Chef::Formatters.new(:null, stdout, stderr) }
40
+
41
+ let(:events) do
42
+ Chef::EventDispatch::Dispatcher.new.tap do |d|
43
+ d.register(null_formatter)
44
+ end
45
+ end
46
+
47
+ let(:cookbook_collection) { Chef::CookbookCollection.new }
48
+
49
+ let(:run_context) { Chef::RunContext.new(node, cookbook_collection, events) }
50
+
51
+ let(:message) { "this part of the cookbook does a thing" }
52
+
53
+ let(:resource) { described_class.new(message, run_context) }
54
+
55
+ let(:provider) { resource.provider_for_action(:write) }
56
+
57
+ describe "resource" do
58
+
59
+ it "has the message it was created with" do
60
+ expect(resource.message).to eq(message)
61
+ end
62
+
63
+ it "defaults to action :write" do
64
+ expect(resource.action).to eq( [ :write ] )
65
+ end
66
+
67
+ it "is identified by the message property" do
68
+ expect(resource.identity).to eq(message)
69
+ end
70
+
71
+ it "writes the message to the formatter" do
72
+ provider.action_write
73
+ expect(stdout.string).to include(message)
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,111 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2016 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
+
21
+ require "chef/config"
22
+ require "chef/recipe"
23
+ require "chef/run_context"
24
+ require "chef/event_dispatch/dispatcher"
25
+ require "chef/policy_builder"
26
+ require "chef/formatters/doc"
27
+ require "chef/cookbook/file_vendor"
28
+ require "chef/cookbook/file_system_file_vendor"
29
+ require "chef/cookbook/cookbook_collection"
30
+ require "chef/cookbook_loader"
31
+
32
+ require "ohai/system"
33
+
34
+ require "chef-cli/command/generator_commands/chef_exts/recipe_dsl_ext"
35
+ require "chef-cli/command/generator_commands/chef_exts/quieter_doc_formatter"
36
+
37
+ describe ChefCLI::RecipeDSLExt do
38
+
39
+ before(:all) { Chef.reset! }
40
+
41
+ let(:stdout) { StringIO.new }
42
+
43
+ let(:stderr) { StringIO.new }
44
+
45
+ let(:doc_formatter) do
46
+ Chef::Formatters.new(:chefcli_doc, stdout, stderr)
47
+ end
48
+
49
+ let(:event_dispatcher) do
50
+ Chef::EventDispatch::Dispatcher.new.tap do |d|
51
+ d.register(doc_formatter)
52
+ end
53
+ end
54
+
55
+ let(:run_list) { [ ] }
56
+
57
+ let(:ohai) do
58
+ Ohai::System.new.tap do |o|
59
+ o.all_plugins(%w{platform platform_version})
60
+ end
61
+ end
62
+
63
+ let(:policy_builder) do
64
+ Chef::PolicyBuilder::Dynamic.new("chef-cli", ohai.data, {}, nil, event_dispatcher).tap do |b|
65
+ b.load_node
66
+ b.build_node
67
+ b.node.run_list(*run_list)
68
+ b.expand_run_list
69
+ end
70
+ end
71
+
72
+ # In some circumstances (not totally clear about what), compat resource gets
73
+ # loaded and it does some weird stuff to `Chef::Recipe.new` which can fail if
74
+ # you pass in a cookbook name that is bogus and not-falsey. Using `nil` for
75
+ # the cookbook name works around that.
76
+ # https://github.com/chef-cookbooks/compat_resource/blob/3d948a5a9cabccddc7cf5e48dfea796a6b557a44/files/lib/chef_compat/monkeypatches/chef/recipe.rb#L8-L15
77
+ let(:cookbook_name) { nil }
78
+
79
+ let(:recipe_name) { "example" }
80
+
81
+ let(:run_context) { policy_builder.setup_run_context }
82
+
83
+ let(:recipe) { Chef::Recipe.new(cookbook_name, recipe_name, run_context) }
84
+
85
+ before do
86
+ Chef::Config.solo_legacy_mode = true
87
+ Chef::Config.color = true
88
+ Chef::Config.diff_disabled = true
89
+ Chef::Config.use_policyfile = false
90
+ end
91
+
92
+ describe "silence_chef_formatter" do
93
+
94
+ before do
95
+ recipe.silence_chef_formatter
96
+ end
97
+
98
+ let(:formatter) { run_context.events.subscribers.first }
99
+
100
+ it "replaces the default formatter with a null formatter" do
101
+ expect(formatter).to be_a(Chef::Formatters::NullFormatter)
102
+ end
103
+
104
+ it "passes stdout and stderr from the default formatter to the new one" do
105
+ expect(formatter.output.out).to be(stdout)
106
+ expect(formatter.output.err).to be(stderr)
107
+ end
108
+
109
+ end
110
+
111
+ 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/cookbook_file"
21
+
22
+ describe ChefCLI::Command::GeneratorCommands::CookbookFile do
23
+
24
+ include_examples "a file generator" do
25
+
26
+ let(:generator_name) { "file" }
27
+ let(:generated_files) { [ "files/new_file.txt" ] }
28
+ let(:new_file_name) { "new_file.txt" }
29
+
30
+ end
31
+ end
@@ -0,0 +1,769 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-2019 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/cookbook"
22
+
23
+ describe ChefCLI::Command::GeneratorCommands::Cookbook do
24
+
25
+ include_context("setup_git_committer_config")
26
+
27
+ let(:argv) { %w{new_cookbook} }
28
+
29
+ let(:stdout_io) { StringIO.new }
30
+ let(:stderr_io) { StringIO.new }
31
+
32
+ let(:expected_cookbook_file_relpaths) do
33
+ %w{
34
+ .gitignore
35
+ kitchen.yml
36
+ test
37
+ test/integration
38
+ test/integration/default/default_test.rb
39
+ Policyfile.rb
40
+ chefignore
41
+ LICENSE
42
+ metadata.rb
43
+ README.md
44
+ CHANGELOG.md
45
+ recipes
46
+ recipes/default.rb
47
+ spec
48
+ spec/spec_helper.rb
49
+ spec/unit
50
+ spec/unit/recipes
51
+ spec/unit/recipes/default_spec.rb
52
+ }
53
+ end
54
+
55
+ let(:expected_cookbook_files) do
56
+ expected_cookbook_file_relpaths.map do |relpath|
57
+ File.join(tempdir, "new_cookbook", relpath)
58
+ end
59
+ end
60
+
61
+ let(:non_delivery_breadcrumb) do
62
+ <<~EOF
63
+ Your cookbook is ready. Type `cd new_cookbook` to enter it.
64
+
65
+ There are several commands you can run to get started locally developing and testing your cookbook.
66
+ Type `delivery local --help` to see a full list of local testing commands.
67
+
68
+ Why not start by writing an InSpec test? Tests for the default recipe are stored at:
69
+
70
+ test/integration/default/default_test.rb
71
+
72
+ If you'd prefer to dive right in, the default recipe can be found at:
73
+
74
+ recipes/default.rb
75
+ EOF
76
+ end
77
+
78
+ subject(:cookbook_generator) do
79
+ g = described_class.new(argv)
80
+ allow(g).to receive(:cookbook_path_in_git_repo?).and_return(false)
81
+ allow(g).to receive(:stdout).and_return(stdout_io)
82
+ g
83
+ end
84
+
85
+ def generator_context
86
+ ChefCLI::Generator.context
87
+ end
88
+
89
+ before do
90
+ ChefCLI::Generator.reset
91
+ end
92
+
93
+ include_examples "custom generator cookbook" do
94
+
95
+ let(:generator_arg) { "new_cookbook" }
96
+
97
+ let(:generator_name) { "cookbook" }
98
+
99
+ end
100
+
101
+ it "configures the chef runner" do
102
+ expect(cookbook_generator.chef_runner).to be_a(ChefCLI::ChefRunner)
103
+ expect(cookbook_generator.chef_runner.cookbook_path).to eq(File.expand_path("lib/chef-cli/skeletons", project_root))
104
+ end
105
+
106
+ context "when given invalid/incomplete arguments" do
107
+
108
+ let(:expected_help_message) do
109
+ "Usage: chef generate cookbook NAME [options]\n"
110
+ end
111
+
112
+ def with_argv(argv)
113
+ generator = described_class.new(argv)
114
+ allow(generator).to receive(:stdout).and_return(stdout_io)
115
+ allow(generator).to receive(:stderr).and_return(stderr_io)
116
+ generator
117
+ end
118
+
119
+ it "prints usage when args are empty" do
120
+ with_argv([]).run
121
+ expect(stderr_io.string).to include(expected_help_message)
122
+ end
123
+
124
+ it "errors if both berks and policyfiles are requested" do
125
+ expect(with_argv(%w{my_cookbook --berks --policy}).run).to eq(1)
126
+ message = "Berkshelf and Policyfiles are mutually exclusive. Please specify only one."
127
+ expect(stderr_io.string).to include(message)
128
+ end
129
+
130
+ it "warns if a hyphenated cookbook name is passed" do
131
+ expect(with_argv(%w{my-cookbook}).run).to eq(0)
132
+ message = "Hyphens are discouraged in cookbook names as they may cause problems with custom resources. See https://docs.chef.io/ctl_chef.html#chef-generate-cookbook for more information."
133
+ expect(stdout_io.string).to include(message)
134
+ end
135
+
136
+ end
137
+
138
+ context "when given the name of the cookbook to generate" do
139
+
140
+ let(:argv) { %w{new_cookbook} }
141
+
142
+ before do
143
+ reset_tempdir
144
+ end
145
+
146
+ it "configures the generator context" do
147
+ cookbook_generator.read_and_validate_params
148
+ cookbook_generator.setup_context
149
+ expect(generator_context.cookbook_root).to eq(Dir.pwd)
150
+ expect(generator_context.cookbook_name).to eq("new_cookbook")
151
+ expect(generator_context.recipe_name).to eq("default")
152
+ expect(generator_context.verbose).to be(false)
153
+ end
154
+
155
+ it "creates a new cookbook" do
156
+ Dir.chdir(tempdir) do
157
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
158
+ expect(cookbook_generator.run).to eq(0)
159
+ end
160
+ generated_files = Dir.glob("#{tempdir}/new_cookbook/**/*", File::FNM_DOTMATCH)
161
+ expected_cookbook_files.each do |expected_file|
162
+ expect(generated_files).to include(expected_file)
163
+ end
164
+ end
165
+
166
+ context "when passed workflow option" do
167
+
168
+ context "generates a workflow (delivery) cookbook" do
169
+
170
+ let(:argv) { %w{new_cookbook --workflow} }
171
+
172
+ let(:dot_delivery) { File.join(tempdir, "new_cookbook", ".delivery") }
173
+
174
+ before do
175
+ Dir.chdir(tempdir) do
176
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
177
+ expect(cookbook_generator.run).to eq(0)
178
+ end
179
+ end
180
+
181
+ describe ".delivery/project.toml" do
182
+
183
+ let(:file) { File.join(tempdir, "new_cookbook", ".delivery", "project.toml") }
184
+
185
+ let(:expected_content) do
186
+ <<~PROJECT_DOT_TOML
187
+ # Delivery for Local Phases Execution
188
+ #
189
+ # This file allows you to execute test phases locally on a workstation or
190
+ # in a CI pipeline. The delivery-cli will read this file and execute the
191
+ # command(s) that are configured for each phase. You can customize them
192
+ # by just modifying the phase key on this file.
193
+ #
194
+ # By default these phases are configured for Cookbook Workflow only
195
+ #
196
+
197
+ [local_phases]
198
+ unit = "chef exec rspec spec/"
199
+ lint = "chef exec cookstyle"
200
+ # Foodcritic includes rules only appropriate for community cookbooks
201
+ # uploaded to Supermarket. We turn off any rules tagged "supermarket"
202
+ # by default. If you plan to share this cookbook you should remove
203
+ # '-t ~supermarket' below to enable supermarket rules.
204
+ syntax = "chef exec foodcritic . -t ~supermarket"
205
+ provision = "chef exec kitchen create"
206
+ deploy = "chef exec kitchen converge"
207
+ smoke = "chef exec kitchen verify"
208
+ # The functional phase is optional, you can define it by uncommenting
209
+ # the line below and running the command: `delivery local functional`
210
+ # functional = ""
211
+ cleanup = "chef exec kitchen destroy"
212
+
213
+ # Remote project.toml file
214
+ #
215
+ # Instead of the local phases above, you may specify a remote URI location for
216
+ # the `project.toml` file. This is useful for teams that wish to centrally
217
+ # manage the behavior of the `delivery local` command across many different
218
+ # projects.
219
+ #
220
+ # remote_file = "https://url/project.toml"
221
+ PROJECT_DOT_TOML
222
+ end
223
+
224
+ it "exists with default config for Cookbook Workflow" do
225
+ expect(IO.read(file)).to eq(expected_content)
226
+ end
227
+
228
+ end
229
+
230
+ describe ".delivery/config.json" do
231
+
232
+ let(:file) { File.join(tempdir, "new_cookbook", ".delivery", "config.json") }
233
+
234
+ let(:expected_content) do
235
+ <<~CONFIG_DOT_JSON
236
+ {
237
+ "version": "2",
238
+ "build_cookbook": {
239
+ "name": "build_cookbook",
240
+ "path": ".delivery/build_cookbook"
241
+ },
242
+ "delivery-truck": {
243
+ "lint": {
244
+ "enable_cookstyle": true
245
+ }
246
+ },
247
+ "skip_phases": [],
248
+ "job_dispatch": {
249
+ "version": "v2"
250
+ },
251
+ "dependencies": []
252
+ }
253
+ CONFIG_DOT_JSON
254
+ end
255
+
256
+ it "configures delivery to use a local build cookbook" do
257
+ expect(IO.read(file)).to eq(expected_content)
258
+ end
259
+
260
+ end
261
+
262
+ describe "build cookbook recipes" do
263
+
264
+ let(:file) do
265
+ File.join(dot_delivery, "build_cookbook", "recipes", "publish.rb")
266
+ end
267
+
268
+ let(:expected_content) do
269
+ <<~CONFIG_DOT_JSON
270
+ #
271
+ # Cookbook:: build_cookbook
272
+ # Recipe:: publish
273
+ #
274
+ # Copyright:: 2019, The Authors, All Rights Reserved.
275
+
276
+ include_recipe 'delivery-truck::publish'
277
+ CONFIG_DOT_JSON
278
+ end
279
+
280
+ it "delegates functionality to delivery-truck" do
281
+ expect(IO.read(file)).to include(expected_content)
282
+ end
283
+
284
+ end
285
+
286
+ describe "build cookbook Berksfile" do
287
+
288
+ let(:file) do
289
+ File.join(dot_delivery, "build_cookbook", "Berksfile")
290
+ end
291
+
292
+ let(:expected_content) do
293
+ <<~CONFIG_DOT_JSON
294
+ source 'https://supermarket.chef.io'
295
+
296
+ metadata
297
+
298
+ group :workflow do
299
+ cookbook 'test', path: './test/fixtures/cookbooks/test'
300
+ end
301
+ CONFIG_DOT_JSON
302
+ end
303
+
304
+ it "sets the sources for delivery library cookbooks to github" do
305
+ expect(IO.read(file)).to include(expected_content)
306
+ end
307
+
308
+ end
309
+ end
310
+
311
+ context "when no delivery CLI configuration is present" do
312
+
313
+ let(:argv) { %w{new_cookbook --workflow} }
314
+
315
+ it "detects no delivery config" do
316
+ Dir.chdir(tempdir) do
317
+ expect(cookbook_generator.have_delivery_config?).to be(false)
318
+ end
319
+ end
320
+
321
+ it "emits concise output" do
322
+ Dir.chdir(tempdir) do
323
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
324
+ expect(cookbook_generator.run).to eq(0)
325
+ end
326
+
327
+ expected = <<~OUTPUT
328
+ Generating cookbook new_cookbook
329
+ - Ensuring correct cookbook content
330
+ - Committing cookbook files to git
331
+ - Ensuring delivery CLI configuration
332
+ - Ensuring correct Workflow (Delivery) build cookbook content
333
+ - Adding delivery configuration to feature branch
334
+ - Adding build cookbook to feature branch
335
+ - Merging delivery content feature branch to master
336
+
337
+ #{non_delivery_breadcrumb}
338
+ OUTPUT
339
+
340
+ actual = stdout_io.string
341
+
342
+ # the formatter will add escape sequences to turn off any colors
343
+ actual.gsub!("\e[0m", "")
344
+ expect(actual).to eq(expected)
345
+ end
346
+ end
347
+
348
+ context "when a delivery CLI config is present" do
349
+
350
+ # Setup a situation like this:
351
+ # there is a dir for the delivery organization with the
352
+ # `.delivery/cli.toml` in it. Inside that is another dir (maybe IRL this
353
+ # would be "cookbooks"), then we create the cookbook inside that.
354
+
355
+ let(:argv) { %w{new_cookbook --workflow} }
356
+
357
+ let(:tempdir_subdir) { File.join(tempdir, "subdirectory") }
358
+
359
+ let(:dot_delivery_dir) { File.join(tempdir, ".delivery") }
360
+
361
+ let(:dot_delivery_cli_toml) { File.join(dot_delivery_dir, "cli.toml") }
362
+
363
+ before do
364
+ Dir.mkdir(tempdir_subdir)
365
+ Dir.mkdir(dot_delivery_dir)
366
+ FileUtils.touch(dot_delivery_cli_toml)
367
+ end
368
+
369
+ it "detects the delivery config" do
370
+ Dir.chdir(tempdir_subdir) do
371
+ expect(cookbook_generator.have_delivery_config?).to be(true)
372
+ end
373
+ end
374
+
375
+ it "emits concise output" do
376
+ Dir.chdir(tempdir) do
377
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
378
+ expect(cookbook_generator.run).to eq(0)
379
+ end
380
+
381
+ expected = <<~OUTPUT
382
+ Generating cookbook new_cookbook
383
+ - Ensuring correct cookbook content
384
+ - Committing cookbook files to git
385
+ - Ensuring delivery CLI configuration
386
+ - Ensuring correct Workflow (Delivery) build cookbook content
387
+ - Adding delivery configuration to feature branch
388
+ - Adding build cookbook to feature branch
389
+ - Merging delivery content feature branch to master
390
+
391
+ Your cookbook is ready. To setup the pipeline, type `cd new_cookbook`, then run `delivery init`
392
+ OUTPUT
393
+
394
+ actual = stdout_io.string
395
+
396
+ # the formatter will add escape sequences to turn off any colors
397
+ actual.gsub!("\e[0m", "")
398
+ expect(actual).to eq(expected)
399
+ end
400
+ end
401
+ end
402
+
403
+ context "when given the verbose flag" do
404
+
405
+ let(:argv) { %w{ new_cookbook --verbose } }
406
+
407
+ it "configures the generator context with verbose mode enabled" do
408
+ cookbook_generator.read_and_validate_params
409
+ cookbook_generator.setup_context
410
+ expect(generator_context.verbose).to be(true)
411
+ end
412
+
413
+ it "emits verbose output" do
414
+ Dir.chdir(tempdir) do
415
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
416
+ expect(cookbook_generator.run).to eq(0)
417
+ end
418
+
419
+ # The normal chef formatter puts a heading for each recipe like this.
420
+ # Full output is large and subject to change with minor changes in the
421
+ # generator cookbook, so we just look for this line
422
+ expected_line = "Recipe: code_generator::cookbook"
423
+
424
+ actual = stdout_io.string
425
+
426
+ expect(actual).to include(expected_line)
427
+ end
428
+ end
429
+
430
+ shared_examples_for "a generated file" do |context_var|
431
+ before do
432
+ Dir.chdir(tempdir) do
433
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
434
+ expect(cookbook_generator.run).to eq(0)
435
+ end
436
+ end
437
+
438
+ it "should contain #{context_var} from the generator context" do
439
+ expect(File.read(file)).to match line
440
+ end
441
+ end
442
+
443
+ describe "README.md" do
444
+ let(:file) { File.join(tempdir, "new_cookbook", "README.md") }
445
+
446
+ include_examples "a generated file", :cookbook_name do
447
+ let(:line) { "# new_cookbook" }
448
+ end
449
+ end
450
+
451
+ describe "CHANGELOG.md" do
452
+ let(:file) { File.join(tempdir, "new_cookbook", "CHANGELOG.md") }
453
+
454
+ include_examples "a generated file", :cookbook_name do
455
+ let(:line) { "# new_cookbook" }
456
+ end
457
+ end
458
+
459
+ # This shared example group requires a let binding for
460
+ # `expected_kitchen_yml_content`
461
+ shared_examples_for "kitchen_yml_and_integration_tests" do
462
+
463
+ describe "Generating Test Kitchen and integration testing files" do
464
+
465
+ describe "generating kitchen config" do
466
+
467
+ before do
468
+ Dir.chdir(tempdir) do
469
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
470
+ expect(cookbook_generator.run).to eq(0)
471
+ end
472
+ end
473
+
474
+ let(:file) { File.join(tempdir, "new_cookbook", "kitchen.yml") }
475
+
476
+ it "creates a kitchen.yml with the expected content" do
477
+ expect(IO.read(file)).to eq(expected_kitchen_yml_content)
478
+ end
479
+
480
+ end
481
+
482
+ describe "test/integration/default/default_test.rb" do
483
+ let(:file) { File.join(tempdir, "new_cookbook", "test", "integration", "default", "default_test.rb") }
484
+
485
+ include_examples "a generated file", :cookbook_name do
486
+ let(:line) { "describe port" }
487
+ end
488
+ end
489
+ end
490
+ end
491
+
492
+ # This shared example group requires you to define a let binding for
493
+ # `expected_chefspec_spec_helper_content`
494
+ shared_examples_for "chefspec_spec_helper_file" do
495
+
496
+ describe "Generating ChefSpec files" do
497
+
498
+ before do
499
+ Dir.chdir(tempdir) do
500
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
501
+ expect(cookbook_generator.run).to eq(0)
502
+ end
503
+ end
504
+
505
+ let(:file) { File.join(tempdir, "new_cookbook", "spec", "spec_helper.rb") }
506
+
507
+ it "creates a spec/spec_helper.rb for ChefSpec with the expected content" do
508
+ expect(IO.read(file)).to eq(expected_chefspec_spec_helper_content)
509
+ end
510
+
511
+ end
512
+
513
+ end
514
+
515
+ context "when configured for Policyfiles" do
516
+
517
+ let(:argv) { %w{new_cookbook --policy} }
518
+
519
+ describe "Policyfile.rb" do
520
+
521
+ let(:file) { File.join(tempdir, "new_cookbook", "Policyfile.rb") }
522
+
523
+ let(:expected_content) do
524
+ <<~POLICYFILE_RB
525
+ # Policyfile.rb - Describe how you want Chef Infra Client to build your system.
526
+ #
527
+ # For more information on the Policyfile feature, visit
528
+ # https://docs.chef.io/policyfile.html
529
+
530
+ # A name that describes what the system you're building with Chef does.
531
+ name 'new_cookbook'
532
+
533
+ # Where to find external cookbooks:
534
+ default_source :supermarket
535
+
536
+ # run_list: chef-client will run these recipes in the order specified.
537
+ run_list 'new_cookbook::default'
538
+
539
+ # Specify a custom source for a single cookbook:
540
+ cookbook 'new_cookbook', path: '.'
541
+ POLICYFILE_RB
542
+ end
543
+
544
+ before do
545
+ Dir.chdir(tempdir) do
546
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
547
+ expect(cookbook_generator.run).to eq(0)
548
+ end
549
+ end
550
+
551
+ it "has a run_list and cookbook path that will work out of the box" do
552
+ expect(IO.read(file)).to eq(expected_content)
553
+ end
554
+
555
+ end
556
+
557
+ include_examples "kitchen_yml_and_integration_tests" do
558
+
559
+ let(:expected_kitchen_yml_content) do
560
+ <<~KITCHEN_YML
561
+ ---
562
+ driver:
563
+ name: vagrant
564
+
565
+ ## The forwarded_port port feature lets you connect to ports on the VM guest via
566
+ ## localhost on the host.
567
+ ## see also: https://www.vagrantup.com/docs/networking/forwarded_ports.html
568
+
569
+ # network:
570
+ # - ["forwarded_port", {guest: 80, host: 8080}]
571
+
572
+ provisioner:
573
+ name: chef_zero
574
+
575
+ ## product_name and product_version specifies a specific Chef product and version to install.
576
+ ## see the Chef documentation for more details: https://docs.chef.io/config_yml_kitchen.html
577
+ # product_name: chef
578
+ # product_version: 15
579
+
580
+ verifier:
581
+ name: inspec
582
+
583
+ platforms:
584
+ - name: ubuntu-18.04
585
+ - name: centos-7
586
+
587
+ suites:
588
+ - name: default
589
+ verifier:
590
+ inspec_tests:
591
+ - test/integration/default
592
+ attributes:
593
+ KITCHEN_YML
594
+ end
595
+
596
+ end
597
+
598
+ include_examples "chefspec_spec_helper_file" do
599
+
600
+ let(:expected_chefspec_spec_helper_content) do
601
+ <<~SPEC_HELPER
602
+ require 'chefspec'
603
+ require 'chefspec/policyfile'
604
+ SPEC_HELPER
605
+ end
606
+
607
+ end
608
+
609
+ end
610
+
611
+ context "when configured for Berkshelf" do
612
+
613
+ let(:argv) { %w{new_cookbook --berks} }
614
+
615
+ describe "Berksfile" do
616
+
617
+ let(:file) { File.join(tempdir, "new_cookbook", "Berksfile") }
618
+
619
+ let(:expected_content) do
620
+ <<~POLICYFILE_RB
621
+ source 'https://supermarket.chef.io'
622
+
623
+ metadata
624
+ POLICYFILE_RB
625
+ end
626
+
627
+ before do
628
+ Dir.chdir(tempdir) do
629
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
630
+ expect(cookbook_generator.run).to eq(0)
631
+ end
632
+ end
633
+
634
+ it "pulls deps from metadata" do
635
+ expect(IO.read(file)).to eq(expected_content)
636
+ end
637
+
638
+ end
639
+
640
+ include_examples "kitchen_yml_and_integration_tests" do
641
+
642
+ let(:expected_kitchen_yml_content) do
643
+ <<~KITCHEN_YML
644
+ ---
645
+ driver:
646
+ name: vagrant
647
+
648
+ ## The forwarded_port port feature lets you connect to ports on the VM guest via
649
+ ## localhost on the host.
650
+ ## see also: https://www.vagrantup.com/docs/networking/forwarded_ports.html
651
+
652
+ # network:
653
+ # - ["forwarded_port", {guest: 80, host: 8080}]
654
+
655
+ provisioner:
656
+ name: chef_zero
657
+ # You may wish to disable always updating cookbooks in CI or other testing environments.
658
+ # For example:
659
+ # always_update_cookbooks: <%= !ENV['CI'] %>
660
+ always_update_cookbooks: true
661
+
662
+ ## product_name and product_version specifies a specific Chef product and version to install.
663
+ ## see the Chef documentation for more details: https://docs.chef.io/config_yml_kitchen.html
664
+ # product_name: chef
665
+ # product_version: 15
666
+
667
+ verifier:
668
+ name: inspec
669
+
670
+ platforms:
671
+ - name: ubuntu-18.04
672
+ - name: centos-7
673
+
674
+ suites:
675
+ - name: default
676
+ run_list:
677
+ - recipe[new_cookbook::default]
678
+ verifier:
679
+ inspec_tests:
680
+ - test/integration/default
681
+ attributes:
682
+ KITCHEN_YML
683
+ end
684
+
685
+ end
686
+
687
+ include_examples "chefspec_spec_helper_file" do
688
+
689
+ let(:expected_chefspec_spec_helper_content) do
690
+ <<~SPEC_HELPER
691
+ require 'chefspec'
692
+ require 'chefspec/berkshelf'
693
+ SPEC_HELPER
694
+ end
695
+
696
+ end
697
+
698
+ end
699
+
700
+ describe "metadata.rb" do
701
+ let(:file) { File.join(tempdir, "new_cookbook", "metadata.rb") }
702
+
703
+ include_examples "a generated file", :cookbook_name do
704
+ let(:line) { /name\s+'new_cookbook'.+# issues_url.+# source_url/m }
705
+ end
706
+ end
707
+
708
+ describe "recipes/default.rb" do
709
+ let(:file) { File.join(tempdir, "new_cookbook", "recipes", "default.rb") }
710
+
711
+ include_examples "a generated file", :cookbook_name do
712
+ let(:line) { "# Cookbook:: new_cookbook" }
713
+ end
714
+ end
715
+
716
+ describe "spec/unit/recipes/default_spec.rb" do
717
+ let(:file) { File.join(tempdir, "new_cookbook", "spec", "unit", "recipes", "default_spec.rb") }
718
+
719
+ include_examples "a generated file", :cookbook_name do
720
+ let(:line) { "describe 'new_cookbook::default' do" }
721
+ end
722
+ end
723
+
724
+ end
725
+
726
+ context "when given the path to the cookbook to generate" do
727
+ let(:argv) { [ File.join(tempdir, "a_new_cookbook") ] }
728
+
729
+ before do
730
+ reset_tempdir
731
+ end
732
+
733
+ it "configures the generator context" do
734
+ cookbook_generator.read_and_validate_params
735
+ cookbook_generator.setup_context
736
+ expect(generator_context.cookbook_root).to eq(tempdir)
737
+ expect(generator_context.cookbook_name).to eq("a_new_cookbook")
738
+ end
739
+
740
+ end
741
+
742
+ context "when given generic arguments to populate the generator context" do
743
+ let(:argv) { [ "new_cookbook", "--generator-arg", "key1=value1", "-a", "key2=value2", "-a", " key3 = value3 " ] }
744
+
745
+ before do
746
+ reset_tempdir
747
+ end
748
+
749
+ it "configures the generator context for long form option key1" do
750
+ cookbook_generator.read_and_validate_params
751
+ cookbook_generator.setup_context
752
+ expect(generator_context.key1).to eq("value1")
753
+ end
754
+
755
+ it "configures the generator context for short form option key2" do
756
+ cookbook_generator.read_and_validate_params
757
+ cookbook_generator.setup_context
758
+ expect(generator_context.key2).to eq("value2")
759
+ end
760
+
761
+ it "configures the generator context for key3 containing additional spaces" do
762
+ cookbook_generator.read_and_validate_params
763
+ cookbook_generator.setup_context
764
+ expect(generator_context.key3).to eq("value3")
765
+ end
766
+
767
+ end
768
+
769
+ end