puppet 4.8.2-x86-mingw32 → 4.9.0-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 (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
@@ -1,23 +1,28 @@
1
1
  require_relative 'sub_lookup'
2
-
3
- # Add support for Hiera-like interpolation expressions. The expressions may contain keys that uses dot-notation
4
- # to further navigate into hashes and arrays
5
- #
6
2
  module Puppet::Pops
7
3
  module Lookup
4
+ # Adds support for interpolation expressions. The expressions may contain keys that uses dot-notation
5
+ # to further navigate into hashes and arrays
6
+ #
7
+ # @api public
8
8
  module Interpolation
9
9
  include SubLookup
10
10
 
11
- def interpolate(subject, lookup_invocation, allow_methods)
12
- case subject
11
+ # @param value [Object] The value to interpolate
12
+ # @param context [Context] The current lookup context
13
+ # @param allow_methods [Boolean] `true` if interpolation expression that contains lookup methods are allowed
14
+ # @return [Object] the result of resolving all interpolations in the given value
15
+ # @api public
16
+ def interpolate(value, context, allow_methods)
17
+ case value
13
18
  when String
14
- subject.index('%{').nil? ? subject : interpolate_string(subject, lookup_invocation, allow_methods)
19
+ value.index('%{').nil? ? value : interpolate_string(value, context, allow_methods)
15
20
  when Array
16
- subject.map { |element| interpolate(element, lookup_invocation, allow_methods) }
21
+ value.map { |element| interpolate(element, context, allow_methods) }
17
22
  when Hash
18
- Hash[subject.map { |k, v| [k, interpolate(v, lookup_invocation, allow_methods)] }]
23
+ Hash[value.map { |k, v| [k, interpolate(v, context, allow_methods)] }]
19
24
  else
20
- subject
25
+ value
21
26
  end
22
27
  end
23
28
 
@@ -35,7 +40,8 @@ module Interpolation
35
40
  # Matches a key that is quoted using a matching pair of either single or double quotes.
36
41
  QUOTED_KEY = /^(?:"([^"]+)"|'([^']+)')$/
37
42
 
38
- def interpolate_string(subject, lookup_invocation, allow_methods)
43
+ def interpolate_string(subject, context, allow_methods)
44
+ lookup_invocation = context.is_a?(Invocation) ? context : context.invocation
39
45
  lookup_invocation.with(:interpolate, subject) do
40
46
  subject.gsub(/%\{([^\}]*)\}/) do |match|
41
47
  expr = $1
@@ -44,16 +50,12 @@ module Interpolation
44
50
  value = nil
45
51
  unless EMPTY_INTERPOLATIONS[expr]
46
52
  method_key, key = get_method_and_data(expr, allow_methods)
47
- is_alias = method_key == 'alias'
53
+ is_alias = method_key == :alias
48
54
 
49
55
  # Alias is only permitted if the entire string is equal to the interpolate expression
50
56
  raise Puppet::DataBinding::LookupError, "'alias' interpolation is only permitted if the expression is equal to the entire string" if is_alias && subject != match
51
-
52
- segments = split_key(key) { |problem| Puppet::DataBinding::LookupError.new("#{problem} in string: #{subject}") }
53
- root_key = segments.shift
54
- value = interpolate_method(method_key).call(root_key, lookup_invocation)
55
- value = sub_lookup(key, lookup_invocation, segments, value) unless segments.empty?
56
- value = lookup_invocation.check(key) { interpolate(value, lookup_invocation, allow_methods) }
57
+ value = interpolate_method(method_key).call(key, lookup_invocation, subject)
58
+ value = lookup_invocation.check(method_key == :scope ? "scope:#{key}" : key) { interpolate(value, lookup_invocation, allow_methods) }
57
59
 
58
60
  # break gsub and return value immediately if this was an alias substitution. The value might be something other than a String
59
61
  return value if is_alias
@@ -65,34 +67,44 @@ module Interpolation
65
67
 
66
68
  def interpolate_method(method_key)
67
69
  @@interpolate_methods ||= begin
68
- global_lookup = lambda { |key, lookup_invocation| Lookup.lookup(key, nil, '', true, nil, lookup_invocation) }
69
- scope_lookup = lambda do |key, lookup_invocation|
70
- lookup_invocation.with(:scope, nil) do
70
+ global_lookup = lambda { |key, lookup_invocation, _| Lookup.lookup(key, nil, '', true, nil, lookup_invocation) }
71
+ scope_lookup = lambda do |key, lookup_invocation, subject|
72
+ segments = split_key(key) { |problem| Puppet::DataBinding::LookupError.new("#{problem} in string: #{subject}") }
73
+ root_key = segments.shift
74
+ value = lookup_invocation.with(:scope, 'Global Scope') do
71
75
  ovr = lookup_invocation.override_values
72
- if ovr.include?(key)
73
- lookup_invocation.report_found_in_overrides(key, ovr[key])
76
+ if ovr.include?(root_key)
77
+ lookup_invocation.report_found_in_overrides(root_key, ovr[root_key])
74
78
  else
75
79
  scope = lookup_invocation.scope
76
- if scope.include?(key)
77
- lookup_invocation.report_found(key, scope[key])
78
- else
80
+ val = scope[root_key]
81
+ if val.nil? && !nil_in_scope?(scope, root_key)
79
82
  defaults = lookup_invocation.default_values
80
- if defaults.include?(key)
81
- lookup_invocation.report_found_in_defaults(key, defaults[key])
83
+ if defaults.include?(root_key)
84
+ lookup_invocation.report_found_in_defaults(root_key, defaults[root_key])
82
85
  else
83
86
  nil
84
87
  end
88
+ else
89
+ lookup_invocation.report_found(root_key, val)
85
90
  end
86
91
  end
87
92
  end
93
+ unless segments.empty?
94
+ found = '';
95
+ catch(:no_such_key) { found = sub_lookup(key, lookup_invocation, segments, value) }
96
+ value = found;
97
+ end
98
+ lookup_invocation.remember_scope_lookup(key, value)
99
+ value
88
100
  end
89
101
 
90
102
  {
91
- 'lookup' => global_lookup,
92
- 'hiera' => global_lookup, # this is just an alias for 'lookup'
93
- 'alias' => global_lookup, # same as 'lookup' but expression must be entire string and result is not subject to string substitution
94
- 'scope' => scope_lookup,
95
- 'literal' => lambda { |key, _| key }
103
+ :lookup => global_lookup,
104
+ :hiera => global_lookup, # this is just an alias for 'lookup'
105
+ :alias => global_lookup, # same as 'lookup' but expression must be entire string and result is not subject to string substitution
106
+ :scope => scope_lookup,
107
+ :literal => lambda { |key, _, _| key }
96
108
  }.freeze
97
109
  end
98
110
  interpolate_method = @@interpolate_methods[method_key]
@@ -100,13 +112,22 @@ module Interpolation
100
112
  interpolate_method
101
113
  end
102
114
 
115
+ # Because the semanitcs of Puppet::Parser::Scope#include? differs from Hash#include?
116
+ def nil_in_scope?(scope, key)
117
+ if scope.is_a?(Hash)
118
+ scope.include?(key)
119
+ else
120
+ scope.exist?(key)
121
+ end
122
+ end
123
+
103
124
  def get_method_and_data(data, allow_methods)
104
125
  if match = data.match(/^(\w+)\((?:["]([^"]+)["]|[']([^']+)['])\)$/)
105
126
  raise Puppet::DataBinding::LookupError, 'Interpolation using method syntax is not allowed in this context' unless allow_methods
106
- key = match[1]
127
+ key = match[1].to_sym
107
128
  data = match[2] || match[3] # double or single qouted
108
129
  else
109
- key = 'scope'
130
+ key = :scope
110
131
  end
111
132
  [key, data]
112
133
  end
@@ -1,134 +1,212 @@
1
- module Puppet::Pops::Lookup
2
- class Invocation
3
- attr_reader :scope, :override_values, :default_values, :explainer
4
- attr_accessor :module_name, :top_key
1
+ require_relative 'explainer'
5
2
 
6
- def self.current
7
- nil # TODO, determine how to obtain the current lookup invocation.
8
- end
3
+ module Puppet::Pops
4
+ module Lookup
5
+ # @api private
6
+ class Invocation
7
+ attr_reader :scope, :override_values, :default_values, :explainer, :module_name, :top_key, :adapter_class
8
+
9
+ def self.current
10
+ @current
11
+ end
9
12
 
10
- # Creates a context object for a lookup invocation. The object contains the current scope, overrides, and default
11
- # values and may optionally contain an {ExplanationAcceptor} instance that will receive book-keeping information
12
- # about the progress of the lookup.
13
- #
14
- # If the _explain_ argument is a boolean, then _false_ means that no explanation is needed and _true_ means that
15
- # the default explanation acceptor should be used. The _explain_ argument may also be an instance of the
16
- # `ExplanationAcceptor` class.
17
- #
18
- # @param scope [Puppet::Parser::Scope] The scope to use for the lookup
19
- # @param override_values [Hash<String,Object>|nil] A map to use as override. Values found here are returned immediately (no merge)
20
- # @param default_values [Hash<String,Object>] A map to use as the last resort (but before default)
21
- # @param explainer [boolean,Explanainer] An boolean true to use the default explanation acceptor or an explainer instance that will receive information about the lookup
22
- def initialize(scope, override_values = {}, default_values = {}, explainer = nil)
13
+ # Creates a context object for a lookup invocation. The object contains the current scope, overrides, and default
14
+ # values and may optionally contain an {ExplanationAcceptor} instance that will receive book-keeping information
15
+ # about the progress of the lookup.
16
+ #
17
+ # If the _explain_ argument is a boolean, then _false_ means that no explanation is needed and _true_ means that
18
+ # the default explanation acceptor should be used. The _explain_ argument may also be an instance of the
19
+ # `ExplanationAcceptor` class.
20
+ #
21
+ # @param scope [Puppet::Parser::Scope] The scope to use for the lookup
22
+ # @param override_values [Hash<String,Object>|nil] A map to use as override. Values found here are returned immediately (no merge)
23
+ # @param default_values [Hash<String,Object>] A map to use as the last resort (but before default)
24
+ # @param explainer [boolean,Explanainer] An boolean true to use the default explanation acceptor or an explainer instance that will receive information about the lookup
25
+ def initialize(scope, override_values = EMPTY_HASH, default_values = EMPTY_HASH, explainer = nil, adapter_class = LookupAdapter)
26
+ @scope = scope
27
+ @override_values = override_values
28
+ @default_values = default_values
29
+
30
+ parent_invocation = self.class.current
31
+ if parent_invocation.nil?
23
32
  @name_stack = []
24
- @scope = scope
25
- @override_values = override_values
26
- @default_values = default_values
33
+ @adapter_class = adapter_class
27
34
  unless explainer.is_a?(Explainer)
28
35
  explainer = explainer == true ? Explainer.new : nil
29
36
  end
30
37
  explainer = DebugExplainer.new(explainer) if Puppet[:debug] && !explainer.is_a?(DebugExplainer)
31
- @explainer = explainer
32
- end
33
-
34
- def check(name)
35
- if @name_stack.include?(name)
36
- raise Puppet::DataBinding::RecursiveLookupError, "Recursive lookup detected in [#{@name_stack.join(', ')}]"
37
- end
38
- return unless block_given?
38
+ else
39
+ @name_stack = parent_invocation.name_stack
40
+ @adapter_class = parent_invocation.adapter_class
41
+ set_global_only if parent_invocation.global_only?
42
+ povr = parent_invocation.hiera_v3_location_overrides
43
+ set_hiera_v3_location_overrides(povr) unless povr.empty?
44
+ explainer = explainer == false ? nil : parent_invocation.explainer
45
+ end
46
+ @explainer = explainer
47
+ end
39
48
 
40
- @name_stack.push(name)
49
+ def lookup(key, module_name)
50
+ @top_key = key
51
+ @module_name = module_name
52
+ save_current = self.class.current
53
+ if save_current.equal?(self)
54
+ yield
55
+ else
41
56
  begin
57
+ self.class.instance_variable_set(:@current, self)
42
58
  yield
43
- rescue Puppet::DataBinding::LookupError
44
- raise
45
- rescue Puppet::Error => detail
46
- raise Puppet::DataBinding::LookupError.new(detail.message, detail)
47
59
  ensure
48
- @name_stack.pop
60
+ self.class.instance_variable_set(:@current, save_current)
49
61
  end
50
62
  end
63
+ end
51
64
 
52
- def emit_debug_info(preamble)
53
- @explainer.emit_debug_info(preamble) if @explainer.is_a?(DebugExplainer)
65
+ def check(name)
66
+ if @name_stack.include?(name)
67
+ raise Puppet::DataBinding::RecursiveLookupError, "Recursive lookup detected in [#{@name_stack.join(', ')}]"
54
68
  end
69
+ return unless block_given?
70
+
71
+ @name_stack.push(name)
72
+ begin
73
+ yield
74
+ rescue Puppet::DataBinding::LookupError
75
+ raise
76
+ rescue Puppet::Error => detail
77
+ raise Puppet::DataBinding::LookupError.new(detail.message, detail)
78
+ ensure
79
+ @name_stack.pop
80
+ end
81
+ end
82
+
83
+ def emit_debug_info(preamble)
84
+ @explainer.emit_debug_info(preamble) if @explainer.is_a?(DebugExplainer)
85
+ end
86
+
87
+ def lookup_adapter
88
+ @adapter ||= @adapter_class.adapt(scope.compiler)
89
+ end
55
90
 
56
- # The qualifier_type can be one of:
57
- # :global - qualifier is the data binding terminus name
58
- # :data_provider - qualifier a DataProvider instance
59
- # :path - qualifier is a ResolvedPath instance
60
- # :merge - qualifier is a MergeStrategy instance
61
- # :module - qualifier is the name of a module
62
- # :interpolation - qualifier is the unresolved interpolation expression
63
- # :meta - qualifier is the module name
64
- # :data - qualifier is the key
65
- #
66
- # @param qualifier [Object] A branch, a provider, or a path
67
- def with(qualifier_type, qualifier)
68
- if @explainer.nil?
91
+ # This method is overridden by the special Invocation used while resolving interpolations in a
92
+ # Hiera configuration file (hiera.yaml) where it's used for collecting and remembering the current
93
+ # values that the configuration was based on
94
+ #
95
+ # @api private
96
+ def remember_scope_lookup(key, value)
97
+ # Does nothing by default
98
+ end
99
+
100
+ # The qualifier_type can be one of:
101
+ # :global - qualifier is the data binding terminus name
102
+ # :data_provider - qualifier a DataProvider instance
103
+ # :path - qualifier is a ResolvedPath instance
104
+ # :merge - qualifier is a MergeStrategy instance
105
+ # :interpolation - qualifier is the unresolved interpolation expression
106
+ # :meta - qualifier is the module name
107
+ # :data - qualifier is the key
108
+ #
109
+ # @param qualifier [Object] A branch, a provider, or a path
110
+ def with(qualifier_type, qualifier)
111
+ if explainer.nil?
112
+ yield
113
+ else
114
+ @explainer.push(qualifier_type, qualifier)
115
+ begin
69
116
  yield
70
- else
71
- @explainer.push(qualifier_type, qualifier)
72
- begin
73
- yield
74
- ensure
75
- @explainer.pop
76
- end
117
+ ensure
118
+ @explainer.pop
77
119
  end
78
120
  end
121
+ end
79
122
 
80
- def only_explain_options?
81
- @explainer.nil? ? false : @explainer.only_explain_options?
82
- end
123
+ def only_explain_options?
124
+ @explainer.nil? ? false : @explainer.only_explain_options?
125
+ end
83
126
 
84
- def explain_options?
85
- @explainer.nil? ? false : @explainer.explain_options?
86
- end
127
+ def explain_options?
128
+ @explainer.nil? ? false : @explainer.explain_options?
129
+ end
87
130
 
88
- def report_found_in_overrides(key, value)
89
- @explainer.accept_found_in_overrides(key, value) unless @explainer.nil?
90
- value
91
- end
131
+ def report_found_in_overrides(key, value)
132
+ @explainer.accept_found_in_overrides(key, value) unless @explainer.nil?
133
+ value
134
+ end
92
135
 
93
- def report_found_in_defaults(key, value)
94
- @explainer.accept_found_in_defaults(key, value) unless @explainer.nil?
95
- value
96
- end
136
+ def report_found_in_defaults(key, value)
137
+ @explainer.accept_found_in_defaults(key, value) unless @explainer.nil?
138
+ value
139
+ end
97
140
 
98
- def report_found(key, value)
99
- @explainer.accept_found(key, value) unless @explainer.nil?
100
- value
101
- end
141
+ def report_found(key, value)
142
+ @explainer.accept_found(key, value) unless @explainer.nil?
143
+ value
144
+ end
102
145
 
103
- def report_merge_source(merge_source)
104
- @explainer.accept_merge_source(merge_source) unless @explainer.nil?
105
- end
146
+ def report_merge_source(merge_source)
147
+ @explainer.accept_merge_source(merge_source) unless @explainer.nil?
148
+ end
106
149
 
107
- # Report the result of a merge or fully resolved interpolated string
108
- # @param value [Object] The result to report
109
- # @return [Object] the given value
110
- def report_result(value)
111
- @explainer.accept_result(value) unless @explainer.nil?
112
- value
113
- end
150
+ # Report the result of a merge or fully resolved interpolated string
151
+ # @param value [Object] The result to report
152
+ # @return [Object] the given value
153
+ def report_result(value)
154
+ @explainer.accept_result(value) unless @explainer.nil?
155
+ value
156
+ end
114
157
 
115
- def report_not_found(key)
116
- @explainer.accept_not_found(key) unless @explainer.nil?
117
- end
158
+ def report_not_found(key)
159
+ @explainer.accept_not_found(key) unless @explainer.nil?
160
+ end
118
161
 
119
- def report_path_not_found
120
- @explainer.accept_path_not_found unless @explainer.nil?
121
- end
162
+ def report_location_not_found
163
+ @explainer.accept_location_not_found unless @explainer.nil?
164
+ end
122
165
 
123
- def report_module_not_found
124
- @explainer.accept_module_not_found unless @explainer.nil?
125
- end
166
+ def report_module_not_found(module_name)
167
+ @explainer.accept_module_not_found(module_name) unless @explainer.nil?
168
+ end
126
169
 
127
- def report_text(&block)
128
- unless @explainer.nil?
129
- @explainer.accept_text(block.call)
130
- end
170
+ def report_module_provider_not_found(module_name)
171
+ @explainer.accept_module_provider_not_found(module_name) unless @explainer.nil?
172
+ end
173
+
174
+ def report_text(&block)
175
+ unless @explainer.nil?
176
+ @explainer.accept_text(block.call)
131
177
  end
132
178
  end
133
- end
134
179
 
180
+ def global_only?
181
+ lookup_adapter.global_only? || (instance_variable_defined?(:@global_only) ? @global_only : false)
182
+ end
183
+
184
+ # Instructs the lookup framework to only perform lookups in the global layer
185
+ # @return [Invocation] self
186
+ def set_global_only
187
+ @global_only = true
188
+ self
189
+ end
190
+
191
+ # @return [Pathname] the full path of the hiera.yaml config file
192
+ def global_hiera_config_path
193
+ lookup_adapter.global_hiera_config_path
194
+ end
195
+
196
+ # Overrides passed from hiera_xxx functions down to V3DataHashFunctionProvider
197
+ def set_hiera_v3_location_overrides(overrides)
198
+ @hiera_v3_location_overrides = [overrides].flatten unless overrides.nil?
199
+ end
200
+
201
+ def hiera_v3_location_overrides
202
+ instance_variable_defined?(:@hiera_v3_location_overrides) ? @hiera_v3_location_overrides : EMPTY_ARRAY
203
+ end
204
+
205
+ protected
206
+
207
+ def name_stack
208
+ @name_stack.clone
209
+ end
210
+ end
211
+ end
212
+ end