puppetlabs_spec_helper 2.14.1 → 4.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.
data/HISTORY.md CHANGED
@@ -450,7 +450,7 @@ compatible yet.
450
450
  ### Added
451
451
  * Initial release
452
452
 
453
- [unreleased]: https://github.com/puppetlabs/puppetlabs_spec_helper/compare/v2.8.0...master
453
+ [unreleased]: https://github.com/puppetlabs/puppetlabs_spec_helper/compare/v2.8.0...main
454
454
  [2.8.0]: https://github.com/puppetlabs/puppetlabs_spec_helper/compare/v2.7.0...v2.8.0
455
455
  [2.7.0]: https://github.com/puppetlabs/puppetlabs_spec_helper/compare/v2.6.2...v2.7.0
456
456
  [2.6.2]: https://github.com/puppetlabs/puppetlabs_spec_helper/compare/v2.6.1...v2.6.2
data/README.md CHANGED
@@ -59,7 +59,7 @@ Host github.com
59
59
 
60
60
  ```
61
61
 
62
- Note: parallel downloads is only available for repositories and not forge modules.
62
+ Note: parallel downloads are available for repositories and forge modules.
63
63
 
64
64
  ### Parallel tests
65
65
  It is also possible to use the `parallel_tests` Gem via the `:parallel_spec` Rake task to run rspec commands in parallel on groups of spec files.
@@ -102,10 +102,10 @@ This project is intended to serve two purposes:
102
102
  To Use this Project
103
103
  ===================
104
104
 
105
- The most common usage scenario is that you will check out the 'master'
105
+ The most common usage scenario is that you will check out the 'main'
106
106
  branch of this project from github, and install it as a rubygem.
107
107
  There should be few or no cases where you would want to have any other
108
- branch of this project besides master/HEAD.
108
+ branch of this project besides main/HEAD.
109
109
 
110
110
  Running on non-current ruby versions
111
111
  ------------------------------------
@@ -156,7 +156,7 @@ variables for the spec run. These are:
156
156
  * ``TRUSTED_NODE_DATA`` _(Puppet 3.x, starting with 3.4)_ - set to "yes" to enable [the $facts hash and trusted node data](https://puppet.com/docs/puppet/3.8/lang_facts_and_builtin_vars.html#trusted-facts),
157
157
  which enabled ``$facts`` and ``$trusted`` hashes. This is equivalent to setting
158
158
  [trusted_node_data=true](https://puppet.com/docs/puppet/3.8/configuration.html#trustednodedata)
159
- in puppet.conf.
159
+ in puppet.conf.
160
160
  * ``STRINGIFY_FACTS`` _(Puppet 3.x, starting with 3.5)_ - set to "no" to enable [structured facts](http://docs.puppetlabs.com/facter/2.0/fact_overview.html#writing-structured-facts),
161
161
  otherwise leave unset to retain the current default behavior. This is equivalent to setting
162
162
  [stringify_facts=false](https://puppet.com/docs/puppet/3.8/configuration.html#stringifyfacts)
@@ -203,7 +203,7 @@ When specifying the repo source of the fixture you have a few options as to whic
203
203
 
204
204
  * `target` - the directory name to clone the repo into ie. `target: mymodule` defaults to the repo name (Optional)
205
205
  * `subdir` - directory to be removed from the cloned repo. Its contents will be moved to the root directory (Optional)
206
- * `ref` - used to specify the tag name like version hash of commit (Optional)
206
+ * `ref` - used to specify the tag name (like version) or commit hash to be checked out (Optional). Branch names should use the `branch` option instead.
207
207
 
208
208
  ```yaml
209
209
  ref: 1.0.0
@@ -335,6 +335,10 @@ fixtures:
335
335
  ref: "2.6.0"
336
336
  ```
337
337
 
338
+ Fixture Loading
339
+ ---------------
340
+ Any module that has a `spec/lib` directory will be available on the ruby `LOAD_PATH` for tests to consume. This allows modules to provide additional helper code to be supplied. The [augeasprovider_core](https://github.com/hercules-team/augeasproviders_core) module has [some examples](https://github.com/hercules-team/augeasproviders_core/tree/master/spec/lib).
341
+
338
342
  Testing Parser Functions
339
343
  ========================
340
344
 
@@ -389,7 +393,7 @@ environment variable``TEST_TIERS=high,medium``
389
393
 
390
394
  By default ``TEST_TIERS`` only accepts low, medium and high as valid tiers. If you would like to use your own keywords to set the environment variable ``TEST_TIERS_ALLOWED``.
391
395
 
392
- For example: to use the keywords dev, rnd, staging and production you can set
396
+ For example: to use the keywords dev, rnd, staging and production you can set
393
397
  ``TEST_TIERS_ALLOWED=dev,rnd,staging,production``. Then you would be able to run tests marked ``tier_dev => true``, ``tier_production => true`` with ``TEST_TIERS=dev,production``
394
398
 
395
399
  Note, if the ``TEST_TIERS`` environment variable is set to empty string or nil, all tiers will be executed.
@@ -416,34 +420,7 @@ You can enable it, set the following environment variable:s
416
420
 
417
421
  ``SIMPLECOV=yes``
418
422
 
419
- Remember to add the simplecov-console and codecov gems to your `Gemfile`.
420
-
421
- Using Coveralls
422
- ---------------
423
-
424
- You can also use [Coveralls](https://coveralls.io/) together with SimpleCov:
425
-
426
- ```Ruby
427
- # First line of spec/spec_helper.rb
428
- require 'simplecov'
429
- require 'coveralls'
430
-
431
- SimpleCov.formatters = [
432
- SimpleCov::Formatter::HTMLFormatter,
433
- Coveralls::SimpleCov::Formatter
434
- ]
435
-
436
- SimpleCov.start do
437
- add_filter '/spec/'
438
- # Exclude bundled Gems in `/.vendor/`
439
- add_filter '/.vendor/'
440
- end
441
-
442
- require 'puppetlabs_spec_helper/module_spec_helper'
443
- # Further content
444
- ```
445
-
446
- Remember to add `gem 'coveralls', require: false` to your `Gemfile`.
423
+ Remember to add the simplecov-console and codecov gems to your `Gemfile`. If you run `spec:simplecov` on Travis-CI or any of the other supported CI services, reports gets automatically uploaded to https://codecov.io/ .
447
424
 
448
425
  Some Notes for Windows Users
449
426
  ============================
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rspec-puppet'
2
4
  require 'puppetlabs_spec_helper/puppet_spec_helper'
3
5
  require 'puppetlabs_spec_helper/puppetlabs_spec/puppet_internals'
@@ -50,6 +52,14 @@ if ENV['SIMPLECOV'] == 'yes'
50
52
  end
51
53
  end
52
54
 
55
+ # Add all spec lib dirs to LOAD_PATH
56
+ components = module_path.split(File::PATH_SEPARATOR).collect do |dir|
57
+ Dir.entries(dir).reject { |f| f =~ %r{^\.} }.collect { |f| File.join(dir, f, 'spec', 'lib') }
58
+ end
59
+ components.flatten.each do |d|
60
+ $LOAD_PATH << d if FileTest.directory?(d) && !$LOAD_PATH.include?(d)
61
+ end
62
+
53
63
  RSpec.configure do |c|
54
64
  c.environmentpath = spec_path if Puppet.version.to_f >= 4.0
55
65
  c.module_path = module_path
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'puppetlabs_spec_helper/puppetlabs_spec_helper'
2
4
 
3
5
  # Don't want puppet getting the command line arguments for rake or autotest
@@ -45,7 +47,7 @@ require 'puppetlabs_spec_helper/puppetlabs_spec/files'
45
47
  # to compatibility mode for older versions of puppet.
46
48
  begin
47
49
  require 'puppet/test/test_helper'
48
- rescue LoadError => err
50
+ rescue LoadError
49
51
  end
50
52
 
51
53
  # This is just a utility class to allow us to isolate the various version-specific
@@ -58,7 +60,7 @@ module Puppet
58
60
  # Puppet's Settings singleton object, and other fun implementation details
59
61
  # that code external to puppet should really never know about.
60
62
  def self.initialize_via_fallback_compatibility(config)
61
- $stderr.puts('Warning: you appear to be using an older version of puppet; spec_helper will use fallback compatibility mode.')
63
+ warn('Warning: you appear to be using an older version of puppet; spec_helper will use fallback compatibility mode.')
62
64
  config.before :all do
63
65
  # nothing to do for now
64
66
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fileutils'
2
4
  require 'tempfile'
3
5
  require 'pathname'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This module provides some helper methods to assist with fixtures. It's
2
4
  # methods are designed to help when you have a conforming fixture layout so we
3
5
  # get project consistency.
@@ -14,6 +16,7 @@ module PuppetlabsSpec::Fixtures
14
16
  callers = caller
15
17
  while line = callers.shift
16
18
  next unless found = line.match(%r{/spec/(.*)_spec\.rb:})
19
+
17
20
  return fixtures(found[1])
18
21
  end
19
22
  raise "sorry, I couldn't work out your path from the caller stack!"
@@ -26,6 +29,7 @@ module PuppetlabsSpec::Fixtures
26
29
  unless File.readable? file
27
30
  raise "fixture '#{name}' for #{my_fixture_dir} is not readable"
28
31
  end
32
+
29
33
  file
30
34
  end
31
35
 
@@ -37,12 +41,13 @@ module PuppetlabsSpec::Fixtures
37
41
 
38
42
  # Provides a block mechanism for iterating across the files in your fixture
39
43
  # area.
40
- def my_fixtures(glob = '*', flags = 0)
44
+ def my_fixtures(glob = '*', flags = 0, &block)
41
45
  files = Dir.glob(File.join(my_fixture_dir, glob), flags)
42
46
  if files.empty?
43
47
  raise "fixture '#{glob}' for #{my_fixture_dir} had no files!"
44
48
  end
45
- block_given? && files.each { |file| yield file }
49
+
50
+ block_given? && files.each(&block)
46
51
  files
47
52
  end
48
53
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'stringio'
2
4
  require 'rspec/expectations'
3
5
 
@@ -6,8 +8,8 @@ require 'rspec/expectations'
6
8
  module RSpec
7
9
  module Matchers
8
10
  module BlockAliases
9
- if method_defined? :should
10
- alias to should unless method_defined? :to
11
+ if method_defined?(:should) && !method_defined?(:to)
12
+ alias to should
11
13
  end
12
14
  if method_defined? :should_not
13
15
  alias to_not should_not unless method_defined? :to_not
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Initialize puppet for testing by loading the
2
4
  # 'puppetlabs_spec_helper/puppet_spec_helper' library
3
5
  require 'puppetlabs_spec_helper/puppet_spec_helper'
@@ -10,7 +12,7 @@ module PuppetlabsSpec
10
12
  def scope(parts = {})
11
13
  RSpec.deprecate('scope', replacement: 'rspec-puppet 2.2.0 provides a scope property')
12
14
 
13
- if Puppet.version =~ %r{^2\.[67]}
15
+ if %r{^2\.[67]}.match?(Puppet.version)
14
16
  # loadall should only be necessary prior to 3.x
15
17
  # Please note, loadall needs to happen first when creating a scope, otherwise
16
18
  # you might receive undefined method `function_*' errors
@@ -21,7 +23,7 @@ module PuppetlabsSpec
21
23
  scope_parent = parts[:parent] || scope_compiler.topscope
22
24
  scope_resource = parts[:resource] || resource(type: :node, title: scope_compiler.node.name)
23
25
 
24
- scope = if Puppet.version =~ %r{^2\.[67]}
26
+ scope = if %r{^2\.[67]}.match?(Puppet.version)
25
27
  Puppet::Parser::Scope.new(compiler: scope_compiler)
26
28
  else
27
29
  Puppet::Parser::Scope.new(scope_compiler)
@@ -67,6 +69,7 @@ module PuppetlabsSpec
67
69
  # exists. This is a hack, but at least it's a hidden hack and not an
68
70
  # exposed hack.
69
71
  return nil unless Puppet::Parser::Functions.function(name)
72
+
70
73
  scope.method("function_#{name}".intern)
71
74
  end
72
75
  module_function :function_method
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Define the main module namespace for use by the helper modules
2
4
  module PuppetlabsSpec
3
5
  # FIXTURE_DIR represents the standard locations of all fixture data. Normally
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fileutils'
2
4
  require 'rake'
3
5
  require 'rspec/core/rake_task'
4
6
  require 'tmpdir'
5
7
  require 'pathname'
6
8
  require 'puppetlabs_spec_helper/version'
7
- require 'puppetlabs_spec_helper/tasks/beaker'
8
9
  require 'puppetlabs_spec_helper/tasks/fixtures'
9
10
  require 'puppetlabs_spec_helper/tasks/check_symlinks'
10
11
  require 'English'
@@ -53,6 +54,7 @@ RSpec::Core::RakeTask.new(:spec_standalone) do |t, args|
53
54
  ci_total = ENV['CI_NODE_TOTAL'].to_i
54
55
  ci_index = ENV['CI_NODE_INDEX'].to_i
55
56
  raise "CI_NODE_INDEX must be between 1-#{ci_total}" unless ci_index >= 1 && ci_index <= ci_total
57
+
56
58
  files = Rake::FileList[pattern].to_a
57
59
  per_node = (files.size / ci_total.to_f).ceil
58
60
  t.pattern = if args.extras.nil? || args.extras.empty?
@@ -108,16 +110,17 @@ end
108
110
  desc 'Parallel spec tests'
109
111
  task :parallel_spec_standalone do |_t, args|
110
112
  raise 'Add the parallel_tests gem to Gemfile to enable this task' unless parallel_tests_loaded
113
+
111
114
  if Rake::FileList[pattern].to_a.empty?
112
115
  warn 'No files for parallel_spec to run against'
113
116
  else
114
- begin
115
- args = ['-t', 'rspec']
116
- args.push('--').concat(ENV['CI_SPEC_OPTIONS'].strip.split(' ')).push('--') unless ENV['CI_SPEC_OPTIONS'].nil? || ENV['CI_SPEC_OPTIONS'].strip.empty?
117
- args.concat(Rake::FileList[pattern].to_a)
118
117
 
119
- ParallelTests::CLI.new.run(args)
120
- end
118
+ args = ['-t', 'rspec']
119
+ args.push('--').concat(ENV['CI_SPEC_OPTIONS'].strip.split(' ')).push('--') unless ENV['CI_SPEC_OPTIONS'].nil? || ENV['CI_SPEC_OPTIONS'].strip.empty?
120
+ args.concat(Rake::FileList[pattern].to_a)
121
+
122
+ ParallelTests::CLI.new.run(args)
123
+
121
124
  end
122
125
  end
123
126
 
@@ -142,14 +145,15 @@ namespace :build do
142
145
  desc 'Build Puppet module with PDK'
143
146
  task :pdk do
144
147
  begin
148
+ require 'pdk/util'
145
149
  require 'pdk/module/build'
146
150
 
147
- path = PDK::Module::Build.invoke(:force => true, :'target-dir' => File.join(Dir.pwd, 'pkg'))
151
+ path = PDK::Module::Build.invoke(force: true, 'target-dir': File.join(Dir.pwd, 'pkg'))
148
152
  puts "Module built: #{path}"
149
153
  rescue LoadError
150
154
  _ = `pdk --version`
151
155
  unless $CHILD_STATUS.success?
152
- $stderr.puts 'Unable to build module. Please install PDK or add the `pdk` gem to your Gemfile.'
156
+ warn 'Unable to build module. Please install PDK or add the `pdk` gem to your Gemfile.'
153
157
  abort
154
158
  end
155
159
 
@@ -167,52 +171,34 @@ require 'puppet-lint/tasks/puppet-lint'
167
171
  # Must clear as it will not override the existing puppet-lint rake task since we require to import for
168
172
  # the PuppetLint::RakeTask
169
173
  Rake::Task[:lint].clear
170
- # Relative is not able to be set within the context of PuppetLint::RakeTask
174
+ # Utilize PuppetLint global configuration so that these settings can be tweaked by
175
+ # spec_helper.rb in an individual module
171
176
  PuppetLint.configuration.relative = true
172
- PuppetLint::RakeTask.new(:lint) do |config|
173
- config.fail_on_warnings = true
174
- config.disable_checks = %w[
175
- 80chars
176
- 140chars
177
- class_inherits_from_params_class
178
- class_parameter_defaults
179
- disable_autoloader_layout
180
- documentation
181
- single_quote_string_with_variables
182
- ]
183
- config.ignore_paths = [
184
- '.vendor/**/*.pp',
185
- 'bundle/**/*.pp',
186
- 'pkg/**/*.pp',
187
- 'spec/**/*.pp',
188
- 'tests/**/*.pp',
189
- 'types/**/*.pp',
190
- 'vendor/**/*.pp',
191
- ]
177
+ PuppetLint.configuration.ignore_paths ||= []
178
+ PuppetLint.configuration.ignore_paths << '.vendor/**/*.pp'
179
+ PuppetLint.configuration.ignore_paths << 'bundle/**/*.pp'
180
+ PuppetLint.configuration.ignore_paths << 'pkg/**/*.pp'
181
+ PuppetLint.configuration.ignore_paths << 'spec/**/*.pp'
182
+ PuppetLint.configuration.ignore_paths << 'tests/**/*.pp'
183
+ PuppetLint.configuration.ignore_paths << 'types/**/*.pp'
184
+ PuppetLint.configuration.ignore_paths << 'vendor/**/*.pp'
185
+ puppet_lint_disable_checks = %w[
186
+ 80chars
187
+ 140chars
188
+ class_inherits_from_params_class
189
+ class_parameter_defaults
190
+ disable_autoloader_layout
191
+ documentation
192
+ single_quote_string_with_variables
193
+ ]
194
+ puppet_lint_disable_checks.each do |check|
195
+ PuppetLint.configuration.send("disable_#{check}")
192
196
  end
197
+ PuppetLint::RakeTask.new(:lint)
193
198
 
194
199
  desc 'Run puppet-lint and fix issues automatically'
195
200
  PuppetLint::RakeTask.new(:lint_fix) do |config|
196
- config.fail_on_warnings = true
197
201
  config.fix = true
198
- config.disable_checks = %w[
199
- 80chars
200
- 140chars
201
- class_inherits_from_params_class
202
- class_parameter_defaults
203
- disable_autoloader_layout
204
- documentation
205
- single_quote_string_with_variables
206
- ]
207
- config.ignore_paths = [
208
- '.vendor/**/*.pp',
209
- 'bundle/**/*.pp',
210
- 'pkg/**/*.pp',
211
- 'spec/**/*.pp',
212
- 'tests/**/*.pp',
213
- 'types/**/*.pp',
214
- 'vendor/**/*.pp',
215
- ]
216
202
  end
217
203
 
218
204
  require 'puppet-syntax/tasks/puppet-syntax'
@@ -220,7 +206,8 @@ PuppetSyntax.exclude_paths ||= []
220
206
  PuppetSyntax.exclude_paths << 'spec/fixtures/**/*'
221
207
  PuppetSyntax.exclude_paths << 'pkg/**/*'
222
208
  PuppetSyntax.exclude_paths << 'vendor/**/*'
223
- PuppetSyntax.exclude_paths << 'plans/*'
209
+ PuppetSyntax.exclude_paths << '.vendor/**/*'
210
+ PuppetSyntax.exclude_paths << 'plans/**/*'
224
211
  if Puppet.version.to_f < 4.0
225
212
  PuppetSyntax.exclude_paths << 'types/**/*'
226
213
  end
@@ -261,7 +248,7 @@ task :compute_dev_version do
261
248
  version = modinfo['version']
262
249
  elsif File.exist?('Modulefile')
263
250
  modfile = File.read('Modulefile')
264
- version = modfile.match(%r{\nversion[ ]+['"](.*)['"]})[1]
251
+ version = modfile.match(%r{\nversion +['"](.*)['"]})[1]
265
252
  else
266
253
  raise 'Could not find a metadata.json or Modulefile! Cannot compute dev version without one or the other!'
267
254
  end
@@ -271,14 +258,14 @@ task :compute_dev_version do
271
258
 
272
259
  # If we're in a CI environment include our build number
273
260
  # If the branch is a release branch we append an 'r' into the new_version,
274
- # this is due to the release branch buildID conflicting with master branch when trying to push to the staging forge.
261
+ # this is due to the release branch buildID conflicting with main branch when trying to push to the staging forge.
275
262
  # More info can be found at https://tickets.puppetlabs.com/browse/FM-6170
276
- new_version = if build = ENV['BUILD_NUMBER'] || ENV['TRAVIS_BUILD_NUMBER']
263
+ new_version = if build = (ENV['BUILD_NUMBER'] || ENV['TRAVIS_BUILD_NUMBER'])
277
264
  if branch.eql? 'release'
278
- '%s-%s%04d-%s' % [version, 'r', build, sha]
265
+ '%s-%s%04d-%s' % [version, 'r', build, sha] # legacy support code # rubocop:disable Style/FormatStringToken
279
266
  else
280
- '%s-%04d-%s' % [version, build, sha]
281
- end
267
+ '%s-%04d-%s' % [version, build, sha] # legacy support code # rubocop:disable Style/FormatStringToken
268
+ end
282
269
  else
283
270
  "#{version}-#{sha}"
284
271
  end
@@ -295,10 +282,7 @@ task :release_checks do
295
282
  else
296
283
  Rake::Task[:spec].invoke
297
284
  end
298
- Rake::Task['check:symlinks'].invoke
299
- Rake::Task['check:test_file'].invoke
300
- Rake::Task['check:dot_underscore'].invoke
301
- Rake::Task['check:git_ignore'].invoke
285
+ Rake::Task[:check].invoke
302
286
  end
303
287
 
304
288
  namespace :check do
@@ -339,6 +323,9 @@ namespace :check do
339
323
  end
340
324
  end
341
325
 
326
+ desc 'Run static pre release checks'
327
+ task check: ['check:symlinks', 'check:test_file', 'check:dot_underscore', 'check:git_ignore']
328
+
342
329
  desc 'Display the list of available rake tasks'
343
330
  task :help do
344
331
  system('rake -T')
@@ -349,6 +336,14 @@ begin
349
336
  RuboCop::RakeTask.new(:rubocop) do |task|
350
337
  # These make the rubocop experience maybe slightly less terrible
351
338
  task.options = ['-D', '-S', '-E']
339
+
340
+ # Use Rubocop's Github Actions formatter if possible
341
+ if ENV['GITHUB_ACTIONS'] == 'true'
342
+ rubocop_spec = Gem::Specification.find_by_name('rubocop')
343
+ if Gem::Version.new(rubocop_spec.version) >= Gem::Version.new('1.2')
344
+ task.formatters << 'github'
345
+ end
346
+ end
352
347
  end
353
348
  rescue LoadError
354
349
  desc 'rubocop is not available in this installation'
@@ -357,25 +352,83 @@ rescue LoadError
357
352
  end
358
353
  end
359
354
 
360
- module_dir = Dir.pwd
361
- locales_dir = File.absolute_path('locales', module_dir)
362
- # if the task is allowed to run when the module does not have a locales directory,
363
- # the task is run in the puppet gem instead and creates a POT there.
364
- puts 'gettext-setup tasks will only be loaded if the locales/ directory is present' if Rake.verbose == true
365
- if File.exist? locales_dir
366
- begin
367
- spec = Gem::Specification.find_by_name 'gettext-setup'
368
- load "#{spec.gem_dir}/lib/tasks/gettext.rake"
369
- # Initialization requires a valid locales directory
370
- GettextSetup.initialize_config(locales_dir)
371
- namespace :module do
372
- desc 'Runs all tasks to build a modules POT file for internationalization'
373
- task :pot_gen do
374
- Rake::Task['gettext:pot'].invoke
375
- Rake::Task['gettext:metadata_pot'].invoke("#{module_dir}/metadata.json")
355
+ def create_gch_task(changelog_user = nil, changelog_project = nil, changelog_since_tag = nil, changelog_tag_pattern = 'v%s')
356
+ if Bundler.rubygems.find_name('github_changelog_generator').any?
357
+ # needed a place to hide these methods
358
+ # rubocop:disable Lint/NestedMethodDefinition
359
+ def changelog_user_from_metadata
360
+ result = JSON.parse(File.read('metadata.json'))['author']
361
+ raise 'unable to find the changelog_user in .sync.yml, or the author in metadata.json' if result.nil?
362
+
363
+ puts "GitHubChangelogGenerator user:#{result}"
364
+ result
365
+ end
366
+
367
+ def changelog_project_from_metadata
368
+ result = JSON.parse(File.read('metadata.json'))['name']
369
+ raise 'unable to find the changelog_project in .sync.yml or the name in metadata.json' if result.nil?
370
+
371
+ puts "GitHubChangelogGenerator project:#{result}"
372
+ result
373
+ end
374
+
375
+ def changelog_future_release
376
+ return unless Rake.application.top_level_tasks.include? 'changelog'
377
+
378
+ result = JSON.parse(File.read('metadata.json'))['version']
379
+ raise 'unable to find the future_release (version) in metadata.json' if result.nil?
380
+
381
+ puts "GitHubChangelogGenerator future_release:#{result}"
382
+ result
383
+ end
384
+ # rubocop:enable Lint/NestedMethodDefinition
385
+
386
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
387
+ if ENV['CHANGELOG_GITHUB_TOKEN'].nil?
388
+ raise "Set CHANGELOG_GITHUB_TOKEN environment variable eg 'export CHANGELOG_GITHUB_TOKEN=valid_token_here'"
376
389
  end
390
+
391
+ config.user = changelog_user || changelog_user_from_metadata
392
+ config.project = changelog_project || changelog_project_from_metadata
393
+ config.since_tag = changelog_since_tag if changelog_since_tag
394
+ config.future_release = changelog_tag_pattern % changelog_future_release.to_s
395
+ config.exclude_labels = ['maintenance']
396
+ config.header = "# Change log\n\nAll notable changes to this project will be documented in this file. " \
397
+ 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres ' \
398
+ 'to [Semantic Versioning](https://semver.org).'
399
+ config.add_pr_wo_labels = true
400
+ config.issues = false
401
+ config.merge_prefix = '### UNCATEGORIZED PRS; GO LABEL THEM'
402
+ config.configure_sections = {
403
+ 'Changed' => {
404
+ 'prefix' => '### Changed',
405
+ 'labels' => ['backwards-incompatible'],
406
+ },
407
+ 'Added' => {
408
+ 'prefix' => '### Added',
409
+ 'labels' => %w[feature enhancement],
410
+ },
411
+ 'Fixed' => {
412
+ 'prefix' => '### Fixed',
413
+ 'labels' => ['bugfix'],
414
+ },
415
+ }
416
+ end
417
+ else
418
+ desc 'Generate a Changelog from GitHub'
419
+ task :changelog do
420
+ raise <<~MESSAGE
421
+ The changelog tasks depends on unreleased features of the github_changelog_generator gem.
422
+ Please manually add it to your .sync.yml for now, and run `pdk update`:
423
+ ---
424
+ Gemfile:
425
+ optional:
426
+ ':development':
427
+ - gem: 'github_changelog_generator'
428
+ git: 'https://github.com/skywinder/github-changelog-generator'
429
+ ref: '20ee04ba1234e9e83eb2ffb5056e23d641c7a018'
430
+ condition: "Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.2.2')"
431
+ MESSAGE
377
432
  end
378
- rescue Gem::LoadError
379
- puts 'No gettext-setup gem found, skipping GettextSetup config initialization' if Rake.verbose == true
380
433
  end
381
434
  end