release-notes 0.1.0 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +20 -0
- data/.gitignore +2 -1
- data/.rubocop.yml +72 -0
- data/.travis.yml +9 -2
- data/Gemfile +0 -1
- data/README.md +35 -25
- data/bin/console +0 -8
- data/lib/generators/release/notes/install/install_generator.rb +5 -4
- data/lib/generators/release/notes/install/templates/release_notes.rb +8 -6
- data/lib/release/notes.rb +14 -14
- data/lib/release/notes/configuration.rb +38 -18
- data/lib/release/notes/date_format.rb +1 -1
- data/lib/release/notes/git.rb +9 -3
- data/lib/release/notes/link.rb +28 -14
- data/lib/release/notes/log.rb +17 -12
- data/lib/release/notes/pretty_print.rb +3 -1
- data/lib/release/notes/railtie.rb +2 -2
- data/lib/release/notes/system.rb +5 -1
- data/lib/release/notes/version.rb +1 -1
- data/lib/release/notes/write.rb +50 -19
- data/lib/tasks/update_release_notes.rake +2 -0
- data/release-notes.gemspec +10 -8
- metadata +42 -12
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cb0b98d5a15dd9a96c2f431aba996b34aafaeeff0b14c402d742b00eadb97fba
|
4
|
+
data.tar.gz: 261217599cb38ffc79908c7039af54f3c263bfcf8fa11c1523f08e0d0b754ab0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 780b3d9e8f55ffa5384f2886ccdfba0192e98fef078dd10a82fe5df72b3dea21ec99f24d1dc1ceb483bb1325a7dbc1e108b54381293e6b2f566ac33c40d57d7a
|
7
|
+
data.tar.gz: 65dd44cd18a4b003b2939f97c2e988081083198ae28f2e4e93296d2e3a583f0753239b12e9a85601d8091fa4663736ea11996f2dd4ffc2a546e2baa672a9b4c7
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Issue
|
2
|
+
|
3
|
+
Put a brief summary here
|
4
|
+
|
5
|
+
## Environment
|
6
|
+
|
7
|
+
- Ruby **[version]**
|
8
|
+
- Rails **[version]**
|
9
|
+
- release-notes **[version]**
|
10
|
+
|
11
|
+
## Current behavior
|
12
|
+
|
13
|
+
Include code samples, errors, steps to reproduce the error and stacktraces if appropriate.
|
14
|
+
|
15
|
+
Will be even more helpful if you provide a test case that reproduces the error.
|
16
|
+
|
17
|
+
## Expected behavior
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Type of PR (feature, enhancement, bug fix, etc.)
|
2
|
+
|
3
|
+
## Description
|
4
|
+
|
5
|
+
Please include a summary of the change and which issue is fixed.
|
6
|
+
|
7
|
+
Fixes # (issue)
|
8
|
+
|
9
|
+
## Programmer Checklist
|
10
|
+
|
11
|
+
- [ ] My code follows the style guidelines of this project
|
12
|
+
- [ ] I have rebased the branch with the latest code from master
|
13
|
+
- [ ] I have performed a self-review of my own code
|
14
|
+
- [ ] I have commented my code, particularly in hard-to-understand areas, and at the top of new interactors
|
15
|
+
- [ ] I have added tests that prove my fix is effective or that my feature works
|
16
|
+
- [ ] The build is passing
|
17
|
+
|
18
|
+
## Screenshots (if applicable)
|
19
|
+
|
20
|
+
## Dependencies introduced
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.5.3
|
3
|
+
Exclude:
|
4
|
+
- "bin/*"
|
5
|
+
- "./**/*.gemspec"
|
6
|
+
- "Gemfile"
|
7
|
+
- "Rakefile"
|
8
|
+
- "vendor/**/*"
|
9
|
+
|
10
|
+
Metrics/LineLength:
|
11
|
+
Max: 120
|
12
|
+
|
13
|
+
Metrics/BlockLength:
|
14
|
+
Max: 35
|
15
|
+
Exclude:
|
16
|
+
- "./**/spec/**/*"
|
17
|
+
|
18
|
+
Style/StringLiterals:
|
19
|
+
EnforcedStyle: double_quotes
|
20
|
+
Exclude:
|
21
|
+
- Gemfile
|
22
|
+
|
23
|
+
Layout/DotPosition:
|
24
|
+
# Multi-line method chaining should be done with trailing dots.
|
25
|
+
EnforcedStyle: trailing
|
26
|
+
|
27
|
+
Style/TrailingCommaInArguments:
|
28
|
+
# If `comma`, the cop requires a comma after the last argument, but only for
|
29
|
+
# parenthesized method calls where each argument is on its own line.
|
30
|
+
EnforcedStyleForMultiline: comma
|
31
|
+
|
32
|
+
Style/TrailingCommaInArrayLiteral:
|
33
|
+
# If `comma`, the cop requires a comma after the last item in an array,
|
34
|
+
# but only when each item is on its own line.
|
35
|
+
EnforcedStyleForMultiline: comma
|
36
|
+
|
37
|
+
Style/TrailingCommaInHashLiteral:
|
38
|
+
# If `comma`, the cop requires a comma after the last item in a hash,
|
39
|
+
# but only when each item is on its own line.
|
40
|
+
EnforcedStyleForMultiline: comma
|
41
|
+
|
42
|
+
Style/MutableConstant:
|
43
|
+
# Do not assign mutable objects to constants.
|
44
|
+
Enabled: false
|
45
|
+
|
46
|
+
Style/Documentation:
|
47
|
+
# Document classes and non-namespace modules
|
48
|
+
Enabled: false
|
49
|
+
|
50
|
+
Style/ClassAndModuleChildren:
|
51
|
+
# Checks style of children classes and modules.
|
52
|
+
Enabled: false
|
53
|
+
|
54
|
+
Style/FrozenStringLiteralComment:
|
55
|
+
# Checks existence of the frozen string literal comment
|
56
|
+
Enabled: true
|
57
|
+
|
58
|
+
Style/RescueStandardError:
|
59
|
+
# Checks that you are including the error class
|
60
|
+
# when you rescue
|
61
|
+
Enabled: false
|
62
|
+
|
63
|
+
Style/PercentLiteralDelimiters:
|
64
|
+
# Percent literal delimeters are always parentheses
|
65
|
+
PreferredDelimiters:
|
66
|
+
{ default: (),
|
67
|
+
'%i': '()',
|
68
|
+
'%I': '()',
|
69
|
+
'%r': '()',
|
70
|
+
'%w': '()',
|
71
|
+
'%W': '()'
|
72
|
+
}
|
data/.travis.yml
CHANGED
@@ -1,10 +1,17 @@
|
|
1
1
|
sudo: false
|
2
2
|
language: ruby
|
3
3
|
rvm:
|
4
|
-
- 2.4.
|
4
|
+
- 2.4.1
|
5
|
+
- 2.4.2
|
6
|
+
- 2.4.5
|
7
|
+
- 2.5.0
|
8
|
+
- 2.5.3
|
9
|
+
cache: bundler
|
5
10
|
before_install: gem install bundler -v 1.12.5
|
6
11
|
env:
|
7
12
|
global:
|
8
13
|
secure: ovawk+NnGZGW+hOeC3iPMZ9jKY5FvaxfHLj6XX4Vfe12cq0cdGYirW6pk2uKdJZdE0pC5q4sFv1ZTgcNSTySuNpQ9Gkp4xjcGEVr5JSdmVse8DuxttwkeSPt94DemyMK3f0A3dWN8OJF7/NQbacPeUuXryxmusCqJMlWccVYGeSQQNJ21mFfl2pCf6Z9qls4Q3rzXc4hsVQ5G1B/j9YcMjax0EwXI4cEq/6JadK4OmXrGkCw6M/wvBEqNyhLz+R/gcYiJZqYUETdncRuNiH8N6JKiaCnZUFkGY4bggpOvz29lj3JEQV9jY+3UBeqxuYj3glT7buEuf6//ARedY7IDlupkiDNuSpIKJhzIKAgitc/g+cnUflQV8PiImAEseO0OpoAJ7Bsa688EgyvMgo/kYwjHqZetvlUksQI+XyZ+o7/88LF2Qz4pbuBtdFC4DaKaeqQN5afIHSPtxhYwFA/n+GmY4jymj5ZWod9zZasVdlDgCQzgH5M1W7nEGun8mRW93wf8+3wAx+fXVbB67aDbqJFBJfH6zm/aBCN16kGkHUibRxUyb0F52woBQLUcOIr9Kbujp02D7IK3Z7PFz+DtHfA8aYRXxRDIHxx0tw91UxQzBinsq27kH8EWDmEKMHJeZlMRR4X4ijd6+KFoKUobXFblCeVeO0HCIBxpfTc39w=
|
14
|
+
script:
|
15
|
+
- bundle exec rubocop
|
9
16
|
after_success:
|
10
|
-
- bundle exec codeclimate-test-reporter
|
17
|
+
- bundle exec codeclimate-test-reporter
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -8,15 +8,16 @@
|
|
8
8
|
Release notes for the stakeholders.
|
9
9
|
|
10
10
|
Release::Notes is a small wrapper around your project's git log. The gem is
|
11
|
-
intended to help increase visability to all team members and stakeholders with
|
11
|
+
intended to help increase visability to all team members and/or stakeholders with
|
12
12
|
automated documentation of important changes made to your code base for a given production
|
13
13
|
deployment based on tags and labels in your commit messages.
|
14
14
|
|
15
|
-
Release::Notes is different than a changelog.
|
16
|
-
team members
|
17
|
-
to the production software.
|
18
|
-
|
19
|
-
|
15
|
+
Release::Notes is different than a changelog. Though it can log all commits, it's
|
16
|
+
meant for situations where other team members in your organization need to know about key changes
|
17
|
+
to the production software. These key changes are determined by the labeling you set forth
|
18
|
+
in the configuration for features, bugs and misc commits.
|
19
|
+
If you're looking for a comprehnsive changelog that reflects resolved github issues and uses the
|
20
|
+
github api, I'd suggest you look at something else like
|
20
21
|
[github-changelog-generator](https://github.com/skywinder/github-changelog-generator).
|
21
22
|
|
22
23
|
Not looking for a tested gem or prefer the rawness of a bash script? Checkout the similar
|
@@ -52,7 +53,6 @@ This Release::Notes generator creates an initializer file to allow further confi
|
|
52
53
|
|
53
54
|
If you're not in a rails project you can create the file yourself.
|
54
55
|
|
55
|
-
|
56
56
|
## Configure
|
57
57
|
|
58
58
|
Override any of these defaults in `config/initializers/release_notes.rb`:
|
@@ -65,16 +65,19 @@ Release::Notes.configure do |config|
|
|
65
65
|
config.ignore_case = true
|
66
66
|
config.log_format = '- %s'
|
67
67
|
config.extended_regex = true
|
68
|
-
config.bug_labels = %w
|
69
|
-
config.feature_labels = %w
|
70
|
-
config.misc_labels = %w
|
68
|
+
config.bug_labels = %w(Fix Update)
|
69
|
+
config.feature_labels = %w(Add Create)
|
70
|
+
config.misc_labels = %w(Refactor)
|
71
71
|
config.bug_title = '**Fixed bugs:**'
|
72
72
|
config.feature_title = '**Implemented enhancements:**'
|
73
73
|
config.misc_title = '**Miscellaneous:**'
|
74
|
-
config.
|
75
|
-
config.
|
76
|
-
config.
|
74
|
+
config.log_all_title = '**Other:**'
|
75
|
+
config.log_all = false
|
76
|
+
config.link_to_labels = %w()
|
77
|
+
config.link_to_humanize = %w()
|
78
|
+
config.link_to_sites = %w()
|
77
79
|
config.timezone = 'America/New_York'
|
80
|
+
config.force_rewrite = false
|
78
81
|
end
|
79
82
|
```
|
80
83
|
|
@@ -85,16 +88,24 @@ For more information about each individual setting checkout Release::Notes's
|
|
85
88
|
|
86
89
|
### TL;DR
|
87
90
|
|
91
|
+
#### Rails
|
92
|
+
|
88
93
|
```sh
|
89
|
-
|
94
|
+
bin/rails update_release_notes:run
|
95
|
+
```
|
96
|
+
|
97
|
+
#### Non-Rails
|
98
|
+
|
99
|
+
```sh
|
100
|
+
bundle exec rake update_release_notes:run
|
90
101
|
```
|
91
102
|
|
92
103
|
### Git Worklow
|
93
104
|
|
94
105
|
Release::Notes works best with a rebase workflow and requires tagging. General rebase benefits include:
|
95
106
|
|
96
|
-
|
97
|
-
|
107
|
+
- One clear commit per feature, bug or miscellaneous addition to the codebase
|
108
|
+
- Commits in logical time manner
|
98
109
|
|
99
110
|
By default configuration, Release::Notes ignores merges. Along with rebasing, by deafult,
|
100
111
|
Release::Notes relies mainly on the subject of a commit. Therefore, it's important to craft concise and
|
@@ -103,18 +114,19 @@ meaningful commit subjects with longer bodies as needed for larger feature addit
|
|
103
114
|
For more information about a rebase workflow or crafting solid commit messages
|
104
115
|
check out the following links
|
105
116
|
|
106
|
-
|
107
|
-
|
117
|
+
- [Commit Messages](http://chris.beams.io/posts/git-commit/)
|
118
|
+
- [Git Rebase Workflow](https://git-scm.com/book/en/v2/Git-Branching-Rebasing)
|
108
119
|
|
109
120
|
### Deploying with Capistrano
|
110
121
|
|
111
122
|
If using Rails, a rake task is included and would be best utilized within your deploy script.
|
112
123
|
|
113
|
-
If not on rails, but using rake, you can easily craft your own rake task.
|
124
|
+
If not on rails, but using rake, you can easily craft your own rake task. At the very least calling
|
114
125
|
|
115
126
|
```ruby
|
116
127
|
Release::Notes::Update.new.run
|
117
128
|
```
|
129
|
+
|
118
130
|
is the only instance that needs to be instantiated and invoked.
|
119
131
|
|
120
132
|
A sample capistrano production file might look something like this:
|
@@ -156,11 +168,11 @@ includes this last commit.
|
|
156
168
|
|
157
169
|
## Note
|
158
170
|
|
159
|
-
|
160
|
-
(PR's to make this more flexible are welcome)
|
161
|
-
|
171
|
+
- Your project must tag releases(release-notes uses the tag date to output the changes)
|
172
|
+
(PR's to make this more flexible are welcome)
|
173
|
+
- Linking is opinionated and will link to a URI structure of `#{site-url}/#{issue_number}`. It
|
162
174
|
will ouput something like: `[HONEYBADGER #33150353](https://app.honeybadger.io/projects/9999/faults/33150353)`.
|
163
|
-
This also means that your link_to_labels have to be something like `['HB #']` (PR's to make this more flexible are welcome)
|
175
|
+
This also means that your link_to_labels have to be something like `['HB #']` (PR's to make this more flexible are welcome)
|
164
176
|
|
165
177
|
## Development
|
166
178
|
|
@@ -172,8 +184,6 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
172
184
|
|
173
185
|
Bug reports and pull requests are welcome on GitHub at https://github.com/dvmonroe/release-notes. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
174
186
|
|
175
|
-
|
176
187
|
## License
|
177
188
|
|
178
189
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
179
|
-
|
data/bin/console
CHANGED
@@ -3,14 +3,6 @@
|
|
3
3
|
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'release/notes'
|
6
|
-
require 'pry-byebug'
|
7
|
-
|
8
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
9
|
-
# with your gem easier. You can also use a different console, if you like.
|
10
|
-
|
11
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
12
|
-
# require "pry"
|
13
|
-
# Pry.start
|
14
6
|
|
15
7
|
require 'irb'
|
16
8
|
IRB.start
|
@@ -1,18 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
|
+
require "rails/generators/base"
|
3
4
|
|
4
5
|
module Release
|
5
6
|
module Notes
|
6
7
|
module Generators
|
7
8
|
class InstallGenerator < Rails::Generators::Base
|
8
|
-
source_root File.expand_path(
|
9
|
+
source_root File.expand_path("templates", __dir__)
|
9
10
|
|
10
11
|
def create_release_notes_initializer
|
11
|
-
copy_file
|
12
|
+
copy_file "release_notes.rb", "config/initializers/release_notes.rb"
|
12
13
|
end
|
13
14
|
|
14
15
|
def display_readme
|
15
|
-
readme
|
16
|
+
readme "README"
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
@@ -7,14 +7,16 @@ Release::Notes.configure do |config|
|
|
7
7
|
# config.ignore_case = true
|
8
8
|
# config.log_format = '- %s'
|
9
9
|
# config.extended_regex = true
|
10
|
-
# config.bug_labels = %w
|
11
|
-
# config.feature_labels = %w
|
12
|
-
# config.misc_labels = %w
|
10
|
+
# config.bug_labels = %w(Fix Update)
|
11
|
+
# config.feature_labels = %w(Add Create)
|
12
|
+
# config.misc_labels = %w(Refactor)
|
13
13
|
# config.bug_title = '**Fixed bugs:**'
|
14
14
|
# config.feature_title = '**Implemented enhancements:**'
|
15
15
|
# config.misc_title = '**Miscellaneous:**'
|
16
|
-
# config.
|
17
|
-
# config.
|
18
|
-
# config.
|
16
|
+
# config.log_all_title = '**Other:**'
|
17
|
+
# config.log_all = false
|
18
|
+
# config.link_to_labels = %w()
|
19
|
+
# config.link_to_humanize = %w()
|
20
|
+
# config.link_to_sites = %w()
|
19
21
|
# config.timezone = 'America/New_York'
|
20
22
|
end
|
data/lib/release/notes.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "active_support"
|
4
|
+
require "active_support/core_ext/time"
|
5
5
|
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
6
|
+
require "release/notes/date_format"
|
7
|
+
require "release/notes/link"
|
8
|
+
require "release/notes/pretty_print"
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
10
|
+
require "release/notes/version"
|
11
|
+
require "release/notes/configuration"
|
12
|
+
require "release/notes/git"
|
13
|
+
require "release/notes/system"
|
14
|
+
require "release/notes/with_configuration"
|
15
15
|
|
16
|
-
require
|
17
|
-
require
|
16
|
+
require "release/notes/write"
|
17
|
+
require "release/notes/log"
|
18
18
|
|
19
|
-
require
|
19
|
+
require "release/notes/railtie" if defined?(Rails)
|
20
20
|
|
21
21
|
module Release
|
22
22
|
module Notes
|
@@ -34,7 +34,7 @@ module Release
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.root
|
37
|
-
File.expand_path(
|
37
|
+
File.expand_path("..", __dir__)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -72,6 +72,16 @@ module Release
|
|
72
72
|
# @return [String]
|
73
73
|
attr_accessor :misc_title
|
74
74
|
|
75
|
+
# Controls whether all logs that do not match the other labels are listed
|
76
|
+
# Defaults to `false`
|
77
|
+
# @return [Boolean]
|
78
|
+
attr_accessor :log_all
|
79
|
+
|
80
|
+
# Controls the title used in your generated log for all commits listed
|
81
|
+
# Defaults to `**Other:**`.
|
82
|
+
# @return [String]
|
83
|
+
attr_accessor :log_all_title
|
84
|
+
|
75
85
|
# The labels grepped for in your commit subject that you want to linkify.
|
76
86
|
# The index within the array must match the index for the site
|
77
87
|
# in `:link_to_humanize` and `:link_to_sites`.
|
@@ -105,39 +115,47 @@ module Release
|
|
105
115
|
# @return [Boolean]
|
106
116
|
attr_accessor :prettify_messages
|
107
117
|
|
108
|
-
|
109
|
-
|
110
|
-
|
118
|
+
# Controls whether to rewrite the output file or append to it.
|
119
|
+
# Defaults to `false`.
|
120
|
+
# @return [Boolean]
|
121
|
+
attr_accessor :force_rewrite
|
122
|
+
|
123
|
+
def initialize # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
124
|
+
@output_file = "./RELEASE_NOTES.md"
|
125
|
+
@temp_file = "./release-notes.tmp.md"
|
111
126
|
@include_merges = false
|
112
127
|
@ignore_case = true
|
113
128
|
@extended_regex = true
|
114
|
-
@log_format =
|
115
|
-
@bug_labels = %w
|
116
|
-
@feature_labels = %w
|
117
|
-
@misc_labels = %w
|
118
|
-
@bug_title =
|
119
|
-
@feature_title =
|
120
|
-
@misc_title =
|
121
|
-
@
|
122
|
-
@
|
123
|
-
@
|
124
|
-
@
|
129
|
+
@log_format = "- %s"
|
130
|
+
@bug_labels = %w(Fix Update)
|
131
|
+
@feature_labels = %w(Add Create)
|
132
|
+
@misc_labels = %w(Refactor)
|
133
|
+
@bug_title = "**Fixed bugs:**"
|
134
|
+
@feature_title = "**Implemented enhancements:**"
|
135
|
+
@misc_title = "**Miscellaneous:**"
|
136
|
+
@log_all_title = "**Other**"
|
137
|
+
@log_all = false
|
138
|
+
@link_to_labels = %w()
|
139
|
+
@link_to_humanize = %w()
|
140
|
+
@link_to_sites = %w()
|
141
|
+
@timezone = "America/New_York"
|
125
142
|
@prettify_messages = true
|
143
|
+
@force_rewrite = false
|
126
144
|
end
|
127
145
|
|
128
146
|
# @return [String]
|
129
147
|
def include_merges?
|
130
|
-
@include_merges ?
|
148
|
+
@include_merges ? "" : "--no-merges"
|
131
149
|
end
|
132
150
|
|
133
151
|
# @return [String]
|
134
152
|
def regex_type
|
135
|
-
@extended_regex ?
|
153
|
+
@extended_regex ? "-E" : ""
|
136
154
|
end
|
137
155
|
|
138
156
|
# @return [String]
|
139
157
|
def grep_insensitive?
|
140
|
-
@ignore_case ?
|
158
|
+
@ignore_case ? "-i" : ""
|
141
159
|
end
|
142
160
|
|
143
161
|
# @return [String]
|
@@ -176,12 +194,13 @@ module Release
|
|
176
194
|
@prettify_messages
|
177
195
|
end
|
178
196
|
|
197
|
+
# :nocov:
|
179
198
|
private
|
180
199
|
|
181
200
|
# @api private
|
182
201
|
# Using over Regexp.union
|
183
202
|
def generate_regex(arr)
|
184
|
-
arr.join(
|
203
|
+
arr.join("|").insert(0, "(").insert(-1, ")")
|
185
204
|
end
|
186
205
|
end
|
187
206
|
|
@@ -206,5 +225,6 @@ module Release
|
|
206
225
|
def self.configure
|
207
226
|
yield configuration
|
208
227
|
end
|
228
|
+
# :nocov:
|
209
229
|
end
|
210
230
|
end
|
data/lib/release/notes/git.rb
CHANGED
@@ -8,17 +8,23 @@ module Release
|
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
10
|
included do
|
11
|
-
delegate :log_format, :grep_insensitive?, :regex_type, :include_merges?, to: :config
|
11
|
+
delegate :all_labels, :log_format, :grep_insensitive?, :regex_type, :include_merges?, to: :config
|
12
12
|
|
13
13
|
def log(**opts)
|
14
14
|
"git log '#{opts[:tag_from]}'..'#{opts[:tag_to]}' --grep='#{opts[:label]}'" \
|
15
15
|
" #{regex_type} #{grep_insensitive?}" \
|
16
16
|
" #{include_merges?} --format='#{log_format}'"
|
17
17
|
end
|
18
|
+
|
19
|
+
def invert_log(**opts)
|
20
|
+
"git log '#{opts[:tag_from]}'..'#{opts[:tag_to]}' --grep='#{all_labels}'" \
|
21
|
+
" #{regex_type} #{grep_insensitive?} --invert-grep" \
|
22
|
+
" #{include_merges?} --format='#{log_format}'"
|
23
|
+
end
|
18
24
|
end
|
19
25
|
|
20
26
|
def last_tag
|
21
|
-
|
27
|
+
"git describe --abbrev=0 --tags"
|
22
28
|
end
|
23
29
|
|
24
30
|
def tag_date(tag)
|
@@ -26,7 +32,7 @@ module Release
|
|
26
32
|
end
|
27
33
|
|
28
34
|
def read_all_tags
|
29
|
-
|
35
|
+
"git tags | sort -u -r"
|
30
36
|
end
|
31
37
|
end
|
32
38
|
end
|
data/lib/release/notes/link.rb
CHANGED
@@ -9,35 +9,49 @@ module Release
|
|
9
9
|
delegate :link_to_labels, :link_to_sites, :link_to_humanize, to: :config
|
10
10
|
|
11
11
|
def link_lines(lines:)
|
12
|
-
new_lines =
|
12
|
+
@new_lines = ""
|
13
|
+
split_lines(lines)
|
14
|
+
@new_lines
|
15
|
+
end
|
16
|
+
|
17
|
+
# :nocov:
|
18
|
+
private
|
19
|
+
|
20
|
+
# @api private
|
21
|
+
def split_lines(lines)
|
13
22
|
lines.split("\n").each do |line|
|
14
|
-
unless link_to_labels
|
15
|
-
new_lines += "#{line}\n"
|
23
|
+
unless link_to_labels { |la| line.include? la }
|
24
|
+
@new_lines += "#{line}\n"
|
16
25
|
next
|
17
26
|
end
|
18
|
-
|
19
|
-
next unless line.include? label
|
20
|
-
words = line.split(/\s/)
|
21
|
-
words.each do |word|
|
22
|
-
next unless (word =~ /^#.*/)&.zero?
|
23
|
-
new_lines += "#{replace(line, word, label, i)}\n"
|
24
|
-
end
|
25
|
-
end
|
27
|
+
split_words(line)
|
26
28
|
end
|
27
|
-
new_lines
|
28
29
|
end
|
29
30
|
|
30
|
-
private
|
31
|
+
# @api private
|
32
|
+
def split_words(line)
|
33
|
+
link_to_labels.each_with_index do |label, i|
|
34
|
+
next unless line.include? label
|
35
|
+
|
36
|
+
words = line.split(/\s/)
|
37
|
+
words.each do |word|
|
38
|
+
next unless (word =~ /^#.*/)&.zero?
|
39
|
+
|
40
|
+
@new_lines += "#{replace(line, word, label, i)}\n"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
31
44
|
|
32
45
|
# @api private
|
33
46
|
def replace(line, issue_number, label, index)
|
34
47
|
identifier = "#{label.split(/\s/)[0]} #{issue_number}"
|
35
48
|
humanized = "#{link_to_humanize[index]} #{issue_number}"
|
36
|
-
linked = "[#{humanized}](#{link_to_sites[index]})"
|
49
|
+
linked = "[#{humanized}](#{link_to_sites[index]}\/#{issue_number.tr('^0-9', '')})"
|
37
50
|
|
38
51
|
line.gsub! identifier, linked
|
39
52
|
line
|
40
53
|
end
|
54
|
+
# :nocov:
|
41
55
|
end
|
42
56
|
end
|
43
57
|
end
|
data/lib/release/notes/log.rb
CHANGED
@@ -9,11 +9,10 @@ module Release
|
|
9
9
|
attr_reader :config, :writer, :date_formatter
|
10
10
|
attr_reader :all_tags
|
11
11
|
|
12
|
-
delegate :all_labels, :features, :bugs, :misc, :feature_title,
|
13
|
-
:bug_title, :misc_title, :release_notes_exist?, to: :config
|
14
|
-
|
12
|
+
delegate :force_rewrite, :all_labels, :log_all, :features, :bugs, :misc, :feature_title,
|
13
|
+
:bug_title, :misc_title, :log_all_title, :release_notes_exist?, to: :config
|
15
14
|
delegate :date_humanized, :format_tag_date, to: :date_formatter
|
16
|
-
delegate :
|
15
|
+
delegate :digest_date, :digest_title, to: :writer
|
17
16
|
|
18
17
|
def initialize(config)
|
19
18
|
@config = config
|
@@ -23,7 +22,7 @@ module Release
|
|
23
22
|
end
|
24
23
|
|
25
24
|
def perform
|
26
|
-
if release_notes_exist?
|
25
|
+
if release_notes_exist? && !force_rewrite
|
27
26
|
# Find the last tag and group all commits
|
28
27
|
# under a date header at the time this is run
|
29
28
|
find_last_tag_and_log
|
@@ -35,20 +34,26 @@ module Release
|
|
35
34
|
writer.write_new_file
|
36
35
|
end
|
37
36
|
|
37
|
+
# :nocov:
|
38
38
|
private
|
39
39
|
|
40
|
-
def all_tags
|
40
|
+
def all_tags # rubocop:disable Lint/DuplicateMethods
|
41
41
|
@all_tags ||= System.all_tags.split("\n")
|
42
42
|
# return Error.new(msg: :missing_tags) unless all_tags.present?
|
43
43
|
end
|
44
44
|
|
45
45
|
# @api private
|
46
46
|
def copy_single_tag_of_activity(tag_from:, tag_to: nil)
|
47
|
-
tag_to ||=
|
47
|
+
tag_to ||= "HEAD"
|
48
48
|
[features, bugs, misc].each_with_index do |regex, i|
|
49
|
-
log = system_call(tag_from: tag_from, tag_to: tag_to, label: regex)
|
50
|
-
|
49
|
+
log = system_call(tag_from: tag_from, tag_to: tag_to, label: regex, log_all: false)
|
50
|
+
digest_title(title: titles[i], log_message: log) if log.present?
|
51
51
|
end
|
52
|
+
|
53
|
+
return unless log_all
|
54
|
+
|
55
|
+
log = system_call(tag_from: tag_from, tag_to: tag_to, log_all: true)
|
56
|
+
digest_title(title: log_all_title, log_message: log) if log.present?
|
52
57
|
end
|
53
58
|
|
54
59
|
# @api private
|
@@ -57,7 +62,7 @@ module Release
|
|
57
62
|
return false unless system_call(tag_from: last_tag, label: all_labels).present?
|
58
63
|
|
59
64
|
# output the date right now
|
60
|
-
|
65
|
+
digest_date date: date_humanized
|
61
66
|
copy_single_tag_of_activity(tag_from: last_tag)
|
62
67
|
end
|
63
68
|
|
@@ -78,7 +83,7 @@ module Release
|
|
78
83
|
next unless previous_tag.present? &&
|
79
84
|
system_call(tag_from: previous_tag, tag_to: ta, label: all_labels).present?
|
80
85
|
|
81
|
-
|
86
|
+
digest_date date: date_humanized(date: System.tag_date(tag: ta))
|
82
87
|
copy_single_tag_of_activity(tag_from: previous_tag, tag_to: ta)
|
83
88
|
end
|
84
89
|
end
|
@@ -90,10 +95,10 @@ module Release
|
|
90
95
|
end
|
91
96
|
end
|
92
97
|
|
93
|
-
# @api private
|
94
98
|
def titles
|
95
99
|
[feature_title, bug_title, misc_title]
|
96
100
|
end
|
101
|
+
# :nocov:
|
97
102
|
end
|
98
103
|
end
|
99
104
|
end
|
@@ -9,16 +9,18 @@ module Release
|
|
9
9
|
delegate :all_labels, to: :config
|
10
10
|
|
11
11
|
def prettify(line:)
|
12
|
-
line.gsub(labels_regex,
|
12
|
+
line.gsub(labels_regex, "").strip
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
# :nocov:
|
16
17
|
private
|
17
18
|
|
18
19
|
# @api private
|
19
20
|
def labels_regex
|
20
21
|
Regexp.new all_labels, Regexp::IGNORECASE
|
21
22
|
end
|
23
|
+
# :nocov:
|
22
24
|
end
|
23
25
|
end
|
24
26
|
end
|
@@ -4,11 +4,11 @@ module Release
|
|
4
4
|
module Notes
|
5
5
|
class Railtie < Rails::Railtie
|
6
6
|
rake_tasks do
|
7
|
-
load
|
7
|
+
load "tasks/update_release_notes.rake"
|
8
8
|
end
|
9
9
|
|
10
10
|
generators do
|
11
|
-
require
|
11
|
+
require "generators/release/notes/install/install_generator.rb"
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
data/lib/release/notes/system.rb
CHANGED
data/lib/release/notes/write.rb
CHANGED
@@ -10,7 +10,7 @@ module Release
|
|
10
10
|
attr_accessor :config
|
11
11
|
|
12
12
|
delegate :output_file, :temp_file, :link_commits?, :all_labels,
|
13
|
-
:prettify_messages?, :release_notes_exist?, to: :config
|
13
|
+
:prettify_messages?, :release_notes_exist?, :force_rewrite, to: :config
|
14
14
|
|
15
15
|
def initialize(config)
|
16
16
|
@config = config
|
@@ -18,35 +18,64 @@ module Release
|
|
18
18
|
new_temp_file_template
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
21
|
+
# write strings to tempfile
|
22
|
+
def digest(str)
|
23
|
+
File.open(temp_file, "a") { |fi| fi << str }
|
24
|
+
end
|
25
|
+
|
26
|
+
# formats titles to be added to the new file
|
27
|
+
# removes tags from title if configured
|
28
|
+
def digest_title(title: nil, log_message: nil)
|
29
|
+
@title = title
|
30
|
+
@log_message = log_message
|
31
|
+
|
32
|
+
titles = ""
|
33
|
+
titles << title_present
|
34
|
+
titles << "#{remove_tags}\n"
|
35
|
+
digest(titles)
|
36
|
+
end
|
37
|
+
|
38
|
+
# formats dates to be added to the new file
|
39
|
+
def digest_date(date: nil)
|
40
|
+
@date = date
|
41
|
+
digest(date_present)
|
34
42
|
end
|
35
43
|
|
36
44
|
# append old file to new temp file
|
37
45
|
# overwrite output file with tmp file
|
38
46
|
def write_new_file
|
39
|
-
copy_over_notes if release_notes_exist?
|
47
|
+
copy_over_notes if release_notes_exist? && !force_rewrite
|
40
48
|
|
41
49
|
FileUtils.cp(temp_file, output_file)
|
42
50
|
FileUtils.rm temp_file
|
43
51
|
end
|
44
52
|
|
53
|
+
# :nocov:
|
45
54
|
private
|
46
55
|
|
56
|
+
# @api private
|
57
|
+
def date_present
|
58
|
+
"\n## #{@date}\n"
|
59
|
+
end
|
60
|
+
|
61
|
+
# @api private
|
62
|
+
def title_present
|
63
|
+
"\n#{@title}\n\n"
|
64
|
+
end
|
65
|
+
|
66
|
+
# @api private
|
67
|
+
def remove_tags
|
68
|
+
with_config(config: config) { prettify(line: link_messages) } if prettify_messages?
|
69
|
+
end
|
70
|
+
|
71
|
+
# @api private
|
72
|
+
def link_messages
|
73
|
+
link_message @log_message
|
74
|
+
end
|
75
|
+
|
47
76
|
# @api private
|
48
77
|
def copy_over_notes
|
49
|
-
File.open(temp_file,
|
78
|
+
File.open(temp_file, "a") do |f|
|
50
79
|
f << "\n"
|
51
80
|
IO.readlines(output_file)[2..-1].each { |line| f << line }
|
52
81
|
end
|
@@ -55,6 +84,7 @@ module Release
|
|
55
84
|
# @api private
|
56
85
|
def link_message(log_message)
|
57
86
|
return log_message unless link_commits?
|
87
|
+
|
58
88
|
with_config(config: config) do
|
59
89
|
link_lines(lines: log_message)
|
60
90
|
end
|
@@ -62,11 +92,12 @@ module Release
|
|
62
92
|
|
63
93
|
# @api private
|
64
94
|
def new_temp_file_template
|
65
|
-
File.new(temp_file,
|
66
|
-
File.open(temp_file,
|
67
|
-
fi << "# Release Notes\n
|
95
|
+
File.new(temp_file, "w")
|
96
|
+
File.open(temp_file, "a") do |fi|
|
97
|
+
fi << "# Release Notes\n"
|
68
98
|
end
|
69
99
|
end
|
100
|
+
# :nocov:
|
70
101
|
end
|
71
102
|
end
|
72
103
|
end
|
data/release-notes.gemspec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require "release/notes/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
6
|
spec.name = "release-notes"
|
@@ -9,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
9
8
|
spec.authors = ["Drew Monroe"]
|
10
9
|
spec.email = ["dvmonroe6@gmail.com"]
|
11
10
|
|
12
|
-
spec.summary = "
|
13
|
-
spec.description =
|
11
|
+
spec.summary = "Automated release notes for your project"
|
12
|
+
spec.description = "Generate automated release notes for any project"
|
14
13
|
spec.homepage = "http://github.com/dvmonroe/release-notes"
|
15
14
|
spec.license = "MIT"
|
16
15
|
|
@@ -19,7 +18,10 @@ Gem::Specification.new do |spec|
|
|
19
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
19
|
spec.require_paths = ["lib"]
|
21
20
|
|
22
|
-
spec.add_dependency
|
23
|
-
|
24
|
-
spec.add_development_dependency
|
21
|
+
spec.add_dependency "activesupport", "~> 5.0"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.12"
|
24
|
+
spec.add_development_dependency "pry", "~> 0.12.2"
|
25
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
26
|
+
spec.add_development_dependency "rubocop", "~> 0.60.0"
|
25
27
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: release-notes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Drew Monroe
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-11-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '5.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '5.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.12'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.12.2
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.12.2
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,16 +66,32 @@ dependencies:
|
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '10.0'
|
55
|
-
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.60.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.60.0
|
83
|
+
description: Generate automated release notes for any project
|
56
84
|
email:
|
57
85
|
- dvmonroe6@gmail.com
|
58
86
|
executables: []
|
59
87
|
extensions: []
|
60
88
|
extra_rdoc_files: []
|
61
89
|
files:
|
90
|
+
- ".github/ISSUE_TEMPLATE.md"
|
91
|
+
- ".github/PULL_REQUEST_TEMPLATE.md"
|
62
92
|
- ".gitignore"
|
63
93
|
- ".rspec"
|
64
|
-
- ".
|
94
|
+
- ".rubocop.yml"
|
65
95
|
- ".travis.yml"
|
66
96
|
- ".yardopts"
|
67
97
|
- CODE_OF_CONDUCT.md
|
@@ -103,13 +133,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
133
|
version: '0'
|
104
134
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
135
|
requirements:
|
106
|
-
- - "
|
136
|
+
- - ">"
|
107
137
|
- !ruby/object:Gem::Version
|
108
|
-
version:
|
138
|
+
version: 1.3.1
|
109
139
|
requirements: []
|
110
140
|
rubyforge_project:
|
111
|
-
rubygems_version: 2.6
|
141
|
+
rubygems_version: 2.7.6
|
112
142
|
signing_key:
|
113
143
|
specification_version: 4
|
114
|
-
summary:
|
144
|
+
summary: Automated release notes for your project
|
115
145
|
test_files: []
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.4.0
|