pdk 2.7.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/README.md +2 -48
  4. data/lib/pdk/analytics/client/google_analytics.rb +22 -26
  5. data/lib/pdk/analytics/util.rb +0 -1
  6. data/lib/pdk/analytics.rb +1 -1
  7. data/lib/pdk/bolt.rb +1 -0
  8. data/lib/pdk/cli/build.rb +53 -56
  9. data/lib/pdk/cli/bundle.rb +34 -33
  10. data/lib/pdk/cli/console.rb +136 -134
  11. data/lib/pdk/cli/convert.rb +39 -41
  12. data/lib/pdk/cli/env.rb +49 -47
  13. data/lib/pdk/cli/errors.rb +1 -2
  14. data/lib/pdk/cli/exec/command.rb +23 -29
  15. data/lib/pdk/cli/exec/interactive_command.rb +7 -12
  16. data/lib/pdk/cli/exec.rb +4 -11
  17. data/lib/pdk/cli/exec_group.rb +3 -2
  18. data/lib/pdk/cli/get/config.rb +21 -19
  19. data/lib/pdk/cli/get.rb +15 -13
  20. data/lib/pdk/cli/new/class.rb +22 -22
  21. data/lib/pdk/cli/new/defined_type.rb +22 -22
  22. data/lib/pdk/cli/new/fact.rb +19 -19
  23. data/lib/pdk/cli/new/function.rb +20 -20
  24. data/lib/pdk/cli/new/module.rb +40 -38
  25. data/lib/pdk/cli/new/provider.rb +19 -19
  26. data/lib/pdk/cli/new/task.rb +23 -23
  27. data/lib/pdk/cli/new/test.rb +50 -48
  28. data/lib/pdk/cli/new/transport.rb +18 -18
  29. data/lib/pdk/cli/new.rb +11 -9
  30. data/lib/pdk/cli/release/prep.rb +27 -25
  31. data/lib/pdk/cli/release/publish.rb +39 -37
  32. data/lib/pdk/cli/release.rb +152 -149
  33. data/lib/pdk/cli/remove/config.rb +63 -60
  34. data/lib/pdk/cli/remove.rb +15 -13
  35. data/lib/pdk/cli/set/config.rb +91 -89
  36. data/lib/pdk/cli/set.rb +15 -13
  37. data/lib/pdk/cli/test/unit.rb +71 -69
  38. data/lib/pdk/cli/test.rb +9 -7
  39. data/lib/pdk/cli/update.rb +33 -38
  40. data/lib/pdk/cli/util/command_redirector.rb +10 -1
  41. data/lib/pdk/cli/util/interview.rb +11 -4
  42. data/lib/pdk/cli/util/option_normalizer.rb +2 -4
  43. data/lib/pdk/cli/util/option_validator.rb +7 -9
  44. data/lib/pdk/cli/util/update_manager_printer.rb +4 -4
  45. data/lib/pdk/cli/util.rb +32 -48
  46. data/lib/pdk/cli/validate.rb +98 -96
  47. data/lib/pdk/cli.rb +124 -120
  48. data/lib/pdk/config/ini_file.rb +4 -3
  49. data/lib/pdk/config/ini_file_setting.rb +6 -10
  50. data/lib/pdk/config/json.rb +1 -0
  51. data/lib/pdk/config/json_schema_namespace.rb +5 -10
  52. data/lib/pdk/config/json_schema_setting.rb +3 -5
  53. data/lib/pdk/config/json_with_schema.rb +2 -4
  54. data/lib/pdk/config/namespace.rb +19 -13
  55. data/lib/pdk/config/setting.rb +5 -6
  56. data/lib/pdk/config/task_schema.json +116 -0
  57. data/lib/pdk/config/validator.rb +4 -4
  58. data/lib/pdk/config/yaml.rb +3 -8
  59. data/lib/pdk/config/yaml_with_schema.rb +4 -12
  60. data/lib/pdk/config.rb +47 -51
  61. data/lib/pdk/context/control_repo.rb +3 -2
  62. data/lib/pdk/context/module.rb +2 -2
  63. data/lib/pdk/context/none.rb +2 -2
  64. data/lib/pdk/context.rb +4 -5
  65. data/lib/pdk/control_repo.rb +3 -4
  66. data/lib/pdk/generate/defined_type.rb +3 -3
  67. data/lib/pdk/generate/fact.rb +3 -2
  68. data/lib/pdk/generate/function.rb +5 -4
  69. data/lib/pdk/generate/module.rb +91 -106
  70. data/lib/pdk/generate/provider.rb +5 -4
  71. data/lib/pdk/generate/puppet_class.rb +3 -3
  72. data/lib/pdk/generate/puppet_object.rb +9 -12
  73. data/lib/pdk/generate/task.rb +11 -10
  74. data/lib/pdk/generate/transport.rb +8 -7
  75. data/lib/pdk/generate.rb +1 -1
  76. data/lib/pdk/logger.rb +3 -2
  77. data/lib/pdk/module/build.rb +34 -49
  78. data/lib/pdk/module/convert.rb +13 -22
  79. data/lib/pdk/module/metadata.rb +53 -61
  80. data/lib/pdk/module/release.rb +19 -25
  81. data/lib/pdk/module/update.rb +4 -13
  82. data/lib/pdk/module/update_manager.rb +18 -25
  83. data/lib/pdk/module.rb +1 -1
  84. data/lib/pdk/monkey_patches.rb +268 -0
  85. data/lib/pdk/report/event.rb +12 -37
  86. data/lib/pdk/report.rb +4 -4
  87. data/lib/pdk/template/fetcher/git.rb +7 -8
  88. data/lib/pdk/template/fetcher/local.rb +1 -0
  89. data/lib/pdk/template/fetcher.rb +4 -2
  90. data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +4 -9
  91. data/lib/pdk/template/renderer/v1/renderer.rb +19 -20
  92. data/lib/pdk/template/renderer/v1/template_file.rb +4 -8
  93. data/lib/pdk/template/renderer/v1.rb +1 -1
  94. data/lib/pdk/template/renderer.rb +1 -0
  95. data/lib/pdk/template/template_dir.rb +3 -3
  96. data/lib/pdk/template.rb +2 -6
  97. data/lib/pdk/tests/unit.rb +36 -25
  98. data/lib/pdk/util/bundler.rb +10 -14
  99. data/lib/pdk/util/changelog_generator.rb +15 -12
  100. data/lib/pdk/util/env.rb +1 -0
  101. data/lib/pdk/util/filesystem.rb +18 -17
  102. data/lib/pdk/util/git.rb +16 -21
  103. data/lib/pdk/util/json_finder.rb +7 -6
  104. data/lib/pdk/util/puppet_strings.rb +1 -1
  105. data/lib/pdk/util/puppet_version.rb +16 -67
  106. data/lib/pdk/util/ruby_version.rb +9 -13
  107. data/lib/pdk/util/template_uri.rb +17 -29
  108. data/lib/pdk/util/vendored_file.rb +5 -18
  109. data/lib/pdk/util/windows/api_types.rb +70 -64
  110. data/lib/pdk/util/windows/file.rb +31 -27
  111. data/lib/pdk/util/windows/process.rb +59 -61
  112. data/lib/pdk/util/windows/string.rb +19 -12
  113. data/lib/pdk/util.rb +12 -20
  114. data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +1 -1
  115. data/lib/pdk/validate/control_repo/environment_conf_validator.rb +25 -25
  116. data/lib/pdk/validate/external_command_validator.rb +6 -1
  117. data/lib/pdk/validate/internal_ruby_validator.rb +5 -4
  118. data/lib/pdk/validate/invokable_validator.rb +30 -20
  119. data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +12 -14
  120. data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +13 -15
  121. data/lib/pdk/validate/metadata/metadata_validator_group.rb +1 -1
  122. data/lib/pdk/validate/puppet/puppet_epp_validator.rb +16 -18
  123. data/lib/pdk/validate/puppet/puppet_lint_validator.rb +14 -14
  124. data/lib/pdk/validate/puppet/puppet_plan_syntax_validator.rb +1 -1
  125. data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +16 -18
  126. data/lib/pdk/validate/puppet/puppet_validator_group.rb +1 -1
  127. data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +10 -11
  128. data/lib/pdk/validate/ruby/ruby_validator_group.rb +1 -1
  129. data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +19 -24
  130. data/lib/pdk/validate/tasks/tasks_name_validator.rb +11 -13
  131. data/lib/pdk/validate/tasks/tasks_validator_group.rb +1 -1
  132. data/lib/pdk/validate/validator.rb +4 -2
  133. data/lib/pdk/validate/validator_group.rb +6 -3
  134. data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +27 -36
  135. data/lib/pdk/validate/yaml/yaml_validator_group.rb +1 -1
  136. data/lib/pdk/validate.rb +6 -6
  137. data/lib/pdk/version.rb +2 -2
  138. data/lib/pdk.rb +12 -12
  139. metadata +27 -35
  140. data/lib/pdk/cli/config/get.rb +0 -26
  141. data/lib/pdk/cli/config.rb +0 -22
  142. data/lib/pdk/cli/module/build.rb +0 -12
  143. data/lib/pdk/cli/module/generate.rb +0 -47
  144. data/lib/pdk/cli/module.rb +0 -14
@@ -0,0 +1,116 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-06/schema#",
3
+ "title": "Puppet Task Metadata",
4
+ "description": "The metadata format for Puppet Tasks",
5
+ "type": "object",
6
+ "properties": {
7
+ "description": {
8
+ "type": "string",
9
+ "description": "A longer description(one paragraph) of how to use the task"
10
+ },
11
+ "puppet_task_version": {
12
+ "type": "integer",
13
+ "description": "The version of this spec used",
14
+ "default": 1
15
+ },
16
+ "supports_noop": {
17
+ "type": "boolean",
18
+ "default": false,
19
+ "description": "This task respects the '_noop' metaparam. If this false or absent the task runner will refuse to run this task if noop is specified."
20
+ },
21
+ "remote": {
22
+ "type": "boolean",
23
+ "default": false,
24
+ "description": "This task is capable of operating on a remote target using connection information in the '_target' metaparam."
25
+ },
26
+ "input_method": {
27
+ "type": "string",
28
+ "enum": ["stdin", "environment", "both", "powershell"],
29
+ "description": "What input method should be used to pass params to the task"
30
+ },
31
+ "parameters": {
32
+ "$ref": "#/definitions/paramsObject",
33
+ "description": "An object mapping valid parameter names to corresponding json-schemas"
34
+ },
35
+ "implementations": {
36
+ "type": "array",
37
+ "items": {
38
+ "type": "object",
39
+ "required": ["name"],
40
+ "properties": {
41
+ "name": {
42
+ "type": "string",
43
+ "description": "Name of task executable file"
44
+ },
45
+ "requirements": {
46
+ "type": "array",
47
+ "additionalItems": {
48
+ "type": "string"
49
+ },
50
+ "description": "Features required on target to execute task"
51
+ },
52
+ "files": {
53
+ "type": "array",
54
+ "additionalItems": {
55
+ "type": "string"
56
+ },
57
+ "description": "File resources required by task"
58
+ }
59
+ }
60
+ },
61
+ "description": "Rules for selecting implementation resources based on features available on target"
62
+ },
63
+ "files": {
64
+ "type": "array",
65
+ "items": {
66
+ "type": "string"
67
+ },
68
+ "description": "Path to file resources saved in valid module directory to be provided to task"
69
+ },
70
+ "private": {
71
+ "type": "boolean",
72
+ "description": "Should this task appear by default in UI lists of tasks"
73
+ },
74
+ "extensions": {
75
+ "type": "object",
76
+ "description": "Task Runner specific metadata extensions",
77
+ "items": {
78
+ "type": "object"
79
+ }
80
+ }
81
+ },
82
+ "definitions": {
83
+ "parameterName": {
84
+ "description": "Valid names for parameter keys",
85
+ "type": "string",
86
+ "pattern": "^[a-z][a-z0-9_]*$"
87
+ },
88
+ "paramsObject": {
89
+ "type": "object",
90
+ "description": "An object with restricted keys and enumData support",
91
+ "propertyNames": {"$ref": "#/definitions/parameterName"},
92
+ "additionalProperties": {
93
+ "type": "object",
94
+ "description": "Extend Normal JSON schema to require an object and describe 'enumData' to map enum values to descriptions",
95
+ "properties": {
96
+ "description": {
97
+ "description": "A description of the parameter",
98
+ "type": "string"
99
+ },
100
+ "type": {
101
+ "description": "A puppet type string that describes a data type that will match the parameter value",
102
+ "type": "string"
103
+ },
104
+ "sensitive": {
105
+ "description": "Whether the task runner should treat the parameter value as sensitive",
106
+ "type": "boolean",
107
+ "default": false
108
+ },
109
+ "default": {
110
+ "description": "The default value to pass to the task implementation if the parameter isn't provided"
111
+ }
112
+ }
113
+ }
114
+ }
115
+ }
116
+ }
@@ -12,8 +12,8 @@ module PDK
12
12
  # FalseClass.
13
13
  def self.boolean
14
14
  {
15
- proc: ->(value) { [true, false].include?(value) },
16
- message: 'must be a boolean: true or false',
15
+ proc: ->(value) { [true, false].include?(value) },
16
+ message: 'must be a boolean: true or false'
17
17
  }
18
18
  end
19
19
 
@@ -22,8 +22,8 @@ module PDK
22
22
  # regex for a version 4 UUID.
23
23
  def self.uuid
24
24
  {
25
- proc: ->(value) { value.match(%r{\A\h{8}(?:-\h{4}){3}-\h{12}\z}) },
26
- message: 'must be a version 4 UUID',
25
+ proc: ->(value) { value.match(/\A\h{8}(?:-\h{4}){3}-\h{12}\z/) },
26
+ message: 'must be a version 4 UUID'
27
27
  }
28
28
  end
29
29
  end
@@ -8,6 +8,7 @@ module PDK
8
8
  class YAML < Namespace
9
9
  def parse_file(filename)
10
10
  raise unless block_given?
11
+
11
12
  data = load_data(filename)
12
13
  return if data.nil? || data.empty?
13
14
 
@@ -22,15 +23,9 @@ module PDK
22
23
 
23
24
  data.each { |k, v| yield k, PDK::Config::Setting.new(k, self, v) }
24
25
  rescue Psych::SyntaxError => e
25
- raise PDK::Config::LoadError, 'Syntax error when loading %{file}: %{error}' % {
26
- file: filename,
27
- error: "#{e.problem} #{e.context}",
28
- }
26
+ raise PDK::Config::LoadError, format('Syntax error when loading %{file}: %{error}', file: filename, error: "#{e.problem} #{e.context}")
29
27
  rescue Psych::DisallowedClass => e
30
- raise PDK::Config::LoadError, 'Unsupported class in %{file}: %{error}' % {
31
- file: filename,
32
- error: e.message,
33
- }
28
+ raise PDK::Config::LoadError, format('Unsupported class in %{file}: %{error}', file: filename, error: e.message)
34
29
  end
35
30
 
36
31
  # Serializes object data into a YAML string.
@@ -8,6 +8,7 @@ module PDK
8
8
  class YAMLWithSchema < JSONSchemaNamespace
9
9
  def parse_file(filename)
10
10
  raise unless block_given?
11
+
11
12
  data = load_data(filename)
12
13
  data = '' if data.nil?
13
14
  require 'yaml'
@@ -20,10 +21,7 @@ module PDK
20
21
  # Ensure the parsed document is actually valid
21
22
  validate_document!(@raw_data)
22
23
  rescue ::JSON::Schema::ValidationError => e
23
- raise PDK::Config::LoadError, 'The configuration file %{filename} is not valid: %{message}' % {
24
- filename: filename,
25
- message: e.message,
26
- }
24
+ raise PDK::Config::LoadError, format('The configuration file %{filename} is not valid: %{message}', filename: filename, message: e.message)
27
25
  end
28
26
 
29
27
  require 'pdk/config/json_schema_setting'
@@ -36,15 +34,9 @@ module PDK
36
34
  # we're left with the settings that we don't manage.
37
35
  self.unmanaged_settings = @raw_data.reject { |k, _| schema_property_names.include?(k) }
38
36
  rescue Psych::SyntaxError => e
39
- raise PDK::Config::LoadError, 'Syntax error when loading %{file}: %{error}' % {
40
- file: filename,
41
- error: "#{e.problem} #{e.context}",
42
- }
37
+ raise PDK::Config::LoadError, format('Syntax error when loading %{file}: %{error}', file: filename, error: "#{e.problem} #{e.context}")
43
38
  rescue Psych::DisallowedClass => e
44
- raise PDK::Config::LoadError, 'Unsupported class in %{file}: %{error}' % {
45
- file: filename,
46
- error: e.message,
47
- }
39
+ raise PDK::Config::LoadError, format('Unsupported class in %{file}: %{error}', file: filename, error: e.message)
48
40
  end
49
41
 
50
42
  # Serializes object data into a YAML string.
data/lib/pdk/config.rb CHANGED
@@ -24,12 +24,12 @@ module PDK
24
24
  def initialize(options = nil)
25
25
  options = {} if options.nil?
26
26
  @config_options = {
27
- 'system.path' => PDK::Config.system_config_path,
27
+ 'system.path' => PDK::Config.system_config_path,
28
28
  'system.module_defaults.path' => PDK::Config.system_answers_path,
29
- 'user.path' => PDK::Config.user_config_path,
30
- 'user.module_defaults.path' => PDK::AnswerFile.default_answer_file_path,
31
- 'user.analytics.path' => PDK::Config.analytics_config_path,
32
- 'context' => PDK.context,
29
+ 'user.path' => PDK::Config.user_config_path,
30
+ 'user.module_defaults.path' => PDK::AnswerFile.default_answer_file_path,
31
+ 'user.analytics.path' => PDK::Config.analytics_config_path,
32
+ 'context' => PDK.context
33
33
  }.merge(options)
34
34
  end
35
35
 
@@ -91,9 +91,7 @@ module PDK
91
91
  def project_config
92
92
  context = @config_options['context']
93
93
  @project ||= PDK::Config::Namespace.new('project') do
94
- if context.is_a?(PDK::Context::ControlRepo)
95
- mount :environment, PDK::ControlRepo.environment_conf_as_config(File.join(context.root_path, 'environment.conf'))
96
- end
94
+ mount :environment, PDK::ControlRepo.environment_conf_as_config(File.join(context.root_path, 'environment.conf')) if context.is_a?(PDK::Context::ControlRepo)
97
95
 
98
96
  mount :validate, PDK::Config::YAML.new('validate', file: File.join(context.root_path, 'pdk.yaml'), persistent_defaults: true) do
99
97
  setting 'ignore' do
@@ -124,9 +122,10 @@ module PDK
124
122
  return nil if root.nil? || root.empty?
125
123
 
126
124
  if keys.empty?
127
- if root.is_a?(Array)
125
+ case root
126
+ when Array
128
127
  name = root
129
- elsif root.is_a?(String)
128
+ when String
130
129
  name = split_key_string(root)
131
130
  else
132
131
  return nil
@@ -135,7 +134,7 @@ module PDK
135
134
  name = [root].concat(keys)
136
135
  end
137
136
 
138
- get_within_scopes(name[1..-1], [name[0]])
137
+ get_within_scopes(name[1..], [name[0]])
139
138
  end
140
139
 
141
140
  # Returns a configuration setting by name, using scope precedence rules. If no scopes are passed, then all scopes are queried using the default precedence rules
@@ -143,8 +142,8 @@ module PDK
143
142
  # @scopes [Nil, Array[String]] The list of scopes, in order, to query in turn for the setting_name. Invalid or missing scopes are ignored.
144
143
  # @return [PDK::Config::Namespace, Object, nil] The value of the configuration setting. Returns nil if it does no exist
145
144
  def get_within_scopes(setting_name, scopes = nil)
146
- raise ArgumentError, 'Expected an Array but got \'%{klass}\' for scopes' % { klass: scopes.class } unless scopes.nil? || scopes.is_a?(Array)
147
- raise ArgumentError, 'Expected an Array or String but got \'%{klass}\' for setting_name' % { klass: setting_name.class } unless setting_name.is_a?(Array) || setting_name.is_a?(String)
145
+ raise ArgumentError, format('Expected an Array but got \'%{klass}\' for scopes', klass: scopes.class) unless scopes.nil? || scopes.is_a?(Array)
146
+ raise ArgumentError, format('Expected an Array or String but got \'%{klass}\' for setting_name', klass: setting_name.class) unless setting_name.is_a?(Array) || setting_name.is_a?(String)
148
147
 
149
148
  setting_arr = setting_name.is_a?(String) ? split_key_string(setting_name) : setting_name
150
149
  all_scope_names = all_scopes.keys
@@ -165,6 +164,7 @@ module PDK
165
164
  # @yield [PDK::Config::Namespace, Object] The value of the configuration setting. Does not yield if the setting does not exist or is nil
166
165
  def with_scoped_value(setting_name, scopes = nil)
167
166
  raise ArgumentError, 'must be passed a block' unless block_given?
167
+
168
168
  value = get_within_scopes(setting_name, scopes)
169
169
  yield value unless value.nil?
170
170
  end
@@ -179,24 +179,23 @@ module PDK
179
179
  # @return [Object] The new value of the configuration setting
180
180
  def set(key, value, options = {})
181
181
  options = {
182
- force: false,
182
+ force: false
183
183
  }.merge(options)
184
184
 
185
185
  names = key.is_a?(String) ? split_key_string(key) : key
186
186
  raise ArgumentError, 'Invalid configuration names' if names.nil? || !names.is_a?(Array) || names.empty?
187
+
187
188
  scope_name = names[0]
188
- raise ArgumentError, "Unknown configuration root '%{name}'" % { name: scope_name } if all_scopes[scope_name].nil?
189
- deep_set_object(value, options[:force], send(all_scopes[scope_name]), *names[1..-1])
189
+ raise ArgumentError, format("Unknown configuration root '%{name}'", name: scope_name) if all_scopes[scope_name].nil?
190
+
191
+ deep_set_object(value, options[:force], send(all_scopes[scope_name]), *names[1..])
190
192
  end
191
193
 
192
194
  def self.bolt_analytics_config
193
195
  file = PDK::Util::Filesystem.expand_path('~/.puppetlabs/bolt/analytics.yaml')
194
196
  PDK::Config::YAML.new(file: file)
195
197
  rescue PDK::Config::LoadError => e
196
- PDK.logger.debug 'Unable to load %{file}: %{message}' % {
197
- file: file,
198
- message: e.message,
199
- }
198
+ PDK.logger.debug format('Unable to load %{file}: %{message}', file: file, message: e.message)
200
199
  PDK::Config::YAML.new
201
200
  end
202
201
 
@@ -222,7 +221,7 @@ module PDK
222
221
 
223
222
  # return nil if not exist
224
223
  def self.json_schema(name)
225
- File.join(json_schemas_path, name + '_schema.json')
224
+ File.join(json_schemas_path, "#{name}_schema.json")
226
225
  end
227
226
 
228
227
  def self.analytics_config_exist?
@@ -235,24 +234,21 @@ module PDK
235
234
  return unless PDK::CLI::Util.interactive?
236
235
 
237
236
  pre_message =
238
- 'PDK collects anonymous usage information to help us understand how ' \
239
- 'it is being used and make decisions on how to improve it. You can ' \
240
- 'find out more about what data we collect and how it is used in the ' \
241
- "PDK documentation at %{url}.\n" % { url: 'https://puppet.com/docs/pdk/latest/pdk_install.html' }
237
+ format('PDK collects anonymous usage information to help us understand how ' \
238
+ 'it is being used and make decisions on how to improve it. You can ' \
239
+ 'find out more about what data we collect and how it is used in the ' \
240
+ "PDK documentation at %{url}.\n", url: 'https://puppet.com/docs/pdk/latest/pdk_install.html')
242
241
  post_message =
243
- 'You can opt in or out of the usage data collection at any time by ' \
244
- 'editing the analytics configuration file at %{path} and changing ' \
245
- "the '%{key}' value." % {
246
- path: PDK::Config.analytics_config_path,
247
- key: 'disabled',
248
- }
242
+ format('You can opt in or out of the usage data collection at any time by ' \
243
+ 'editing the analytics configuration file at %{path} and changing ' \
244
+ "the '%{key}' value.", path: PDK::Config.analytics_config_path, key: 'disabled')
249
245
 
250
246
  questions = [
251
247
  {
252
- name: 'enabled',
248
+ name: 'enabled',
253
249
  question: 'Do you consent to the collection of anonymous PDK usage information?',
254
- type: :yes,
255
- },
250
+ type: :yes
251
+ }
256
252
  ]
257
253
 
258
254
  require 'pdk/cli/util/interview'
@@ -265,9 +261,9 @@ module PDK
265
261
 
266
262
  if answers.nil?
267
263
  PDK.logger.info 'No answer given, opting out of analytics collection.'
268
- PDK.config.set(%w[user analytics disabled], true)
264
+ PDK.config.set(['user', 'analytics', 'disabled'], true)
269
265
  else
270
- PDK.config.set(%w[user analytics disabled], !answers['enabled'])
266
+ PDK.config.set(['user', 'analytics', 'disabled'], !answers['enabled'])
271
267
  end
272
268
 
273
269
  PDK.logger.info(text: post_message, wrap: true)
@@ -275,7 +271,7 @@ module PDK
275
271
 
276
272
  private
277
273
 
278
- #:nocov: This is a private method and is tested elsewhere
274
+ # :nocov: This is a private method and is tested elsewhere
279
275
  def traverse_object(object, *names)
280
276
  return nil if object.nil? || !object.respond_to?(:[])
281
277
  return nil if names.nil?
@@ -289,25 +285,27 @@ module PDK
289
285
  value = object[name]
290
286
  if names.empty?
291
287
  return value if value.is_a?(PDK::Config::Namespace)
288
+
292
289
  # Duplicate arrays and hashes so that they are isolated from changes being made
293
- (value.is_a?(Hash) || value.is_a?(Array)) ? value.dup : value
290
+ value.is_a?(Hash) || value.is_a?(Array) ? value.dup : value
294
291
  else
295
292
  traverse_object(value, *names)
296
293
  end
297
294
  end
298
- #:nocov:
295
+ # :nocov:
299
296
 
300
- #:nocov: This is a private method and is tested elsewhere
297
+ # :nocov: This is a private method and is tested elsewhere
301
298
  # Takes a string representation of a setting and splits into its constituent setting parts e.g.
302
299
  # 'user.a.b.c' becomes ['user', 'a', 'b', 'c']
303
300
  # @return [Array[String]] The string split into each setting name as an array
304
301
  def split_key_string(key)
305
- raise ArgumentError, 'Expected a String but got \'%{klass}\'' % { klass: key.class } unless key.is_a?(String)
302
+ raise ArgumentError, format('Expected a String but got \'%{klass}\'', klass: key.class) unless key.is_a?(String)
303
+
306
304
  key.split('.')
307
305
  end
308
- #:nocov:
306
+ # :nocov:
309
307
 
310
- #:nocov:
308
+ # :nocov:
311
309
  # Returns all known scope names and their associated method name to call, to query the scope
312
310
  # Note - Order is important. This dictates the resolution precedence order (topmost is processed first)
313
311
  # @return [Hash[String, Symbol]] A hash of the scope name then method name to call to query the scope (as a Symbol)
@@ -315,12 +313,12 @@ module PDK
315
313
  # Note - Order is important. This dictates the resolution precedence order (topmost is processed first)
316
314
  {
317
315
  'project' => :project_config,
318
- 'user' => :user_config,
319
- 'system' => :system_config,
316
+ 'user' => :user_config,
317
+ 'system' => :system_config
320
318
  }.freeze
321
319
  end
322
320
 
323
- #:nocov: This is a private method and is tested elsewhere
321
+ # :nocov: This is a private method and is tested elsewhere
324
322
  # Deeply traverses an object tree via `[]` and sets the last
325
323
  # element to the value specified.
326
324
  #
@@ -333,9 +331,7 @@ module PDK
333
331
  current_value = namespace[name]
334
332
 
335
333
  # If the next thing in the traversal chain is another namespace, set the value using that child namespace.
336
- if current_value.is_a?(PDK::Config::Namespace)
337
- return deep_set_object(value, force, current_value, *names)
338
- end
334
+ return deep_set_object(value, force, current_value, *names) if current_value.is_a?(PDK::Config::Namespace)
339
335
 
340
336
  # We're at the end of the name traversal
341
337
  if names.empty?
@@ -378,11 +374,11 @@ module PDK
378
374
  return value
379
375
  end
380
376
 
381
- raise ArgumentError, "Unable to set '%{key}' to '%{value}' as it is not a Hash" % { key: namespace.name + '.' + name, value: hash_value } unless current_value.is_a?(Hash)
377
+ raise ArgumentError, format("Unable to set '%{key}' to '%{value}' as it is not a Hash", key: "#{namespace.name}.#{name}", value: hash_value) unless current_value.is_a?(Hash)
382
378
 
383
379
  namespace[name] = current_value.merge(hash_value)
384
380
  value
385
381
  end
386
- #:nocov:
382
+ # :nocov:
387
383
  end
388
384
  end
@@ -26,6 +26,7 @@ module PDK
26
26
  # @return [Array[String]] The modulepath setting for this control repository
27
27
  def module_paths
28
28
  return @module_paths unless @module_paths.nil?
29
+
29
30
  value = environment_conf['modulepath'] || ''
30
31
  # We have to use a hardcoded value here because File::PATH_SEPARATOR is ';' on Windows.
31
32
  # As the environment.conf is only used on Puppet Server, it's always ':'
@@ -41,12 +42,12 @@ module PDK
41
42
  .select { |path| PDK::Util::Filesystem.directory?(PDK::Util::Filesystem.expand_path(File.join(root_path, path))) }
42
43
  end
43
44
 
44
- #:nocov:
45
+ # :nocov:
45
46
  # @see PDK::Context::AbstractContext.display_name
46
47
  def display_name
47
48
  'a Control Repository context'
48
49
  end
49
- #:nocov:
50
+ # :nocov:
50
51
 
51
52
  private
52
53
 
@@ -17,12 +17,12 @@ module PDK
17
17
  PDK::Util.module_pdk_compatible?(root_path)
18
18
  end
19
19
 
20
- #:nocov:
20
+ # :nocov:
21
21
  # @see PDK::Context::AbstractContext.display_name
22
22
  def display_name
23
23
  'a Puppet Module context'
24
24
  end
25
- #:nocov:
25
+ # :nocov:
26
26
  end
27
27
  end
28
28
  end
@@ -5,12 +5,12 @@ module PDK
5
5
  # Represents a context which the PDK does not know. For example
6
6
  # an empty directory
7
7
  class None < PDK::Context::AbstractContext
8
- #:nocov:
8
+ # :nocov:
9
9
  # @see PDK::Context::AbstractContext.display_name
10
10
  def display_name
11
11
  'an unknown context'
12
12
  end
13
- #:nocov:
13
+ # :nocov:
14
14
 
15
15
  # @see PDK::Context::AbstractContext.parent_context
16
16
  def parent_context
data/lib/pdk/context.rb CHANGED
@@ -20,9 +20,7 @@ module PDK
20
20
 
21
21
  # Puppet Module detection
22
22
  metadata_file = File.join(current, 'metadata.json')
23
- if PDK::Util::Filesystem.file?(metadata_file) || PDK::Util.in_module_root?(context_path)
24
- return PDK::Context::Module.new(current, context_path)
25
- end
23
+ return PDK::Context::Module.new(current, context_path) if PDK::Util::Filesystem.file?(metadata_file) || PDK::Util.in_module_root?(context_path)
26
24
 
27
25
  previous = current
28
26
  current = PDK::Util::Filesystem.expand_path('..', current)
@@ -82,6 +80,7 @@ module PDK
82
80
  PDK.logger.debug("Detected #{current.display_name} at #{current.root_path.nil? ? current.context_path : current.root_path}")
83
81
  current = current.parent_context
84
82
  break if current.nil?
83
+
85
84
  depth += 1
86
85
  # Circuit breaker in case there are circular references
87
86
  break if depth > 20
@@ -89,11 +88,11 @@ module PDK
89
88
  nil
90
89
  end
91
90
 
92
- #:nocov: There's nothing to test here
91
+ # :nocov: There's nothing to test here
93
92
  def to_s
94
93
  "#<#{self.class}:#{object_id}>#{context_path}"
95
94
  end
96
- #:nocov:
95
+ # :nocov:
97
96
  end
98
97
  end
99
98
  end
@@ -2,7 +2,7 @@ require 'pdk'
2
2
 
3
3
  module PDK
4
4
  module ControlRepo
5
- CONTROL_REPO_FILES = %w[environment.conf Puppetfile].freeze
5
+ CONTROL_REPO_FILES = ['environment.conf', 'Puppetfile'].freeze
6
6
 
7
7
  DEFAULT_IGNORED = [
8
8
  '/pkg/',
@@ -11,7 +11,7 @@ module PDK
11
11
  # Strictly speaking this isn't default but if people have tricked older PDK into thinking that a
12
12
  # Control Repo is a module, they may have recursive symlinks in spec/fixtures/modules
13
13
  '/spec/fixtures/modules/',
14
- '/vendor/',
14
+ '/vendor/'
15
15
  ].freeze
16
16
 
17
17
  # Returns path to the root of the Control Repo being worked on.
@@ -38,10 +38,9 @@ module PDK
38
38
  File.dirname(environment_conf_path)
39
39
  elsif control_repo_root?(Dir.pwd)
40
40
  Dir.pwd
41
- else
42
- nil
43
41
  end
44
42
  return path if path.nil? || !strict_check
43
+
45
44
  PDK::Bolt.bolt_project_root?(path) ? nil : path
46
45
  end
47
46
  module_function :find_control_repo_root
@@ -25,12 +25,12 @@ module PDK
25
25
  define_name_parts = object_name.split('::')
26
26
  # drop the module name if the object name contains multiple parts
27
27
  define_name_parts.delete_at(0) if define_name_parts.length > 1
28
- files = { 'defined_type_spec.erb' => File.join('spec', 'defines', *define_name_parts) + '_spec.rb' }
28
+ files = { 'defined_type_spec.erb' => "#{File.join('spec', 'defines', *define_name_parts)}_spec.rb" }
29
29
  return files if spec_only?
30
30
 
31
- define_name_parts = object_name.split('::')[1..-1]
31
+ define_name_parts = object_name.split('::')[1..]
32
32
  define_name_parts << 'init' if define_name_parts.empty?
33
- files['defined_type.erb'] = File.join('manifests', *define_name_parts) + '.pp'
33
+ files['defined_type.erb'] = "#{File.join('manifests', *define_name_parts)}.pp"
34
34
 
35
35
  files
36
36
  end
@@ -9,11 +9,12 @@ module PDK
9
9
 
10
10
  def template_files
11
11
  files = {
12
- 'fact_spec.erb' => File.join('spec', 'unit', 'facter', object_name) + '_spec.rb',
12
+ 'fact_spec.erb' => "#{File.join('spec', 'unit', 'facter', object_name)}_spec.rb"
13
13
  }
14
14
  return files if spec_only?
15
+
15
16
  files.merge(
16
- 'fact.erb' => File.join('lib', 'facter', object_name) + '.rb',
17
+ 'fact.erb' => "#{File.join('lib', 'facter', object_name)}.rb"
17
18
  )
18
19
  end
19
20
 
@@ -24,16 +24,17 @@ module PDK
24
24
  # Drop the module name if the object name contains multiple parts
25
25
  func_name_parts.delete_at(0) if func_name_parts.length > 1
26
26
  files = {
27
- File.join('functions', 'function_spec.erb') => File.join('spec', 'functions', *func_name_parts) + '_spec.rb',
27
+ File.join('functions', 'function_spec.erb') => "#{File.join('spec', 'functions', *func_name_parts)}_spec.rb"
28
28
  }
29
29
  return files if spec_only?
30
- func_name_parts = object_name.split('::')[1..-1]
30
+
31
+ func_name_parts = object_name.split('::')[1..]
31
32
  template_file = File.join('functions', "#{options[:type]}_function.erb")
32
33
 
33
34
  files[template_file] = if options[:type].eql?('v4')
34
- File.join('lib', 'puppet', 'functions', module_name, *func_name_parts) + '.rb'
35
+ "#{File.join('lib', 'puppet', 'functions', module_name, *func_name_parts)}.rb"
35
36
  else
36
- File.join('functions', *func_name_parts) + '.pp'
37
+ "#{File.join('functions', *func_name_parts)}.pp"
37
38
  end
38
39
  files
39
40
  end