lib/jenkinsfile_runner/base_configuration.rb (81 lines of code) (raw):

# frozen_string_literal: true require 'set' require 'optparse' module JenkinsfileRunner class BaseConfiguration class << self def all_attributes @all_attributes ||= [].to_set end def config_attributes(attrs) attrs.each do |attr| all_attributes.add(attr) attr_accessor attr end end end attr_reader :errors def initialize(argv) parser.parse!(argv, into: self) end def validate @errors = [] end def valid? validate @errors.empty? end def validate! return if valid? message = errors .map { |err| "#{key_for_user(err.first)} #{err.last}" } .join(",\n") abort("\nErrors:\n" + message + "\n\n" + parser.help) end def []=(key, value) attr = key_from_user(key) return unless valid_attr?(attr) self.public_send("#{attr}=", value) end def inspect all_attributes .map { |attr| "--#{key_for_user(attr)}=#{value_for(attr)}" } .join(' ') end private def parser raise NotImplementedError, 'define a parser in the concrete configuration class' end def validate_presence(attributes) attributes.inject([]) do |memo, attr| value = value_for(attr) memo << [attr, 'is missing'] if value.nil? || value.empty? memo end end def validate_paths(attributes) attributes.inject([]) do |memo, attr| value = value_for(attr) next memo unless value value = Pathname(value).expand_path memo << [attr, "#{value} does not exist"] unless value.exist? memo end end def all_attributes self.class.all_attributes end def value_for(attr) return unless valid_attr?(attr) public_send(attr) end def valid_attr?(attr) all_attributes.include?(attr) end def key_from_user(key) key.to_s.gsub('-', '_').to_sym end def key_for_user(key) key.to_s.gsub('_', '-' ) end end end