puppet 4.8.2-x64-mingw32 → 4.9.0-x64-mingw32

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

Potentially problematic release.


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

Files changed (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 -2607
  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
@@ -59,7 +59,7 @@ module Types
59
59
  loader)
60
60
  end
61
61
 
62
- # Register a bidiractional regexp mapping
62
+ # Register a bidirectional regexp mapping
63
63
  #
64
64
  # @param type_name_subst [Array(Regexp,String)] regexp and replacement mapping type names to runtime names
65
65
  # @param impl_name_subst [Array(Regexp,String)] regexp and replacement mapping runtime names to type names
@@ -358,14 +358,14 @@ class PObjectType < PMetaType
358
358
  # @param i12n_hash [Hash{String=>Object}] The hash describing the Object features
359
359
  #
360
360
  # @api private
361
- def initialize(name_or_i12n_hash, i12n_hash_expression = nil)
361
+ def initialize(i12n_hash, i12n_hash_expression = nil)
362
362
  @attributes = EMPTY_HASH
363
363
  @functions = EMPTY_HASH
364
364
 
365
- if name_or_i12n_hash.is_a?(Hash)
366
- initialize_from_hash(name_or_i12n_hash)
365
+ if i12n_hash.is_a?(Hash)
366
+ initialize_from_hash(i12n_hash)
367
367
  else
368
- @name = TypeAsserter.assert_instance_of('object name', TYPE_OBJECT_NAME, name_or_i12n_hash)
368
+ @name = TypeAsserter.assert_instance_of('object name', TYPE_OBJECT_NAME, i12n_hash)
369
369
  @i12n_hash_expression = i12n_hash_expression
370
370
  end
371
371
  end
@@ -411,7 +411,7 @@ class PObjectType < PMetaType
411
411
  impl_class = implementation_class
412
412
  class_name = impl_class.name || "Anonymous Ruby class for #{name}"
413
413
 
414
- (param_names, param_types, required_param_count) = parameter_info
414
+ (param_names, param_types, required_param_count) = parameter_info(impl_class)
415
415
 
416
416
  # Create the callable with a size that reflects the required and optional parameters
417
417
  param_types << required_param_count
@@ -442,11 +442,17 @@ class PObjectType < PMetaType
442
442
  end
443
443
  end
444
444
 
445
- # Add the dispatch that uses the standard #new method on the class. It's assumed that the #new
445
+ # Add the dispatch that uses the standard #from_asserted_args or #new method on the class. It's assumed that the
446
446
  # method performs no assertions.
447
447
  dispatcher.add_dispatch(create_type, :create, param_names, nil, EMPTY_ARRAY, EMPTY_ARRAY, false)
448
- def create(*args)
449
- self.class.impl_class.new(*args)
448
+ if impl_class.respond_to?(:from_asserted_args)
449
+ def create(*args)
450
+ self.class.impl_class.from_asserted_args(*args)
451
+ end
452
+ else
453
+ def create(*args)
454
+ self.class.impl_class.new(*args)
455
+ end
450
456
  end
451
457
  end
452
458
  end
@@ -474,7 +480,7 @@ class PObjectType < PMetaType
474
480
 
475
481
  # @api private
476
482
  # @return [(Array<String>, Array<PAnyType>, Integer)] array of parameter names, array of parameter types, and a count reflecting the required number of parameters
477
- def parameter_info(attr_readers = false)
483
+ def parameter_info(impl_class, attr_readers = false)
478
484
  # Create a types and a names array where optional entries ends up last
479
485
  opt_types = []
480
486
  opt_names = []
@@ -491,6 +497,35 @@ class PObjectType < PMetaType
491
497
  end
492
498
  param_names = non_opt_names + opt_names
493
499
  param_types = non_opt_types + opt_types
500
+ param_count = param_names.size
501
+
502
+ init = impl_class.respond_to?(:from_asserted_args) ? impl_class.method(:from_asserted_args) : impl_class.instance_method(:initialize)
503
+ init_non_opt_count = 0
504
+ init_param_names = init.parameters.map do |p|
505
+ init_non_opt_count += 1 if :req == p[0]
506
+ p[1].to_s
507
+ end
508
+
509
+ if init_param_names != param_names
510
+ if init_param_names.size < param_count || init_non_opt_count > param_count
511
+ raise Serialization::SerializationError, "Initializer for class #{impl_class.name} does not match the attributes of #{name}"
512
+ end
513
+ init_param_names = init_param_names[0, param_count] if init_param_names.size > param_count
514
+ unless init_param_names == param_names
515
+ # Reorder needed to match initialize method arguments
516
+ new_param_types = []
517
+ init_param_names.each do |ip|
518
+ index = param_names.index(ip)
519
+ if index.nil?
520
+ raise Serialization::SerializationError,
521
+ "Initializer for class #{impl_class.name} parameter '#{ip}' does not match any of the the attributes of type #{name}"
522
+ end
523
+ new_param_types << param_types[index]
524
+ end
525
+ param_names = init_param_names
526
+ param_types = new_param_types
527
+ end
528
+ end
494
529
 
495
530
  [param_names, param_types, non_opt_types.size]
496
531
  end
@@ -620,6 +655,14 @@ class PObjectType < PMetaType
620
655
  @i12n_type ||= create_i12n_type
621
656
  end
622
657
 
658
+ def create(*args)
659
+ implementation_class.create(*args)
660
+ end
661
+
662
+ def from_hash(hash)
663
+ implementation_class.from_hash(hash)
664
+ end
665
+
623
666
  # Creates the type that a initialization hash used for creating instances of this type must conform to.
624
667
  #
625
668
  # @return [PStructType] the initialization hash type
@@ -816,8 +859,8 @@ class PObjectType < PMetaType
816
859
  def find_equality_definer_of(attr)
817
860
  type = self
818
861
  while !type.nil? do
819
- p = type.parent
820
- return type if p.nil?
862
+ p = type.resolved_parent
863
+ return type unless p.is_a?(PObjectType)
821
864
  return type unless p.equality_attributes.include?(attr.name)
822
865
  type = p
823
866
  end
@@ -827,7 +870,7 @@ class PObjectType < PMetaType
827
870
  def guarded_recursion(guard, dflt)
828
871
  if @self_recursion
829
872
  guard ||= RecursionGuard.new
830
- (guard.add_this(self) & RecursionGuard::SELF_RECURSION_IN_THIS) == 0 ? yield(guard) : dflt
873
+ guard.with_this(self) { |state| (state & RecursionGuard::SELF_RECURSION_IN_THIS) == 0 ? yield(guard) : dflt }
831
874
  else
832
875
  yield(guard)
833
876
  end
@@ -10,21 +10,21 @@ class PSemVerRangeType < PScalarType
10
10
  end
11
11
 
12
12
  # Check if a version is included in a version range. The version can be a string or
13
- # a `Semantic::SemVer`
13
+ # a `SemanticPuppet::SemVer`
14
14
  #
15
- # @param range [Semantic::VersionRange] the range to match against
16
- # @param version [Semantic::Version,String] the version to match
15
+ # @param range [SemanticPuppet::VersionRange] the range to match against
16
+ # @param version [SemanticPuppet::Version,String] the version to match
17
17
  # @return [Boolean] `true` if the range includes the given version
18
18
  #
19
19
  # @api public
20
20
  def self.include?(range, version)
21
21
  case version
22
- when Semantic::Version
22
+ when SemanticPuppet::Version
23
23
  range.include?(version)
24
24
  when String
25
25
  begin
26
- range.include?(Semantic::Version.parse(version))
27
- rescue Semantic::Version::ValidationFailure
26
+ range.include?(SemanticPuppet::Version.parse(version))
27
+ rescue SemanticPuppet::Version::ValidationFailure
28
28
  false
29
29
  end
30
30
  else
@@ -32,28 +32,28 @@ class PSemVerRangeType < PScalarType
32
32
  end
33
33
  end
34
34
 
35
- # Creates a {Semantic::VersionRange} from the given _version_range_ argument. If the argument is `nil` or
36
- # a {Semantic::VersionRange}, it is returned. If it is a {String}, it will be parsed into a
37
- # {Semantic::VersionRange}. Any other class will raise an {ArgumentError}.
35
+ # Creates a {SemanticPuppet::VersionRange} from the given _version_range_ argument. If the argument is `nil` or
36
+ # a {SemanticPuppet::VersionRange}, it is returned. If it is a {String}, it will be parsed into a
37
+ # {SemanticPuppet::VersionRange}. Any other class will raise an {ArgumentError}.
38
38
  #
39
- # @param version_range [Semantic::VersionRange,String,nil] the version range to convert
40
- # @return [Semantic::VersionRange] the converted version range
39
+ # @param version_range [SemanticPuppet::VersionRange,String,nil] the version range to convert
40
+ # @return [SemanticPuppet::VersionRange] the converted version range
41
41
  # @raise [ArgumentError] when the argument cannot be converted into a version range
42
42
  #
43
43
  def self.convert(version_range)
44
44
  case version_range
45
- when nil, Semantic::VersionRange
45
+ when nil, SemanticPuppet::VersionRange
46
46
  version_range
47
47
  when String
48
- Semantic::VersionRange.parse(version_range)
48
+ SemanticPuppet::VersionRange.parse(version_range)
49
49
  else
50
50
  raise ArgumentError, "Unable to convert a #{version_range.class.name} to a SemVerRange"
51
51
  end
52
52
  end
53
53
 
54
54
  # Checks if range _a_ is a sub-range of (i.e. completely covered by) range _b_
55
- # @param a [Semantic::VersionRange] the first range
56
- # @param b [Semantic::VersionRange] the second range
55
+ # @param a [SemanticPuppet::VersionRange] the first range
56
+ # @param b [SemanticPuppet::VersionRange] the second range
57
57
  #
58
58
  # @return [Boolean] `true` if _a_ is completely covered by _b_
59
59
  def self.covered_by?(a, b)
@@ -63,9 +63,9 @@ class PSemVerRangeType < PScalarType
63
63
  # Merge two ranges so that the result matches all versions matched by both. A merge
64
64
  # is only possible when the ranges are either adjacent or have an overlap.
65
65
  #
66
- # @param a [Semantic::VersionRange] the first range
67
- # @param b [Semantic::VersionRange] the second range
68
- # @return [Semantic::VersionRange,nil] the result of the merge
66
+ # @param a [SemanticPuppet::VersionRange] the first range
67
+ # @param b [SemanticPuppet::VersionRange] the second range
68
+ # @return [SemanticPuppet::VersionRange,nil] the result of the merge
69
69
  #
70
70
  # @api public
71
71
  def self.merge(a, b)
@@ -77,13 +77,13 @@ class PSemVerRangeType < PScalarType
77
77
  elsif b.exclude_end?
78
78
  exclude_end = max == b.end && (max > a.end || a.exclude_end?)
79
79
  end
80
- Semantic::VersionRange.new([a.begin, b.begin].min, max, exclude_end)
80
+ SemanticPuppet::VersionRange.new([a.begin, b.begin].min, max, exclude_end)
81
81
  elsif a.exclude_end? && a.end == b.begin
82
82
  # Adjacent, a before b
83
- Semantic::VersionRange.new(a.begin, b.end, b.exclude_end?)
83
+ SemanticPuppet::VersionRange.new(a.begin, b.end, b.exclude_end?)
84
84
  elsif b.exclude_end? && b.end == a.begin
85
85
  # Adjacent, b before a
86
- Semantic::VersionRange.new(b.begin, a.end, a.exclude_end?)
86
+ SemanticPuppet::VersionRange.new(b.begin, a.end, a.exclude_end?)
87
87
  else
88
88
  # No overlap
89
89
  nil
@@ -91,7 +91,7 @@ class PSemVerRangeType < PScalarType
91
91
  end
92
92
 
93
93
  def instance?(o, guard = nil)
94
- o.is_a?(Semantic::VersionRange)
94
+ o.is_a?(SemanticPuppet::VersionRange)
95
95
  end
96
96
 
97
97
  def eql?(o)
@@ -115,7 +115,7 @@ class PSemVerRangeType < PScalarType
115
115
  # https://github.com/npm/node-semver#range-grammar
116
116
  #
117
117
  # The logical or || operator is not implemented since it effectively builds
118
- # an array of ranges that may be disparate. The {{Semantic::VersionRange}} inherits
118
+ # an array of ranges that may be disparate. The {{SemanticPuppet::VersionRange}} inherits
119
119
  # from the standard ruby range. It must be possible to describe that range in terms
120
120
  # of min, max, and exclude max.
121
121
  #
@@ -144,13 +144,13 @@ class PSemVerRangeType < PScalarType
144
144
  end
145
145
 
146
146
  def from_string(str)
147
- Semantic::VersionRange.parse(str)
147
+ SemanticPuppet::VersionRange.parse(str)
148
148
  end
149
149
 
150
150
  def from_versions(min, max = :default, exclude_max = false)
151
- min = Semantic::Version::MIN if min == :default
152
- max = Semantic::Version::MAX if max == :default
153
- Semantic::VersionRange.new(min, max, exclude_max)
151
+ min = SemanticPuppet::Version::MIN if min == :default
152
+ max = SemanticPuppet::Version::MAX if max == :default
153
+ SemanticPuppet::VersionRange.new(min, max, exclude_max)
154
154
  end
155
155
 
156
156
  def from_hash(hash)
@@ -1,7 +1,7 @@
1
1
  module Puppet::Pops
2
2
  module Types
3
3
 
4
- # A Puppet Language Type that exposes the {{Semantic::Version}} and {{Semantic::VersionRange}}.
4
+ # A Puppet Language Type that exposes the {{SemanticPuppet::Version}} and {{SemanticPuppet::VersionRange}}.
5
5
  # The version type is parameterized with version ranges.
6
6
  #
7
7
  # @api public
@@ -18,13 +18,13 @@ class PSemVerType < PScalarType
18
18
  attr_reader :ranges
19
19
 
20
20
  def initialize(ranges)
21
- ranges = ranges.map { |range| range.is_a?(Semantic::VersionRange) ? range : Semantic::VersionRange.parse(range) }
21
+ ranges = ranges.map { |range| range.is_a?(SemanticPuppet::VersionRange) ? range : SemanticPuppet::VersionRange.parse(range) }
22
22
  ranges = merge_ranges(ranges) if ranges.size > 1
23
23
  @ranges = ranges
24
24
  end
25
25
 
26
26
  def instance?(o, guard = nil)
27
- o.is_a?(Semantic::Version) && (@ranges.empty? || @ranges.any? {|range| range.include?(o) })
27
+ o.is_a?(SemanticPuppet::Version) && (@ranges.empty? || @ranges.any? {|range| range.include?(o) })
28
28
  end
29
29
 
30
30
  def eql?(o)
@@ -36,19 +36,19 @@ class PSemVerType < PScalarType
36
36
  end
37
37
 
38
38
  # Creates a SemVer version from the given _version_ argument. If the argument is `nil` or
39
- # a {Semantic::Version}, it is returned. If it is a {String}, it will be parsed into a
40
- # {Semantic::Version}. Any other class will raise an {ArgumentError}.
39
+ # a {SemanticPuppet::Version}, it is returned. If it is a {String}, it will be parsed into a
40
+ # {SemanticPuppet::Version}. Any other class will raise an {ArgumentError}.
41
41
  #
42
- # @param version [Semantic::Version,String,nil] the version to convert
43
- # @return [Semantic::Version] the converted version
42
+ # @param version [SemanticPuppet::Version,String,nil] the version to convert
43
+ # @return [SemanticPuppet::Version] the converted version
44
44
  # @raise [ArgumentError] when the argument cannot be converted into a version
45
45
  #
46
46
  def self.convert(version)
47
47
  case version
48
- when nil, Semantic::Version
48
+ when nil, SemanticPuppet::Version
49
49
  version
50
50
  when String
51
- Semantic::Version.parse(version)
51
+ SemanticPuppet::Version.parse(version)
52
52
  else
53
53
  raise ArgumentError, "Unable to convert a #{version.class.name} to a SemVer"
54
54
  end
@@ -87,15 +87,15 @@ class PSemVerType < PScalarType
87
87
  end
88
88
 
89
89
  def from_string(str)
90
- Semantic::Version.parse(str)
90
+ SemanticPuppet::Version.parse(str)
91
91
  end
92
92
 
93
93
  def from_args(major, minor, patch, prerelease = nil, build = nil)
94
- Semantic::Version.new(major, minor, patch, prerelease, build)
94
+ SemanticPuppet::Version.new(major, minor, patch, prerelease, build)
95
95
  end
96
96
 
97
97
  def from_hash(hash)
98
- Semantic::Version.new(hash['major'], hash['minor'], hash['patch'], hash['prerelease'], hash['build'])
98
+ SemanticPuppet::Version.new(hash['major'], hash['minor'], hash['patch'], hash['prerelease'], hash['build'])
99
99
  end
100
100
  end
101
101
  end
@@ -1,10 +1,10 @@
1
1
  module Puppet::Pops
2
2
  module Types
3
3
  class PAbstractTimeDataType < PAbstractRangeType
4
- # @param [AbstractTime] min lower bound for this type. Nil or :default means unbounded
5
- # @param [AbstractTime] max upper bound for this type. Nil or :default means unbounded
6
- def initialize(min = nil, max = nil)
7
- super(convert_arg(min, true), convert_arg(max, false))
4
+ # @param from [AbstractTime] lower bound for this type. Nil or :default means unbounded
5
+ # @param to [AbstractTime] upper bound for this type. Nil or :default means unbounded
6
+ def initialize(from = nil, to = nil)
7
+ super(convert_arg(from, true), convert_arg(to, false))
8
8
  end
9
9
 
10
10
  def convert_arg(arg, min)
@@ -51,8 +51,8 @@ module Types
51
51
  class PTimespanType < PAbstractTimeDataType
52
52
  def self.register_ptype(loader, ir)
53
53
  create_ptype(loader, ir, 'ScalarType',
54
- 'from' => { KEY_TYPE => PTimespanType::DEFAULT, KEY_VALUE => :default },
55
- 'to' => { KEY_TYPE => PTimespanType::DEFAULT, KEY_VALUE => :default }
54
+ 'from' => { KEY_TYPE => POptionalType.new(PTimespanType::DEFAULT), KEY_VALUE => nil },
55
+ 'to' => { KEY_TYPE => POptionalType.new(PTimespanType::DEFAULT), KEY_VALUE => nil }
56
56
  )
57
57
  end
58
58
 
@@ -3,8 +3,8 @@ module Types
3
3
  class PTimestampType < PAbstractTimeDataType
4
4
  def self.register_ptype(loader, ir)
5
5
  create_ptype(loader, ir, 'ScalarType',
6
- 'from' => { KEY_TYPE => PTimestampType::DEFAULT, KEY_VALUE => :default },
7
- 'to' => { KEY_TYPE => PTimestampType::DEFAULT, KEY_VALUE => :default }
6
+ 'from' => { KEY_TYPE => POptionalType.new(PTimestampType::DEFAULT), KEY_VALUE => nil },
7
+ 'to' => { KEY_TYPE => POptionalType.new(PTimestampType::DEFAULT), KEY_VALUE => nil }
8
8
  )
9
9
  end
10
10
 
@@ -216,27 +216,18 @@ class PTypeSetType < PMetaType
216
216
  # @return [String] the name by which the type is referenced within this type set
217
217
  #
218
218
  # @api private
219
- def name_for(t)
219
+ def name_for(t, default_name)
220
220
  key = @types.key(t)
221
221
  if key.nil?
222
222
  qname = t.name
223
223
  if @references.empty?
224
- qname
224
+ default_name
225
225
  else
226
- segments = qname.split(TypeFormatter::NAME_SEGMENT_SEPARATOR)
227
- first = segments[0]
228
- type_set = @references[first]
229
- if type_set.nil?
230
- qname
231
- else
232
- if segments.size == 1
233
- qname
234
- else
235
- sub_name = type_set.name_for(t)
236
- sub_name = "#{first}::#{sub_name}" unless sub_name == qname
237
- sub_name
238
- end
226
+ @references.each_pair do |ref_key, ref|
227
+ ref_name = ref.type_set.name_for(t, nil)
228
+ return "#{ref_key}::#{ref_name}" unless ref_name.nil?
239
229
  end
230
+ default_name
240
231
  end
241
232
  else
242
233
  key
@@ -332,7 +323,7 @@ class PTypeSetType < PMetaType
332
323
  KEY_NAME_AUTHORITY => Pcore::RUNTIME_NAME_AUTHORITY,
333
324
  Pcore::KEY_PCORE_URI => Pcore::PCORE_URI,
334
325
  Pcore::KEY_PCORE_VERSION => Pcore::PCORE_VERSION,
335
- KEY_VERSION => Semantic::Version.new(0,0,0)
326
+ KEY_VERSION => SemanticPuppet::Version.new(0,0,0)
336
327
  })
337
328
 
338
329
  protected
@@ -24,14 +24,54 @@ class RecursionGuard
24
24
  # @param instance [Object] the instance to check
25
25
  # @return [Integer] the resulting state
26
26
  def recursive_this?(instance)
27
- this_map[instance.object_id] == true
27
+ instance_variable_defined?(:@recursive_this_map) && @recursive_this_map.has_key?(instance.object_id)
28
28
  end
29
29
 
30
30
  # Checks if recursion was detected for the given argument in the 'that' context
31
31
  # @param instance [Object] the instance to check
32
32
  # @return [Integer] the resulting state
33
33
  def recursive_that?(instance)
34
- that_map[instance.object_id] == true
34
+ instance_variable_defined?(:@recursive_that_map) && @recursive_that_map.has_key?(instance.object_id)
35
+ end
36
+
37
+ # Add the given argument as 'this' invoke the given block with the resulting state
38
+ # @param instance [Object] the instance to add
39
+ # @return [Object] the result of yielding
40
+ def with_this(instance)
41
+ if (@state & SELF_RECURSION_IN_THIS) == 0
42
+ tc = this_count
43
+ @state = @state | SELF_RECURSION_IN_THIS if this_put(instance)
44
+ if tc < this_count
45
+ # recursive state detected
46
+ result = yield(@state)
47
+
48
+ # pop state
49
+ @state &= ~SELF_RECURSION_IN_THIS
50
+ @this_map.delete(instance.object_id)
51
+ return result
52
+ end
53
+ end
54
+ yield(@state)
55
+ end
56
+
57
+ # Add the given argument as 'that' invoke the given block with the resulting state
58
+ # @param instance [Object] the instance to add
59
+ # @return [Object] the result of yielding
60
+ def with_that(instance)
61
+ if (@state & SELF_RECURSION_IN_THAT) == 0
62
+ tc = that_count
63
+ @state = @state | SELF_RECURSION_IN_THAT if that_put(instance)
64
+ if tc < that_count
65
+ # recursive state detected
66
+ result = yield(@state)
67
+
68
+ # pop state
69
+ @state &= ~SELF_RECURSION_IN_THAT
70
+ @that_map.delete(instance.object_id)
71
+ return result
72
+ end
73
+ end
74
+ yield(@state)
35
75
  end
36
76
 
37
77
  # Add the given argument as 'this' and return the resulting state
@@ -39,7 +79,7 @@ class RecursionGuard
39
79
  # @return [Integer] the resulting state
40
80
  def add_this(instance)
41
81
  if (@state & SELF_RECURSION_IN_THIS) == 0
42
- @state = @state | SELF_RECURSION_IN_THIS if map_put(this_map, instance)
82
+ @state = @state | SELF_RECURSION_IN_THIS if this_put(instance)
43
83
  end
44
84
  @state
45
85
  end
@@ -49,43 +89,47 @@ class RecursionGuard
49
89
  # @return [Integer] the resulting state
50
90
  def add_that(instance)
51
91
  if (@state & SELF_RECURSION_IN_THAT) == 0
52
- @state = @state | SELF_RECURSION_IN_THAT if map_put(that_map, instance)
92
+ @state = @state | SELF_RECURSION_IN_THAT if that_put(instance)
53
93
  end
54
94
  @state
55
95
  end
56
96
 
57
97
  # @return the number of objects added to the `this` map
58
98
  def this_count
59
- this_map.size
99
+ instance_variable_defined?(:@this_map) ? @this_map.size : 0
60
100
  end
61
101
 
62
102
  # @return the number of objects added to the `that` map
63
103
  def that_count
64
- that_map.size
104
+ instance_variable_defined?(:@that_map) ? @that_map.size : 0
65
105
  end
66
106
 
67
107
  private
68
108
 
69
- def map_put(map, o)
109
+ def this_put(o)
70
110
  id = o.object_id
71
- case map[id]
72
- when true
73
- true # Recursion already detected
74
- when false
75
- map[id] = true
76
- true # Recursion occured. This was the second time this entry was added
111
+ @this_map ||= {}
112
+ if @this_map.has_key?(id)
113
+ @recursive_this_map ||= {}
114
+ @recursive_this_map[id] = true
115
+ true
77
116
  else
78
- map[id] = false
79
- false # First time add. No recursion
117
+ @this_map[id] = true
118
+ false
80
119
  end
81
120
  end
82
121
 
83
- def this_map
84
- @this_map ||= {}
85
- end
86
-
87
- def that_map
122
+ def that_put(o)
123
+ id = o.object_id
88
124
  @that_map ||= {}
125
+ if @that_map.has_key?(id)
126
+ @recursive_that_map ||= {}
127
+ @recursive_that_map[id] = true
128
+ true
129
+ else
130
+ @that_map[id] = true
131
+ false
132
+ end
89
133
  end
90
134
  end
91
135
  end