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
data/lib/puppet/module.rb
CHANGED
@@ -95,6 +95,17 @@ class Puppet::Module
|
|
95
95
|
load_metadata
|
96
96
|
|
97
97
|
@absolute_path_to_manifests = Puppet::FileSystem::PathPattern.absolute(manifests)
|
98
|
+
|
99
|
+
# i18n initialization for modules
|
100
|
+
if Puppet::GETTEXT_AVAILABLE
|
101
|
+
begin
|
102
|
+
initialize_i18n
|
103
|
+
rescue Exception => e
|
104
|
+
Puppet.warning _("GettextSetup initialization for %{module_name} failed with: %{error_message}") % { module_name: name, error_message: e.message }
|
105
|
+
end
|
106
|
+
else
|
107
|
+
Puppet.warning _("GettextSetup is not available, skipping GettextSetup initialization for %{module_name}.") % { module_name: name }
|
108
|
+
end
|
98
109
|
end
|
99
110
|
|
100
111
|
# @deprecated The puppetversion module metadata field is no longer used.
|
@@ -385,8 +396,27 @@ class Puppet::Module
|
|
385
396
|
@strict_semver
|
386
397
|
end
|
387
398
|
|
399
|
+
def initialize_i18n
|
400
|
+
module_name = @forge_name.gsub("/","-") if @forge_name
|
401
|
+
return if module_name.nil? || i18n_initialized?(module_name)
|
402
|
+
|
403
|
+
locales_path = File.absolute_path('locales', path)
|
404
|
+
|
405
|
+
begin
|
406
|
+
GettextSetup.initialize(locales_path)
|
407
|
+
Puppet.debug "#{module_name} initialized for i18n: #{GettextSetup.translation_repositories[module_name]}"
|
408
|
+
rescue
|
409
|
+
config_path = File.absolute_path('config.yaml', locales_path)
|
410
|
+
Puppet.debug "Could not find locales configuration file for #{module_name} at #{config_path}. Skipping i18n initialization."
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
388
414
|
private
|
389
415
|
|
416
|
+
def i18n_initialized?(module_name)
|
417
|
+
GettextSetup.translation_repositories.has_key? module_name
|
418
|
+
end
|
419
|
+
|
390
420
|
def wanted_manifests_from(pattern)
|
391
421
|
begin
|
392
422
|
extended = File.extname(pattern).empty? ? "#{pattern}.pp" : pattern
|
@@ -475,6 +475,16 @@ $ts = Timestamp('2016-08-24T12:13:14', default, 'PST') # 2016-08-24 20:13:14.0
|
|
475
475
|
|
476
476
|
```
|
477
477
|
|
478
|
+
Conversion to Type
|
479
|
+
------------------
|
480
|
+
A new `Type` can be create from its `String` representation.
|
481
|
+
|
482
|
+
**Example:** Creating a type from a string
|
483
|
+
|
484
|
+
```puppet
|
485
|
+
$t = Type.new('Integer[10]')
|
486
|
+
```
|
487
|
+
|
478
488
|
Conversion to String
|
479
489
|
--------------------
|
480
490
|
|
@@ -772,6 +782,32 @@ Accepts a single value as argument:
|
|
772
782
|
* An `Iterable` is turned into an `Array` and then converted to hash as per the array rules
|
773
783
|
* A `Hash` is simply returned
|
774
784
|
|
785
|
+
Alternatively, a tree can be constructed by giving two values; an array of tuples on the form `[path, value]`
|
786
|
+
(where the `path` is the path from the root of a tree, and `value` the value at that position in the tree), and
|
787
|
+
either the option `'tree'` (do not convert arrays to hashes except the top level), or
|
788
|
+
`'hash_tree'` (convert all arrays to hashes).
|
789
|
+
|
790
|
+
The tree/hash_tree forms of Hash creation are suited for transforming the result of an iteration
|
791
|
+
using `tree_each` and subsequent filtering or mapping.
|
792
|
+
|
793
|
+
**Example:** Mapping a hash tree
|
794
|
+
|
795
|
+
Mapping an arbitrary structure in a way that keeps the structure, but where some values are replaced
|
796
|
+
can be done by using the `tree_each` function, mapping, and then constructing a new Hash from the result:
|
797
|
+
|
798
|
+
```puppet
|
799
|
+
# A hash tree with 'water' at different locations
|
800
|
+
$h = { a => { b => { x => 'water'}}, b => { y => 'water'} }
|
801
|
+
# a helper function that turns water into wine
|
802
|
+
function make_wine($x) { if $x == 'water' { 'wine' } else { $x } }
|
803
|
+
# create a flattened tree with water turned into wine
|
804
|
+
$flat_tree = $h.tree_each.map |$entry| { [$entry[0], make_wine($entry[1])] }
|
805
|
+
# create a new Hash and log it
|
806
|
+
notice Hash($flat_tree, 'hash_tree')
|
807
|
+
```
|
808
|
+
|
809
|
+
Would notice the hash `{a => {b => {x => wine}}, b => {y => wine}}`
|
810
|
+
|
775
811
|
Conversion to a `Struct` works exactly as conversion to a `Hash`, only that the constructed hash is
|
776
812
|
asserted against the given struct type.
|
777
813
|
|
@@ -932,6 +968,37 @@ $b = binary_file('mymodule/mypicture.jpg')
|
|
932
968
|
* Since 4.5.0
|
933
969
|
* Binary type since 4.8.0
|
934
970
|
|
971
|
+
Creating an instance of a `Type` using the `Init` type.
|
972
|
+
-------
|
973
|
+
|
974
|
+
The type `Init[T]` describes a value that can be used when instantiating a type. When used as the first argument in a call to `new`, it
|
975
|
+
will dispatch the call to its contained type and optionally augment the parameter list with additional arguments.
|
976
|
+
|
977
|
+
**Example:** Creating an instance of Integer using Init[Integer]
|
978
|
+
|
979
|
+
```puppet
|
980
|
+
# The following declaration
|
981
|
+
$x = Init[Integer].new('128')
|
982
|
+
# is exactly the same as
|
983
|
+
$x = Integer.new('128')
|
984
|
+
```
|
985
|
+
|
986
|
+
or, with base 16 and using implicit new
|
987
|
+
|
988
|
+
```puppet
|
989
|
+
# The following declaration
|
990
|
+
$x = Init[Integer,16]('80')
|
991
|
+
# is exactly the same as
|
992
|
+
$x = Integer('80', 16)
|
993
|
+
```
|
994
|
+
|
995
|
+
**Example:** Creating an instance of String using a predefined format
|
996
|
+
|
997
|
+
```puppet
|
998
|
+
$fmt = Init[String,'%#x']
|
999
|
+
notice($fmt(256)) # will notice '0x100'
|
1000
|
+
```
|
1001
|
+
|
935
1002
|
DOC
|
936
1003
|
) do |args|
|
937
1004
|
Puppet::Parser::Functions::Error.is4x('new')
|
@@ -99,6 +99,37 @@ $combine = $data.reduce( [d, 4] ) |$memo, $value| {
|
|
99
99
|
# $combine contains [dabc, 10]
|
100
100
|
~~~
|
101
101
|
|
102
|
+
**Example**: Using the `reduce` function to reduce a hash of hashes
|
103
|
+
|
104
|
+
~~~ puppet
|
105
|
+
# Reduce a hash of hashes $data, merging defaults into the inner hashes.
|
106
|
+
$data = {
|
107
|
+
'connection1' => {
|
108
|
+
'username' => 'user1',
|
109
|
+
'password' => 'pass1',
|
110
|
+
},
|
111
|
+
'connection_name2' => {
|
112
|
+
'username' => 'user2',
|
113
|
+
'password' => 'pass2',
|
114
|
+
},
|
115
|
+
}
|
116
|
+
|
117
|
+
$defaults = {
|
118
|
+
'maxActive' => '20',
|
119
|
+
'maxWait' => '10000',
|
120
|
+
'username' => 'defaultuser',
|
121
|
+
'password' => 'defaultpass',
|
122
|
+
}
|
123
|
+
|
124
|
+
$merged = $data.reduce( {} ) |$memo, $x| {
|
125
|
+
$memo + { $x[0] => $defaults + $data[$x[0]] }
|
126
|
+
}
|
127
|
+
# At the start of the lambda's first iteration, $memo is set to {}, and $x is set to
|
128
|
+
# the first [key, value] tuple. The key in $data is, therefore, given by $x[0]. In
|
129
|
+
# subsequent rounds, $memo retains the value returned by the expression, i.e.
|
130
|
+
# $memo + { $x[0] => $defaults + $data[$x[0]] }.
|
131
|
+
~~~
|
132
|
+
|
102
133
|
- Since 4.0.0
|
103
134
|
DOC
|
104
135
|
) do |args|
|
@@ -67,14 +67,14 @@ class Puppet::Parser::Relationship
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
# Turns a PResourceType or
|
70
|
+
# Turns a PResourceType or PClassType into an array [type, title] and all other references to [ref, nil]
|
71
71
|
# This is needed since it is not possible to find resources in the catalog based on the type system types :-(
|
72
72
|
# (note, the catalog is also used on the agent side)
|
73
73
|
def canonical_ref(ref)
|
74
74
|
case ref
|
75
75
|
when Puppet::Pops::Types::PResourceType
|
76
76
|
[ref.type_name, ref.title]
|
77
|
-
when Puppet::Pops::Types::
|
77
|
+
when Puppet::Pops::Types::PClassType
|
78
78
|
['class', ref.class_name]
|
79
79
|
else
|
80
80
|
[ref.to_s, nil]
|
@@ -167,6 +167,18 @@ class Puppet::Parser::Resource < Puppet::Resource
|
|
167
167
|
unless self.source.object_id == resource.source.object_id || resource.source.child_of?(self.source)
|
168
168
|
raise Puppet::ParseError.new(_("Only subclasses can override parameters"), resource.file, resource.line)
|
169
169
|
end
|
170
|
+
|
171
|
+
if evaluated?
|
172
|
+
strict = Puppet[:strict]
|
173
|
+
unless strict == :off
|
174
|
+
msg = _('Attempt to override an already evaluated resource%{location} with new values') %
|
175
|
+
{ resource: ref, location: append_location(file, line, _(', defined'), ',') }
|
176
|
+
raise Puppet::ParseError.new(msg, resource.file, resource.line) if strict == :error
|
177
|
+
msg << append_location(resource.file, resource.line)
|
178
|
+
Puppet.warning(msg)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
170
182
|
# Some of these might fail, but they'll fail in the way we want.
|
171
183
|
resource.parameters.each do |name, param|
|
172
184
|
override_parameter(param)
|
@@ -258,7 +270,7 @@ class Puppet::Parser::Resource < Puppet::Resource
|
|
258
270
|
t = Puppet::Pops::Evaluator::Runtime3ResourceSupport.find_resource_type(scope, t) unless t == 'class' || t == 'node'
|
259
271
|
cap = catalog.resource(t, ref.title)
|
260
272
|
if cap.nil?
|
261
|
-
raise _("Resource %{ref} could not be found; it might not have been produced yet") % { ref: ref }
|
273
|
+
raise Puppet::Error, _("Resource %{ref} could not be found; it might not have been produced yet") % { ref: ref }
|
262
274
|
end
|
263
275
|
|
264
276
|
# Ensure that the found resource is a capability resource
|
@@ -310,6 +322,28 @@ class Puppet::Parser::Resource < Puppet::Resource
|
|
310
322
|
|
311
323
|
private
|
312
324
|
|
325
|
+
# Append location to the message if location is present. If it is not, an empty string
|
326
|
+
# is returned instead.
|
327
|
+
#
|
328
|
+
# @param file [String] path to the file
|
329
|
+
# @param line [Integer] the line in the file
|
330
|
+
# @param prefix [String] string prefix
|
331
|
+
# @param suffix [String] string suffix
|
332
|
+
# @return [String] the formatted location or an empty string
|
333
|
+
def append_location(file, line, prefix = '', suffix = '')
|
334
|
+
if file && file != ''
|
335
|
+
if line
|
336
|
+
_('%{prefix} at %{file}:%{line}%{suffix}') % { prefix: prefix, suffix: suffix, file: file, line: line }
|
337
|
+
else
|
338
|
+
_('%{prefix} in %{file}%{suffix}') % { prefix: prefix, suffix: suffix, file: file }
|
339
|
+
end
|
340
|
+
elsif line
|
341
|
+
_('%{prefix} at line %{line}%{suffix}') % { prefix: prefix, suffix: suffix, line: line }
|
342
|
+
else
|
343
|
+
''
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
313
347
|
def add_scope_tags
|
314
348
|
scope_resource = scope.resource
|
315
349
|
unless scope_resource.nil? || scope_resource.equal?(self)
|
@@ -337,15 +371,10 @@ class Puppet::Parser::Resource < Puppet::Resource
|
|
337
371
|
|
338
372
|
# The parameter is already set. Fail if they're not allowed to override it.
|
339
373
|
unless param.source.child_of?(current.source) || param.source.equal?(current.source) && scope.is_default?(type, param.name, current.value)
|
340
|
-
msg = "Parameter '
|
341
|
-
msg
|
342
|
-
|
343
|
-
|
344
|
-
fields << current.file if current.file
|
345
|
-
fields << current.line.to_s if current.line
|
346
|
-
msg += " at #{fields.join(":")}"
|
347
|
-
end
|
348
|
-
msg += "; cannot redefine"
|
374
|
+
msg = _("Parameter '%{name}' is already set on %{resource}") % { name: param.name, resource: ref }
|
375
|
+
msg << _(' by %{source}') % { source: current.source.to_s } unless current.source.to_s == ''
|
376
|
+
msg << append_location(current.file, current.line)
|
377
|
+
msg << _('; cannot redefine')
|
349
378
|
raise Puppet::ParseError.new(msg, param.file, param.line)
|
350
379
|
end
|
351
380
|
|
data/lib/puppet/parser/scope.rb
CHANGED
@@ -1043,7 +1043,7 @@ class Puppet::Parser::Scope
|
|
1043
1043
|
assert_class_and_title(name.type, name.title)
|
1044
1044
|
name.title.sub(/^([^:]{1,2})/, '::\1')
|
1045
1045
|
|
1046
|
-
when Puppet::Pops::Types::
|
1046
|
+
when Puppet::Pops::Types::PClassType
|
1047
1047
|
#TRANSLATORS "Class" and "Type" are Puppet keywords and should not be translated
|
1048
1048
|
raise ArgumentError, _("Cannot use an unspecific Class[] Type") unless name.class_name
|
1049
1049
|
name.class_name.sub(/^([^:]{1,2})/, '::\1')
|
@@ -347,18 +347,25 @@ class AccessOperator
|
|
347
347
|
end
|
348
348
|
end
|
349
349
|
|
350
|
-
def
|
350
|
+
def access_PTypeType(o, scope, keys)
|
351
351
|
keys.flatten!
|
352
352
|
if keys.size == 1
|
353
353
|
unless keys[0].is_a?(Types::PAnyType)
|
354
354
|
fail(Issues::BAD_TYPE_SLICE_TYPE, @semantic.keys[0], {:base_type => 'Type-Type', :actual => keys[0].class})
|
355
355
|
end
|
356
|
-
Types::
|
356
|
+
Types::PTypeType.new(keys[0])
|
357
357
|
else
|
358
358
|
fail(Issues::BAD_TYPE_SLICE_ARITY, @semantic, {:base_type => 'Type-Type', :min => 1, :actual => keys.size})
|
359
359
|
end
|
360
360
|
end
|
361
361
|
|
362
|
+
def access_PInitType(o, scope, keys)
|
363
|
+
unless keys[0].is_a?(Types::PAnyType)
|
364
|
+
fail(Issues::BAD_TYPE_SLICE_TYPE, @semantic.keys[0], {:base_type => 'Init-Type', :actual => keys[0].class})
|
365
|
+
end
|
366
|
+
Types::TypeFactory.init(*keys)
|
367
|
+
end
|
368
|
+
|
362
369
|
def access_PIterableType(o, scope, keys)
|
363
370
|
keys.flatten!
|
364
371
|
if keys.size == 1
|
@@ -618,7 +625,7 @@ class AccessOperator
|
|
618
625
|
|
619
626
|
NS = '::'.freeze
|
620
627
|
|
621
|
-
def
|
628
|
+
def access_PClassType(o, scope, keys)
|
622
629
|
blamed = keys.size == 0 ? @semantic : @semantic.keys[0]
|
623
630
|
keys_orig_size = keys.size
|
624
631
|
|
@@ -651,7 +658,7 @@ class AccessOperator
|
|
651
658
|
name = name[2..-1] if name[0,2] == NS
|
652
659
|
|
653
660
|
fail(Issues::ILLEGAL_NAME, @semantic.keys[i], {:name=>c}) unless name =~ Patterns::NAME
|
654
|
-
Types::
|
661
|
+
Types::PClassType.new(name)
|
655
662
|
end
|
656
663
|
else
|
657
664
|
# lookup class resource and return one or more parameter values
|
@@ -231,7 +231,7 @@ class EvaluatorImpl
|
|
231
231
|
values.fetch(lval) {|k| fail(Issues::MISSING_MULTI_ASSIGNMENT_KEY, o, :key =>k)},
|
232
232
|
o, scope)
|
233
233
|
end
|
234
|
-
elsif values.is_a?(Puppet::Pops::Types::
|
234
|
+
elsif values.is_a?(Puppet::Pops::Types::PClassType)
|
235
235
|
# assign variables from class variables
|
236
236
|
# lookup class resource and return one or more parameter values
|
237
237
|
# TODO: behavior when class_name is nil
|
@@ -305,7 +305,7 @@ class EvaluatorImpl
|
|
305
305
|
nil
|
306
306
|
end
|
307
307
|
|
308
|
-
# A QualifiedReference (i.e. a capitalized qualified name such as Foo, or Foo::Bar) evaluates to a
|
308
|
+
# A QualifiedReference (i.e. a capitalized qualified name such as Foo, or Foo::Bar) evaluates to a PTypeType
|
309
309
|
#
|
310
310
|
def eval_QualifiedReference(o, scope)
|
311
311
|
type = Types::TypeParser.singleton.interpret(o)
|
@@ -479,7 +479,7 @@ class EvaluatorImpl
|
|
479
479
|
def eval_AccessExpression(o, scope)
|
480
480
|
left = evaluate(o.left_expr, scope)
|
481
481
|
keys = o.keys || []
|
482
|
-
if left.is_a?(Types::
|
482
|
+
if left.is_a?(Types::PClassType)
|
483
483
|
# Evaluate qualified references without errors no undefined types
|
484
484
|
keys = keys.map {|key| key.is_a?(Model::QualifiedReference) ? Types::TypeParser.singleton.interpret(key) : evaluate(key, scope) }
|
485
485
|
else
|
@@ -755,7 +755,7 @@ class EvaluatorImpl
|
|
755
755
|
|
756
756
|
# must be a CatalogEntry subtype
|
757
757
|
case evaluated_name
|
758
|
-
when Types::
|
758
|
+
when Types::PClassType
|
759
759
|
unless evaluated_name.class_name.nil?
|
760
760
|
fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=> evaluated_name.to_s})
|
761
761
|
end
|
@@ -91,7 +91,7 @@ class RelationshipOperator
|
|
91
91
|
end
|
92
92
|
|
93
93
|
# Asserts (and returns) the type if it is a PCatalogEntryType
|
94
|
-
# (A PCatalogEntryType is the base class of
|
94
|
+
# (A PCatalogEntryType is the base class of PClassType, and PResourceType).
|
95
95
|
#
|
96
96
|
def assert_catalog_type(o, scope)
|
97
97
|
unless @type_calculator.assignable?(@catalog_type, o)
|
@@ -127,9 +127,9 @@ class Runtime3Converter
|
|
127
127
|
# Ensures that resources are *not* absolute.
|
128
128
|
#
|
129
129
|
def catalog_type_to_split_type_title(catalog_type)
|
130
|
-
split_type = catalog_type.is_a?(Puppet::Pops::Types::
|
130
|
+
split_type = catalog_type.is_a?(Puppet::Pops::Types::PTypeType) ? catalog_type.type : catalog_type
|
131
131
|
case split_type
|
132
|
-
when Puppet::Pops::Types::
|
132
|
+
when Puppet::Pops::Types::PClassType
|
133
133
|
class_name = split_type.class_name
|
134
134
|
['class', class_name.nil? ? nil : class_name.sub(/^::/, '')]
|
135
135
|
when Puppet::Pops::Types::PResourceType
|
@@ -143,7 +143,7 @@ class Runtime3Converter
|
|
143
143
|
[type_name.nil? ? nil : type_name.sub(/^::/, '').downcase, title.nil? ? '' : title]
|
144
144
|
end
|
145
145
|
else
|
146
|
-
raise ArgumentError, "Cannot split the type #{catalog_type.class}, it represents neither a
|
146
|
+
raise ArgumentError, "Cannot split the type #{catalog_type.class}, it represents neither a PClassType, nor a PResourceType."
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
@@ -60,7 +60,7 @@ module Runtime3ResourceSupport
|
|
60
60
|
# Classes are evaluated immediately
|
61
61
|
scope.compiler.evaluate_classes([resource_title], scope, false) if resolved_type == CLASS_STRING
|
62
62
|
|
63
|
-
# Turn the resource into a
|
63
|
+
# Turn the resource into a PTypeType (a reference to a resource type)
|
64
64
|
# weed out nil's
|
65
65
|
resource_to_ptype(resource)
|
66
66
|
end
|
@@ -179,7 +179,7 @@ module ModuleLoaders
|
|
179
179
|
if tse && (ts = tse.value).is_a?(Types::PTypeSetType)
|
180
180
|
# The TypeSet might be unresolved at this point. If so, it must be resolved using
|
181
181
|
# this loader. That in turn, adds all contained types to this loader.
|
182
|
-
ts.resolve(
|
182
|
+
ts.resolve(self)
|
183
183
|
te = get_entry(typed_name)
|
184
184
|
return te unless te.nil?
|
185
185
|
end
|
@@ -141,8 +141,7 @@ class StaticLoader < Loader
|
|
141
141
|
|
142
142
|
def register_aliases
|
143
143
|
aliases = BUILTIN_ALIASES.map { |name, string| add_type(name, Types::PTypeAliasType.new(name, Types::TypeFactory.type_reference(string), nil)) }
|
144
|
-
|
145
|
-
aliases.each { |type| type.resolve(parser, self) }
|
144
|
+
aliases.each { |type| type.resolve(self) }
|
146
145
|
end
|
147
146
|
end
|
148
147
|
end
|
data/lib/puppet/pops/loaders.rb
CHANGED
@@ -110,8 +110,7 @@ class Loaders
|
|
110
110
|
type
|
111
111
|
end
|
112
112
|
# Resolve lazy so that all types can cross reference each other
|
113
|
-
|
114
|
-
types.each { |type| type.resolve(parser, loader) }
|
113
|
+
types.each { |type| type.resolve(loader) }
|
115
114
|
end
|
116
115
|
|
117
116
|
# Register the given type with the Runtime3TypeLoader. The registration will not happen unless
|
@@ -157,7 +157,7 @@ class Context
|
|
157
157
|
tf.callable([0, 0], tf.iterable(tf.tuple([key_type, tf.any])))),
|
158
158
|
'cached_file_data' => tf.callable(tf.string, tf.optional(tf.callable([1, 1])))
|
159
159
|
}
|
160
|
-
).resolve(
|
160
|
+
).resolve(loader)
|
161
161
|
end
|
162
162
|
|
163
163
|
# Mainly for test purposes. Makes it possible to create a {Context} in Puppet code provided that a current {Invocation} exists.
|