pdk-akerl 1.8.0.1

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 (81) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +826 -0
  3. data/LICENSE +201 -0
  4. data/README.md +133 -0
  5. data/exe/pdk +10 -0
  6. data/lib/pdk.rb +10 -0
  7. data/lib/pdk/answer_file.rb +121 -0
  8. data/lib/pdk/cli.rb +113 -0
  9. data/lib/pdk/cli/build.rb +76 -0
  10. data/lib/pdk/cli/bundle.rb +42 -0
  11. data/lib/pdk/cli/convert.rb +41 -0
  12. data/lib/pdk/cli/errors.rb +23 -0
  13. data/lib/pdk/cli/exec.rb +246 -0
  14. data/lib/pdk/cli/exec_group.rb +67 -0
  15. data/lib/pdk/cli/module.rb +14 -0
  16. data/lib/pdk/cli/module/build.rb +14 -0
  17. data/lib/pdk/cli/module/generate.rb +45 -0
  18. data/lib/pdk/cli/new.rb +17 -0
  19. data/lib/pdk/cli/new/class.rb +32 -0
  20. data/lib/pdk/cli/new/defined_type.rb +30 -0
  21. data/lib/pdk/cli/new/module.rb +41 -0
  22. data/lib/pdk/cli/new/provider.rb +27 -0
  23. data/lib/pdk/cli/new/task.rb +31 -0
  24. data/lib/pdk/cli/test.rb +12 -0
  25. data/lib/pdk/cli/test/unit.rb +88 -0
  26. data/lib/pdk/cli/update.rb +32 -0
  27. data/lib/pdk/cli/util.rb +193 -0
  28. data/lib/pdk/cli/util/command_redirector.rb +26 -0
  29. data/lib/pdk/cli/util/interview.rb +63 -0
  30. data/lib/pdk/cli/util/option_normalizer.rb +53 -0
  31. data/lib/pdk/cli/util/option_validator.rb +56 -0
  32. data/lib/pdk/cli/validate.rb +124 -0
  33. data/lib/pdk/generate.rb +11 -0
  34. data/lib/pdk/generate/defined_type.rb +49 -0
  35. data/lib/pdk/generate/module.rb +318 -0
  36. data/lib/pdk/generate/provider.rb +82 -0
  37. data/lib/pdk/generate/puppet_class.rb +48 -0
  38. data/lib/pdk/generate/puppet_object.rb +288 -0
  39. data/lib/pdk/generate/task.rb +86 -0
  40. data/lib/pdk/i18n.rb +4 -0
  41. data/lib/pdk/logger.rb +28 -0
  42. data/lib/pdk/module.rb +21 -0
  43. data/lib/pdk/module/build.rb +214 -0
  44. data/lib/pdk/module/convert.rb +209 -0
  45. data/lib/pdk/module/metadata.rb +193 -0
  46. data/lib/pdk/module/templatedir.rb +313 -0
  47. data/lib/pdk/module/update.rb +111 -0
  48. data/lib/pdk/module/update_manager.rb +210 -0
  49. data/lib/pdk/report.rb +112 -0
  50. data/lib/pdk/report/event.rb +357 -0
  51. data/lib/pdk/template_file.rb +89 -0
  52. data/lib/pdk/tests/unit.rb +213 -0
  53. data/lib/pdk/util.rb +271 -0
  54. data/lib/pdk/util/bundler.rb +253 -0
  55. data/lib/pdk/util/filesystem.rb +12 -0
  56. data/lib/pdk/util/git.rb +74 -0
  57. data/lib/pdk/util/puppet_version.rb +242 -0
  58. data/lib/pdk/util/ruby_version.rb +147 -0
  59. data/lib/pdk/util/vendored_file.rb +88 -0
  60. data/lib/pdk/util/version.rb +42 -0
  61. data/lib/pdk/util/windows.rb +13 -0
  62. data/lib/pdk/util/windows/api_types.rb +57 -0
  63. data/lib/pdk/util/windows/file.rb +36 -0
  64. data/lib/pdk/util/windows/string.rb +16 -0
  65. data/lib/pdk/validate.rb +14 -0
  66. data/lib/pdk/validate/base_validator.rb +209 -0
  67. data/lib/pdk/validate/metadata/metadata_json_lint.rb +86 -0
  68. data/lib/pdk/validate/metadata/metadata_syntax.rb +109 -0
  69. data/lib/pdk/validate/metadata_validator.rb +30 -0
  70. data/lib/pdk/validate/puppet/puppet_lint.rb +67 -0
  71. data/lib/pdk/validate/puppet/puppet_syntax.rb +112 -0
  72. data/lib/pdk/validate/puppet_validator.rb +30 -0
  73. data/lib/pdk/validate/ruby/rubocop.rb +77 -0
  74. data/lib/pdk/validate/ruby_validator.rb +29 -0
  75. data/lib/pdk/validate/tasks/metadata_lint.rb +126 -0
  76. data/lib/pdk/validate/tasks/name.rb +88 -0
  77. data/lib/pdk/validate/tasks_validator.rb +33 -0
  78. data/lib/pdk/version.rb +4 -0
  79. data/locales/config.yaml +21 -0
  80. data/locales/pdk.pot +1283 -0
  81. metadata +304 -0
@@ -0,0 +1,89 @@
1
+ require 'ostruct'
2
+
3
+ module PDK
4
+ class TemplateFile < OpenStruct
5
+ # Initialises the TemplateFile object with the path to the template file
6
+ # and the data to be used when rendering the template.
7
+ #
8
+ # @param template_file [String] The path on disk to the template file.
9
+ # @param data [Hash{Symbol => Object}] The data that should be provided to
10
+ # the template when rendering.
11
+ # @option data [Object] :configs The value of this key will be provided to
12
+ # the template as an instance variable `@configs` in order to maintain
13
+ # compatibility with modulesync.
14
+ #
15
+ # @api public
16
+ def initialize(template_file, data = {})
17
+ @template_file = template_file
18
+
19
+ if data.key?(:configs)
20
+ @configs = data[:configs]
21
+ end
22
+
23
+ super(data)
24
+ end
25
+
26
+ # Renders the template by calling the appropriate engine based on the file
27
+ # extension.
28
+ #
29
+ # If the template has an `.erb` extension, the content of the template
30
+ # file will be treated as an ERB template. All other extensions are treated
31
+ # as plain text.
32
+ #
33
+ # @return [String] The rendered template
34
+ #
35
+ # @raise (see #template_content)
36
+ #
37
+ # @api public
38
+ def render
39
+ case File.extname(@template_file)
40
+ when '.erb'
41
+ render_erb
42
+ else
43
+ render_plain
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ # Reads the content of the template file into memory.
50
+ #
51
+ # @return [String] The content of the template file.
52
+ #
53
+ # @raise [ArgumentError] If the template file does not exist or can not be
54
+ # read.
55
+ #
56
+ # @api private
57
+ def template_content
58
+ if File.file?(@template_file) && File.readable?(@template_file)
59
+ return File.read(@template_file)
60
+ end
61
+
62
+ raise ArgumentError, _("'%{template}' is not a readable file") % { template: @template_file }
63
+ end
64
+
65
+ # Renders the content of the template file as an ERB template.
66
+ #
67
+ # @return [String] The rendered template.
68
+ #
69
+ # @raise (see #template_content)
70
+ #
71
+ # @api private
72
+ def render_erb
73
+ renderer = ERB.new(template_content, nil, '-')
74
+ renderer.filename = @template_file
75
+ renderer.result(binding)
76
+ end
77
+
78
+ # Renders the content of the template file as plain text.
79
+ #
80
+ # @return [String] The rendered template.
81
+ #
82
+ # @raise (see #template_content)
83
+ #
84
+ # @api private
85
+ def render_plain
86
+ template_content
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,213 @@
1
+ require 'pdk'
2
+ require 'pdk/cli/exec'
3
+ require 'pdk/util/bundler'
4
+ require 'json'
5
+
6
+ module PDK
7
+ module Test
8
+ class Unit
9
+ def self.cmd(tests, opts = {})
10
+ rake_args = opts.key?(:parallel) ? 'parallel_spec_standalone' : 'spec_standalone'
11
+ rake_args += "[#{tests}]" unless tests.nil?
12
+ rake_args
13
+ end
14
+
15
+ def self.rake_bin
16
+ @rake ||= File.join(PDK::Util.module_root, 'bin', 'rake')
17
+ end
18
+
19
+ def self.rake(task, spinner_text, environment = {})
20
+ argv = [rake_bin, task]
21
+ argv.unshift(File.join(PDK::Util::RubyVersion.bin_path, 'ruby.exe')) if Gem.win_platform?
22
+
23
+ command = PDK::CLI::Exec::Command.new(*argv).tap do |c|
24
+ c.context = :module
25
+ c.add_spinner(spinner_text)
26
+ c.environment = environment
27
+ end
28
+
29
+ command.execute!
30
+ end
31
+
32
+ def self.parallel_with_no_tests?(ran_in_parallel, json_result, result)
33
+ ran_in_parallel && json_result.empty? &&
34
+ ((!result[:exit_code].zero? && result[:stderr].strip =~ %r{Pass files or folders to run$}) ||
35
+ result[:stderr].strip =~ %r{No files for parallel_spec to run against$})
36
+ end
37
+
38
+ def self.print_failure(result, exception)
39
+ $stderr.puts ''
40
+ result[:stdout].each_line { |line| $stderr.puts line.rstrip } unless result[:stdout].nil?
41
+ result[:stderr].each_line { |line| $stderr.puts line.rstrip } unless result[:stderr].nil?
42
+ $stderr.puts ''
43
+ raise PDK::CLI::FatalError, exception
44
+ end
45
+
46
+ def self.tear_down
47
+ result = rake('spec_clean', _('Cleaning up after running unit tests.'))
48
+
49
+ return if result[:exit_code].zero?
50
+
51
+ PDK.logger.error(_('The spec_clean rake task failed with the following error(s):'))
52
+ print_failure(result, _('Failed to clean up after running unit tests'))
53
+ end
54
+
55
+ def self.setup
56
+ result = rake('spec_prep', _('Preparing to run the unit tests.'))
57
+
58
+ return if result[:exit_code].zero?
59
+
60
+ tear_down
61
+
62
+ PDK.logger.error(_('The spec_prep rake task failed with the following error(s):'))
63
+ print_failure(result, _('Failed to prepare to run the unit tests.'))
64
+ end
65
+
66
+ def self.invoke(report, options = {})
67
+ PDK::Util::Bundler.ensure_binstubs!('rake', 'rspec-core')
68
+
69
+ setup
70
+
71
+ tests = options.fetch(:tests)
72
+
73
+ environment = { 'CI_SPEC_OPTIONS' => '--format j' }
74
+ environment['PUPPET_GEM_VERSION'] = options[:puppet] if options[:puppet]
75
+ spinner_msg = options.key?(:parallel) ? _('Running unit tests in parallel.') : _('Running unit tests.')
76
+ result = rake(cmd(tests, options), spinner_msg, environment)
77
+
78
+ json_result = if options.key?(:parallel)
79
+ PDK::Util.find_all_json_in(result[:stdout])
80
+ else
81
+ PDK::Util.find_first_json_in(result[:stdout])
82
+ end
83
+
84
+ if parallel_with_no_tests?(options.key?(:parallel), json_result, result)
85
+ json_result = [{ 'messages' => ['No examples found.'] }]
86
+ result[:exit_code] = 0
87
+ end
88
+
89
+ raise PDK::CLI::FatalError, _('Unit test output did not contain a valid JSON result: %{output}') % { output: result[:stdout] } if json_result.nil? || json_result.empty?
90
+
91
+ json_result = merge_json_results(json_result) if options.key?(:parallel)
92
+
93
+ parse_output(report, json_result, result[:duration])
94
+
95
+ result[:exit_code]
96
+ ensure
97
+ tear_down if options[:'clean-fixtures']
98
+ end
99
+
100
+ def self.parse_output(report, json_data, duration)
101
+ # Output messages to stderr.
102
+ json_data['messages'] && json_data['messages'].each { |msg| $stderr.puts msg }
103
+
104
+ example_results = {
105
+ # Only possibilities are passed, failed, pending:
106
+ # https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/example.rb#L548
107
+ 'passed' => [],
108
+ 'failed' => [],
109
+ 'pending' => [],
110
+ }
111
+
112
+ json_data['examples'] && json_data['examples'].each do |ex|
113
+ example_results[ex['status']] << ex if example_results.key?(ex['status'])
114
+ end
115
+
116
+ example_results.each do |result, examples|
117
+ # Translate rspec example results to JUnit XML testcase results
118
+ state = case result
119
+ when 'passed' then :passed
120
+ when 'failed' then :failure
121
+ when 'pending' then :skipped
122
+ end
123
+
124
+ examples.each do |ex|
125
+ report.add_event(
126
+ source: 'rspec',
127
+ state: state,
128
+ file: ex['file_path'],
129
+ line: ex['line_number'],
130
+ test: ex['full_description'],
131
+ severity: ex['status'],
132
+ message: ex['pending_message'] || (ex['exception'] && ex['exception']['message']) || nil,
133
+ trace: (ex['exception'] && ex['exception']['backtrace']) || nil,
134
+ )
135
+ end
136
+ end
137
+
138
+ return unless json_data['summary']
139
+
140
+ # TODO: standardize summary output
141
+ $stderr.puts ' ' << _('Evaluated %{total} tests in %{duration} seconds: %{failures} failures, %{pending} pending.') % {
142
+ total: json_data['summary']['example_count'],
143
+ duration: duration,
144
+ failures: json_data['summary']['failure_count'],
145
+ pending: json_data['summary']['pending_count'],
146
+ }
147
+ end
148
+
149
+ def self.merge_json_results(json_data)
150
+ merged_json_result = {}
151
+
152
+ # Merge messages
153
+ message_set = Set.new
154
+ json_data.each do |json|
155
+ next unless json['messages']
156
+ message_set |= json['messages']
157
+ end
158
+ merged_json_result['messages'] = message_set.to_a
159
+
160
+ # Merge examples
161
+ all_examples = []
162
+ json_data.each do |json|
163
+ next unless json['examples']
164
+ all_examples.concat json['examples']
165
+ end
166
+ merged_json_result['examples'] = all_examples
167
+
168
+ # Merge summaries
169
+ summary_hash = {
170
+ 'example_count' => 0,
171
+ 'failure_count' => 0,
172
+ 'pending_count' => 0,
173
+ }
174
+ json_data.each do |json|
175
+ next unless json['summary']
176
+ summary_hash['example_count'] += json['summary']['example_count']
177
+ summary_hash['failure_count'] += json['summary']['failure_count']
178
+ summary_hash['pending_count'] += json['summary']['pending_count']
179
+ end
180
+ merged_json_result['summary'] = summary_hash
181
+
182
+ merged_json_result
183
+ end
184
+
185
+ # @return array of { :id, :full_description }
186
+ def self.list
187
+ PDK::Util::Bundler.ensure_binstubs!('rake')
188
+
189
+ command_argv = [File.join(PDK::Util.module_root, 'bin', 'rake'), 'spec_list_json']
190
+ command_argv.unshift(File.join(PDK::Util::RubyVersion.bin_path, 'ruby.exe')) if Gem.win_platform?
191
+
192
+ list_command = PDK::CLI::Exec::Command.new(*command_argv)
193
+ list_command.context = :module
194
+ output = list_command.execute!
195
+
196
+ rspec_json = PDK::Util.find_first_json_in(output[:stdout])
197
+ raise PDK::CLI::FatalError, _('Failed to find valid JSON in output from rspec: %{output}' % { output: output[:stdout] }) unless rspec_json
198
+ if rspec_json['examples'].empty?
199
+ rspec_message = rspec_json['messages'][0]
200
+ return [] if rspec_message == 'No examples found.'
201
+
202
+ raise PDK::CLI::FatalError, _('Unable to enumerate examples. rspec reported: %{message}' % { message: rspec_message })
203
+ else
204
+ examples = []
205
+ rspec_json['examples'].each do |example|
206
+ examples << { file_path: example['file_path'], id: example['id'], full_description: example['full_description'] }
207
+ end
208
+ examples
209
+ end
210
+ end
211
+ end
212
+ end
213
+ end
data/lib/pdk/util.rb ADDED
@@ -0,0 +1,271 @@
1
+ require 'tmpdir'
2
+ require 'tempfile'
3
+
4
+ require 'pdk/util/version'
5
+ require 'pdk/util/windows'
6
+ require 'pdk/util/vendored_file'
7
+ require 'pdk/util/filesystem'
8
+
9
+ module PDK
10
+ module Util
11
+ MODULE_FOLDERS = %w[
12
+ manifests
13
+ lib
14
+ tasks
15
+ facts.d
16
+ functions
17
+ types
18
+ ].freeze
19
+
20
+ # Searches upwards from current working directory for the given target file.
21
+ #
22
+ # @param target [String] Name of file to search for.
23
+ # @param start_dir [String] Directory to start searching from, defaults to Dir.pwd
24
+ #
25
+ # @return [String, nil] Fully qualified path to the given target file if found,
26
+ # nil if the target file could not be found.
27
+ def find_upwards(target, start_dir = nil)
28
+ previous = nil
29
+ current = File.expand_path(start_dir || Dir.pwd)
30
+
31
+ until !File.directory?(current) || current == previous
32
+ filename = File.join(current, target)
33
+ return filename if File.file?(filename)
34
+ previous = current
35
+ current = File.expand_path('..', current)
36
+ end
37
+ end
38
+ module_function :find_upwards
39
+
40
+ # Generate a name for a temporary directory.
41
+ #
42
+ # @param base [String] A string to base the name generation off.
43
+ #
44
+ # @return [String] The temporary directory path.
45
+ def make_tmpdir_name(base)
46
+ t = Time.now.strftime('%Y%m%d')
47
+ name = "#{base}#{t}-#{Process.pid}-#{rand(0x100000000).to_s(36)}"
48
+ File.join(Dir.tmpdir, name)
49
+ end
50
+ module_function :make_tmpdir_name
51
+
52
+ # Return an expanded, absolute path
53
+ #
54
+ # @param path [String] Existing path that may not be canonical
55
+ #
56
+ # @return [String] Canonical path
57
+ def canonical_path(path)
58
+ if Gem.win_platform?
59
+ unless File.exist?(path)
60
+ raise PDK::CLI::FatalError, _("Cannot resolve a full path to '%{path}', as it does not currently exist.") % { path: path }
61
+ end
62
+ PDK::Util::Windows::File.get_long_pathname(path)
63
+ else
64
+ File.expand_path(path)
65
+ end
66
+ end
67
+ module_function :canonical_path
68
+
69
+ def package_install?
70
+ !PDK::Util::Version.version_file.nil?
71
+ end
72
+ module_function :package_install?
73
+
74
+ def development_mode?
75
+ (!PDK::Util::Version.git_ref.nil? || PDK::VERSION.end_with?('.pre'))
76
+ end
77
+ module_function :development_mode?
78
+
79
+ def gem_install?
80
+ !(package_install? || development_mode?)
81
+ end
82
+ module_function :gem_install?
83
+
84
+ def pdk_package_basedir
85
+ raise PDK::CLI::FatalError, _('Package basedir requested for non-package install.') unless package_install?
86
+
87
+ File.dirname(PDK::Util::Version.version_file)
88
+ end
89
+ module_function :pdk_package_basedir
90
+
91
+ def package_cachedir
92
+ File.join(pdk_package_basedir, 'share', 'cache')
93
+ end
94
+ module_function :package_cachedir
95
+
96
+ # Returns the fully qualified path to a per-user PDK cachedir.
97
+ #
98
+ # @return [String] Fully qualified path to per-user PDK cachedir.
99
+ def cachedir
100
+ if Gem.win_platform?
101
+ File.join(ENV['LOCALAPPDATA'], 'PDK', 'cache')
102
+ else
103
+ File.join(Dir.home, '.pdk', 'cache')
104
+ end
105
+ end
106
+ module_function :cachedir
107
+
108
+ # Returns path to the root of the module being worked on.
109
+ #
110
+ # @return [String, nil] Fully qualified base path to module, or nil if
111
+ # the current working dir does not appear to be within a module.
112
+ def module_root
113
+ metadata_path = find_upwards('metadata.json')
114
+ if metadata_path
115
+ File.dirname(metadata_path)
116
+ elsif in_module_root?
117
+ Dir.pwd
118
+ else
119
+ nil
120
+ end
121
+ end
122
+ module_function :module_root
123
+
124
+ # Returns true or false depending on if any of the common directories in a module
125
+ # are found in the current directory
126
+ #
127
+ # @return [boolean] True if any folders from MODULE_FOLDERS are found in the current dir,
128
+ # false otherwise.
129
+ def in_module_root?
130
+ PDK::Util::MODULE_FOLDERS.any? { |dir| File.directory?(dir) }
131
+ end
132
+ module_function :in_module_root?
133
+
134
+ # Iterate through possible JSON documents until we find one that is valid.
135
+ #
136
+ # @param [String] text the text in which to find a JSON document
137
+ # @return [Hash, nil] subset of text as Hash of first valid JSON found, or nil if no valid
138
+ # JSON found in the text
139
+ def find_first_json_in(text)
140
+ find_valid_json_in(text)
141
+ end
142
+ module_function :find_first_json_in
143
+
144
+ # Iterate through possible JSON documents for all valid JSON
145
+ #
146
+ # @param [String] text the text in which to find JSON document(s)
147
+ # @return [Array<Hash>] subset of text as Array of all JSON object found, empty Array if none are found
148
+ # JSON found in the text
149
+ def find_all_json_in(text)
150
+ find_valid_json_in(text, break_on_first: false)
151
+ end
152
+ module_function :find_all_json_in
153
+
154
+ # Iterate through possible JSON documents until we find one that is valid.
155
+ #
156
+ # @param [String] text the text in which to find a JSON document
157
+ # @param [Hash] opts options
158
+ # @option opts [Boolean] :break_on_first Whether or not to break after valid JSON is found, defaults to true
159
+ #
160
+ # @return [Hash, Array<Hash>, nil] subset of text as Hash of first valid JSON found, array of all valid JSON found, or nil if no valid
161
+ # JSON found in the text
162
+ #
163
+ # @private
164
+ def find_valid_json_in(text, opts = {})
165
+ break_on_first = opts.key?(:break_on_first) ? opts[:break_on_first] : true
166
+
167
+ json_result = break_on_first ? nil : []
168
+
169
+ text.scan(%r{\{(?:[^{}]|(?:\g<0>))*\}}x) do |str|
170
+ begin
171
+ if break_on_first
172
+ json_result = JSON.parse(str)
173
+ break
174
+ else
175
+ json_result.push(JSON.parse(str))
176
+ end
177
+ rescue JSON::ParserError
178
+ next
179
+ end
180
+ end
181
+
182
+ json_result
183
+ end
184
+ module_function :find_valid_json_in
185
+
186
+ # Returns the targets' paths relative to the working directory
187
+ #
188
+ # @return [Array<String>] The absolute or path to the target
189
+ def targets_relative_to_pwd(targets)
190
+ targets.map do |t|
191
+ if Pathname.new(t).absolute?
192
+ Pathname.new(t).relative_path_from(Pathname.pwd)
193
+ else
194
+ t
195
+ end
196
+ end
197
+ end
198
+ module_function :targets_relative_to_pwd
199
+
200
+ def default_template_url
201
+ answer_file_url = PDK.answers['template-url']
202
+
203
+ return puppetlabs_template_url if answer_file_url.nil?
204
+
205
+ # Ignore answer file template-url if the value is the old or new default.
206
+ return puppetlabs_template_url if answer_file_url == 'https://github.com/puppetlabs/pdk-module-template'
207
+ return puppetlabs_template_url if answer_file_url == puppetlabs_template_url
208
+
209
+ unless PDK::Util::Git.repo?(answer_file_url)
210
+ PDK.logger.warn(_("Unable to access the previously used template '%{template}', using the default template instead.") % { template: answer_file_url })
211
+ PDK.answers.update!('template-url' => nil)
212
+ return puppetlabs_template_url
213
+ end
214
+
215
+ answer_file_url
216
+ end
217
+ module_function :default_template_url
218
+
219
+ def puppetlabs_template_url
220
+ if package_install?
221
+ 'file://' + File.join(package_cachedir, 'pdk-templates.git')
222
+ else
223
+ 'https://github.com/puppetlabs/pdk-templates'
224
+ end
225
+ end
226
+ module_function :puppetlabs_template_url
227
+
228
+ def default_template_ref
229
+ # TODO: This should respect a --template-ref option if we add that
230
+ return 'origin/master' if default_template_url != puppetlabs_template_url
231
+
232
+ puppetlabs_template_ref
233
+ end
234
+ module_function :default_template_ref
235
+
236
+ def puppetlabs_template_ref
237
+ if PDK::Util.development_mode?
238
+ 'origin/master'
239
+ else
240
+ PDK::TEMPLATE_REF
241
+ end
242
+ end
243
+ module_function :puppetlabs_template_ref
244
+
245
+ # TO-DO: Refactor replacement of lib/pdk/module/build.rb:metadata to use this function instead
246
+ def module_metadata
247
+ PDK::Module::Metadata.from_file(File.join(module_root, 'metadata.json')).data
248
+ end
249
+ module_function :module_metadata
250
+
251
+ # TO-DO: Refactor replacement of lib/pdk/module/build.rb:module_pdk_compatible? to use this function instead
252
+ def module_pdk_compatible?
253
+ ['pdk-version', 'template-url'].any? { |key| module_metadata.key?(key) }
254
+ end
255
+ module_function :module_pdk_compatible?
256
+
257
+ def module_pdk_version
258
+ metadata = module_metadata
259
+
260
+ if metadata.nil? || metadata.fetch('pdk-version', nil).nil?
261
+ nil
262
+ else
263
+ metadata['pdk-version'].split.first
264
+ end
265
+ rescue ArgumentError => e
266
+ PDK.logger.error(e)
267
+ nil
268
+ end
269
+ module_function :module_pdk_version
270
+ end
271
+ end