puppet 6.12.0-x64-mingw32 → 6.17.0-x64-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 (412) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  251. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -13,7 +13,7 @@ require 'puppet'
13
13
  # service.
14
14
  module Puppet::Util::AtFork
15
15
  @handler_class = loop do
16
- if Facter.value(:operatingsystem) == 'Solaris'
16
+ if Puppet::Util::Platform.solaris?
17
17
  begin
18
18
  require 'puppet/util/at_fork/solaris'
19
19
  # using break to return a value from the loop block
@@ -2,6 +2,7 @@ require 'pathname'
2
2
  require 'puppet/util/rubygems'
3
3
  require 'puppet/util/warnings'
4
4
  require 'puppet/pops/adaptable'
5
+ require 'puppet/concurrent/synchronized'
5
6
 
6
7
  # An adapter that ties the module_directories cache to the environment where the modules are parsed. This
7
8
  # adapter ensures that the life-cycle of this cache doesn't exceed the life-cycle of the environment.
@@ -13,6 +14,9 @@ end
13
14
 
14
15
  # Autoload paths, either based on names or all at once.
15
16
  class Puppet::Util::Autoload
17
+ include Puppet::Concurrent::Synchronized
18
+ extend Puppet::Concurrent::Synchronized
19
+
16
20
  @loaded = {}
17
21
 
18
22
  class << self
@@ -124,19 +128,6 @@ class Puppet::Util::Autoload
124
128
  end.directories
125
129
  end
126
130
 
127
- # @api private
128
- def vendored_modules
129
- dir = Puppet[:vendormoduledir]
130
- if dir && File.directory?(dir)
131
- Dir.entries(dir)
132
- .reject { |f| f =~ /^\./ }
133
- .collect { |f| File.join(dir, f, "lib") }
134
- .find_all { |d| FileTest.directory?(d) }
135
- else
136
- []
137
- end
138
- end
139
-
140
131
  # @api private
141
132
  def gem_directories
142
133
  gem_source.directories
@@ -164,11 +155,6 @@ class Puppet::Util::Autoload
164
155
  # "app_defaults_initialized?" method on the main puppet Settings object.
165
156
  # --cprice 2012-03-16
166
157
  if Puppet.settings.app_defaults_initialized?
167
- unless @initialized
168
- $LOAD_PATH.unshift(Puppet[:libdir])
169
- $LOAD_PATH.concat(vendored_modules)
170
- @initialized = true
171
- end
172
158
  gem_directories + module_directories(env) + $LOAD_PATH
173
159
  else
174
160
  gem_directories + $LOAD_PATH
@@ -7,11 +7,26 @@ require 'time'
7
7
  module Puppet::Util::Checksums
8
8
  module_function
9
9
 
10
+ KNOWN_CHECKSUMS = [
11
+ :sha256, :sha256lite,
12
+ :md5, :md5lite,
13
+ :sha1, :sha1lite,
14
+ :sha512,
15
+ :sha384,
16
+ :sha224,
17
+ :mtime, :ctime, :none
18
+ ].freeze
19
+
10
20
  # It's not a good idea to use some of these in some contexts: for example, I
11
21
  # wouldn't try bucketing a file using the :none checksum type.
12
22
  def known_checksum_types
13
- [:sha256, :sha256lite, :md5, :md5lite, :sha1, :sha1lite, :sha512, :sha384, :sha224,
14
- :mtime, :ctime, :none]
23
+ KNOWN_CHECKSUMS
24
+ end
25
+
26
+ def valid_checksum?(type, value)
27
+ !!send("#{type}?", value)
28
+ rescue NoMethodError
29
+ false
15
30
  end
16
31
 
17
32
  class FakeChecksum
@@ -223,7 +238,7 @@ module Puppet::Util::Checksums
223
238
 
224
239
  # Return the :mtime timestamp of a file.
225
240
  def mtime_file(filename)
226
- Puppet::FileSystem.stat(filename).send(:mtime)
241
+ Puppet::FileSystem.stat(filename).mtime
227
242
  end
228
243
 
229
244
  # by definition this doesn't exist
@@ -293,7 +308,7 @@ module Puppet::Util::Checksums
293
308
 
294
309
  # Return the :ctime of a file.
295
310
  def ctime_file(filename)
296
- Puppet::FileSystem.stat(filename).send(:ctime)
311
+ Puppet::FileSystem.stat(filename).ctime
297
312
  end
298
313
 
299
314
  def ctime_stream(&block)
@@ -300,7 +300,7 @@ module Puppet::Util::FileParsing
300
300
  def record_line(name, options, &block)
301
301
  raise ArgumentError, _("Must include a list of fields") unless options.include?(:fields)
302
302
 
303
- record = FileRecord.new(:record, options, &block)
303
+ record = FileRecord.new(:record, **options, &block)
304
304
  record.name = name.intern
305
305
 
306
306
  new_line_type(record)
@@ -315,7 +315,7 @@ module Puppet::Util::FileParsing
315
315
  def text_line(name, options, &block)
316
316
  raise ArgumentError, _("You must provide a :match regex for text lines") unless options.include?(:match)
317
317
 
318
- record = FileRecord.new(:text, options, &block)
318
+ record = FileRecord.new(:text, **options, &block)
319
319
  record.name = name.intern
320
320
 
321
321
  new_line_type(record)
@@ -1,5 +1,6 @@
1
1
  require 'puppet/util/autoload'
2
2
  require 'puppet/util'
3
+ require 'puppet/concurrent/lock'
3
4
 
4
5
  # A module that can easily autoload things for us. Uses an instance
5
6
  # of Puppet::Util::Autoload
@@ -18,6 +19,7 @@ module Puppet::Util::InstanceLoader
18
19
  type = type.intern
19
20
  @instances[type] = {}
20
21
  @autoloaders[type] = Puppet::Util::Autoload.new(self, path)
22
+ @instance_loader_lock = Puppet::Concurrent::Lock.new
21
23
 
22
24
  # Now define our new simple methods
23
25
  unless respond_to?(type)
@@ -44,19 +46,21 @@ module Puppet::Util::InstanceLoader
44
46
 
45
47
  # Retrieve an already-loaded instance, or attempt to load our instance.
46
48
  def loaded_instance(type, name)
47
- name = name.intern
48
- instances = instance_hash(type)
49
- return nil unless instances
50
- unless instances.include? name
51
- if instance_loader(type).load(name, Puppet.lookup(:current_environment))
52
- unless instances.include? name
53
- Puppet.warning(_("Loaded %{type} file for %{name} but %{type} was not defined") % { type: type, name: name })
49
+ @instance_loader_lock.synchronize do
50
+ name = name.intern
51
+ instances = instance_hash(type)
52
+ return nil unless instances
53
+ unless instances.include? name
54
+ if instance_loader(type).load(name, Puppet.lookup(:current_environment))
55
+ unless instances.include? name
56
+ Puppet.warning(_("Loaded %{type} file for %{name} but %{type} was not defined") % { type: type, name: name })
57
+ return nil
58
+ end
59
+ else
54
60
  return nil
55
61
  end
56
- else
57
- return nil
58
62
  end
63
+ instances[name]
59
64
  end
60
- instances[name]
61
65
  end
62
66
  end
@@ -47,7 +47,7 @@ Puppet::Util::Log.newdesttype :file do
47
47
  require 'fileutils'
48
48
 
49
49
  def self.match?(obj)
50
- Puppet::Util.absolute_path?(obj)
50
+ obj.is_a?(String) && Puppet::Util.absolute_path?(obj)
51
51
  end
52
52
 
53
53
  def close
@@ -91,18 +91,9 @@ Puppet::Util::Log.newdesttype :file do
91
91
  end
92
92
  end
93
93
 
94
- file = File.open(path, File::WRONLY|File::CREAT|File::APPEND)
94
+ file = File.open(path, File::WRONLY|File::CREAT|File::APPEND)
95
95
  file.puts('[') if need_array_start
96
96
 
97
- # Give ownership to the user and group puppet will run as
98
- if Puppet.features.root? && !Puppet::Util::Platform.windows? && !file_exists
99
- begin
100
- FileUtils.chown(Puppet[:user], Puppet[:group], path)
101
- rescue ArgumentError, Errno::EPERM
102
- Puppet.err _("Unable to set ownership to %{user}:%{group} for log file: %{path}") % { user: Puppet[:user], group: Puppet[:group], path: path }
103
- end
104
- end
105
-
106
97
  @file = file
107
98
 
108
99
  @autoflush = Puppet[:autoflush]
@@ -0,0 +1,175 @@
1
+ module Puppet::Util::Package::Version
2
+ class Debian < Numeric
3
+ include Comparable
4
+
5
+ # Version string matching regexes
6
+ REGEX_EPOCH = '(?:([0-9]+):)?'
7
+ # alphanumerics and the characters . + - ~ , starts with a digit, ~ only of debian_revision is present
8
+ REGEX_UPSTREAM_VERSION = '([\.\+~0-9a-zA-Z-]+?)'
9
+ #alphanumerics and the characters + . ~
10
+ REGEX_DEBIAN_REVISION = '(?:-([\.\+~0-9a-zA-Z]*))?'
11
+
12
+ REGEX_FULL = REGEX_EPOCH + REGEX_UPSTREAM_VERSION + REGEX_DEBIAN_REVISION.freeze
13
+ REGEX_FULL_RX = /\A#{REGEX_FULL}\Z/
14
+
15
+ class ValidationFailure < ArgumentError; end
16
+
17
+ def self.parse(ver)
18
+ raise ValidationFailure, "Unable to parse '#{ver}' as a string" unless ver.is_a?(String)
19
+
20
+ match, epoch, upstream_version, debian_revision = *ver.match(REGEX_FULL_RX)
21
+
22
+ raise ValidationFailure, "Unable to parse '#{ver}' as a debian version identifier" unless match
23
+
24
+ new(epoch.to_i, upstream_version, debian_revision).freeze
25
+ end
26
+
27
+ def to_s
28
+ s = @upstream_version
29
+ s = "#{@epoch}:#{s}" if @epoch != 0
30
+ s = "#{s}-#{@debian_revision}" if @debian_revision
31
+ s
32
+ end
33
+ alias inspect to_s
34
+
35
+ def eql?(other)
36
+ other.is_a?(self.class) &&
37
+ @epoch.eql?(other.epoch) &&
38
+ @upstream_version.eql?(other.upstream_version) &&
39
+ @debian_revision.eql?(other.debian_revision)
40
+ end
41
+ alias == eql?
42
+
43
+ def <=>(other)
44
+ return nil unless other.is_a?(self.class)
45
+ cmp = @epoch <=> other.epoch
46
+ if cmp == 0
47
+ cmp = compare_upstream_version(other)
48
+ if cmp == 0
49
+ cmp = compare_debian_revision(other)
50
+ end
51
+ end
52
+ cmp
53
+ end
54
+
55
+ attr_reader :epoch, :upstream_version, :debian_revision
56
+
57
+ private
58
+
59
+ def initialize(epoch, upstream_version, debian_revision)
60
+ @epoch = epoch
61
+ @upstream_version = upstream_version
62
+ @debian_revision = debian_revision
63
+ end
64
+
65
+ def compare_upstream_version(other)
66
+ mine = @upstream_version
67
+ yours = other.upstream_version
68
+ compare_debian_versions(mine, yours)
69
+ end
70
+
71
+ def compare_debian_revision(other)
72
+ mine = @debian_revision
73
+ yours = other.debian_revision
74
+ compare_debian_versions(mine, yours)
75
+ end
76
+
77
+ def compare_debian_versions(mine, yours)
78
+ # First the initial part of each string consisting entirely of non-digit characters is determined.
79
+ # These two parts (one of which may be empty) are compared lexically. If a difference is found it is
80
+ # returned. The lexical comparison is a comparison of ASCII values modified so that all the letters
81
+ # sort earlier than all the non-letters and so that a tilde sorts before anything, even the end of a
82
+ # part. For example, the following parts are in sorted order from earliest to latest: ~~, ~~a, ~, the
83
+ # empty part, a.
84
+ #
85
+ # Then the initial part of the remainder of each string which consists entirely of digit characters
86
+ # is determined. The numerical values of these two parts are compared, and any difference found is
87
+ # returned as the result of the comparison. For these purposes an empty string (which can only occur
88
+ # at the end of one or both version strings being compared) counts as zero.
89
+ #
90
+ # These two steps (comparing and removing initial non-digit strings and initial digit strings) are
91
+ # repeated until a difference is found or both strings are exhausted.
92
+
93
+ mine_index = 0
94
+ yours_index = 0
95
+ cmp = 0
96
+ mine ||= ''
97
+ yours ||= ''
98
+ while mine_index < mine.length && yours_index < yours.length && cmp == 0
99
+ #handle ~
100
+ _mymatch, mytilde = *match_tildes(mine.slice(mine_index..-1))
101
+ mytilde ||= ''
102
+
103
+ _yoursmatch, yourstilde = *match_tildes(yours.slice(yours_index..-1))
104
+ yourstilde ||= ''
105
+
106
+ cmp = -1 * (mytilde.length <=> yourstilde.length)
107
+ mine_index += mytilde.length
108
+ yours_index += yourstilde.length
109
+
110
+ if cmp == 0 # handle letters
111
+
112
+ _mymatch, myletters = *match_letters(mine.slice(mine_index..-1))
113
+ myletters ||= ''
114
+
115
+ _yoursmatch, yoursletters = *match_letters(yours.slice(yours_index..-1))
116
+ yoursletters ||= ''
117
+
118
+ cmp = myletters <=> yoursletters
119
+ mine_index += myletters.length
120
+ yours_index += yoursletters.length
121
+
122
+ if cmp == 0 # handle nonletters except tilde
123
+ _mymatch, mynon_letters = *match_non_letters(mine.slice(mine_index..-1))
124
+ mynon_letters ||= ''
125
+
126
+ _yoursmatch, yoursnon_letters = *match_non_letters(yours.slice(yours_index..-1))
127
+ yoursnon_letters ||= ''
128
+
129
+ cmp = mynon_letters <=> yoursnon_letters
130
+ mine_index += mynon_letters.length
131
+ yours_index += yoursnon_letters.length
132
+
133
+ if cmp == 0 # handle digits
134
+ _mymatch, mydigits = *match_digits(mine.slice(mine_index..-1))
135
+ mydigits ||= ''
136
+
137
+ _yoursmatch, yoursdigits = *match_digits(yours.slice(yours_index..-1))
138
+ yoursdigits ||= ''
139
+
140
+ cmp = mydigits.to_i <=> yoursdigits.to_i
141
+ mine_index += mydigits.length
142
+ yours_index += yoursdigits.length
143
+ end
144
+ end
145
+ end
146
+ end
147
+ if cmp == 0
148
+ if mine_index < mine.length && match_tildes(mine[mine_index])
149
+ cmp = -1
150
+ elsif yours_index < yours.length && match_tildes(yours[yours_index])
151
+ cmp = 1
152
+ else
153
+ cmp = mine.length <=> yours.length
154
+ end
155
+ end
156
+ cmp
157
+ end
158
+
159
+ def match_digits(a)
160
+ a.match(/^([0-9]+)/)
161
+ end
162
+
163
+ def match_non_letters(a)
164
+ a.match(/^([\.\+-]+)/)
165
+ end
166
+
167
+ def match_tildes(a)
168
+ a.match(/^(~+)/)
169
+ end
170
+
171
+ def match_letters(a)
172
+ a.match(/^([A-Za-z]+)/)
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,15 @@
1
+ module Puppet::Util::Package::Version
2
+ class Gem < ::Gem::Version
3
+ def self.parse(version)
4
+ raise ValidationFailure, version unless version.is_a? String
5
+ raise ValidationFailure, version unless version =~ ANCHORED_VERSION_PATTERN
6
+ new(version)
7
+ end
8
+
9
+ class ValidationFailure < ArgumentError
10
+ def initialize(version)
11
+ super("#{version} is not a valid ruby gem version.")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,167 @@
1
+ module Puppet::Util::Package::Version
2
+ class Pip
3
+ include Comparable
4
+
5
+ VERSION_PATTERN = "
6
+ v?
7
+ (?:
8
+ (?:(?<epoch>[0-9]+)!)? # epoch
9
+ (?<release>[0-9]+(?:\\.[0-9]+)*) # release segment
10
+ (?<pre> # pre-release
11
+ [-_\\.]?
12
+ (?<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
13
+ [-_\\.]?
14
+ (?<pre_n>[0-9]+)?
15
+ )?
16
+ (?<post> # post release
17
+ (?:-(?<post_n1>[0-9]+))
18
+ |
19
+ (?:
20
+ [-_\\.]?
21
+ (?<post_l>post|rev|r)
22
+ [-_\\.]?
23
+ (?<post_n2>[0-9]+)?
24
+ )
25
+ )?
26
+ (?<dev> # dev release
27
+ [-_\\.]?
28
+ (?<dev_l>dev)
29
+ [-_\\.]?
30
+ (?<dev_n>[0-9]+)?
31
+ )?
32
+ )
33
+ (?:\\+(?<local>[a-z0-9]+(?:[-_\\.][a-z0-9]+)*))? # local version
34
+ ".freeze
35
+
36
+ def self.parse(version)
37
+ raise ValidationFailure, version.to_s unless version.is_a? String
38
+
39
+ matched = version.match(Regexp.new(("^\\s*") + VERSION_PATTERN + ("\\s*$"), Regexp::EXTENDED | Regexp::MULTILINE | Regexp::IGNORECASE))
40
+ raise ValidationFailure, version unless matched
41
+
42
+ new(matched)
43
+ end
44
+
45
+ def self.compare(version_a, version_b)
46
+ version_a = parse(version_a) unless version_a.is_a?(self)
47
+ version_b = parse(version_b) unless version_b.is_a?(self)
48
+
49
+ version_a <=> version_b
50
+ end
51
+
52
+ def to_s
53
+ parts = []
54
+
55
+ parts.push("#{@epoch_data}!") if @epoch_data && @epoch_data != 0
56
+ parts.push(@release_data.join(".")) if @release_data
57
+ parts.push(@pre_data.join) if @pre_data
58
+ parts.push(".post#{@post_data[1]}") if @post_data
59
+ parts.push(".dev#{@dev_data[1]}") if @dev_data
60
+ parts.push("+#{@local_data.join(".")}") if @local_data
61
+
62
+ parts.join
63
+ end
64
+ alias inspect to_s
65
+
66
+ def eql?(other)
67
+ other.is_a?(self.class) && key.eql?(other.key)
68
+ end
69
+ alias == eql?
70
+
71
+ def <=>(other)
72
+ raise ValidationFailure, other.to_s unless other.is_a?(self.class)
73
+ compare(key, other.key)
74
+ end
75
+
76
+ attr_reader :key
77
+
78
+ private
79
+
80
+ def initialize(matched)
81
+ @epoch_data = matched[:epoch].to_i
82
+ @release_data = matched[:release].split('.').map(&:to_i) if matched[:release]
83
+ @pre_data = parse_letter_version(matched[:pre_l], matched[:pre_n]) if matched[:pre_l] || matched[:pre_n]
84
+ @post_data = parse_letter_version(matched[:post_l], matched[:post_n1] || matched[:post_n2]) if matched[:post_l] || matched[:post_n1] || matched[:post_n2]
85
+ @dev_data = parse_letter_version(matched[:dev_l], matched[:dev_n]) if matched[:dev_l] || matched[:dev_n]
86
+ @local_data = parse_local_version(matched[:local]) if matched[:local]
87
+
88
+ @key = compose_key(@epoch_data, @release_data, @pre_data, @post_data, @dev_data, @local_data)
89
+ end
90
+
91
+ def parse_letter_version(letter, number)
92
+ if letter
93
+ number = 0 if !number
94
+ letter.downcase!
95
+
96
+ if letter == "alpha"
97
+ letter = "a"
98
+ elsif letter == "beta"
99
+ letter = "b"
100
+ elsif ["c", "pre", "preview"].include?(letter)
101
+ letter = "rc"
102
+ elsif ["rev", "r"].include?(letter)
103
+ letter = "post"
104
+ end
105
+
106
+ return [letter, number.to_i]
107
+ end
108
+
109
+ ["post", number.to_i] if !letter && number
110
+ end
111
+
112
+ def parse_local_version(local_version)
113
+ local_version.split(/[\\._-]/).map{|part| part =~ /[0-9]+/ && part !~ /[a-zA-Z]+/ ? part.to_i : part.downcase} if local_version
114
+ end
115
+
116
+ def compose_key(epoch, release, pre, post, dev, local)
117
+ release_key = release.reverse
118
+ release_key.each_with_index do |element, index|
119
+ break unless element == 0
120
+ release_key.delete_at(index) unless release_key.at(index + 1) != 0
121
+ end
122
+ release_key.reverse!
123
+
124
+ if !pre && !post && dev
125
+ pre_key = -Float::INFINITY
126
+ else
127
+ pre_key = pre || Float::INFINITY
128
+ end
129
+
130
+ post_key = post || -Float::INFINITY
131
+
132
+ dev_key = dev || Float::INFINITY
133
+
134
+ if !local
135
+ local_key = [[-Float::INFINITY, ""]]
136
+ else
137
+ local_key = local.map{|i| (i.is_a? Integer) ? [i, ""] : [-Float::INFINITY, i]}
138
+ end
139
+
140
+ [epoch, release_key, pre_key, post_key, dev_key, local_key]
141
+ end
142
+
143
+ def compare(this, other)
144
+ if (this.is_a? Array) && (other.is_a? Array)
145
+ this << -Float::INFINITY if this.length < other.length
146
+ other << -Float::INFINITY if this.length > other.length
147
+
148
+ this.each_with_index do |element, index|
149
+ return compare(element, other.at(index)) if element != other.at(index)
150
+ end
151
+ elsif (this.is_a? Array) && !(other.is_a? Array)
152
+ raise Puppet::Error, 'Cannot compare #{this} (Array) with #{other} (#{other.class}). Only ±Float::INFINITY accepted.' unless other.abs == Float::INFINITY
153
+ return other == -Float::INFINITY ? 1 : -1
154
+ elsif !(this.is_a? Array) && (other.is_a? Array)
155
+ raise Puppet::Error, 'Cannot compare #{this} (#{this.class}) with #{other} (Array). Only ±Float::INFINITY accepted.' unless this.abs == Float::INFINITY
156
+ return this == -Float::INFINITY ? -1 : 1
157
+ end
158
+ this <=> other
159
+ end
160
+
161
+ class ValidationFailure < ArgumentError
162
+ def initialize(version)
163
+ super("#{version} is not a valid python package version. Please refer to https://www.python.org/dev/peps/pep-0440/.")
164
+ end
165
+ end
166
+ end
167
+ end