diff --git a/.simplecov b/.simplecov new file mode 100644 index 0000000..7bc45a0 --- /dev/null +++ b/.simplecov @@ -0,0 +1,19 @@ +require 'simplecov-rcov' +SimpleCov.profiles.define 'spec' do + add_group 'jenkins_pipeline_builder', '/lib/' + add_filter 'spec' + coverage_dir 'out/coverage' + formatter SimpleCov::Formatter::MultiFormatter[ + SimpleCov::Formatter::Console, + SimpleCov::Formatter::RcovFormatter, + ] +end + +class SimpleCov::Formatter::Console + def format(result) + print "COVERAGE: #{result.covered_percent.round(2)}%\n" + end +end + +SimpleCov.start 'spec' #if ENV["COVERAGE"] + diff --git a/bin/generate b/bin/generate index daacd00..8ea42b0 100755 --- a/bin/generate +++ b/bin/generate @@ -19,7 +19,6 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib')) require 'jenkins_pipeline_builder' diff --git a/lib/jenkins_pipeline_builder.rb b/lib/jenkins_pipeline_builder.rb index 16ade0c..23f8dad 100644 --- a/lib/jenkins_pipeline_builder.rb +++ b/lib/jenkins_pipeline_builder.rb @@ -46,12 +46,17 @@ def credentials=(creds) @credentials end + def logger + @_client.logger + end + def registry generator.module_registry end end end JenkinsPipelineBuilder.generator +require 'jenkins_pipeline_builder/extensions' require 'jenkins_pipeline_builder/builders' require 'jenkins_pipeline_builder/job_builder' require 'jenkins_pipeline_builder/wrappers' @@ -64,4 +69,3 @@ def registry require 'jenkins_pipeline_builder/cli/list' require 'jenkins_pipeline_builder/cli/describe' require 'jenkins_pipeline_builder/cli/base' -require 'jenkins_pipeline_builder/extensions' diff --git a/lib/jenkins_pipeline_builder/builders.rb b/lib/jenkins_pipeline_builder/builders.rb index ac7e2a2..52dff22 100644 --- a/lib/jenkins_pipeline_builder/builders.rb +++ b/lib/jenkins_pipeline_builder/builders.rb @@ -18,8 +18,6 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# -require 'jenkins_pipeline_builder/extensions' builder do name :multi_job diff --git a/lib/jenkins_pipeline_builder/cli/describe.rb b/lib/jenkins_pipeline_builder/cli/describe.rb index 48186cc..d768b76 100644 --- a/lib/jenkins_pipeline_builder/cli/describe.rb +++ b/lib/jenkins_pipeline_builder/cli/describe.rb @@ -27,7 +27,9 @@ module CLI klass = Class.new(Thor) do extensions = JenkinsPipelineBuilder.registry.registry[:job][entry] - extensions.each do |key, ext| + extensions.each do |key, exts| + # TODO: don't just take the first + ext = exts.first desc key, "Details for #{ext.name}" define_method(ext.name) do display_module(ext) diff --git a/lib/jenkins_pipeline_builder/extensions.rb b/lib/jenkins_pipeline_builder/extensions.rb index c1ce3f6..261efc8 100644 --- a/lib/jenkins_pipeline_builder/extensions.rb +++ b/lib/jenkins_pipeline_builder/extensions.rb @@ -1,3 +1,24 @@ +# +# Copyright (c) 2014 Constant Contact +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + require 'jenkins_pipeline_builder' JenkinsPipelineBuilder.registry.entries.each do |type, path| singular_type = type.to_s.singularize @@ -5,6 +26,7 @@ ext = JenkinsPipelineBuilder::Extension.new ext.instance_eval(&block) ext.path path + ext.type singular_type unless ext.valid? name = ext.name || 'A plugin with no name provided' puts "Encountered errors while registering #{name}" @@ -19,6 +41,7 @@ def job_attribute(&block) ext = JenkinsPipelineBuilder::Extension.new ext.instance_eval(&block) + ext.type :job_attribute unless ext.valid? name = ext.name || 'A plugin with no name provided' puts "Encountered errors while registering #{name}" @@ -38,7 +61,8 @@ class Extension jenkins_name: 'No jenkins display name set', description: 'No description set', path: false, - announced: true + announced: true, + type: false } DSL_METHODS.keys.each do |method_name| define_method method_name do |value = nil| diff --git a/lib/jenkins_pipeline_builder/generator.rb b/lib/jenkins_pipeline_builder/generator.rb index fb6c91f..50cdcf8 100644 --- a/lib/jenkins_pipeline_builder/generator.rb +++ b/lib/jenkins_pipeline_builder/generator.rb @@ -45,7 +45,11 @@ def initialize def debug=(value) @debug = value - @logger.level = (value) ? Logger::DEBUG : Logger::INFO + logger.level = (value) ? Logger::DEBUG : Logger::INFO + end + + def logger + JenkinsPipelineBuilder.logger end def client @@ -66,7 +70,7 @@ def view def load_collection_from_path(path, recursively = false, remote = false) path = File.expand_path(path, Dir.getwd) if File.directory?(path) - @logger.info "Generating from folder #{path}" + logger.info "Generating from folder #{path}" Dir[File.join(path, '/*.yaml'), File.join(path, '/*.yml')].each do |file| if File.directory?(file) # TODO: This doesn't work unless the folder contains .yml or .yaml at the end if recursively @@ -75,12 +79,12 @@ def load_collection_from_path(path, recursively = false, remote = false) next end end - @logger.info "Loading file #{file}" + logger.info "Loading file #{file}" yaml = YAML.load_file(file) load_job_collection(yaml, remote) end else - @logger.info "Loading file #{path}" + logger.info "Loading file #{path}" yaml = YAML.load_file(path) load_job_collection(yaml, remote) end @@ -92,14 +96,14 @@ def load_job_collection(yaml, remote = false) key = section.keys.first value = section[key] if key == :dependencies - @logger.info 'Resolving Dependencies for remote project' + logger.info 'Resolving Dependencies for remote project' load_remote_yaml(value) next end name = value[:name] if @job_collection.key?(name) if remote - @logger.info "Duplicate item with name '#{name}' was detected from the remote folder." + logger.info "Duplicate item with name '#{name}' was detected from the remote folder." else fail "Duplicate item with name '#{name}' was detected." end @@ -118,10 +122,10 @@ def load_extensions(path) path = File.expand_path(path, Dir.getwd) return unless File.directory?(path) - @logger.info "Loading extensions from folder #{path}" - @logger.info Dir.glob("#{path}/*.rb").inspect + logger.info "Loading extensions from folder #{path}" + logger.info Dir.glob("#{path}/*.rb").inspect Dir.glob("#{path}/*.rb").each do |file| - @logger.info "Loaded #{file}" + logger.info "Loaded #{file}" require file end match_extension_versions @@ -130,7 +134,7 @@ def load_extensions(path) def match_extension_versions registry = @module_registry.registry[:job] installed_plugins = @debug ? nil : list_plugins # Only get plugins if not in debug mode - @logger.debug 'Loading newest version of all plugins since we are in debug mode.' + logger.debug 'Loading newest version of all plugins since we are in debug mode.' registry.each do |registry_key, registry_value| if registry_value[:registry] registry_value[:registry].each do |extension_key, extension_value| @@ -178,7 +182,7 @@ def load_template(path, template) end if File.directory?(path) - @logger.info "Loading from #{path}" + logger.info "Loading from #{path}" load_collection_from_path(path, false, true) true else @@ -188,7 +192,7 @@ def load_template(path, template) def download_yaml(url, file) @remote_depends[url] = file - @logger.info "Downloading #{url} to #{file}.tar" + logger.info "Downloading #{url} to #{file}.tar" open("#{file}.tar", 'w') do |local_file| open(url) do |remote_file| local_file.write(Zlib::GzipReader.new(remote_file).read) @@ -196,7 +200,7 @@ def download_yaml(url, file) end # Extract Tar.gz to 'remote' folder - @logger.info "Unpacking #{file}.tar to #{file} folder" + logger.info "Unpacking #{file}.tar to #{file} folder" Archive::Tar::Minitar.unpack("#{file}.tar", file) end @@ -216,7 +220,7 @@ def load_remote_yaml(dependencies) path = File.expand_path(file, Dir.getwd) # Load templates recursively unless source[:templates] - @logger.info 'No specific template specified' + logger.info 'No specific template specified' # Try to load the folder or the pipeline folder path = File.join(path, 'pipeline') if Dir.entries(path).include? 'pipeline' return load_collection_from_path(path) @@ -229,12 +233,12 @@ def load_remote_yaml(dependencies) def load_templates(path, templates) templates.each do |template| version = template[:version] || 'newest' - @logger.info "Loading #{template[:name]} at version #{version}" + logger.info "Loading #{template[:name]} at version #{version}" # Move into the remote folder and look for the template folder remote = Dir.entries(path) if remote.include? template[:name] # We found the template name, load this path - @logger.info 'We found the template!' + logger.info 'We found the template!' load_template(path, template) else # Many cases we must dig one layer deep @@ -312,7 +316,7 @@ def resolve_project(project) project_body = project[:value] jobs = prepare_jobs(project_body[:jobs]) if project_body[:jobs] - @logger.info project + logger.info project process_job_changes(jobs) errors = process_jobs(jobs, project) errors = process_views(project_body[:views], project, errors) if project_body[:views] @@ -333,7 +337,7 @@ def resolve_job_by_name(name, settings = {}) job = get_item(name) fail "Failed to locate job by name '#{name}'" if job.nil? job_value = job[:value] - @logger.debug "Compiling job #{name}" + logger.debug "Compiling job #{name}" success, payload = Compiler.compile(job_value, settings, @job_collection) [success, payload] end @@ -395,9 +399,9 @@ def publish_jobs(jobs, errors = {}) end def bootstrap(path, project_name) - @logger.info "Bootstrapping pipeline from path #{path}" + logger.info "Bootstrapping pipeline from path #{path}" load_collection_from_path(path) - @logger.info @job_collection + logger.info @job_collection cleanup_temp_remote load_extensions(path) errors = {} @@ -408,23 +412,23 @@ def bootstrap(path, project_name) errors = publish_project(project_name) end errors.each do |k, v| - @logger.error "Encountered errors compiling: #{k}:" - @logger.error v + logger.error "Encountered errors compiling: #{k}:" + logger.error v end end def pull_request(path, project_name) - @logger.info "Pull Request Generator Running from path #{path}" + logger.info "Pull Request Generator Running from path #{path}" load_collection_from_path(path) cleanup_temp_remote load_extensions(path) jobs = {} - @logger.info "Project: #{projects}" + logger.info "Project: #{projects}" projects.each do |project| if project[:name] == project_name || project_name.nil? project_body = project[:value] project_jobs = project_body[:jobs] || [] - @logger.info "Using Project #{project}" + logger.info "Using Project #{project}" pull_job = nil project_jobs.each do |job| job = job.keys.first if job.is_a? Hash @@ -463,8 +467,8 @@ def pull_request(path, project_name) end def dump(job_name) - @logger.info "Debug #{@debug}" - @logger.info "Dumping #{job_name} into #{job_name}.xml" + logger.info "Debug #{@debug}" + logger.info "Dumping #{job_name} into #{job_name}.xml" xml = client.job.get_config(job_name) File.open(job_name + '.xml', 'w') { |f| f.write xml } end @@ -472,8 +476,8 @@ def dump(job_name) def create_or_update(job, xml) job_name = job[:name] if @debug - @logger.info "Will create job #{job}" - @logger.info "#{xml}" + logger.info "Will create job #{job}" + logger.info "#{xml}" File.open(job_name + '.xml', 'w') { |f| f.write xml } return end @@ -488,7 +492,7 @@ def create_or_update(job, xml) def compile_job_to_xml(job) fail 'Job name is not specified' unless job[:name] - @logger.info "Creating Yaml Job #{job}" + logger.info "Creating Yaml Job #{job}" job[:job_type] = 'free_style' unless job[:job_type] case job[:job_type] when 'job_dsl' @@ -530,7 +534,9 @@ def compile_freestyle_job_to_xml(params) xml = client.job.build_freestyle_config(params) n_xml = Nokogiri::XML(xml) + logger.debug 'Loading the required modules' @module_registry.traverse_registry_path('job', params, n_xml) + logger.debug 'Module loading complete' n_xml.to_xml end @@ -555,7 +561,7 @@ def update_job_dsl(job, xml) end def generate_job_dsl_body(params) - @logger.info 'Generating pipeline' + logger.info 'Generating pipeline' xml = client.job.build_freestyle_config(params) diff --git a/lib/jenkins_pipeline_builder/module_registry.rb b/lib/jenkins_pipeline_builder/module_registry.rb index 2a26f7b..9f6f321 100644 --- a/lib/jenkins_pipeline_builder/module_registry.rb +++ b/lib/jenkins_pipeline_builder/module_registry.rb @@ -27,6 +27,10 @@ def initialize @registry = { job: {} } end + def logger + JenkinsPipelineBuilder.logger + end + # Ideally refactor this out to be derived from the registry, # but I'm lazy for now def entries @@ -43,7 +47,8 @@ def register(prefix, extension) root = prefix.inject(@registry, :[]) root[name] = {} unless root[name] - root[name][extension.name] = extension + root[name][extension.name] = [] unless root[name][extension.name] + root[name][extension.name] << extension end def get(path) @@ -63,17 +68,25 @@ def traverse_registry_path(path, params, n_xml) traverse_registry(registry, params, n_xml) end - def traverse_registry(registry, params, n_xml) + def traverse_registry(registry, params, n_xml, strict = false) params.each do |key, value| if registry.is_a? Hash - next unless registry.key? key - if registry[key].is_a? Extension - execute_extension(registry[key], value, n_xml) + unless registry.key? key + fail "!!!! could not find key #{key} !!!!" if strict + next + end + reg_value = registry[key] + if reg_value.is_a?(Array) && reg_value.first.is_a?(Extension) + next unless reg_value.select { |x| x.class == Extension }.size == reg_value.size + # TODO: Actually compare versions installed on box here + reg = reg_value.sort { |x, y| x.min_version <=> y.min_version }.last + logger.debug "Using #{reg.type} #{reg.name} version #{reg.min_version}" + execute_extension(reg, value, n_xml) elsif value.is_a? Hash - traverse_registry registry[key], value, n_xml + traverse_registry reg_value, value, n_xml, true elsif value.is_a? Array value.each do |v| - traverse_registry registry[key], v, n_xml + traverse_registry reg_value, v, n_xml, true end end end @@ -86,6 +99,7 @@ def execute_extension(extension, value, n_xml) Nokogiri::XML::Builder.with(n_builders) do |xml| xml.instance_exec value, &extension.xml end + n_builders.instance_exec(value, &extension.after) if extension.after end end end diff --git a/lib/jenkins_pipeline_builder/publishers.rb b/lib/jenkins_pipeline_builder/publishers.rb index 47dd7cc..b7d4b5d 100644 --- a/lib/jenkins_pipeline_builder/publishers.rb +++ b/lib/jenkins_pipeline_builder/publishers.rb @@ -18,8 +18,6 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# -require 'jenkins_pipeline_builder/extensions' publisher do name :description_setter diff --git a/lib/jenkins_pipeline_builder/triggers.rb b/lib/jenkins_pipeline_builder/triggers.rb index 74bb481..9383f28 100644 --- a/lib/jenkins_pipeline_builder/triggers.rb +++ b/lib/jenkins_pipeline_builder/triggers.rb @@ -18,8 +18,6 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# -require 'jenkins_pipeline_builder/extensions' trigger do name :git_push diff --git a/lib/jenkins_pipeline_builder/wrappers.rb b/lib/jenkins_pipeline_builder/wrappers.rb index 0789371..2f82e3b 100644 --- a/lib/jenkins_pipeline_builder/wrappers.rb +++ b/lib/jenkins_pipeline_builder/wrappers.rb @@ -20,8 +20,6 @@ # THE SOFTWARE. # -require 'jenkins_pipeline_builder/extensions' - wrapper do name :ansicolor plugin_id 123 @@ -48,10 +46,11 @@ end wrapper do - name :rvm05 + name :rvm plugin_id 123 min_version '0.5' announced false + description 'rvm plugin for versions 0.5 and greater' xml do |wrapper| send('ruby-proxy-object') do @@ -78,8 +77,9 @@ wrapper do name :rvm plugin_id 123 - min_version 0 + min_version '0' announced false + description 'rvm plugin for versions less than 0.5' xml do |wrapper| send('ruby-proxy-object') do diff --git a/spec/func_tests/spec_helper.rb b/spec/func_tests/spec_helper.rb index a409159..aac3340 100644 --- a/spec/func_tests/spec_helper.rb +++ b/spec/func_tests/spec_helper.rb @@ -2,9 +2,6 @@ require 'rspec' require 'webmock/rspec' require 'simplecov' -require 'simplecov-rcov' - -SimpleCov.start if ENV['COVERAGE'] require File.expand_path('../../../lib/jenkins_pipeline_builder', __FILE__) diff --git a/spec/unit_tests/compiler_spec.rb b/spec/unit_tests/compiler_spec.rb index 8a2b4b8..15fcec6 100644 --- a/spec/unit_tests/compiler_spec.rb +++ b/spec/unit_tests/compiler_spec.rb @@ -14,7 +14,7 @@ success, result = JenkinsPipelineBuilder::Compiler.compile(hash) - expect(success).to be_true + expect(success).to be true result.should == hash end end diff --git a/spec/unit_tests/module_registry_spec.rb b/spec/unit_tests/module_registry_spec.rb index 16230f7..f978f33 100644 --- a/spec/unit_tests/module_registry_spec.rb +++ b/spec/unit_tests/module_registry_spec.rb @@ -10,6 +10,111 @@ allow(ext).to receive(:name).and_return :foo registry.register [:job], ext - expect(registry.get('job/foo').name).to eq :foo + expect(registry.get('job/foo').first.name).to eq :foo + end + + it 'registered the builders correctly' do + builders = { + multi_job: [0], + maven3: [0], + shell_command: [0], + inject_vars_file: [0], + blocking_downstream: [0], + remote_job: [0], + copy_artifact: [0] + } + registry = JenkinsPipelineBuilder.registry.registry + expect(registry[:job][:builders].size).to eq builders.size + builders.each do |builder, versions| + expect(registry[:job][:builders]).to have_key builder + + versions.each do |version| + expect(registry[:job][:builders][builder]).to have_min_version version + end + end + end + it 'registered the triggers correctly' do + triggers = { + git_push: [0], + scm_polling: [0], + periodic_build: [0], + upstream: [0] + } + registry = JenkinsPipelineBuilder.registry.registry + expect(registry[:job][:triggers].size).to eq triggers.size + triggers.each do |trigger, versions| + expect(registry[:job][:triggers]).to have_key trigger + + versions.each do |version| + expect(registry[:job][:triggers][trigger]).to have_min_version version + end + end + end + it 'registered the job_attributes correctly' do + job_attributes = { + description: [0], + scm_params: [0], + hipchat: [0], + priority: [0], + parameters: [0], + discard_old: [0], + throttle: [0], + prepare_environment: [0], + concurrent_build: [0] + } + registry = JenkinsPipelineBuilder.registry.registry + # There are 4 sub types so, we don't count those + expect(registry[:job].size - 4).to eq job_attributes.size + job_attributes.each do |job_attribute, versions| + expect(registry[:job]).to have_key job_attribute + + versions.each do |version| + expect(registry[:job][job_attribute]).to have_min_version version + end + end + end + it 'registered the publishers correctly' do + publishers = { + description_setter: [0], + downstream: [0], + hipchat: [0], + git: [0], + junit_result: [0], + coverage_result: [0], + post_build_script: [0], + groovy_postbuild: [0], + archive_artifact: [0], + email_notifications: [0] + } + registry = JenkinsPipelineBuilder.registry.registry + expect(registry[:job][:publishers].size).to eq publishers.size + publishers.each do |publisher, versions| + expect(registry[:job][:publishers]).to have_key publisher + + versions.each do |version| + expect(registry[:job][:publishers][publisher]).to have_min_version version + end + end + end + it 'registered the wrappers correctly' do + wrappers = { + ansicolor: [0], + timestamp: [0], + name: [0], + rvm: ['0', '0.5'], + inject_passwords: [0], + inject_env_var: [0], + artifactory: [0], + maven3artifactory: [0] + } + registry = JenkinsPipelineBuilder.registry.registry + expect(registry[:job][:wrappers].size).to eq wrappers.size + wrappers.each do |wrapper, versions| + expect(registry[:job][:wrappers]).to have_key wrapper + + versions.each do |version| + expect(registry[:job][:wrappers][wrapper]).to have_min_version version + end + end end end diff --git a/spec/unit_tests/resolve_dependencies_spec.rb b/spec/unit_tests/resolve_dependencies_spec.rb index 4d68336..403d10d 100644 --- a/spec/unit_tests/resolve_dependencies_spec.rb +++ b/spec/unit_tests/resolve_dependencies_spec.rb @@ -69,7 +69,7 @@ success, project = @generator.resolve_project(@generator.get_item('project-name')) - expect(success).to be_true + expect(success).to be true expect(project).to eq( name: 'project-name', type: :project, @@ -126,7 +126,7 @@ @generator.load_job_collection project success, project = @generator.resolve_project(@generator.get_item('project-name')) - expect(success).to be_true + expect(success).to be true expect(project).to eq( name: 'project-name', type: :project, @@ -181,7 +181,7 @@ @generator.load_job_collection project success, project = @generator.resolve_project(@generator.get_item('project-name')) - expect(success).to be_true + expect(success).to be true expect(project).to eq( name: 'project-name', type: :project, @@ -210,19 +210,19 @@ describe 'compilation of templates' do it 'compiles String' do success, string = JenkinsPipelineBuilder::Compiler.compile('blah', item1: 'data1') - expect(success).to be_true + expect(success).to be true expect(string).to eq 'blah' end it 'compiles simple Hash' do success, hash = JenkinsPipelineBuilder::Compiler.compile({ name: 'item-{{item1}}', value: 'item1-data' }, item1: 'data1') - expect(success).to be_true + expect(success).to be true expect(hash).to eq(name: 'item-data1', value: 'item1-data') end it 'compiles nested Hash' do success, hash = JenkinsPipelineBuilder::Compiler.compile({ name: 'item-{{item1}}', value: { house: 'house-{{item1}}' } }, item1: 'data1') - expect(success).to be_true + expect(success).to be true expect(hash).to eq(name: 'item-data1', value: { house: 'house-data1' }) end @@ -233,7 +233,7 @@ settings = { name: 'project-name', db: 'my_own_db', :'mail-to' => 'developer@nowhere.net' } success, hash = JenkinsPipelineBuilder::Compiler.compile(template, settings) - expect(success).to be_true + expect(success).to be true expect(hash).to eq( name: 'project-name-unit-tests', builders: [{ shell: 'unittest' }], @@ -249,7 +249,7 @@ @generator.load_job_collection project success, job = @generator.resolve_job_by_name('{{name}}-unit-tests', name: 'project-name', db: 'my_own_db', :'mail-to' => 'developer@nowhere.net') - expect(success).to be_true + expect(success).to be true expect(job).to eq( name: 'project-name-unit-tests', builders: [{ shell: 'unittest' }], diff --git a/spec/unit_tests/spec_helper.rb b/spec/unit_tests/spec_helper.rb index bea536b..981ac03 100644 --- a/spec/unit_tests/spec_helper.rb +++ b/spec/unit_tests/spec_helper.rb @@ -5,23 +5,6 @@ require 'simplecov-rcov' require 'webmock/rspec' -SimpleCov.profiles.define 'spec' do - add_group 'jenkins_pipeline_builder', '/lib/' - coverage_dir 'out/coverage' - formatter SimpleCov::Formatter::MultiFormatter[ - SimpleCov::Formatter::Console, - SimpleCov::Formatter::RcovFormatter, - ] -end - -class SimpleCov::Formatter::Console - def format(result) - print "COVERAGE: #{result.covered_percent.round(2)}%\n" - end -end - -SimpleCov.start 'spec' # if ENV["COVERAGE"] - require File.expand_path('../../../lib/jenkins_pipeline_builder', __FILE__) require 'rspec/matchers' require 'equivalent-xml' @@ -30,3 +13,14 @@ def format(result) config.before(:each) do end end + +RSpec::Matchers.define :have_min_version do |version| + match do |base| + @exts = base + !base.select { |ext| ext.min_version == version }.empty? + end + + failure_message_for_should do + "Expected to find extension #{@exts.first.name} with version #{version}, found #{@exts.map { |x| x.min_version }.join(', ')} instead" + end +end