puppet 4.8.2 → 4.9.0

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

Potentially problematic release.


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

Files changed (348) hide show
  1. checksums.yaml +15 -0
  2. data/CONTRIBUTING.md +25 -1
  3. data/Gemfile +6 -0
  4. data/Rakefile +1 -0
  5. data/ext/project_data.yaml +5 -1
  6. data/ext/windows/service/daemon.rb +2 -1
  7. data/install.rb +43 -6
  8. data/lib/hiera/puppet_function.rb +15 -17
  9. data/lib/hiera/scope.rb +12 -14
  10. data/lib/puppet.rb +52 -0
  11. data/lib/puppet/application/face_base.rb +4 -0
  12. data/lib/puppet/application/lookup.rb +4 -2
  13. data/lib/puppet/application/resource.rb +1 -1
  14. data/lib/puppet/data_providers.rb +6 -3
  15. data/lib/puppet/data_providers/data_adapter.rb +6 -0
  16. data/lib/puppet/data_providers/data_function_support.rb +7 -0
  17. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -0
  18. data/lib/puppet/data_providers/function_module_data_provider.rb +6 -0
  19. data/lib/puppet/data_providers/hiera_config.rb +31 -10
  20. data/lib/puppet/data_providers/hiera_env_data_provider.rb +6 -0
  21. data/lib/puppet/data_providers/hiera_interpolate.rb +2 -1
  22. data/lib/puppet/data_providers/hiera_module_data_provider.rb +6 -0
  23. data/lib/puppet/data_providers/hiera_support.rb +6 -0
  24. data/lib/puppet/data_providers/json_data_provider_factory.rb +12 -0
  25. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +12 -0
  26. data/lib/puppet/defaults.rb +25 -4
  27. data/lib/puppet/face/ca.rb +2 -0
  28. data/lib/puppet/face/certificate_request.rb +2 -0
  29. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  30. data/lib/puppet/face/file.rb +3 -0
  31. data/lib/puppet/face/help.rb +19 -17
  32. data/lib/puppet/face/help/face.erb +3 -0
  33. data/lib/puppet/face/key.rb +1 -0
  34. data/lib/puppet/face/man.rb +4 -2
  35. data/lib/puppet/face/module/generate.rb +1 -1
  36. data/lib/puppet/face/status.rb +2 -0
  37. data/lib/puppet/feature/base.rb +9 -2
  38. data/lib/puppet/feature/hocon.rb +3 -0
  39. data/lib/puppet/file_system.rb +15 -3
  40. data/lib/puppet/file_system/windows.rb +8 -0
  41. data/lib/puppet/forge.rb +6 -6
  42. data/lib/puppet/forge/repository.rb +1 -2
  43. data/lib/puppet/functions/binary_file.rb +4 -10
  44. data/lib/puppet/functions/hiera_array.rb +1 -1
  45. data/lib/puppet/functions/hiera_include.rb +1 -1
  46. data/lib/puppet/functions/hocon_data.rb +24 -0
  47. data/lib/puppet/functions/json_data.rb +18 -0
  48. data/lib/puppet/functions/yaml_data.rb +21 -0
  49. data/lib/puppet/generate/type.rb +1 -1
  50. data/lib/puppet/graph/simple_graph.rb +4 -2
  51. data/lib/puppet/indirector/file_bucket_file/file.rb +10 -2
  52. data/lib/puppet/indirector/request.rb +5 -1
  53. data/lib/puppet/interface.rb +14 -2
  54. data/lib/puppet/interface/face_collection.rb +1 -1
  55. data/lib/puppet/module.rb +14 -2
  56. data/lib/puppet/module_tool.rb +4 -4
  57. data/lib/puppet/module_tool/applications/builder.rb +3 -2
  58. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  59. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  60. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  61. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  62. data/lib/puppet/module_tool/metadata.rb +1 -1
  63. data/lib/puppet/network/http/connection.rb +2 -0
  64. data/lib/puppet/network/http/webrick.rb +2 -1
  65. data/lib/puppet/parser/functions/hiera.rb +14 -0
  66. data/lib/puppet/parser/functions/hiera_array.rb +14 -0
  67. data/lib/puppet/parser/functions/hiera_hash.rb +14 -0
  68. data/lib/puppet/parser/functions/hiera_include.rb +14 -0
  69. data/lib/puppet/parser/scope.rb +14 -20
  70. data/lib/puppet/plugins/data_providers.rb +2 -0
  71. data/lib/puppet/plugins/data_providers/data_provider.rb +108 -17
  72. data/lib/puppet/plugins/data_providers/registry.rb +2 -36
  73. data/lib/puppet/pops.rb +6 -9
  74. data/lib/puppet/pops/adaptable.rb +0 -3
  75. data/lib/puppet/pops/binder/producers.rb +3 -3
  76. data/lib/puppet/pops/evaluator/access_operator.rb +4 -4
  77. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  78. data/lib/puppet/pops/evaluator/compare_operator.rb +4 -4
  79. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  80. data/lib/puppet/pops/issues.rb +4 -0
  81. data/lib/puppet/pops/label_provider.rb +14 -0
  82. data/lib/puppet/pops/loader/loader_paths.rb +3 -1
  83. data/lib/puppet/pops/loader/module_loaders.rb +21 -7
  84. data/lib/puppet/pops/loader/typed_name.rb +0 -2
  85. data/lib/puppet/pops/loaders.rb +31 -12
  86. data/lib/puppet/pops/lookup.rb +4 -3
  87. data/lib/puppet/pops/lookup/configured_data_provider.rb +87 -0
  88. data/lib/puppet/pops/lookup/context.rb +121 -71
  89. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  90. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +55 -0
  91. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +111 -0
  92. data/lib/puppet/pops/lookup/data_provider.rb +102 -0
  93. data/lib/puppet/pops/lookup/environment_data_provider.rb +27 -0
  94. data/lib/puppet/pops/lookup/explainer.rb +122 -82
  95. data/lib/puppet/pops/lookup/function_provider.rb +82 -0
  96. data/lib/puppet/pops/lookup/global_data_provider.rb +49 -0
  97. data/lib/puppet/pops/lookup/hiera_config.rb +601 -0
  98. data/lib/puppet/pops/lookup/interpolation.rb +56 -35
  99. data/lib/puppet/pops/lookup/invocation.rb +179 -101
  100. data/lib/puppet/pops/lookup/location_resolver.rb +72 -0
  101. data/lib/puppet/pops/lookup/lookup_adapter.rb +451 -0
  102. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  103. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +119 -0
  104. data/lib/puppet/pops/lookup/module_data_provider.rb +58 -0
  105. data/lib/puppet/pops/lookup/sub_lookup.rb +8 -4
  106. data/lib/puppet/pops/merge_strategy.rb +120 -39
  107. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  108. data/lib/puppet/pops/parser/eparser.rb +816 -808
  109. data/lib/puppet/pops/parser/locator.rb +3 -3
  110. data/lib/puppet/pops/parser/slurp_support.rb +4 -3
  111. data/lib/puppet/pops/pcore.rb +21 -12
  112. data/lib/puppet/pops/serialization/abstract_reader.rb +17 -7
  113. data/lib/puppet/pops/serialization/abstract_writer.rb +27 -12
  114. data/lib/puppet/pops/serialization/deserializer.rb +17 -4
  115. data/lib/puppet/pops/serialization/extension.rb +37 -8
  116. data/lib/puppet/pops/serialization/object.rb +14 -6
  117. data/lib/puppet/pops/serialization/rgen.rb +2 -1
  118. data/lib/puppet/pops/serialization/serializer.rb +30 -7
  119. data/lib/puppet/pops/types/implementation_registry.rb +1 -1
  120. data/lib/puppet/pops/types/p_object_type.rb +55 -12
  121. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +27 -27
  122. data/lib/puppet/pops/types/p_sem_ver_type.rb +12 -12
  123. data/lib/puppet/pops/types/p_timespan_type.rb +6 -6
  124. data/lib/puppet/pops/types/p_timestamp_type.rb +2 -2
  125. data/lib/puppet/pops/types/p_type_set_type.rb +7 -16
  126. data/lib/puppet/pops/types/recursion_guard.rb +64 -20
  127. data/lib/puppet/pops/types/ruby_generator.rb +10 -0
  128. data/lib/puppet/pops/types/type_calculator.rb +23 -13
  129. data/lib/puppet/pops/types/type_factory.rb +20 -9
  130. data/lib/puppet/pops/types/type_formatter.rb +37 -17
  131. data/lib/puppet/pops/types/type_mismatch_describer.rb +7 -6
  132. data/lib/puppet/pops/types/type_parser.rb +6 -0
  133. data/lib/puppet/pops/types/types.rb +225 -132
  134. data/lib/puppet/pops/validation.rb +1 -1
  135. data/lib/puppet/pops/validation/checker4_0.rb +12 -2
  136. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  137. data/lib/puppet/pops/visitor.rb +4 -3
  138. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -1
  139. data/lib/puppet/provider/nameservice.rb +15 -0
  140. data/lib/puppet/provider/package/appdmg.rb +1 -1
  141. data/lib/puppet/provider/package/dnf.rb +1 -1
  142. data/lib/puppet/provider/package/pkg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  144. data/lib/puppet/provider/package/pkgng.rb +1 -1
  145. data/lib/puppet/provider/package/rpm.rb +2 -2
  146. data/lib/puppet/provider/service/smf.rb +3 -3
  147. data/lib/puppet/provider/service/systemd.rb +5 -1
  148. data/lib/puppet/provider/user/directoryservice.rb +1 -0
  149. data/lib/puppet/provider/user/user_role_add.rb +15 -0
  150. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  151. data/lib/puppet/provider/zone/solaris.rb +4 -1
  152. data/lib/puppet/reference/indirection.rb +1 -1
  153. data/lib/puppet/resource.rb +2 -3
  154. data/lib/puppet/resource/catalog.rb +12 -4
  155. data/lib/puppet/resource/type.rb +3 -3
  156. data/lib/puppet/settings.rb +1 -1
  157. data/lib/puppet/settings/config_file.rb +2 -1
  158. data/lib/puppet/settings/directory_setting.rb +6 -0
  159. data/lib/puppet/settings/environment_conf.rb +6 -2
  160. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  161. data/lib/puppet/settings/file_setting.rb +10 -0
  162. data/lib/puppet/ssl/certificate_authority.rb +13 -2
  163. data/lib/puppet/ssl/host.rb +23 -1
  164. data/lib/puppet/transaction/additional_resource_generator.rb +7 -0
  165. data/lib/puppet/type/user.rb +16 -3
  166. data/lib/puppet/util.rb +1 -0
  167. data/lib/puppet/util/execution.rb +3 -3
  168. data/lib/puppet/util/filetype.rb +11 -5
  169. data/lib/puppet/util/logging.rb +2 -1
  170. data/lib/puppet/util/network_device/config.rb +1 -1
  171. data/lib/puppet/util/plist.rb +6 -0
  172. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  173. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  174. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  175. data/lib/puppet/util/windows/adsi.rb +15 -12
  176. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  177. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  178. data/lib/puppet/vendor/require_vendored.rb +0 -1
  179. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  180. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  181. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  182. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  183. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +58 -0
  184. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  185. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  186. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  187. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  188. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  189. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  190. data/lib/puppet/version.rb +1 -1
  191. data/lib/semver.rb +19 -12
  192. data/locales/config.yaml +29 -0
  193. data/locales/puppet.pot +79 -0
  194. data/man/man5/puppet.conf.5 +1 -1
  195. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/{data.pp → environment/data.pp} +0 -0
  196. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +2 -0
  197. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +1 -1
  198. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
  199. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
  200. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
  201. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
  202. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
  203. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  204. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
  205. data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
  206. data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
  207. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
  208. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
  209. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
  210. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
  211. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
  212. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
  213. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +0 -0
  214. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/manifests/init.pp +0 -0
  215. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
  216. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
  217. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
  218. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/data/empty.json +0 -0
  219. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/hiera.yaml +0 -0
  220. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/manifests/init.pp +0 -0
  221. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/metadata.json +0 -0
  222. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/data/empty_key.json +0 -0
  223. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/hiera.yaml +0 -0
  224. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/manifests/init.pp +0 -0
  225. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/metadata.json +0 -0
  226. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/data/empty_key.yaml +0 -0
  227. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/hiera.yaml +0 -0
  228. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/manifests/init.pp +0 -0
  229. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/metadata.json +0 -0
  230. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/data/empty.yaml +0 -0
  231. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/hiera.yaml +0 -0
  232. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/manifests/init.pp +0 -0
  233. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/metadata.json +0 -0
  234. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/data/first.json +0 -0
  235. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/hiera.yaml +0 -0
  236. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/manifests/init.pp +0 -0
  237. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/metadata.json +0 -0
  238. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +0 -0
  239. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/manifests/init.pp +0 -0
  240. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/metadata.json +0 -0
  241. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +0 -0
  242. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +0 -0
  243. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/manifests/init.pp +0 -0
  244. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/metadata.json +0 -0
  245. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
  246. data/spec/integration/application/apply_spec.rb +88 -2
  247. data/spec/integration/application/lookup_spec.rb +155 -0
  248. data/spec/integration/data_binding_spec.rb +5 -5
  249. data/spec/integration/defaults_spec.rb +13 -0
  250. data/spec/integration/environments/default_manifest_spec.rb +16 -16
  251. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  252. data/spec/integration/test/test_helper_spec.rb +6 -2
  253. data/spec/integration/transaction_spec.rb +74 -0
  254. data/spec/integration/util/execution_spec.rb +8 -0
  255. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  256. data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
  257. data/spec/lib/puppet_spec/unindent.rb +2 -2
  258. data/spec/unit/application/face_base_spec.rb +16 -0
  259. data/spec/unit/application/lookup_spec.rb +262 -227
  260. data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
  261. data/spec/unit/data_providers/function_data_provider_spec.rb +2 -2
  262. data/spec/unit/data_providers/hiera_data_provider_spec.rb +60 -97
  263. data/spec/unit/defaults_spec.rb +1 -1
  264. data/spec/unit/face/ca_spec.rb +10 -0
  265. data/spec/unit/face/certificate_request_spec.rb +10 -0
  266. data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
  267. data/spec/unit/face/file_spec.rb +4 -0
  268. data/spec/unit/face/help_spec.rb +17 -0
  269. data/spec/unit/face/key_spec.rb +10 -0
  270. data/spec/unit/face/status_spec.rb +10 -0
  271. data/spec/unit/file_system_spec.rb +143 -6
  272. data/spec/unit/functions/binary_file_spec.rb +1 -1
  273. data/spec/unit/functions/hiera_spec.rb +257 -47
  274. data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
  275. data/spec/unit/functions/lookup_spec.rb +1319 -608
  276. data/spec/unit/functions/new_spec.rb +3 -3
  277. data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
  278. data/spec/unit/graph/simple_graph_spec.rb +1 -1
  279. data/spec/unit/hiera/scope_spec.rb +4 -4
  280. data/spec/unit/indirector/request_spec.rb +9 -0
  281. data/spec/unit/interface_spec.rb +27 -0
  282. data/spec/unit/man_spec.rb +1 -1
  283. data/spec/unit/module_spec.rb +1 -1
  284. data/spec/unit/module_tool/applications/builder_spec.rb +16 -1
  285. data/spec/unit/module_tool/applications/installer_spec.rb +1 -1
  286. data/spec/unit/module_tool/applications/upgrader_spec.rb +1 -1
  287. data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
  288. data/spec/unit/module_tool_spec.rb +3 -3
  289. data/spec/unit/network/http/connection_spec.rb +10 -0
  290. data/spec/unit/network/http/webrick_spec.rb +1 -1
  291. data/spec/unit/pops/evaluator/access_ops_spec.rb +2 -2
  292. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +9 -9
  293. data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
  294. data/spec/unit/pops/lookup/context_spec.rb +45 -16
  295. data/spec/unit/pops/lookup/interpolation_spec.rb +28 -20
  296. data/spec/unit/pops/lookup/lookup_spec.rb +197 -0
  297. data/spec/unit/pops/merge_strategy_spec.rb +18 -0
  298. data/spec/unit/pops/parser/lexer2_spec.rb +16 -1
  299. data/spec/unit/pops/parser/parse_site_spec.rb +4 -0
  300. data/spec/unit/pops/serialization/packer_spec.rb +4 -23
  301. data/spec/unit/pops/serialization/serialization_spec.rb +32 -8
  302. data/spec/unit/pops/types/p_object_type_spec.rb +68 -3
  303. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +4 -4
  304. data/spec/unit/pops/types/p_type_set_type_spec.rb +31 -2
  305. data/spec/unit/pops/types/type_acceptor_spec.rb +18 -17
  306. data/spec/unit/pops/types/type_calculator_spec.rb +39 -40
  307. data/spec/unit/pops/types/type_factory_spec.rb +3 -3
  308. data/spec/unit/pops/types/type_formatter_spec.rb +7 -3
  309. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +13 -2
  310. data/spec/unit/pops/types/types_spec.rb +25 -2
  311. data/spec/unit/pops/validator/validator_spec.rb +60 -4
  312. data/spec/unit/provider/nameservice_spec.rb +42 -0
  313. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  314. data/spec/unit/provider/package/pkg_spec.rb +22 -0
  315. data/spec/unit/provider/package/pkgng_spec.rb +12 -0
  316. data/spec/unit/provider/package/rpm_spec.rb +8 -8
  317. data/spec/unit/provider/service/smf_spec.rb +13 -11
  318. data/spec/unit/provider/service/systemd_spec.rb +8 -1
  319. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  320. data/spec/unit/puppet_spec.rb +14 -0
  321. data/spec/unit/resource/catalog_spec.rb +15 -9
  322. data/spec/unit/resource_spec.rb +20 -17
  323. data/spec/unit/semver_spec.rb +14 -0
  324. data/spec/unit/ssl/certificate_authority_spec.rb +12 -1
  325. data/spec/unit/transaction/additional_resource_generator_spec.rb +11 -0
  326. data/spec/unit/type/user_spec.rb +32 -6
  327. data/spec/unit/util/filetype_spec.rb +3 -3
  328. data/spec/unit/util/yaml_spec.rb +1 -1
  329. data/spec/unit/util_spec.rb +10 -2
  330. data/tasks/i18n.rake +20 -0
  331. metadata +2661 -2593
  332. data/lib/puppet/data_providers/lookup_adapter.rb +0 -254
  333. data/lib/puppet/vendor/load_semantic.rb +0 -1
  334. data/lib/puppet/vendor/semantic/Gemfile +0 -20
  335. data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
  336. data/lib/puppet/vendor/semantic/Rakefile +0 -69
  337. data/lib/puppet/vendor/semantic/lib/semantic.rb +0 -7
  338. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +0 -60
  339. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
  340. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
  341. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
  342. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
  343. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
  344. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
  345. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
  346. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
  347. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
  348. data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
@@ -143,13 +143,13 @@ class Locator
143
143
  # Create a locator based on a content string, and a boolean indicating if ruby version support multi-byte strings
144
144
  # or not.
145
145
  #
146
- def initialize(string, file, index = nil)
146
+ def initialize(string, file, line_index = nil)
147
147
  @string = string.freeze
148
148
  @file = file.freeze
149
149
  @prev_offset = nil
150
150
  @prev_line = nil
151
- @line_index = index
152
- compute_line_index if index.nil?
151
+ @line_index = line_index
152
+ compute_line_index if line_index.nil?
153
153
  end
154
154
 
155
155
  # Returns the position on line (first position on a line is 1)
@@ -76,9 +76,10 @@ module SlurpSupport
76
76
  # Process unicode escapes first as they require getting 4 hex digits
77
77
  # If later a \u is found it is warned not to be a unicode escape
78
78
  if escapes.include?('u')
79
- str.gsub!(/\\u(?:([\da-fA-F]{4})|\{([\da-fA-F]{1,6})\})/m) {
80
- [($1 || $2).hex].pack("U")
81
- }
79
+ # gsub must be repeated to cater for adjacent escapes
80
+ while(str.gsub!(/((?:[^\\]|^)(?:[\\]{2})*)\\u(?:([\da-fA-F]{4})|\{([\da-fA-F]{1,6})\})/m) { $1 + [($2 || $3).hex].pack("U") })
81
+ # empty block. Everything happens in the gsub block
82
+ end
82
83
  end
83
84
 
84
85
  begin
@@ -4,6 +4,7 @@ module Puppet::Pops
4
4
  module Pcore
5
5
  TYPE_URI_RX = Types::TypeFactory.regexp(URI.regexp)
6
6
  TYPE_URI = Types::TypeFactory.pattern(TYPE_URI_RX)
7
+ TYPE_URI_ALIAS = Types::PTypeAliasType.new('Pcore::URI', nil, TYPE_URI)
7
8
  TYPE_SIMPLE_TYPE_NAME = Types::TypeFactory.pattern(/\A[A-Z]\w*\z/)
8
9
  TYPE_QUALIFIED_REFERENCE = Types::TypeFactory.pattern(/\A[A-Z][\w]*(?:::[A-Z][\w]*)*\z/)
9
10
 
@@ -11,30 +12,36 @@ module Pcore
11
12
  KEY_PCORE_VERSION = 'pcore_version'.freeze
12
13
 
13
14
  PCORE_URI = 'http://puppet.com/2016.1/pcore'
14
- PCORE_VERSION = Semantic::Version.new(1,0,0)
15
- PARSABLE_PCORE_VERSIONS = Semantic::VersionRange.parse('1.x')
15
+ PCORE_VERSION = SemanticPuppet::Version.new(1,0,0)
16
+ PARSABLE_PCORE_VERSIONS = SemanticPuppet::VersionRange.parse('1.x')
16
17
 
17
18
  RUNTIME_NAME_AUTHORITY = 'http://puppet.com/2016.1/runtime'
18
19
 
19
- def self.init(loader, ir)
20
+ def self.init(loader, ir, for_agent)
20
21
  add_alias('Pcore::URI_RX', TYPE_URI_RX, loader)
21
- add_alias('Pcore::URI', TYPE_URI, loader)
22
+ add_type(TYPE_URI_ALIAS, loader)
22
23
  add_alias('Pcore::SimpleTypeName', TYPE_SIMPLE_TYPE_NAME, loader)
23
24
  add_alias('Pcore::TypeName', TYPE_QUALIFIED_REFERENCE, loader)
24
25
  add_alias('Pcore::QRef', TYPE_QUALIFIED_REFERENCE, loader)
26
+ begin
25
27
  Types::TypedModelObject.register_ptypes(loader, ir)
28
+ rescue Exception => e
29
+ puts e.message
30
+ end
26
31
 
27
32
  ir.register_implementation_namespace('Pcore', 'Puppet::Pops::Pcore', loader)
28
- ir.register_implementation_namespace('Puppet::AST', 'Puppet::Pops::Model', loader)
29
- ast_type_set = Serialization::RGen::TypeGenerator.new.generate_type_set('Puppet::AST', Puppet::Pops::Model, loader)
33
+ unless for_agent
34
+ ir.register_implementation_namespace('Puppet::AST', 'Puppet::Pops::Model', loader)
35
+ ast_type_set = Serialization::RGen::TypeGenerator.new.generate_type_set('Puppet::AST', Puppet::Pops::Model, loader)
30
36
 
31
- # Extend the Puppet::AST type set with the Locator (it's not an RGen class, but nevertheless, used in the model)
32
- ast_ts_i12n = ast_type_set.i12n_hash
33
- ast_ts_i12n['types'] = ast_ts_i12n['types'].merge('Locator' => Parser::Locator::Locator19.register_ptype(loader, ir))
34
- add_type(Types::PTypeSetType.new(ast_ts_i12n), loader)
37
+ # Extend the Puppet::AST type set with the Locator (it's not an RGen class, but nevertheless, used in the model)
38
+ ast_ts_i12n = ast_type_set.i12n_hash
39
+ ast_ts_i12n['types'] = ast_ts_i12n['types'].merge('Locator' => Parser::Locator::Locator19.register_ptype(loader, ir))
40
+ add_type(Types::PTypeSetType.new(ast_ts_i12n), loader)
35
41
 
36
- Resource.register_ptypes(loader, ir)
37
- Lookup::Context.register_ptype(loader, ir);
42
+ Resource.register_ptypes(loader, ir)
43
+ Lookup::Context.register_ptype(loader, ir);
44
+ end
38
45
  end
39
46
 
40
47
  # Create and register a new `Object` type in the Puppet Type System and map it to an implementation class
@@ -82,6 +89,8 @@ module Pcore
82
89
  aliases.each do |name, type_string|
83
90
  add_type(Types::PTypeAliasType.new(name, Types::TypeFactory.type_reference(type_string), nil), loader, name_authority)
84
91
  end
92
+ parser = Types::TypeParser.singleton
93
+ aliases.each_key.map { |name| loader.load(:type, name.downcase).resolve(parser, loader) }
85
94
  end
86
95
  end
87
96
  end
@@ -105,8 +105,12 @@ class AbstractReader
105
105
  read_payload(data) { |ep| Extension::MapStart.new(ep.read) }
106
106
  end
107
107
 
108
+ register_type(Extension::PCORE_OBJECT_START) do |data|
109
+ read_payload(data) { |ep| type_name = read_tpl_qname(ep); Extension::PcoreObjectStart.new(type_name, ep.read) }
110
+ end
111
+
108
112
  register_type(Extension::OBJECT_START) do |data|
109
- read_payload(data) { |ep| type_name = read_tpl_qname(ep); Extension::ObjectStart.new(type_name, ep.read) }
113
+ read_payload(data) { |ep| Extension::ObjectStart.new(ep.read) }
110
114
  end
111
115
 
112
116
  register_type(Extension::DEFAULT) do |data|
@@ -117,12 +121,16 @@ class AbstractReader
117
121
  read_payload(data) { |ep| Extension::Comment.new(ep.read) }
118
122
  end
119
123
 
124
+ register_type(Extension::SENSITIVE_START) do |data|
125
+ read_payload(data) { |ep| Extension::SensitiveStart::INSTANCE }
126
+ end
127
+
120
128
  register_type(Extension::REGEXP) do |data|
121
129
  read_payload(data) { |ep| Regexp.new(ep.read) }
122
130
  end
123
131
 
124
132
  register_type(Extension::TYPE_REFERENCE) do |data|
125
- read_payload(data) { |ep| Types::PTypeReferenceType.new(read_tpl_qname(ep)) }
133
+ read_payload(data) { |ep| Types::PTypeReferenceType.new(ep.read) }
126
134
  end
127
135
 
128
136
  register_type(Extension::SYMBOL) do |data|
@@ -146,19 +154,21 @@ class AbstractReader
146
154
  end
147
155
 
148
156
  register_type(Extension::VERSION) do |data|
149
- read_payload(data) { |ep| Semantic::Version.parse(ep.read) }
157
+ read_payload(data) { |ep| SemanticPuppet::Version.parse(ep.read) }
150
158
  end
151
159
 
152
160
  register_type(Extension::VERSION_RANGE) do |data|
153
- read_payload(data) { |ep| Semantic::VersionRange.parse(ep.read) }
161
+ read_payload(data) { |ep| SemanticPuppet::VersionRange.parse(ep.read) }
154
162
  end
155
163
 
156
- register_type(Extension::SENSITIVE) do |data|
157
- read_payload(data) { |ep| Types::PSensitiveType::Sensitive.new(ep.read) }
164
+ register_type(Extension::BASE64) do |data|
165
+ read_payload(data) { |ep| Types::PBinaryType::Binary.from_base64_strict(ep.read) }
158
166
  end
159
167
 
160
168
  register_type(Extension::BINARY) do |data|
161
- read_payload(data) { |ep| Types::PBinaryType::Binary.from_base64_strict(ep.read) }
169
+ # The Ruby MessagePack implementation have special treatment for "ASCII-8BIT" strings. They
170
+ # are written as binary data.
171
+ read_payload(data) { |ep| Types::PBinaryType::Binary.new(ep.read) }
162
172
  end
163
173
  end
164
174
  end
@@ -45,6 +45,10 @@ class AbstractWriter
45
45
  @packer.flush
46
46
  end
47
47
 
48
+ def supports_binary?
49
+ false
50
+ end
51
+
48
52
  # Write a value on the underlying stream
49
53
  # @api public
50
54
  def write(value)
@@ -53,7 +57,7 @@ class AbstractWriter
53
57
  when Integer
54
58
  # not tabulated, but integers larger than 64-bit cannot be allowed.
55
59
  raise SerializationError, 'Integer out of bounds' if value > MAX_INTEGER || value < MIN_INTEGER
56
- when Numeric, Symbol, Types::PSensitiveType::Sensitive, Extension::NotTabulated, true, false, nil
60
+ when Numeric, Symbol, Extension::NotTabulated, true, false, nil
57
61
  # not tabulated
58
62
  else
59
63
  if @tabulate
@@ -134,10 +138,14 @@ class AbstractWriter
134
138
  build_payload { |ep| ep.write(o.size) }
135
139
  end
136
140
 
137
- register_type(Extension::OBJECT_START, Extension::ObjectStart) do |o|
141
+ register_type(Extension::PCORE_OBJECT_START, Extension::PcoreObjectStart) do |o|
138
142
  build_payload { |ep| write_tpl_qname(ep, o.type_name); ep.write(o.attribute_count) }
139
143
  end
140
144
 
145
+ register_type(Extension::OBJECT_START, Extension::ObjectStart) do |o|
146
+ build_payload { |ep| ep.write(o.attribute_count) }
147
+ end
148
+
141
149
  # 0x20 - 0x2f reserved for special extension objects
142
150
 
143
151
  register_type(Extension::DEFAULT, Extension::Default) do |o|
@@ -148,6 +156,10 @@ class AbstractWriter
148
156
  build_payload { |ep| ep.write(o.comment) }
149
157
  end
150
158
 
159
+ register_type(Extension::SENSITIVE_START, Extension::SensitiveStart) do |o|
160
+ build_payload { |ep| }
161
+ end
162
+
151
163
  # 0x30 - 0x7f reserved for mapping of specific runtime classes
152
164
 
153
165
  register_type(Extension::REGEXP, Regexp) do |o|
@@ -155,7 +167,7 @@ class AbstractWriter
155
167
  end
156
168
 
157
169
  register_type(Extension::TYPE_REFERENCE, Types::PTypeReferenceType) do |o|
158
- build_payload { |ep| write_tpl_qname(ep, o.type_string) }
170
+ build_payload { |ep| ep.write(o.type_string) }
159
171
  end
160
172
 
161
173
  register_type(Extension::SYMBOL, Symbol) do |o|
@@ -170,23 +182,26 @@ class AbstractWriter
170
182
  build_payload { |ep| nsecs = o.nsecs; ep.write(nsecs / 1000000000); ep.write(nsecs % 1000000000) }
171
183
  end
172
184
 
173
- register_type(Extension::VERSION, Semantic::Version) do |o|
185
+ register_type(Extension::VERSION, SemanticPuppet::Version) do |o|
174
186
  build_payload { |ep| ep.write(o.to_s) }
175
187
  end
176
188
 
177
- register_type(Extension::VERSION_RANGE, Semantic::VersionRange) do |o|
189
+ register_type(Extension::VERSION_RANGE, SemanticPuppet::VersionRange) do |o|
178
190
  build_payload { |ep| ep.write(o.to_s) }
179
191
  end
180
192
 
181
- register_type(Extension::SENSITIVE, Types::PSensitiveType::Sensitive) do |o|
182
- build_payload { |ep| ep.write(o.unwrap) }
183
- end
184
-
185
- register_type(Extension::BINARY, Types::PBinaryType::Binary) do |o|
186
- build_payload { |ep| ep.write(o.to_s) }
193
+ if supports_binary?
194
+ register_type(Extension::BINARY, Types::PBinaryType::Binary) do |o|
195
+ # The Ruby MessagePack implementation has special treatment for "ASCII-8BIT" strings. They
196
+ # are written as binary data.
197
+ build_payload { |ep| ep.write(o.binary_buffer) }
198
+ end
199
+ else
200
+ register_type(Extension::BASE64, Types::PBinaryType::Binary) do |o|
201
+ build_payload { |ep| ep.write(o.to_s) }
202
+ end
187
203
  end
188
204
  end
189
205
  end
190
206
  end
191
207
  end
192
-
@@ -8,7 +8,7 @@ module Serialization
8
8
  class Deserializer
9
9
  # Provides access to the reader.
10
10
  # @api private
11
- attr_reader :reader
11
+ attr_reader :reader, :loader
12
12
 
13
13
  # @param [AbstractReader] reader the reader used when reading primitive objects from a stream
14
14
  # @param [Loader::Loader] loader the loader used when resolving names of types
@@ -38,12 +38,25 @@ module Serialization
38
38
  result = remember({})
39
39
  val.size.times { key = read; result[key] = read }
40
40
  result
41
- when Extension::ObjectStart
41
+ when Extension::SensitiveStart
42
+ Types::PSensitiveType::Sensitive.new(read)
43
+ when Extension::PcoreObjectStart
42
44
  type_name = val.type_name
43
45
  type = Types::TypeParser.singleton.parse(type_name, @loader)
44
46
  raise SerializationError, "No implementation mapping found for Puppet Type #{type_name}" if type.is_a?(Types::PTypeReferenceType)
45
- type.read(val.attribute_count, self)
46
- when Numeric, String, true, false, nil, Time
47
+ result = type.read(val.attribute_count, self)
48
+ if result.is_a?(Types::PObjectType)
49
+ existing_type = loader.load(:type, result.name)
50
+
51
+ # Add result to the loader unless it is the exact same instance as the existing_type. The add
52
+ # will succeed when the existing_type is nil.
53
+ loader.add_entry(:type, result.name, result, nil) unless result.equal?(existing_type)
54
+ end
55
+ result
56
+ when Extension::ObjectStart
57
+ type = read
58
+ type.read(val.attribute_count - 1, self)
59
+ when Numeric, String, true, false, nil
47
60
  val
48
61
  else
49
62
  remember(val)
@@ -12,7 +12,9 @@ module Extension
12
12
  # 0x10 - 0x1F are reserved for structural extensions
13
13
  ARRAY_START = 0x10
14
14
  MAP_START = 0x11
15
- OBJECT_START = 0x12
15
+ PCORE_OBJECT_START = 0x12
16
+ OBJECT_START = 0x13
17
+ SENSITIVE_START = 0x14
16
18
 
17
19
  # 0x20 - 0x2f reserved for special extension objects
18
20
  DEFAULT = 0x20
@@ -26,13 +28,13 @@ module Extension
26
28
  TIMESPAN = 0x34
27
29
  VERSION = 0x35
28
30
  VERSION_RANGE = 0x36
29
- SENSITIVE = 0x37
30
- BINARY = 0x38
31
+ BINARY = 0x37
32
+ BASE64 = 0x38
31
33
 
32
34
  # Marker module indicating whether or not an instance is tabulated or not
33
35
  module NotTabulated; end
34
36
 
35
- # Marker module for objects that starts a sequence, i.e. ArrayStart, MapStart, and ObjectStart
37
+ # Marker module for objects that starts a sequence, i.e. ArrayStart, MapStart, and PcoreObjectStart
36
38
  module SequenceStart; end
37
39
 
38
40
  # The class that triggers the use of the DEFAULT extension. It doesn't have any payload
@@ -83,9 +85,15 @@ module Extension
83
85
  end
84
86
  end
85
87
 
86
- # The class that triggers the use of the OBJECT_START extension. The payload is the name of the object type and the
87
- # number of attributes in the instance.
88
- class ObjectStart
88
+ # The class that triggers the use of the SENSITIVE_START extension. It has no payload
89
+ class SensitiveStart
90
+ include NotTabulated
91
+ INSTANCE = SensitiveStart.new
92
+ end
93
+
94
+ # The class that triggers the use of the PCORE_OBJECT_START extension. The payload is the name of the object type
95
+ # and the number of attributes in the instance.
96
+ class PcoreObjectStart
89
97
  include SequenceStart
90
98
  attr_reader :type_name, :attribute_count
91
99
  def initialize(type_name, attribute_count)
@@ -98,7 +106,28 @@ module Extension
98
106
  end
99
107
 
100
108
  def eql?(o)
101
- o.is_a?(ObjectStart) && o.type_name == @type_name && o.attribute_count == @attribute_count
109
+ o.is_a?(PcoreObjectStart) && o.type_name == @type_name && o.attribute_count == @attribute_count
110
+ end
111
+ alias == eql?
112
+
113
+ def sequence_size
114
+ @attribute_count
115
+ end
116
+ end
117
+
118
+ class ObjectStart
119
+ include SequenceStart
120
+ attr_reader :attribute_count
121
+ def initialize(attribute_count)
122
+ @attribute_count = attribute_count
123
+ end
124
+
125
+ def hash
126
+ attribute_count.hash
127
+ end
128
+
129
+ def eql?(o)
130
+ o.is_a?(ObjectStart) && o.attribute_count == @attribute_count
102
131
  end
103
132
  alias == eql?
104
133
 
@@ -11,10 +11,10 @@ class ObjectReader
11
11
 
12
12
  def read(impl_class, value_count, deserializer)
13
13
  type = impl_class._ptype
14
- (names, types, required_count) = type.parameter_info
14
+ (names, types, required_count) = type.parameter_info(impl_class)
15
15
  max = names.size
16
16
  unless value_count >= required_count && value_count <= max
17
- raise Serialization::SerializationError, "Feature count mismatch for #{impl_class.name}. Expected #{min} - #{max}, actual #{value_count}"
17
+ raise Serialization::SerializationError, "Feature count mismatch for #{impl_class.name}. Expected #{required_count} - #{max}, actual #{value_count}"
18
18
  end
19
19
  # Deserializer must know about this instance before we read its attributes
20
20
  val = deserializer.remember(impl_class.allocate)
@@ -43,16 +43,24 @@ class ObjectWriter
43
43
 
44
44
  def write(type, value, serializer)
45
45
  impl_class = value.class
46
- (names, types, required_count) = type.parameter_info(true)
46
+ (names, types, required_count) = type.parameter_info(impl_class, true)
47
47
  args = names.map { |name| value.send(name) }
48
48
 
49
- # Pop optional arguments that are nil
49
+ # Pop optional arguments that are default
50
50
  while args.size > required_count
51
- break unless args.last.nil?
51
+ break unless args.last == type[names[args.size-1]].value
52
52
  args.pop
53
53
  end
54
54
 
55
- serializer.start_object(type.name, args.size)
55
+ if type.name.start_with?('Pcore::')
56
+ serializer.push_written(value)
57
+ serializer.start_pcore_object(type.name, args.size)
58
+ else
59
+ serializer.start_object(args.size + 1)
60
+ serializer.write(type)
61
+ serializer.push_written(value)
62
+ end
63
+
56
64
  args.each { |arg| serializer.write(arg) }
57
65
  end
58
66
 
@@ -37,7 +37,8 @@ module RGen
37
37
  def write(type, value, serializer)
38
38
  impl_class = value.class
39
39
  features = features(impl_class)
40
- serializer.start_object(type.name, features.size)
40
+ serializer.push_written(value)
41
+ serializer.start_pcore_object(type.name, features.size)
41
42
  features.each { |feature| serializer.write(value.getGeneric(feature.name)) }
42
43
  end
43
44
 
@@ -28,7 +28,7 @@ module Serialization
28
28
  # @api public
29
29
  def write(value)
30
30
  case value
31
- when Integer, Float, String, true, false, nil, Time
31
+ when Integer, Float, String, true, false, nil
32
32
  @writer.write(value)
33
33
  when :default
34
34
  @writer.write(Extension::Default::INSTANCE)
@@ -37,7 +37,7 @@ module Serialization
37
37
  if index.nil?
38
38
  write_tabulated_first_time(value)
39
39
  else
40
- @writer.write(Extension::Tabulation.new(index)) unless index.nil?
40
+ @writer.write(Extension::Tabulation.new(index))
41
41
  end
42
42
  end
43
43
  end
@@ -56,12 +56,29 @@ module Serialization
56
56
  @writer.write(Extension::MapStart.new(size))
57
57
  end
58
58
 
59
- # Write the start of a complex object
59
+ # Write the start of a complex pcore object
60
60
  # @param [String] type_ref the name of the type
61
61
  # @param [Integer] attr_count the number of attributes in the object
62
62
  # @api private
63
- def start_object(type_ref, attr_count)
64
- @writer.write(Extension::ObjectStart.new(type_ref, attr_count))
63
+ def start_pcore_object(type_ref, attr_count)
64
+ @writer.write(Extension::PcoreObjectStart.new(type_ref, attr_count))
65
+ end
66
+
67
+ # Write the start of a complex object
68
+ # @param [Integer] attr_count the number of attributes in the object
69
+ # @api private
70
+ def start_object(attr_count)
71
+ @writer.write(Extension::ObjectStart.new(attr_count))
72
+ end
73
+
74
+ def push_written(value)
75
+ @written[value.object_id] = @written.size
76
+ end
77
+
78
+ # Write the start of a sensitive object
79
+ # @api private
80
+ def start_sensitive
81
+ @writer.write(Extension::SensitiveStart::INSTANCE)
65
82
  end
66
83
 
67
84
  # First time write of a tabulated object. This means that the object is written and then remembered. Subsequent writes
@@ -69,17 +86,23 @@ module Serialization
69
86
  # @param [Object] value the value to write
70
87
  # @api private
71
88
  def write_tabulated_first_time(value)
72
- @written[value.object_id] = @written.size
73
89
  case value
74
- when Symbol, Regexp, Semantic::Version, Semantic::VersionRange, Time::Timestamp, Time::Timespan, Types::PSensitiveType::Sensitive, Types::PBinaryType::Binary
90
+ when Symbol, Regexp, SemanticPuppet::Version, SemanticPuppet::VersionRange, Time::Timestamp, Time::Timespan, Types::PBinaryType::Binary
91
+ push_written(value)
75
92
  @writer.write(value)
76
93
  when Array
94
+ push_written(value)
77
95
  start_array(value.size)
78
96
  value.each { |elem| write(elem) }
79
97
  when Hash
98
+ push_written(value)
80
99
  start_map(value.size)
81
100
  value.each_pair { |key, val| write(key); write(val) }
101
+ when Types::PSensitiveType::Sensitive
102
+ start_sensitive
103
+ write(value.unwrap)
82
104
  when Types::PTypeReferenceType
105
+ push_written(value)
83
106
  @writer.write(value)
84
107
  when Types::PuppetObject
85
108
  value._ptype.write(value, self)