diff --git a/lib/github_changelog_generator/generator/generator_tags.rb b/lib/github_changelog_generator/generator/generator_tags.rb index db2579c..0966df1 100644 --- a/lib/github_changelog_generator/generator/generator_tags.rb +++ b/lib/github_changelog_generator/generator/generator_tags.rb @@ -131,16 +131,45 @@ module GitHubChangelogGenerator # @param [Array] all_tags all tags # @return [Array] filtered tags according :exclude_tags option def filter_excluded_tags(all_tags) - filtered_tags = all_tags - if @options[:exclude_tags] - @options[:exclude_tags].each do |tag| - unless all_tags.map(&:name).include? tag - Helper.log.warn "Warning: can't find tag #{tag}, specified with --exclude-tags option." - end - end - filtered_tags = all_tags.reject { |tag| @options[:exclude_tags].include? tag.name } + return all_tags unless @options[:exclude_tags] + + apply_exclude_tags(all_tags) + end + + private + + def apply_exclude_tags(all_tags) + if @options[:exclude_tags].is_a?(Regexp) + filter_tags_with_regex(all_tags) + else + filter_exact_tags(all_tags) + end + end + + def filter_tags_with_regex(all_tags) + warn_if_nonmatching_regex(all_tags) + all_tags.reject { |tag| @options[:exclude_tags] =~ tag.name } + end + + def filter_exact_tags(all_tags) + @options[:exclude_tags].each do |tag| + warn_if_tag_not_found(all_tags, tag) + end + all_tags.reject { |tag| @options[:exclude_tags].include? tag.name } + end + + def warn_if_nonmatching_regex(all_tags) + unless all_tags.map(&:name).any? { |t| @options[:exclude_tags] =~ t } + Helper.log.warn "Warning: unable to reject any tag, using regex "\ + "#{@options[:exclude_tags].inspect} in --exclude-tags "\ + "option." + end + end + + def warn_if_tag_not_found(all_tags, tag) + unless all_tags.map(&:name).include? tag + Helper.log.warn "Warning: can't find tag #{tag}, specified with --exclude-tags option." end - filtered_tags end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 5c4749d..bf88b97 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -31,91 +31,27 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov.start require "github_changelog_generator" +require "github_changelog_generator/task" -# This file was generated by the `rspec --init` command. Conventionally, all -# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. -# The generated `.rspec` file contains `--require spec_helper` which will cause -# this file to always be loaded, without a need to explicitly require it in any -# files. -# -# Given that it is always loaded, you are encouraged to keep this file as -# light-weight as possible. Requiring heavyweight dependencies from this file -# will add to the boot time of your test suite on EVERY test run, even for an -# individual file that may not need all of that loaded. Instead, consider making -# a separate helper file that requires the additional dependencies and performs -# the additional setup, and require it from the spec files that actually need -# it. -# -# The `.rspec` file also contains a few flags that are not defaults but that -# users commonly want. -# -# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration RSpec.configure do |config| - # rspec-expectations config goes here. You can use an alternate - # assertion/expectation library such as wrong or the stdlib/minitest - # assertions if you prefer. config.expect_with :rspec do |expectations| - # This option will default to `true` in RSpec 4. It makes the `description` - # and `failure_message` of custom matchers include text for helper methods - # defined using `chain`, e.g.: - # be_bigger_than(2).and_smaller_than(4).description - # # => "be bigger than 2 and smaller than 4" - # ...rather than: - # # => "be bigger than 2" expectations.include_chain_clauses_in_custom_matcher_descriptions = true end - # rspec-mocks config goes here. You can use an alternate test double - # library (such as bogus or mocha) by changing the `mock_with` option here. config.mock_with :rspec do |mocks| - # Prevents you from mocking or stubbing a method that does not exist on - # a real object. This is generally recommended, and will default to - # `true` in RSpec 4. mocks.verify_partial_doubles = true end - # These two settings work together to allow you to limit a spec run - # to individual examples or groups you care about by tagging them with - # `:focus` metadata. When nothing is tagged with `:focus`, all examples - # get run. config.filter_run :focus config.run_all_when_everything_filtered = true - # Limits the available syntax to the non-monkey patched syntax that is - # recommended. For more details, see: - # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax - # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ - # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching - # config.disable_monkey_patching! - - # This setting enables warnings. It's recommended, but in some cases may - # be too noisy due to issues in dependencies. config.warnings = true - # Many RSpec users commonly either run the entire suite or an individual - # file, and it's useful to allow more verbose output when running an - # individual spec file. if config.files_to_run.one? - # Use the documentation formatter for detailed output, - # unless a formatter has already been configured - # (e.g. via a command-line flag). config.default_formatter = "doc" end - # Print the 10 slowest examples and example groups at the - # end of the spec run, to help surface which specs are running - # particularly slow. - # config.profile_examples = 10 - - # Run specs in random order to surface order dependencies. If you find an - # order dependency and want to debug it, you can fix the order by providing - # the seed, which is printed after each run. - # --seed 1234 config.order = :random - # Seed global randomization in this process using the `--seed` CLI option. - # Setting this allows you to use `--seed` to deterministically reproduce - # test failures related to randomization by passing the same `--seed` value - # as the one that triggered the failure. Kernel.srand config.seed end diff --git a/spec/unit/generator/generator_tags_spec.rb b/spec/unit/generator/generator_tags_spec.rb index 932e673..a2a3dff 100644 --- a/spec/unit/generator/generator_tags_spec.rb +++ b/spec/unit/generator/generator_tags_spec.rb @@ -87,6 +87,18 @@ describe GitHubChangelogGenerator::Generator do it { is_expected.to be_a Array } it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) } end + + context "with regex exclude_tags" do + let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[23]/) } + it { is_expected.to be_a Array } + it { is_expected.to match_array(tags_mash_from_strings(%w(1))) } + end + + context "with non-matching regex in exclude_tags" do + let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[abc]/) } + it { is_expected.to be_a Array } + it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) } + end end describe "#filter_since_tag" do