puppet 5.5.17-x64-mingw32 → 5.5.18-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 (225) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +1 -1
  3. data/Gemfile +2 -3
  4. data/Gemfile.lock +35 -31
  5. data/ext/build_defaults.yaml +1 -0
  6. data/ext/cert_inspector +3 -3
  7. data/ext/puppet-test +2 -2
  8. data/ext/regexp_nodes/regexp_nodes.rb +4 -4
  9. data/ext/windows/service/daemon.rb +54 -8
  10. data/install.rb +6 -6
  11. data/lib/puppet/application.rb +1 -1
  12. data/lib/puppet/application/apply.rb +2 -2
  13. data/lib/puppet/application/describe.rb +3 -9
  14. data/lib/puppet/application/doc.rb +1 -1
  15. data/lib/puppet/application/lookup.rb +1 -1
  16. data/lib/puppet/application/script.rb +2 -2
  17. data/lib/puppet/configurer.rb +86 -28
  18. data/lib/puppet/configurer/downloader.rb +2 -6
  19. data/lib/puppet/defaults.rb +17 -4
  20. data/lib/puppet/error.rb +9 -1
  21. data/lib/puppet/external/nagios/base.rb +1 -1
  22. data/lib/puppet/face/ca.rb +1 -1
  23. data/lib/puppet/face/module/list.rb +5 -5
  24. data/lib/puppet/face/module/search.rb +1 -1
  25. data/lib/puppet/face/module/uninstall.rb +1 -1
  26. data/lib/puppet/face/module/upgrade.rb +1 -1
  27. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  28. data/lib/puppet/file_system.rb +0 -8
  29. data/lib/puppet/file_system/memory_file.rb +1 -1
  30. data/lib/puppet/file_system/posix.rb +3 -2
  31. data/lib/puppet/forge.rb +3 -3
  32. data/lib/puppet/functions/epp.rb +4 -4
  33. data/lib/puppet/functions/inline_epp.rb +5 -5
  34. data/lib/puppet/gettext/module_translations.rb +1 -1
  35. data/lib/puppet/graph/rb_tree_map.rb +2 -2
  36. data/lib/puppet/graph/simple_graph.rb +6 -5
  37. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  38. data/lib/puppet/indirector/hiera.rb +2 -0
  39. data/lib/puppet/indirector/resource/ral.rb +1 -3
  40. data/lib/puppet/indirector/resource/validator.rb +1 -1
  41. data/lib/puppet/interface.rb +2 -1
  42. data/lib/puppet/loaders.rb +0 -1
  43. data/lib/puppet/metatype/manager.rb +1 -1
  44. data/lib/puppet/module.rb +1 -1
  45. data/lib/puppet/module_tool/applications/builder.rb +1 -1
  46. data/lib/puppet/module_tool/applications/installer.rb +1 -1
  47. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
  48. data/lib/puppet/module_tool/metadata.rb +1 -1
  49. data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
  50. data/lib/puppet/module_tool/tar/mini.rb +1 -1
  51. data/lib/puppet/network/http/api/indirected_routes.rb +12 -11
  52. data/lib/puppet/network/http/connection.rb +10 -12
  53. data/lib/puppet/network/http/pool.rb +2 -0
  54. data/lib/puppet/network/http/rack/rest.rb +2 -2
  55. data/lib/puppet/network/http/site.rb +1 -1
  56. data/lib/puppet/network/resolver.rb +2 -2
  57. data/lib/puppet/node/environment.rb +4 -2
  58. data/lib/puppet/parser/ast.rb +1 -1
  59. data/lib/puppet/parser/ast/resourceparam.rb +1 -1
  60. data/lib/puppet/parser/functions.rb +1 -1
  61. data/lib/puppet/parser/functions/epp.rb +3 -3
  62. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  63. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
  64. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
  65. data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
  66. data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
  67. data/lib/puppet/pops/loaders.rb +1 -1
  68. data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
  69. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  70. data/lib/puppet/pops/merge_strategy.rb +22 -18
  71. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  72. data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
  73. data/lib/puppet/pops/parser/locator.rb +1 -1
  74. data/lib/puppet/pops/parser/pn_parser.rb +17 -16
  75. data/lib/puppet/pops/puppet_stack.rb +51 -48
  76. data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
  77. data/lib/puppet/pops/types/string_converter.rb +10 -10
  78. data/lib/puppet/pops/types/types.rb +3 -3
  79. data/lib/puppet/property.rb +1 -1
  80. data/lib/puppet/property/ensure.rb +1 -1
  81. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  82. data/lib/puppet/provider/cron/crontab.rb +1 -1
  83. data/lib/puppet/provider/exec.rb +6 -2
  84. data/lib/puppet/provider/mount.rb +1 -1
  85. data/lib/puppet/provider/mount/parsed.rb +8 -8
  86. data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
  87. data/lib/puppet/provider/nameservice/pw.rb +2 -2
  88. data/lib/puppet/provider/package/dnfmodule.rb +87 -0
  89. data/lib/puppet/provider/package/dpkg.rb +3 -12
  90. data/lib/puppet/provider/package/openbsd.rb +1 -1
  91. data/lib/puppet/provider/package/pip.rb +34 -9
  92. data/lib/puppet/provider/package/portage.rb +4 -4
  93. data/lib/puppet/provider/package/rpm.rb +6 -6
  94. data/lib/puppet/provider/package/windows/package.rb +1 -1
  95. data/lib/puppet/provider/package/yum.rb +1 -1
  96. data/lib/puppet/provider/package_targetable.rb +5 -4
  97. data/lib/puppet/provider/parsedfile.rb +1 -1
  98. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +3 -3
  99. data/lib/puppet/provider/service/daemontools.rb +9 -9
  100. data/lib/puppet/provider/service/openbsd.rb +1 -1
  101. data/lib/puppet/provider/service/rcng.rb +2 -2
  102. data/lib/puppet/provider/service/runit.rb +2 -8
  103. data/lib/puppet/provider/service/systemd.rb +8 -8
  104. data/lib/puppet/provider/user/directoryservice.rb +1 -1
  105. data/lib/puppet/provider/user/hpux.rb +1 -1
  106. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  107. data/lib/puppet/provider/user/useradd.rb +22 -13
  108. data/lib/puppet/provider/user/windows_adsi.rb +4 -5
  109. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  110. data/lib/puppet/reference/indirection.rb +2 -2
  111. data/lib/puppet/reference/metaparameter.rb +1 -3
  112. data/lib/puppet/reference/providers.rb +1 -1
  113. data/lib/puppet/reference/type.rb +3 -9
  114. data/lib/puppet/reports.rb +1 -1
  115. data/lib/puppet/resource.rb +1 -1
  116. data/lib/puppet/resource/catalog.rb +1 -1
  117. data/lib/puppet/settings.rb +3 -3
  118. data/lib/puppet/settings/environment_conf.rb +1 -0
  119. data/lib/puppet/ssl/certificate_authority/interface.rb +1 -1
  120. data/lib/puppet/ssl/certificate_factory.rb +2 -2
  121. data/lib/puppet/ssl/host.rb +3 -3
  122. data/lib/puppet/ssl/oids.rb +1 -1
  123. data/lib/puppet/transaction/report.rb +1 -1
  124. data/lib/puppet/type.rb +2 -4
  125. data/lib/puppet/type/cron.rb +1 -1
  126. data/lib/puppet/type/exec.rb +7 -3
  127. data/lib/puppet/type/file.rb +1 -2
  128. data/lib/puppet/type/file/data_sync.rb +5 -1
  129. data/lib/puppet/type/group.rb +4 -2
  130. data/lib/puppet/type/interface.rb +1 -1
  131. data/lib/puppet/type/notify.rb +3 -2
  132. data/lib/puppet/type/package.rb +2 -2
  133. data/lib/puppet/type/schedule.rb +1 -1
  134. data/lib/puppet/type/selboolean.rb +17 -3
  135. data/lib/puppet/type/service.rb +1 -1
  136. data/lib/puppet/type/user.rb +4 -2
  137. data/lib/puppet/util.rb +35 -12
  138. data/lib/puppet/util/command_line/trollop.rb +1 -1
  139. data/lib/puppet/util/http_proxy.rb +8 -14
  140. data/lib/puppet/util/instance_loader.rb +1 -1
  141. data/lib/puppet/util/log.rb +1 -1
  142. data/lib/puppet/util/log/destinations.rb +2 -2
  143. data/lib/puppet/util/logging.rb +30 -18
  144. data/lib/puppet/util/metric.rb +2 -2
  145. data/lib/puppet/util/monkey_patches.rb +1 -1
  146. data/lib/puppet/util/nagios_maker.rb +2 -2
  147. data/lib/puppet/util/network_device/cisco/device.rb +1 -1
  148. data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
  149. data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
  150. data/lib/puppet/util/provider_features.rb +2 -4
  151. data/lib/puppet/util/rdoc.rb +1 -1
  152. data/lib/puppet/util/reference.rb +1 -1
  153. data/lib/puppet/util/resource_template.rb +1 -1
  154. data/lib/puppet/util/selinux.rb +3 -1
  155. data/lib/puppet/util/windows/adsi.rb +58 -28
  156. data/lib/puppet/util/windows/registry.rb +7 -5
  157. data/lib/puppet/vendor.rb +1 -1
  158. data/lib/puppet/version.rb +1 -1
  159. data/lib/puppet_pal.rb +2 -2
  160. data/locales/puppet.pot +115 -95
  161. data/man/man5/puppet.conf.5 +21 -5
  162. data/man/man8/puppet-agent.8 +1 -1
  163. data/man/man8/puppet-apply.8 +1 -1
  164. data/man/man8/puppet-ca.8 +1 -1
  165. data/man/man8/puppet-catalog.8 +1 -1
  166. data/man/man8/puppet-cert.8 +1 -1
  167. data/man/man8/puppet-certificate.8 +1 -1
  168. data/man/man8/puppet-certificate_request.8 +1 -1
  169. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  170. data/man/man8/puppet-config.8 +1 -1
  171. data/man/man8/puppet-describe.8 +1 -1
  172. data/man/man8/puppet-device.8 +1 -1
  173. data/man/man8/puppet-doc.8 +1 -1
  174. data/man/man8/puppet-epp.8 +1 -1
  175. data/man/man8/puppet-facts.8 +1 -1
  176. data/man/man8/puppet-filebucket.8 +1 -1
  177. data/man/man8/puppet-generate.8 +1 -1
  178. data/man/man8/puppet-help.8 +1 -1
  179. data/man/man8/puppet-key.8 +1 -1
  180. data/man/man8/puppet-lookup.8 +1 -1
  181. data/man/man8/puppet-man.8 +1 -1
  182. data/man/man8/puppet-master.8 +1 -1
  183. data/man/man8/puppet-module.8 +1 -1
  184. data/man/man8/puppet-node.8 +1 -1
  185. data/man/man8/puppet-parser.8 +1 -1
  186. data/man/man8/puppet-plugin.8 +1 -1
  187. data/man/man8/puppet-report.8 +1 -1
  188. data/man/man8/puppet-resource.8 +1 -1
  189. data/man/man8/puppet-script.8 +1 -1
  190. data/man/man8/puppet-status.8 +1 -1
  191. data/man/man8/puppet.8 +2 -2
  192. data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list-installed.txt +11 -0
  193. data/spec/integration/configurer_spec.rb +52 -0
  194. data/spec/integration/type/notify_spec.rb +46 -0
  195. data/spec/unit/configurer_spec.rb +380 -397
  196. data/spec/unit/forge/forge_spec.rb +1 -3
  197. data/spec/unit/forge/repository_spec.rb +1 -3
  198. data/spec/unit/indirector/resource/ral_spec.rb +4 -4
  199. data/spec/unit/network/http/connection_spec.rb +26 -0
  200. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  201. data/spec/unit/provider/exec_spec.rb +209 -0
  202. data/spec/unit/provider/package/dnfmodule_spec.rb +186 -0
  203. data/spec/unit/provider/package/dpkg_spec.rb +15 -3
  204. data/spec/unit/provider/package/pip_spec.rb +51 -6
  205. data/spec/unit/provider/package/portage_spec.rb +4 -4
  206. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  207. data/spec/unit/provider/service/daemontools_spec.rb +24 -0
  208. data/spec/unit/provider/service/runit_spec.rb +24 -0
  209. data/spec/unit/provider/service/systemd_spec.rb +22 -22
  210. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  211. data/spec/unit/provider/user/useradd_spec.rb +46 -0
  212. data/spec/unit/type/exec_spec.rb +6 -12
  213. data/spec/unit/type/file/content_spec.rb +9 -3
  214. data/spec/unit/type/file_spec.rb +9 -4
  215. data/spec/unit/type/selboolean_spec.rb +4 -6
  216. data/spec/unit/util/execution_spec.rb +16 -0
  217. data/spec/unit/util/http_proxy_spec.rb +97 -0
  218. data/spec/unit/util/log/destinations_spec.rb +7 -3
  219. data/spec/unit/util/log_spec.rb +0 -138
  220. data/spec/unit/util/logging_spec.rb +200 -0
  221. data/spec/unit/util/windows/adsi_spec.rb +51 -0
  222. data/tasks/manpages.rake +1 -0
  223. metadata +12 -5
  224. data/lib/puppet/pops/loader/null_loader.rb +0 -60
  225. data/locales/ja/puppet.po +0 -12114
@@ -507,8 +507,7 @@ class Puppet::Node::Environment
507
507
  [self.class, name, full_modulepath, manifest].hash
508
508
  end
509
509
 
510
- private
511
-
510
+ # not private so it can be called in tests
512
511
  def self.extralibs()
513
512
  if Puppet::Util.get_env('PUPPETLIB')
514
513
  split_path(Puppet::Util.get_env('PUPPETLIB'))
@@ -517,11 +516,14 @@ class Puppet::Node::Environment
517
516
  end
518
517
  end
519
518
 
519
+ private
520
+
520
521
  def self.expand_dirs(dirs)
521
522
  dirs.collect do |dir|
522
523
  Puppet::FileSystem.expand_path(dir)
523
524
  end
524
525
  end
526
+ private_class_method :expand_dirs
525
527
 
526
528
  # Reparse the manifests for the given environment
527
529
  #
@@ -12,7 +12,7 @@ class Puppet::Parser::AST
12
12
  attr_accessor :parent, :scope, :file, :line, :pos
13
13
 
14
14
  def inspect
15
- "( #{self.class} #{self.to_s} #{@children.inspect} )"
15
+ "( #{self.class} #{self} #{@children.inspect} )"
16
16
  end
17
17
 
18
18
  # Evaluate the current object. Just a stub method, since the subclass
@@ -26,6 +26,6 @@ class Puppet::Parser::AST::ResourceParam < Puppet::Parser::AST::Branch
26
26
  end
27
27
 
28
28
  def to_s
29
- "#{@param} => #{@value.to_s}"
29
+ "#{@param} => #{@value}"
30
30
  end
31
31
  end
@@ -24,7 +24,7 @@ module Puppet::Parser::Functions
24
24
  Puppet::Util::Log.levels.each do |level|
25
25
  newfunction(level,
26
26
  :environment => root_env,
27
- :doc => "Log a message on the server at level #{level.to_s}.") do |vals|
27
+ :doc => "Log a message on the server at level #{level}.") do |vals|
28
28
  send(level, vals.join(" "))
29
29
  end
30
30
  end
@@ -7,12 +7,12 @@ result as a String.
7
7
  The first argument to this function should be a `<MODULE NAME>/<TEMPLATE FILE>`
8
8
  reference, which loads `<TEMPLATE FILE>` from `<MODULE NAME>`'s `templates`
9
9
  directory. In most cases, the last argument is optional; if used, it should be a
10
- [hash](/puppet/latest/reference/lang_data_hash.html) that contains parameters to
10
+ [hash](https://puppet.com/docs/puppet/latest/lang_data_hash.html) that contains parameters to
11
11
  pass to the template.
12
12
 
13
- - See the [template](/puppet/latest/reference/lang_template.html) documentation
13
+ - See the [template](https://puppet.com/docs/puppet/latest/lang_template.html) documentation
14
14
  for general template usage information.
15
- - See the [EPP syntax](/puppet/latest/reference/lang_template_epp.html)
15
+ - See the [EPP syntax](https://puppet.com/docs/puppet/latest/lang_template_epp.html)
16
16
  documentation for examples of EPP.
17
17
 
18
18
  For example, to call the apache module's `templates/vhost/_docroot.epp`
@@ -6,12 +6,12 @@ text result as a String.
6
6
 
7
7
  The first argument to this function should be a string containing an EPP
8
8
  template. In most cases, the last argument is optional; if used, it should be a
9
- [hash](/puppet/latest/reference/lang_data_hash.html) that contains parameters to
9
+ [hash](https://puppet.com/docs/puppet/latest/lang_data_hash.html) that contains parameters to
10
10
  pass to the template.
11
11
 
12
- - See the [template](/puppet/latest/reference/lang_template.html) documentation
12
+ - See the [template](https://puppet.com/docs/puppet/latest/lang_template.html) documentation
13
13
  for general template usage information.
14
- - See the [EPP syntax](/puppet/latest/reference/lang_template_epp.html)
14
+ - See the [EPP syntax](https://puppet.com/docs/puppet/latest/lang_template_epp.html)
15
15
  documentation for examples of EPP.
16
16
 
17
17
  For example, to evaluate an inline EPP template and pass it the `docroot` and
@@ -29,7 +29,7 @@ parameter tag without default values. Puppet produces an error if the
29
29
  `inline_epp` function fails to pass any required parameter.
30
30
 
31
31
  An inline EPP template should be written as a single-quoted string or
32
- [heredoc](/puppet/latest/reference/lang_data_string.html#heredocs).
32
+ [heredoc](https://puppet.com/docs/puppet/latest/lang_data_string.html#heredocs).
33
33
  A double-quoted string is subject to expression interpolation before the string
34
34
  is parsed as an EPP template.
35
35
 
@@ -45,7 +45,7 @@ END
45
45
  ~~~
46
46
 
47
47
  - Since 3.5
48
- - Requires [future parser](/puppet/3.8/reference/experiments_future.html) in Puppet 3.5 to 3.8") do |arguments|
48
+ - Requires [future parser](https://puppet.com/docs/puppet/3.8/experiments_future.html) in Puppet 3.5 to 3.8") do |arguments|
49
49
 
50
50
  Puppet::Parser::Functions::Error.is4x('inline_epp')
51
51
  end
@@ -24,6 +24,6 @@ class Puppet::Pops::Evaluator::Collectors::CatalogCollector < Puppet::Pops::Eval
24
24
  end
25
25
 
26
26
  def to_s
27
- "Catalog-Collector[#{@type.to_s}]"
27
+ "Catalog-Collector[#{@type}]"
28
28
  end
29
29
  end
@@ -64,6 +64,6 @@ class Puppet::Pops::Evaluator::Collectors::ExportedCollector < Puppet::Pops::Eva
64
64
  end
65
65
 
66
66
  def to_s
67
- "Exported-Collector[#{@type.to_s}]"
67
+ "Exported-Collector[#{@type}]"
68
68
  end
69
69
  end
@@ -35,10 +35,11 @@ module Puppet::Pops::Evaluator::ExternalSyntaxSupport
35
35
  def lookup_keys_for_syntax(syntax)
36
36
  segments = syntax.split(/\+/)
37
37
  result = []
38
- begin
38
+ loop do
39
39
  result << segments.join("+")
40
40
  segments.shift
41
- end until segments.empty?
41
+ break if segments.empty?
42
+ end
42
43
  result
43
44
  end
44
45
 
@@ -33,7 +33,7 @@ module Runtime3Support
33
33
  # @raise [Puppet::ParseError] an evaluation error initialized from the arguments (TODO: Change to EvaluationError?)
34
34
  #
35
35
  def optionally_fail(issue, semantic, options={}, except=nil)
36
- if except.nil?
36
+ if except.nil? && diagnostic_producer.severity_producer[issue] == :error
37
37
  # Want a stacktrace, and it must be passed as an exception
38
38
  begin
39
39
  raise EvaluationError.new()
@@ -299,10 +299,10 @@ module Runtime3Support
299
299
  # 'ruby -wc' thinks that _func is unused, because the only reference to it
300
300
  # is inside of the Kernel.eval string below. By prefixing it with the
301
301
  # underscore, we let Ruby know to not worry about whether it's unused or not.
302
- if loader && _func = loader.load(:function, name)
302
+ if loader && func = loader.load(:function, name)
303
303
  Puppet::Util::Profiler.profile(name, [:functions, name]) do
304
- # Add stack frame when calling. See Puppet::Pops::PuppetStack
305
- return Kernel.eval('_func.call(scope, *args, &block)'.freeze, Kernel.binding, file || '', line)
304
+ # Add stack frame when calling.
305
+ return Puppet::Pops::PuppetStack.stack(file || '', line, func, :call, [scope, *args], &block)
306
306
  end
307
307
  end
308
308
  # Call via 3x API if function exists there
@@ -283,7 +283,7 @@ class Loaders
283
283
  nil
284
284
  elsif File.directory?(file)
285
285
  raise Puppet::Error, "manifest of environment '#{@environment.name}' appoints directory '#{file}'. It must be a file"
286
- elsif File.exists?(file)
286
+ elsif File.exist?(file)
287
287
  parser.parse_file(file)
288
288
  else
289
289
  raise Puppet::Error, "manifest of environment '#{@environment.name}' appoints '#{file}'. It does not exist"
@@ -339,6 +339,7 @@ class HieraConfig
339
339
  def self.not_implemented(impl, method_name)
340
340
  raise NotImplementedError, "The class #{impl.class.name} should have implemented the method #{method_name}()"
341
341
  end
342
+ private_class_method :not_implemented
342
343
  end
343
344
 
344
345
  # @api private
@@ -30,7 +30,7 @@ module SubLookup
30
30
  raise yield('Syntax error') unless segments.size * 2 == count + 1
31
31
  segments.map! do |segment|
32
32
  segment.strip!
33
- if segment.start_with?('"') || segment.start_with?("'")
33
+ if segment.start_with?('"', "'")
34
34
  segment[1..-2]
35
35
  elsif segment =~ /^(:?[+-]?[0-9]+)$/
36
36
  segment.to_i
@@ -173,12 +173,14 @@ module Puppet::Pops
173
173
 
174
174
  protected
175
175
 
176
- # Returns the type used to validate the options hash
177
- #
178
- # @return [Types::PStructType] the puppet type
179
- #
180
- def self.options_t
181
- @options_t ||=Types::TypeParser.singleton.parse("Struct[{strategy=>Optional[Pattern[/#{key}/]]}]")
176
+ class << self
177
+ # Returns the type used to validate the options hash
178
+ #
179
+ # @return [Types::PStructType] the puppet type
180
+ #
181
+ def options_t
182
+ @options_t ||=Types::TypeParser.singleton.parse("Struct[{strategy=>Optional[Pattern[/#{key}/]]}]")
183
+ end
182
184
  end
183
185
 
184
186
  # Returns the type used to validate the options hash
@@ -383,18 +385,20 @@ module Puppet::Pops
383
385
 
384
386
  protected
385
387
 
386
- # Returns a type that allows all deep_merge options except 'preserve_unmergeables' since we force
387
- # the setting of that option to false
388
- #
389
- # @return [Types::PAnyType] the puppet type used when validating the options hash
390
- def self.options_t
391
- @options_t ||= Types::TypeParser.singleton.parse('Struct[{'\
392
- "strategy=>Optional[Pattern[#{key}]],"\
393
- 'knockout_prefix=>Optional[String],'\
394
- 'merge_debug=>Optional[Boolean],'\
395
- 'merge_hash_arrays=>Optional[Boolean],'\
396
- 'sort_merged_arrays=>Optional[Boolean],'\
397
- '}]')
388
+ class << self
389
+ # Returns a type that allows all deep_merge options except 'preserve_unmergeables' since we force
390
+ # the setting of that option to false
391
+ #
392
+ # @return [Types::PAnyType] the puppet type used when validating the options hash
393
+ def options_t
394
+ @options_t ||= Types::TypeParser.singleton.parse('Struct[{'\
395
+ "strategy=>Optional[Pattern[#{key}]],"\
396
+ 'knockout_prefix=>Optional[String],'\
397
+ 'merge_debug=>Optional[Boolean],'\
398
+ 'merge_hash_arrays=>Optional[Boolean],'\
399
+ 'sort_merged_arrays=>Optional[Boolean],'\
400
+ '}]')
401
+ end
398
402
  end
399
403
 
400
404
  def value_t
@@ -136,7 +136,7 @@ module HeredocSupport
136
136
  # simply leaves lines that have text in the margin untouched.
137
137
  #
138
138
  processed_lines = lines.collect {|s| s.gsub(leading_pattern, '') }
139
- margin_per_line = processed_lines.length.times.map {|x| lines[x].length - processed_lines[x].length }
139
+ margin_per_line = Array.new(processed_lines.length) {|x| lines[x].length - processed_lines[x].length }
140
140
  lines = processed_lines
141
141
  else
142
142
  # Array with a 0 per line
@@ -23,7 +23,7 @@ module Puppet::Pops::Parser::InterpolationSupport
23
23
  value,terminator = slurp_dqstring()
24
24
  text = value
25
25
  after = scn.pos
26
- while true
26
+ loop do
27
27
  case terminator
28
28
  when '"'
29
29
  # simple case, there was no interpolation, return directly
@@ -63,7 +63,7 @@ module Puppet::Pops::Parser::InterpolationSupport
63
63
  value,terminator = slurp_dqstring
64
64
  text = value
65
65
  after = scn.pos
66
- while true
66
+ loop do
67
67
  case terminator
68
68
  when '"'
69
69
  # simple case, there was no further interpolation, return directly
@@ -107,7 +107,7 @@ module Puppet::Pops::Parser::InterpolationSupport
107
107
  value,terminator = slurp_uqstring()
108
108
  text = value
109
109
  after = scn.pos
110
- while true
110
+ loop do
111
111
  case terminator
112
112
  when ''
113
113
  # simple case, there was no interpolation, return directly
@@ -147,7 +147,7 @@ module Puppet::Pops::Parser::InterpolationSupport
147
147
  value,terminator = slurp_uqstring
148
148
  text = value
149
149
  after = scn.pos
150
- while true
150
+ loop do
151
151
  case terminator
152
152
  when ''
153
153
  # simple case, there was no further interpolation, return directly
@@ -90,7 +90,7 @@ class Locator
90
90
  f = Puppet::Util.path_to_uri(f).to_s
91
91
  end
92
92
  offset = ast.offset
93
- URI("#{f}?line=#{line_for_offset(offset).to_s}&pos=#{pos_on_line(offset).to_s}")
93
+ URI("#{f}?line=#{line_for_offset(offset)}&pos=#{pos_on_line(offset)}")
94
94
  end
95
95
 
96
96
  class AbstractLocator < Locator
@@ -48,6 +48,23 @@ class PNParser
48
48
  parse_next
49
49
  end
50
50
 
51
+ def self.char_types
52
+ unless instance_variable_defined?(:@char_types)
53
+ @char_types = Array.new(0x80, TYPE_IDENTIFIER)
54
+ @char_types[0] = TYPE_END
55
+ [0x09, 0x0d, 0x0a, 0x20].each { |n| @char_types[n] = TYPE_WS }
56
+ [TOKEN_LP, TOKEN_RP, TOKEN_LB, TOKEN_RB, TOKEN_LC, TOKEN_RC].each { |n| @char_types[n] = TYPE_DELIM }
57
+ @char_types[0x2d] = TYPE_MINUS
58
+ (0x30..0x39).each { |n| @char_types[n] = TYPE_DIGIT }
59
+ (0x41..0x5a).each { |n| @char_types[n] = TYPE_ALPHA }
60
+ (0x61..0x7a).each { |n| @char_types[n] = TYPE_ALPHA }
61
+ @char_types[TOKEN_KEY] = TYPE_KEY_START
62
+ @char_types[TOKEN_STRING] = TYPE_STRING_START
63
+ @char_types.freeze
64
+ end
65
+ @char_types
66
+ end
67
+
51
68
  private
52
69
 
53
70
  def parse_next
@@ -128,22 +145,6 @@ class PNParser
128
145
  end
129
146
 
130
147
  # All methods below belong to the PN lexer
131
- def self.char_types
132
- unless instance_variable_defined?(:@char_types)
133
- @char_types = Array.new(0x80, TYPE_IDENTIFIER)
134
- @char_types[0] = TYPE_END
135
- [0x09, 0x0d, 0x0a, 0x20].each { |n| @char_types[n] = TYPE_WS }
136
- [TOKEN_LP, TOKEN_RP, TOKEN_LB, TOKEN_RB, TOKEN_LC, TOKEN_RC].each { |n| @char_types[n] = TYPE_DELIM }
137
- @char_types[0x2d] = TYPE_MINUS
138
- (0x30..0x39).each { |n| @char_types[n] = TYPE_DIGIT }
139
- (0x41..0x5a).each { |n| @char_types[n] = TYPE_ALPHA }
140
- (0x61..0x7a).each { |n| @char_types[n] = TYPE_ALPHA }
141
- @char_types[TOKEN_KEY] = TYPE_KEY_START
142
- @char_types[TOKEN_STRING] = TYPE_STRING_START
143
- @char_types.freeze
144
- end
145
- @char_types
146
- end
147
148
 
148
149
  def next_token
149
150
  skip_white
@@ -1,57 +1,60 @@
1
- module Puppet::Pops
2
- # Module for making a call such that there is an identifiable entry on
3
- # the ruby call stack enabling getting a puppet call stack
4
- # To use this make a call with:
5
- # ```
6
- # Puppet::Pops::PuppetStack.stack(file, line, receiver, message, args)
7
- # ```
8
- # To get the stack call:
9
- # ```
10
- # Puppet::Pops::PuppetStack.stacktrace
11
- #
12
- # When getting a backtrace in Ruby, the puppet stack frames are
13
- # identified as coming from "in 'stack'" and having a ".pp" file
14
- # name.
15
- # To support testing, a given file that is an empty string, or nil
16
- # as well as a nil line number are supported. Such stack frames
17
- # will be represented with the text `unknown` and `0´ respectively.
18
- #
19
- module PuppetStack
20
- # Pattern matching an entry in the ruby stack that is a puppet entry
21
- PP_ENTRY_PATTERN = /^(.*\.pp)?:([0-9]+):in (`stack'|`block in call_function')/
22
1
 
23
- # Sends a message to an obj such that it appears to come from
24
- # file, line when calling stacktrace.
25
- #
26
- def self.stack(file, line, obj, message, args, &block)
27
- file = '' if file.nil?
28
- line = 0 if line.nil?
2
+ module Puppet
3
+ module Pops
4
+ # Utility class for keeping track of the "Puppet stack", ie the file
5
+ # and line numbers of Puppet Code that created the current context.
6
+ #
7
+ # To use this make a call with:
8
+ #
9
+ # ```rb
10
+ # Puppet::Pops::PuppetStack.stack(file, line, receiver, message, args)
11
+ # ```
12
+ #
13
+ # To get the stack call:
14
+ #
15
+ # ```rb
16
+ # Puppet::Pops::PuppetStack.stacktrace
17
+ # ```
18
+ #
19
+ # or
20
+ #
21
+ # ```rb
22
+ # Puppet::Pops::PuppetStack.top_of_stack
23
+ # ```
24
+ #
25
+ # To support testing, a given file that is an empty string, or nil
26
+ # as well as a nil line number are supported. Such stack frames
27
+ # will be represented with the text `unknown` and `0´ respectively.
28
+ module PuppetStack
29
+ @stack = Array.new
29
30
 
30
- if block_given?
31
- Kernel.eval("obj.send(message, *args, &block)", Kernel.binding(), file, line)
32
- else
33
- Kernel.eval("obj.send(message, *args)", Kernel.binding(), file, line)
34
- end
35
- end
31
+ def self.stack(file, line, obj, message, args, &block)
32
+ file = 'unknown' if (file.nil? || file == '')
33
+ line = 0 if line.nil?
36
34
 
37
- def self.stacktrace
38
- caller().reduce([]) do |memo, loc|
39
- if loc =~ PP_ENTRY_PATTERN
40
- memo << [$1.nil? ? 'unknown' : $1, $2.to_i]
35
+ result = nil
36
+ @stack.unshift([file, line])
37
+ begin
38
+ if block_given?
39
+ result = obj.send(message, *args, &block)
40
+ else
41
+ result = obj.send(message, *args)
42
+ end
43
+ ensure
44
+ @stack.shift()
45
+ end
46
+ result
41
47
  end
42
- memo
43
- end
44
- end
45
48
 
46
- # Returns an Array with the top of the puppet stack, or an empty Array if there was no such entry.
47
- #
48
- def self.top_of_stack
49
- caller.each do |loc|
50
- if loc =~ PP_ENTRY_PATTERN
51
- return [$1.nil? ? 'unknown' : $1, $2.to_i]
49
+ def self.stacktrace
50
+ @stack.dup
51
+ end
52
+
53
+ # Returns an Array with the top of the puppet stack, or an empty
54
+ # Array if there was no such entry.
55
+ def self.top_of_stack
56
+ @stack.first || []
52
57
  end
53
58
  end
54
- []
55
59
  end
56
60
  end
57
- end