puppet 3.5.1-x86-mingw32 → 3.6.0.rc1-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (342) hide show
  1. data/CONTRIBUTING.md +5 -0
  2. data/Gemfile +17 -9
  3. data/README.md +1 -0
  4. data/conf/fileserver.conf +4 -3
  5. data/ext/README.environment +8 -0
  6. data/ext/build_defaults.yaml +1 -1
  7. data/ext/debian/control +2 -2
  8. data/ext/debian/puppet-common.dirs +4 -0
  9. data/ext/debian/rules +4 -0
  10. data/ext/emacs/puppet-mode-init.el +1 -1
  11. data/ext/emacs/puppet-mode.el +36 -17
  12. data/ext/redhat/client.init +3 -3
  13. data/ext/redhat/puppet.spec.erb +9 -0
  14. data/ext/systemd/puppet.service +3 -4
  15. data/ext/systemd/puppetmaster.service +1 -3
  16. data/install.rb +1 -1
  17. data/lib/puppet.rb +2 -1
  18. data/lib/puppet/agent.rb +1 -1
  19. data/lib/puppet/application.rb +17 -17
  20. data/lib/puppet/application/doc.rb +1 -1
  21. data/lib/puppet/configurer.rb +4 -1
  22. data/lib/puppet/configurer/downloader.rb +13 -12
  23. data/lib/puppet/configurer/plugin_handler.rb +3 -3
  24. data/lib/puppet/context.rb +6 -1
  25. data/lib/puppet/defaults.rb +82 -12
  26. data/lib/puppet/environments.rb +169 -13
  27. data/lib/puppet/external/nagios/grammar.ry +2 -0
  28. data/lib/puppet/external/nagios/parser.rb +28 -19
  29. data/lib/puppet/face/config.rb +19 -6
  30. data/lib/puppet/face/module/generate.rb +209 -7
  31. data/lib/puppet/face/module/install.rb +17 -16
  32. data/lib/puppet/face/module/list.rb +83 -82
  33. data/lib/puppet/face/module/search.rb +1 -1
  34. data/lib/puppet/face/module/upgrade.rb +10 -9
  35. data/lib/puppet/face/parser.rb +3 -2
  36. data/lib/puppet/face/plugin.rb +8 -4
  37. data/lib/puppet/file_bucket/dipper.rb +6 -3
  38. data/lib/puppet/file_bucket/file.rb +4 -2
  39. data/lib/puppet/file_serving/metadata.rb +1 -1
  40. data/lib/puppet/file_system/memory_file.rb +27 -1
  41. data/lib/puppet/file_system/memory_impl.rb +15 -1
  42. data/lib/puppet/forge.rb +148 -52
  43. data/lib/puppet/forge/cache.rb +5 -1
  44. data/lib/puppet/forge/errors.rb +10 -0
  45. data/lib/puppet/forge/repository.rb +61 -26
  46. data/lib/puppet/functions.rb +548 -0
  47. data/lib/puppet/functions/assert_type.rb +42 -0
  48. data/lib/puppet/functions/import.rb +7 -0
  49. data/lib/puppet/indirector/facts/facter.rb +1 -1
  50. data/lib/puppet/indirector/file_bucket_file/file.rb +3 -2
  51. data/lib/puppet/indirector/rest.rb +18 -0
  52. data/lib/puppet/loaders.rb +20 -0
  53. data/lib/puppet/module.rb +2 -2
  54. data/lib/puppet/module_tool.rb +40 -14
  55. data/lib/puppet/module_tool/applications.rb +0 -1
  56. data/lib/puppet/module_tool/applications/application.rb +35 -26
  57. data/lib/puppet/module_tool/applications/builder.rb +16 -6
  58. data/lib/puppet/module_tool/applications/checksummer.rb +25 -19
  59. data/lib/puppet/module_tool/applications/installer.rb +196 -35
  60. data/lib/puppet/module_tool/applications/searcher.rb +1 -0
  61. data/lib/puppet/module_tool/applications/uninstaller.rb +7 -1
  62. data/lib/puppet/module_tool/applications/unpacker.rb +57 -31
  63. data/lib/puppet/module_tool/applications/upgrader.rb +221 -65
  64. data/lib/puppet/module_tool/checksums.rb +5 -8
  65. data/lib/puppet/module_tool/errors/installer.rb +12 -44
  66. data/lib/puppet/module_tool/errors/shared.rb +84 -11
  67. data/lib/puppet/module_tool/errors/upgrader.rb +16 -45
  68. data/lib/puppet/module_tool/install_directory.rb +7 -6
  69. data/lib/puppet/module_tool/installed_modules.rb +92 -0
  70. data/lib/puppet/module_tool/local_tarball.rb +91 -0
  71. data/lib/puppet/module_tool/metadata.rb +119 -115
  72. data/lib/puppet/module_tool/modulefile.rb +9 -9
  73. data/lib/puppet/module_tool/shared_behaviors.rb +19 -7
  74. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +79 -0
  75. data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +18 -0
  76. data/lib/puppet/module_tool/skeleton/templates/generator/metadata.json.erb +1 -0
  77. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +7 -0
  78. data/lib/puppet/module_tool/tar.rb +3 -7
  79. data/lib/puppet/module_tool/tar/gnu.rb +21 -9
  80. data/lib/puppet/module_tool/tar/mini.rb +2 -8
  81. data/lib/puppet/network/http/api/v1.rb +1 -1
  82. data/lib/puppet/network/http/api/v2/authorization.rb +4 -2
  83. data/lib/puppet/network/http/issues.rb +1 -0
  84. data/lib/puppet/network/http_pool.rb +15 -6
  85. data/lib/puppet/node/environment.rb +91 -20
  86. data/lib/puppet/parser/ast/pops_bridge.rb +44 -3
  87. data/lib/puppet/parser/collector.rb +1 -1
  88. data/lib/puppet/parser/compiler.rb +50 -7
  89. data/lib/puppet/parser/functions.rb +6 -0
  90. data/lib/puppet/parser/functions/generate.rb +1 -1
  91. data/lib/puppet/parser/resource.rb +1 -1
  92. data/lib/puppet/pops.rb +22 -1
  93. data/lib/puppet/pops/adapters.rb +8 -1
  94. data/lib/puppet/pops/binder/bindings_composer.rb +1 -1
  95. data/lib/puppet/pops/binder/bindings_factory.rb +1 -1
  96. data/lib/puppet/pops/binder/config/binder_config_checker.rb +1 -1
  97. data/lib/puppet/pops/binder/producers.rb +2 -2
  98. data/lib/puppet/pops/evaluator/access_operator.rb +65 -25
  99. data/lib/puppet/pops/evaluator/callable_signature.rb +101 -0
  100. data/lib/puppet/pops/evaluator/closure.rb +57 -2
  101. data/lib/puppet/pops/evaluator/compare_operator.rb +1 -1
  102. data/lib/puppet/pops/evaluator/evaluator_impl.rb +9 -11
  103. data/lib/puppet/pops/evaluator/runtime3_support.rb +72 -21
  104. data/lib/puppet/pops/functions/dispatch.rb +71 -0
  105. data/lib/puppet/pops/functions/dispatcher.rb +237 -0
  106. data/lib/puppet/pops/functions/function.rb +77 -0
  107. data/lib/puppet/pops/issues.rb +12 -0
  108. data/lib/puppet/pops/loader/base_loader.rb +102 -0
  109. data/lib/puppet/pops/loader/dependency_loader.rb +60 -0
  110. data/lib/puppet/pops/loader/gem_support.rb +49 -0
  111. data/lib/puppet/pops/loader/loader.rb +180 -0
  112. data/lib/puppet/pops/loader/loader_paths.rb +137 -0
  113. data/lib/puppet/pops/loader/module_loaders.rb +242 -0
  114. data/lib/puppet/pops/loader/null_loader.rb +44 -0
  115. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +34 -0
  116. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +109 -0
  117. data/lib/puppet/pops/loader/simple_environment_loader.rb +20 -0
  118. data/lib/puppet/pops/loader/static_loader.rb +69 -0
  119. data/lib/puppet/pops/loader/uri_helper.rb +22 -0
  120. data/lib/puppet/pops/loaders.rb +240 -0
  121. data/lib/puppet/pops/model/factory.rb +13 -5
  122. data/lib/puppet/pops/model/model_tree_dumper.rb +12 -4
  123. data/lib/puppet/pops/parser/egrammar.ra +31 -18
  124. data/lib/puppet/pops/parser/eparser.rb +1137 -1106
  125. data/lib/puppet/pops/parser/lexer2.rb +17 -16
  126. data/lib/puppet/pops/semantic_error.rb +17 -0
  127. data/lib/puppet/pops/types/type_calculator.rb +150 -15
  128. data/lib/puppet/pops/types/type_factory.rb +69 -0
  129. data/lib/puppet/pops/types/type_parser.rb +9 -0
  130. data/lib/puppet/pops/types/types.rb +65 -4
  131. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  132. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -1
  133. data/lib/puppet/property/list.rb +1 -1
  134. data/lib/puppet/provider/augeas/augeas.rb +2 -2
  135. data/lib/puppet/provider/cron/crontab.rb +13 -2
  136. data/lib/puppet/provider/package.rb +24 -0
  137. data/lib/puppet/provider/package/apt.rb +6 -1
  138. data/lib/puppet/provider/package/gem.rb +8 -2
  139. data/lib/puppet/provider/package/msi.rb +0 -15
  140. data/lib/puppet/provider/package/openbsd.rb +0 -24
  141. data/lib/puppet/provider/package/rpm.rb +3 -29
  142. data/lib/puppet/provider/package/windows.rb +0 -15
  143. data/lib/puppet/provider/package/yum.rb +101 -24
  144. data/lib/puppet/provider/package/yumhelper.py +31 -1
  145. data/lib/puppet/provider/package/zypper.rb +10 -28
  146. data/lib/puppet/provider/service/debian.rb +1 -1
  147. data/lib/puppet/provider/service/init.rb +3 -0
  148. data/lib/puppet/provider/service/openbsd.rb +318 -0
  149. data/lib/puppet/provider/service/redhat.rb +6 -3
  150. data/lib/puppet/provider/service/systemd.rb +2 -2
  151. data/lib/puppet/provider/yumrepo/inifile.rb +115 -42
  152. data/lib/puppet/resource.rb +13 -9
  153. data/lib/puppet/resource/catalog.rb +12 -6
  154. data/lib/puppet/resource/type_collection.rb +3 -3
  155. data/lib/puppet/settings.rb +57 -36
  156. data/lib/puppet/settings/config_file.rb +5 -0
  157. data/lib/puppet/settings/environment_conf.rb +147 -0
  158. data/lib/puppet/settings/ttl_setting.rb +48 -0
  159. data/lib/puppet/ssl/certificate_authority.rb +2 -3
  160. data/lib/puppet/ssl/certificate_authority/autosign_command.rb +1 -1
  161. data/lib/puppet/ssl/certificate_request.rb +4 -4
  162. data/lib/puppet/ssl/validator/default_validator.rb +2 -2
  163. data/lib/puppet/status.rb +1 -1
  164. data/lib/puppet/test/test_helper.rb +1 -0
  165. data/lib/puppet/type/augeas.rb +13 -1
  166. data/lib/puppet/type/cron.rb +32 -18
  167. data/lib/puppet/type/file.rb +4 -2
  168. data/lib/puppet/type/file/checksum.rb +15 -5
  169. data/lib/puppet/type/file/content.rb +3 -1
  170. data/lib/puppet/type/file/source.rb +5 -5
  171. data/lib/puppet/type/package.rb +12 -17
  172. data/lib/puppet/type/resources.rb +3 -1
  173. data/lib/puppet/type/scheduled_task.rb +4 -5
  174. data/lib/puppet/type/service.rb +12 -2
  175. data/lib/puppet/type/user.rb +106 -0
  176. data/lib/puppet/type/yumrepo.rb +9 -1
  177. data/lib/puppet/util/checksums.rb +60 -1
  178. data/lib/puppet/util/diff.rb +3 -1
  179. data/lib/puppet/util/execution.rb +20 -16
  180. data/lib/puppet/util/feature.rb +3 -0
  181. data/lib/puppet/util/logging.rb +19 -12
  182. data/lib/puppet/util/rubygems.rb +10 -0
  183. data/lib/puppet/util/watched_file.rb +1 -1
  184. data/lib/puppet/util/windows/security.rb +5 -3
  185. data/lib/puppet/vendor/load_semantic.rb +1 -0
  186. data/lib/puppet/vendor/require_vendored.rb +2 -0
  187. data/lib/puppet/vendor/semantic/Gemfile +20 -0
  188. data/lib/puppet/vendor/semantic/Rakefile +69 -0
  189. data/lib/puppet/vendor/semantic/lib/semantic.rb +7 -0
  190. data/lib/puppet/vendor/semantic/lib/semantic/dependency.rb +181 -0
  191. data/lib/puppet/vendor/semantic/lib/semantic/dependency/graph.rb +60 -0
  192. data/lib/puppet/vendor/semantic/lib/semantic/dependency/graph_node.rb +117 -0
  193. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +46 -0
  194. data/lib/puppet/vendor/semantic/lib/semantic/dependency/source.rb +25 -0
  195. data/lib/puppet/vendor/semantic/lib/semantic/dependency/unsatisfiable_graph.rb +31 -0
  196. data/lib/puppet/vendor/semantic/lib/semantic/version.rb +168 -0
  197. data/lib/puppet/vendor/semantic/lib/semantic/version_range.rb +424 -0
  198. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +24 -0
  199. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +141 -0
  200. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +162 -0
  201. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +143 -0
  202. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +5 -0
  203. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +44 -0
  204. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +383 -0
  205. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +307 -0
  206. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +608 -0
  207. data/lib/puppet/version.rb +1 -1
  208. data/spec/fixtures/java.tgz +0 -0
  209. data/spec/fixtures/stdlib.tgz +0 -0
  210. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/usee/lib/puppet/functions/usee/callee.rb +5 -0
  211. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/user/lib/puppet/functions/user/caller.rb +5 -0
  212. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/user/metadata.json +9 -0
  213. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/lib/puppet/functions/modulea/rb_func_a.rb +5 -0
  214. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/lib/puppet/functions/rb_func_a.rb +5 -0
  215. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/manifests/init.pp +3 -0
  216. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/metadata.json +19 -0
  217. data/spec/fixtures/unit/pops/loaders/loaders/wo_metadata_module/modules/moduleb/lib/puppet/functions/moduleb/rb_func_b.rb +6 -0
  218. data/spec/fixtures/unit/pops/loaders/loaders/wo_metadata_module/modules/moduleb/manifests/init.pp +3 -0
  219. data/spec/fixtures/unit/provider/naginator/define_empty_param +6 -0
  220. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +7 -0
  221. data/spec/fixtures/unit/type/user/authorized_keys +5 -0
  222. data/spec/integration/application/apply_spec.rb +1 -2
  223. data/spec/integration/configurer_spec.rb +2 -2
  224. data/spec/integration/faces/plugin_spec.rb +62 -0
  225. data/spec/integration/indirector/catalog/compiler_spec.rb +1 -1
  226. data/spec/integration/indirector/catalog/queue_spec.rb +1 -1
  227. data/spec/integration/node/environment_spec.rb +2 -2
  228. data/spec/integration/parser/future_compiler_spec.rb +96 -142
  229. data/spec/integration/parser/ruby_manifest_spec.rb +0 -5
  230. data/spec/integration/provider/cron/crontab_spec.rb +35 -0
  231. data/spec/integration/type/file_spec.rb +74 -72
  232. data/spec/integration/util/windows/security_spec.rb +17 -0
  233. data/spec/lib/matchers/resource.rb +45 -13
  234. data/spec/lib/puppet_spec/files.rb +18 -0
  235. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +56 -0
  236. data/spec/lib/puppet_spec/module_tool/stub_source.rb +133 -0
  237. data/spec/shared_contexts/checksums.rb +55 -0
  238. data/spec/unit/application/apply_spec.rb +10 -7
  239. data/spec/unit/application/doc_spec.rb +17 -10
  240. data/spec/unit/application/indirection_base_spec.rb +18 -10
  241. data/spec/unit/application/inspect_spec.rb +22 -20
  242. data/spec/unit/configurer/downloader_spec.rb +7 -6
  243. data/spec/unit/configurer/plugin_handler_spec.rb +5 -8
  244. data/spec/unit/configurer_spec.rb +1 -1
  245. data/spec/unit/context_spec.rb +23 -0
  246. data/spec/unit/environments_spec.rb +274 -16
  247. data/spec/unit/face/config_spec.rb +111 -11
  248. data/spec/unit/face/module/install_spec.rb +14 -85
  249. data/spec/unit/face/module/list_spec.rb +108 -62
  250. data/spec/unit/face/module/search_spec.rb +1 -1
  251. data/spec/unit/face/module/uninstall_spec.rb +21 -42
  252. data/spec/unit/face/parser_spec.rb +5 -2
  253. data/spec/unit/file_bucket/dipper_spec.rb +92 -86
  254. data/spec/unit/file_bucket/file_spec.rb +23 -75
  255. data/spec/unit/file_serving/metadata_spec.rb +74 -74
  256. data/spec/unit/forge/module_release_spec.rb +131 -0
  257. data/spec/unit/forge/repository_spec.rb +21 -20
  258. data/spec/unit/forge_spec.rb +99 -23
  259. data/spec/unit/functions/assert_type_spec.rb +59 -0
  260. data/spec/unit/functions4_spec.rb +671 -0
  261. data/spec/unit/indirector/catalog/static_compiler_spec.rb +2 -2
  262. data/spec/unit/indirector/facts/facter_spec.rb +9 -3
  263. data/spec/unit/indirector/file_bucket_file/file_spec.rb +156 -155
  264. data/spec/unit/indirector/rest_spec.rb +8 -0
  265. data/spec/unit/interface/face_collection_spec.rb +35 -23
  266. data/spec/unit/module_spec.rb +20 -8
  267. data/spec/unit/module_tool/applications/builder_spec.rb +40 -12
  268. data/spec/unit/module_tool/applications/checksummer_spec.rb +86 -105
  269. data/spec/unit/module_tool/applications/installer_spec.rb +293 -261
  270. data/spec/unit/module_tool/applications/searcher_spec.rb +1 -1
  271. data/spec/unit/module_tool/applications/uninstaller_spec.rb +90 -154
  272. data/spec/unit/module_tool/applications/unpacker_spec.rb +12 -12
  273. data/spec/unit/module_tool/applications/upgrader_spec.rb +286 -18
  274. data/spec/unit/module_tool/metadata_spec.rb +223 -14
  275. data/spec/unit/module_tool/tar/gnu_spec.rb +12 -9
  276. data/spec/unit/module_tool/tar/mini_spec.rb +1 -1
  277. data/spec/unit/module_tool/tar_spec.rb +4 -18
  278. data/spec/unit/module_tool_spec.rb +123 -27
  279. data/spec/unit/network/formats_spec.rb +2 -2
  280. data/spec/unit/network/http_pool_spec.rb +21 -0
  281. data/spec/unit/network/rights_spec.rb +10 -8
  282. data/spec/unit/node/environment_spec.rb +27 -2
  283. data/spec/unit/parser/collector_spec.rb +1 -1
  284. data/spec/unit/parser/compiler_spec.rb +1 -1
  285. data/spec/unit/parser/functions/generate_spec.rb +4 -0
  286. data/spec/unit/pops/evaluator/access_ops_spec.rb +50 -11
  287. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +25 -0
  288. data/spec/unit/pops/loaders/dependency_loader_spec.rb +44 -0
  289. data/spec/unit/pops/loaders/loader_paths_spec.rb +66 -0
  290. data/spec/unit/pops/loaders/loaders_spec.rb +105 -0
  291. data/spec/unit/pops/loaders/module_loaders_spec.rb +119 -0
  292. data/spec/unit/pops/loaders/static_loader_spec.rb +46 -0
  293. data/spec/unit/pops/types/type_calculator_spec.rb +145 -10
  294. data/spec/unit/pops/types/type_factory_spec.rb +101 -0
  295. data/spec/unit/pops/types/type_parser_spec.rb +22 -0
  296. data/spec/unit/property/list_spec.rb +9 -1
  297. data/spec/unit/provider/augeas/augeas_spec.rb +58 -11
  298. data/spec/unit/provider/cron/crontab_spec.rb +1 -0
  299. data/spec/unit/provider/cron/parsed_spec.rb +15 -0
  300. data/spec/unit/provider/naginator_spec.rb +14 -0
  301. data/spec/unit/provider/package/apt_spec.rb +78 -64
  302. data/spec/unit/provider/package/gem_spec.rb +15 -0
  303. data/spec/unit/provider/package/rpm_spec.rb +6 -6
  304. data/spec/unit/provider/package/windows_spec.rb +1 -1
  305. data/spec/unit/provider/package/yum_spec.rb +199 -104
  306. data/spec/unit/provider/package/zypper_spec.rb +41 -15
  307. data/spec/unit/provider/service/openbsd_spec.rb +129 -22
  308. data/spec/unit/provider/service/redhat_spec.rb +18 -4
  309. data/spec/unit/provider/service/systemd_spec.rb +5 -9
  310. data/spec/unit/provider/service/upstart_spec.rb +1 -1
  311. data/spec/unit/provider/user/directoryservice_spec.rb +10 -0
  312. data/spec/unit/provider/yumrepo/inifile_spec.rb +171 -15
  313. data/spec/unit/resource/catalog_spec.rb +20 -104
  314. data/spec/unit/resource/type_collection_spec.rb +10 -9
  315. data/spec/unit/settings/config_file_spec.rb +29 -6
  316. data/spec/unit/settings/environment_conf_spec.rb +51 -0
  317. data/spec/unit/settings_spec.rb +97 -12
  318. data/spec/unit/ssl/certificate_authority_spec.rb +2 -0
  319. data/spec/unit/type/augeas_spec.rb +1 -1
  320. data/spec/unit/type/cron_spec.rb +6 -7
  321. data/spec/unit/type/file/checksum_spec.rb +6 -0
  322. data/spec/unit/type/file/content_spec.rb +277 -207
  323. data/spec/unit/type/file_spec.rb +9 -7
  324. data/spec/unit/type/user_spec.rb +106 -18
  325. data/spec/unit/type/yumrepo_spec.rb +8 -0
  326. data/spec/unit/util/checksums_spec.rb +12 -5
  327. data/spec/unit/util/diff_spec.rb +8 -0
  328. data/spec/unit/util/execution_spec.rb +4 -4
  329. data/spec/unit/util/feature_spec.rb +2 -0
  330. data/spec/unit/util/logging_spec.rb +14 -4
  331. data/spec/unit/util/rdoc/parser_spec.rb +5 -4
  332. data/spec/unit/util/rubygems_spec.rb +14 -0
  333. data/tasks/parallel.rake +2 -2
  334. metadata +154 -21
  335. checksums.yaml +0 -7
  336. data/lib/puppet/module_tool/applications/generator.rb +0 -142
  337. data/lib/puppet/module_tool/skeleton.rb +0 -37
  338. data/lib/puppet/module_tool/skeleton/templates/generator/Modulefile.erb +0 -11
  339. data/lib/puppet/module_tool/skeleton/templates/generator/README.erb +0 -16
  340. data/lib/puppet/module_tool/tar/solaris.rb +0 -5
  341. data/spec/fixtures/unit/provider/service/systemd/list_units_services +0 -17
  342. data/spec/unit/module_tool/tar/solaris_spec.rb +0 -22
@@ -0,0 +1,91 @@
1
+ require 'pathname'
2
+ require 'tmpdir'
3
+
4
+ require 'puppet/forge'
5
+ require 'puppet/module_tool'
6
+
7
+ module Puppet::ModuleTool
8
+ class LocalTarball < Semantic::Dependency::Source
9
+ attr_accessor :release
10
+
11
+ def initialize(filename)
12
+ unpack(filename, tmpdir)
13
+ Puppet.debug "Unpacked local tarball to #{tmpdir}"
14
+
15
+ mod = Puppet::Module.new('tarball', tmpdir, nil)
16
+ @release = ModuleRelease.new(self, mod)
17
+ end
18
+
19
+ def fetch(name)
20
+ if @release.name == name
21
+ [ @release ]
22
+ else
23
+ [ ]
24
+ end
25
+ end
26
+
27
+ def prepare(release)
28
+ release.mod.path
29
+ end
30
+
31
+ def install(release, dir)
32
+ staging_dir = release.prepare
33
+
34
+ module_dir = dir + release.name[/-(.*)/, 1]
35
+ module_dir.rmtree if module_dir.exist?
36
+
37
+ # Make sure unpacked module has the same ownership as the folder we are moving it into.
38
+ Puppet::ModuleTool::Applications::Unpacker.harmonize_ownership(dir, staging_dir)
39
+
40
+ FileUtils.mv(staging_dir, module_dir)
41
+ end
42
+
43
+ class ModuleRelease < Semantic::Dependency::ModuleRelease
44
+ attr_reader :mod, :install_dir, :metadata
45
+
46
+ def initialize(source, mod)
47
+ @mod = mod
48
+ @metadata = mod.metadata
49
+ name = mod.forge_name.tr('/', '-')
50
+ version = Semantic::Version.parse(mod.version)
51
+
52
+ if mod.dependencies
53
+ dependencies = mod.dependencies.map do |dep|
54
+ range = dep['version_requirement'] || dep['versionRequirement'] || '>=0'
55
+ range = Semantic::VersionRange.parse(range) rescue Semantic::VersionRange::EMPTY_RANGE
56
+ [ dep['name'].tr('/', '-'), range ]
57
+ end
58
+ dependencies = Hash[dependencies]
59
+ end
60
+
61
+ super(source, name, version, dependencies || {})
62
+ end
63
+
64
+ def install(dir)
65
+ @source.install(self, dir)
66
+ @install_dir = dir
67
+ end
68
+
69
+ def prepare
70
+ @source.prepare(self)
71
+ end
72
+ end
73
+
74
+ private
75
+
76
+ # Obtain a suitable temporary path for unpacking tarballs
77
+ #
78
+ # @return [String] path to temporary unpacking location
79
+ def tmpdir
80
+ @dir ||= Dir.mktmpdir('local-tarball', Puppet::Forge::Cache.base_path)
81
+ end
82
+
83
+ def unpack(file, destination)
84
+ begin
85
+ Puppet::ModuleTool::Applications::Unpacker.unpack(file, destination)
86
+ rescue Puppet::ExecutionFailure => e
87
+ raise RuntimeError, "Could not extract contents of module archive: #{e.message}"
88
+ end
89
+ end
90
+ end
91
+ end
@@ -1,155 +1,159 @@
1
1
  require 'puppet/util/methodhelper'
2
2
  require 'puppet/module_tool'
3
3
  require 'puppet/network/format_support'
4
+ require 'uri'
5
+ require 'json'
4
6
 
5
7
  module Puppet::ModuleTool
6
- # = Metadata
7
- #
8
+
8
9
  # This class provides a data structure representing a module's metadata.
9
- # It provides some basic parsing, but other data is injected into it using
10
- # +annotate+ methods in other classes.
10
+ # @api private
11
11
  class Metadata
12
- include Puppet::Util::MethodHelper
13
12
  include Puppet::Network::FormatSupport
14
13
 
15
- # The full name of the module, which is a dash-separated combination of the
16
- # +username+ and module +name+.
17
- attr_reader :full_module_name
18
-
19
- # The name of the user that owns this module.
20
- attr_reader :username
21
-
22
- # The name of this module. See also +full_module_name+.
23
- attr_reader :name
14
+ attr_accessor :module_name
24
15
 
25
- # The version of this module.
26
- attr_reader :version
27
-
28
- # Instantiate from a hash, whose keys are setters in this class.
29
- def initialize(settings={})
30
- set_options(settings)
31
- end
32
-
33
- # Set the full name of this module, and from it, the +username+ and
34
- # module +name+.
35
- def full_module_name=(full_module_name)
36
- @full_module_name = full_module_name
37
- @username, @name = Puppet::ModuleTool::username_and_modname_from(full_module_name)
38
- end
39
-
40
- # Return an array of the module's Dependency objects.
41
- def dependencies
42
- return @dependencies ||= []
43
- end
44
-
45
- def author
46
- @author || @username
47
- end
48
-
49
- def author=(author)
50
- @author = author
51
- end
52
-
53
- def source
54
- @source || 'UNKNOWN'
55
- end
56
-
57
- def source=(source)
58
- @source = source
59
- end
16
+ DEFAULTS = {
17
+ 'name' => nil,
18
+ 'version' => nil,
19
+ 'author' => nil,
20
+ 'summary' => nil,
21
+ 'license' => 'Apache 2.0',
22
+ 'source' => '',
23
+ 'project_page' => nil,
24
+ 'issues_url' => nil,
25
+ 'dependencies' => [].freeze,
26
+ }
60
27
 
61
- def license
62
- @license || 'Apache License, Version 2.0'
28
+ def initialize
29
+ @data = DEFAULTS.dup
30
+ @data['dependencies'] = @data['dependencies'].dup
63
31
  end
64
32
 
65
- def license=(license)
66
- @license = license
33
+ # Returns a filesystem-friendly version of this module name.
34
+ def dashed_name
35
+ @data['name'].tr('/', '-') if @data['name']
67
36
  end
68
37
 
69
- def summary
70
- @summary || 'UNKNOWN'
71
- end
38
+ # Returns a string that uniquely represents this version of this module.
39
+ def release_name
40
+ return nil unless @data['name'] && @data['version']
41
+ [ dashed_name, @data['version'] ].join('-')
42
+ end
43
+
44
+ alias :name :module_name
45
+ alias :full_module_name :dashed_name
46
+
47
+ # Merges the current set of metadata with another metadata hash. This
48
+ # method also handles the validation of module names and versions, in an
49
+ # effort to be proactive about module publishing constraints.
50
+ def update(data)
51
+ process_name(data) if data['name']
52
+ process_version(data) if data['version']
53
+ process_source(data) if data['source']
54
+
55
+ @data.merge!(data)
56
+ return self
57
+ end
58
+
59
+ # Returns a hash of the module's metadata. Used by Puppet's automated
60
+ # serialization routines.
61
+ #
62
+ # @see Puppet::Network::FormatSupport#to_data_hash
63
+ def to_hash
64
+ @data
65
+ end
66
+ alias :to_data_hash :to_hash
67
+
68
+ def to_json
69
+ # This is used to simulate an ordered hash. In particular, some keys
70
+ # are promoted to the top of the serialized hash (while others are
71
+ # demoted) for human-friendliness.
72
+ #
73
+ # This particularly works around the lack of ordered hashes in 1.8.7.
74
+ promoted_keys = %w[ name version author summary license source ]
75
+ demoted_keys = %w[ dependencies ]
76
+ keys = @data.keys
77
+ keys -= promoted_keys
78
+ keys -= demoted_keys
79
+
80
+ contents = (promoted_keys + keys + demoted_keys).map do |k|
81
+ value = (JSON.pretty_generate(@data[k]) rescue @data[k].to_json)
82
+ "#{k.to_json}: #{value}"
83
+ end
72
84
 
73
- def summary=(summary)
74
- @summary = summary
85
+ "{\n" + contents.join(",\n").gsub(/^/, ' ') + "\n}\n"
75
86
  end
76
87
 
77
- def description
78
- @description || 'UNKNOWN'
88
+ # Expose any metadata keys as callable reader methods.
89
+ def method_missing(name, *args)
90
+ return @data[name.to_s] if @data.key? name.to_s
91
+ super
79
92
  end
80
93
 
81
- def description=(description)
82
- @description = description
83
- end
94
+ private
84
95
 
85
- def extra_metadata
86
- @extra_metadata || {}
87
- end
96
+ # Do basic validation and parsing of the name parameter.
97
+ def process_name(data)
98
+ validate_name(data['name'])
99
+ author, @module_name = data['name'].split(/[-\/]/, 2)
88
100
 
89
- def extra_metadata=(extra_metadata)
90
- @extra_metadata = extra_metadata
101
+ data['author'] ||= author if @data['author'] == DEFAULTS['author']
91
102
  end
92
103
 
93
- def project_page
94
- @project_page || 'UNKNOWN'
104
+ # Do basic validation on the version parameter.
105
+ def process_version(data)
106
+ validate_version(data['version'])
95
107
  end
96
108
 
97
- def project_page=(project_page)
98
- @project_page = project_page
99
- end
109
+ # Do basic parsing of the source parameter. If the source is hosted on
110
+ # GitHub, we can predict sensible defaults for both project_page and
111
+ # issues_url.
112
+ def process_source(data)
113
+ if data['source'] =~ %r[://]
114
+ source_uri = URI.parse(data['source'])
115
+ else
116
+ source_uri = URI.parse("http://#{data['source']}")
117
+ end
100
118
 
101
- # Return an array of the module's Puppet types, each one is a hash
102
- # containing :name and :doc.
103
- def types
104
- return @types ||= []
105
- end
119
+ if source_uri.host =~ /^(www\.)?github\.com$/
120
+ source_uri.scheme = 'https'
121
+ source_uri.path.sub!(/\.git$/, '')
122
+ data['project_page'] ||= @data['project_page'] || source_uri.to_s
123
+ data['issues_url'] ||= @data['issues_url'] || source_uri.to_s.sub(/\/*$/, '') + '/issues'
124
+ end
106
125
 
107
- # Return module's file checksums.
108
- def checksums
109
- return @checksums ||= {}
126
+ rescue URI::Error
127
+ return
110
128
  end
111
129
 
112
- # Return the dashed name of the module, which may either be the
113
- # dash-separated combination of the +username+ and module +name+, or just
114
- # the module +name+.
115
- def dashed_name
116
- return [@username, @name].compact.join('-')
117
- end
130
+ # Validates that the given module name is both namespaced and well-formed.
131
+ def validate_name(name)
132
+ return if name =~ /\A[a-z0-9]+[-\/][a-z][a-z0-9_]*\Z/i
118
133
 
119
- # Return the release name, which is the combination of the +dashed_name+
120
- # of the module and its +version+ number.
121
- def release_name
122
- return [dashed_name, @version].join('-')
123
- end
134
+ namespace, modname = name.split(/[-\/]/, 2)
135
+ modname = :namespace_missing if namespace == ''
124
136
 
125
- # Set the version of this module, ensure a string like '0.1.0' see the
126
- # Semantic Versions here: http://semver.org
127
- def version=(version)
128
- if SemVer.valid?(version)
129
- @version = version
137
+ err = case modname
138
+ when nil, '', :namespace_missing
139
+ "the field must be a namespaced module name"
140
+ when /[^a-z0-9_]/i
141
+ "the module name contains non-alphanumeric (or underscore) characters"
142
+ when /^[^a-z]/i
143
+ "the module name must begin with a letter"
130
144
  else
131
- raise ArgumentError, "Invalid version format: #{@version} (Semantic Versions are acceptable: http://semver.org)"
145
+ "the namespace contains non-alphanumeric characters"
132
146
  end
133
- end
134
147
 
135
- def to_data_hash()
136
- return extra_metadata.merge({
137
- 'name' => @full_module_name,
138
- 'version' => @version,
139
- 'source' => source,
140
- 'author' => author,
141
- 'license' => license,
142
- 'summary' => summary,
143
- 'description' => description,
144
- 'project_page' => project_page,
145
- 'dependencies' => dependencies,
146
- 'types' => types,
147
- 'checksums' => checksums
148
- })
148
+ raise ArgumentError, "Invalid 'name' field in metadata.json: #{err}"
149
149
  end
150
150
 
151
- def to_hash()
152
- to_data_hash
151
+ # Validates that the version string can be parsed as per SemVer.
152
+ def validate_version(version)
153
+ return if SemVer.valid?(version)
154
+
155
+ err = "version string cannot be parsed as a valid Semantic Version"
156
+ raise ArgumentError, "Invalid 'version' field in metadata.json: #{err}"
153
157
  end
154
158
  end
155
159
  end
@@ -30,49 +30,49 @@ module Puppet::ModuleTool
30
30
  # Set the +full_module_name+ (e.g. "myuser-mymodule"), which will also set the
31
31
  # +username+ and module +name+. Required.
32
32
  def name(name)
33
- @metadata.full_module_name = name
33
+ @metadata.update('name' => name)
34
34
  end
35
35
 
36
36
  # Set the module +version+ (e.g., "0.1.0"). Required.
37
37
  def version(version)
38
- @metadata.version = version
38
+ @metadata.update('version' => version)
39
39
  end
40
40
 
41
41
  # Add a dependency with the full_module_name +name+ (e.g. "myuser-mymodule"), an
42
42
  # optional +version_requirement+ (e.g. "0.1.0") and +repository+ (a URL
43
43
  # string). Optional. Can be called multiple times to add many dependencies.
44
44
  def dependency(name, version_requirement = nil, repository = nil)
45
- @metadata.dependencies << Dependency.new(name, version_requirement, repository)
45
+ @metadata.to_hash['dependencies'] << Dependency.new(name, version_requirement, repository)
46
46
  end
47
47
 
48
48
  # Set the source
49
49
  def source(source)
50
- @metadata.source = source
50
+ @metadata.update('source' => source)
51
51
  end
52
52
 
53
53
  # Set the author or default to +username+
54
54
  def author(author)
55
- @metadata.author = author
55
+ @metadata.update('author' => author)
56
56
  end
57
57
 
58
58
  # Set the license
59
59
  def license(license)
60
- @metadata.license = license
60
+ @metadata.update('license' => license)
61
61
  end
62
62
 
63
63
  # Set the summary
64
64
  def summary(summary)
65
- @metadata.summary = summary
65
+ @metadata.update('summary' => summary)
66
66
  end
67
67
 
68
68
  # Set the description
69
69
  def description(description)
70
- @metadata.description = description
70
+ @metadata.update('description' => description)
71
71
  end
72
72
 
73
73
  # Set the project page
74
74
  def project_page(project_page)
75
- @metadata.project_page = project_page
75
+ @metadata.update('project_page' => project_page)
76
76
  end
77
77
  end
78
78
  end
@@ -1,8 +1,3 @@
1
- require 'open-uri'
2
-
3
- require 'puppet/module_tool'
4
- require 'puppet/module_tool/errors'
5
-
6
1
  module Puppet::ModuleTool::Shared
7
2
 
8
3
  include Puppet::ModuleTool::Errors
@@ -80,7 +75,7 @@ module Puppet::ModuleTool::Shared
80
75
  :queued => true
81
76
  }
82
77
 
83
- if @force
78
+ if forced?
84
79
  range = SemVer[@version] rescue SemVer['>= 0.0.0']
85
80
  else
86
81
  range = (@conditions[mod]).map do |r|
@@ -101,7 +96,7 @@ module Puppet::ModuleTool::Shared
101
96
  :conditions => @conditions
102
97
  end
103
98
 
104
- if !(@force || @installed[mod].empty? || source.last[:name] == :you)
99
+ if !(forced? || @installed[mod].empty? || source.last[:name] == :you)
105
100
  next if range === SemVer.new(@installed[mod].first.version)
106
101
  action = :upgrade
107
102
  elsif @installed[mod].empty?
@@ -165,4 +160,21 @@ module Puppet::ModuleTool::Shared
165
160
  ]
166
161
  end.flatten
167
162
  end
163
+
164
+ def forced?
165
+ options[:force]
166
+ end
167
+
168
+ def add_module_name_constraints_to_graph(graph)
169
+ # Puppet modules are installed by "module name", but resolved by
170
+ # "full name" (including namespace). So that we don't run into
171
+ # problems at install time, we should reject any solution that
172
+ # depends on multiple nodes with the same "module name".
173
+ graph.add_graph_constraint('PMT') do |nodes|
174
+ names = nodes.map { |x| x.dependency_names + [ x.name ] }.flatten
175
+ names = names.map { |x| x.tr('/', '-') }.uniq
176
+ names = names.map { |x| x[/-(.*)/, 1] }
177
+ names.length == names.uniq.length
178
+ end
179
+ end
168
180
  end