diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dacc2ff..0311717 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,43 +1,46 @@ name: "release" on: push: branches: - 'release' jobs: LitmusAcceptance: + env: + HONEYCOMB_WRITEKEY: 7f3c63a70eecc61d635917de46bea4e6 + HONEYCOMB_DATASET: litmus tests runs-on: self-hosted strategy: matrix: ruby_version: [2.5.x] puppet_gem_version: [~> 6.0] platform: [release_checks] agent_family: ['puppet5', 'puppet6'] steps: - uses: actions/checkout@v1 - name: Litmus Parallel uses: puppetlabs/action-litmus_parallel@master with: platform: ${{ matrix.platform }} agent_family: ${{ matrix.agent_family }} Spec: runs-on: self-hosted strategy: matrix: check: [parallel_spec, 'syntax lint metadata_lint check:symlinks check:git_ignore check:dot_underscore check:test_file rubocop'] ruby_version: [2.5.x] puppet_gem_version: [~> 5.0, ~> 6.0] exclude: - puppet_gem_version: ~> 5.0 check: 'syntax lint metadata_lint check:symlinks check:git_ignore check:dot_underscore check:test_file rubocop' - ruby_version: 2.5.x puppet_gem_version: ~> 5.0 steps: - uses: actions/checkout@v1 - name: Spec Tests uses: puppetlabs/action-litmus_spec@master with: puppet_gem_version: ${{ matrix.puppet_gem_version }} check: ${{ matrix.check }} diff --git a/.sync.yml b/.sync.yml index 7868ec2..c573291 100644 --- a/.sync.yml +++ b/.sync.yml @@ -1,135 +1,137 @@ --- ".gitlab-ci.yml": delete: true ".travis.yml": + global_env: + - HONEYCOMB_WRITEKEY="7f3c63a70eecc61d635917de46bea4e6",HONEYCOMB_DATASET="litmus tests" dist: trusty deploy_to_forge: enabled: false branches: - release includes: - bundler_args: dist: trusty env: PLATFORMS=deb_puppet5 rvm: 2.5.3 before_script: - bundle exec rake 'litmus:provision_list[travis_deb]' - bundle exec bolt command run 'apt-get install wget -y' --inventoryfile inventory.yaml --nodes='localhost*' - bundle exec rake 'litmus:install_agent[puppet5]' - bundle exec rake litmus:install_module script: - bundle exec rake litmus:acceptance:parallel services: docker stage: acceptance sudo: required - bundler_args: dist: trusty env: PLATFORMS=deb_puppet6 rvm: 2.5.3 before_script: - bundle exec rake 'litmus:provision_list[travis_deb]' - bundle exec bolt command run 'apt-get install wget -y' --inventoryfile inventory.yaml --nodes='localhost*' - bundle exec rake 'litmus:install_agent[puppet6]' - bundle exec rake litmus:install_module script: - bundle exec rake litmus:acceptance:parallel services: docker sudo: required stage: acceptance - bundler_args: dist: trusty env: PLATFORMS=ub_puppet5 rvm: 2.5.3 before_script: - bundle exec rake 'litmus:provision_list[travis_ub]' - bundle exec bolt command run 'apt-get install wget -y' --inventoryfile inventory.yaml --nodes='localhost*' - bundle exec rake 'litmus:install_agent[puppet5]' - bundle exec rake litmus:install_module script: - bundle exec rake litmus:acceptance:parallel services: docker stage: acceptance sudo: required - bundler_args: dist: trusty env: PLATFORMS=ub_puppet6 rvm: 2.5.3 before_script: - bundle exec rake 'litmus:provision_list[travis_ub]' - bundle exec bolt command run 'apt-get install wget -y' --inventoryfile inventory.yaml --nodes='localhost*' - bundle exec rake 'litmus:install_agent[puppet6]' - bundle exec rake litmus:install_module script: - bundle exec rake litmus:acceptance:parallel services: docker sudo: required stage: acceptance - bundler_args: dist: trusty env: PLATFORMS=el6_puppet5 rvm: 2.5.3 before_script: - bundle exec rake 'litmus:provision_list[travis_el6]' - bundle exec rake 'litmus:install_agent[puppet5]' - bundle exec rake litmus:install_module script: - bundle exec rake litmus:acceptance:parallel services: docker sudo: required stage: acceptance - bundler_args: dist: trusty env: PLATFORMS=el6_puppet6 rvm: 2.5.3 before_script: - bundle exec rake 'litmus:provision_list[travis_el6]' - bundle exec rake 'litmus:install_agent[puppet6]' - bundle exec rake litmus:install_module script: - bundle exec rake litmus:acceptance:parallel services: docker sudo: required stage: acceptance - bundler_args: dist: trusty env: PLATFORMS=el7_puppet5 rvm: 2.5.3 before_script: - bundle exec rake 'litmus:provision_list[travis_el7]' - bundle exec rake 'litmus:install_agent[puppet5]' - bundle exec rake litmus:install_module script: - bundle exec rake litmus:acceptance:parallel services: docker sudo: required stage: acceptance - bundler_args: dist: trusty env: PLATFORMS=el7_puppet6 rvm: 2.5.3 before_script: - bundle exec rake 'litmus:provision_list[travis_el7]' - bundle exec rake 'litmus:install_agent[puppet6]' - bundle exec rake litmus:install_module script: - bundle exec rake litmus:acceptance:parallel services: docker sudo: required stage: acceptance simplecov: true notifications: slack: secure: >- NeHtAtZH+/xvLTp04VMI5PqKa7EhoZD4xipzbV/BeA8xMxuwW70K3KsgkTJNsUojnLJwM4Ypn1s9F+nNRymHm+4qwFNeSG/mZYMMsNs9x6Do6PMSWYR1Q6ICoJ4q4hYW50x0+F04SMYyfU8cYzh7k9JuDyyqgQFtzjG3CZDWUgq17JVhqutIhkYv4geiRnbJcLcPUtW1vPPD8vN7ugeCG7wZxPoT/aAGE5UIuoU3Sdlur93R4XpU7+TcY02bWj0mARC4GK4eRlPgyj6hNOG4fhQRkgGxhwJwxMzOvNIDkziLN2ce9NOH4vSykv3uzTLTwr8RmSDyLYL91b/jms2dTfc0JG5D7nCAP2W4m4X2dE+olP0aTLFHysL3Wck4dyqrElNQaYFg0KNc8n3n6z2ldPxYWyuCGbYt51eOIcxJwXy08NfgnzYhUBL6bnr0cq7JAW//EaHX949x/6UPApyvOk3jSSQf8AngEcRfSydXXAH0cGa6iQRFkbGcy4KqLvGBjMudMKGzb63wuo4GuAU5hppOhW6g+L2U3C9NefhZd9FNNM6JR/bUWEC6roRMt17PZyK407CuTVai0oxGVHbTJTOXdEXFhnIHf35lurCTdCWeKNCzFJUVwOHTGVZ1bP44L9cqNiZ16lG+KJfJdk3uvaY3715eY29u0Y9S51zu7s4= appveyor.yml: delete: true Gemfile: optional: ":development": - gem: github_changelog_generator git: https://github.com/skywinder/github-changelog-generator ref: 20ee04ba1234e9e83eb2ffb5056e23d641c7a018 condition: Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.2.2') spec/spec_helper.rb: mock_with: ":rspec" coverage_report: true diff --git a/.travis.yml b/.travis.yml index aaf2fc6..ad03014 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,124 +1,128 @@ --- dist: trusty language: ruby cache: bundler before_install: - bundle -v - rm -f Gemfile.lock - "# Update system gems if requested. This is useful to temporarily workaround troubles in the test runner" - "# See https://github.com/puppetlabs/pdk-templates/commit/705154d5c437796b821691b707156e1b056d244f for an example of how this was used" - - '[ -z "$RUBYGEMS_VERSION" ] || gem update --system $RUBYGEMS_VERSION' + - "# Ignore exit code of SIGPIPE'd yes to not fail with shell's pipefail set" + - '[ -z "$RUBYGEMS_VERSION" ] || (yes || true) | gem update --system $RUBYGEMS_VERSION' - gem --version - bundle -v script: - 'SIMPLECOV=yes bundle exec rake $CHECK' bundler_args: --without system_tests rvm: - 2.5.3 +env: + global: + - HONEYCOMB_WRITEKEY="7f3c63a70eecc61d635917de46bea4e6",HONEYCOMB_DATASET="litmus tests" stages: - static - spec - acceptance matrix: fast_finish: true include: - env: CHECK="check:symlinks check:git_ignore check:dot_underscore check:test_file rubocop syntax lint metadata_lint" stage: static - env: PUPPET_GEM_VERSION="~> 5.0" CHECK=parallel_spec rvm: 2.4.5 stage: spec - env: PUPPET_GEM_VERSION="~> 6.0" CHECK=parallel_spec rvm: 2.5.3 stage: spec - before_script: ["bundle exec rake 'litmus:provision_list[travis_deb]'", "bundle exec bolt command run 'apt-get install wget -y' --inventoryfile inventory.yaml --nodes='localhost*'", "bundle exec rake 'litmus:install_agent[puppet5]'", "bundle exec rake litmus:install_module"] bundler_args: dist: trusty env: PLATFORMS=deb_puppet5 rvm: 2.5.3 script: ["bundle exec rake litmus:acceptance:parallel"] services: docker stage: acceptance sudo: required - before_script: ["bundle exec rake 'litmus:provision_list[travis_deb]'", "bundle exec bolt command run 'apt-get install wget -y' --inventoryfile inventory.yaml --nodes='localhost*'", "bundle exec rake 'litmus:install_agent[puppet6]'", "bundle exec rake litmus:install_module"] bundler_args: dist: trusty env: PLATFORMS=deb_puppet6 rvm: 2.5.3 script: ["bundle exec rake litmus:acceptance:parallel"] services: docker stage: acceptance sudo: required - before_script: ["bundle exec rake 'litmus:provision_list[travis_ub]'", "bundle exec bolt command run 'apt-get install wget -y' --inventoryfile inventory.yaml --nodes='localhost*'", "bundle exec rake 'litmus:install_agent[puppet5]'", "bundle exec rake litmus:install_module"] bundler_args: dist: trusty env: PLATFORMS=ub_puppet5 rvm: 2.5.3 script: ["bundle exec rake litmus:acceptance:parallel"] services: docker stage: acceptance sudo: required - before_script: ["bundle exec rake 'litmus:provision_list[travis_ub]'", "bundle exec bolt command run 'apt-get install wget -y' --inventoryfile inventory.yaml --nodes='localhost*'", "bundle exec rake 'litmus:install_agent[puppet6]'", "bundle exec rake litmus:install_module"] bundler_args: dist: trusty env: PLATFORMS=ub_puppet6 rvm: 2.5.3 script: ["bundle exec rake litmus:acceptance:parallel"] services: docker stage: acceptance sudo: required - before_script: ["bundle exec rake 'litmus:provision_list[travis_el6]'", "bundle exec rake 'litmus:install_agent[puppet5]'", "bundle exec rake litmus:install_module"] bundler_args: dist: trusty env: PLATFORMS=el6_puppet5 rvm: 2.5.3 script: ["bundle exec rake litmus:acceptance:parallel"] services: docker stage: acceptance sudo: required - before_script: ["bundle exec rake 'litmus:provision_list[travis_el6]'", "bundle exec rake 'litmus:install_agent[puppet6]'", "bundle exec rake litmus:install_module"] bundler_args: dist: trusty env: PLATFORMS=el6_puppet6 rvm: 2.5.3 script: ["bundle exec rake litmus:acceptance:parallel"] services: docker stage: acceptance sudo: required - before_script: ["bundle exec rake 'litmus:provision_list[travis_el7]'", "bundle exec rake 'litmus:install_agent[puppet5]'", "bundle exec rake litmus:install_module"] bundler_args: dist: trusty env: PLATFORMS=el7_puppet5 rvm: 2.5.3 script: ["bundle exec rake litmus:acceptance:parallel"] services: docker stage: acceptance sudo: required - before_script: ["bundle exec rake 'litmus:provision_list[travis_el7]'", "bundle exec rake 'litmus:install_agent[puppet6]'", "bundle exec rake litmus:install_module"] bundler_args: dist: trusty env: PLATFORMS=el7_puppet6 rvm: 2.5.3 script: ["bundle exec rake litmus:acceptance:parallel"] services: docker stage: acceptance sudo: required branches: only: - master - /^v\d/ - release notifications: email: false slack: secure: NeHtAtZH+/xvLTp04VMI5PqKa7EhoZD4xipzbV/BeA8xMxuwW70K3KsgkTJNsUojnLJwM4Ypn1s9F+nNRymHm+4qwFNeSG/mZYMMsNs9x6Do6PMSWYR1Q6ICoJ4q4hYW50x0+F04SMYyfU8cYzh7k9JuDyyqgQFtzjG3CZDWUgq17JVhqutIhkYv4geiRnbJcLcPUtW1vPPD8vN7ugeCG7wZxPoT/aAGE5UIuoU3Sdlur93R4XpU7+TcY02bWj0mARC4GK4eRlPgyj6hNOG4fhQRkgGxhwJwxMzOvNIDkziLN2ce9NOH4vSykv3uzTLTwr8RmSDyLYL91b/jms2dTfc0JG5D7nCAP2W4m4X2dE+olP0aTLFHysL3Wck4dyqrElNQaYFg0KNc8n3n6z2ldPxYWyuCGbYt51eOIcxJwXy08NfgnzYhUBL6bnr0cq7JAW//EaHX949x/6UPApyvOk3jSSQf8AngEcRfSydXXAH0cGa6iQRFkbGcy4KqLvGBjMudMKGzb63wuo4GuAU5hppOhW6g+L2U3C9NefhZd9FNNM6JR/bUWEC6roRMt17PZyK407CuTVai0oxGVHbTJTOXdEXFhnIHf35lurCTdCWeKNCzFJUVwOHTGVZ1bP44L9cqNiZ16lG+KJfJdk3uvaY3715eY29u0Y9S51zu7s4= diff --git a/Gemfile b/Gemfile index 0e395e7..4f6e33b 100644 --- a/Gemfile +++ b/Gemfile @@ -1,73 +1,73 @@ source ENV['GEM_SOURCE'] || 'https://rubygems.org' def location_for(place_or_version, fake_version = nil) git_url_regex = %r{\A(?(https?|git)[:@][^#]*)(#(?.*))?} file_url_regex = %r{\Afile:\/\/(?.*)} if place_or_version && (git_url = place_or_version.match(git_url_regex)) [fake_version, { git: git_url[:url], branch: git_url[:branch], require: false }].compact elsif place_or_version && (file_url = place_or_version.match(file_url_regex)) ['>= 0', { path: File.expand_path(file_url[:path]), require: false }] else [place_or_version, { require: false }] end end ruby_version_segments = Gem::Version.new(RUBY_VERSION.dup).segments minor_version = ruby_version_segments[0..1].join('.') group :development do gem "fast_gettext", '1.1.0', require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.1.0') gem "fast_gettext", require: false if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.1.0') gem "json_pure", '<= 2.0.1', require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.0.0') gem "json", '= 1.8.1', require: false if Gem::Version.new(RUBY_VERSION.dup) == Gem::Version.new('2.1.9') gem "json", '= 2.0.4', require: false if Gem::Requirement.create('~> 2.4.2').satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) gem "json", '= 2.1.0', require: false if Gem::Requirement.create(['>= 2.5.0', '< 2.7.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) gem "rb-readline", '= 0.5.5', require: false, platforms: [:mswin, :mingw, :x64_mingw] - gem "puppet-module-posix-default-r#{minor_version}", '~> 0.3', require: false, platforms: [:ruby] - gem "puppet-module-posix-dev-r#{minor_version}", '~> 0.3', require: false, platforms: [:ruby] - gem "puppet-module-win-default-r#{minor_version}", '~> 0.3', require: false, platforms: [:mswin, :mingw, :x64_mingw] - gem "puppet-module-win-dev-r#{minor_version}", '~> 0.3', require: false, platforms: [:mswin, :mingw, :x64_mingw] + gem "puppet-module-posix-default-r#{minor_version}", '~> 0.4', require: false, platforms: [:ruby] + gem "puppet-module-posix-dev-r#{minor_version}", '~> 0.4', require: false, platforms: [:ruby] + gem "puppet-module-win-default-r#{minor_version}", '~> 0.4', require: false, platforms: [:mswin, :mingw, :x64_mingw] + gem "puppet-module-win-dev-r#{minor_version}", '~> 0.4', require: false, platforms: [:mswin, :mingw, :x64_mingw] gem "github_changelog_generator", require: false, git: 'https://github.com/skywinder/github-changelog-generator', ref: '20ee04ba1234e9e83eb2ffb5056e23d641c7a018' if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.2.2') end puppet_version = ENV['PUPPET_GEM_VERSION'] facter_version = ENV['FACTER_GEM_VERSION'] hiera_version = ENV['HIERA_GEM_VERSION'] gems = {} gems['puppet'] = location_for(puppet_version) # If facter or hiera versions have been specified via the environment # variables gems['facter'] = location_for(facter_version) if facter_version gems['hiera'] = location_for(hiera_version) if hiera_version if Gem.win_platform? && puppet_version =~ %r{^(file:///|git://)} # If we're using a Puppet gem on Windows which handles its own win32-xxx gem # dependencies (>= 3.5.0), set the maximum versions (see PUP-6445). gems['win32-dir'] = ['<= 0.4.9', require: false] gems['win32-eventlog'] = ['<= 0.6.5', require: false] gems['win32-process'] = ['<= 0.7.5', require: false] gems['win32-security'] = ['<= 0.2.5', require: false] gems['win32-service'] = ['0.8.8', require: false] end gems.each do |gem_name, gem_params| gem gem_name, *gem_params end # Evaluate Gemfile.local and ~/.gemfile if they exist extra_gemfiles = [ "#{__FILE__}.local", File.join(Dir.home, '.gemfile'), ] extra_gemfiles.each do |gemfile| if File.file?(gemfile) && File.readable?(gemfile) eval(File.read(gemfile), binding) end end # vim: syntax=ruby diff --git a/Rakefile b/Rakefile index 395df54..cb7ed0c 100644 --- a/Rakefile +++ b/Rakefile @@ -1,86 +1,88 @@ +# frozen_string_literal: true + require 'puppet_litmus/rake_tasks' if Bundler.rubygems.find_name('puppet_litmus').any? require 'puppetlabs_spec_helper/rake_tasks' require 'puppet-syntax/tasks/puppet-syntax' require 'puppet_blacksmith/rake_tasks' if Bundler.rubygems.find_name('puppet-blacksmith').any? require 'github_changelog_generator/task' if Bundler.rubygems.find_name('github_changelog_generator').any? require 'puppet-strings/tasks' if Bundler.rubygems.find_name('puppet-strings').any? def changelog_user return unless Rake.application.top_level_tasks.include? "changelog" returnVal = nil || JSON.load(File.read('metadata.json'))['author'] raise "unable to find the changelog_user in .sync.yml, or the author in metadata.json" if returnVal.nil? puts "GitHubChangelogGenerator user:#{returnVal}" returnVal end def changelog_project return unless Rake.application.top_level_tasks.include? "changelog" returnVal = nil returnVal ||= begin metadata_source = JSON.load(File.read('metadata.json'))['source'] metadata_source_match = metadata_source && metadata_source.match(%r{.*\/([^\/]*?)(?:\.git)?\Z}) metadata_source_match && metadata_source_match[1] end raise "unable to find the changelog_project in .sync.yml or calculate it from the source in metadata.json" if returnVal.nil? puts "GitHubChangelogGenerator project:#{returnVal}" returnVal end def changelog_future_release return unless Rake.application.top_level_tasks.include? "changelog" returnVal = "v%s" % JSON.load(File.read('metadata.json'))['version'] raise "unable to find the future_release (version) in metadata.json" if returnVal.nil? puts "GitHubChangelogGenerator future_release:#{returnVal}" returnVal end PuppetLint.configuration.send('disable_relative') if Bundler.rubygems.find_name('github_changelog_generator').any? GitHubChangelogGenerator::RakeTask.new :changelog do |config| raise "Set CHANGELOG_GITHUB_TOKEN environment variable eg 'export CHANGELOG_GITHUB_TOKEN=valid_token_here'" if Rake.application.top_level_tasks.include? "changelog" and ENV['CHANGELOG_GITHUB_TOKEN'].nil? config.user = "#{changelog_user}" config.project = "#{changelog_project}" config.future_release = "#{changelog_future_release}" config.exclude_labels = ['maintenance'] config.header = "# Change log\n\nAll notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org)." config.add_pr_wo_labels = true config.issues = false config.merge_prefix = "### UNCATEGORIZED PRS; GO LABEL THEM" config.configure_sections = { "Changed" => { "prefix" => "### Changed", "labels" => ["backwards-incompatible"], }, "Added" => { "prefix" => "### Added", "labels" => ["feature", "enhancement"], }, "Fixed" => { "prefix" => "### Fixed", "labels" => ["bugfix"], }, } end else desc 'Generate a Changelog from GitHub' task :changelog do raise <= Gem::Version.new('2.2.2')" EOM end end diff --git a/metadata.json b/metadata.json index 6b1d511..ffa1959 100644 --- a/metadata.json +++ b/metadata.json @@ -1,61 +1,61 @@ { "name": "puppetlabs-translate", "version": "2.1.0", "author": "puppetlabs", "summary": "Puppet module that provides the translate() function for internationalization.", "license": "Apache-2.0", "source": "https://github.com/puppetlabs/puppetlabs-translate", "dependencies": [ ], "operatingsystem_support": [ { "operatingsystem": "Debian", "operatingsystemrelease": [ "8", "9", "10" ] }, { "operatingsystem": "RedHat", "operatingsystemrelease": [ "5", "6", "7", "8" ] }, { "operatingsystem": "CentOS", "operatingsystemrelease": [ "8" ] }, { "operatingsystem": "Ubuntu", "operatingsystemrelease": [ "14.04", "16.04" ] }, { "operatingsystem": "Windows", "operatingsystemrelease": [ "2012", "2016", "2018", "10" ] } ], "requirements": [ { "name": "puppet", "version_requirement": ">= 5.5.10 < 7.0.0" } ], - "pdk-version": "1.15.0", + "pdk-version": "1.16.0", "template-url": "https://github.com/puppetlabs/pdk-templates#master", - "template-ref": "heads/master-0-gcaed9d7" + "template-ref": "heads/master-0-g5d52853" } diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index c09e002..bc023f5 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,59 +1,61 @@ +# frozen_string_literal: true + RSpec.configure do |c| c.mock_with :rspec end require 'puppetlabs_spec_helper/module_spec_helper' require 'rspec-puppet-facts' require 'spec_helper_local' if File.file?(File.join(File.dirname(__FILE__), 'spec_helper_local.rb')) include RspecPuppetFacts default_facts = { puppetversion: Puppet.version, facterversion: Facter.version, } default_fact_files = [ File.expand_path(File.join(File.dirname(__FILE__), 'default_facts.yml')), File.expand_path(File.join(File.dirname(__FILE__), 'default_module_facts.yml')), ] default_fact_files.each do |f| next unless File.exist?(f) && File.readable?(f) && File.size?(f) begin default_facts.merge!(YAML.safe_load(File.read(f), [], [], true)) rescue => e RSpec.configuration.reporter.message "WARNING: Unable to load #{f}: #{e}" end end # read default_facts and merge them over what is provided by facterdb default_facts.each do |fact, value| add_custom_fact fact, value end RSpec.configure do |c| c.default_facts = default_facts c.before :each do # set to strictest setting for testing # by default Puppet runs at warning level Puppet.settings[:strict] = :warning end c.filter_run_excluding(bolt: true) unless ENV['GEM_BOLT'] c.after(:suite) do RSpec::Puppet::Coverage.report!(0) end end # Ensures that a module is defined # @param module_name Name of the module def ensure_module_defined(module_name) module_name.split('::').reduce(Object) do |last_module, next_module| last_module.const_set(next_module, Module.new) unless last_module.const_defined?(next_module, false) last_module.const_get(next_module, false) end end # 'spec_overrides' from sync.yml will appear below this line