github_changelog_generator 1.15.0 → 1.16.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +32 -54
- data/Rakefile +1 -1
- data/lib/github_changelog_generator/argv_parser.rb +225 -0
- data/lib/github_changelog_generator/generator/entry.rb +10 -10
- data/lib/github_changelog_generator/generator/generator.rb +41 -19
- data/lib/github_changelog_generator/generator/generator_fetcher.rb +5 -9
- data/lib/github_changelog_generator/generator/generator_processor.rb +23 -20
- data/lib/github_changelog_generator/generator/generator_tags.rb +15 -9
- data/lib/github_changelog_generator/generator/section.rb +27 -7
- data/lib/github_changelog_generator/helper.rb +1 -1
- data/lib/github_changelog_generator/octo_fetcher.rb +190 -126
- data/lib/github_changelog_generator/options.rb +4 -0
- data/lib/github_changelog_generator/parser.rb +70 -248
- data/lib/github_changelog_generator/parser_file.rb +29 -14
- data/lib/github_changelog_generator/reader.rb +2 -2
- data/lib/github_changelog_generator/ssl_certs/cacert.pem +851 -1680
- data/lib/github_changelog_generator/task.rb +3 -2
- data/lib/github_changelog_generator/version.rb +1 -1
- data/man/git-generate-changelog.1 +46 -34
- data/man/git-generate-changelog.1.html +39 -31
- data/man/git-generate-changelog.html +19 -19
- data/man/git-generate-changelog.md +39 -31
- data/spec/files/config_example +5 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/unit/generator/entry_spec.rb +37 -31
- data/spec/unit/generator/generator_processor_spec.rb +99 -44
- data/spec/unit/generator/generator_spec.rb +47 -0
- data/spec/unit/generator/generator_tags_spec.rb +46 -3
- data/spec/unit/generator/section_spec.rb +34 -0
- data/spec/unit/octo_fetcher_spec.rb +45 -2
- data/spec/unit/parser_spec.rb +50 -0
- metadata +45 -9
| @@ -84,47 +84,47 @@ | |
| 84 84 |  | 
| 85 85 | 
             
            <h2 id="OPTIONS">OPTIONS</h2>
         | 
| 86 86 |  | 
| 87 | 
            -
            <p>  -u, --user  | 
| 87 | 
            +
            <p>  -u, --user USER</p>
         | 
| 88 88 |  | 
| 89 89 | 
             
            <p>  Username of the owner of target GitHub repo</p>
         | 
| 90 90 |  | 
| 91 | 
            -
            <p>  -p, --project  | 
| 91 | 
            +
            <p>  -p, --project PROJECT</p>
         | 
| 92 92 |  | 
| 93 93 | 
             
            <p>  Name of project on GitHub</p>
         | 
| 94 94 |  | 
| 95 | 
            -
            <p>  -t, --token  | 
| 95 | 
            +
            <p>  -t, --token TOKEN</p>
         | 
| 96 96 |  | 
| 97 97 | 
             
            <p>  To make more than 50 requests per hour your GitHub token is required. You can generate it at: https://github.com/settings/tokens/new</p>
         | 
| 98 98 |  | 
| 99 | 
            -
            <p>  -f, --date-format  | 
| 99 | 
            +
            <p>  -f, --date-format FORMAT</p>
         | 
| 100 100 |  | 
| 101 101 | 
             
            <p>  Date format. Default is %Y-%m-%d</p>
         | 
| 102 102 |  | 
| 103 | 
            -
            <p>  -o, --output  | 
| 103 | 
            +
            <p>  -o, --output NAME</p>
         | 
| 104 104 |  | 
| 105 105 | 
             
            <p>  Output file. Default is CHANGELOG.md</p>
         | 
| 106 106 |  | 
| 107 | 
            -
            <p>  -b, --base  | 
| 107 | 
            +
            <p>  -b, --base NAME</p>
         | 
| 108 108 |  | 
| 109 109 | 
             
            <p>  Optional base file to append generated changes to.</p>
         | 
| 110 110 |  | 
| 111 | 
            -
            <p>   --bugs-label  | 
| 111 | 
            +
            <p>   --bugs-label LABEL</p>
         | 
| 112 112 |  | 
| 113 113 | 
             
            <p>   Setup custom label for bug-fixes section. Default is "<strong>Fixed bugs:</strong></p>
         | 
| 114 114 |  | 
| 115 | 
            -
            <p>   --enhancement-label  | 
| 115 | 
            +
            <p>   --enhancement-label LABEL</p>
         | 
| 116 116 |  | 
| 117 117 | 
             
            <p>   Setup custom label for enhancements section. Default is "<strong>Implemented enhancements:</strong>"</p>
         | 
| 118 118 |  | 
| 119 | 
            -
            <p>   --issues-label  | 
| 119 | 
            +
            <p>   --issues-label LABEL</p>
         | 
| 120 120 |  | 
| 121 121 | 
             
            <p>   Setup custom label for closed-issues section. Default is "<strong>Closed issues:</strong>"</p>
         | 
| 122 122 |  | 
| 123 | 
            -
            <p>   --header-label  | 
| 123 | 
            +
            <p>   --header-label LABEL</p>
         | 
| 124 124 |  | 
| 125 125 | 
             
            <p>   Setup custom header label. Default is "# Changelog"</p>
         | 
| 126 126 |  | 
| 127 | 
            -
            <p>   --pr-label  | 
| 127 | 
            +
            <p>   --pr-label LABEL</p>
         | 
| 128 128 |  | 
| 129 129 | 
             
            <p>   Setup custom label for pull requests section. Default is "<strong>Merged pull requests:</strong>"</p>
         | 
| 130 130 |  | 
| @@ -160,7 +160,7 @@ | |
| 160 160 |  | 
| 161 161 | 
             
            <p>   Add to log unreleased closed issues. Default is true</p>
         | 
| 162 162 |  | 
| 163 | 
            -
            <p>   --unreleased-label  | 
| 163 | 
            +
            <p>   --unreleased-label LABEL</p>
         | 
| 164 164 |  | 
| 165 165 | 
             
            <p>   Add to log unreleased closed issues. Default is true</p>
         | 
| 166 166 |  | 
| @@ -196,19 +196,19 @@ | |
| 196 196 |  | 
| 197 197 | 
             
            <p>   Changelog will end before specified tag</p>
         | 
| 198 198 |  | 
| 199 | 
            -
            <p>   --max-issues  | 
| 199 | 
            +
            <p>   --max-issues NUMBER</p>
         | 
| 200 200 |  | 
| 201 201 | 
             
            <p>   Max number of issues to fetch from GitHub. Default is unlimited</p>
         | 
| 202 202 |  | 
| 203 | 
            -
            <p>   --release-url  | 
| 203 | 
            +
            <p>   --release-url URL</p>
         | 
| 204 204 |  | 
| 205 205 | 
             
            <p>   The URL to point to for release links, in printf format (with the tag as variable).</p>
         | 
| 206 206 |  | 
| 207 | 
            -
            <p>   --github-site  | 
| 207 | 
            +
            <p>   --github-site URL</p>
         | 
| 208 208 |  | 
| 209 209 | 
             
            <p>   The Enterprise Github site on which your project is hosted.</p>
         | 
| 210 210 |  | 
| 211 | 
            -
            <p>   --github-api  | 
| 211 | 
            +
            <p>   --github-api URL</p>
         | 
| 212 212 |  | 
| 213 213 | 
             
            <p>   The enterprise endpoint to use for your Github API.</p>
         | 
| 214 214 |  | 
| @@ -216,15 +216,15 @@ | |
| 216 216 |  | 
| 217 217 | 
             
            <p>   Create simple list from issues and pull requests. Default is false.</p>
         | 
| 218 218 |  | 
| 219 | 
            -
            <p>   --future-release  | 
| 219 | 
            +
            <p>   --future-release RELEASE-VERSION</p>
         | 
| 220 220 |  | 
| 221 221 | 
             
            <p>   Put the unreleased changes in the specified release number.</p>
         | 
| 222 222 |  | 
| 223 | 
            -
            <p>   --configure-sections  | 
| 223 | 
            +
            <p>   --configure-sections HASH, STRING</p>
         | 
| 224 224 |  | 
| 225 225 | 
             
            <p>   Define your own set of sections which overrides all default sections") do |v|</p>
         | 
| 226 226 |  | 
| 227 | 
            -
            <p>   --add-sections  | 
| 227 | 
            +
            <p>   --add-sections HASH, STRING</p>
         | 
| 228 228 |  | 
| 229 229 | 
             
            <p>   Add new sections but keep the default sections"</p>
         | 
| 230 230 |  | 
| @@ -11,79 +11,79 @@ Automatically generate changelog from your tags, issues, labels and pull request | |
| 11 11 |  | 
| 12 12 | 
             
            ## OPTIONS
         | 
| 13 13 |  | 
| 14 | 
            -
              -u, --user  | 
| 14 | 
            +
              -u, --user USER
         | 
| 15 15 |  | 
| 16 16 | 
             
              Username of the owner of target GitHub repo.
         | 
| 17 17 |  | 
| 18 | 
            -
              -p, --project  | 
| 18 | 
            +
              -p, --project PROJECT
         | 
| 19 19 |  | 
| 20 20 | 
             
              Name of project on GitHub.
         | 
| 21 21 |  | 
| 22 | 
            -
              -t, --token  | 
| 22 | 
            +
              -t, --token TOKEN
         | 
| 23 23 |  | 
| 24 24 | 
             
              To make more than 50 requests per hour your GitHub token is required. You can generate it at: https://github.com/settings/tokens/new
         | 
| 25 25 |  | 
| 26 | 
            -
              -f, --date-format  | 
| 26 | 
            +
              -f, --date-format FORMAT
         | 
| 27 27 |  | 
| 28 28 | 
             
              Date format. Default is %Y-%m-%d.
         | 
| 29 29 |  | 
| 30 | 
            -
              -o, --output  | 
| 30 | 
            +
              -o, --output NAME
         | 
| 31 31 |  | 
| 32 32 | 
             
              Output file. To print to STDOUT instead, use blank as path. Default is CHANGELOG.md.
         | 
| 33 33 |  | 
| 34 | 
            -
              -b, --base  | 
| 34 | 
            +
              -b, --base NAME
         | 
| 35 35 |  | 
| 36 | 
            -
              Optional base file to append generated changes to.
         | 
| 36 | 
            +
              Optional base file to append generated changes to. Default is HISTORY.md.
         | 
| 37 37 |  | 
| 38 | 
            -
              --summary-label  | 
| 38 | 
            +
              --summary-label LABEL
         | 
| 39 39 |  | 
| 40 40 | 
             
              Set up custom label for the release summary section. Default is "".
         | 
| 41 41 |  | 
| 42 | 
            -
              --breaking-label  | 
| 42 | 
            +
              --breaking-label LABEL
         | 
| 43 43 |  | 
| 44 44 | 
             
              Set up custom label for breaking changes section. Default is "**Breaking changes:**".
         | 
| 45 45 |  | 
| 46 | 
            -
              --enhancement-label  | 
| 46 | 
            +
              --enhancement-label LABEL
         | 
| 47 47 |  | 
| 48 48 | 
             
              Set up custom label for enhancements section. Default is "**Implemented enhancements:**".
         | 
| 49 49 |  | 
| 50 | 
            -
              --bugs-label  | 
| 50 | 
            +
              --bugs-label LABEL
         | 
| 51 51 |  | 
| 52 52 | 
             
              Set up custom label for bug-fixes section. Default is "**Fixed bugs:**".
         | 
| 53 53 |  | 
| 54 | 
            -
              --deprecated-label  | 
| 54 | 
            +
              --deprecated-label LABEL
         | 
| 55 55 |  | 
| 56 56 | 
             
              Set up custom label for deprecated section. Default is "**Deprecated:**".
         | 
| 57 57 |  | 
| 58 | 
            -
              --removed-label  | 
| 58 | 
            +
              --removed-label LABEL
         | 
| 59 59 |  | 
| 60 60 | 
             
              Set up custom label for removed section. Default is "**Removed:**".
         | 
| 61 61 |  | 
| 62 | 
            -
              --security-label  | 
| 62 | 
            +
              --security-label LABEL
         | 
| 63 63 |  | 
| 64 64 | 
             
              Set up custom label for security section. Default is "**Security:**".
         | 
| 65 65 |  | 
| 66 | 
            -
              --issues-label  | 
| 66 | 
            +
              --issues-label LABEL
         | 
| 67 67 |  | 
| 68 68 | 
             
              Set up custom label for closed-issues section. Default is "**Closed issues:**".
         | 
| 69 69 |  | 
| 70 | 
            -
              --header-label  | 
| 70 | 
            +
              --header-label LABEL
         | 
| 71 71 |  | 
| 72 72 | 
             
              Set up custom header label. Default is "# Changelog".
         | 
| 73 73 |  | 
| 74 | 
            -
              --configure-sections  | 
| 74 | 
            +
              --configure-sections HASH, STRING
         | 
| 75 75 |  | 
| 76 76 | 
             
              Define your own set of sections which overrides all default sections.
         | 
| 77 77 |  | 
| 78 | 
            -
              --add-sections  | 
| 78 | 
            +
              --add-sections HASH, STRING
         | 
| 79 79 |  | 
| 80 80 | 
             
              Add new sections but keep the default sections.
         | 
| 81 81 |  | 
| 82 | 
            -
              --front-matter  | 
| 82 | 
            +
              --front-matter JSON
         | 
| 83 83 |  | 
| 84 84 | 
             
              Add YAML front matter. Formatted as JSON because it's easier to add on the command line.
         | 
| 85 85 |  | 
| 86 | 
            -
              --pr-label  | 
| 86 | 
            +
              --pr-label LABEL
         | 
| 87 87 |  | 
| 88 88 | 
             
              Set up custom label for pull requests section. Default is "**Merged pull requests:**".
         | 
| 89 89 |  | 
| @@ -107,6 +107,10 @@ Automatically generate changelog from your tags, issues, labels and pull request | |
| 107 107 |  | 
| 108 108 | 
             
              Use milestone to detect when issue was resolved. Default is true.
         | 
| 109 109 |  | 
| 110 | 
            +
              --[no-]issues-of-open-milestones
         | 
| 111 | 
            +
             | 
| 112 | 
            +
              Include issues of open milestones. Default is true.
         | 
| 113 | 
            +
             | 
| 110 114 | 
             
              --[no-]author
         | 
| 111 115 |  | 
| 112 116 | 
             
              Add author of pull request at the end. Default is true.
         | 
| @@ -123,7 +127,7 @@ Automatically generate changelog from your tags, issues, labels and pull request | |
| 123 127 |  | 
| 124 128 | 
             
              Add to log unreleased closed issues. Default is true.
         | 
| 125 129 |  | 
| 126 | 
            -
              --unreleased-label  | 
| 130 | 
            +
              --unreleased-label LABEL
         | 
| 127 131 |  | 
| 128 132 | 
             
              Set up custom label for unreleased closed issues section. Default is "**Unreleased:**".
         | 
| 129 133 |  | 
| @@ -175,7 +179,7 @@ Automatically generate changelog from your tags, issues, labels and pull request | |
| 175 179 |  | 
| 176 180 | 
             
              Changelog will exclude specified tags.
         | 
| 177 181 |  | 
| 178 | 
            -
              --exclude-tags-regex  | 
| 182 | 
            +
              --exclude-tags-regex REGEX
         | 
| 179 183 |  | 
| 180 184 | 
             
              Apply a regular expression on tag names so that they can be excluded, for example: --exclude-tags-regex ".*\+\d{1,}".
         | 
| 181 185 |  | 
| @@ -187,19 +191,23 @@ Automatically generate changelog from your tags, issues, labels and pull request | |
| 187 191 |  | 
| 188 192 | 
             
              Changelog will end before specified tag.
         | 
| 189 193 |  | 
| 190 | 
            -
              -- | 
| 194 | 
            +
              --since-commit x
         | 
| 195 | 
            +
              
         | 
| 196 | 
            +
              Fetch only commits after this time. eg. "2017-01-01 10:00:00"
         | 
| 197 | 
            +
             | 
| 198 | 
            +
              --max-issues NUMBER
         | 
| 191 199 |  | 
| 192 200 | 
             
              Maximum number of issues to fetch from GitHub. Default is unlimited.
         | 
| 193 201 |  | 
| 194 | 
            -
              --release-url  | 
| 202 | 
            +
              --release-url URL
         | 
| 195 203 |  | 
| 196 204 | 
             
              The URL to point to for release links, in printf format (with the tag as variable).
         | 
| 197 205 |  | 
| 198 | 
            -
              --github-site  | 
| 206 | 
            +
              --github-site URL
         | 
| 199 207 |  | 
| 200 208 | 
             
              The Enterprise GitHub site where your project is hosted.
         | 
| 201 209 |  | 
| 202 | 
            -
              --github-api  | 
| 210 | 
            +
              --github-api URL
         | 
| 203 211 |  | 
| 204 212 | 
             
              The enterprise endpoint to use for your GitHub API.
         | 
| 205 213 |  | 
| @@ -207,11 +215,11 @@ Automatically generate changelog from your tags, issues, labels and pull request | |
| 207 215 |  | 
| 208 216 | 
             
              Create a simple list from issues and pull requests. Default is false.
         | 
| 209 217 |  | 
| 210 | 
            -
              --future-release  | 
| 218 | 
            +
              --future-release RELEASE-VERSION
         | 
| 211 219 |  | 
| 212 220 | 
             
              Put the unreleased changes in the specified release number.
         | 
| 213 221 |  | 
| 214 | 
            -
              --release-branch  | 
| 222 | 
            +
              --release-branch RELEASE-BRANCH
         | 
| 215 223 |  | 
| 216 224 | 
             
              Limit pull requests to the release branch, such as master or release.
         | 
| 217 225 |  | 
| @@ -219,15 +227,15 @@ Automatically generate changelog from your tags, issues, labels and pull request | |
| 219 227 |  | 
| 220 228 | 
             
              Use HTTP Cache to cache GitHub API requests (useful for large repos). Default is true.
         | 
| 221 229 |  | 
| 222 | 
            -
              --[no-]cache-file  | 
| 230 | 
            +
              --[no-]cache-file CACHE-FILE
         | 
| 223 231 |  | 
| 224 232 | 
             
              Filename to use for cache. Default is github-changelog-http-cache in a temporary directory.
         | 
| 225 233 |  | 
| 226 | 
            -
              --cache-log  | 
| 234 | 
            +
              --cache-log CACHE-LOG
         | 
| 227 235 |  | 
| 228 236 | 
             
              Filename to use for cache log. Default is github-changelog-logger.log in a temporary directory.
         | 
| 229 237 |  | 
| 230 | 
            -
              --ssl-ca-file  | 
| 238 | 
            +
              --ssl-ca-file PATH
         | 
| 231 239 |  | 
| 232 240 | 
             
              Path to cacert.pem file. Default is a bundled lib/github_changelog_generator/ssl_certs/cacert.pem. Respects SSL_CA_PATH.
         | 
| 233 241 |  | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -44,7 +44,7 @@ VCR.configure do |c| | |
| 44 44 | 
             
                decode_compressed_response: true
         | 
| 45 45 | 
             
              }
         | 
| 46 46 | 
             
              c.filter_sensitive_data("<GITHUB_TOKEN>") do
         | 
| 47 | 
            -
                "token #{ENV.fetch('CHANGELOG_GITHUB_TOKEN' | 
| 47 | 
            +
                "token #{ENV.fetch('CHANGELOG_GITHUB_TOKEN', 'frobnitz')}"
         | 
| 48 48 | 
             
              end
         | 
| 49 49 |  | 
| 50 50 | 
             
              c.configure_rspec_metadata!
         | 
| @@ -1,6 +1,5 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            # rubocop:disable Metrics/ModuleLength
         | 
| 4 3 | 
             
            module GitHubChangelogGenerator
         | 
| 5 4 | 
             
              RSpec.describe Entry do
         | 
| 6 5 | 
             
                def label(name)
         | 
| @@ -58,9 +57,6 @@ module GitHubChangelogGenerator | |
| 58 57 | 
             
                let(:issues) { [] }
         | 
| 59 58 | 
             
                let(:pull_requests) { [] }
         | 
| 60 59 | 
             
                let(:tags) { [] }
         | 
| 61 | 
            -
                let(:compare_shas) do
         | 
| 62 | 
            -
                  { "aaaaa1...master" => ["aaaaa1"] }
         | 
| 63 | 
            -
                end
         | 
| 64 60 |  | 
| 65 61 | 
             
                # Default to standard options minus verbose to avoid output during testing.
         | 
| 66 62 | 
             
                let(:options) do
         | 
| @@ -76,15 +72,14 @@ module GitHubChangelogGenerator | |
| 76 72 | 
             
                    fetch_closed_issues_and_pr: [issues, pull_requests],
         | 
| 77 73 | 
             
                    fetch_closed_pull_requests: [],
         | 
| 78 74 | 
             
                    fetch_events_async: issues + pull_requests,
         | 
| 79 | 
            -
                     | 
| 75 | 
            +
                    fetch_tag_shas: nil,
         | 
| 80 76 | 
             
                    fetch_comments_async: nil,
         | 
| 81 77 | 
             
                    default_branch: "master",
         | 
| 82 78 | 
             
                    oldest_commit: { "sha" => "aaaaa1" },
         | 
| 83 79 | 
             
                    fetch_commit: { "commit" => { "author" => { "date" => Time.now.utc } } }
         | 
| 84 80 | 
             
                  )
         | 
| 85 | 
            -
                  allow(fake_fetcher).to receive(: | 
| 86 | 
            -
                     | 
| 87 | 
            -
                    { "commits" => compare_shas["#{old}...#{new}"].collect { |sha| { "sha" => sha } } }
         | 
| 81 | 
            +
                  allow(fake_fetcher).to receive(:commits_in_branch) do
         | 
| 82 | 
            +
                    ["aaaaa1"]
         | 
| 88 83 | 
             
                  end
         | 
| 89 84 | 
             
                  allow(GitHubChangelogGenerator::OctoFetcher).to receive(:new).and_return(fake_fetcher)
         | 
| 90 85 | 
             
                  generator = GitHubChangelogGenerator::Generator.new(options)
         | 
| @@ -426,6 +421,18 @@ module GitHubChangelogGenerator | |
| 426 421 | 
             
                        sections_json.shift
         | 
| 427 422 | 
             
                      end
         | 
| 428 423 | 
             
                    end
         | 
| 424 | 
            +
                    context "parse also body_only" do
         | 
| 425 | 
            +
                      let(:sections_string) { "{ \"foo\": { \"prefix\": \"foofix\", \"labels\": [\"test1\", \"test2\"]}, \"bar\": { \"prefix\": \"barfix\", \"labels\": [\"test3\", \"test4\"], \"body_only\": true}}" }
         | 
| 426 | 
            +
             | 
| 427 | 
            +
                      it "returns correctly constructed sections" do
         | 
| 428 | 
            +
                        require "json"
         | 
| 429 | 
            +
             | 
| 430 | 
            +
                        parsed_sections = subject.send(:parse_sections, sections_string)
         | 
| 431 | 
            +
             | 
| 432 | 
            +
                        expect(parsed_sections[0].body_only).to eq false
         | 
| 433 | 
            +
                        expect(parsed_sections[1].body_only).to eq true
         | 
| 434 | 
            +
                      end
         | 
| 435 | 
            +
                    end
         | 
| 429 436 | 
             
                  end
         | 
| 430 437 | 
             
                  context "hash" do
         | 
| 431 438 | 
             
                    let(:sections_hash) do
         | 
| @@ -548,14 +555,14 @@ module GitHubChangelogGenerator | |
| 548 555 | 
             
                    end
         | 
| 549 556 |  | 
| 550 557 | 
             
                    it "assigns issues to the correct sections" do
         | 
| 551 | 
            -
                      breaking_section = entry_sections. | 
| 552 | 
            -
                      enhancement_section = entry_sections. | 
| 553 | 
            -
                      bug_section = entry_sections. | 
| 554 | 
            -
                      deprecated_section = entry_sections. | 
| 555 | 
            -
                      removed_section = entry_sections. | 
| 556 | 
            -
                      security_section = entry_sections. | 
| 557 | 
            -
                      issue_section = entry_sections. | 
| 558 | 
            -
                      merged_section = entry_sections. | 
| 558 | 
            +
                      breaking_section = entry_sections.find { |section| section.name == "breaking" }
         | 
| 559 | 
            +
                      enhancement_section = entry_sections.find { |section| section.name == "enhancements" }
         | 
| 560 | 
            +
                      bug_section = entry_sections.find { |section| section.name == "bugs" }
         | 
| 561 | 
            +
                      deprecated_section = entry_sections.find { |section| section.name == "deprecated" }
         | 
| 562 | 
            +
                      removed_section = entry_sections.find { |section| section.name == "removed" }
         | 
| 563 | 
            +
                      security_section = entry_sections.find { |section| section.name == "security" }
         | 
| 564 | 
            +
                      issue_section = entry_sections.find { |section| section.name == "issues" }
         | 
| 565 | 
            +
                      merged_section = entry_sections.find { |section| section.name == "merged" }
         | 
| 559 566 |  | 
| 560 567 | 
             
                      expect(titles_for(breaking_section.issues)).to eq(["issue breaking", "issue all the labels", "pr breaking", "pr all the labels"])
         | 
| 561 568 | 
             
                      expect(titles_for(enhancement_section.issues)).to eq(["issue enhancement", "pr enhancement"])
         | 
| @@ -612,10 +619,10 @@ module GitHubChangelogGenerator | |
| 612 619 | 
             
                    end
         | 
| 613 620 |  | 
| 614 621 | 
             
                    it "assigns issues to the correct sections" do
         | 
| 615 | 
            -
                      foo_section = entry_sections. | 
| 616 | 
            -
                      bar_section = entry_sections. | 
| 617 | 
            -
                      issue_section = entry_sections. | 
| 618 | 
            -
                      merged_section = entry_sections. | 
| 622 | 
            +
                      foo_section = entry_sections.find { |section| section.name == "foo" }
         | 
| 623 | 
            +
                      bar_section = entry_sections.find { |section| section.name == "bar" }
         | 
| 624 | 
            +
                      issue_section = entry_sections.find { |section| section.name == "issues" }
         | 
| 625 | 
            +
                      merged_section = entry_sections.find { |section| section.name == "merged" }
         | 
| 619 626 |  | 
| 620 627 | 
             
                      aggregate_failures "checks all sections" do
         | 
| 621 628 | 
             
                        expect(titles_for(foo_section.issues)).to eq(["issue test1", "issue all the labels", "issue some included labels", "pr test1", "pr all the labels", "pr some included labels"])
         | 
| @@ -670,10 +677,10 @@ module GitHubChangelogGenerator | |
| 670 677 | 
             
                    end
         | 
| 671 678 |  | 
| 672 679 | 
             
                    it "assigns issues to the correct sections" do
         | 
| 673 | 
            -
                      foo_section = entry_sections. | 
| 674 | 
            -
                      bar_section = entry_sections. | 
| 675 | 
            -
                      issue_section = entry_sections. | 
| 676 | 
            -
                      merged_section = entry_sections. | 
| 680 | 
            +
                      foo_section = entry_sections.find { |section| section.name == "foo" }
         | 
| 681 | 
            +
                      bar_section = entry_sections.find { |section| section.name == "bar" }
         | 
| 682 | 
            +
                      issue_section = entry_sections.find { |section| section.name == "issues" }
         | 
| 683 | 
            +
                      merged_section = entry_sections.find { |section| section.name == "merged" }
         | 
| 677 684 |  | 
| 678 685 | 
             
                      aggregate_failures "checks all sections" do
         | 
| 679 686 | 
             
                        expect(titles_for(foo_section.issues)).to eq(["issue test1", "issue all the labels", "pr test1", "pr all the labels"])
         | 
| @@ -737,12 +744,12 @@ module GitHubChangelogGenerator | |
| 737 744 | 
             
                    end
         | 
| 738 745 |  | 
| 739 746 | 
             
                    it "assigns issues to the correct sections" do
         | 
| 740 | 
            -
                      foo_section = entry_sections. | 
| 741 | 
            -
                      breaking_section = entry_sections. | 
| 742 | 
            -
                      enhancement_section = entry_sections. | 
| 743 | 
            -
                      bug_section = entry_sections. | 
| 744 | 
            -
                      issue_section = entry_sections. | 
| 745 | 
            -
                      merged_section = entry_sections. | 
| 747 | 
            +
                      foo_section = entry_sections.find { |section| section.name == "foo" }
         | 
| 748 | 
            +
                      breaking_section = entry_sections.find { |section| section.name == "breaking" }
         | 
| 749 | 
            +
                      enhancement_section = entry_sections.find { |section| section.name == "enhancements" }
         | 
| 750 | 
            +
                      bug_section = entry_sections.find { |section| section.name == "bugs" }
         | 
| 751 | 
            +
                      issue_section = entry_sections.find { |section| section.name == "issues" }
         | 
| 752 | 
            +
                      merged_section = entry_sections.find { |section| section.name == "merged" }
         | 
| 746 753 |  | 
| 747 754 | 
             
                      aggregate_failures "checks all sections" do
         | 
| 748 755 | 
             
                        expect(titles_for(breaking_section.issues)).to eq(["issue all the labels", "pr all the labels"])
         | 
| @@ -757,4 +764,3 @@ module GitHubChangelogGenerator | |
| 757 764 | 
             
                end
         | 
| 758 765 | 
             
              end
         | 
| 759 766 | 
             
            end
         | 
| 760 | 
            -
            # rubocop:enable Metrics/ModuleLength
         | 
| @@ -5,82 +5,137 @@ module GitHubChangelogGenerator | |
| 5 5 | 
             
                let(:default_options) { GitHubChangelogGenerator::Parser.default_options.merge(verbose: false) }
         | 
| 6 6 | 
             
                let(:options) { {} }
         | 
| 7 7 | 
             
                let(:generator) { described_class.new(default_options.merge(options)) }
         | 
| 8 | 
            -
             | 
| 9 8 | 
             
                let(:bad_label) { { "name" => "BAD" } }
         | 
| 10 | 
            -
                let(:bad_issue) { { "labels" => [bad_label] } }
         | 
| 11 9 | 
             
                let(:good_label) { { "name" => "GOOD" } }
         | 
| 12 | 
            -
                let(:good_issue) { { "labels" => [good_label] } }
         | 
| 13 | 
            -
                let(:unlabeled_issue) { { "labels" => [] } }
         | 
| 14 | 
            -
                let(:issues) { [bad_issue, good_issue, unlabeled_issue] }
         | 
| 15 10 |  | 
| 16 | 
            -
                describe " | 
| 17 | 
            -
                   | 
| 18 | 
            -
             | 
| 19 | 
            -
                   | 
| 11 | 
            +
                describe "pull requests" do
         | 
| 12 | 
            +
                  let(:bad_pull_request) { { "pull_request" => {}, "labels" => [bad_label] } }
         | 
| 13 | 
            +
                  let(:good_pull_request) { { "pull_request" => {}, "labels" => [good_label] } }
         | 
| 14 | 
            +
                  let(:unlabeled_pull_request) { { "pull_request" => {}, "labels" => [] } }
         | 
| 15 | 
            +
                  let(:pull_requests) { [bad_pull_request, good_pull_request, unlabeled_pull_request] }
         | 
| 20 16 |  | 
| 21 | 
            -
                   | 
| 17 | 
            +
                  describe "#filter_wo_labels" do
         | 
| 18 | 
            +
                    subject do
         | 
| 19 | 
            +
                      generator.filter_wo_labels(pull_requests)
         | 
| 20 | 
            +
                    end
         | 
| 22 21 |  | 
| 23 | 
            -
             | 
| 22 | 
            +
                    let(:expected_pull_requests) { pull_requests }
         | 
| 24 23 |  | 
| 25 | 
            -
             | 
| 26 | 
            -
                    let(:options) { { exclude_labels: %w[BAD BOO] } }
         | 
| 27 | 
            -
                    let(:expected_issues) { [good_issue, unlabeled_issue] }
         | 
| 24 | 
            +
                    it { is_expected.to eq(expected_pull_requests) }
         | 
| 28 25 |  | 
| 29 | 
            -
                     | 
| 30 | 
            -
             | 
| 26 | 
            +
                    context "when 'add_pr_wo_labels' is false" do
         | 
| 27 | 
            +
                      let(:options) { { add_pr_wo_labels: false } }
         | 
| 28 | 
            +
                      let(:expected_pull_requests) { [bad_pull_request, good_pull_request] }
         | 
| 31 29 |  | 
| 32 | 
            -
             | 
| 33 | 
            -
                     | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 30 | 
            +
                      it { is_expected.to eq(expected_pull_requests) }
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    context "when 'add_pr_wo_labels' is true" do
         | 
| 34 | 
            +
                      let(:options) { { add_pr_wo_labels: true } }
         | 
| 36 35 |  | 
| 37 | 
            -
                       | 
| 36 | 
            +
                      it { is_expected.to eq(expected_pull_requests) }
         | 
| 38 37 | 
             
                    end
         | 
| 39 38 | 
             
                  end
         | 
| 40 39 | 
             
                end
         | 
| 41 40 |  | 
| 42 | 
            -
                describe " | 
| 43 | 
            -
                   | 
| 44 | 
            -
             | 
| 45 | 
            -
                   | 
| 41 | 
            +
                describe "issues" do
         | 
| 42 | 
            +
                  let(:bad_issue) { { "labels" => [bad_label] } }
         | 
| 43 | 
            +
                  let(:good_issue) { { "labels" => [good_label] } }
         | 
| 44 | 
            +
                  let(:unlabeled_issue) { { "labels" => [] } }
         | 
| 45 | 
            +
                  let(:issues) { [bad_issue, good_issue, unlabeled_issue] }
         | 
| 46 46 |  | 
| 47 | 
            -
                   | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 47 | 
            +
                  describe "#filter_wo_labels" do
         | 
| 48 | 
            +
                    subject do
         | 
| 49 | 
            +
                      generator.filter_wo_labels(issues)
         | 
| 50 | 
            +
                    end
         | 
| 50 51 |  | 
| 51 | 
            -
             | 
| 52 | 
            -
                    let(:options) { { exclude_labels: %w[BAD BOO] } }
         | 
| 53 | 
            -
                    let(:expected_issues) { [good_issue, unlabeled_issue] }
         | 
| 52 | 
            +
                    let(:expected_issues) { issues }
         | 
| 54 53 |  | 
| 55 54 | 
             
                    it { is_expected.to eq(expected_issues) }
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    context "when 'add_issues_wo_labels' is false" do
         | 
| 57 | 
            +
                      let(:options) { { add_issues_wo_labels: false } }
         | 
| 58 | 
            +
                      let(:expected_issues) { [bad_issue, good_issue] }
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                      it { is_expected.to eq(expected_issues) }
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    context "when 'add_issues_wo_labels' is true" do
         | 
| 64 | 
            +
                      let(:options) { { add_issues_wo_labels: true } }
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                      it { is_expected.to eq(expected_issues) }
         | 
| 67 | 
            +
                    end
         | 
| 56 68 | 
             
                  end
         | 
| 57 69 |  | 
| 58 | 
            -
                   | 
| 59 | 
            -
                     | 
| 60 | 
            -
             | 
| 70 | 
            +
                  describe "#exclude_issues_by_labels" do
         | 
| 71 | 
            +
                    subject do
         | 
| 72 | 
            +
                      generator.exclude_issues_by_labels(issues)
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    let(:expected_issues) { issues }
         | 
| 61 76 |  | 
| 62 77 | 
             
                    it { is_expected.to eq(expected_issues) }
         | 
| 63 78 |  | 
| 64 | 
            -
                    context " | 
| 65 | 
            -
                      let(:options) { {  | 
| 66 | 
            -
                      let(:expected_issues) { [ | 
| 79 | 
            +
                    context "when 'exclude_labels' is provided" do
         | 
| 80 | 
            +
                      let(:options) { { exclude_labels: %w[BAD BOO] } }
         | 
| 81 | 
            +
                      let(:expected_issues) { [good_issue, unlabeled_issue] }
         | 
| 67 82 |  | 
| 68 83 | 
             
                      it { is_expected.to eq(expected_issues) }
         | 
| 69 84 | 
             
                    end
         | 
| 70 85 |  | 
| 71 | 
            -
                    context "with  | 
| 72 | 
            -
                       | 
| 73 | 
            -
                       | 
| 86 | 
            +
                    context "with no option given" do
         | 
| 87 | 
            +
                      subject(:generator) { described_class.new }
         | 
| 88 | 
            +
                      it "passes everything through when no option given" do
         | 
| 89 | 
            +
                        result = generator.exclude_issues_by_labels(issues)
         | 
| 74 90 |  | 
| 75 | 
            -
             | 
| 91 | 
            +
                        expect(result).to eq(issues)
         | 
| 92 | 
            +
                      end
         | 
| 76 93 | 
             
                    end
         | 
| 77 94 | 
             
                  end
         | 
| 78 95 |  | 
| 79 | 
            -
                   | 
| 80 | 
            -
                     | 
| 81 | 
            -
             | 
| 96 | 
            +
                  describe "#get_filtered_issues" do
         | 
| 97 | 
            +
                    subject do
         | 
| 98 | 
            +
                      generator.get_filtered_issues(issues)
         | 
| 99 | 
            +
                    end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                    let(:expected_issues) { issues }
         | 
| 82 102 |  | 
| 83 103 | 
             
                    it { is_expected.to eq(expected_issues) }
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                    context "when 'exclude_labels' is provided" do
         | 
| 106 | 
            +
                      let(:options) { { exclude_labels: %w[BAD BOO] } }
         | 
| 107 | 
            +
                      let(:expected_issues) { [good_issue, unlabeled_issue] }
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                      it { is_expected.to eq(expected_issues) }
         | 
| 110 | 
            +
                    end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                    context "when 'add_issues_wo_labels' is false" do
         | 
| 113 | 
            +
                      let(:options) { { add_issues_wo_labels: false } }
         | 
| 114 | 
            +
                      let(:expected_issues) { [bad_issue, good_issue] }
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                      it { is_expected.to eq(expected_issues) }
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                      context "with 'exclude_labels'" do
         | 
| 119 | 
            +
                        let(:options) { { add_issues_wo_labels: false, exclude_labels: %w[GOOD] } }
         | 
| 120 | 
            +
                        let(:expected_issues) { [bad_issue] }
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                        it { is_expected.to eq(expected_issues) }
         | 
| 123 | 
            +
                      end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                      context "with 'include_labels'" do
         | 
| 126 | 
            +
                        let(:options) { { add_issues_wo_labels: false, include_labels: %w[GOOD] } }
         | 
| 127 | 
            +
                        let(:expected_issues) { [good_issue] }
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                        it { is_expected.to eq(expected_issues) }
         | 
| 130 | 
            +
                      end
         | 
| 131 | 
            +
                    end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                    context "when 'include_labels' is specified" do
         | 
| 134 | 
            +
                      let(:options) { { include_labels: %w[GOOD] } }
         | 
| 135 | 
            +
                      let(:expected_issues) { [good_issue, unlabeled_issue] }
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                      it { is_expected.to eq(expected_issues) }
         | 
| 138 | 
            +
                    end
         | 
| 84 139 | 
             
                  end
         | 
| 85 140 | 
             
                end
         | 
| 86 141 | 
             
              end
         |