github-changelog-generator/lib/github_changelog_generator/options.rb
2017-10-14 21:52:26 +02:00

125 lines
2.8 KiB
Ruby

# frozen_string_literal: true
require "delegate"
require "github_changelog_generator/helper"
module GitHubChangelogGenerator
# This class wraps Options, and knows a list of known options. Others options
# will raise exceptions.
class Options < SimpleDelegator
# Raised on intializing with unknown keys in the values hash,
# and when trying to store a value on an unknown key.
UnsupportedOptionError = Class.new(ArgumentError)
# List of valid option names
KNOWN_OPTIONS = %i[
add_issues_wo_labels
add_pr_wo_labels
author
base
between_tags
bug_labels
bug_prefix
cache_file
cache_log
compare_link
date_format
due_tag
enhancement_labels
enhancement_prefix
breaking_labels
breaking_prefix
exclude_labels
exclude_tags
exclude_tags_regex
filter_issues_by_milestone
frontmatter
future_release
github_endpoint
github_site
header
http_cache
include_labels
issue_prefix
issue_line_labels
issues
max_issues
merge_prefix
output
project
pulls
release_branch
release_url
require
simple_list
since_tag
ssl_ca_file
token
unreleased
unreleased_label
unreleased_only
user
usernames_as_github_logins
verbose
]
# @param values [Hash]
#
# @raise [UnsupportedOptionError] if given values contain unknown options
def initialize(values)
super(values)
unsupported_options.any? && raise(UnsupportedOptionError, unsupported_options.inspect)
end
# Set option key to val.
#
# @param key [Symbol]
# @param val [Object]
#
# @raise [UnsupportedOptionError] when trying to set an unknown option
def []=(key, val)
supported_option?(key) || raise(UnsupportedOptionError, key.inspect)
values[key] = val
end
# @return [Hash]
def to_hash
values
end
# Loads the configured Ruby files from the --require option.
def load_custom_ruby_files
self[:require].each { |f| require f }
end
# Pretty-prints a censored options hash, if :verbose.
def print_options
return unless self[:verbose]
Helper.log.info "Using these options:"
pp(censored_values)
puts ""
end
private
def values
__getobj__
end
# Returns a censored options hash.
#
# @return [Hash] The GitHub `:token` key is censored in the output.
def censored_values
values.clone.tap { |opts| opts[:token] = opts[:token].nil? ? "No token used" : "hidden value" }
end
def unsupported_options
values.keys - KNOWN_OPTIONS
end
def supported_option?(key)
KNOWN_OPTIONS.include?(key)
end
end
end