puppet 4.5.3-x86-mingw32 → 4.6.1-x86-mingw32

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

Potentially problematic release.


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

Files changed (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 +91 -48
  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
@@ -5,6 +5,61 @@ module Puppet::Pops
5
5
  module Loader
6
6
  class StaticLoader < Loader
7
7
 
8
+ BUILTIN_TYPE_NAMES = %w{
9
+ Auegas
10
+ Component
11
+ Computer
12
+ Cron
13
+ Exec
14
+ File
15
+ Filebucket
16
+ Group
17
+ Host
18
+ Interface
19
+ K5login
20
+ Macauthorization
21
+ Mailalias
22
+ Maillist
23
+ Mcx
24
+ Mount
25
+ Nagios_command
26
+ Nagios_contact
27
+ Nagios_contactgroup
28
+ Nagios_host
29
+ Nagios_hostdependency
30
+ Nagios_hostescalation
31
+ Nagios_hostgroup
32
+ Nagios_hostextinfo
33
+ Nagios_service
34
+ Nagios_servicedependency
35
+ Nagios_serviceescalation
36
+ Nagios_serviceextinfo
37
+ Nagios_servicegroup
38
+ Nagios_timeperiod
39
+ Notify
40
+ Package
41
+ Resources
42
+ Router
43
+ Schedule
44
+ Scheduled_task
45
+ Selboolean
46
+ Selmodule
47
+ Service
48
+ Ssh_authorized_key
49
+ Sshkey
50
+ Stage
51
+ Tidy
52
+ User
53
+ Vlan
54
+ Whit
55
+ Yumrepo
56
+ Zfs
57
+ Zone
58
+ Zpool
59
+ }.freeze
60
+
61
+ BUILTIN_TYPE_NAMES_LC = Set.new(BUILTIN_TYPE_NAMES.map { |n| n.downcase }).freeze
62
+
8
63
  attr_reader :loaded
9
64
  def initialize
10
65
  @loaded = {}
@@ -41,13 +41,13 @@ class TypeDefinitionInstantiator
41
41
  # loader to use when resolving contained aliases API. Such logic have a hard time finding the closure (where
42
42
  # the loader is known - hence this mechanism
43
43
  private_loader = loader.private_loader
44
- Adapters::LoaderAdapter.adapt(type_definition).loader = private_loader
45
- create_type(type_definition, loader)
44
+ Adapters::LoaderAdapter.adapt(type_definition).loader_name = private_loader.loader_name
45
+ create_runtime_type(type_definition)
46
46
  end
47
47
 
48
48
  def self.create_from_model(type_definition, loader)
49
- typed_name = Loader::TypedName.new(:type, type_definition.name.downcase)
50
- type = create_type(type_definition, loader)
49
+ typed_name = TypedName.new(:type, type_definition.name.downcase)
50
+ type = create_runtime_type(type_definition)
51
51
  loader.set_entry(
52
52
  typed_name,
53
53
  type,
@@ -55,23 +55,39 @@ class TypeDefinitionInstantiator
55
55
  type
56
56
  end
57
57
 
58
- def self.create_type(type_definition, loader)
59
- type_expr = type_definition.type_expr
60
- name = type_definition.name
61
- if object_definition?(type_expr)
58
+ # @api private
59
+ def self.create_runtime_type(type_definition)
60
+ # Using the RUNTIME_NAME_AUTHORITY as the name_authority is motivated by the fact that the type
61
+ # alias name (managed by the runtime) becomes the name of the created type
62
+ #
63
+ create_type(type_definition.name, type_definition.type_expr, Pcore::RUNTIME_NAME_AUTHORITY)
64
+ end
65
+
66
+ # @api private
67
+ def self.create_type(name, type_expr, name_authority)
68
+ create_named_type(name, named_definition(type_expr), type_expr, name_authority)
69
+ end
70
+
71
+ # @api private
72
+ def self.create_named_type(name, type_name, type_expr, name_authority)
73
+ case type_name
74
+ when 'Object'
75
+ # No need for an alias. The Object type itself will receive the name instead
76
+ type_expr = type_expr.keys.empty? ? nil : type_expr.keys[0] unless type_expr.is_a?(Hash)
77
+ Types::PObjectType.new(name, type_expr)
78
+ when 'TypeSet'
62
79
  # No need for an alias. The Object type itself will receive the name instead
63
- i12n_hash_expr = type_expr.keys.empty? ? nil : type_expr.keys[0]
64
- Types::PObjectType.new(name, i12n_hash_expr)
80
+ type_expr = type_expr.keys.empty? ? nil : type_expr.keys[0] unless type_expr.is_a?(Hash)
81
+ Types::PTypeSetType.new(name, type_expr, name_authority)
65
82
  else
66
83
  Types::PTypeAliasType.new(name, type_expr)
67
84
  end
68
85
  end
69
- private_class_method :create_type
70
86
 
71
- def self.object_definition?(te)
72
- te.is_a?(Model::AccessExpression) && (left = te.left_expr).is_a?(Model::QualifiedReference) && left.cased_value == 'Object'
87
+ # @api private
88
+ def self.named_definition(te)
89
+ te.is_a?(Model::AccessExpression) && (left = te.left_expr).is_a?(Model::QualifiedReference) ? left.cased_value : nil
73
90
  end
74
- private_class_method :object_definition?
75
91
  end
76
92
  end
77
93
  end
@@ -0,0 +1,50 @@
1
+ module Puppet::Pops
2
+ module Loader
3
+ # A namespace/name/type combination that can be used as a compound hash key
4
+ #
5
+ # @api public
6
+ class TypedName
7
+ DOUBLE_COLON = '::'.freeze
8
+
9
+ attr_reader :hash
10
+ attr_reader :type
11
+ attr_reader :name_authority
12
+ attr_reader :name
13
+ attr_reader :name_parts
14
+ attr_reader :compound_name
15
+
16
+ def initialize(type, name, name_authority = Pcore::RUNTIME_NAME_AUTHORITY)
17
+ @type = type
18
+ @name_authority = name_authority
19
+ # relativize the name (get rid of leading ::), and make the split string available
20
+ parts = name.to_s.split(DOUBLE_COLON)
21
+ if parts[0].empty?
22
+ parts.shift
23
+ @name = name[2..-1]
24
+ else
25
+ @name = name
26
+ end
27
+ @name_parts = parts.freeze
28
+
29
+ # Use a frozen compound key for the hash and comparison. Most varying part first
30
+ @compound_name = "#{@name}/#{@type}/#{@name_authority}".freeze
31
+ @hash = @compound_name.hash
32
+ freeze
33
+ end
34
+
35
+ def ==(o)
36
+ o.class == self.class && o.compound_name == @compound_name
37
+ end
38
+
39
+ alias eql? ==
40
+
41
+ def qualified?
42
+ @name_parts.size > 1
43
+ end
44
+
45
+ def to_s
46
+ "#{@name_authority}/#{@type}/#{@name}"
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,4 +1,13 @@
1
1
  module Puppet::Pops
2
+ # This is the container for all Loader instances. Each Loader instance has a `loader_name` by which it can be uniquely
3
+ # identified within this container.
4
+ # A Loader can be private or public. In general, code will have access to the private loader associated with the
5
+ # location of the code. It will be parented by a loader that in turn have access to other public loaders that
6
+ # can load only such entries that have been publicly available. The split between public and private is not
7
+ # yet enforced in Puppet.
8
+ #
9
+ # The name of a private loader should always end with ' private'
10
+ #
2
11
  class Loaders
3
12
  class LoaderError < Puppet::Error; end
4
13
 
@@ -8,7 +17,22 @@ class Loaders
8
17
  attr_reader :private_environment_loader
9
18
  attr_reader :implementation_registry
10
19
 
20
+ def self.new(environment)
21
+ obj = environment.loaders
22
+ if obj.nil?
23
+ obj = self.allocate
24
+ obj.send(:initialize, environment)
25
+ end
26
+ obj
27
+ end
28
+
11
29
  def initialize(environment)
30
+ # Protect against environment havoc
31
+ raise ArgumentError.new("Attempt to redefine already initialized loaders for environment") unless environment.loaders.nil?
32
+ environment.loaders = self
33
+ @loaders_by_name = {}
34
+
35
+ add_loader_by_name(self.class.static_loader)
12
36
 
13
37
  # Create the set of loaders
14
38
  # 1. Puppet, loads from the "running" puppet - i.e. bundled functions, types, extension points and extensions
@@ -60,17 +84,17 @@ class Loaders
60
84
  loaders.nil? ? nil : loaders.implementation_registry
61
85
  end
62
86
 
63
- def register_implementations(*obj_classes)
87
+ def register_implementations(obj_classes, name_authority)
64
88
  loader = @private_environment_loader
65
89
  types = obj_classes.map do |obj_class|
66
90
  type = obj_class._ptype
67
- typed_name = Loader::Loader::TypedName.new(:type, type.name.downcase)
91
+ typed_name = Loader::TypedName.new(:type, type.name.downcase, name_authority)
68
92
  entry = loader.loaded_entry(typed_name)
69
93
  loader.set_entry(typed_name, type, obj_class._plocation) if entry.nil? || entry.value.nil?
70
94
  type
71
95
  end
72
- # Resolve lazy so that all types can cross reference eachother
73
- parser = Types::TypeParser.new
96
+ # Resolve lazy so that all types can cross reference each other
97
+ parser = Types::TypeParser.singleton
74
98
  types.each { |type| type.resolve(parser, loader) }
75
99
  end
76
100
 
@@ -85,7 +109,7 @@ class Loaders
85
109
  unless loaders.nil?
86
110
  name = name.to_s
87
111
  caps_name = Types::TypeFormatter.singleton.capitalize_segments(name)
88
- typed_name = Loader::Loader::TypedName.new(:type, name.downcase)
112
+ typed_name = Loader::TypedName.new(:type, name.downcase)
89
113
  loaders.runtime3_type_loader.set_entry(typed_name, Types::PResourceType.new(caps_name), origin)
90
114
  end
91
115
  nil
@@ -102,6 +126,21 @@ class Loaders
102
126
  loaders
103
127
  end
104
128
 
129
+ # Lookup a loader by its unique name.
130
+ #
131
+ # @param [String] loader_name the name of the loader to lookup
132
+ # @return [Loader] the found loader
133
+ # @raise [Puppet::ParserError] if no loader is found
134
+ def [](loader_name)
135
+ loader = @loaders_by_name[loader_name]
136
+ if loader.nil?
137
+ # Unable to find the module private loader. Try resolving the module
138
+ loader = private_loader_for_module(loader_name[0..-9]) if loader_name.end_with?(' private')
139
+ raise Puppet::ParseError, "Unable to find loader named '#{loader_name}'" if loader.nil?
140
+ end
141
+ loader
142
+ end
143
+
105
144
  # Finds the appropriate loader for the given `module_name`, or for the environment in case `module_name`
106
145
  # is `nil` or empty.
107
146
  #
@@ -160,6 +199,12 @@ class Loaders
160
199
  md.private_loader
161
200
  end
162
201
 
202
+ def add_loader_by_name(loader)
203
+ name = loader.loader_name
204
+ raise Puppet::ParseError, "Internal Error: Attempt to redefine loader named '#{name}'" if @loaders_by_name.include?(name)
205
+ @loaders_by_name[name] = loader
206
+ end
207
+
163
208
  private
164
209
 
165
210
  def create_puppet_system_loader()
@@ -183,19 +228,20 @@ class Loaders
183
228
  # Puppet binder currently reads confdir/bindings - that is bad, it should be using the new environment support.
184
229
 
185
230
  # The environment is not a namespace, so give it a nil "module_name"
186
- module_name = nil
187
231
  loader_name = "environment:#{environment.name}"
232
+ # env_conf is setup from the environment_dir value passed into Puppet::Environments::Directories.new
188
233
  env_conf = Puppet.lookup(:environments).get_conf(environment.name)
234
+ env_path = env_conf.nil? || !env_conf.is_a?(Puppet::Settings::EnvironmentConf) ? nil : env_conf.path_to_env
189
235
 
190
236
  # Create the 3.x resource type loader
191
- @runtime3_type_loader = Loader::Runtime3TypeLoader.new(puppet_system_loader, environment)
237
+ @runtime3_type_loader = add_loader_by_name(Loader::Runtime3TypeLoader.new(puppet_system_loader, self, environment, env_conf.nil? ? nil : env_path))
192
238
 
193
- if env_conf.nil? || !env_conf.is_a?(Puppet::Settings::EnvironmentConf)
239
+ if env_path.nil?
194
240
  # Not a real directory environment, cannot work as a module TODO: Drop when legacy env are dropped?
195
- loader = Loader::SimpleEnvironmentLoader.new(@runtime3_type_loader, loader_name)
241
+ loader = add_loader_by_name(Loader::SimpleEnvironmentLoader.new(@runtime3_type_loader, loader_name))
196
242
  else
197
243
  # View the environment as a module to allow loading from it - this module is always called 'environment'
198
- loader = Loader::ModuleLoaders.module_loader_from(@runtime3_type_loader, self, 'environment', env_conf.path_to_env)
244
+ loader = Loader::ModuleLoaders.module_loader_from(@runtime3_type_loader, self, 'environment', env_path)
199
245
  end
200
246
 
201
247
  # An environment has a module path even if it has a null loader
@@ -206,7 +252,7 @@ class Loaders
206
252
  # Code in the environment gets to see all modules (since there is no metadata for the environment)
207
253
  # but since this is not given to the module loaders, they can not load global code (since they can not
208
254
  # have prior knowledge about this
209
- loader = Loader::DependencyLoader.new(loader, "environment", @module_resolver.all_module_loaders())
255
+ loader = add_loader_by_name(Loader::DependencyLoader.new(loader, 'environment private', @module_resolver.all_module_loaders()))
210
256
 
211
257
  # The module loader gets the private loader via a lazy operation to look up the module's private loader.
212
258
  # This does not work for an environment since it is not resolved the same way.
@@ -217,7 +263,7 @@ class Loaders
217
263
  end
218
264
 
219
265
  def configure_loaders_for_modules(parent_loader, environment)
220
- @module_resolver = mr = ModuleResolver.new()
266
+ @module_resolver = mr = ModuleResolver.new(self)
221
267
  environment.modules.each do |puppet_module|
222
268
  # Create data about this module
223
269
  md = LoaderModuleData.new(puppet_module)
@@ -239,7 +285,6 @@ class Loaders
239
285
  #
240
286
  class LoaderModuleData
241
287
 
242
- attr_accessor :state
243
288
  attr_accessor :public_loader
244
289
  attr_accessor :private_loader
245
290
  attr_accessor :resolutions
@@ -250,7 +295,6 @@ class Loaders
250
295
  # @param puppet_module [Puppet::Module] the module instance for the module being represented
251
296
  #
252
297
  def initialize(puppet_module)
253
- @state = :initial
254
298
  @puppet_module = puppet_module
255
299
  @resolutions = []
256
300
  @public_loader = nil
@@ -270,7 +314,7 @@ class Loaders
270
314
  end
271
315
 
272
316
  def resolved?
273
- @state == :resolved
317
+ !@private_loader.nil?
274
318
  end
275
319
 
276
320
  def restrict_to_dependencies?
@@ -290,7 +334,8 @@ class Loaders
290
334
  #
291
335
  class ModuleResolver
292
336
 
293
- def initialize()
337
+ def initialize(loaders)
338
+ @loaders = loaders
294
339
  @index = {}
295
340
  @all_module_loaders = nil
296
341
  end
@@ -309,7 +354,7 @@ class Loaders
309
354
 
310
355
  def resolve(module_data)
311
356
  if module_data.resolved?
312
- return
357
+ nil
313
358
  else
314
359
  module_data.private_loader =
315
360
  if module_data.restrict_to_dependencies?
@@ -325,7 +370,7 @@ class Loaders
325
370
  def create_loader_with_all_modules_visible(from_module_data)
326
371
  Puppet.debug{"ModuleLoader: module '#{from_module_data.name}' has unknown dependencies - it will have all other modules visible"}
327
372
 
328
- Loader::DependencyLoader.new(from_module_data.public_loader, from_module_data.name, all_module_loaders())
373
+ @loaders.add_loader_by_name(Loader::DependencyLoader.new(from_module_data.public_loader, "#{from_module_data.name} private", all_module_loaders()))
329
374
  end
330
375
 
331
376
  def create_loader_with_only_dependencies_visible(from_module_data)
@@ -345,7 +390,7 @@ class Loaders
345
390
  end
346
391
  end
347
392
  dependency_loaders = from_module_data.dependency_names.collect { |name| @index[name].public_loader }
348
- Loader::DependencyLoader.new(from_module_data.public_loader, from_module_data.name, dependency_loaders)
393
+ @loaders.add_loader_by_name(Loader::DependencyLoader.new(from_module_data.public_loader, "#{from_module_data.name} private", dependency_loaders))
349
394
  end
350
395
  end
351
396
  end
@@ -8,7 +8,7 @@ module Puppet::Pops
8
8
 
9
9
  # The type used for validation of the _merge_ argument
10
10
  def self.merge_t
11
- @@merge_t ||= Types::TypeParser.new.parse("Variant[String[1],Runtime[ruby,'Symbol'],Hash[Variant[String[1],Runtime[ruby,'Symbol']],Scalar,1]]")
11
+ @@merge_t ||= Types::TypeParser.singleton.parse("Variant[String[1],Runtime[ruby,'Symbol'],Hash[Variant[String[1],Runtime[ruby,'Symbol']],Scalar,1]]")
12
12
  end
13
13
  private_class_method :merge_t
14
14
 
@@ -123,7 +123,7 @@ module Puppet::Pops
123
123
  result
124
124
  end
125
125
 
126
- # Converts a single value to the type expeced when peforming a merge of two elements
126
+ # Converts a single value to the type expected when merging two elements
127
127
  # @param value [Object] the value to convert
128
128
  # @return [Object] the converted value
129
129
  def convert_value(value)
@@ -149,7 +149,7 @@ module Puppet::Pops
149
149
  # @return [Types::PStructType] the puppet type
150
150
  #
151
151
  def options_t
152
- @options_t ||=Types::TypeParser.new.parse("Struct[{strategy=>Optional[Pattern[#{self.class.key}]]}]")
152
+ @options_t ||=Types::TypeParser.singleton.parse("Struct[{strategy=>Optional[Pattern[#{self.class.key}]]}]")
153
153
  end
154
154
 
155
155
  # Returns the type used to validate the options hash
@@ -217,7 +217,7 @@ module Puppet::Pops
217
217
  protected
218
218
 
219
219
  def value_t
220
- @value_t ||= Types::TypeParser.new.parse('Hash[String,Data]')
220
+ @value_t ||= Types::TypeParser.singleton.parse('Hash[String,Data]')
221
221
  end
222
222
 
223
223
  MergeStrategy.add_strategy(self)
@@ -249,7 +249,7 @@ module Puppet::Pops
249
249
  protected
250
250
 
251
251
  def value_t
252
- @value_t ||= Types::TypeParser.new.parse('Variant[Scalar,Array[Data]]')
252
+ @value_t ||= Types::TypeParser.singleton.parse('Variant[Scalar,Array[Data]]')
253
253
  end
254
254
 
255
255
  MergeStrategy.add_strategy(self)
@@ -320,7 +320,7 @@ module Puppet::Pops
320
320
  #
321
321
  # @return [Types::PAnyType] the puppet type used when validating the options hash
322
322
  def options_t
323
- @options_t ||= Types::TypeParser.new.parse('Struct[{'\
323
+ @options_t ||= Types::TypeParser.singleton.parse('Struct[{'\
324
324
  "strategy=>Optional[Pattern[#{self.class.key}]],"\
325
325
  'knockout_prefix=>Optional[String],'\
326
326
  'merge_debug=>Optional[Boolean],'\
@@ -330,7 +330,7 @@ module Puppet::Pops
330
330
  end
331
331
 
332
332
  def value_t
333
- @value_t ||= Types::TypeParser.new.parse('Variant[Array[Data],Hash[String,Data]]')
333
+ @value_t ||= Types::TypeParser.singleton.parse('Variant[Array[Data],Hash[String,Data]]')
334
334
  end
335
335
 
336
336
  MergeStrategy.add_strategy(self)
@@ -6,6 +6,10 @@ class Puppet::Pops::Migration::MigrationChecker
6
6
  def initialize()
7
7
  end
8
8
 
9
+ def self.singleton
10
+ @null_checker ||= self.new
11
+ end
12
+
9
13
  # Produces a hash of available migrations; a map from a symbolic name in string form to a brief description.
10
14
  # This version has no such supported migrations.
11
15
  def available_migrations()