puppet 6.14.0 → 6.19.0

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 (496) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +36 -34
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  7. data/ext/windows/service/daemon.rb +3 -3
  8. data/lib/puppet.rb +33 -9
  9. data/lib/puppet/agent.rb +20 -14
  10. data/lib/puppet/agent/locker.rb +0 -7
  11. data/lib/puppet/application/agent.rb +25 -9
  12. data/lib/puppet/application/apply.rb +18 -20
  13. data/lib/puppet/application/device.rb +1 -1
  14. data/lib/puppet/application/doc.rb +1 -1
  15. data/lib/puppet/application/filebucket.rb +5 -14
  16. data/lib/puppet/application/lookup.rb +16 -4
  17. data/lib/puppet/application/plugin.rb +1 -0
  18. data/lib/puppet/application/ssl.rb +3 -3
  19. data/lib/puppet/configurer.rb +68 -24
  20. data/lib/puppet/configurer/downloader.rb +31 -10
  21. data/lib/puppet/configurer/plugin_handler.rb +1 -1
  22. data/lib/puppet/confine.rb +2 -2
  23. data/lib/puppet/confine/any.rb +1 -1
  24. data/lib/puppet/context/trusted_information.rb +14 -8
  25. data/lib/puppet/daemon.rb +13 -27
  26. data/lib/puppet/defaults.rb +141 -41
  27. data/lib/puppet/environments.rb +55 -15
  28. data/lib/puppet/face/catalog.rb +1 -1
  29. data/lib/puppet/face/config.rb +46 -16
  30. data/lib/puppet/face/facts.rb +1 -1
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/node.rb +3 -3
  34. data/lib/puppet/face/node/clean.rb +2 -2
  35. data/lib/puppet/face/plugin.rb +2 -2
  36. data/lib/puppet/face/status.rb +1 -1
  37. data/lib/puppet/feature/base.rb +1 -1
  38. data/lib/puppet/file_bucket/dipper.rb +1 -1
  39. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  40. data/lib/puppet/file_serving/metadata.rb +4 -1
  41. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  42. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  43. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  44. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  45. data/lib/puppet/file_system/file_impl.rb +17 -13
  46. data/lib/puppet/file_system/uniquefile.rb +12 -16
  47. data/lib/puppet/forge.rb +1 -1
  48. data/lib/puppet/forge/cache.rb +1 -1
  49. data/lib/puppet/forge/repository.rb +4 -7
  50. data/lib/puppet/functions/call.rb +1 -1
  51. data/lib/puppet/functions/filter.rb +1 -0
  52. data/lib/puppet/functions/lstrip.rb +4 -4
  53. data/lib/puppet/functions/new.rb +8 -3
  54. data/lib/puppet/functions/reduce.rb +2 -4
  55. data/lib/puppet/functions/reverse_each.rb +1 -1
  56. data/lib/puppet/functions/rstrip.rb +4 -4
  57. data/lib/puppet/functions/step.rb +1 -1
  58. data/lib/puppet/functions/strip.rb +4 -4
  59. data/lib/puppet/gettext/config.rb +5 -5
  60. data/lib/puppet/gettext/module_translations.rb +4 -4
  61. data/lib/puppet/http.rb +3 -0
  62. data/lib/puppet/http/client.rb +215 -60
  63. data/lib/puppet/http/external_client.rb +90 -0
  64. data/lib/puppet/http/redirector.rb +43 -7
  65. data/lib/puppet/http/resolver.rb +43 -3
  66. data/lib/puppet/http/resolver/server_list.rb +66 -24
  67. data/lib/puppet/http/resolver/settings.rb +21 -1
  68. data/lib/puppet/http/resolver/srv.rb +28 -2
  69. data/lib/puppet/http/response.rb +82 -1
  70. data/lib/puppet/http/retry_after_handler.rb +39 -0
  71. data/lib/puppet/http/service.rb +70 -2
  72. data/lib/puppet/http/service/ca.rb +71 -9
  73. data/lib/puppet/http/service/compiler.rb +214 -12
  74. data/lib/puppet/http/service/file_server.rb +106 -5
  75. data/lib/puppet/http/service/puppetserver.rb +39 -0
  76. data/lib/puppet/http/service/report.rb +36 -3
  77. data/lib/puppet/http/session.rb +60 -8
  78. data/lib/puppet/indirector.rb +1 -1
  79. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  80. data/lib/puppet/indirector/catalog/rest.rb +2 -1
  81. data/lib/puppet/indirector/exec.rb +1 -1
  82. data/lib/puppet/indirector/facts/facter.rb +3 -3
  83. data/lib/puppet/indirector/facts/rest.rb +2 -1
  84. data/lib/puppet/indirector/facts/yaml.rb +1 -1
  85. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  86. data/lib/puppet/indirector/file_content/http.rb +5 -0
  87. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  88. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  89. data/lib/puppet/indirector/file_metadata/rest.rb +6 -4
  90. data/lib/puppet/indirector/hiera.rb +4 -0
  91. data/lib/puppet/indirector/indirection.rb +1 -1
  92. data/lib/puppet/indirector/json.rb +1 -1
  93. data/lib/puppet/indirector/msgpack.rb +1 -1
  94. data/lib/puppet/indirector/node/rest.rb +2 -1
  95. data/lib/puppet/indirector/report/processor.rb +2 -2
  96. data/lib/puppet/indirector/report/yaml.rb +23 -0
  97. data/lib/puppet/indirector/request.rb +5 -5
  98. data/lib/puppet/indirector/rest.rb +7 -1
  99. data/lib/puppet/indirector/status/rest.rb +2 -1
  100. data/lib/puppet/indirector/yaml.rb +1 -1
  101. data/lib/puppet/metatype/manager.rb +80 -80
  102. data/lib/puppet/module.rb +1 -2
  103. data/lib/puppet/network/format_support.rb +2 -2
  104. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  105. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  106. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  107. data/lib/puppet/network/http/base_pool.rb +6 -1
  108. data/lib/puppet/network/http/compression.rb +7 -0
  109. data/lib/puppet/network/http/connection.rb +2 -0
  110. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  111. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  112. data/lib/puppet/network/http/pool.rb +2 -4
  113. data/lib/puppet/network/http/route.rb +2 -2
  114. data/lib/puppet/network/http_pool.rb +2 -1
  115. data/lib/puppet/node/environment.rb +22 -5
  116. data/lib/puppet/node/facts.rb +17 -0
  117. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  118. data/lib/puppet/pal/pal_impl.rb +30 -31
  119. data/lib/puppet/parameter.rb +1 -1
  120. data/lib/puppet/parser/ast/leaf.rb +5 -5
  121. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  122. data/lib/puppet/parser/compiler.rb +43 -33
  123. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  124. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  125. data/lib/puppet/parser/environment_compiler.rb +4 -1
  126. data/lib/puppet/parser/functions.rb +18 -9
  127. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  128. data/lib/puppet/parser/functions/filter.rb +1 -0
  129. data/lib/puppet/parser/resource.rb +3 -2
  130. data/lib/puppet/parser/resource/param.rb +6 -0
  131. data/lib/puppet/parser/type_loader.rb +2 -2
  132. data/lib/puppet/pops/adaptable.rb +7 -13
  133. data/lib/puppet/pops/adapters.rb +8 -4
  134. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  135. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  136. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  137. data/lib/puppet/pops/issues.rb +5 -0
  138. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  139. data/lib/puppet/pops/loaders.rb +24 -15
  140. data/lib/puppet/pops/lookup/context.rb +1 -1
  141. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  143. data/lib/puppet/pops/types/iterable.rb +34 -8
  144. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  145. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  146. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  147. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  148. data/lib/puppet/provider/file/windows.rb +1 -1
  149. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  150. data/lib/puppet/provider/package/aix.rb +17 -2
  151. data/lib/puppet/provider/package/apt.rb +98 -1
  152. data/lib/puppet/provider/package/aptitude.rb +1 -1
  153. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  154. data/lib/puppet/provider/package/dpkg.rb +1 -1
  155. data/lib/puppet/provider/package/gem.rb +45 -9
  156. data/lib/puppet/provider/package/pacman.rb +2 -5
  157. data/lib/puppet/provider/package/pip.rb +143 -48
  158. data/lib/puppet/provider/package/pip2.rb +17 -0
  159. data/lib/puppet/provider/package/pip3.rb +0 -2
  160. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  161. data/lib/puppet/provider/package/pkgng.rb +16 -4
  162. data/lib/puppet/provider/package/portage.rb +2 -2
  163. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  164. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  165. data/lib/puppet/provider/package/rpm.rb +6 -213
  166. data/lib/puppet/provider/package/yum.rb +101 -20
  167. data/lib/puppet/provider/package/zypper.rb +62 -1
  168. data/lib/puppet/provider/service/systemd.rb +22 -4
  169. data/lib/puppet/provider/service/windows.rb +23 -7
  170. data/lib/puppet/provider/user/aix.rb +1 -1
  171. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  172. data/lib/puppet/provider/user/useradd.rb +16 -5
  173. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  174. data/lib/puppet/reports/http.rb +15 -9
  175. data/lib/puppet/resource.rb +2 -1
  176. data/lib/puppet/resource/type.rb +10 -1
  177. data/lib/puppet/resource/type_collection.rb +20 -16
  178. data/lib/puppet/rest/route.rb +2 -2
  179. data/lib/puppet/runtime.rb +25 -2
  180. data/lib/puppet/settings.rb +20 -6
  181. data/lib/puppet/ssl.rb +1 -0
  182. data/lib/puppet/ssl/host.rb +4 -4
  183. data/lib/puppet/ssl/oids.rb +1 -0
  184. data/lib/puppet/ssl/ssl_context.rb +2 -2
  185. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  186. data/lib/puppet/ssl/state_machine.rb +79 -37
  187. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  188. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  189. data/lib/puppet/test/test_helper.rb +19 -14
  190. data/lib/puppet/transaction.rb +2 -2
  191. data/lib/puppet/transaction/persistence.rb +1 -1
  192. data/lib/puppet/transaction/report.rb +14 -10
  193. data/lib/puppet/trusted_external.rb +29 -1
  194. data/lib/puppet/type.rb +21 -8
  195. data/lib/puppet/type/file.rb +40 -15
  196. data/lib/puppet/type/file/checksum.rb +4 -4
  197. data/lib/puppet/type/file/source.rb +35 -13
  198. data/lib/puppet/type/filebucket.rb +1 -1
  199. data/lib/puppet/type/notify.rb +2 -2
  200. data/lib/puppet/type/package.rb +41 -3
  201. data/lib/puppet/type/service.rb +59 -8
  202. data/lib/puppet/type/user.rb +19 -29
  203. data/lib/puppet/util.rb +41 -3
  204. data/lib/puppet/util/at_fork.rb +1 -1
  205. data/lib/puppet/util/autoload.rb +13 -25
  206. data/lib/puppet/util/character_encoding.rb +9 -5
  207. data/lib/puppet/util/checksums.rb +19 -4
  208. data/lib/puppet/util/connection.rb +8 -8
  209. data/lib/puppet/util/execution.rb +2 -2
  210. data/lib/puppet/util/fileparsing.rb +2 -2
  211. data/lib/puppet/util/instance_loader.rb +14 -10
  212. data/lib/puppet/util/log/destinations.rb +1 -10
  213. data/lib/puppet/util/package/version/debian.rb +175 -0
  214. data/lib/puppet/util/package/version/gem.rb +15 -0
  215. data/lib/puppet/util/package/version/pip.rb +167 -0
  216. data/lib/puppet/util/package/version/range.rb +53 -0
  217. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  218. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  219. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  220. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  221. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  222. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  223. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  224. data/lib/puppet/util/package/version/rpm.rb +73 -0
  225. data/lib/puppet/util/pidlock.rb +13 -7
  226. data/lib/puppet/util/platform.rb +5 -0
  227. data/lib/puppet/util/provider_features.rb +1 -1
  228. data/lib/puppet/util/reference.rb +1 -1
  229. data/lib/puppet/util/rpm_compare.rb +193 -0
  230. data/lib/puppet/util/run_mode.rb +5 -1
  231. data/lib/puppet/util/windows.rb +1 -0
  232. data/lib/puppet/util/windows/adsi.rb +2 -2
  233. data/lib/puppet/util/windows/api_types.rb +60 -33
  234. data/lib/puppet/util/windows/eventlog.rb +1 -6
  235. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  236. data/lib/puppet/util/windows/principal.rb +8 -6
  237. data/lib/puppet/util/windows/process.rb +15 -14
  238. data/lib/puppet/util/windows/registry.rb +11 -11
  239. data/lib/puppet/util/windows/security.rb +5 -4
  240. data/lib/puppet/util/windows/service.rb +43 -26
  241. data/lib/puppet/util/windows/sid.rb +3 -3
  242. data/lib/puppet/util/windows/user.rb +242 -8
  243. data/lib/puppet/version.rb +1 -1
  244. data/locales/puppet.pot +627 -507
  245. data/man/man5/puppet.conf.5 +93 -20
  246. data/man/man8/puppet-agent.8 +7 -4
  247. data/man/man8/puppet-apply.8 +1 -1
  248. data/man/man8/puppet-catalog.8 +1 -1
  249. data/man/man8/puppet-config.8 +6 -6
  250. data/man/man8/puppet-describe.8 +1 -1
  251. data/man/man8/puppet-device.8 +1 -1
  252. data/man/man8/puppet-doc.8 +1 -1
  253. data/man/man8/puppet-epp.8 +1 -1
  254. data/man/man8/puppet-facts.8 +1 -1
  255. data/man/man8/puppet-filebucket.8 +1 -1
  256. data/man/man8/puppet-generate.8 +1 -1
  257. data/man/man8/puppet-help.8 +6 -3
  258. data/man/man8/puppet-key.8 +1 -1
  259. data/man/man8/puppet-lookup.8 +2 -2
  260. data/man/man8/puppet-man.8 +1 -1
  261. data/man/man8/puppet-module.8 +4 -1
  262. data/man/man8/puppet-node.8 +4 -4
  263. data/man/man8/puppet-parser.8 +1 -1
  264. data/man/man8/puppet-plugin.8 +1 -1
  265. data/man/man8/puppet-report.8 +1 -1
  266. data/man/man8/puppet-resource.8 +1 -1
  267. data/man/man8/puppet-script.8 +1 -1
  268. data/man/man8/puppet-ssl.8 +1 -1
  269. data/man/man8/puppet-status.8 +2 -2
  270. data/man/man8/puppet.8 +2 -2
  271. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  272. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  273. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  274. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  275. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  276. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  277. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  278. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  279. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  280. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  281. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  282. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  283. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  284. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  285. data/spec/integration/application/agent_spec.rb +479 -0
  286. data/spec/integration/application/apply_spec.rb +279 -150
  287. data/spec/integration/application/config_spec.rb +74 -0
  288. data/spec/integration/application/doc_spec.rb +16 -6
  289. data/spec/integration/application/filebucket_spec.rb +239 -0
  290. data/spec/integration/application/help_spec.rb +42 -0
  291. data/spec/integration/application/lookup_spec.rb +13 -0
  292. data/spec/integration/application/module_spec.rb +68 -0
  293. data/spec/integration/application/plugin_spec.rb +123 -0
  294. data/spec/integration/configurer_spec.rb +14 -0
  295. data/spec/integration/data_binding_spec.rb +82 -0
  296. data/spec/integration/defaults_spec.rb +27 -3
  297. data/spec/integration/directory_environments_spec.rb +17 -17
  298. data/spec/integration/http/client_spec.rb +39 -40
  299. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  300. data/spec/integration/indirector/report/yaml.rb +83 -0
  301. data/spec/integration/network/http_pool_spec.rb +84 -19
  302. data/spec/integration/node/environment_spec.rb +15 -0
  303. data/spec/integration/parser/compiler_spec.rb +11 -0
  304. data/spec/integration/type/file_spec.rb +1 -1
  305. data/spec/integration/util/execution_spec.rb +22 -0
  306. data/spec/integration/util/windows/adsi_spec.rb +8 -3
  307. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  308. data/spec/integration/util/windows/process_spec.rb +26 -32
  309. data/spec/integration/util/windows/registry_spec.rb +7 -7
  310. data/spec/integration/util/windows/user_spec.rb +47 -5
  311. data/spec/integration/util_spec.rb +7 -33
  312. data/spec/lib/puppet/test_ca.rb +2 -2
  313. data/spec/lib/puppet_spec/https.rb +16 -7
  314. data/spec/lib/puppet_spec/matchers.rb +0 -80
  315. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  316. data/spec/shared_contexts/https.rb +29 -0
  317. data/spec/shared_contexts/types_setup.rb +2 -0
  318. data/spec/unit/agent_spec.rb +80 -26
  319. data/spec/unit/application/agent_spec.rb +12 -9
  320. data/spec/unit/application/device_spec.rb +2 -2
  321. data/spec/unit/application/doc_spec.rb +2 -2
  322. data/spec/unit/application/face_base_spec.rb +6 -4
  323. data/spec/unit/application/facts_spec.rb +41 -10
  324. data/spec/unit/application/filebucket_spec.rb +22 -2
  325. data/spec/unit/application/man_spec.rb +52 -0
  326. data/spec/unit/application/resource_spec.rb +3 -1
  327. data/spec/unit/application/ssl_spec.rb +15 -2
  328. data/spec/unit/application_spec.rb +9 -4
  329. data/spec/unit/configurer/downloader_spec.rb +10 -0
  330. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  331. data/spec/unit/configurer_spec.rb +87 -38
  332. data/spec/unit/confine_spec.rb +2 -1
  333. data/spec/unit/context/trusted_information_spec.rb +25 -2
  334. data/spec/unit/daemon_spec.rb +5 -64
  335. data/spec/unit/defaults_spec.rb +24 -1
  336. data/spec/unit/environments_spec.rb +107 -32
  337. data/spec/unit/face/config_spec.rb +59 -1
  338. data/spec/unit/face/module/search_spec.rb +17 -0
  339. data/spec/unit/face/node_spec.rb +2 -2
  340. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  341. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  342. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  343. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  344. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  345. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  346. data/spec/unit/file_system_spec.rb +11 -2
  347. data/spec/unit/http/client_spec.rb +173 -59
  348. data/spec/unit/http/external_client_spec.rb +201 -0
  349. data/spec/unit/http/resolver_spec.rb +44 -5
  350. data/spec/unit/http/response_spec.rb +6 -0
  351. data/spec/unit/http/service/ca_spec.rb +27 -5
  352. data/spec/unit/http/service/compiler_spec.rb +186 -9
  353. data/spec/unit/http/service/file_server_spec.rb +37 -6
  354. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  355. data/spec/unit/http/service/report_spec.rb +5 -4
  356. data/spec/unit/http/service_spec.rb +3 -4
  357. data/spec/unit/http/session_spec.rb +48 -12
  358. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  359. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  360. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  361. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  362. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  363. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  364. data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
  365. data/spec/unit/indirector/json_spec.rb +8 -8
  366. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  367. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  368. data/spec/unit/indirector/request_spec.rb +5 -5
  369. data/spec/unit/indirector/rest_spec.rb +14 -1
  370. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  371. data/spec/unit/indirector/yaml_spec.rb +7 -7
  372. data/spec/unit/interface_spec.rb +3 -3
  373. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  374. data/spec/unit/network/format_support_spec.rb +3 -2
  375. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  376. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  377. data/spec/unit/network/http/connection_spec.rb +552 -190
  378. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  379. data/spec/unit/network/http/pool_spec.rb +3 -3
  380. data/spec/unit/network/http_pool_spec.rb +63 -57
  381. data/spec/unit/network/http_spec.rb +1 -1
  382. data/spec/unit/node/environment_spec.rb +33 -0
  383. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  384. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  385. data/spec/unit/parser/scope_spec.rb +1 -1
  386. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  387. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  388. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  389. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  390. data/spec/unit/provider/exec_spec.rb +4 -3
  391. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  392. data/spec/unit/provider/package/aix_spec.rb +29 -0
  393. data/spec/unit/provider/package/apt_spec.rb +107 -0
  394. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  395. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  396. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  397. data/spec/unit/provider/package/gem_spec.rb +40 -0
  398. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  399. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  400. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  401. data/spec/unit/provider/package/pip_spec.rb +68 -19
  402. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  403. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  404. data/spec/unit/provider/package/portage_spec.rb +5 -0
  405. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  406. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  407. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  408. data/spec/unit/provider/package/yum_spec.rb +274 -1
  409. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  410. data/spec/unit/provider/service/base_spec.rb +2 -4
  411. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  412. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  413. data/spec/unit/provider/service/debian_spec.rb +3 -5
  414. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  415. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  416. data/spec/unit/provider/service/init_spec.rb +46 -5
  417. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  418. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  419. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  420. data/spec/unit/provider/service/openwrt_spec.rb +2 -1
  421. data/spec/unit/provider/service/redhat_spec.rb +10 -1
  422. data/spec/unit/provider/service/runit_spec.rb +2 -1
  423. data/spec/unit/provider/service/smf_spec.rb +1 -1
  424. data/spec/unit/provider/service/src_spec.rb +3 -5
  425. data/spec/unit/provider/service/systemd_spec.rb +95 -18
  426. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  427. data/spec/unit/provider/service/windows_spec.rb +50 -14
  428. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  429. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  430. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  431. data/spec/unit/puppet_pal_2pec.rb +11 -0
  432. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  433. data/spec/unit/puppet_spec.rb +33 -0
  434. data/spec/unit/reports/http_spec.rb +70 -52
  435. data/spec/unit/reports/store_spec.rb +17 -13
  436. data/spec/unit/resource_spec.rb +3 -3
  437. data/spec/unit/rest/route_spec.rb +4 -4
  438. data/spec/unit/settings_spec.rb +44 -22
  439. data/spec/unit/ssl/host_spec.rb +4 -2
  440. data/spec/unit/ssl/oids_spec.rb +1 -0
  441. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  442. data/spec/unit/ssl/state_machine_spec.rb +90 -14
  443. data/spec/unit/test/test_helper_spec.rb +17 -0
  444. data/spec/unit/transaction/persistence_spec.rb +15 -0
  445. data/spec/unit/transaction/report_spec.rb +7 -1
  446. data/spec/unit/type/file/source_spec.rb +4 -4
  447. data/spec/unit/type/file_spec.rb +122 -96
  448. data/spec/unit/type/filebucket_spec.rb +1 -1
  449. data/spec/unit/type/service_spec.rb +218 -8
  450. data/spec/unit/type/user_spec.rb +32 -3
  451. data/spec/unit/type_spec.rb +50 -0
  452. data/spec/unit/util/at_fork_spec.rb +2 -2
  453. data/spec/unit/util/autoload_spec.rb +2 -1
  454. data/spec/unit/util/character_encoding_spec.rb +4 -4
  455. data/spec/unit/util/checksums_spec.rb +16 -0
  456. data/spec/unit/util/command_line_spec.rb +11 -6
  457. data/spec/unit/util/log/destinations_spec.rb +1 -29
  458. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  459. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  460. data/spec/unit/util/package/version/range_spec.rb +175 -0
  461. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  462. data/spec/unit/util/pidlock_spec.rb +83 -47
  463. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  464. data/spec/unit/util/run_mode_spec.rb +6 -6
  465. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  466. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  467. data/spec/unit/util/windows/service_spec.rb +4 -4
  468. data/spec/unit/util/windows/sid_spec.rb +2 -2
  469. data/spec/unit/util_spec.rb +3 -3
  470. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  471. data/tasks/generate_cert_fixtures.rake +15 -1
  472. data/tasks/manpages.rake +5 -35
  473. metadata +90 -51
  474. data/spec/integration/faces/config_spec.rb +0 -91
  475. data/spec/integration/faces/documentation_spec.rb +0 -57
  476. data/spec/integration/faces/plugin_spec.rb +0 -63
  477. data/spec/integration/file_bucket/file_spec.rb +0 -50
  478. data/spec/integration/file_serving/content_spec.rb +0 -7
  479. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  480. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  481. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  482. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  483. data/spec/integration/module_tool/forge_spec.rb +0 -64
  484. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  485. data/spec/integration/provider/service/init_spec.rb +0 -48
  486. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  487. data/spec/integration/provider/service/windows_spec.rb +0 -50
  488. data/spec/integration/reference/providers_spec.rb +0 -21
  489. data/spec/integration/reports_spec.rb +0 -13
  490. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  491. data/spec/integration/ssl/host_spec.rb +0 -72
  492. data/spec/integration/ssl/key_spec.rb +0 -99
  493. data/spec/integration/test/test_helper_spec.rb +0 -31
  494. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  495. data/spec/unit/face/man_spec.rb +0 -25
  496. data/spec/unit/man_spec.rb +0 -31
@@ -19,8 +19,9 @@ module Puppet::Util::CharacterEncoding
19
19
  begin
20
20
  if original_encoding == Encoding::UTF_8
21
21
  if !string_copy.valid_encoding?
22
- Puppet.debug(_("%{value} is already labeled as UTF-8 but this encoding is invalid. It cannot be transcoded by Puppet.") %
23
- { value: string.dump })
22
+ Puppet.debug {
23
+ _("%{value} is already labeled as UTF-8 but this encoding is invalid. It cannot be transcoded by Puppet.") % { value: string.dump }
24
+ }
24
25
  end
25
26
  # String is already valid UTF-8 - noop
26
27
  return string_copy
@@ -40,8 +41,9 @@ module Puppet::Util::CharacterEncoding
40
41
  # Catch both our own self-determined failure to transcode as well as any
41
42
  # error on ruby's part, ie Encoding::UndefinedConversionError on a
42
43
  # failure to encode!.
43
- Puppet.debug(_("%{error}: %{value} cannot be transcoded by Puppet.") %
44
- { error: detail.inspect, value: string.dump })
44
+ Puppet.debug {
45
+ _("%{error}: %{value} cannot be transcoded by Puppet.") % { error: detail.inspect, value: string.dump }
46
+ }
45
47
  return string_copy
46
48
  end
47
49
  end
@@ -67,7 +69,9 @@ module Puppet::Util::CharacterEncoding
67
69
  if string_copy.force_encoding(Encoding::UTF_8).valid_encoding?
68
70
  return string_copy
69
71
  else
70
- Puppet.debug(_("%{value} is not valid UTF-8 and result of overriding encoding would be invalid.") % { value: string.dump })
72
+ Puppet.debug {
73
+ _("%{value} is not valid UTF-8 and result of overriding encoding would be invalid.") % { value: string.dump }
74
+ }
71
75
  # Set copy back to its original encoding before returning
72
76
  return string_copy.force_encoding(original_encoding)
73
77
  end
@@ -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)
@@ -8,7 +8,7 @@ module Puppet::Util
8
8
  # The logic for server and port is kind of gross. In summary:
9
9
  # IF an endpoint-specific setting is requested AND that setting has been set by the user
10
10
  # Use that setting.
11
- # The defaults for these settings are the "normal" server/masterport settings, so
11
+ # The defaults for these settings are the "normal" server/serverport settings, so
12
12
  # when they are unset we instead want to "fall back" to the failover-selected
13
13
  # host/port pair.
14
14
  # ELSE IF we have a failover-selected host/port
@@ -17,7 +17,7 @@ module Puppet::Util
17
17
  # Use the first entry - failover hasn't happened yet, but that
18
18
  # setting is still authoritative
19
19
  # ELSE
20
- # Go for the legacy server/masterport settings, and hope for the best
20
+ # Go for the legacy server/serverport settings, and hope for the best
21
21
 
22
22
  # Determines which server to use based on the specified setting, taking into
23
23
  # account HA fallback from server_list.
@@ -55,7 +55,7 @@ module Puppet::Util
55
55
  # @param [Symbol] server_setting The server setting assoicated with this route.
56
56
  # @return [Integer] the port to use for use in the request
57
57
  def self.determine_port(port_setting, server_setting)
58
- if (port_setting && port_setting != :masterport && Puppet.settings.set_by_config?(port_setting)) ||
58
+ if (port_setting && port_setting != :serverport && Puppet.settings.set_by_config?(port_setting)) ||
59
59
  (server_setting && server_setting != :server && Puppet.settings.set_by_config?(server_setting))
60
60
  debug_once _("Selected port from the %{setting} setting: %{port}") % {setting: port_setting, port: Puppet.settings[port_setting].to_i}
61
61
  Puppet.settings[port_setting].to_i
@@ -65,18 +65,18 @@ module Puppet::Util
65
65
  if primary_server
66
66
  # Port might not be set, so we want to fallback in that
67
67
  # case. We know we don't need to use `setting` here, since
68
- # the default value of every port setting is `masterport`
68
+ # the default value of every port setting is `serverport`
69
69
  if primary_server[1]
70
70
  #TRANSLATORS 'server_list' is the name of a setting and should not be translated
71
71
  debug_once _("Dynamically-bound port lookup failed; using first entry from the `server_list` setting: %{port}") % {port: primary_server[1]}
72
72
  primary_server[1]
73
73
  else
74
- #TRANSLATORS 'masterport' is the name of a setting and should not be translated
75
- debug_once _("Dynamically-bound port lookup failed; falling back to `masterport` setting: %{port}") % {port: Puppet.settings[:masterport]}
76
- Puppet.settings[:masterport]
74
+ #TRANSLATORS 'serverport' is the name of a setting and should not be translated
75
+ debug_once _("Dynamically-bound port lookup failed; falling back to `serverport` setting: %{port}") % {port: Puppet.settings[:serverport]}
76
+ Puppet.settings[:serverport]
77
77
  end
78
78
  else
79
- port_setting ||= :masterport
79
+ port_setting ||= :serverport
80
80
  debug_once _("Dynamically-bound port lookup failed; falling back to %{setting} setting: %{port}") % {setting: port_setting, port: Puppet.settings[port_setting]}
81
81
  Puppet.settings[port_setting]
82
82
  end
@@ -68,7 +68,7 @@ module Puppet::Util::Execution
68
68
  if respond_to? :debug
69
69
  debug "Executing '#{command_str}'"
70
70
  else
71
- Puppet.debug "Executing '#{command_str}'"
71
+ Puppet.debug { "Executing '#{command_str}'" }
72
72
  end
73
73
 
74
74
  # force the run of the command with
@@ -186,7 +186,7 @@ module Puppet::Util::Execution
186
186
  if respond_to? :debug
187
187
  debug "Executing#{user_log_s}: '#{command_str}'"
188
188
  else
189
- Puppet.debug "Executing#{user_log_s}: '#{command_str}'"
189
+ Puppet.debug { "Executing#{user_log_s}: '#{command_str}'" }
190
190
  end
191
191
 
192
192
  null_file = Puppet::Util::Platform.windows? ? 'NUL' : '/dev/null'
@@ -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
@@ -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