puppet 4.5.3-universal-darwin → 4.6.1-universal-darwin

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 (422) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -1
  3. data/ext/debian/control +2 -4
  4. data/ext/project_data.yaml +4 -4
  5. data/install.rb +6 -2
  6. data/lib/puppet.rb +3 -1
  7. data/lib/puppet/agent/locker.rb +1 -1
  8. data/lib/puppet/application.rb +6 -4
  9. data/lib/puppet/application/agent.rb +2 -1
  10. data/lib/puppet/application/cert.rb +35 -2
  11. data/lib/puppet/application/device.rb +1 -1
  12. data/lib/puppet/application/generate.rb +5 -0
  13. data/lib/puppet/application/lookup.rb +3 -3
  14. data/lib/puppet/application_support.rb +1 -1
  15. data/lib/puppet/compilable_resource_type.rb +15 -0
  16. data/lib/puppet/configurer.rb +67 -10
  17. data/lib/puppet/configurer/plugin_handler.rb +2 -4
  18. data/lib/puppet/data_providers/hiera_config.rb +1 -1
  19. data/lib/puppet/defaults.rb +34 -7
  20. data/lib/puppet/environments.rb +4 -2
  21. data/lib/puppet/error.rb +1 -1
  22. data/lib/puppet/external/dot.rb +1 -1
  23. data/lib/puppet/face/ca.rb +4 -1
  24. data/lib/puppet/face/certificate.rb +7 -1
  25. data/lib/puppet/face/epp.rb +5 -5
  26. data/lib/puppet/face/generate.rb +64 -0
  27. data/lib/puppet/face/help.rb +19 -13
  28. data/lib/puppet/face/man.rb +1 -1
  29. data/lib/puppet/feature/external_facts.rb +1 -1
  30. data/lib/puppet/file_system.rb +16 -0
  31. data/lib/puppet/file_system/file_impl.rb +5 -0
  32. data/lib/puppet/file_system/memory_impl.rb +4 -0
  33. data/lib/puppet/file_system/path_pattern.rb +1 -0
  34. data/lib/puppet/file_system/windows.rb +19 -0
  35. data/lib/puppet/functions.rb +3 -5
  36. data/lib/puppet/functions/assert_type.rb +1 -1
  37. data/lib/puppet/functions/defined.rb +7 -5
  38. data/lib/puppet/functions/dig.rb +2 -18
  39. data/lib/puppet/functions/hiera.rb +1 -1
  40. data/lib/puppet/functions/lest.rb +1 -37
  41. data/lib/puppet/functions/new.rb +2 -473
  42. data/lib/puppet/functions/reverse_each.rb +2 -59
  43. data/lib/puppet/functions/scanf.rb +4 -4
  44. data/lib/puppet/functions/step.rb +1 -63
  45. data/lib/puppet/functions/then.rb +1 -61
  46. data/lib/puppet/functions/type.rb +1 -40
  47. data/lib/puppet/functions/unwrap.rb +40 -0
  48. data/lib/puppet/generate/models/type/property.rb +70 -0
  49. data/lib/puppet/generate/models/type/type.rb +57 -0
  50. data/lib/puppet/generate/templates/type/pcore.erb +41 -0
  51. data/lib/puppet/generate/type.rb +239 -0
  52. data/lib/puppet/graph/simple_graph.rb +2 -6
  53. data/lib/puppet/indirector/catalog/static_compiler.rb +5 -2
  54. data/lib/puppet/indirector/facts/facter.rb +1 -1
  55. data/lib/puppet/indirector/key/ca.rb +2 -2
  56. data/lib/puppet/indirector/request.rb +25 -4
  57. data/lib/puppet/indirector/rest.rb +73 -3
  58. data/lib/puppet/info_service/class_information_service.rb +1 -2
  59. data/lib/puppet/interface/documentation.rb +1 -1
  60. data/lib/puppet/loaders.rb +2 -0
  61. data/lib/puppet/metatype/manager.rb +6 -6
  62. data/lib/puppet/module.rb +8 -1
  63. data/lib/puppet/module_tool.rb +2 -2
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  66. data/lib/puppet/module_tool/metadata.rb +1 -1
  67. data/lib/puppet/network/http/api/indirected_routes.rb +23 -32
  68. data/lib/puppet/network/http/rack/rest.rb +15 -1
  69. data/lib/puppet/network/rights.rb +1 -11
  70. data/lib/puppet/node/environment.rb +7 -3
  71. data/lib/puppet/node/facts.rb +1 -1
  72. data/lib/puppet/parameter.rb +23 -3
  73. data/lib/puppet/parameter/boolean.rb +1 -1
  74. data/lib/puppet/parameter/value.rb +1 -1
  75. data/lib/puppet/parser.rb +0 -1
  76. data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
  77. data/lib/puppet/parser/ast/resource.rb +5 -0
  78. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  79. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  80. data/lib/puppet/parser/compiler.rb +14 -17
  81. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +1 -1
  82. data/lib/puppet/parser/environment_compiler.rb +10 -0
  83. data/lib/puppet/parser/functions/create_resources.rb +39 -24
  84. data/lib/puppet/parser/functions/defined.rb +2 -26
  85. data/lib/puppet/parser/functions/dig.rb +29 -0
  86. data/lib/puppet/parser/functions/lest.rb +49 -0
  87. data/lib/puppet/parser/functions/new.rb +530 -0
  88. data/lib/puppet/parser/functions/require.rb +1 -1
  89. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  90. data/lib/puppet/parser/functions/scanf.rb +4 -4
  91. data/lib/puppet/parser/functions/step.rb +84 -0
  92. data/lib/puppet/parser/functions/then.rb +73 -0
  93. data/lib/puppet/parser/functions/type.rb +53 -0
  94. data/lib/puppet/parser/resource.rb +16 -7
  95. data/lib/puppet/parser/scope.rb +36 -28
  96. data/lib/puppet/parser/type_loader.rb +1 -1
  97. data/lib/puppet/plugins/data_providers/data_provider.rb +1 -1
  98. data/lib/puppet/pops.rb +13 -0
  99. data/lib/puppet/pops/adapters.rb +49 -49
  100. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  101. data/lib/puppet/pops/evaluator/access_operator.rb +39 -2
  102. data/lib/puppet/pops/evaluator/closure.rb +39 -13
  103. data/lib/puppet/pops/evaluator/collector_transformer.rb +10 -1
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +16 -11
  105. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  106. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +0 -1
  107. data/lib/puppet/pops/evaluator/literal_evaluator.rb +0 -1
  108. data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -2
  109. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  110. data/lib/puppet/pops/evaluator/runtime3_support.rb +19 -45
  111. data/lib/puppet/pops/functions/function.rb +5 -0
  112. data/lib/puppet/pops/issues.rb +1 -1
  113. data/lib/puppet/pops/label_provider.rb +2 -2
  114. data/lib/puppet/pops/loader/base_loader.rb +12 -15
  115. data/lib/puppet/pops/loader/loader.rb +15 -50
  116. data/lib/puppet/pops/loader/loader_paths.rb +28 -2
  117. data/lib/puppet/pops/loader/module_loaders.rb +16 -1
  118. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  119. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +12 -11
  120. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  121. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +2 -3
  122. data/lib/puppet/pops/loader/runtime3_type_loader.rb +52 -13
  123. data/lib/puppet/pops/loader/static_loader.rb +55 -0
  124. data/lib/puppet/pops/loader/type_definition_instantiator.rb +30 -14
  125. data/lib/puppet/pops/loader/typed_name.rb +50 -0
  126. data/lib/puppet/pops/loaders.rb +64 -19
  127. data/lib/puppet/pops/merge_strategy.rb +7 -7
  128. data/lib/puppet/pops/migration/migration_checker.rb +4 -0
  129. data/lib/puppet/pops/model/model_label_provider.rb +2 -0
  130. data/lib/puppet/pops/parser/egrammar.ra +8 -5
  131. data/lib/puppet/pops/parser/eparser.rb +1550 -1498
  132. data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
  133. data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
  134. data/lib/puppet/pops/parser/lexer2.rb +14 -1
  135. data/lib/puppet/pops/parser/locator.rb +30 -1
  136. data/lib/puppet/pops/parser/parser_support.rb +0 -3
  137. data/lib/puppet/pops/parser/slurp_support.rb +3 -3
  138. data/lib/puppet/pops/patterns.rb +9 -1
  139. data/lib/puppet/pops/pcore.rb +67 -11
  140. data/lib/puppet/pops/puppet_stack.rb +43 -0
  141. data/lib/puppet/pops/resource/param.rb +51 -0
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +301 -0
  143. data/lib/puppet/pops/resource/resource_type_set.pcore +21 -0
  144. data/lib/puppet/pops/serialization.rb +17 -0
  145. data/lib/puppet/pops/serialization/abstract_reader.rb +149 -0
  146. data/lib/puppet/pops/serialization/abstract_writer.rb +179 -0
  147. data/lib/puppet/pops/serialization/deserializer.rb +60 -0
  148. data/lib/puppet/pops/serialization/extension.rb +126 -0
  149. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  150. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  151. data/lib/puppet/pops/serialization/json.rb +247 -0
  152. data/lib/puppet/pops/serialization/object.rb +63 -0
  153. data/lib/puppet/pops/serialization/rgen.rb +151 -0
  154. data/lib/puppet/pops/serialization/serializer.rb +91 -0
  155. data/lib/puppet/pops/serialization/time_factory.rb +66 -0
  156. data/lib/puppet/pops/types/annotatable.rb +36 -0
  157. data/lib/puppet/pops/types/implementation_registry.rb +3 -8
  158. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  159. data/lib/puppet/pops/types/p_object_type.rb +110 -117
  160. data/lib/puppet/pops/types/p_runtime_type.rb +13 -0
  161. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +23 -0
  162. data/lib/puppet/pops/types/p_sem_ver_type.rb +30 -2
  163. data/lib/puppet/pops/types/p_sensitive_type.rb +69 -0
  164. data/lib/puppet/pops/types/p_type_set_type.rb +361 -0
  165. data/lib/puppet/pops/types/puppet_object.rb +0 -5
  166. data/lib/puppet/pops/types/ruby_generator.rb +9 -2
  167. data/lib/puppet/pops/types/type_calculator.rb +6 -1
  168. data/lib/puppet/pops/types/type_factory.rb +14 -12
  169. data/lib/puppet/pops/types/type_formatter.rb +78 -33
  170. data/lib/puppet/pops/types/type_mismatch_describer.rb +0 -2
  171. data/lib/puppet/pops/types/type_parser.rb +27 -2
  172. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  173. data/lib/puppet/pops/types/types.rb +366 -13
  174. data/lib/puppet/pops/validation.rb +4 -4
  175. data/lib/puppet/pops/validation/checker4_0.rb +5 -2
  176. data/lib/puppet/pops/visitor.rb +2 -2
  177. data/lib/puppet/property.rb +64 -5
  178. data/lib/puppet/provider.rb +1 -1
  179. data/lib/puppet/provider/aixobject.rb +3 -3
  180. data/lib/puppet/provider/group/aix.rb +4 -4
  181. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  182. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  183. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -2
  184. data/lib/puppet/provider/mount/parsed.rb +1 -1
  185. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
  186. data/lib/puppet/provider/package/appdmg.rb +3 -3
  187. data/lib/puppet/provider/package/apple.rb +1 -1
  188. data/lib/puppet/provider/package/dnf.rb +5 -0
  189. data/lib/puppet/provider/package/nim.rb +1 -1
  190. data/lib/puppet/provider/package/pacman.rb +2 -2
  191. data/lib/puppet/provider/package/pip.rb +5 -3
  192. data/lib/puppet/provider/package/pip3.rb +1 -1
  193. data/lib/puppet/provider/package/pkg.rb +5 -5
  194. data/lib/puppet/provider/package/pkgdmg.rb +4 -4
  195. data/lib/puppet/provider/package/pkgin.rb +1 -1
  196. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  197. data/lib/puppet/provider/package/portage.rb +48 -8
  198. data/lib/puppet/provider/package/sun.rb +1 -1
  199. data/lib/puppet/provider/package/tdnf.rb +28 -0
  200. data/lib/puppet/provider/package/yum.rb +22 -4
  201. data/lib/puppet/provider/parsedfile.rb +2 -2
  202. data/lib/puppet/provider/service/base.rb +1 -1
  203. data/lib/puppet/provider/service/bsd.rb +1 -1
  204. data/lib/puppet/provider/service/daemontools.rb +2 -2
  205. data/lib/puppet/provider/service/debian.rb +3 -3
  206. data/lib/puppet/provider/service/init.rb +5 -3
  207. data/lib/puppet/provider/service/launchd.rb +16 -2
  208. data/lib/puppet/provider/service/runit.rb +1 -1
  209. data/lib/puppet/provider/service/smf.rb +8 -1
  210. data/lib/puppet/provider/service/systemd.rb +39 -6
  211. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +3 -2
  213. data/lib/puppet/provider/user/directoryservice.rb +4 -3
  214. data/lib/puppet/provider/user/hpux.rb +1 -1
  215. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  216. data/lib/puppet/provider/user/windows_adsi.rb +3 -0
  217. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  218. data/lib/puppet/reference/type.rb +1 -1
  219. data/lib/puppet/resource.rb +33 -7
  220. data/lib/puppet/resource/capability_finder.rb +74 -54
  221. data/lib/puppet/resource/status.rb +11 -2
  222. data/lib/puppet/settings.rb +17 -6
  223. data/lib/puppet/settings/environment_conf.rb +1 -1
  224. data/lib/puppet/settings/server_list_setting.rb +20 -0
  225. data/lib/puppet/ssl/certificate_authority.rb +32 -9
  226. data/lib/puppet/ssl/certificate_authority/interface.rb +164 -24
  227. data/lib/puppet/ssl/host.rb +3 -3
  228. data/lib/puppet/ssl/oids.rb +10 -0
  229. data/lib/puppet/ssl/validator/default_validator.rb +2 -2
  230. data/lib/puppet/test/test_helper.rb +2 -2
  231. data/lib/puppet/transaction.rb +12 -0
  232. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  233. data/lib/puppet/transaction/event.rb +29 -2
  234. data/lib/puppet/transaction/event_manager.rb +1 -1
  235. data/lib/puppet/transaction/persistence.rb +84 -0
  236. data/lib/puppet/transaction/report.rb +49 -2
  237. data/lib/puppet/transaction/resource_harness.rb +98 -18
  238. data/lib/puppet/type.rb +63 -21
  239. data/lib/puppet/type/augeas.rb +3 -3
  240. data/lib/puppet/type/cron.rb +1 -1
  241. data/lib/puppet/type/file.rb +39 -2
  242. data/lib/puppet/type/file/data_sync.rb +13 -5
  243. data/lib/puppet/type/host.rb +1 -1
  244. data/lib/puppet/type/mount.rb +2 -6
  245. data/lib/puppet/type/notify.rb +1 -1
  246. data/lib/puppet/type/package.rb +1 -1
  247. data/lib/puppet/type/resources.rb +1 -1
  248. data/lib/puppet/type/scheduled_task.rb +1 -1
  249. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  250. data/lib/puppet/type/tidy.rb +1 -1
  251. data/lib/puppet/type/yumrepo.rb +3 -3
  252. data/lib/puppet/type/zone.rb +1 -1
  253. data/lib/puppet/util.rb +2 -2
  254. data/lib/puppet/util/classgen.rb +1 -1
  255. data/lib/puppet/util/command_line.rb +6 -2
  256. data/lib/puppet/util/command_line/trollop.rb +1 -1
  257. data/lib/puppet/util/execution.rb +2 -2
  258. data/lib/puppet/util/http_proxy.rb +1 -1
  259. data/lib/puppet/util/inifile.rb +1 -1
  260. data/lib/puppet/util/instance_loader.rb +1 -1
  261. data/lib/puppet/util/logging.rb +1 -1
  262. data/lib/puppet/util/multi_match.rb +1 -1
  263. data/lib/puppet/util/plist.rb +15 -5
  264. data/lib/puppet/util/profiler.rb +1 -1
  265. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  266. data/lib/puppet/util/psych_support.rb +1 -1
  267. data/lib/puppet/util/rdoc.rb +2 -2
  268. data/lib/puppet/util/rubygems.rb +1 -1
  269. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  270. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  271. data/lib/puppet/util/windows/adsi.rb +30 -8
  272. data/lib/puppet/util/windows/api_types.rb +1 -1
  273. data/lib/puppet/util/windows/file.rb +59 -0
  274. data/lib/puppet/util/windows/process.rb +10 -0
  275. data/lib/puppet/util/windows/security.rb +1 -1
  276. data/lib/puppet/util/windows/user.rb +22 -4
  277. data/lib/puppet/util/yaml.rb +15 -3
  278. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  279. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  280. data/lib/puppet/version.rb +2 -2
  281. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  282. data/spec/integration/agent/logging_spec.rb +15 -14
  283. data/spec/integration/application/apply_spec.rb +1 -0
  284. data/spec/integration/directory_environments_spec.rb +16 -0
  285. data/spec/integration/environments/settings_spec.rb +32 -4
  286. data/spec/integration/faces/documentation_spec.rb +1 -1
  287. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  288. data/spec/integration/node/environment_spec.rb +21 -0
  289. data/spec/integration/parser/collection_spec.rb +10 -0
  290. data/spec/integration/parser/compiler_spec.rb +76 -840
  291. data/spec/integration/parser/functions/require_spec.rb +3 -3
  292. data/spec/integration/parser/parameter_defaults_spec.rb +6 -2
  293. data/spec/integration/parser/pcore_resource_spec.rb +208 -0
  294. data/spec/integration/parser/resource_expressions_spec.rb +4 -2
  295. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  296. data/spec/integration/transaction/report_spec.rb +666 -0
  297. data/spec/integration/type/file_spec.rb +11 -12
  298. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  299. data/spec/integration/util/windows/principal_spec.rb +109 -60
  300. data/spec/integration/util/windows/process_spec.rb +4 -2
  301. data/spec/integration/util/windows/security_spec.rb +34 -8
  302. data/spec/integration/util/windows/user_spec.rb +26 -4
  303. data/spec/lib/puppet_spec/files.rb +2 -2
  304. data/spec/lib/puppet_spec/network.rb +12 -8
  305. data/spec/shared_examples/rhel_package_provider.rb +341 -0
  306. data/spec/spec_helper.rb +8 -2
  307. data/spec/unit/application/cert_spec.rb +20 -0
  308. data/spec/unit/configurer/plugin_handler_spec.rb +0 -26
  309. data/spec/unit/configurer_spec.rb +46 -0
  310. data/spec/unit/defaults_spec.rb +14 -0
  311. data/spec/unit/face/generate_spec.rb +230 -0
  312. data/spec/unit/face/help_spec.rb +53 -0
  313. data/spec/unit/face/parser_spec.rb +6 -0
  314. data/spec/unit/face/plugin_spec.rb +0 -4
  315. data/spec/unit/file_system_spec.rb +85 -0
  316. data/spec/unit/functions/lookup_spec.rb +4 -4
  317. data/spec/unit/functions/match_spec.rb +2 -2
  318. data/spec/unit/functions/regsubst_spec.rb +1 -1
  319. data/spec/unit/functions/split_spec.rb +1 -1
  320. data/spec/unit/functions/unwrap_spec.rb +29 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +8 -8
  323. data/spec/unit/indirector/facts/facter_spec.rb +1 -9
  324. data/spec/unit/indirector/rest_spec.rb +95 -9
  325. data/spec/unit/module_spec.rb +43 -7
  326. data/spec/unit/module_tool/applications/installer_spec.rb +10 -1
  327. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  328. data/spec/unit/module_tool/applications/upgrader_spec.rb +8 -0
  329. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  330. data/spec/unit/network/http/api/indirected_routes_spec.rb +49 -58
  331. data/spec/unit/network/http/api/master/v3_spec.rb +7 -4
  332. data/spec/unit/network/rights_spec.rb +1 -1
  333. data/spec/unit/parameter_spec.rb +11 -0
  334. data/spec/unit/parser/compiler_spec.rb +19 -33
  335. data/spec/unit/{appmgmt_spec.rb → parser/environment_compiler_spec.rb} +12 -1
  336. data/spec/unit/parser/functions/create_resources_spec.rb +76 -4
  337. data/spec/unit/parser/functions/require_spec.rb +2 -2
  338. data/spec/unit/parser/resource_spec.rb +21 -11
  339. data/spec/unit/parser/scope_spec.rb +1 -5
  340. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1 -1
  341. data/spec/unit/pops/loaders/dependency_loader_spec.rb +1 -1
  342. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  343. data/spec/unit/pops/loaders/loaders_spec.rb +63 -5
  344. data/spec/unit/pops/loaders/module_loaders_spec.rb +2 -2
  345. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  346. data/spec/unit/pops/parser/lexer2_spec.rb +27 -3
  347. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +8 -0
  348. data/spec/unit/pops/parser/parse_calls_spec.rb +9 -0
  349. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  350. data/spec/unit/pops/resource/resource_type_impl_spec.rb +37 -0
  351. data/spec/unit/pops/serialization/packer_spec.rb +153 -0
  352. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  353. data/spec/unit/pops/serialization/serialization_spec.rb +228 -0
  354. data/spec/unit/pops/types/p_object_type_spec.rb +44 -2
  355. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +42 -0
  356. data/spec/unit/pops/types/p_sensitive_type_spec.rb +139 -0
  357. data/spec/unit/pops/types/p_type_set_type_spec.rb +424 -0
  358. data/spec/unit/pops/types/ruby_generator_spec.rb +497 -181
  359. data/spec/unit/pops/types/type_calculator_spec.rb +10 -4
  360. data/spec/unit/pops/types/type_formatter_spec.rb +1 -1
  361. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
  362. data/spec/unit/pops/types/type_parser_spec.rb +1 -1
  363. data/spec/unit/pops/types/types_spec.rb +1 -1
  364. data/spec/unit/pops/validator/validator_spec.rb +18 -1
  365. data/spec/unit/property_spec.rb +48 -11
  366. data/spec/unit/provider/group/windows_adsi_spec.rb +11 -1
  367. data/spec/unit/provider/package/dnf_spec.rb +1 -99
  368. data/spec/unit/provider/package/pacman_spec.rb +4 -4
  369. data/spec/unit/provider/package/pip_spec.rb +14 -0
  370. data/spec/unit/provider/package/pkg_spec.rb +6 -0
  371. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -3
  372. data/spec/unit/provider/package/portage_spec.rb +64 -8
  373. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  374. data/spec/unit/provider/package/windows/package_spec.rb +4 -1
  375. data/spec/unit/provider/package/windows_spec.rb +8 -2
  376. data/spec/unit/provider/package/yum_spec.rb +6 -377
  377. data/spec/unit/provider/service/base_spec.rb +6 -0
  378. data/spec/unit/provider/service/debian_spec.rb +16 -7
  379. data/spec/unit/provider/service/gentoo_spec.rb +6 -0
  380. data/spec/unit/provider/service/init_spec.rb +7 -0
  381. data/spec/unit/provider/service/launchd_spec.rb +35 -4
  382. data/spec/unit/provider/service/openrc_spec.rb +6 -0
  383. data/spec/unit/provider/service/smf_spec.rb +31 -6
  384. data/spec/unit/provider/service/src_spec.rb +6 -0
  385. data/spec/unit/provider/service/systemd_spec.rb +70 -20
  386. data/spec/unit/provider/service/upstart_spec.rb +6 -0
  387. data/spec/unit/provider/user/aix_spec.rb +7 -0
  388. data/spec/unit/provider/user/directoryservice_spec.rb +30 -1
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +19 -0
  390. data/spec/unit/resource/capability_finder_spec.rb +51 -3
  391. data/spec/unit/resource/catalog_spec.rb +5 -0
  392. data/spec/unit/resource/type_spec.rb +2 -2
  393. data/spec/unit/resource_spec.rb +19 -0
  394. data/spec/unit/settings_spec.rb +13 -0
  395. data/spec/unit/ssl/certificate_authority/interface_spec.rb +176 -10
  396. data/spec/unit/ssl/certificate_authority_spec.rb +63 -22
  397. data/spec/unit/ssl/host_spec.rb +1 -1
  398. data/spec/unit/ssl/oids_spec.rb +24 -21
  399. data/spec/unit/transaction/event_spec.rb +3 -1
  400. data/spec/unit/transaction/persistence_spec.rb +173 -0
  401. data/spec/unit/transaction/report_spec.rb +64 -1
  402. data/spec/unit/transaction/resource_harness_spec.rb +91 -0
  403. data/spec/unit/type/file/content_spec.rb +47 -15
  404. data/spec/unit/type/file_spec.rb +28 -0
  405. data/spec/unit/type/mount_spec.rb +5 -12
  406. data/spec/unit/type/yumrepo_spec.rb +1 -5
  407. data/spec/unit/type_spec.rb +32 -0
  408. data/spec/unit/util/command_line_spec.rb +11 -0
  409. data/spec/unit/util/execution_spec.rb +1 -1
  410. data/spec/unit/util/plist_spec.rb +16 -3
  411. data/spec/unit/util/storage_spec.rb +4 -1
  412. data/spec/unit/util/windows/adsi_spec.rb +23 -2
  413. data/spec/unit/util/windows/file_spec.rb +56 -1
  414. data/spec/unit/util/windows/sid_spec.rb +31 -7
  415. data/spec/unit/util/yaml_spec.rb +12 -0
  416. data/spec/unit/util_spec.rb +87 -20
  417. metadata +89 -34
  418. data/ext/puppetlisten/puppetlisten.rb +0 -77
  419. data/ext/puppetlisten/puppetrun.rb +0 -38
  420. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  421. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  422. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
@@ -2,5 +2,9 @@
2
2
  # title and a set of parameters.
3
3
  #
4
4
  class Puppet::Parser::AST::ResourceInstance < Puppet::Parser::AST::Branch
5
- attr_accessor :title, :parameters
5
+ attr_accessor :title, :parameters
6
+ def initialize(argshash)
7
+ Puppet.warn_once('deprecation', 'AST::ResourceInstance', 'Use of Puppet::Parser::AST::ResourceInstance is deprecated')
8
+ super(argshash)
9
+ end
6
10
  end
@@ -3,6 +3,11 @@
3
3
  class Puppet::Parser::AST::ResourceParam < Puppet::Parser::AST::Branch
4
4
  attr_accessor :value, :param, :add
5
5
 
6
+ def initialize(argshash)
7
+ Puppet.warn_once('deprecation', 'AST::ResourceParam', 'Use of Puppet::Parser::AST::ResourceParam is deprecated and not fully functional')
8
+ super(argshash)
9
+ end
10
+
6
11
  def each
7
12
  [@param, @value].each { |child| yield child }
8
13
  end
@@ -4,7 +4,6 @@ require 'puppet/node'
4
4
  require 'puppet/resource/catalog'
5
5
  require 'puppet/util/errors'
6
6
 
7
- require 'puppet/resource/type_collection_helper'
8
7
  require 'puppet/loaders'
9
8
  require 'puppet/pops'
10
9
 
@@ -16,7 +15,6 @@ class Puppet::Parser::Compiler
16
15
  include Puppet::Util
17
16
  include Puppet::Util::Errors
18
17
  include Puppet::Util::MethodHelper
19
- include Puppet::Resource::TypeCollectionHelper
20
18
  include Puppet::Pops::Evaluator::Runtime3Support
21
19
 
22
20
  def self.compile(node, code_id = nil)
@@ -139,9 +137,6 @@ class Puppet::Parser::Compiler
139
137
  end
140
138
  end
141
139
 
142
- # Do we use nodes found in the code, vs. the external node sources?
143
- def_delegator :known_resource_types, :nodes?, :ast_nodes?
144
-
145
140
  # Store the fact that we've evaluated a class
146
141
  def add_class(name)
147
142
  @catalog.add_class(name) unless name == ""
@@ -267,7 +262,7 @@ class Puppet::Parser::Compiler
267
262
  def evaluate_site
268
263
  # Has a site been defined? If not, do nothing but issue a warning.
269
264
  #
270
- site = known_resource_types.find_site()
265
+ site = environment.known_resource_types.find_site()
271
266
  unless site
272
267
  on_empty_site()
273
268
  return
@@ -384,7 +379,7 @@ class Puppet::Parser::Compiler
384
379
  end
385
380
 
386
381
  hostclasses = classes.collect do |name|
387
- scope.find_hostclass(name) or raise Puppet::Error, "Could not find class #{name} for #{node.name}"
382
+ environment.known_resource_types.find_hostclass(name) or raise Puppet::Error, "Could not find class #{name} for #{node.name}"
388
383
  end
389
384
 
390
385
  if class_parameters
@@ -507,7 +502,7 @@ class Puppet::Parser::Compiler
507
502
  end
508
503
 
509
504
  def evaluate_capability_mappings
510
- krt = known_resource_types
505
+ krt = environment.known_resource_types
511
506
  krt.capability_mappings.each_value do |capability_mapping|
512
507
  args = capability_mapping.arguments
513
508
  component_ref = args['component']
@@ -540,15 +535,16 @@ class Puppet::Parser::Compiler
540
535
 
541
536
  # If ast nodes are enabled, then see if we can find and evaluate one.
542
537
  def evaluate_ast_node
543
- return unless ast_nodes?
538
+ krt = environment.known_resource_types
539
+ return unless krt.nodes? #ast_nodes?
544
540
 
545
541
  # Now see if we can find the node.
546
542
  astnode = nil
547
543
  @node.names.each do |name|
548
- break if astnode = known_resource_types.node(name.to_s.downcase)
544
+ break if astnode = krt.node(name.to_s.downcase)
549
545
  end
550
546
 
551
- unless (astnode ||= known_resource_types.node("default"))
547
+ unless (astnode ||= krt.node("default"))
552
548
  raise Puppet::ParseError, "Could not find node statement with name 'default' or '#{node.names.join(", ")}'"
553
549
  end
554
550
 
@@ -627,9 +623,10 @@ class Puppet::Parser::Compiler
627
623
 
628
624
  # Find and evaluate our main object, if possible.
629
625
  def evaluate_main
630
- @main = known_resource_types.find_hostclass("") || known_resource_types.add(Puppet::Resource::Type.new(:hostclass, ""))
626
+ krt = environment.known_resource_types
627
+ @main = krt.find_hostclass('') || krt.add(Puppet::Resource::Type.new(:hostclass, ''))
631
628
  @topscope.source = @main
632
- @main_resource = Puppet::Parser::Resource.new("class", :main, :scope => @topscope, :source => @main)
629
+ @main_resource = Puppet::Parser::Resource.new('class', :main, :scope => @topscope, :source => @main)
633
630
  @topscope.resource = @main_resource
634
631
 
635
632
  add_resource(@topscope, @main_resource)
@@ -762,7 +759,7 @@ class Puppet::Parser::Compiler
762
759
  #
763
760
  Puppet.override( @context_overrides , "For initializing compiler") do
764
761
  # THE MAGIC STARTS HERE ! This triggers parsing, loading etc.
765
- @catalog.version = known_resource_types.version
762
+ @catalog.version = environment.known_resource_types.version
766
763
  end
767
764
 
768
765
  @catalog.add_resource(Puppet::Parser::Resource.new("stage", :main, :scope => @topscope))
@@ -795,7 +792,7 @@ class Puppet::Parser::Compiler
795
792
  # 2.2.2 some other terminus having stored a fact called "trusted" (most likely that would have failed earlier, but could
796
793
  # be spoofed).
797
794
  #
798
- # For the reasons above, the resurection of trusted node data with authenticated => true is only performed
795
+ # For the reasons above, the resurrection of trusted node data with authenticated => true is only performed
799
796
  # if user is running as root, else it is resurrected as unauthenticated.
800
797
  #
801
798
  trusted_param = node.parameters['trusted']
@@ -807,7 +804,7 @@ class Puppet::Parser::Compiler
807
804
  trusted_param = nil
808
805
  end
809
806
  else
810
- # trusted may be boolean false if set as a fact by someone
807
+ # trusted may be Boolean false if set as a fact by someone
811
808
  trusted_param = nil
812
809
  end
813
810
 
@@ -872,7 +869,7 @@ class Puppet::Parser::Compiler
872
869
  # Return an array of all of the unevaluated resources. These will be definitions,
873
870
  # which need to get evaluated into native resources.
874
871
  def unevaluated_resources
875
- # The order of these is significant for speed due to short-circuting
872
+ # The order of these is significant for speed due to short-circuiting
876
873
  resources.reject { |resource| resource.evaluated? or resource.virtual? or resource.builtin_type? }
877
874
  end
878
875
 
@@ -30,7 +30,7 @@ class Puppet::Parser::Compiler
30
30
  # all other relationships requires the referenced resource to exist when mode is strict
31
31
  refs = param.value.is_a?(Array) ? param.value.flatten : [param.value]
32
32
  refs.each do |r|
33
- next if r.nil?
33
+ next if r.nil? || r == :undef
34
34
  unless catalog.resource(r.to_s)
35
35
  msg = "Could not find resource '#{r.to_s}' in parameter '#{param.name.to_s}'"
36
36
  if Puppet[:strict] == :error
@@ -15,6 +15,16 @@ class Puppet::Parser::EnvironmentCompiler < Puppet::Parser::Compiler
15
15
  end
16
16
  end
17
17
 
18
+ def initialize(node, options = {})
19
+ super
20
+ add_function_overrides
21
+ end
22
+
23
+ def add_function_overrides
24
+ hiera_include = proc { Puppet.debug "Ignoring hiera_include() during environment catalog compilation" }
25
+ loaders.puppet_system_loader.add_entry(:function, 'hiera_include', hiera_include, nil)
26
+ end
27
+
18
28
  def add_catalog_validators
19
29
  super
20
30
  add_catalog_validator(CatalogValidator::SiteValidator)
@@ -42,6 +42,10 @@ Puppet::Parser::Functions::newfunction(:create_resources, :arity => -3, :doc =>
42
42
 
43
43
  create_resources("@user", $myusers)
44
44
 
45
+ Note that `create_resources` will filter out parameter values that are `undef` so that normal
46
+ data binding and puppet default value expressions are considered (in that order) for the
47
+ final value of a parameter (just as when setting a parameter to `undef` in a puppet language
48
+ resource declaration).
45
49
  ENDHEREDOC
46
50
  raise ArgumentError, ("create_resources(): wrong number of arguments (#{args.length}; must be 2 or 3)") if args.length > 3
47
51
  raise ArgumentError, ('create_resources(): second argument must be a hash') unless args[1].is_a?(Hash)
@@ -49,35 +53,46 @@ Puppet::Parser::Functions::newfunction(:create_resources, :arity => -3, :doc =>
49
53
  raise ArgumentError, ('create_resources(): third argument, if provided, must be a hash') unless args[2].is_a?(Hash)
50
54
  end
51
55
 
52
-
53
56
  type, instances, defaults = args
54
57
  defaults ||= {}
55
-
56
- resource = Puppet::Parser::AST::Resource.new(:type => type.sub(/^@{1,2}/, '').downcase, :instances =>
57
- instances.collect do |title, params|
58
- Puppet::Parser::AST::ResourceInstance.new(
59
- :title => Puppet::Parser::AST::Leaf.new(:value => title),
60
- :parameters => defaults.merge(params).collect do |name, value|
61
- next if (value == :undef || value.nil?)
62
- Puppet::Parser::AST::ResourceParam.new(
63
- :param => name,
64
- :value => Puppet::Parser::AST::Leaf.new(:value => value))
65
- end.compact)
66
- end)
58
+ type_name = type.sub(/^@{1,2}/, '').downcase
59
+
60
+ # Get file/line information from the puppet stack (where call comes from in puppet source)
61
+ # If relayed via other puppet functions in ruby that do not nest their calls, the source position
62
+ # will be in the original puppet source.
63
+ #
64
+ stacktrace = Puppet::Pops::PuppetStack.stacktrace()
65
+ if stacktrace.size > 0
66
+ file, line = stacktrace[0]
67
+ else
68
+ file = nil
69
+ line = nil
70
+ end
67
71
 
68
72
  if type.start_with? '@@'
69
- resource.exported = true
73
+ exported = true
70
74
  elsif type.start_with? '@'
71
- resource.virtual = true
75
+ virtual = true
72
76
  end
73
77
 
74
- begin
75
- resource.safeevaluate(self)
76
- rescue Puppet::ParseError => internal_error
77
- if internal_error.original.nil?
78
- raise internal_error
79
- else
80
- raise internal_error.original
81
- end
82
- end
78
+ instances.map do |title, params|
79
+ # Add support for iteration if title is an array
80
+ resource_titles = title.is_a?(Array) ? title : [title]
81
+ Puppet::Pops::Evaluator::Runtime3ResourceSupport.create_resources(
82
+ file, line,
83
+ self,
84
+ virtual, exported,
85
+ type_name,
86
+ resource_titles,
87
+ defaults.merge(params).map do |name, value|
88
+ value = nil if value == :undef
89
+ Puppet::Parser::Resource::Param.new(
90
+ :name => name,
91
+ :value => value, # wide open to various data types, must be correct
92
+ :source => self.source, # TODO: support :line => line, :file => file,
93
+ :add => false
94
+ )
95
+ end.compact
96
+ )
97
+ end.flatten.compact
83
98
  end
@@ -100,32 +100,8 @@ defined('$tmp_file2')
100
100
  - Since 2.7.0
101
101
  - Since 3.6.0 variable reference and future parser types
102
102
  - Since 3.8.1 type specific requests with future parser
103
- - Since 4.0.0
103
+ - Since 4.0.0 includes all future parser features
104
104
  DOC
105
105
  ) do |vals|
106
- vals = [vals] unless vals.is_a?(Array)
107
- vals.any? do |val|
108
- case val
109
- when String
110
- if m = /^\$(.+)$/.match(val)
111
- exist?(m[1])
112
- else
113
- find_resource_type(val) || find_definition(val) || find_hostclass(val)
114
- end
115
- when Puppet::Resource
116
- compiler.findresource(val.type, val.title)
117
- when Puppet::Pops::Types::PResourceType
118
- raise ArgumentError, "The given resource type is a reference to all kind of types" if val.type_name.nil?
119
- if val.title.nil?
120
- find_builtin_resource_type(val.type_name) || find_definition(val.type_name)
121
- else
122
- compiler.findresource(val.type_name, val.title)
123
- end
124
- when Puppet::Pops::Types::PHostClassType
125
- raise ArgumentError, "The given class type is a reference to all classes" if val.class_name.nil?
126
- find_hostclass(val.class_name)
127
- else
128
- raise ArgumentError, "Invalid argument of type '#{val.class}' to 'defined'"
129
- end
130
- end
106
+ function_fail(["defined() is a 4.x function - an illegal call was made to this function using old API"])
131
107
  end
@@ -0,0 +1,29 @@
1
+ Puppet::Parser::Functions::newfunction(
2
+ :dig,
3
+ :type => :rvalue,
4
+ :arity => -1,
5
+ :doc => <<-DOC
6
+ Returns a value for a sequence of given keys/indexes into a structure.
7
+ This function is used to "dig into" a complex data structure by
8
+ using a sequence of keys / indexes to access a value from which
9
+ the next key/index is accessed recursively.
10
+
11
+ The first encountered `undef` value or key stops the "dig" and `undef` is returned.
12
+
13
+ An error is raised if an attempt is made to "dig" into
14
+ something other than an `undef` (which immediately returns `undef`), an `Array` or a `Hash`.
15
+
16
+ **Example:** Using `dig`
17
+
18
+ ```puppet
19
+ $data = {a => { b => [{x => 10, y => 20}, {x => 100, y => 200}]}}
20
+ notice $data.dig(a, b, 1, x)
21
+ ```
22
+
23
+ Would notice the value 100.
24
+
25
+ * Since 4.5.0
26
+ DOC
27
+ ) do |args|
28
+ function_fail(["dig() is only available when parser/evaluator future is in effect"])
29
+ end
@@ -0,0 +1,49 @@
1
+ Puppet::Parser::Functions::newfunction(
2
+ :lest,
3
+ :type => :rvalue,
4
+ :arity => -2,
5
+ :doc => <<-DOC
6
+ Call a [lambda](https://docs.puppet.com/puppet/latest/reference/lang_lambdas.html)
7
+ (which should accept no arguments) if the argument given to the function is `undef`.
8
+ Returns the result of calling the lambda if the argument is `undef`, otherwise the
9
+ given argument.
10
+
11
+ The `lest` function is useful in a chain of `then` calls, or in general
12
+ as a guard against `undef` values. The function can be used to call `fail`, or to
13
+ return a default value.
14
+
15
+ These two expressions are equivalent:
16
+
17
+ ```puppet
18
+ if $x == undef { do_things() }
19
+ lest($x) || { do_things() }
20
+ ```
21
+
22
+ **Example:** Using the `lest` function
23
+
24
+ ```puppet
25
+ $data = {a => [ b, c ] }
26
+ notice $data.dig(a, b, c)
27
+ .then |$x| { $x * 2 }
28
+ .lest || { fail("no value for $data[a][b][c]" }
29
+ ```
30
+
31
+ Would fail the operation because $data[a][b][c] results in `undef`
32
+ (there is no `b` key in `a`).
33
+
34
+ In contrast - this example:
35
+
36
+ ```puppet
37
+ $data = {a => { b => { c => 10 } } }
38
+ notice $data.dig(a, b, c)
39
+ .then |$x| { $x * 2 }
40
+ .lest || { fail("no value for $data[a][b][c]" }
41
+ ```
42
+
43
+ Would notice the value `20`
44
+
45
+ * Since 4.5.0
46
+ DOC
47
+ ) do |args|
48
+ function_fail(["lest() is only available when parser/evaluator future is in effect"])
49
+ end
@@ -0,0 +1,530 @@
1
+ Puppet::Parser::Functions::newfunction(
2
+ :new,
3
+ :type => :rvalue,
4
+ :arity => -1,
5
+ :doc => <<-DOC
6
+ Creates a new instance/object of a given data type.
7
+
8
+ This function makes it possible to create new instances of
9
+ concrete data types. If a block is given it is called with the
10
+ just created instance as an argument.
11
+
12
+ Calling this function is equivalent to directly
13
+ calling the data type:
14
+
15
+ **Example:** `new` and calling type directly are equivalent
16
+
17
+ ```puppet
18
+ $a = Integer.new("42")
19
+ $b = Integer("42")
20
+ ```
21
+
22
+ These would both convert the string `"42"` to the decimal value `42`.
23
+
24
+ **Example:** arguments by position or by name
25
+
26
+ ```puppet
27
+ $a = Integer.new("42", 8)
28
+ $b = Integer({from => "42", radix => 8})
29
+ ```
30
+
31
+ This would convert the octal (radix 8) number `"42"` in string form
32
+ to the decimal value `34`.
33
+
34
+ The new function supports two ways of giving the arguments:
35
+
36
+ * by name (using a hash with property to value mapping)
37
+ * by position (as regular arguments)
38
+
39
+ Note that it is not possible to create new instances of
40
+ some abstract data types (for example `Variant`). The data type `Optional[T]` is an
41
+ exception as it will create an instance of `T` or `undef` if the
42
+ value to convert is `undef`.
43
+
44
+ The arguments that can be given is determined by the data type.
45
+
46
+ > An assertion is always made that the produced value complies with the given type constraints.
47
+
48
+ **Example:** data type constraints are checked
49
+
50
+ ```puppet
51
+ Integer[0].new("-100")
52
+ ```
53
+
54
+ Would fail with an assertion error (since value is less than 0).
55
+
56
+ The following sections show the arguments and conversion rules
57
+ per data type built into the Puppet Type System.
58
+
59
+ Conversion to Optional[T] and NotUndef[T]
60
+ -----------------------------------------
61
+
62
+ Conversion to these data types is the same as a conversion to the type argument `T`.
63
+ In the case of `Optional[T]` it is accepted that the argument to convert may be `undef`.
64
+ It is however not acceptable to give other arguments (than `undef`) that cannot be
65
+ converted to `T`.
66
+
67
+ Conversion to Integer
68
+ ---------------------
69
+
70
+ A new `Integer` can be created from `Integer`, `Float`, `Boolean`, and `String` values.
71
+ For conversion from `String` it is possible to specify the radix (base).
72
+
73
+ ```puppet
74
+ type Radix = Variant[Default, Integer[2,2], Integer[8,8], Integer[10,10], Integer[16,16]]
75
+
76
+ function Integer.new(
77
+ String $value,
78
+ Radix $radix = 10
79
+ )
80
+
81
+ function Integer.new(
82
+ Variant[Numeric, Boolean] $value
83
+ )
84
+ ```
85
+
86
+ * When converting from `String` the default radix is 10.
87
+ * If radix is not specified an attempt is made to detect the radix from the start of the string:
88
+ * `0b` or `0B` is taken as radix 2.
89
+ * `0x` or `0X` is taken as radix 16.
90
+ * `0` as radix 8.
91
+ * All others are decimal.
92
+ * Conversion from `String` accepts an optional sign in the string.
93
+ * For hexadecimal (radix 16) conversion an optional leading "0x", or "0X" is accepted.
94
+ * For octal (radix 8) an optional leading "0" is accepted.
95
+ * For binary (radix 2) an optional leading "0b" or "0B" is accepted.
96
+ * When `radix` is set to `default`, the conversion is based on the leading.
97
+ characters in the string. A leading "0" for radix 8, a leading "0x", or "0X" for
98
+ radix 16, and leading "0b" or "0B" for binary.
99
+ * Conversion from `Boolean` results in 0 for `false` and 1 for `true`.
100
+ * Conversion from `Integer`, `Float`, and `Boolean` ignores the radix.
101
+ * `Float` value fractions are truncated (no rounding).
102
+
103
+ Examples - Converting to Integer:
104
+
105
+ ```puppet
106
+ $a_number = Integer("0xFF", 16) # results in 255
107
+ $a_number = Numeric("010") # results in 8
108
+ $a_number = Numeric("010", 10) # results in 10
109
+ $a_number = Integer(true) # results in 1
110
+ ```
111
+
112
+ Conversion to Float
113
+ -------------------
114
+
115
+ A new `Float` can be created from `Integer`, `Float`, `Boolean`, and `String` values.
116
+ For conversion from `String` both float and integer formats are supported.
117
+
118
+ ```puppet
119
+ function Float.new(
120
+ Variant[Numeric, Boolean, String] $value
121
+ )
122
+ ```
123
+
124
+
125
+ * For an integer, the floating point fraction of `.0` is added to the value.
126
+ * A `Boolean` `true` is converted to 1.0, and a `false` to 0.0
127
+ * In `String` format, integer prefixes for hex and binary are understood (but not octal since
128
+ floating point in string format may start with a '0').
129
+
130
+ Conversion to Numeric
131
+ ---------------------
132
+
133
+ A new `Integer` or `Float` can be created from `Integer`, `Float`, `Boolean` and
134
+ `String` values.
135
+
136
+ ```puppet
137
+ function Numeric.new(
138
+ Variant[Numeric, Boolean, String] $value
139
+ )
140
+ ```
141
+
142
+ * If the value has a decimal period, or if given in scientific notation
143
+ (e/E), the result is a `Float`, otherwise the value is an `Integer`. The
144
+ conversion from `String` always uses a radix based on the prefix of the string.
145
+ * Conversion from `Boolean` results in 0 for `false` and 1 for `true`.
146
+
147
+ Examples - Converting to Numeric
148
+
149
+ ```puppet
150
+ $a_number = Numeric(true) # results in 1
151
+ $a_number = Numeric("0xFF") # results in 255
152
+ $a_number = Numeric("010") # results in 8
153
+ $a_number = Numeric("3.14") # results in 3.14 (a float)
154
+ ```
155
+
156
+ Conversion to String
157
+ --------------------
158
+
159
+ Conversion to `String` is the most comprehensive conversion as there are many
160
+ use cases where a string representation is wanted. The defaults for the many options
161
+ have been chosen with care to be the most basic "value in textual form" representation.
162
+ The more advanced forms of formatting are intended to enable writing special purposes formatting
163
+ functions in the Puppet language.
164
+
165
+ A new string can be created from all other data types. The process is performed in
166
+ several steps - first the data type of the given value is inferred, then the resulting data type
167
+ is used to find the most significant format specified for that data type. And finally,
168
+ the found format is used to convert the given value.
169
+
170
+ The mapping from data type to format is referred to as the *format map*. This map
171
+ allows different formatting depending on type.
172
+
173
+ **Example:** Positive Integers in Hexadecimal prefixed with '0x', negative in Decimal
174
+
175
+ ```puppet
176
+ $format_map = {
177
+ Integer[default, 0] => "%d",
178
+ Integer[1, default] => "%#x"
179
+ }
180
+ String("-1", $format_map) # produces '-1'
181
+ String("10", $format_map) # produces '0xa'
182
+ ```
183
+
184
+ A format is specified on the form:
185
+
186
+ ```
187
+ %[Flags][Width][.Precision]Format
188
+ ```
189
+
190
+ `Width` is the number of characters into which the value should be fitted. This allocated space is
191
+ padded if value is shorter. By default it is space padded, and the flag `0` will cause padding with `0`
192
+ for numerical formats.
193
+
194
+ `Precision` is the number of fractional digits to show for floating point, and the maximum characters
195
+ included in a string format.
196
+
197
+ Note that all data type supports the formats `s` and `p` with the meaning "default string representation" and
198
+ "default programmatic string representation" (which for example means that a String is quoted in 'p' format).
199
+
200
+ ### Signatures of String conversion
201
+
202
+ ```puppet
203
+ type Format = Pattern[/^%([\s\+\-#0\[\{<\(\|]*)([1-9][0-9]*)?(?:\.([0-9]+))?([a-zA-Z])/]
204
+ type ContainerFormat = Struct[{
205
+ format => Optional[String],
206
+ separator => Optional[String],
207
+ separator2 => Optional[String],
208
+ string_formats => Hash[Type, Format]
209
+ }]
210
+ type TypeMap = Hash[Type, Variant[Format, ContainerFormat]]
211
+ type Formats = Variant[Default, String[1], TypeMap]
212
+
213
+ function String.new(
214
+ Any $value,
215
+ Formats $string_formats
216
+ )
217
+ ```
218
+
219
+ Where:
220
+
221
+ * `separator` is the string used to separate entries in an array, or hash (extra space should not be included at
222
+ the end), defaults to `","`
223
+ * `separator2` is the separator between key and value in a hash entry (space padding should be included as
224
+ wanted), defaults to `" => "`.
225
+ * `string_formats` is a data type to format map for values contained in arrays and hashes - defaults to `{Any => "%p"}`. Note that
226
+ these nested formats are not applicable to data types that are containers; they are always formatted as per the top level
227
+ format specification.
228
+
229
+ **Example:** Simple Conversion to String (using defaults)
230
+
231
+ ```puppet
232
+ $str = String(10) # produces '10'
233
+ $str = String([10]) # produces '["10"]'
234
+ ```
235
+
236
+ **Example:** Simple Conversion to String specifying the format for the given value directly
237
+
238
+ ```puppet
239
+ $str = String(10, "%#x") # produces '0x10'
240
+ $str = String([10], "%(a") # produces '("10")'
241
+ ```
242
+
243
+ **Example:** Specifying type for values contained in an array
244
+
245
+ ```puppet
246
+ $formats = {
247
+ Array => {
248
+ format => '%(a',
249
+ string_formats => { Integer => '%#x' }
250
+ }
251
+ }
252
+ $str = String([1,2,3], $formats) # produces '(0x1, 0x2, 0x3)'
253
+ ```
254
+
255
+ The given formats are merged with the default formats, and matching of values to convert against format is based on
256
+ the specificity of the mapped type; for example, different formats can be used for short and long arrays.
257
+
258
+ ### Integer to String
259
+
260
+ | Format | Integer Formats
261
+ | ------ | ---------------
262
+ | d | Decimal, negative values produces leading '-'.
263
+ | x X | Hexadecimal in lower or upper case. Uses ..f/..F for negative values unless + is also used. A `#` adds prefix 0x/0X.
264
+ | o | Octal. Uses ..0 for negative values unless `+` is also used. A `#` adds prefix 0.
265
+ | b B | Binary with prefix 'b' or 'B'. Uses ..1/..1 for negative values unless `+` is also used.
266
+ | c | Numeric value representing a Unicode value, result is a one unicode character string, quoted if alternative flag # is used
267
+ | s | Same as d, or d in quotes if alternative flag # is used.
268
+ | p | Same as d.
269
+ | eEfgGaA | Converts integer to float and formats using the floating point rules.
270
+
271
+ Defaults to `d`.
272
+
273
+ ### Float to String
274
+
275
+ | Format | Float formats
276
+ | ------ | -------------
277
+ | f | Floating point in non exponential notation.
278
+ | e E | Exponential notation with 'e' or 'E'.
279
+ | g G | Conditional exponential with 'e' or 'E' if exponent < -4 or >= the precision.
280
+ | a A | Hexadecimal exponential form, using 'x'/'X' as prefix and 'p'/'P' before exponent.
281
+ | s | Converted to string using format p, then applying string formatting rule, alternate form # quotes result.
282
+ | p | Same as f format with minimum significant number of fractional digits, prec has no effect.
283
+ | dxXobBc | Converts float to integer and formats using the integer rules.
284
+
285
+ Defaults to `p`.
286
+
287
+ ### String to String
288
+
289
+ | Format | String
290
+ | ------ | ------
291
+ | s | Unquoted string, verbatim output of control chars.
292
+ | p | Programmatic representation - strings are quoted, interior quotes and control chars are escaped.
293
+ | C | Each `::` name segment capitalized, quoted if alternative flag `#` is used.
294
+ | c | Capitalized string, quoted if alternative flag `#` is used.
295
+ | d | Downcased string, quoted if alternative flag `#` is used.
296
+ | u | Upcased string, quoted if alternative flag `#` is used.
297
+ | t | Trims leading and trailing whitespace from the string, quoted if alternative flag `#` is used.
298
+
299
+ Defaults to `s` at top level and `p` inside array or hash.
300
+
301
+ ### Boolean to String
302
+
303
+ | Format | Boolean Formats
304
+ | ---- | -------------------
305
+ | t T | String 'true'/'false' or 'True'/'False', first char if alternate form is used (i.e. 't'/'f' or 'T'/'F').
306
+ | y Y | String 'yes'/'no', 'Yes'/'No', 'y'/'n' or 'Y'/'N' if alternative flag `#` is used.
307
+ | dxXobB | Numeric value 0/1 in accordance with the given format which must be valid integer format.
308
+ | eEfgGaA | Numeric value 0.0/1.0 in accordance with the given float format and flags.
309
+ | s | String 'true' / 'false'.
310
+ | p | String 'true' / 'false'.
311
+
312
+ ### Regexp to String
313
+
314
+ | Format | Regexp Formats
315
+ | ---- | --------------
316
+ | s | Delimiters `/ /`, alternate flag `#` replaces `/` delimiters with quotes.
317
+ | p | Delimiters `/ /`.
318
+
319
+ ### Undef to String
320
+
321
+ | Format | Undef formats
322
+ | ------ | -------------
323
+ | s | Empty string, or quoted empty string if alternative flag `#` is used.
324
+ | p | String 'undef', or quoted '"undef"' if alternative flag `#` is used.
325
+ | n | String 'nil', or 'null' if alternative flag `#` is used.
326
+ | dxXobB | String 'NaN'.
327
+ | eEfgGaA | String 'NaN'.
328
+ | v | String 'n/a'.
329
+ | V | String 'N/A'.
330
+ | u | String 'undef', or 'undefined' if alternative `#` flag is used.
331
+
332
+ ### Default value to String
333
+
334
+ | Format | Default formats
335
+ | ------ | ---------------
336
+ | d D | String 'default' or 'Default', alternative form `#` causes value to be quoted.
337
+ | s | Same as d.
338
+ | p | Same as d.
339
+
340
+ ### Array & Tuple to String
341
+
342
+ | Format | Array/Tuple Formats
343
+ | ------ | -------------
344
+ | a | Formats with `[ ]` delimiters and `,`, alternate form `#` indents nested arrays/hashes.
345
+ | s | Same as a.
346
+ | p | Same as a.
347
+
348
+ See "Flags" `<[({\|` for formatting of delimiters, and "Additional parameters for containers; Array and Hash" for
349
+ more information about options.
350
+
351
+ The alternate form flag `#` will cause indentation of nested array or hash containers. If width is also set
352
+ it is taken as the maximum allowed length of a sequence of elements (not including delimiters). If this max length
353
+ is exceeded, each element will be indented.
354
+
355
+ ### Hash & Struct to String
356
+
357
+ | Format | Hash/Struct Formats
358
+ | ------ | -------------
359
+ | h | Formats with `{ }` delimiters, `,` element separator and ` => ` inner element separator unless overridden by flags.
360
+ | s | Same as h.
361
+ | p | Same as h.
362
+ | a | Converts the hash to an array of [k,v] tuples and formats it using array rule(s).
363
+
364
+ See "Flags" `<[({\|` for formatting of delimiters, and "Additional parameters for containers; Array and Hash" for
365
+ more information about options.
366
+
367
+ The alternate form flag `#` will format each hash key/value entry indented on a separate line.
368
+
369
+ ### Type to String
370
+
371
+ | Format | Array/Tuple Formats
372
+ | ------ | -------------
373
+ | s | The same as `p`, quoted if alternative flag `#` is used.
374
+ | p | Outputs the type in string form as specified by the Puppet Language.
375
+
376
+ ### Flags
377
+
378
+ | Flag | Effect
379
+ | ------ | ------
380
+ | (space) | A space instead of `+` for numeric output (`-` is shown), for containers skips delimiters.
381
+ | # | Alternate format; prefix 0x/0x, 0 (octal) and 0b/0B for binary, Floats force decimal '.'. For g/G keep trailing 0.
382
+ | + | Show sign +/- depending on value's sign, changes x, X, o, b, B format to not use 2's complement form.
383
+ | - | Left justify the value in the given width.
384
+ | 0 | Pad with 0 instead of space for widths larger than value.
385
+ | <[({\| | Defines an enclosing pair <> [] () {} or \| \| when used with a container type.
386
+
387
+ Conversion to Boolean
388
+ ---
389
+
390
+ Accepts a single value as argument:
391
+
392
+ * Float 0.0 is `false`, all other float values are `true`
393
+ * Integer 0 is `false`, all other integer values are `true`
394
+ * Strings
395
+ * `true` if 'true', 'yes', 'y' (case independent compare)
396
+ * `false` if 'false', 'no', 'n' (case independent compare)
397
+ * Boolean is already boolean and is simply returned
398
+
399
+ Conversion to Array and Tuple
400
+ ---
401
+
402
+ When given a single value as argument:
403
+
404
+ * A non empty `Hash` is converted to an array matching `Array[Tuple[Any,Any], 1]`.
405
+ * An empty `Hash` becomes an empty array.
406
+ * An `Array` is simply returned.
407
+ * An `Iterable[T]` is turned into an array of `T` instances.
408
+
409
+ When given a second Boolean argument:
410
+
411
+ * if `true`, a value that is not already an array is returned as a one element array.
412
+ * if `false`, (the default), converts the first argument as shown above.
413
+
414
+ **Example:** Ensuring value is an array
415
+
416
+ ```puppet
417
+ $arr = Array($value, true)
418
+ ```
419
+
420
+ Conversion to a `Tuple` works exactly as conversion to an `Array`, only that the constructed array is
421
+ asserted against the given tuple type.
422
+
423
+ Conversion to Hash and Struct
424
+ ---
425
+
426
+ Accepts a single value as argument:
427
+
428
+ * An empty `Array` becomes an empty `Hash`
429
+ * An `Array` matching `Array[Tuple[Any,Any], 1]` is converted to a hash where each tuple describes a key/value entry
430
+ * An `Array` with an even number of entries is interpreted as `[key1, val1, key2, val2, ...]`
431
+ * An `Iterable` is turned into an `Array` and then converted to hash as per the array rules
432
+ * A `Hash` is simply returned
433
+
434
+ Conversion to a `Struct` works exactly as conversion to a `Hash`, only that the constructed hash is
435
+ asserted against the given struct type.
436
+
437
+ Creating a SemVer
438
+ ---
439
+
440
+ A SemVer object represents a single [Semantic Version](http://semver.org/).
441
+ It can be created from a String, individual values for its parts, or a hash specifying the value per part.
442
+ See the specification at [semver.org](http://semver.org/) for the meaning of the SemVer's parts.
443
+
444
+ The signatures are:
445
+
446
+ ```puppet
447
+ type PositiveInteger = Integer[0,default]
448
+ type SemVerQualifier = Pattern[/\A(?<part>[0-9A-Za-z-]+)(?:\.\g<part>)*\Z/]
449
+ type SemVerString = String[1]
450
+ type SemVerHash =Struct[{
451
+ major => PositiveInteger,
452
+ minor => PositiveInteger,
453
+ patch => PositiveInteger,
454
+ Optional[prerelease] => SemVerQualifier,
455
+ Optional[build] => SemVerQualifier
456
+ }]
457
+
458
+ function SemVer.new(SemVerString $str)
459
+
460
+ function SemVer.new(
461
+ PositiveInteger $major
462
+ PositiveInteger $minor
463
+ PositiveInteger $patch
464
+ Optional[SemVerQualifier] $prerelease = undef
465
+ Optional[SemVerQualifier] $build = undef
466
+ )
467
+
468
+ function SemVer.new(SemVerHash $hash_args)
469
+ ```
470
+
471
+ **Examples:** SemVer and SemVerRange usage
472
+
473
+ ```puppet
474
+ # As a type, SemVer can describe disjunct ranges which versions can be
475
+ # matched against - here the type is constructed with two
476
+ # SemVerRange objects.
477
+ #
478
+ $t = SemVer[
479
+ SemVerRange('>=1.0.0 <2.0.0'),
480
+ SemVerRange('>=3.0.0 <4.0.0')
481
+ ]
482
+ notice(SemVer('1.2.3') =~ $t) # true
483
+ notice(SemVer('2.3.4') =~ $t) # false
484
+ notice(SemVer('3.4.5') =~ $t) # true
485
+ ```
486
+
487
+ Creating a SemVerRange
488
+ ---
489
+
490
+ A `SemVerRange` object represents a range of `SemVer`. It can be created from
491
+ a `String`, or from two `SemVer` instances, where either end can be given as
492
+ a literal `default` to indicate infinity. The string format of a `SemVerRange` is specified by
493
+ the [Semantic Version Range Grammar](https://github.com/npm/node-semver#ranges).
494
+
495
+ > Use of the comparator sets described in the grammar (joining with `||`) is not supported.
496
+
497
+ The signatures are:
498
+
499
+ ```puppet
500
+ type SemVerRangeString = String[1]
501
+ type SemVerRangeHash = Struct[{
502
+ min => Variant[default, SemVer],
503
+ Optional[max] => Variant[default, SemVer],
504
+ Optional[exclude_max] => Boolean
505
+ }]
506
+
507
+ function SemVerRange.new(
508
+ SemVerRangeString $semver_range_string
509
+ )
510
+
511
+ function SemVerRange.new(
512
+ Variant[default,SemVer] $min
513
+ Variant[default,SemVer] $max
514
+ Optional[Boolean] $exclude_max = undef
515
+ )
516
+
517
+ function SemVerRange.new(
518
+ SemVerRangeHash $semver_range_hash
519
+ )
520
+ ```
521
+
522
+ For examples of `SemVerRange` use see "Creating a SemVer"
523
+
524
+ * Since 4.5.0
525
+
526
+ DOC
527
+ ) do |args|
528
+ function_fail(["new() is only available when parser/evaluator future is in effect"])
529
+ end
530
+