puppet 4.7.1 → 4.8.0

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

Potentially problematic release.


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

Files changed (276) hide show
  1. data/Gemfile +0 -3
  2. data/MAINTAINERS +76 -0
  3. data/README.md +0 -6
  4. data/Rakefile +2 -2
  5. data/lib/puppet/agent.rb +3 -3
  6. data/lib/puppet/application/apply.rb +1 -1
  7. data/lib/puppet/configurer.rb +2 -2
  8. data/lib/puppet/data_providers.rb +1 -0
  9. data/lib/puppet/data_providers/data_adapter.rb +1 -0
  10. data/lib/puppet/data_providers/data_function_support.rb +1 -0
  11. data/lib/puppet/data_providers/function_env_data_provider.rb +1 -0
  12. data/lib/puppet/data_providers/function_module_data_provider.rb +1 -0
  13. data/lib/puppet/data_providers/hiera_config.rb +1 -0
  14. data/lib/puppet/data_providers/hiera_env_data_provider.rb +1 -0
  15. data/lib/puppet/data_providers/hiera_interpolate.rb +1 -0
  16. data/lib/puppet/data_providers/hiera_module_data_provider.rb +1 -0
  17. data/lib/puppet/data_providers/hiera_support.rb +1 -2
  18. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -0
  19. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -0
  20. data/lib/puppet/defaults.rb +20 -1
  21. data/lib/puppet/environments.rb +5 -2
  22. data/lib/puppet/face/catalog.rb +1 -1
  23. data/lib/puppet/face/epp.rb +57 -11
  24. data/lib/puppet/face/module/install.rb +6 -6
  25. data/lib/puppet/functions.rb +23 -24
  26. data/lib/puppet/functions/alert.rb +14 -0
  27. data/lib/puppet/functions/binary_file.rb +25 -0
  28. data/lib/puppet/functions/break.rb +22 -0
  29. data/lib/puppet/functions/contain.rb +33 -0
  30. data/lib/puppet/functions/crit.rb +14 -0
  31. data/lib/puppet/functions/debug.rb +14 -0
  32. data/lib/puppet/functions/emerg.rb +14 -0
  33. data/lib/puppet/functions/epp.rb +1 -1
  34. data/lib/puppet/functions/err.rb +14 -0
  35. data/lib/puppet/functions/find_file.rb +31 -0
  36. data/lib/puppet/functions/include.rb +21 -0
  37. data/lib/puppet/functions/info.rb +14 -0
  38. data/lib/puppet/functions/new.rb +1 -1
  39. data/lib/puppet/functions/next.rb +23 -0
  40. data/lib/puppet/functions/notice.rb +14 -0
  41. data/lib/puppet/functions/regsubst.rb +12 -16
  42. data/lib/puppet/functions/require.rb +37 -0
  43. data/lib/puppet/functions/return.rb +22 -0
  44. data/lib/puppet/functions/strftime.rb +35 -0
  45. data/lib/puppet/functions/warning.rb +14 -0
  46. data/lib/puppet/generate/models/type/type.rb +4 -0
  47. data/lib/puppet/generate/templates/type/pcore.erb +2 -1
  48. data/lib/puppet/indirector/face.rb +6 -1
  49. data/lib/puppet/network/http/error.rb +2 -2
  50. data/lib/puppet/network/http/handler.rb +2 -2
  51. data/lib/puppet/node/environment.rb +11 -0
  52. data/lib/puppet/parser/ast.rb +5 -0
  53. data/lib/puppet/parser/ast/pops_bridge.rb +17 -4
  54. data/lib/puppet/parser/compiler.rb +29 -1
  55. data/lib/puppet/parser/functions.rb +6 -0
  56. data/lib/puppet/parser/functions/assert_type.rb +1 -1
  57. data/lib/puppet/parser/functions/binary_file.rb +24 -0
  58. data/lib/puppet/parser/functions/break.rb +39 -0
  59. data/lib/puppet/parser/functions/contain.rb +7 -15
  60. data/lib/puppet/parser/functions/defined.rb +2 -2
  61. data/lib/puppet/parser/functions/dig.rb +1 -1
  62. data/lib/puppet/parser/functions/each.rb +1 -1
  63. data/lib/puppet/parser/functions/epp.rb +2 -2
  64. data/lib/puppet/parser/functions/filter.rb +1 -1
  65. data/lib/puppet/parser/functions/find_file.rb +28 -0
  66. data/lib/puppet/parser/functions/hiera.rb +4 -4
  67. data/lib/puppet/parser/functions/hiera_array.rb +1 -1
  68. data/lib/puppet/parser/functions/hiera_hash.rb +1 -1
  69. data/lib/puppet/parser/functions/hiera_include.rb +1 -1
  70. data/lib/puppet/parser/functions/include.rb +4 -8
  71. data/lib/puppet/parser/functions/inline_epp.rb +1 -1
  72. data/lib/puppet/parser/functions/lest.rb +1 -1
  73. data/lib/puppet/parser/functions/lookup.rb +4 -2
  74. data/lib/puppet/parser/functions/map.rb +1 -1
  75. data/lib/puppet/parser/functions/match.rb +1 -1
  76. data/lib/puppet/parser/functions/new.rb +414 -18
  77. data/lib/puppet/parser/functions/next.rb +38 -0
  78. data/lib/puppet/parser/functions/reduce.rb +1 -1
  79. data/lib/puppet/parser/functions/regsubst.rb +4 -2
  80. data/lib/puppet/parser/functions/require.rb +4 -27
  81. data/lib/puppet/parser/functions/return.rb +71 -0
  82. data/lib/puppet/parser/functions/reverse_each.rb +1 -1
  83. data/lib/puppet/parser/functions/scanf.rb +13 -8
  84. data/lib/puppet/parser/functions/slice.rb +1 -1
  85. data/lib/puppet/parser/functions/split.rb +1 -1
  86. data/lib/puppet/parser/functions/step.rb +1 -1
  87. data/lib/puppet/parser/functions/strftime.rb +185 -0
  88. data/lib/puppet/parser/functions/then.rb +1 -1
  89. data/lib/puppet/parser/functions/type.rb +1 -1
  90. data/lib/puppet/parser/functions/with.rb +3 -3
  91. data/lib/puppet/parser/resource.rb +8 -5
  92. data/lib/puppet/parser/scope.rb +1 -1
  93. data/lib/puppet/plugins/configuration.rb +8 -0
  94. data/lib/puppet/plugins/data_providers.rb +1 -0
  95. data/lib/puppet/plugins/data_providers/data_provider.rb +7 -28
  96. data/lib/puppet/plugins/data_providers/registry.rb +1 -0
  97. data/lib/puppet/pops.rb +4 -0
  98. data/lib/puppet/pops/evaluator/access_operator.rb +36 -5
  99. data/lib/puppet/pops/evaluator/closure.rb +81 -12
  100. data/lib/puppet/pops/evaluator/compare_operator.rb +24 -1
  101. data/lib/puppet/pops/evaluator/evaluator_impl.rb +29 -5
  102. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +1 -1
  103. data/lib/puppet/pops/evaluator/runtime3_converter.rb +53 -62
  104. data/lib/puppet/pops/evaluator/runtime3_support.rb +15 -6
  105. data/lib/puppet/pops/functions/dispatch.rb +9 -2
  106. data/lib/puppet/pops/functions/dispatcher.rb +3 -1
  107. data/lib/puppet/pops/functions/function.rb +19 -2
  108. data/lib/puppet/pops/issues.rb +9 -0
  109. data/lib/puppet/pops/label_provider.rb +2 -2
  110. data/lib/puppet/pops/loader/loader.rb +17 -0
  111. data/lib/puppet/pops/loader/static_loader.rb +0 -41
  112. data/lib/puppet/pops/lookup.rb +12 -0
  113. data/lib/puppet/pops/lookup/context.rb +86 -0
  114. data/lib/puppet/pops/lookup/explainer.rb +46 -6
  115. data/lib/puppet/pops/lookup/invocation.rb +19 -0
  116. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  117. data/lib/puppet/pops/model/factory.rb +20 -8
  118. data/lib/puppet/pops/model/model_label_provider.rb +3 -0
  119. data/lib/puppet/pops/model/model_meta.rb +2 -0
  120. data/lib/puppet/pops/model/model_tree_dumper.rb +14 -0
  121. data/lib/puppet/pops/parser/egrammar.ra +11 -6
  122. data/lib/puppet/pops/parser/eparser.rb +1112 -1086
  123. data/lib/puppet/pops/parser/heredoc_support.rb +1 -2
  124. data/lib/puppet/pops/pcore.rb +1 -0
  125. data/lib/puppet/pops/puppet_stack.rb +3 -3
  126. data/lib/puppet/pops/resource/param.rb +5 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +8 -4
  128. data/lib/puppet/pops/resource/resource_type_set.pcore +1 -0
  129. data/lib/puppet/pops/serialization/abstract_reader.rb +19 -2
  130. data/lib/puppet/pops/serialization/abstract_writer.rb +16 -3
  131. data/lib/puppet/pops/serialization/deserializer.rb +5 -1
  132. data/lib/puppet/pops/serialization/extension.rb +2 -0
  133. data/lib/puppet/pops/serialization/json.rb +76 -26
  134. data/lib/puppet/pops/serialization/serializer.rb +5 -1
  135. data/lib/puppet/pops/serialization/time_factory.rb +2 -1
  136. data/lib/puppet/pops/time/timespan.rb +718 -0
  137. data/lib/puppet/pops/time/timestamp.rb +148 -0
  138. data/lib/puppet/pops/types/p_binary_type.rb +220 -0
  139. data/lib/puppet/pops/types/p_object_type.rb +12 -6
  140. data/lib/puppet/pops/types/p_sensitive_type.rb +5 -1
  141. data/lib/puppet/pops/types/p_timespan_type.rb +141 -0
  142. data/lib/puppet/pops/types/p_timestamp_type.rb +69 -0
  143. data/lib/puppet/pops/types/string_converter.rb +62 -0
  144. data/lib/puppet/pops/types/type_asserter.rb +1 -1
  145. data/lib/puppet/pops/types/type_calculator.rb +17 -3
  146. data/lib/puppet/pops/types/type_factory.rb +35 -1
  147. data/lib/puppet/pops/types/type_formatter.rb +64 -11
  148. data/lib/puppet/pops/types/type_mismatch_describer.rb +110 -61
  149. data/lib/puppet/pops/types/type_parser.rb +18 -4
  150. data/lib/puppet/pops/types/types.rb +98 -63
  151. data/lib/puppet/pops/validation.rb +9 -1
  152. data/lib/puppet/pops/validation/checker4_0.rb +7 -0
  153. data/lib/puppet/property.rb +1 -1
  154. data/lib/puppet/provider.rb +3 -6
  155. data/lib/puppet/provider/mcx/mcxcontent.rb +1 -1
  156. data/lib/puppet/provider/mount/parsed.rb +18 -4
  157. data/lib/puppet/provider/nameservice/directoryservice.rb +15 -7
  158. data/lib/puppet/provider/package/gem.rb +6 -1
  159. data/lib/puppet/provider/package/pip.rb +0 -1
  160. data/lib/puppet/provider/package/pkg.rb +5 -1
  161. data/lib/puppet/provider/package/pkgng.rb +1 -1
  162. data/lib/puppet/provider/package/yum.rb +10 -0
  163. data/lib/puppet/provider/service/launchd.rb +1 -0
  164. data/lib/puppet/provider/user/directoryservice.rb +6 -6
  165. data/lib/puppet/provider/yumrepo/inifile.rb +1 -1
  166. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  167. data/lib/puppet/resource.rb +54 -12
  168. data/lib/puppet/resource/capability_finder.rb +15 -9
  169. data/lib/puppet/resource/catalog.rb +25 -6
  170. data/lib/puppet/resource/type.rb +3 -1
  171. data/lib/puppet/settings.rb +1 -1
  172. data/lib/puppet/settings/environment_conf.rb +12 -4
  173. data/lib/puppet/syntax_checkers/base64.rb +41 -0
  174. data/lib/puppet/syntax_checkers/json.rb +0 -2
  175. data/lib/puppet/transaction.rb +6 -0
  176. data/lib/puppet/transaction/additional_resource_generator.rb +5 -0
  177. data/lib/puppet/transaction/report.rb +7 -2
  178. data/lib/puppet/type.rb +2 -1
  179. data/lib/puppet/type/file/checksum.rb +1 -0
  180. data/lib/puppet/type/file/content.rb +4 -4
  181. data/lib/puppet/type/mount.rb +44 -0
  182. data/lib/puppet/type/ssh_authorized_key.rb +1 -1
  183. data/lib/puppet/type/tidy.rb +3 -0
  184. data/lib/puppet/type/user.rb +12 -6
  185. data/lib/puppet/util/log.rb +25 -0
  186. data/lib/puppet/util/plist.rb +8 -3
  187. data/lib/puppet/version.rb +1 -1
  188. data/lib/puppet_x.rb +7 -1
  189. data/spec/integration/application/apply_spec.rb +118 -0
  190. data/spec/integration/parser/compiler_spec.rb +28 -0
  191. data/spec/integration/parser/pcore_resource_spec.rb +40 -3
  192. data/spec/integration/provider/mount_spec.rb +2 -1
  193. data/spec/integration/util/windows/principal_spec.rb +2 -2
  194. data/spec/integration/util/windows/registry_spec.rb +4 -4
  195. data/spec/lib/puppet_spec/compiler.rb +5 -1
  196. data/spec/lib/puppet_spec/unindent.rb +5 -0
  197. data/spec/shared_contexts/types_setup.rb +6 -0
  198. data/spec/shared_examples/rhel_package_provider.rb +16 -0
  199. data/spec/spec_helper.rb +1 -0
  200. data/spec/unit/agent_spec.rb +11 -0
  201. data/spec/unit/application/lookup_spec.rb +94 -3
  202. data/spec/unit/capability_spec.rb +22 -0
  203. data/spec/unit/configurer_spec.rb +8 -0
  204. data/spec/unit/face/epp_face_spec.rb +22 -3
  205. data/spec/unit/functions/assert_type_spec.rb +3 -3
  206. data/spec/unit/functions/binary_file_spec.rb +46 -0
  207. data/spec/unit/functions/break_spec.rb +89 -0
  208. data/spec/unit/{parser/functions → functions}/contain_spec.rb +68 -3
  209. data/spec/unit/functions/find_file_spec.rb +69 -0
  210. data/spec/unit/functions/include_spec.rb +175 -0
  211. data/spec/unit/functions/logging_spec.rb +54 -0
  212. data/spec/unit/functions/lookup_spec.rb +3 -3
  213. data/spec/unit/functions/new_spec.rb +105 -5
  214. data/spec/unit/functions/next_spec.rb +93 -0
  215. data/spec/unit/functions/require_spec.rb +83 -0
  216. data/spec/unit/functions/return_spec.rb +105 -0
  217. data/spec/unit/{parser/functions → functions}/shared.rb +14 -11
  218. data/spec/unit/functions/strftime_spec.rb +152 -0
  219. data/spec/unit/functions4_spec.rb +22 -0
  220. data/spec/unit/indirector/face_spec.rb +10 -2
  221. data/spec/unit/network/http/error_spec.rb +1 -2
  222. data/spec/unit/network/http/handler_spec.rb +6 -5
  223. data/spec/unit/parser/functions/hiera_array_spec.rb +1 -1
  224. data/spec/unit/parser/functions/hiera_hash_spec.rb +1 -1
  225. data/spec/unit/parser/functions/hiera_include_spec.rb +1 -1
  226. data/spec/unit/parser/functions/hiera_spec.rb +1 -1
  227. data/spec/unit/parser/functions/lookup_spec.rb +1 -1
  228. data/spec/unit/parser/functions/regsubst_spec.rb +1 -1
  229. data/spec/unit/parser/functions/split_spec.rb +1 -1
  230. data/spec/unit/pops/evaluator/access_ops_spec.rb +81 -1
  231. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +170 -0
  232. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +29 -4
  233. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +112 -4
  234. data/spec/unit/pops/loaders/dependency_loader_spec.rb +12 -0
  235. data/spec/unit/pops/loaders/static_loader_spec.rb +0 -26
  236. data/spec/unit/pops/lookup/context_spec.rb +149 -0
  237. data/spec/unit/pops/parser/parse_functions_spec.rb +19 -0
  238. data/spec/unit/pops/parser/parse_lambda_spec.rb +19 -0
  239. data/spec/unit/pops/puppet_stack_spec.rb +1 -1
  240. data/spec/unit/pops/resource/resource_type_impl_spec.rb +74 -0
  241. data/spec/unit/pops/serialization/packer_spec.rb +34 -14
  242. data/spec/unit/pops/serialization/serialization_spec.rb +67 -5
  243. data/spec/unit/pops/time/timespan_spec.rb +121 -0
  244. data/spec/unit/pops/types/p_binary_type_spec.rb +243 -0
  245. data/spec/unit/pops/types/p_object_type_spec.rb +7 -7
  246. data/spec/unit/pops/types/p_sensitive_type_spec.rb +1 -1
  247. data/spec/unit/pops/types/p_timespan_type_spec.rb +273 -0
  248. data/spec/unit/pops/types/p_timestamp_type_spec.rb +311 -0
  249. data/spec/unit/pops/types/p_type_set_type_spec.rb +13 -13
  250. data/spec/unit/pops/types/ruby_generator_spec.rb +12 -12
  251. data/spec/unit/pops/types/string_converter_spec.rb +89 -0
  252. data/spec/unit/pops/types/type_asserter_spec.rb +3 -3
  253. data/spec/unit/pops/types/type_calculator_spec.rb +113 -5
  254. data/spec/unit/pops/types/type_formatter_spec.rb +40 -0
  255. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +49 -38
  256. data/spec/unit/pops/types/type_parser_spec.rb +87 -4
  257. data/spec/unit/pops/types/types_spec.rb +1 -1
  258. data/spec/unit/pops/validator/validator_spec.rb +23 -0
  259. data/spec/unit/provider/mount/parsed_spec.rb +47 -29
  260. data/spec/unit/provider/package/pkg_spec.rb +109 -99
  261. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +1 -0
  262. data/spec/unit/provider/user/aix_spec.rb +1 -1
  263. data/spec/unit/provider/user/directoryservice_spec.rb +101 -30
  264. data/spec/unit/resource/capability_finder_spec.rb +29 -7
  265. data/spec/unit/resource/catalog_spec.rb +127 -0
  266. data/spec/unit/ssl/certificate_request_spec.rb +1 -1
  267. data/spec/unit/transaction/additional_resource_generator_spec.rb +30 -0
  268. data/spec/unit/transaction/persistence_spec.rb +1 -6
  269. data/spec/unit/transaction/report_spec.rb +23 -0
  270. data/spec/unit/transaction_spec.rb +38 -0
  271. data/spec/unit/type/mount_spec.rb +5 -0
  272. data/spec/unit/util/plist_spec.rb +14 -2
  273. metadata +71 -12
  274. data/spec/integration/parser/functions/require_spec.rb +0 -43
  275. data/spec/unit/parser/functions/include_spec.rb +0 -55
  276. data/spec/unit/parser/functions/require_spec.rb +0 -68
@@ -134,12 +134,13 @@ class TypeParser
134
134
  # @api private
135
135
  def self.type_map
136
136
  @type_map ||= {
137
- 'integer' => TypeFactory.integer,
138
- 'float' => TypeFactory.float,
137
+ 'integer' => TypeFactory.integer,
138
+ 'float' => TypeFactory.float,
139
139
  'numeric' => TypeFactory.numeric,
140
140
  'iterable' => TypeFactory.iterable,
141
141
  'iterator' => TypeFactory.iterator,
142
142
  'string' => TypeFactory.string,
143
+ 'binary' => TypeFactory.binary,
143
144
  'sensitive' => TypeFactory.sensitive,
144
145
  'enum' => TypeFactory.enum,
145
146
  'boolean' => TypeFactory.boolean,
@@ -167,10 +168,12 @@ class TypeParser
167
168
  'typealias' => TypeFactory.type_alias,
168
169
  'typereference' => TypeFactory.type_reference,
169
170
  'typeset' => TypeFactory.type_set,
170
- # A generic callable as opposed to one that does not accept arguments
171
+ # A generic callable as opposed to one that does not accept arguments
171
172
  'callable' => TypeFactory.all_callables,
172
173
  'semver' => TypeFactory.sem_ver,
173
- 'semverrange' => TypeFactory.sem_ver_range
174
+ 'semverrange' => TypeFactory.sem_ver_range,
175
+ 'timestamp' => TypeFactory.timestamp,
176
+ 'timespan' => TypeFactory.timespan
174
177
  }
175
178
  end
176
179
 
@@ -355,6 +358,9 @@ class TypeParser
355
358
 
356
359
  when 'callable'
357
360
  # 1..m parameters being types (last three optionally integer or literal default, and a callable)
361
+ if parameters.size > 1 && parameters[0].is_a?(Array)
362
+ raise_invalid_parameters_error('callable', '2 when first parameter is an array', parameters.size) unless parameters.size == 2
363
+ end
358
364
  TypeFactory.callable(*parameters)
359
365
 
360
366
  when 'struct'
@@ -478,6 +484,14 @@ class TypeParser
478
484
  raise_invalid_parameters_error('Runtime', '2', parameters.size) unless parameters.size == 2
479
485
  TypeFactory.runtime(*parameters)
480
486
 
487
+ when 'timespan'
488
+ raise_invalid_parameters_error('Timespan', '0 to 2', parameters.size) unless parameters.size <= 2
489
+ TypeFactory.timespan(*parameters)
490
+
491
+ when 'timestamp'
492
+ raise_invalid_parameters_error('Timestamp', '0 to 2', parameters.size) unless parameters.size <= 2
493
+ TypeFactory.timestamp(*parameters)
494
+
481
495
  when 'semver'
482
496
  raise_invalid_parameters_error('SemVer', '1 or more', parameters.size) unless parameters.size >= 1
483
497
  TypeFactory.sem_ver(*parameters)
@@ -741,16 +741,9 @@ class PEnumType < PScalarType
741
741
  end
742
742
  end
743
743
 
744
+ # Abstract class that encapsulates behavior common to PNumericType and PAbstractTimeDataType
744
745
  # @api public
745
- #
746
- class PNumericType < PScalarType
747
- def self.register_ptype(loader, ir)
748
- create_ptype(loader, ir, 'ScalarType',
749
- 'from' => { KEY_TYPE => PNumericType::DEFAULT, KEY_VALUE => :default },
750
- 'to' => { KEY_TYPE => PNumericType::DEFAULT, KEY_VALUE => :default }
751
- )
752
- end
753
-
746
+ class PAbstractRangeType < PScalarType
754
747
  def initialize(from, to = Float::INFINITY)
755
748
  from = -Float::INFINITY if from.nil? || from == :default
756
749
  to = Float::INFINITY if to.nil? || to == :default
@@ -807,22 +800,44 @@ class PNumericType < PScalarType
807
800
  def unbounded?
808
801
  @from == -Float::INFINITY && @to == Float::INFINITY
809
802
  end
803
+ end
804
+
805
+ # @api public
806
+ #
807
+ class PNumericType < PAbstractRangeType
808
+ def self.register_ptype(loader, ir)
809
+ create_ptype(loader, ir, 'ScalarType',
810
+ 'from' => { KEY_TYPE => PNumericType::DEFAULT, KEY_VALUE => :default },
811
+ 'to' => { KEY_TYPE => PNumericType::DEFAULT, KEY_VALUE => :default }
812
+ )
813
+ end
810
814
 
811
815
  def self.new_function(_, loader)
812
816
  @new_function ||= Puppet::Functions.create_loaded_function(:new_numeric, loader) do
813
817
  local_types do
814
- type 'Convertible = Variant[Undef, Integer, Float, Boolean, String]'
815
- type 'NamedArgs = Struct[{from => Convertible}]'
818
+ type 'Convertible = Variant[Undef, Integer, Float, Boolean, String, Timespan, Timestamp]'
819
+ type 'NamedArgs = Struct[{from => Convertible, Optional[abs] => Boolean}]'
816
820
  end
817
821
 
818
822
  dispatch :from_args do
819
823
  param 'Convertible', :from
824
+ optional_param 'Boolean', :abs
820
825
  end
821
826
 
822
827
  dispatch :from_hash do
823
828
  param 'NamedArgs', :hash_args
824
829
  end
825
- def from_args(from)
830
+
831
+ def from_args(from, abs = false)
832
+ result = from_convertible(from)
833
+ abs ? result.abs : result
834
+ end
835
+
836
+ def from_hash(args_hash)
837
+ from_args(args_hash['from'], args_hash['abs'] || false)
838
+ end
839
+
840
+ def from_convertible(from)
826
841
  case from
827
842
  when NilClass
828
843
  throw :undefined_value
@@ -830,6 +845,8 @@ class PNumericType < PScalarType
830
845
  from
831
846
  when Integer
832
847
  from
848
+ when Time::TimeData
849
+ from.to_f
833
850
  when TrueClass
834
851
  1
835
852
  when FalseClass
@@ -851,15 +868,9 @@ class PNumericType < PScalarType
851
868
  raise TypeConversionError.new("Value of type '#{t}' cannot be converted to Numeric")
852
869
  end
853
870
  end
854
-
855
- def from_hash(args_hash)
856
- from_args(args_hash['from'])
857
- end
858
871
  end
859
872
  end
860
873
 
861
- DEFAULT = PNumericType.new(-Float::INFINITY)
862
-
863
874
  protected
864
875
 
865
876
  # @api_private
@@ -868,6 +879,8 @@ class PNumericType < PScalarType
868
879
  # If o min and max are within the range of t
869
880
  @from <= o.numeric_from && @to >= o.numeric_to
870
881
  end
882
+
883
+ DEFAULT = PNumericType.new(-Float::INFINITY)
871
884
  end
872
885
 
873
886
  # @api public
@@ -956,24 +969,34 @@ class PIntegerType < PNumericType
956
969
  @@new_function ||= Puppet::Functions.create_loaded_function(:new, loader) do
957
970
  local_types do
958
971
  type 'Radix = Variant[Default, Integer[2,2], Integer[8,8], Integer[10,10], Integer[16,16]]'
959
- type 'Convertible = Variant[Undef, Integer, Float, Boolean, String]'
960
- type 'NamedArgs = Struct[{from => Convertible, Optional[radix] => Radix}]'
972
+ type 'Convertible = Variant[Undef, Numeric, Boolean, String, Timespan, Timestamp]'
973
+ type 'NamedArgs = Struct[{from => Convertible, Optional[radix] => Radix, Optional[abs] => Boolean}]'
961
974
  end
962
975
 
963
976
  dispatch :from_args do
964
977
  param 'Convertible', :from
965
978
  optional_param 'Radix', :radix
979
+ optional_param 'Boolean', :abs
966
980
  end
967
981
 
968
982
  dispatch :from_hash do
969
983
  param 'NamedArgs', :hash_args
970
984
  end
971
985
 
972
- def from_args(from, radix = :default)
986
+ def from_args(from, radix = :default, abs = false)
987
+ result = from_convertible(from, radix)
988
+ abs ? result.abs : result
989
+ end
990
+
991
+ def from_hash(args_hash)
992
+ from_args(args_hash['from'], args_hash['radix'] || :default, args_hash['abs'] || false)
993
+ end
994
+
995
+ def from_convertible(from, radix)
973
996
  case from
974
997
  when NilClass
975
998
  throw :undefined_value
976
- when Float
999
+ when Float, Time::TimeData
977
1000
  from.to_i
978
1001
  when Integer
979
1002
  from
@@ -1005,12 +1028,6 @@ class PIntegerType < PNumericType
1005
1028
  end
1006
1029
  end
1007
1030
 
1008
- def from_hash(args_hash)
1009
- from = args_hash['from']
1010
- radix = args_hash['radix'] || :default
1011
- from_args(from, radix)
1012
- end
1013
-
1014
1031
  def assert_radix(radix)
1015
1032
  case radix
1016
1033
  when 2, 8, 10, 16, :default
@@ -1062,19 +1079,29 @@ class PFloatType < PNumericType
1062
1079
  def self.new_function(_, loader)
1063
1080
  @new_function ||= Puppet::Functions.create_loaded_function(:new_float, loader) do
1064
1081
  local_types do
1065
- type 'Convertible = Variant[Undef, Integer, Float, Boolean, String]'
1066
- type 'NamedArgs = Struct[{from => Convertible}]'
1082
+ type 'Convertible = Variant[Undef, Numeric, Boolean, String, Timespan, Timestamp]'
1083
+ type 'NamedArgs = Struct[{from => Convertible, Optional[abs] => Boolean}]'
1067
1084
  end
1068
1085
 
1069
1086
  dispatch :from_args do
1070
1087
  param 'Convertible', :from
1088
+ optional_param 'Boolean', :abs
1071
1089
  end
1072
1090
 
1073
1091
  dispatch :from_hash do
1074
1092
  param 'NamedArgs', :hash_args
1075
1093
  end
1076
1094
 
1077
- def from_args(from)
1095
+ def from_args(from, abs = false)
1096
+ result = from_convertible(from)
1097
+ abs ? result.abs : result
1098
+ end
1099
+
1100
+ def from_hash(args_hash)
1101
+ from_args(args_hash['from'], args_hash['abs'] || false)
1102
+ end
1103
+
1104
+ def from_convertible(from)
1078
1105
  case from
1079
1106
  when NilClass
1080
1107
  throw :undefined_value
@@ -1082,6 +1109,8 @@ class PFloatType < PNumericType
1082
1109
  from
1083
1110
  when Integer
1084
1111
  Float(from)
1112
+ when Time::TimeData
1113
+ from.to_f
1085
1114
  when TrueClass
1086
1115
  1.0
1087
1116
  when FalseClass
@@ -1113,10 +1142,6 @@ class PFloatType < PNumericType
1113
1142
  raise TypeConversionError.new("Value of type '#{t}' cannot be converted to Float")
1114
1143
  end
1115
1144
  end
1116
-
1117
- def from_hash(args_hash)
1118
- from_args(args_hash['from'])
1119
- end
1120
1145
  end
1121
1146
  end
1122
1147
 
@@ -2052,6 +2077,9 @@ class PCallableType < PAnyType
2052
2077
  )
2053
2078
  end
2054
2079
 
2080
+ # @return [PAnyType] The type for the values returned by this callable. Returns `nil` if return value is unconstrained
2081
+ attr_reader :return_type
2082
+
2055
2083
  # Types of parameters as a Tuple with required/optional count, or an Integer with min (required), max count
2056
2084
  # @return [PTupleType] the tuple representing the parameter types
2057
2085
  attr_reader :param_types
@@ -2063,16 +2091,19 @@ class PCallableType < PAnyType
2063
2091
  attr_reader :block_type
2064
2092
 
2065
2093
  # @param param_types [PTupleType]
2066
- # @param block_type [PAnyType|nil]
2067
- def initialize(param_types, block_type = nil)
2094
+ # @param block_type [PAnyType]
2095
+ # @param return_type [PAnyType]
2096
+ def initialize(param_types, block_type = nil, return_type = nil)
2068
2097
  @param_types = param_types
2069
2098
  @block_type = block_type
2099
+ @return_type = return_type == PAnyType::DEFAULT ? nil : return_type
2070
2100
  end
2071
2101
 
2072
2102
  def accept(visitor, guard)
2073
2103
  super
2074
2104
  @param_types.accept(visitor, guard) unless @param_types.nil?
2075
2105
  @block_type.accept(visitor, guard) unless @block_type.nil?
2106
+ @return_type.accept(visitor, guard) unless @return_type.nil?
2076
2107
  end
2077
2108
 
2078
2109
  def generalize
@@ -2081,7 +2112,8 @@ class PCallableType < PAnyType
2081
2112
  else
2082
2113
  params_t = @param_types.nil? ? nil : @param_types.generalize
2083
2114
  block_t = @block_type.nil? ? nil : @block_type.generalize
2084
- @param_types.equal?(params_t) && @block_type.equal?(block_t) ? self : PCallableType.new(params_t, block_t)
2115
+ return_t = @return_type.nil? ? nil : @return_type.generalize
2116
+ @param_types.equal?(params_t) && @block_type.equal?(block_t) && @return_type.equal?(return_t) ? self : PCallableType.new(params_t, block_t, return_t)
2085
2117
  end
2086
2118
  end
2087
2119
 
@@ -2091,7 +2123,8 @@ class PCallableType < PAnyType
2091
2123
  else
2092
2124
  params_t = @param_types.nil? ? nil : @param_types.normalize(guard)
2093
2125
  block_t = @block_type.nil? ? nil : @block_type.normalize(guard)
2094
- @param_types.equal?(params_t) && @block_type.equal?(block_t) ? self : PCallableType.new(params_t, block_t)
2126
+ return_t = @return_type.nil? ? nil : @return_type.normalize(guard)
2127
+ @param_types.equal?(params_t) && @block_type.equal?(block_t) && @return_type.equal?(return_t) ? self : PCallableType.new(params_t, block_t, return_t)
2095
2128
  end
2096
2129
  end
2097
2130
 
@@ -2106,7 +2139,7 @@ class PCallableType < PAnyType
2106
2139
  end
2107
2140
 
2108
2141
  def kind_of_callable?(optional=true, guard = nil)
2109
- true
2142
+ true
2110
2143
  end
2111
2144
 
2112
2145
  # Returns the number of accepted arguments [min, max]
@@ -2134,29 +2167,30 @@ class PCallableType < PAnyType
2134
2167
  end
2135
2168
 
2136
2169
  def hash
2137
- @param_types.hash ^ @block_type.hash
2170
+ [@param_types, @block_type, @return_type].hash
2138
2171
  end
2139
2172
 
2140
2173
  def eql?(o)
2141
- self.class == o.class && @param_types == o.param_types && @block_type == o.block_type
2174
+ self.class == o.class && @param_types == o.param_types && @block_type == o.block_type && @return_type == o.return_type
2142
2175
  end
2143
2176
 
2144
2177
  def resolve(type_parser, loader)
2145
- rparam_types = @param_types
2146
- rparam_types = rparam_types.resolve(type_parser, loader) unless rparam_types.nil?
2147
- rblock_type = @block_type
2148
- rblock_type = rblock_type.resolve(type_parser, loader) unless rblock_type.nil?
2149
- rparam_types.equal?(@param_types) && rblock_type.equal?(@block_type) ? self : self.class.new(rparam_types, rblock_type)
2178
+ params_t = @param_types.nil? ? nil : @param_types.resolve(type_parser, loader)
2179
+ block_t = @block_type.nil? ? nil : @block_type.resolve(type_parser, loader)
2180
+ return_t = @return_type.nil? ? nil : @return_type.resolve(type_parser, loader)
2181
+ @param_types.equal?(params_t) && @block_type.equal?(block_t) && @return_type.equal?(return_t) ? self : self.class.new(params_t, block_t, return_t)
2150
2182
  end
2151
2183
 
2152
- DEFAULT = PCallableType.new(nil)
2184
+ DEFAULT = PCallableType.new(nil, nil, nil)
2153
2185
 
2154
2186
  protected
2155
2187
 
2156
2188
  # @api private
2157
2189
  def _assignable?(o, guard)
2158
2190
  return false unless o.is_a?(PCallableType)
2159
- # nil param_types means, any other Callable is assignable
2191
+ return false unless @return_type.nil? || @return_type.assignable?(o.return_type || PAnyType::DEFAULT, guard)
2192
+
2193
+ # nil param_types and compatible return type means other Callable is assignable
2160
2194
  return true if @param_types.nil?
2161
2195
 
2162
2196
  # NOTE: these tests are made in reverse as it is calling the callable that is constrained
@@ -2190,7 +2224,7 @@ class PArrayType < PCollectionType
2190
2224
  param_t = callable.param_types
2191
2225
  block_t = callable.block_type
2192
2226
  # does not support calling with a block, but have to check that callable is ok with missing block
2193
- (param_t.nil? || param_t.assignable?(self, guard)) && (block_t.nil? || block_t.assignable(PUndefType::DEFAULT, guard))
2227
+ (param_t.nil? || param_t.assignable?(self, guard)) && (block_t.nil? || block_t.assignable?(PUndefType::DEFAULT, guard))
2194
2228
  end
2195
2229
 
2196
2230
  def generalize
@@ -2239,6 +2273,11 @@ class PArrayType < PCollectionType
2239
2273
  from
2240
2274
  when Hash
2241
2275
  wrap ? [from] : from.to_a
2276
+
2277
+ when PBinaryType::Binary
2278
+ # For older rubies, the #bytes method returns an Enumerator that must be rolled out
2279
+ wrap ? [from] : from.binary_buffer.bytes.to_a
2280
+
2242
2281
  else
2243
2282
  if wrap
2244
2283
  [from]
@@ -2556,9 +2595,11 @@ class PVariantType < PAnyType
2556
2595
  types = swap_optionals(types)
2557
2596
  types = merge_enums(types)
2558
2597
  types = merge_patterns(types)
2559
- types = merge_int_ranges(types)
2560
- types = merge_float_ranges(types)
2561
2598
  types = merge_version_ranges(types)
2599
+ types = merge_numbers(PIntegerType, types)
2600
+ types = merge_numbers(PFloatType, types)
2601
+ types = merge_numbers(PTimespanType, types)
2602
+ types = merge_numbers(PTimestampType, types)
2562
2603
 
2563
2604
  if types.size == 1
2564
2605
  types[0]
@@ -2685,18 +2726,9 @@ class PVariantType < PAnyType
2685
2726
  end
2686
2727
 
2687
2728
  # @api private
2688
- def merge_int_ranges(array)
2689
- if array.size > 1
2690
- parts = array.partition {|t| t.is_a?(PIntegerType) }
2691
- ranges = parts[0]
2692
- array = merge_ranges(ranges) + parts[1] if ranges.size > 1
2693
- end
2694
- array
2695
- end
2696
-
2697
- def merge_float_ranges(array)
2729
+ def merge_numbers(clazz, array)
2698
2730
  if array.size > 1
2699
- parts = array.partition {|t| t.is_a?(PFloatType) }
2731
+ parts = array.partition {|t| t.is_a?(clazz) }
2700
2732
  ranges = parts[0]
2701
2733
  array = merge_ranges(ranges) + parts[1] if ranges.size > 1
2702
2734
  end
@@ -3224,5 +3256,8 @@ require_relative 'p_sem_ver_type'
3224
3256
  require_relative 'p_sem_ver_range_type'
3225
3257
  require_relative 'p_sensitive_type'
3226
3258
  require_relative 'p_type_set_type'
3259
+ require_relative 'p_timespan_type'
3260
+ require_relative 'p_timestamp_type'
3261
+ require_relative 'p_binary_type'
3227
3262
  require_relative 'type_set_reference'
3228
3263
  require_relative 'implementation_registry'
@@ -200,7 +200,15 @@ module Validation
200
200
  # TODO: this support is questionable, it requires knowledge that :detail is special
201
201
  arguments[:detail] ||= ''
202
202
 
203
- if semantic.is_a?(Puppet::Parser::Resource)
203
+ # Accept an Error as semantic if it supports methods #file(), #line(), and #pos()
204
+ if semantic.is_a?(StandardError)
205
+ unless semantic.respond_to?(:file) && semantic.respond_to?(:line) && semantic.respond_to?(:pos)
206
+ raise Puppet::DevError("Issue #{issue.issue_code}: Cannot pass a #{semantic.class} as a semantic object when it does not support #pos(), #file() and #line()")
207
+ end
208
+ source_pos = semantic
209
+ file = semantic.file
210
+
211
+ elsif semantic.is_a?(Puppet::Parser::Resource)
204
212
  source_pos = semantic
205
213
  file = semantic.file
206
214
  else
@@ -418,6 +418,7 @@ class Checker4_0 < Evaluator::LiteralEvaluator
418
418
 
419
419
  def check_FunctionDefinition(o)
420
420
  check_NamedDefinition(o)
421
+ internal_check_return_type(o)
421
422
  internal_check_parameter_name_uniqueness(o)
422
423
  end
423
424
 
@@ -437,6 +438,11 @@ class Checker4_0 < Evaluator::LiteralEvaluator
437
438
  internal_check_no_idem_last(o)
438
439
  end
439
440
 
441
+ def internal_check_return_type(o)
442
+ r = o.return_type
443
+ internal_check_type_ref(o, r) unless r.nil?
444
+ end
445
+
440
446
  def internal_check_type_ref(o, r)
441
447
  n = r.is_a?(Model::AccessExpression) ? r.left_expr : r
442
448
  if n.is_a? Model::QualifiedReference
@@ -515,6 +521,7 @@ class Checker4_0 < Evaluator::LiteralEvaluator
515
521
 
516
522
  def check_LambdaExpression(o)
517
523
  internal_check_capture_last(o)
524
+ internal_check_return_type(o)
518
525
  end
519
526
 
520
527
  def check_LiteralList(o)