diff --git a/lib/github_changelog_generator/options.rb b/lib/github_changelog_generator/options.rb index 70fa3d6..2d73caa 100644 --- a/lib/github_changelog_generator/options.rb +++ b/lib/github_changelog_generator/options.rb @@ -2,9 +2,14 @@ require "delegate" 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 @@ -56,23 +61,31 @@ module GitHubChangelogGenerator 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. - # - # @return [void] def load_custom_ruby_files self[:require].each { |f| require f } end diff --git a/lib/github_changelog_generator/parser.rb b/lib/github_changelog_generator/parser.rb index 9c8cf88..747e3d9 100755 --- a/lib/github_changelog_generator/parser.rb +++ b/lib/github_changelog_generator/parser.rb @@ -5,6 +5,7 @@ require "optparse" require "pp" require_relative "version" require_relative "helper" + module GitHubChangelogGenerator class Parser # parse options with optparse @@ -26,23 +27,23 @@ module GitHubChangelogGenerator options end - # If options set to verbose, print the parsed options. + # Pretty-print the parsed options. # # The GitHub `:token` key is censored in the output. # - # @param options [Hash] The options to display + # @param options [Options] The options to display # @option options [Boolean] :verbose If false this method does nothing def self.print_options(options) - if options[:verbose] - Helper.log.info "Performing task with options:" - options_to_display = options.clone - options_to_display[:token] = options_to_display[:token].nil? ? nil : "hidden value" - pp options_to_display - puts "" - end + return unless options[:verbose] + + Helper.log.info "Using these options:" + pp(options.clone.tap { |opts| opts[:token] = opts[:token].nil? ? "No token used" : "hidden value" }) + puts "" end - # setup parsing options + # Setup parsing options + # + # @param options [Options] def self.setup_parser(options) parser = OptionParser.new do |opts| # rubocop:disable Metrics/BlockLength opts.banner = "Usage: github_changelog_generator [options]" @@ -199,7 +200,7 @@ module GitHubChangelogGenerator parser end - # @return [Hash] Default options + # @return [Options] Default options def self.default_options Options.new( date_format: "%Y-%m-%d",