puppet 4.0.0 → 4.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/ext/build_defaults.yaml +8 -35
- data/ext/debian/puppet.default +0 -5
- data/ext/debian/puppet.init +1 -15
- data/lib/hiera/puppet_function.rb +15 -4
- data/lib/puppet/application/agent.rb +5 -0
- data/lib/puppet/application/apply.rb +23 -2
- data/lib/puppet/application/device.rb +8 -3
- data/lib/puppet/application/master.rb +16 -5
- data/lib/puppet/configurer.rb +7 -5
- data/lib/puppet/defaults.rb +18 -0
- data/lib/puppet/environments.rb +1 -1
- data/lib/puppet/error.rb +27 -1
- data/lib/puppet/file_serving/metadata.rb +13 -8
- data/lib/puppet/file_serving/terminus_helper.rb +7 -8
- data/lib/puppet/file_system.rb +13 -0
- data/lib/puppet/file_system/file_impl.rb +4 -0
- data/lib/puppet/file_system/memory_impl.rb +4 -0
- data/lib/puppet/file_system/windows.rb +8 -0
- data/lib/puppet/functions.rb +33 -3
- data/lib/puppet/functions/defined.rb +130 -0
- data/lib/puppet/functions/regsubst.rb +1 -1
- data/lib/puppet/functions/split.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +11 -0
- data/lib/puppet/loaders.rb +1 -0
- data/lib/puppet/node.rb +17 -1
- data/lib/puppet/node/environment.rb +4 -0
- data/lib/puppet/parser/ast/pops_bridge.rb +4 -0
- data/lib/puppet/parser/compiler.rb +9 -0
- data/lib/puppet/parser/functions/defined.rb +25 -1
- data/lib/puppet/parser/functions/file.rb +3 -1
- data/lib/puppet/parser/scope.rb +11 -2
- data/lib/puppet/parser/templatewrapper.rb +2 -1
- data/lib/puppet/pops.rb +4 -0
- data/lib/puppet/pops/evaluator/access_operator.rb +25 -5
- data/lib/puppet/pops/evaluator/closure.rb +28 -2
- data/lib/puppet/pops/evaluator/collector_transformer.rb +1 -11
- data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +4 -0
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +4 -0
- data/lib/puppet/pops/evaluator/compare_operator.rb +43 -0
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +7 -2
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +48 -14
- data/lib/puppet/pops/evaluator/runtime3_support.rb +10 -5
- data/lib/puppet/pops/functions/dispatch.rb +6 -1
- data/lib/puppet/pops/functions/dispatcher.rb +7 -1
- data/lib/puppet/pops/issue_reporter.rb +42 -16
- data/lib/puppet/pops/issues.rb +116 -2
- data/lib/puppet/pops/loader/loader.rb +11 -0
- data/lib/puppet/pops/loader/loader_paths.rb +67 -6
- data/lib/puppet/pops/loader/module_loaders.rb +19 -8
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +78 -0
- data/lib/puppet/pops/loaders.rb +6 -4
- data/lib/puppet/pops/migration/migration_checker.rb +54 -0
- data/lib/puppet/pops/model/factory.rb +5 -1
- data/lib/puppet/pops/model/model_label_provider.rb +2 -0
- data/lib/puppet/pops/model/model_meta.rb +5 -1
- data/lib/puppet/pops/parser/egrammar.ra +9 -10
- data/lib/puppet/pops/parser/eparser.rb +1061 -1047
- data/lib/puppet/pops/parser/epp_support.rb +18 -9
- data/lib/puppet/pops/parser/evaluating_parser.rb +7 -1
- data/lib/puppet/pops/parser/heredoc_support.rb +12 -11
- data/lib/puppet/pops/parser/interpolation_support.rb +7 -1
- data/lib/puppet/pops/parser/lexer2.rb +29 -12
- data/lib/puppet/pops/parser/lexer_support.rb +52 -23
- data/lib/puppet/pops/parser/parser_support.rb +11 -14
- data/lib/puppet/pops/parser/slurp_support.rb +22 -6
- data/lib/puppet/pops/types/type_calculator.rb +156 -55
- data/lib/puppet/pops/types/type_factory.rb +66 -13
- data/lib/puppet/pops/types/type_parser.rb +22 -13
- data/lib/puppet/pops/types/types.rb +23 -4
- data/lib/puppet/pops/types/types_meta.rb +13 -2
- data/lib/puppet/pops/validation.rb +25 -2
- data/lib/puppet/pops/validation/checker4_0.rb +63 -31
- data/lib/puppet/provider/group/windows_adsi.rb +8 -4
- data/lib/puppet/provider/mount/parsed.rb +145 -2
- data/lib/puppet/provider/package/apt.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +11 -2
- data/lib/puppet/provider/package/pkgng.rb +134 -0
- data/lib/puppet/provider/package/portage.rb +1 -1
- data/lib/puppet/provider/package/ports.rb +0 -3
- data/lib/puppet/provider/package/windows/exe_package.rb +0 -1
- data/lib/puppet/provider/package/windows/msi_package.rb +0 -1
- data/lib/puppet/provider/package/zypper.rb +50 -15
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +32 -7
- data/lib/puppet/provider/service/debian.rb +1 -1
- data/lib/puppet/provider/service/init.rb +7 -0
- data/lib/puppet/provider/user/openbsd.rb +1 -0
- data/lib/puppet/provider/user/windows_adsi.rb +45 -2
- data/lib/puppet/reference/indirection.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/catalog.rb +0 -4
- data/lib/puppet/settings.rb +19 -0
- data/lib/puppet/type/file.rb +1 -0
- data/lib/puppet/type/file/ensure.rb +1 -1
- data/lib/puppet/type/mount.rb +9 -1
- data/lib/puppet/type/scheduled_task.rb +13 -0
- data/lib/puppet/type/tidy.rb +3 -1
- data/lib/puppet/type/user.rb +32 -0
- data/lib/puppet/type/yumrepo.rb +5 -5
- data/lib/puppet/util/log.rb +50 -8
- data/lib/puppet/util/log/destinations.rb +23 -2
- data/lib/puppet/util/logging.rb +37 -1
- data/lib/puppet/util/run_mode.rb +1 -14
- data/lib/puppet/util/windows/adsi.rb +130 -58
- data/lib/puppet/version.rb +1 -1
- data/man/man5/puppet.conf.5 +48 -6
- data/man/man8/extlookup2hiera.8 +1 -1
- data/man/man8/puppet-agent.8 +4 -1
- data/man/man8/puppet-apply.8 +4 -1
- data/man/man8/puppet-ca.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-cert.8 +1 -1
- data/man/man8/puppet-certificate.8 +1 -1
- data/man/man8/puppet-certificate_request.8 +1 -1
- data/man/man8/puppet-certificate_revocation_list.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +6 -3
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-file.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-inspect.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-master.8 +4 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-resource_type.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +1 -1
- data/spec/fixtures/unit/data_providers/environments/production/lib/puppet/functions/environment/data.rb +3 -1
- data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/functions/data.pp +6 -0
- data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/lib/puppet/bindings/xyz/default.rb +9 -0
- data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/manifests/init.pp +9 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcalled.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller4.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/lib/puppet/functions/user/callingpuppet.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/functions/hello.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/manifests/init.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/metadata.json +10 -0
- data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/hello.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/subspace/hello.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/metadata.json +1 -10
- data/spec/fixtures/unit/provider/mount/parsed/aix.filesystems +93 -85
- data/spec/fixtures/unit/provider/mount/parsed/aix.mount +11 -7
- data/spec/fixtures/unit/provider/package/pkgng/pkg.info +8 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.query +1 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.query_absent +1 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +3 -0
- data/spec/fixtures/unit/provider/package/zypper/zypper-list-updates-empty.out +3 -0
- data/spec/integration/application/apply_spec.rb +49 -0
- data/spec/integration/faces/plugin_spec.rb +0 -4
- data/spec/integration/indirector/facts/facter_spec.rb +59 -0
- data/spec/integration/parser/compiler_spec.rb +850 -0
- data/spec/integration/parser/resource_expressions_spec.rb +3 -0
- data/spec/integration/parser/scope_spec.rb +26 -5
- data/spec/integration/transaction_spec.rb +1 -1
- data/spec/integration/type/file_spec.rb +318 -41
- data/spec/integration/util/windows/security_spec.rb +14 -5
- data/spec/lib/matchers/resource.rb +22 -1
- data/spec/lib/puppet_spec/matchers.rb +6 -4
- data/spec/unit/application/master_spec.rb +33 -7
- data/spec/unit/data_providers/function_data_provider_spec.rb +10 -1
- data/spec/unit/file_serving/metadata_spec.rb +1 -1
- data/spec/unit/file_serving/terminus_helper_spec.rb +2 -3
- data/spec/unit/file_system_spec.rb +38 -0
- data/spec/unit/functions/defined_spec.rb +289 -0
- data/spec/unit/functions/hiera_spec.rb +8 -6
- data/spec/unit/functions/regsubst_spec.rb +4 -0
- data/spec/unit/functions/split_spec.rb +8 -0
- data/spec/unit/functions4_spec.rb +97 -2
- data/spec/unit/indirector/facts/facter_spec.rb +7 -0
- data/spec/unit/node_spec.rb +6 -0
- data/spec/unit/parser/functions/file_spec.rb +7 -1
- data/spec/unit/parser/functions/template_spec.rb +1 -1
- data/spec/unit/parser/scope_spec.rb +2 -2
- data/spec/unit/parser/templatewrapper_spec.rb +1 -1
- data/spec/unit/pops/evaluator/access_ops_spec.rb +19 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +84 -18
- data/spec/unit/pops/evaluator/variables_spec.rb +1 -1
- data/spec/unit/pops/issues_spec.rb +16 -16
- data/spec/unit/pops/loaders/loaders_spec.rb +106 -48
- data/spec/unit/pops/migration_spec.rb +53 -0
- data/spec/unit/pops/parser/lexer2_spec.rb +142 -1
- data/spec/unit/pops/parser/parse_heredoc_spec.rb +26 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +205 -12
- data/spec/unit/pops/validation_spec.rb +66 -0
- data/spec/unit/pops/validator/validator_spec.rb +1 -1
- data/spec/unit/provider/group/windows_adsi_spec.rb +57 -9
- data/spec/unit/provider/mount/parsed_spec.rb +31 -5
- data/spec/unit/provider/package/apt_spec.rb +5 -0
- data/spec/unit/provider/package/pip_spec.rb +9 -0
- data/spec/unit/provider/package/pkgng_spec.rb +172 -0
- data/spec/unit/provider/package/windows/exe_package_spec.rb +0 -1
- data/spec/unit/provider/package/windows/msi_package_spec.rb +0 -1
- data/spec/unit/provider/package/zypper_spec.rb +50 -19
- data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +312 -70
- data/spec/unit/provider/service/base_spec.rb +38 -27
- data/spec/unit/provider/service/debian_spec.rb +8 -0
- data/spec/unit/provider/service/freebsd_spec.rb +1 -0
- data/spec/unit/provider/service/gentoo_spec.rb +1 -0
- data/spec/unit/provider/service/init_spec.rb +18 -0
- data/spec/unit/provider/service/openbsd_spec.rb +1 -0
- data/spec/unit/provider/service/redhat_spec.rb +1 -0
- data/spec/unit/provider/user/windows_adsi_spec.rb +134 -5
- data/spec/unit/settings_spec.rb +11 -0
- data/spec/unit/util/log_spec.rb +113 -0
- data/spec/unit/util/windows/adsi_spec.rb +135 -41
- data/spec/unit/util/windows/sid_spec.rb +0 -10
- metadata +48 -2
@@ -60,6 +60,8 @@ module Puppet::Pops::Evaluator::Runtime3Support
|
|
60
60
|
if scope.bound?(name)
|
61
61
|
if Puppet::Parser::Scope::RESERVED_VARIABLE_NAMES.include?(name)
|
62
62
|
fail(Puppet::Pops::Issues::ILLEGAL_RESERVED_ASSIGNMENT, o, {:name => name} )
|
63
|
+
elsif name == "server_facts" && Puppet[:trusted_server_facts]
|
64
|
+
fail(Puppet::Pops::Issues::ILLEGAL_RESERVED_ASSIGNMENT, o, {:name => name} )
|
63
65
|
else
|
64
66
|
fail(Puppet::Pops::Issues::ILLEGAL_REASSIGNMENT, o, {:name => name} )
|
65
67
|
end
|
@@ -316,7 +318,7 @@ module Puppet::Pops::Evaluator::Runtime3Support
|
|
316
318
|
# for the type of the name.
|
317
319
|
# Note, locations are available per parameter.
|
318
320
|
#
|
319
|
-
scope.define_settings(capitalize_qualified_name(type_name), evaluated_parameters)
|
321
|
+
scope.define_settings(capitalize_qualified_name(type_name), evaluated_parameters.flatten)
|
320
322
|
end
|
321
323
|
|
322
324
|
# Capitalizes each segment of a qualified name
|
@@ -335,7 +337,8 @@ module Puppet::Pops::Evaluator::Runtime3Support
|
|
335
337
|
# TODO: Revisit and possible improve the accuracy.
|
336
338
|
#
|
337
339
|
file, line = extract_file_line(o)
|
338
|
-
|
340
|
+
# A *=> results in an array of arrays
|
341
|
+
evaluated_parameters = evaluated_parameters.flatten
|
339
342
|
evaluated_resources.each do |r|
|
340
343
|
unless r.is_a?(Puppet::Pops::Types::PResourceType) && r.type_name != 'class'
|
341
344
|
fail(Puppet::Pops::Issues::ILLEGAL_OVERRIDEN_TYPE, o, {:actual => r} )
|
@@ -409,15 +412,17 @@ module Puppet::Pops::Evaluator::Runtime3Support
|
|
409
412
|
|
410
413
|
# This is the same type of "truth" as used in the current Puppet DSL.
|
411
414
|
#
|
412
|
-
def is_true? o
|
415
|
+
def is_true?(value, o)
|
413
416
|
# Is the value true? This allows us to control the definition of truth
|
414
417
|
# in one place.
|
415
|
-
case
|
418
|
+
case value
|
416
419
|
# Support :undef since it may come from a 3x structure
|
417
420
|
when :undef
|
418
421
|
false
|
422
|
+
when String
|
423
|
+
true
|
419
424
|
else
|
420
|
-
!!
|
425
|
+
!!value
|
421
426
|
end
|
422
427
|
end
|
423
428
|
|
@@ -71,7 +71,12 @@ class Puppet::Pops::Functions::Dispatch < Puppet::Pops::Evaluator::CallableSigna
|
|
71
71
|
else
|
72
72
|
# Careful so no new nil arguments are added since they would override default
|
73
73
|
# parameter values in the received
|
74
|
-
|
74
|
+
if knit < 0
|
75
|
+
idx = -knit - 1
|
76
|
+
new_args += args[idx..-1] if idx < args.size
|
77
|
+
else
|
78
|
+
new_args << args[knit] if knit < args.size
|
79
|
+
end
|
75
80
|
end
|
76
81
|
end
|
77
82
|
new_args
|
@@ -46,7 +46,13 @@ class Puppet::Pops::Functions::Dispatcher
|
|
46
46
|
#
|
47
47
|
# @api private
|
48
48
|
def add_dispatch(type, method_name, param_names, block_name, injections, weaving, last_captures)
|
49
|
-
|
49
|
+
add(Puppet::Pops::Functions::Dispatch.new(type, method_name, param_names, block_name, injections, weaving, last_captures))
|
50
|
+
end
|
51
|
+
|
52
|
+
# Adds a dispatch directly to the set of dispathers.
|
53
|
+
# @api private
|
54
|
+
def add(a_dispatch)
|
55
|
+
@dispatchers << a_dispatch
|
50
56
|
end
|
51
57
|
|
52
58
|
# Produces a CallableType for a single signature, and a Variant[<callables>] otherwise
|
@@ -11,19 +11,14 @@ class Puppet::Pops::IssueReporter
|
|
11
11
|
def self.assert_and_report(acceptor, options)
|
12
12
|
return unless acceptor
|
13
13
|
|
14
|
-
max_errors
|
15
|
-
max_warnings
|
16
|
-
max_deprecations =
|
17
|
-
if Puppet[:disable_warnings].include?('deprecations')
|
18
|
-
0
|
19
|
-
else
|
20
|
-
Puppet[:max_deprecations]
|
21
|
-
end
|
14
|
+
max_errors = options[:max_errors] || Puppet[:max_errors]
|
15
|
+
max_warnings = options[:max_warnings] || Puppet[:max_warnings]
|
16
|
+
max_deprecations = options[:max_deprecations] || (Puppet[:disable_warnings].include?('deprecations') ? 0 : Puppet[:max_deprecations])
|
22
17
|
|
23
|
-
emit_warnings
|
24
|
-
emit_errors
|
25
|
-
emit_message
|
26
|
-
emit_exception
|
18
|
+
emit_warnings = options[:emit_warnings] || false
|
19
|
+
emit_errors = options[:emit_errors].nil? ? true : !!options[:emit_errors]
|
20
|
+
emit_message = options[:message]
|
21
|
+
emit_exception = options[:exception_class] || Puppet::ParseErrorWithIssue
|
27
22
|
|
28
23
|
# If there are warnings output them
|
29
24
|
warnings = acceptor.warnings
|
@@ -37,10 +32,10 @@ class Puppet::Pops::IssueReporter
|
|
37
32
|
# deprecation of constructs in manifests! (It is not designed for that purpose even if
|
38
33
|
# used throughout the code base).
|
39
34
|
#
|
40
|
-
|
35
|
+
log_message(:warning, formatter, w) if emitted_dw < max_deprecations
|
41
36
|
emitted_dw += 1
|
42
37
|
else
|
43
|
-
|
38
|
+
log_message(:warning, formatter, w) if emitted_w < max_warnings
|
44
39
|
emitted_w += 1
|
45
40
|
end
|
46
41
|
break if emitted_w >= max_warnings && emitted_dw >= max_deprecations # but only then
|
@@ -56,7 +51,7 @@ class Puppet::Pops::IssueReporter
|
|
56
51
|
formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
|
57
52
|
if errors.size == 1 || max_errors <= 1
|
58
53
|
# raise immediately
|
59
|
-
exception = emit_exception
|
54
|
+
exception = create_exception(emit_exception, emit_message, formatter, errors[0])
|
60
55
|
# if an exception was given as cause, use it's backtrace instead of the one indicating "here"
|
61
56
|
if errors[0].exception
|
62
57
|
exception.set_backtrace(errors[0].exception.backtrace)
|
@@ -68,7 +63,7 @@ class Puppet::Pops::IssueReporter
|
|
68
63
|
Puppet.err(emit_message)
|
69
64
|
end
|
70
65
|
errors.each do |e|
|
71
|
-
|
66
|
+
log_message(:err, formatter, e)
|
72
67
|
emitted += 1
|
73
68
|
break if emitted >= max_errors
|
74
69
|
end
|
@@ -84,4 +79,35 @@ class Puppet::Pops::IssueReporter
|
|
84
79
|
return message unless prefix
|
85
80
|
[prefix, message].join(' ')
|
86
81
|
end
|
82
|
+
|
83
|
+
def self.create_exception(exception_class, emit_message, formatter, diagnostic)
|
84
|
+
file = diagnostic.file
|
85
|
+
file = (file.is_a?(String) && file.empty?) ? nil : file
|
86
|
+
line = pos = nil
|
87
|
+
if diagnostic.source_pos
|
88
|
+
line = diagnostic.source_pos.line
|
89
|
+
pos = diagnostic.source_pos.pos
|
90
|
+
end
|
91
|
+
exception_class.new(format_with_prefix(emit_message, formatter.format_message(diagnostic)), file, line, pos, nil, diagnostic.issue.issue_code)
|
92
|
+
end
|
93
|
+
private_class_method :create_exception
|
94
|
+
|
95
|
+
def self.log_message(severity, formatter, diagnostic)
|
96
|
+
file = diagnostic.file
|
97
|
+
file = (file.is_a?(String) && file.empty?) ? nil : file
|
98
|
+
line = pos = nil
|
99
|
+
if diagnostic.source_pos
|
100
|
+
line = diagnostic.source_pos.line
|
101
|
+
pos = diagnostic.source_pos.pos
|
102
|
+
end
|
103
|
+
Puppet::Util::Log.create({
|
104
|
+
:level => severity,
|
105
|
+
:message => formatter.format_message(diagnostic),
|
106
|
+
:issue_code => diagnostic.issue.issue_code,
|
107
|
+
:file => file,
|
108
|
+
:line => line,
|
109
|
+
:pos => pos,
|
110
|
+
})
|
111
|
+
end
|
112
|
+
private_class_method :log_message
|
87
113
|
end
|
data/lib/puppet/pops/issues.rb
CHANGED
@@ -162,11 +162,16 @@ module Puppet::Pops::Issues
|
|
162
162
|
|
163
163
|
# Variables are immutable, cannot reassign in the same assignment scope
|
164
164
|
ILLEGAL_REASSIGNMENT = hard_issue :ILLEGAL_REASSIGNMENT, :name do
|
165
|
-
|
165
|
+
if Puppet::Pops::Validation::Checker4_0::RESERVED_PARAMETERS[name]
|
166
|
+
"Cannot reassign built in (or already assigned) variable '$#{name}'"
|
167
|
+
else
|
168
|
+
"Cannot reassign variable '$#{name}'"
|
169
|
+
end
|
166
170
|
end
|
167
171
|
|
172
|
+
# Variables facts and trusted
|
168
173
|
ILLEGAL_RESERVED_ASSIGNMENT = hard_issue :ILLEGAL_RESERVED_ASSIGNMENT, :name do
|
169
|
-
"Attempt to assign to a reserved variable name: '
|
174
|
+
"Attempt to assign to a reserved variable name: '$#{name}'"
|
170
175
|
end
|
171
176
|
|
172
177
|
# Assignment cannot be made to numeric match result variables
|
@@ -174,6 +179,11 @@ module Puppet::Pops::Issues
|
|
174
179
|
"Illegal attempt to assign to the numeric match result variable '$#{varname}'. Numeric variables are not assignable"
|
175
180
|
end
|
176
181
|
|
182
|
+
# Assignment can only be made to certain types of left hand expressions such as variables.
|
183
|
+
ILLEGAL_ASSIGNMENT_CONTEXT = hard_issue :ILLEGAL_ASSIGNMENT_CONTEXT do
|
184
|
+
"Assignment not allowed here"
|
185
|
+
end
|
186
|
+
|
177
187
|
# parameters cannot have numeric names, clashes with match result variables
|
178
188
|
ILLEGAL_NUMERIC_PARAMETER = issue :ILLEGAL_NUMERIC_PARAMETER, :name do
|
179
189
|
"The numeric parameter name '$#{name}' cannot be used (clashes with numeric match result variables)"
|
@@ -194,6 +204,14 @@ module Puppet::Pops::Issues
|
|
194
204
|
"Illegal attempt to assign to #{label.a_an(semantic)} via [index/key]. Not an assignable reference"
|
195
205
|
end
|
196
206
|
|
207
|
+
ILLEGAL_MULTI_ASSIGNMENT_SIZE = hard_issue :ILLEGAL_MULTI_ASSIGNMENT_SIZE, :expected, :actual do
|
208
|
+
"Mismatched number of assignable entries and values, expected #{expected}, got #{actual}"
|
209
|
+
end
|
210
|
+
|
211
|
+
MISSING_MULTI_ASSIGNMENT_KEY = hard_issue :MISSING_MULTI_ASSIGNMENT_KEY, :key do
|
212
|
+
"No value for required key '#{key}' in assignment to variables from hash"
|
213
|
+
end
|
214
|
+
|
197
215
|
APPENDS_DELETES_NO_LONGER_SUPPORTED = hard_issue :APPENDS_DELETES_NO_LONGER_SUPPORTED, :operator do
|
198
216
|
"The operator '#{operator}' is no longer supported. See http://links.puppetlabs.com/remove-plus-equals"
|
199
217
|
end
|
@@ -374,6 +392,10 @@ module Puppet::Pops::Issues
|
|
374
392
|
"#{label.a_an_uc(left_value)}[] cannot use #{actual} where #{expected_text} expected"
|
375
393
|
end
|
376
394
|
|
395
|
+
BAD_NOT_UNDEF_SLICE_TYPE = issue :BAD_NOT_UNDEF_SLICE_TYPE, :base_type, :actual do
|
396
|
+
"#{base_type}[] argument must be a Type or a String. Got #{actual}"
|
397
|
+
end
|
398
|
+
|
377
399
|
BAD_TYPE_SLICE_TYPE = issue :BAD_TYPE_SLICE_TYPE, :base_type, :actual do
|
378
400
|
"#{base_type}[] arguments must be types. Got #{actual}"
|
379
401
|
end
|
@@ -549,4 +571,96 @@ module Puppet::Pops::Issues
|
|
549
571
|
ILLEGAL_CATALOG_RELATED_EXPRESSION = hard_issue :ILLEGAL_CATALOG_RELATED_EXPRESSION do
|
550
572
|
"This #{label.label(semantic)} appears in a context where catalog related expressions are not allowed"
|
551
573
|
end
|
574
|
+
|
575
|
+
SYNTAX_ERROR = hard_issue :SYNTAX_ERROR, :where do
|
576
|
+
"Syntax error at #{where}"
|
577
|
+
end
|
578
|
+
|
579
|
+
ILLEGAL_CLASS_REFERENCE = hard_issue :ILLEGAL_CLASS_REFERENCE do
|
580
|
+
'Illegal class reference'
|
581
|
+
end
|
582
|
+
|
583
|
+
ILLEGAL_FULLY_QUALIFIED_CLASS_REFERENCE = hard_issue :ILLEGAL_FULLY_QUALIFIED_CLASS_REFERENCE do
|
584
|
+
'Illegal fully qualified class reference'
|
585
|
+
end
|
586
|
+
|
587
|
+
ILLEGAL_FULLY_QUALIFIED_NAME = hard_issue :ILLEGAL_FULLY_QUALIFIED_NAME do
|
588
|
+
'Illegal fully qualified name'
|
589
|
+
end
|
590
|
+
|
591
|
+
ILLEGAL_NAME_OR_BARE_WORD = hard_issue :ILLEGAL_NAME_OR_BARE_WORD do
|
592
|
+
'Illegal name or bare word'
|
593
|
+
end
|
594
|
+
|
595
|
+
ILLEGAL_NUMBER = hard_issue :ILLEGAL_NUMBER, :value do
|
596
|
+
"Illegal number '#{value}'"
|
597
|
+
end
|
598
|
+
|
599
|
+
ILLEGAL_UNICODE_ESCAPE = issue :ILLEGAL_UNICODE_ESCAPE do
|
600
|
+
"Unicode escape '\\u' was not followed by 4 hex digits or 1-6 hex digits in {} or was > 10ffff"
|
601
|
+
end
|
602
|
+
|
603
|
+
INVALID_HEX_NUMBER = hard_issue :INVALID_HEX_NUMBER, :value do
|
604
|
+
"Not a valid hex number #{value}"
|
605
|
+
end
|
606
|
+
|
607
|
+
INVALID_OCTAL_NUMBER = hard_issue :INVALID_OCTAL_NUMBER, :value do
|
608
|
+
"Not a valid octal number #{value}"
|
609
|
+
end
|
610
|
+
|
611
|
+
INVALID_DECIMAL_NUMBER = hard_issue :INVALID_DECIMAL_NUMBER, :value do
|
612
|
+
"Not a valid decimal number #{value}"
|
613
|
+
end
|
614
|
+
|
615
|
+
NO_INPUT_TO_LEXER = hard_issue :NO_INPUT_TO_LEXER do
|
616
|
+
"Internal Error: No string or file given to lexer to process."
|
617
|
+
end
|
618
|
+
|
619
|
+
UNRECOGNIZED_ESCAPE = issue :UNRECOGNIZED_ESCAPE, :ch do
|
620
|
+
"Unrecognized escape sequence '\\#{ch}'"
|
621
|
+
end
|
622
|
+
|
623
|
+
UNCLOSED_QUOTE = hard_issue :UNCLOSED_QUOTE, :after, :followed_by do
|
624
|
+
"Unclosed quote after #{after} followed by '#{followed_by}'"
|
625
|
+
end
|
626
|
+
|
627
|
+
EPP_INTERNAL_ERROR = hard_issue :EPP_INTERNAL_ERROR, :error do
|
628
|
+
"Internal error: #{error}"
|
629
|
+
end
|
630
|
+
|
631
|
+
EPP_UNBALANCED_TAG = hard_issue :EPP_UNBALANCED_TAG do
|
632
|
+
'Unbalanced epp tag, reached <eof> without closing tag.'
|
633
|
+
end
|
634
|
+
|
635
|
+
EPP_UNBALANCED_COMMENT = hard_issue :EPP_UNBALANCED_COMMENT do
|
636
|
+
'Reaching end after opening <%# without seeing %>'
|
637
|
+
end
|
638
|
+
|
639
|
+
EPP_UNBALANCED_EXPRESSION = hard_issue :EPP_UNBALANCED_EXPRESSION do
|
640
|
+
'Unbalanced embedded expression - opening <% and reaching end of input'
|
641
|
+
end
|
642
|
+
|
643
|
+
HEREDOC_UNCLOSED_PARENTHESIS = hard_issue :HEREDOC_UNCLOSED_PARENTHESIS, :followed_by do
|
644
|
+
"Unclosed parenthesis after '@(' followed by '#{followed_by}'"
|
645
|
+
end
|
646
|
+
|
647
|
+
HEREDOC_WITHOUT_END_TAGGED_LINE = hard_issue :HEREDOC_WITHOUT_END_TAGGED_LINE do
|
648
|
+
'Heredoc without end-tagged line'
|
649
|
+
end
|
650
|
+
|
651
|
+
HEREDOC_INVALID_ESCAPE = hard_issue :HEREDOC_INVALID_ESCAPE, :actual do
|
652
|
+
"Invalid heredoc escape char. Only t, r, n, s, u, L, $ allowed. Got '#{actual}'"
|
653
|
+
end
|
654
|
+
|
655
|
+
HEREDOC_INVALID_SYNTAX = hard_issue :HEREDOC_INVALID_SYNTAX do
|
656
|
+
'Invalid syntax in heredoc expected @(endtag[:syntax][/escapes])'
|
657
|
+
end
|
658
|
+
|
659
|
+
HEREDOC_WITHOUT_TEXT = hard_issue :HEREDOC_WITHOUT_TEXT do
|
660
|
+
'Heredoc without any following lines of text'
|
661
|
+
end
|
662
|
+
|
663
|
+
HEREDOC_MULTIPLE_AT_ESCAPES = hard_issue :HEREDOC_MULTIPLE_AT_ESCAPES, :escapes do
|
664
|
+
"An escape char for @() may only appear once. Got '#{escapes.join(', ')}'"
|
665
|
+
end
|
552
666
|
end
|
@@ -21,6 +21,9 @@
|
|
21
21
|
#
|
22
22
|
class Puppet::Pops::Loader::Loader
|
23
23
|
|
24
|
+
# Describes the kinds of things that loaders can load
|
25
|
+
LOADABLE_KINDS = [:func_4x, :func_4xpp].freeze
|
26
|
+
|
24
27
|
# Produces the value associated with the given name if already loaded, or available for loading
|
25
28
|
# by this loader, one of its parents, or other loaders visible to this loader.
|
26
29
|
# This is the method an external party should use to "get" the named element.
|
@@ -119,6 +122,14 @@ class Puppet::Pops::Loader::Loader
|
|
119
122
|
raise NotImplementedError.new
|
120
123
|
end
|
121
124
|
|
125
|
+
# A loader is by default a loader for all kinds of loadables. An implementation may override
|
126
|
+
# if it cannot load all kinds.
|
127
|
+
#
|
128
|
+
# @api private
|
129
|
+
def loadables
|
130
|
+
LOADABLE_KINDS
|
131
|
+
end
|
132
|
+
|
122
133
|
# An entry for one entity loaded by the loader.
|
123
134
|
#
|
124
135
|
class NamedEntry
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# The central loader knowledge about paths, what they represent and how to instantiate from them.
|
5
5
|
# Contains helpers (*smart paths*) to deal with lazy resolution of paths.
|
6
6
|
#
|
7
|
-
# TODO: Currently only supports loading of functions (
|
7
|
+
# TODO: Currently only supports loading of functions (2 kinds)
|
8
8
|
#
|
9
9
|
module Puppet::Pops::Loader::LoaderPaths
|
10
10
|
# Returns an array of SmartPath, each instantiated with a reference to the given loader (for root path resolution
|
@@ -12,10 +12,17 @@ module Puppet::Pops::Loader::LoaderPaths
|
|
12
12
|
# mutated.
|
13
13
|
#
|
14
14
|
def self.relative_paths_for_type(type, loader)
|
15
|
-
result =
|
15
|
+
result = []
|
16
16
|
case type
|
17
17
|
when :function
|
18
|
-
|
18
|
+
# Only include support for the loadable items the loader states it can contain
|
19
|
+
if loader.loadables.include?(:func_4x)
|
20
|
+
result << FunctionPath4x.new(loader)
|
21
|
+
end
|
22
|
+
if loader.loadables.include?(:func_4xpp)
|
23
|
+
result << FunctionPathPP.new(loader)
|
24
|
+
end
|
25
|
+
# When wanted also add FunctionPath3x to load 3x functions
|
19
26
|
else
|
20
27
|
# unknown types, simply produce an empty result; no paths to check, nothing to find... move along...
|
21
28
|
[]
|
@@ -44,8 +51,12 @@ module Puppet::Pops::Loader::LoaderPaths
|
|
44
51
|
def generic_path()
|
45
52
|
return @generic_path unless @generic_path.nil?
|
46
53
|
|
47
|
-
|
48
|
-
@generic_path = (
|
54
|
+
the_root_path = root_path() # @loader.path
|
55
|
+
@generic_path = (the_root_path.nil? ? relative_path : File.join(the_root_path, relative_path))
|
56
|
+
end
|
57
|
+
|
58
|
+
def root_path
|
59
|
+
@loader.path
|
49
60
|
end
|
50
61
|
|
51
62
|
# Effective path is the generic path + the name part(s) + extension.
|
@@ -64,8 +75,10 @@ module Puppet::Pops::Loader::LoaderPaths
|
|
64
75
|
end
|
65
76
|
|
66
77
|
class RubySmartPath < SmartPath
|
78
|
+
EXTENSION = '.rb'.freeze
|
79
|
+
|
67
80
|
def extension
|
68
|
-
|
81
|
+
EXTENSION
|
69
82
|
end
|
70
83
|
|
71
84
|
# Duplication of extension information, but avoids one call
|
@@ -74,6 +87,29 @@ module Puppet::Pops::Loader::LoaderPaths
|
|
74
87
|
end
|
75
88
|
end
|
76
89
|
|
90
|
+
# A PuppetSmartPath is rooted at the loader's directory one level up from what the loader specifies as it
|
91
|
+
# path (which is a reference to its 'lib' directory.
|
92
|
+
#
|
93
|
+
class PuppetSmartPath < SmartPath
|
94
|
+
EXTENSION = '.pp'.freeze
|
95
|
+
|
96
|
+
def extension
|
97
|
+
EXTENSION
|
98
|
+
end
|
99
|
+
|
100
|
+
def root_path
|
101
|
+
# Drop the lib part (it may not exist and cannot be navigated to in a relative way)
|
102
|
+
Puppet::FileSystem.dir_string(@loader.path)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Duplication of extension information, but avoids one call
|
106
|
+
def effective_path(typed_name, start_index_in_name)
|
107
|
+
# Puppet name to path always skips the name-space as that is part of the generic path
|
108
|
+
# i.e. <module>/mymodule/functions/foo.pp is the function mymodule::foo
|
109
|
+
"#{File.join(generic_path, typed_name.name_parts[ 1..-1 ])}.pp"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
77
113
|
class FunctionPath4x < RubySmartPath
|
78
114
|
FUNCTION_PATH_4X = File.join('puppet', 'functions')
|
79
115
|
|
@@ -86,6 +122,31 @@ module Puppet::Pops::Loader::LoaderPaths
|
|
86
122
|
end
|
87
123
|
end
|
88
124
|
|
125
|
+
class FunctionPath3x < RubySmartPath
|
126
|
+
FUNCTION_PATH_3X = File.join('puppet', 'parser', 'functions')
|
127
|
+
|
128
|
+
def relative_path
|
129
|
+
FUNCTION_PATH_3X
|
130
|
+
end
|
131
|
+
|
132
|
+
def instantiator()
|
133
|
+
Puppet::Pops::Loader::RubyLegacyFunctionInstantiator
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class FunctionPathPP < PuppetSmartPath
|
138
|
+
# Navigate to directory where 'lib' is, then down again
|
139
|
+
FUNCTION_PATH_PP = File.join('functions')
|
140
|
+
|
141
|
+
def relative_path
|
142
|
+
FUNCTION_PATH_PP
|
143
|
+
end
|
144
|
+
|
145
|
+
def instantiator()
|
146
|
+
Puppet::Pops::Loader::PuppetFunctionInstantiator
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
89
150
|
# SmartPaths
|
90
151
|
# ===
|
91
152
|
# Holds effective SmartPath instances per type
|