puppet 5.0.1 → 5.1.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.
- checksums.yaml +4 -4
- data/lib/puppet/agent.rb +1 -0
- data/lib/puppet/defaults.rb +1 -1
- data/lib/puppet/functions.rb +6 -7
- data/lib/puppet/functions/all.rb +100 -0
- data/lib/puppet/functions/any.rb +105 -0
- data/lib/puppet/functions/defined.rb +3 -3
- data/lib/puppet/functions/new.rb +2 -1
- data/lib/puppet/functions/reduce.rb +31 -0
- data/lib/puppet/functions/tree_each.rb +200 -0
- data/lib/puppet/module.rb +30 -0
- data/lib/puppet/parser/functions/new.rb +67 -0
- data/lib/puppet/parser/functions/reduce.rb +31 -0
- data/lib/puppet/parser/relationship.rb +2 -2
- data/lib/puppet/parser/resource.rb +39 -10
- data/lib/puppet/parser/scope.rb +1 -1
- data/lib/puppet/pops/evaluator/access_operator.rb +11 -4
- data/lib/puppet/pops/evaluator/collector_transformer.rb +1 -1
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +4 -4
- data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -1
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +3 -3
- data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -1
- data/lib/puppet/pops/loader/module_loaders.rb +1 -1
- data/lib/puppet/pops/loader/static_loader.rb +1 -2
- data/lib/puppet/pops/loaders.rb +1 -2
- data/lib/puppet/pops/lookup/context.rb +1 -1
- data/lib/puppet/pops/lookup/lookup_adapter.rb +2 -1
- data/lib/puppet/pops/model/ast.rb +440 -436
- data/lib/puppet/pops/model/factory.rb +140 -140
- data/lib/puppet/pops/pcore.rb +1 -2
- data/lib/puppet/pops/resource/param.rb +1 -1
- data/lib/puppet/pops/resource/resource_type_impl.rb +1 -1
- data/lib/puppet/pops/serialization/from_data_converter.rb +0 -12
- data/lib/puppet/pops/time/timestamp.rb +29 -17
- data/lib/puppet/pops/types/annotatable.rb +2 -2
- data/lib/puppet/pops/types/annotation.rb +8 -8
- data/lib/puppet/pops/types/class_loader.rb +3 -3
- data/lib/puppet/pops/types/implementation_registry.rb +1 -1
- data/lib/puppet/pops/types/iterable.rb +2 -2
- data/lib/puppet/pops/types/p_binary_type.rb +2 -2
- data/lib/puppet/pops/types/p_init_type.rb +238 -0
- data/lib/puppet/pops/types/p_meta_type.rb +14 -11
- data/lib/puppet/pops/types/p_object_type.rb +15 -15
- data/lib/puppet/pops/types/p_sem_ver_range_type.rb +2 -2
- data/lib/puppet/pops/types/p_sem_ver_type.rb +2 -2
- data/lib/puppet/pops/types/p_sensitive_type.rb +2 -2
- data/lib/puppet/pops/types/p_timespan_type.rb +6 -6
- data/lib/puppet/pops/types/p_timestamp_type.rb +6 -2
- data/lib/puppet/pops/types/p_type_set_type.rb +10 -9
- data/lib/puppet/pops/types/ruby_generator.rb +6 -5
- data/lib/puppet/pops/types/ruby_method.rb +2 -2
- data/lib/puppet/pops/types/string_converter.rb +1 -1
- data/lib/puppet/pops/types/tree_iterators.rb +250 -0
- data/lib/puppet/pops/types/type_calculator.rb +13 -13
- data/lib/puppet/pops/types/type_factory.rb +26 -7
- data/lib/puppet/pops/types/type_formatter.rb +9 -4
- data/lib/puppet/pops/types/type_parser.rb +8 -3
- data/lib/puppet/pops/types/type_set_reference.rb +2 -2
- data/lib/puppet/pops/types/types.rb +168 -109
- data/lib/puppet/provider/package/gem.rb +10 -9
- data/lib/puppet/provider/package/pip.rb +12 -3
- data/lib/puppet/provider/package/yum.rb +9 -1
- data/lib/puppet/resource/capability_finder.rb +30 -11
- data/lib/puppet/type/file.rb +21 -13
- data/lib/puppet/util/execution.rb +67 -14
- data/lib/puppet/util/suidmanager.rb +1 -0
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +130 -66
- data/man/man5/puppet.conf.5 +1 -1
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-simple.txt +1 -0
- data/spec/integration/parser/collection_spec.rb +40 -1
- data/spec/shared_contexts/types_setup.rb +41 -2
- data/spec/unit/agent_spec.rb +11 -0
- data/spec/unit/file_bucket/dipper_spec.rb +13 -4
- data/spec/unit/functions/all_spec.rb +97 -0
- data/spec/unit/functions/any_spec.rb +109 -0
- data/spec/unit/functions/hiera_spec.rb +5 -0
- data/spec/unit/functions/new_spec.rb +66 -0
- data/spec/unit/functions/tree_each_spec.rb +444 -0
- data/spec/unit/module_spec.rb +29 -0
- data/spec/unit/pops/serialization/serialization_spec.rb +2 -2
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +2 -2
- data/spec/unit/pops/types/iterable_spec.rb +9 -9
- data/spec/unit/pops/types/p_init_type_spec.rb +285 -0
- data/spec/unit/pops/types/p_object_type_spec.rb +8 -8
- data/spec/unit/pops/types/p_sensitive_type_spec.rb +4 -0
- data/spec/unit/pops/types/p_timespan_type_spec.rb +14 -0
- data/spec/unit/pops/types/p_timestamp_type_spec.rb +19 -1
- data/spec/unit/pops/types/p_type_set_type_spec.rb +2 -2
- data/spec/unit/pops/types/ruby_generator_spec.rb +9 -22
- data/spec/unit/pops/types/string_converter_spec.rb +2 -2
- data/spec/unit/pops/types/type_acceptor_spec.rb +2 -2
- data/spec/unit/pops/types/type_calculator_spec.rb +43 -38
- data/spec/unit/pops/types/type_factory_spec.rb +6 -6
- data/spec/unit/pops/types/type_formatter_spec.rb +6 -6
- data/spec/unit/pops/types/types_spec.rb +16 -4
- data/spec/unit/provider/package/gem_spec.rb +6 -6
- data/spec/unit/provider/package/pip_spec.rb +44 -23
- data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
- data/spec/unit/provider/package/yum_spec.rb +8 -0
- data/spec/unit/resource/capability_finder_spec.rb +4 -5
- data/spec/unit/type/file_spec.rb +19 -14
- data/spec/unit/util/execution_spec.rb +216 -82
- data/tasks/generate_ast_model.rake +10 -2
- metadata +15 -2
@@ -212,7 +212,7 @@ class TypeCalculator
|
|
212
212
|
when c == FalseClass, c == TrueClass
|
213
213
|
type = PBooleanType::DEFAULT
|
214
214
|
when c == Class
|
215
|
-
type =
|
215
|
+
type = PTypeType::DEFAULT
|
216
216
|
when c == Array
|
217
217
|
# Assume array of any
|
218
218
|
type = PArrayType::DEFAULT
|
@@ -347,8 +347,8 @@ class TypeCalculator
|
|
347
347
|
end
|
348
348
|
|
349
349
|
# when both are host-classes, reduce to PHostClass[] (since one was not assignable to the other)
|
350
|
-
if t1.is_a?(
|
351
|
-
return
|
350
|
+
if t1.is_a?(PClassType) && t2.is_a?(PClassType)
|
351
|
+
return PClassType::DEFAULT
|
352
352
|
end
|
353
353
|
|
354
354
|
# when both are resources, reduce to Resource[T] or Resource[] (since one was not assignable to the other)
|
@@ -427,8 +427,8 @@ class TypeCalculator
|
|
427
427
|
end
|
428
428
|
|
429
429
|
# Meta types Type[Integer] + Type[String] => Type[Data]
|
430
|
-
if t1.is_a?(
|
431
|
-
return
|
430
|
+
if t1.is_a?(PTypeType) && t2.is_a?(PTypeType)
|
431
|
+
return PTypeType.new(common_type(t1.type, t2.type))
|
432
432
|
end
|
433
433
|
|
434
434
|
if common_rich_data?(t1,t2)
|
@@ -484,11 +484,11 @@ class TypeCalculator
|
|
484
484
|
reduce_type(enumerable.map {|o| infer(o) })
|
485
485
|
end
|
486
486
|
|
487
|
-
# The type of all modules is
|
487
|
+
# The type of all modules is PTypeType
|
488
488
|
# @api private
|
489
489
|
#
|
490
490
|
def infer_Module(o)
|
491
|
-
|
491
|
+
PTypeType::new(PRuntimeType.new(:ruby, o.name))
|
492
492
|
end
|
493
493
|
|
494
494
|
# @api private
|
@@ -518,19 +518,19 @@ class TypeCalculator
|
|
518
518
|
end
|
519
519
|
end
|
520
520
|
|
521
|
-
# The type of all types is
|
521
|
+
# The type of all types is PTypeType
|
522
522
|
# @api private
|
523
523
|
#
|
524
524
|
def infer_PAnyType(o)
|
525
|
-
|
525
|
+
PTypeType.new(o)
|
526
526
|
end
|
527
527
|
|
528
|
-
# The type of all types is
|
528
|
+
# The type of all types is PTypeType
|
529
529
|
# This is the metatype short circuit.
|
530
530
|
# @api private
|
531
531
|
#
|
532
|
-
def
|
533
|
-
|
532
|
+
def infer_PTypeType(o)
|
533
|
+
PTypeType.new(o)
|
534
534
|
end
|
535
535
|
|
536
536
|
# @api private
|
@@ -629,7 +629,7 @@ class TypeCalculator
|
|
629
629
|
# A mapping must be made to empty string. A nil value will result in an error later
|
630
630
|
title = o.title
|
631
631
|
title = '' if :undef == title
|
632
|
-
|
632
|
+
PTypeType.new(PResourceType.new(o.type.to_s, title))
|
633
633
|
end
|
634
634
|
|
635
635
|
# @api private
|
@@ -54,6 +54,21 @@ module TypeFactory
|
|
54
54
|
PNumericType::DEFAULT
|
55
55
|
end
|
56
56
|
|
57
|
+
# Produces the Init type
|
58
|
+
# @api public
|
59
|
+
def self.init(*args)
|
60
|
+
case args.size
|
61
|
+
when 0
|
62
|
+
PInitType::DEFAULT
|
63
|
+
when 1
|
64
|
+
type = args[0]
|
65
|
+
type.nil? ? PInitType::DEFAULT : PInitType.new(type, EMPTY_ARRAY)
|
66
|
+
else
|
67
|
+
type = args.shift
|
68
|
+
PInitType.new(type, args)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
57
72
|
# Produces the Iterable type
|
58
73
|
# @api public
|
59
74
|
#
|
@@ -101,7 +116,11 @@ module TypeFactory
|
|
101
116
|
# @api public
|
102
117
|
#
|
103
118
|
def self.optional(optional_type = nil)
|
104
|
-
|
119
|
+
if optional_type.nil?
|
120
|
+
POptionalType::DEFAULT
|
121
|
+
else
|
122
|
+
POptionalType.new(type_of(optional_type.is_a?(String) ? string(optional_type) : type_of(optional_type)))
|
123
|
+
end
|
105
124
|
end
|
106
125
|
|
107
126
|
# Produces the Enum type, optionally with specific string values
|
@@ -396,16 +415,16 @@ module TypeFactory
|
|
396
415
|
end
|
397
416
|
end
|
398
417
|
|
399
|
-
# Produces
|
400
|
-
# nil or empty name is compatible with any other
|
401
|
-
#
|
418
|
+
# Produces PClassType with a string class_name. A PClassType with
|
419
|
+
# nil or empty name is compatible with any other PClassType. A
|
420
|
+
# PClassType with a given name is only compatible with a PClassType
|
402
421
|
# with the same name.
|
403
422
|
#
|
404
423
|
def self.host_class(class_name = nil)
|
405
424
|
if class_name.nil?
|
406
|
-
|
425
|
+
PClassType::DEFAULT
|
407
426
|
else
|
408
|
-
|
427
|
+
PClassType.new(class_name.sub(/^::/, ''))
|
409
428
|
end
|
410
429
|
end
|
411
430
|
|
@@ -482,7 +501,7 @@ module TypeFactory
|
|
482
501
|
# @api public
|
483
502
|
#
|
484
503
|
def self.type_type(inst_type = nil)
|
485
|
-
inst_type.nil? ?
|
504
|
+
inst_type.nil? ? PTypeType::DEFAULT : PTypeType.new(inst_type)
|
486
505
|
end
|
487
506
|
|
488
507
|
# Produce a type corresponding to the class of given unless given is a
|
@@ -169,10 +169,15 @@ class TypeFormatter
|
|
169
169
|
end
|
170
170
|
|
171
171
|
# @api private
|
172
|
-
def
|
172
|
+
def string_PTypeType(t)
|
173
173
|
append_array('Type', t.type.nil?) { append_string(t.type) }
|
174
174
|
end
|
175
175
|
|
176
|
+
# @api private
|
177
|
+
def string_PInitType(t)
|
178
|
+
append_array('Init', t.type.nil?) { append_strings([t.type, *t.init_args]) }
|
179
|
+
end
|
180
|
+
|
176
181
|
# @api private
|
177
182
|
def string_PIterableType(t)
|
178
183
|
append_array('Iterable', t.element_type.nil?) { append_string(t.element_type) }
|
@@ -341,7 +346,7 @@ class TypeFormatter
|
|
341
346
|
|
342
347
|
# @api private
|
343
348
|
def string_PRuntimeType(t)
|
344
|
-
append_array('Runtime') { append_strings([t.runtime, t.name_or_pattern]) }
|
349
|
+
append_array('Runtime', t.runtime.nil? && t.name_or_pattern.nil?) { append_strings([t.runtime, t.name_or_pattern]) }
|
345
350
|
end
|
346
351
|
|
347
352
|
# @api private
|
@@ -376,7 +381,7 @@ class TypeFormatter
|
|
376
381
|
end
|
377
382
|
|
378
383
|
# @api private
|
379
|
-
def
|
384
|
+
def string_PClassType(t)
|
380
385
|
append_array('Class', t.class_name.nil?) { append_elements([t.class_name]) }
|
381
386
|
end
|
382
387
|
|
@@ -457,7 +462,7 @@ class TypeFormatter
|
|
457
462
|
|
458
463
|
# @api private
|
459
464
|
def string_PSensitiveType(t)
|
460
|
-
append_array('Sensitive') { append_string(t.type) }
|
465
|
+
append_array('Sensitive', PAnyType::DEFAULT == t.type) { append_string(t.type) }
|
461
466
|
end
|
462
467
|
|
463
468
|
# @api private
|
@@ -71,7 +71,7 @@ class TypeParser
|
|
71
71
|
|
72
72
|
# @api private
|
73
73
|
def interpret_TypeAlias(o, context)
|
74
|
-
Loader::TypeDefinitionInstantiator.create_type(o.name, o.type_expr, Pcore::RUNTIME_NAME_AUTHORITY).resolve(
|
74
|
+
Loader::TypeDefinitionInstantiator.create_type(o.name, o.type_expr, Pcore::RUNTIME_NAME_AUTHORITY).resolve(loader_from_context(o, context))
|
75
75
|
end
|
76
76
|
|
77
77
|
# @api private
|
@@ -159,6 +159,7 @@ class TypeParser
|
|
159
159
|
'integer' => TypeFactory.integer,
|
160
160
|
'float' => TypeFactory.float,
|
161
161
|
'numeric' => TypeFactory.numeric,
|
162
|
+
'init' => TypeFactory.init,
|
162
163
|
'iterable' => TypeFactory.iterable,
|
163
164
|
'iterator' => TypeFactory.iterator,
|
164
165
|
'string' => TypeFactory.string,
|
@@ -208,7 +209,7 @@ class TypeParser
|
|
208
209
|
loader = loader_from_context(name_ast, context)
|
209
210
|
unless loader.nil?
|
210
211
|
type = loader.load(:type, name)
|
211
|
-
type = type.resolve(
|
212
|
+
type = type.resolve(loader) unless type.nil?
|
212
213
|
end
|
213
214
|
type || TypeFactory.type_reference(name_ast.cased_value)
|
214
215
|
end
|
@@ -408,6 +409,10 @@ class TypeParser
|
|
408
409
|
raise_invalid_parameters_error('Object', 1, parameters.size) unless parameters.size == 1
|
409
410
|
TypeFactory.type_set(parameters[0])
|
410
411
|
|
412
|
+
when 'init'
|
413
|
+
assert_type(ast, parameters[0])
|
414
|
+
TypeFactory.init(*parameters)
|
415
|
+
|
411
416
|
when 'iterable'
|
412
417
|
if parameters.size != 1
|
413
418
|
raise_invalid_parameters_error('Iterable', 1, parameters.size)
|
@@ -517,7 +522,7 @@ class TypeParser
|
|
517
522
|
type = nil
|
518
523
|
unless loader.nil?
|
519
524
|
type = loader.load(:type, type_name)
|
520
|
-
type = type.resolve(
|
525
|
+
type = type.resolve(loader) unless type.nil?
|
521
526
|
end
|
522
527
|
|
523
528
|
if type.nil?
|
@@ -36,7 +36,7 @@ class TypeSetReference
|
|
36
36
|
result
|
37
37
|
end
|
38
38
|
|
39
|
-
def resolve(
|
39
|
+
def resolve(loader)
|
40
40
|
typed_name = Loader::TypedName.new(:type, @name, @name_authority)
|
41
41
|
loaded_entry = loader.load_typed(typed_name)
|
42
42
|
type_set = loaded_entry.nil? ? nil : loaded_entry.value
|
@@ -44,7 +44,7 @@ class TypeSetReference
|
|
44
44
|
raise ArgumentError, "#{self} cannot be resolved" if type_set.nil?
|
45
45
|
raise ArgumentError, "#{self} resolves to a #{type_set.name}" unless type_set.is_a?(PTypeSetType)
|
46
46
|
|
47
|
-
@type_set = type_set.resolve(
|
47
|
+
@type_set = type_set.resolve(loader)
|
48
48
|
unless @version_range.include?(@type_set.version)
|
49
49
|
raise ArgumentError, "#{self} resolves to an incompatible version. Expected #{@version_range}, got #{type_set.version}"
|
50
50
|
end
|
@@ -60,13 +60,13 @@ class TypedModelObject < Object
|
|
60
60
|
RubyMethod.register_ptype(loader, ir)
|
61
61
|
]
|
62
62
|
Types.constants.each do |c|
|
63
|
+
next if c == :PType || c == :PHostClassType
|
63
64
|
cls = Types.const_get(c)
|
64
65
|
next unless cls.is_a?(Class) && cls < self
|
65
66
|
type = cls.register_ptype(loader, ir)
|
66
67
|
types << type unless type.nil?
|
67
68
|
end
|
68
|
-
|
69
|
-
types.each { |type| type.resolve(tp, loader) }
|
69
|
+
types.each { |type| type.resolve(loader) }
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -187,6 +187,12 @@ class PAnyType < TypedModelObject
|
|
187
187
|
self
|
188
188
|
end
|
189
189
|
|
190
|
+
# Returns the loader that loaded this type.
|
191
|
+
# @return [Loaders::Loader] the loader
|
192
|
+
def loader
|
193
|
+
Loaders.static_loader
|
194
|
+
end
|
195
|
+
|
190
196
|
# Normalizes the type. This does not change the characteristics of the type but it will remove duplicates
|
191
197
|
# and constructs like NotUndef[T] where T is not assignable from Undef and change Variant[*T] where all
|
192
198
|
# T are enums into an Enum.
|
@@ -202,11 +208,10 @@ class PAnyType < TypedModelObject
|
|
202
208
|
# resolve internal type expressions using a loader. Presently, this method is a no-op for all types
|
203
209
|
# except the {{PTypeAliasType}}.
|
204
210
|
#
|
205
|
-
# @param type_parser [TypeParser] type parser
|
206
211
|
# @param loader [Loader::Loader] loader to use
|
207
212
|
# @return [PTypeAliasType] the receiver of the call, i.e. `self`
|
208
213
|
# @api private
|
209
|
-
def resolve(
|
214
|
+
def resolve(loader)
|
210
215
|
self
|
211
216
|
end
|
212
217
|
|
@@ -283,11 +288,10 @@ class PAnyType < TypedModelObject
|
|
283
288
|
# an instance of PVariantType will return 'Variant'
|
284
289
|
# @return [String] the simple name of this type
|
285
290
|
def self.simple_name
|
286
|
-
|
291
|
+
@simple_name ||= (
|
287
292
|
n = name
|
288
|
-
|
289
|
-
|
290
|
-
@simple_name
|
293
|
+
n[n.rindex(DOUBLE_COLON)+3..n.size-5].freeze
|
294
|
+
)
|
291
295
|
end
|
292
296
|
|
293
297
|
def to_alias_expanded_s
|
@@ -309,8 +313,15 @@ class PAnyType < TypedModelObject
|
|
309
313
|
Loaders.find_loader(nil).load(:function, 'new').call({}, self, *args)
|
310
314
|
end
|
311
315
|
|
312
|
-
|
313
|
-
|
316
|
+
# Create an instance of this type.
|
317
|
+
# The default implementation will just dispatch the call to the class method with the
|
318
|
+
# same name and pass `self` as the first argument.
|
319
|
+
#
|
320
|
+
# @return [Function] the created function
|
321
|
+
# @raises ArgumentError
|
322
|
+
#
|
323
|
+
def new_function
|
324
|
+
self.class.new_function(self)
|
314
325
|
end
|
315
326
|
|
316
327
|
# This default implementation of of a new_function raises an Argument Error.
|
@@ -318,10 +329,12 @@ class PAnyType < TypedModelObject
|
|
318
329
|
# a Puppet Function class by using Puppet:Loaders.create_loaded_function(:new, loader)
|
319
330
|
# and return that result.
|
320
331
|
#
|
332
|
+
# @param type [PAnyType] the type to create a new function for
|
333
|
+
# @return [Function] the created function
|
321
334
|
# @raises ArgumentError
|
322
335
|
#
|
323
|
-
def self.new_function(
|
324
|
-
raise ArgumentError.new("Creation of new instance of type '#{
|
336
|
+
def self.new_function(type)
|
337
|
+
raise ArgumentError.new("Creation of new instance of type '#{type.to_s}' is not supported")
|
325
338
|
end
|
326
339
|
|
327
340
|
# Answers the question if instances of this type can represent themselves as a string that
|
@@ -434,9 +447,9 @@ class PTypeWithContainedType < PAnyType
|
|
434
447
|
self.class == o.class && @type == o.type
|
435
448
|
end
|
436
449
|
|
437
|
-
def resolve(
|
450
|
+
def resolve(loader)
|
438
451
|
rtype = @type
|
439
|
-
rtype = rtype.resolve(
|
452
|
+
rtype = rtype.resolve(loader) unless rtype.nil?
|
440
453
|
rtype.equal?(@type) ? self : self.class.new(rtype)
|
441
454
|
end
|
442
455
|
end
|
@@ -444,17 +457,31 @@ end
|
|
444
457
|
# The type of types.
|
445
458
|
# @api public
|
446
459
|
#
|
447
|
-
class
|
460
|
+
class PTypeType < PTypeWithContainedType
|
448
461
|
|
449
462
|
def self.register_ptype(loader, ir)
|
450
463
|
create_ptype(loader, ir, 'AnyType',
|
451
464
|
'type' => {
|
452
|
-
KEY_TYPE => POptionalType.new(
|
465
|
+
KEY_TYPE => POptionalType.new(PTypeType::DEFAULT),
|
453
466
|
KEY_VALUE => nil
|
454
467
|
}
|
455
468
|
)
|
456
469
|
end
|
457
470
|
|
471
|
+
# Returns a new function that produces a Type instance
|
472
|
+
#
|
473
|
+
def self.new_function(type)
|
474
|
+
@new_function ||= Puppet::Functions.create_loaded_function(:new_type, type.loader) do
|
475
|
+
dispatch :from_string do
|
476
|
+
param 'String', :type_string
|
477
|
+
end
|
478
|
+
|
479
|
+
def from_string(type_string)
|
480
|
+
TypeParser.singleton.parse(type_string, loader)
|
481
|
+
end
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
458
485
|
def instance?(o, guard = nil)
|
459
486
|
if o.is_a?(PAnyType)
|
460
487
|
type.nil? || type.assignable?(o, guard)
|
@@ -496,29 +523,27 @@ class PType < PTypeWithContainedType
|
|
496
523
|
self.class == o.class && @type == o.type
|
497
524
|
end
|
498
525
|
|
499
|
-
|
500
|
-
# since this the class is inconsistently named PType and not PTypeType
|
501
|
-
'Type'
|
502
|
-
end
|
503
|
-
|
504
|
-
DEFAULT = PType.new(nil)
|
526
|
+
DEFAULT = PTypeType.new(nil)
|
505
527
|
|
506
528
|
protected
|
507
529
|
|
508
530
|
# @api private
|
509
531
|
def _assignable?(o, guard)
|
510
|
-
return false unless o.is_a?(
|
532
|
+
return false unless o.is_a?(PTypeType)
|
511
533
|
return true if @type.nil? # wide enough to handle all types
|
512
534
|
return false if o.type.nil? # wider than t
|
513
535
|
@type.assignable?(o.type, guard)
|
514
536
|
end
|
515
537
|
end
|
516
538
|
|
539
|
+
# For backward compatibility
|
540
|
+
PType = PTypeType
|
541
|
+
|
517
542
|
class PNotUndefType < PTypeWithContainedType
|
518
543
|
def self.register_ptype(loader, ir)
|
519
544
|
create_ptype(loader, ir, 'AnyType',
|
520
545
|
'type' => {
|
521
|
-
KEY_TYPE => POptionalType.new(
|
546
|
+
KEY_TYPE => POptionalType.new(PTypeType::DEFAULT),
|
522
547
|
KEY_VALUE => nil
|
523
548
|
}
|
524
549
|
)
|
@@ -549,12 +574,12 @@ class PNotUndefType < PTypeWithContainedType
|
|
549
574
|
end
|
550
575
|
end
|
551
576
|
|
552
|
-
def new_function
|
577
|
+
def new_function
|
553
578
|
# If only NotUndef, then use Unit's null converter
|
554
579
|
if type.nil?
|
555
|
-
PUnitType.new_function(self
|
580
|
+
PUnitType.new_function(self)
|
556
581
|
else
|
557
|
-
type.new_function
|
582
|
+
type.new_function
|
558
583
|
end
|
559
584
|
end
|
560
585
|
|
@@ -607,8 +632,8 @@ class PUnitType < PAnyType
|
|
607
632
|
end
|
608
633
|
|
609
634
|
# A "null" implementation - that simply returns the given argument
|
610
|
-
def self.new_function(
|
611
|
-
@new_function ||= Puppet::Functions.create_loaded_function(:new_unit, loader) do
|
635
|
+
def self.new_function(type)
|
636
|
+
@new_function ||= Puppet::Functions.create_loaded_function(:new_unit, type.loader) do
|
612
637
|
dispatch :from_args do
|
613
638
|
param 'Any', :from
|
614
639
|
end
|
@@ -787,8 +812,8 @@ class PNumericType < PScalarDataType
|
|
787
812
|
)
|
788
813
|
end
|
789
814
|
|
790
|
-
def self.new_function(
|
791
|
-
@new_function ||= Puppet::Functions.create_loaded_function(:new_numeric, loader) do
|
815
|
+
def self.new_function(type)
|
816
|
+
@new_function ||= Puppet::Functions.create_loaded_function(:new_numeric, type.loader) do
|
792
817
|
local_types do
|
793
818
|
type 'Convertible = Variant[Undef, Integer, Float, Boolean, String, Timespan, Timestamp]'
|
794
819
|
type 'NamedArgs = Struct[{from => Convertible, Optional[abs] => Boolean}]'
|
@@ -997,7 +1022,7 @@ class PIntegerType < PNumericType
|
|
997
1022
|
@from >= 0 ? self : PIntegerType.new(0, @to < 0 ? 0 : @to)
|
998
1023
|
end
|
999
1024
|
|
1000
|
-
def new_function
|
1025
|
+
def new_function
|
1001
1026
|
@@new_function ||= Puppet::Functions.create_loaded_function(:new, loader) do
|
1002
1027
|
local_types do
|
1003
1028
|
type 'Radix = Variant[Default, Integer[2,2], Integer[8,8], Integer[10,10], Integer[16,16]]'
|
@@ -1108,8 +1133,8 @@ class PFloatType < PNumericType
|
|
1108
1133
|
|
1109
1134
|
# Returns a new function that produces a Float value
|
1110
1135
|
#
|
1111
|
-
def self.new_function(
|
1112
|
-
@new_function ||= Puppet::Functions.create_loaded_function(:new_float, loader) do
|
1136
|
+
def self.new_function(type)
|
1137
|
+
@new_function ||= Puppet::Functions.create_loaded_function(:new_float, type.loader) do
|
1113
1138
|
local_types do
|
1114
1139
|
type 'Convertible = Variant[Undef, Numeric, Boolean, String, Timespan, Timestamp]'
|
1115
1140
|
type 'NamedArgs = Struct[{from => Convertible, Optional[abs] => Boolean}]'
|
@@ -1186,7 +1211,7 @@ class PCollectionType < PAnyType
|
|
1186
1211
|
def self.register_ptype(loader, ir)
|
1187
1212
|
create_ptype(loader, ir, 'AnyType',
|
1188
1213
|
'size_type' => {
|
1189
|
-
KEY_TYPE => POptionalType.new(
|
1214
|
+
KEY_TYPE => POptionalType.new(PTypeType.new(PIntegerType::DEFAULT)),
|
1190
1215
|
KEY_VALUE => nil
|
1191
1216
|
}
|
1192
1217
|
)
|
@@ -1278,7 +1303,7 @@ class PIterableType < PTypeWithContainedType
|
|
1278
1303
|
def self.register_ptype(loader, ir)
|
1279
1304
|
create_ptype(loader, ir, 'AnyType',
|
1280
1305
|
'type' => {
|
1281
|
-
KEY_TYPE => POptionalType.new(
|
1306
|
+
KEY_TYPE => POptionalType.new(PTypeType::DEFAULT),
|
1282
1307
|
KEY_VALUE => nil
|
1283
1308
|
}
|
1284
1309
|
)
|
@@ -1336,7 +1361,7 @@ class PIteratorType < PTypeWithContainedType
|
|
1336
1361
|
def self.register_ptype(loader, ir)
|
1337
1362
|
create_ptype(loader, ir, 'AnyType',
|
1338
1363
|
'type' => {
|
1339
|
-
KEY_TYPE => POptionalType.new(
|
1364
|
+
KEY_TYPE => POptionalType.new(PTypeType::DEFAULT),
|
1340
1365
|
KEY_VALUE => nil
|
1341
1366
|
}
|
1342
1367
|
)
|
@@ -1374,7 +1399,7 @@ class PStringType < PScalarDataType
|
|
1374
1399
|
def self.register_ptype(loader, ir)
|
1375
1400
|
create_ptype(loader, ir, 'ScalarDataType',
|
1376
1401
|
'size_type_or_value' => {
|
1377
|
-
KEY_TYPE => POptionalType.new(PVariantType.new([PStringType::DEFAULT,
|
1402
|
+
KEY_TYPE => POptionalType.new(PVariantType.new([PStringType::DEFAULT, PTypeType.new(PIntegerType::DEFAULT)])),
|
1378
1403
|
KEY_VALUE => nil
|
1379
1404
|
})
|
1380
1405
|
end
|
@@ -1446,10 +1471,6 @@ class PStringType < PScalarDataType
|
|
1446
1471
|
@size_type_or_value.is_a?(PIntegerType) ? @size_type_or_value : nil
|
1447
1472
|
end
|
1448
1473
|
|
1449
|
-
def size_type
|
1450
|
-
@size_type_or_value.is_a?(PIntegerType) ? @size_type_or_value : nil
|
1451
|
-
end
|
1452
|
-
|
1453
1474
|
def derived_size_type
|
1454
1475
|
if @size_type_or_value.is_a?(PIntegerType)
|
1455
1476
|
@size_type_or_value
|
@@ -1461,8 +1482,8 @@ class PStringType < PScalarDataType
|
|
1461
1482
|
end
|
1462
1483
|
end
|
1463
1484
|
|
1464
|
-
def self.new_function(
|
1465
|
-
@new_function ||= Puppet::Functions.create_loaded_function(:new_string, loader) do
|
1485
|
+
def self.new_function(type)
|
1486
|
+
@new_function ||= Puppet::Functions.create_loaded_function(:new_string, type.loader) do
|
1466
1487
|
local_types do
|
1467
1488
|
type 'Format = Pattern[/^%([\s\+\-#0\[\{<\(\|]*)([1-9][0-9]*)?(?:\.([0-9]+))?([a-zA-Z])/]'
|
1468
1489
|
type 'ContainerFormat = Struct[{
|
@@ -1557,8 +1578,8 @@ class PRegexpType < PScalarType
|
|
1557
1578
|
|
1558
1579
|
# Returns a new function that produces a Regexp instance
|
1559
1580
|
#
|
1560
|
-
def self.new_function(
|
1561
|
-
@new_function ||= Puppet::Functions.create_loaded_function(:new_float, loader) do
|
1581
|
+
def self.new_function(type)
|
1582
|
+
@new_function ||= Puppet::Functions.create_loaded_function(:new_float, type.loader) do
|
1562
1583
|
dispatch :from_string do
|
1563
1584
|
param 'String', :pattern
|
1564
1585
|
end
|
@@ -1691,8 +1712,8 @@ class PBooleanType < PScalarDataType
|
|
1691
1712
|
o == true || o == false
|
1692
1713
|
end
|
1693
1714
|
|
1694
|
-
def self.new_function(
|
1695
|
-
@new_function ||= Puppet::Functions.create_loaded_function(:new_boolean, loader) do
|
1715
|
+
def self.new_function(type)
|
1716
|
+
@new_function ||= Puppet::Functions.create_loaded_function(:new_boolean, type.loader) do
|
1696
1717
|
dispatch :from_args do
|
1697
1718
|
param 'Variant[Undef, Integer, Float, Boolean, String]', :from
|
1698
1719
|
end
|
@@ -1737,8 +1758,8 @@ end
|
|
1737
1758
|
class PStructElement < TypedModelObject
|
1738
1759
|
def self.register_ptype(loader, ir)
|
1739
1760
|
@type = Pcore::create_object_type(loader, ir, self, 'Pcore::StructElement'.freeze, nil,
|
1740
|
-
'key_type' =>
|
1741
|
-
'value_type' =>
|
1761
|
+
'key_type' => PTypeType::DEFAULT,
|
1762
|
+
'value_type' => PTypeType::DEFAULT)
|
1742
1763
|
end
|
1743
1764
|
|
1744
1765
|
attr_accessor :key_type, :value_type
|
@@ -1773,11 +1794,9 @@ class PStructElement < TypedModelObject
|
|
1773
1794
|
@value_type.equal?(nv_type) ? self : PStructElement.new(@key_type, nv_type)
|
1774
1795
|
end
|
1775
1796
|
|
1776
|
-
def resolve(
|
1777
|
-
rkey_type = @key_type
|
1778
|
-
|
1779
|
-
rvalue_type = @value_type
|
1780
|
-
rvalue_type = rvalue_type.resolve(type_parser, loader) unless rvalue_type.nil?
|
1797
|
+
def resolve(loader)
|
1798
|
+
rkey_type = @key_type.resolve(loader)
|
1799
|
+
rvalue_type = @value_type.resolve(loader)
|
1781
1800
|
rkey_type.equal?(@key_type) && rvalue_type.equal?(@value_type) ? self : self.class.new(rkey_type, rvalue_type)
|
1782
1801
|
end
|
1783
1802
|
|
@@ -1869,10 +1888,10 @@ class PStructType < PAnyType
|
|
1869
1888
|
end
|
1870
1889
|
end
|
1871
1890
|
|
1872
|
-
def resolve(
|
1891
|
+
def resolve(loader)
|
1873
1892
|
changed = false
|
1874
1893
|
relements = @elements.map do |elem|
|
1875
|
-
relem = elem.resolve(
|
1894
|
+
relem = elem.resolve(loader)
|
1876
1895
|
changed ||= !relem.equal?(elem)
|
1877
1896
|
relem
|
1878
1897
|
end
|
@@ -1904,10 +1923,10 @@ class PStructType < PAnyType
|
|
1904
1923
|
end && matched == o.size
|
1905
1924
|
end
|
1906
1925
|
|
1907
|
-
def new_function
|
1926
|
+
def new_function
|
1908
1927
|
# Simply delegate to Hash type and let the higher level assertion deal with
|
1909
1928
|
# compliance with the Struct type regarding the produced result.
|
1910
|
-
PHashType.new_function(self
|
1929
|
+
PHashType.new_function(self)
|
1911
1930
|
end
|
1912
1931
|
|
1913
1932
|
DEFAULT = PStructType.new(EMPTY_ARRAY)
|
@@ -1965,9 +1984,9 @@ class PTupleType < PAnyType
|
|
1965
1984
|
|
1966
1985
|
def self.register_ptype(loader, ir)
|
1967
1986
|
create_ptype(loader, ir, 'AnyType',
|
1968
|
-
'types' => PArrayType.new(
|
1987
|
+
'types' => PArrayType.new(PTypeType::DEFAULT),
|
1969
1988
|
'size_type' => {
|
1970
|
-
KEY_TYPE => POptionalType.new(
|
1989
|
+
KEY_TYPE => POptionalType.new(PTypeType.new(PIntegerType::DEFAULT)),
|
1971
1990
|
KEY_VALUE => nil
|
1972
1991
|
}
|
1973
1992
|
)
|
@@ -2050,10 +2069,10 @@ class PTupleType < PAnyType
|
|
2050
2069
|
end
|
2051
2070
|
end
|
2052
2071
|
|
2053
|
-
def resolve(
|
2072
|
+
def resolve(loader)
|
2054
2073
|
changed = false
|
2055
2074
|
rtypes = @types.map do |type|
|
2056
|
-
rtype = type.resolve(
|
2075
|
+
rtype = type.resolve(loader)
|
2057
2076
|
changed ||= !rtype.equal?(type)
|
2058
2077
|
rtype
|
2059
2078
|
end
|
@@ -2115,10 +2134,10 @@ class PTupleType < PAnyType
|
|
2115
2134
|
self.class == o.class && @types == o.types && @size_type == o.size_type
|
2116
2135
|
end
|
2117
2136
|
|
2118
|
-
def new_function
|
2137
|
+
def new_function
|
2119
2138
|
# Simply delegate to Array type and let the higher level assertion deal with
|
2120
2139
|
# compliance with the Tuple type regarding the produced result.
|
2121
|
-
PArrayType.new_function(self
|
2140
|
+
PArrayType.new_function(self)
|
2122
2141
|
end
|
2123
2142
|
|
2124
2143
|
DEFAULT = PTupleType.new(EMPTY_ARRAY)
|
@@ -2172,7 +2191,7 @@ class PCallableType < PAnyType
|
|
2172
2191
|
KEY_VALUE => nil
|
2173
2192
|
},
|
2174
2193
|
'return_type' => {
|
2175
|
-
KEY_TYPE => POptionalType.new(
|
2194
|
+
KEY_TYPE => POptionalType.new(PTypeType::DEFAULT),
|
2176
2195
|
KEY_VALUE => PAnyType::DEFAULT
|
2177
2196
|
}
|
2178
2197
|
)
|
@@ -2290,10 +2309,10 @@ class PCallableType < PAnyType
|
|
2290
2309
|
self.class == o.class && @param_types == o.param_types && @block_type == o.block_type && @return_type == o.return_type
|
2291
2310
|
end
|
2292
2311
|
|
2293
|
-
def resolve(
|
2294
|
-
params_t = @param_types.nil? ? nil : @param_types.resolve(
|
2295
|
-
block_t = @block_type.nil? ? nil : @block_type.resolve(
|
2296
|
-
return_t = @return_type.nil? ? nil : @return_type.resolve(
|
2312
|
+
def resolve(loader)
|
2313
|
+
params_t = @param_types.nil? ? nil : @param_types.resolve(loader)
|
2314
|
+
block_t = @block_type.nil? ? nil : @block_type.resolve(loader)
|
2315
|
+
return_t = @return_type.nil? ? nil : @return_type.resolve(loader)
|
2297
2316
|
@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)
|
2298
2317
|
end
|
2299
2318
|
|
@@ -2329,7 +2348,7 @@ class PArrayType < PCollectionType
|
|
2329
2348
|
def self.register_ptype(loader, ir)
|
2330
2349
|
create_ptype(loader, ir, 'CollectionType',
|
2331
2350
|
'element_type' => {
|
2332
|
-
KEY_TYPE => POptionalType.new(
|
2351
|
+
KEY_TYPE => POptionalType.new(PTypeType::DEFAULT),
|
2333
2352
|
KEY_VALUE => PAnyType::DEFAULT
|
2334
2353
|
}
|
2335
2354
|
)
|
@@ -2385,8 +2404,8 @@ class PArrayType < PCollectionType
|
|
2385
2404
|
end
|
2386
2405
|
end
|
2387
2406
|
|
2388
|
-
def resolve(
|
2389
|
-
relement_type = @element_type.resolve(
|
2407
|
+
def resolve(loader)
|
2408
|
+
relement_type = @element_type.resolve(loader)
|
2390
2409
|
relement_type.equal?(@element_type) ? self : self.class.new(relement_type, @size_type)
|
2391
2410
|
end
|
2392
2411
|
|
@@ -2404,8 +2423,8 @@ class PArrayType < PCollectionType
|
|
2404
2423
|
|
2405
2424
|
# Returns a new function that produces an Array
|
2406
2425
|
#
|
2407
|
-
def self.new_function(
|
2408
|
-
@new_function ||= Puppet::Functions.create_loaded_function(:new_array, loader) do
|
2426
|
+
def self.new_function(type)
|
2427
|
+
@new_function ||= Puppet::Functions.create_loaded_function(:new_array, type.loader) do
|
2409
2428
|
|
2410
2429
|
dispatch :from_args do
|
2411
2430
|
param 'Any', :from
|
@@ -2477,11 +2496,11 @@ class PHashType < PCollectionType
|
|
2477
2496
|
def self.register_ptype(loader, ir)
|
2478
2497
|
create_ptype(loader, ir, 'CollectionType',
|
2479
2498
|
'key_type' => {
|
2480
|
-
KEY_TYPE => POptionalType.new(
|
2499
|
+
KEY_TYPE => POptionalType.new(PTypeType::DEFAULT),
|
2481
2500
|
KEY_VALUE => PAnyType::DEFAULT
|
2482
2501
|
},
|
2483
2502
|
'value_type' => {
|
2484
|
-
KEY_TYPE => POptionalType.new(
|
2503
|
+
KEY_TYPE => POptionalType.new(PTypeType::DEFAULT),
|
2485
2504
|
KEY_VALUE => PAnyType::DEFAULT
|
2486
2505
|
}
|
2487
2506
|
)
|
@@ -2571,18 +2590,32 @@ class PHashType < PCollectionType
|
|
2571
2590
|
self == EMPTY
|
2572
2591
|
end
|
2573
2592
|
|
2574
|
-
def resolve(
|
2575
|
-
rkey_type = @key_type.resolve(
|
2576
|
-
rvalue_type = @value_type.resolve(
|
2593
|
+
def resolve(loader)
|
2594
|
+
rkey_type = @key_type.resolve(loader)
|
2595
|
+
rvalue_type = @value_type.resolve(loader)
|
2577
2596
|
rkey_type.equal?(@key_type) && rvalue_type.equal?(@value_type) ? self : self.class.new(rkey_type, rvalue_type, @size_type)
|
2578
2597
|
end
|
2579
2598
|
|
2599
|
+
def self.array_as_hash(value)
|
2600
|
+
return value unless value.is_a?(Array)
|
2601
|
+
result = {}
|
2602
|
+
value.each_with_index {|v, idx| result[idx] = array_as_hash(v) }
|
2603
|
+
result
|
2604
|
+
end
|
2605
|
+
|
2580
2606
|
# Returns a new function that produces a Hash
|
2581
2607
|
#
|
2582
|
-
def self.new_function(
|
2583
|
-
@new_function ||= Puppet::Functions.create_loaded_function(:new_hash, loader) do
|
2608
|
+
def self.new_function(type)
|
2609
|
+
@new_function ||= Puppet::Functions.create_loaded_function(:new_hash, type.loader) do
|
2584
2610
|
local_types do
|
2585
2611
|
type 'KeyValueArray = Array[Tuple[Any,Any],1]'
|
2612
|
+
type 'TreeArray = Array[Tuple[Array,Any],1]'
|
2613
|
+
type 'NewHashOption = Enum[tree, hash_tree]'
|
2614
|
+
end
|
2615
|
+
|
2616
|
+
dispatch :from_tree do
|
2617
|
+
param 'TreeArray', :from
|
2618
|
+
optional_param 'NewHashOption', :build_option
|
2586
2619
|
end
|
2587
2620
|
|
2588
2621
|
dispatch :from_tuples do
|
@@ -2597,6 +2630,34 @@ class PHashType < PCollectionType
|
|
2597
2630
|
Hash[tuple_array]
|
2598
2631
|
end
|
2599
2632
|
|
2633
|
+
def from_tree(tuple_array, build_option = nil)
|
2634
|
+
if build_option.nil?
|
2635
|
+
return from_tuples(tuple_array)
|
2636
|
+
end
|
2637
|
+
# only remaining possible options is 'tree' or 'hash_tree'
|
2638
|
+
|
2639
|
+
all_hashes = build_option == 'hash_tree'
|
2640
|
+
result = {}
|
2641
|
+
tuple_array.each do |entry|
|
2642
|
+
path = entry[0]
|
2643
|
+
value = entry[1]
|
2644
|
+
if path.empty?
|
2645
|
+
# root node (index [] was included - values merge into the result)
|
2646
|
+
# An array must be changed to a hash first as this is the root
|
2647
|
+
# (Cannot return an array from a Hash.new)
|
2648
|
+
if value.is_a?(Array)
|
2649
|
+
value.each_with_index {|v, idx| result[idx] = v }
|
2650
|
+
else
|
2651
|
+
result.merge!(value)
|
2652
|
+
end
|
2653
|
+
else
|
2654
|
+
r = path[0..-2].reduce(result) {|memo, idx| (memo.is_a?(Array) || memo.has_key?(idx)) ? memo[idx] : memo[idx] = {}}
|
2655
|
+
r[path[-1]]= (all_hashes ? PHashType.array_as_hash(value) : value)
|
2656
|
+
end
|
2657
|
+
end
|
2658
|
+
result
|
2659
|
+
end
|
2660
|
+
|
2600
2661
|
def from_array(from)
|
2601
2662
|
case from
|
2602
2663
|
when NilClass
|
@@ -2660,7 +2721,7 @@ class PVariantType < PAnyType
|
|
2660
2721
|
include Enumerable
|
2661
2722
|
|
2662
2723
|
def self.register_ptype(loader, ir)
|
2663
|
-
create_ptype(loader, ir, 'AnyType', 'types' => PArrayType.new(
|
2724
|
+
create_ptype(loader, ir, 'AnyType', 'types' => PArrayType.new(PTypeType::DEFAULT))
|
2664
2725
|
end
|
2665
2726
|
|
2666
2727
|
attr_reader :types
|
@@ -2770,6 +2831,7 @@ class PVariantType < PAnyType
|
|
2770
2831
|
def really_instance?(o, guard = nil)
|
2771
2832
|
@types.reduce(-1) do |memo, type|
|
2772
2833
|
ri = type.really_instance?(o, guard)
|
2834
|
+
break ri if ri > 0
|
2773
2835
|
ri > memo ? ri : memo
|
2774
2836
|
end
|
2775
2837
|
end
|
@@ -2778,10 +2840,6 @@ class PVariantType < PAnyType
|
|
2778
2840
|
@types.all? { |type| type.kind_of_callable?(optional, guard) }
|
2779
2841
|
end
|
2780
2842
|
|
2781
|
-
def resolved?
|
2782
|
-
@types.all? { |type| type.resolved? }
|
2783
|
-
end
|
2784
|
-
|
2785
2843
|
def eql?(o)
|
2786
2844
|
self.class == o.class && @types.size == o.types.size && (@types - o.types).empty?
|
2787
2845
|
end
|
@@ -2915,7 +2973,7 @@ end
|
|
2915
2973
|
# Represents a (host-) class in the Puppet Language.
|
2916
2974
|
# @api public
|
2917
2975
|
#
|
2918
|
-
class
|
2976
|
+
class PClassType < PCatalogEntryType
|
2919
2977
|
attr_reader :class_name
|
2920
2978
|
|
2921
2979
|
def self.register_ptype(loader, ir)
|
@@ -2927,8 +2985,6 @@ class PHostClassType < PCatalogEntryType
|
|
2927
2985
|
)
|
2928
2986
|
end
|
2929
2987
|
|
2930
|
-
NAME = 'Class'.freeze
|
2931
|
-
|
2932
2988
|
def initialize(class_name)
|
2933
2989
|
@class_name = class_name
|
2934
2990
|
end
|
@@ -2940,17 +2996,13 @@ class PHostClassType < PCatalogEntryType
|
|
2940
2996
|
self.class == o.class && @class_name == o.class_name
|
2941
2997
|
end
|
2942
2998
|
|
2943
|
-
|
2944
|
-
NAME
|
2945
|
-
end
|
2946
|
-
|
2947
|
-
DEFAULT = PHostClassType.new(nil)
|
2999
|
+
DEFAULT = PClassType.new(nil)
|
2948
3000
|
|
2949
3001
|
protected
|
2950
3002
|
|
2951
3003
|
# @api private
|
2952
3004
|
def _assignable?(o, guard)
|
2953
|
-
return false unless o.is_a?(
|
3005
|
+
return false unless o.is_a?(PClassType)
|
2954
3006
|
# Class = Class[name}, Class[name] != Class
|
2955
3007
|
return true if @class_name.nil?
|
2956
3008
|
# Class[name] = Class[name]
|
@@ -2958,6 +3010,10 @@ class PHostClassType < PCatalogEntryType
|
|
2958
3010
|
end
|
2959
3011
|
end
|
2960
3012
|
|
3013
|
+
# For backward compatibility
|
3014
|
+
PHostClassType = PClassType
|
3015
|
+
|
3016
|
+
|
2961
3017
|
# Represents a Resource Type in the Puppet Language
|
2962
3018
|
# @api public
|
2963
3019
|
#
|
@@ -3011,7 +3067,7 @@ class POptionalType < PTypeWithContainedType
|
|
3011
3067
|
def self.register_ptype(loader, ir)
|
3012
3068
|
create_ptype(loader, ir, 'AnyType',
|
3013
3069
|
'type' => {
|
3014
|
-
KEY_TYPE => POptionalType.new(
|
3070
|
+
KEY_TYPE => POptionalType.new(PTypeType::DEFAULT),
|
3015
3071
|
KEY_VALUE => nil
|
3016
3072
|
}
|
3017
3073
|
)
|
@@ -3046,8 +3102,8 @@ class POptionalType < PTypeWithContainedType
|
|
3046
3102
|
end
|
3047
3103
|
end
|
3048
3104
|
|
3049
|
-
def new_function
|
3050
|
-
optional_type.new_function
|
3105
|
+
def new_function
|
3106
|
+
optional_type.new_function
|
3051
3107
|
end
|
3052
3108
|
|
3053
3109
|
DEFAULT = POptionalType.new(nil)
|
@@ -3094,8 +3150,8 @@ class PTypeReferenceType < PAnyType
|
|
3094
3150
|
super && o.type_string == @type_string
|
3095
3151
|
end
|
3096
3152
|
|
3097
|
-
def resolve(
|
3098
|
-
|
3153
|
+
def resolve(loader)
|
3154
|
+
TypeParser.singleton.parse(@type_string, loader)
|
3099
3155
|
end
|
3100
3156
|
|
3101
3157
|
protected
|
@@ -3122,13 +3178,13 @@ class PTypeAliasType < PAnyType
|
|
3122
3178
|
'name' => PStringType::NON_EMPTY,
|
3123
3179
|
'type_expr' => PAnyType::DEFAULT,
|
3124
3180
|
'resolved_type' => {
|
3125
|
-
KEY_TYPE => POptionalType.new(
|
3181
|
+
KEY_TYPE => POptionalType.new(PTypeType::DEFAULT),
|
3126
3182
|
KEY_VALUE => nil
|
3127
3183
|
}
|
3128
3184
|
)
|
3129
3185
|
end
|
3130
3186
|
|
3131
|
-
attr_reader :name
|
3187
|
+
attr_reader :loader, :name
|
3132
3188
|
|
3133
3189
|
# @param name [String] The name of the type
|
3134
3190
|
# @param type_expr [Model::PopsObject] The expression that describes the aliased type
|
@@ -3233,16 +3289,17 @@ class PTypeAliasType < PAnyType
|
|
3233
3289
|
# @param loader [Loader::Loader] loader to use when loading type aliases
|
3234
3290
|
# @return [PTypeAliasType] the receiver of the call, i.e. `self`
|
3235
3291
|
# @api private
|
3236
|
-
def resolve(
|
3292
|
+
def resolve(loader)
|
3293
|
+
@loader = loader
|
3237
3294
|
if @resolved_type.nil?
|
3238
3295
|
# resolved to PTypeReferenceType::DEFAULT during resolve to avoid endless recursion
|
3239
3296
|
@resolved_type = PTypeReferenceType::DEFAULT
|
3240
3297
|
@self_recursion = true # assumed while it being found out below
|
3241
3298
|
begin
|
3242
3299
|
if @type_expr.is_a?(PTypeReferenceType)
|
3243
|
-
@resolved_type = @type_expr.resolve(
|
3300
|
+
@resolved_type = @type_expr.resolve(loader)
|
3244
3301
|
else
|
3245
|
-
@resolved_type =
|
3302
|
+
@resolved_type = TypeParser.singleton.interpret(@type_expr, loader).normalize
|
3246
3303
|
end
|
3247
3304
|
|
3248
3305
|
# Find out if this type is recursive. A recursive type has performance implications
|
@@ -3267,7 +3324,7 @@ class PTypeAliasType < PAnyType
|
|
3267
3324
|
else
|
3268
3325
|
# An alias may appoint an Object type that isn't resolved yet. The default type
|
3269
3326
|
# reference is used to prevent endless recursion and should not be resolved here.
|
3270
|
-
@resolved_type.resolve(
|
3327
|
+
@resolved_type.resolve(loader) unless @resolved_type.equal?(PTypeReferenceType::DEFAULT)
|
3271
3328
|
end
|
3272
3329
|
self
|
3273
3330
|
end
|
@@ -3330,8 +3387,8 @@ class PTypeAliasType < PAnyType
|
|
3330
3387
|
resolved_type.assignable?(o, guard)
|
3331
3388
|
end
|
3332
3389
|
|
3333
|
-
def new_function
|
3334
|
-
resolved_type.new_function
|
3390
|
+
def new_function
|
3391
|
+
resolved_type.new_function
|
3335
3392
|
end
|
3336
3393
|
|
3337
3394
|
private
|
@@ -3390,5 +3447,7 @@ require_relative 'p_type_set_type'
|
|
3390
3447
|
require_relative 'p_timespan_type'
|
3391
3448
|
require_relative 'p_timestamp_type'
|
3392
3449
|
require_relative 'p_binary_type'
|
3450
|
+
require_relative 'p_init_type'
|
3393
3451
|
require_relative 'type_set_reference'
|
3394
3452
|
require_relative 'implementation_registry'
|
3453
|
+
require_relative 'tree_iterators'
|