release-notes 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/.travis.yml +4 -2
- data/Gemfile +0 -1
- data/README.md +18 -11
- data/exe/release-notes +27 -0
- data/lib/release/notes.rb +9 -12
- data/lib/release/notes/date_format.rb +5 -8
- data/lib/release/notes/git.rb +5 -5
- data/lib/release/notes/install.rb +5 -0
- data/lib/release/notes/link.rb +1 -1
- data/lib/release/notes/log.rb +23 -31
- data/lib/release/notes/pretty_print.rb +1 -1
- data/lib/release/notes/system.rb +3 -5
- data/lib/release/notes/tasks/install.rake +15 -0
- data/lib/release/notes/version.rb +1 -1
- data/lib/release/notes/write.rb +6 -12
- data/lib/tasks/update_release_notes.rake +3 -3
- metadata +7 -4
- data/lib/release/notes/with_configuration.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f57251370fff06c63ccbbb0719638cf769a0f93e689670797ec7a9bbce6cecc
|
4
|
+
data.tar.gz: 59ea08dcca6b490195ba032e4786a4acc4062ab6883e291388975cf9681ef7c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: faca9e5eda060af2c513130e711c178ef8a698b7bd91285730c4913eb0467657011ad39419d947de68341f7b7b2bdd3869a6314ffe86844b25dff028177c2e81
|
7
|
+
data.tar.gz: b72a541e60752ec2ece0badabcacc18014feebd9d20bea2dd3db4a31f50f73f5d7453c14e9d3de0a3fae0f2a96bf5a8efd3c6fc3e33d7e13ea37b4bf7cd17287
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -2,9 +2,7 @@ sudo: false
|
|
2
2
|
language: ruby
|
3
3
|
rvm:
|
4
4
|
- 2.4.1
|
5
|
-
- 2.4.2
|
6
5
|
- 2.4.5
|
7
|
-
- 2.5.0
|
8
6
|
- 2.5.3
|
9
7
|
cache: bundler
|
10
8
|
before_install: gem install bundler -v 1.12.5
|
@@ -15,3 +13,7 @@ script:
|
|
15
13
|
- bundle exec rubocop
|
16
14
|
after_success:
|
17
15
|
- bundle exec codeclimate-test-reporter
|
16
|
+
|
17
|
+
branches:
|
18
|
+
only:
|
19
|
+
- master
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -43,15 +43,15 @@ Or install it yourself as:
|
|
43
43
|
$ gem install release-notes
|
44
44
|
```
|
45
45
|
|
46
|
-
After you install Release::Notes,
|
46
|
+
After you install Release::Notes, generate the intializer file:
|
47
47
|
|
48
48
|
```sh
|
49
|
+
# rails
|
49
50
|
$ rails generate release:notes:install
|
50
|
-
```
|
51
|
-
|
52
|
-
This Release::Notes generator creates an initializer file to allow further configuration.
|
53
51
|
|
54
|
-
|
52
|
+
# non-rails
|
53
|
+
$ bundle exec release:notes:install
|
54
|
+
```
|
55
55
|
|
56
56
|
## Configure
|
57
57
|
|
@@ -89,16 +89,22 @@ For more information about each individual setting checkout Release::Notes's
|
|
89
89
|
|
90
90
|
### TL;DR
|
91
91
|
|
92
|
-
|
92
|
+
Install the binstub
|
93
|
+
|
94
|
+
```sh
|
95
|
+
$ bundle binstubs release-notes
|
96
|
+
```
|
97
|
+
|
98
|
+
and run
|
93
99
|
|
94
100
|
```sh
|
95
|
-
bin/
|
101
|
+
$ bin/release-notes
|
96
102
|
```
|
97
103
|
|
98
|
-
|
104
|
+
OR, just use the rake task
|
99
105
|
|
100
106
|
```sh
|
101
|
-
bundle exec rake update_release_notes:run
|
107
|
+
$ bundle exec rake update_release_notes:run
|
102
108
|
```
|
103
109
|
|
104
110
|
### Git Worklow
|
@@ -125,7 +131,7 @@ If using Rails, a rake task is included and would be best utilized within your d
|
|
125
131
|
If not on rails, but using rake, you can easily craft your own rake task. At the very least calling
|
126
132
|
|
127
133
|
```ruby
|
128
|
-
Release::Notes
|
134
|
+
Release::Notes.generate
|
129
135
|
```
|
130
136
|
|
131
137
|
is the only instance that needs to be instantiated and invoked.
|
@@ -144,7 +150,8 @@ namespace :deploy do
|
|
144
150
|
before :starting, :update_release_notes
|
145
151
|
|
146
152
|
task :update_release_notes do
|
147
|
-
|
153
|
+
# use the binstub
|
154
|
+
sh 'bin/release-notes"'
|
148
155
|
# run a second task that generates an auto commit
|
149
156
|
# this would be created by you
|
150
157
|
sh 'bin/rake "release_notes:commit"'
|
data/exe/release-notes
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
5
|
+
|
6
|
+
require "release/notes"
|
7
|
+
config_file = "./config/initializers/release_notes.rb"
|
8
|
+
|
9
|
+
begin
|
10
|
+
require config_file
|
11
|
+
warn "=> Generating release notes..."
|
12
|
+
Release::Notes.generate
|
13
|
+
warn "=> Done!"
|
14
|
+
rescue LoadError
|
15
|
+
warn "=> Missing config/initializers/release_notes.rb"
|
16
|
+
rescue SignalException => e
|
17
|
+
# We might receive SIGTERM before our signal handler is installed.
|
18
|
+
if Signal.signame(e.signo) == "TERM"
|
19
|
+
exit(0)
|
20
|
+
else
|
21
|
+
raise
|
22
|
+
end
|
23
|
+
rescue
|
24
|
+
exit(1)
|
25
|
+
else
|
26
|
+
exit(0)
|
27
|
+
end
|
data/lib/release/notes.rb
CHANGED
@@ -11,30 +11,27 @@ require "release/notes/version"
|
|
11
11
|
require "release/notes/configuration"
|
12
12
|
require "release/notes/git"
|
13
13
|
require "release/notes/system"
|
14
|
-
require "release/notes/with_configuration"
|
15
14
|
|
16
15
|
require "release/notes/write"
|
17
16
|
require "release/notes/log"
|
18
17
|
|
19
18
|
require "release/notes/railtie" if defined?(Rails)
|
19
|
+
require "release/notes/install" unless defined?(Rails)
|
20
20
|
|
21
21
|
module Release
|
22
22
|
module Notes
|
23
|
-
class
|
24
|
-
|
25
|
-
|
26
|
-
def initialize
|
27
|
-
@options = Release::Notes.configuration
|
28
|
-
@logger = Release::Notes::Log.new @options
|
23
|
+
class << self
|
24
|
+
def generate
|
25
|
+
log.perform
|
29
26
|
end
|
30
27
|
|
31
|
-
def
|
32
|
-
|
28
|
+
def log
|
29
|
+
Release::Notes::Log.new
|
33
30
|
end
|
34
|
-
end
|
35
31
|
|
36
|
-
|
37
|
-
|
32
|
+
def root
|
33
|
+
File.expand_path("..", __dir__)
|
34
|
+
end
|
38
35
|
end
|
39
36
|
end
|
40
37
|
end
|
@@ -3,18 +3,15 @@
|
|
3
3
|
module Release
|
4
4
|
module Notes
|
5
5
|
class DateFormat
|
6
|
-
attr_reader :
|
7
|
-
delegate :timezone, to: :
|
6
|
+
attr_reader :time_now
|
7
|
+
delegate :timezone, to: :"Release::Notes.configuration"
|
8
8
|
|
9
|
-
def initialize
|
10
|
-
|
11
|
-
Time.zone = timezone
|
12
|
-
|
13
|
-
@time_now = Time.zone.now
|
9
|
+
def initialize
|
10
|
+
Time.zone = timezone
|
14
11
|
end
|
15
12
|
|
16
13
|
def date_humanized(date: nil)
|
17
|
-
date = date.present? ? Time.zone.parse(date) :
|
14
|
+
date = date.present? ? Time.zone.parse(date) : Time.zone.now
|
18
15
|
date.strftime("%B %d, %Y %r %Z")
|
19
16
|
end
|
20
17
|
end
|
data/lib/release/notes/git.rb
CHANGED
@@ -8,18 +8,18 @@ module Release
|
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
10
|
included do
|
11
|
-
delegate :all_labels, :log_format, :grep_insensitive?,
|
11
|
+
delegate :all_labels, :log_format, :grep_insensitive?,
|
12
|
+
:regex_type, :include_merges?, to: :"Release::Notes.configuration"
|
12
13
|
|
13
14
|
def log(**opts)
|
14
|
-
"git log '#{opts[:tag_from]}'..'#{opts[:tag_to]}'
|
15
|
+
"git log '#{opts[:tag_from]}'..'#{opts[:tag_to]}'" \
|
16
|
+
" --grep='#{opts[:label]}'" \
|
15
17
|
" #{regex_type} #{grep_insensitive?}" \
|
16
18
|
" #{include_merges?} --format='#{log_format}'"
|
17
19
|
end
|
18
20
|
|
19
21
|
def invert_log(**opts)
|
20
|
-
|
21
|
-
" #{regex_type} #{grep_insensitive?} --invert-grep" \
|
22
|
-
" #{include_merges?} --format='#{log_format}'"
|
22
|
+
log(opts) + " --invert-grep"
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
data/lib/release/notes/link.rb
CHANGED
@@ -6,7 +6,7 @@ module Release
|
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
|
-
delegate :link_to_labels, :link_to_sites, :link_to_humanize, to: :
|
9
|
+
delegate :link_to_labels, :link_to_sites, :link_to_humanize, to: :"Release::Notes.configuration"
|
10
10
|
|
11
11
|
def link_lines(lines:)
|
12
12
|
@new_lines = ""
|
data/lib/release/notes/log.rb
CHANGED
@@ -4,21 +4,21 @@ module Release
|
|
4
4
|
module Notes
|
5
5
|
class Log
|
6
6
|
include System
|
7
|
-
include WithConfiguration
|
8
7
|
|
9
|
-
attr_reader :
|
8
|
+
attr_reader :writer, :date_formatter
|
10
9
|
attr_reader :all_tags
|
11
10
|
|
12
|
-
delegate :force_rewrite, :all_labels, :log_all, :features,
|
13
|
-
:
|
11
|
+
delegate :force_rewrite, :all_labels, :log_all, :features,
|
12
|
+
:bugs, :misc, :feature_title,
|
13
|
+
:bug_title, :misc_title, :log_all_title,
|
14
|
+
:release_notes_exist?, to: :"Release::Notes.configuration"
|
15
|
+
|
14
16
|
delegate :date_humanized, :format_tag_date, to: :date_formatter
|
15
17
|
delegate :digest_date, :digest_title, to: :writer
|
16
18
|
|
17
|
-
def initialize
|
18
|
-
@
|
19
|
-
|
20
|
-
setup_writer
|
21
|
-
setup_date_formatter
|
19
|
+
def initialize
|
20
|
+
@writer = Release::Notes::Write.new
|
21
|
+
@date_formatter = Release::Notes::DateFormat.new
|
22
22
|
end
|
23
23
|
|
24
24
|
def perform
|
@@ -43,57 +43,49 @@ module Release
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# @api private
|
46
|
-
def copy_single_tag_of_activity(tag_from:, tag_to: "HEAD")
|
46
|
+
def copy_single_tag_of_activity(tag_from:, tag_to: "HEAD") # rubocop:disable Metrics/MethodLength
|
47
47
|
[features, bugs, misc].each_with_index do |regex, i|
|
48
|
-
log =
|
48
|
+
log = system_log(
|
49
|
+
tag_from: tag_from,
|
50
|
+
tag_to: tag_to,
|
51
|
+
label: regex,
|
52
|
+
log_all: false,
|
53
|
+
)
|
49
54
|
digest_title(title: titles[i], log_message: log) if log.present?
|
50
55
|
end
|
51
56
|
|
52
57
|
return unless log_all
|
53
58
|
|
54
|
-
log =
|
59
|
+
log = system_log(
|
60
|
+
tag_from: tag_from,
|
61
|
+
tag_to: tag_to,
|
62
|
+
log_all: true,
|
63
|
+
)
|
55
64
|
digest_title(title: log_all_title, log_message: log) if log.present?
|
56
65
|
end
|
57
66
|
|
58
67
|
# @api private
|
59
68
|
def find_last_tag_and_log
|
60
69
|
last_tag = system_last_tag.delete!("\n")
|
61
|
-
return false unless
|
70
|
+
return false unless system_log(tag_from: last_tag, label: all_labels).present?
|
62
71
|
|
63
72
|
# output the date right now
|
64
73
|
digest_date date: date_humanized
|
65
74
|
copy_single_tag_of_activity(tag_from: last_tag)
|
66
75
|
end
|
67
76
|
|
68
|
-
# @api private
|
69
|
-
def setup_writer
|
70
|
-
@writer = Release::Notes::Write.new config
|
71
|
-
end
|
72
|
-
|
73
|
-
# @api private
|
74
|
-
def setup_date_formatter
|
75
|
-
@date_formatter = Release::Notes::DateFormat.new config
|
76
|
-
end
|
77
|
-
|
78
77
|
# @api private
|
79
78
|
def find_all_tags_and_log_all
|
80
79
|
all_tags.each_with_index do |ta, i|
|
81
80
|
previous_tag = all_tags[i + 1]
|
82
81
|
next unless previous_tag.present? &&
|
83
|
-
|
82
|
+
system_log(tag_from: previous_tag, tag_to: ta, label: all_labels).present?
|
84
83
|
|
85
84
|
digest_date date: date_humanized(date: System.tag_date(tag: ta))
|
86
85
|
copy_single_tag_of_activity(tag_from: previous_tag, tag_to: ta)
|
87
86
|
end
|
88
87
|
end
|
89
88
|
|
90
|
-
# @api private
|
91
|
-
def system_call(**opts)
|
92
|
-
with_config(config: config) do
|
93
|
-
system_log(opts)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
89
|
def titles
|
98
90
|
[feature_title, bug_title, misc_title]
|
99
91
|
end
|
data/lib/release/notes/system.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
namespace :"release:notes" do
|
4
|
+
desc "Install release notes in a non Rails environment"
|
5
|
+
task :install do
|
6
|
+
config_file = File.expand_path("../../../generators/release/notes/install/templates/release_notes.rb", __dir__)
|
7
|
+
|
8
|
+
if File.exist?("./config/release_notes.rb")
|
9
|
+
warn "=> [ skipping ] config/release_notes.rb already exists"
|
10
|
+
else
|
11
|
+
FileUtils.cp(config_file, "./config/release_notes.rb")
|
12
|
+
warn "=> config/release_notes.rb created"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/release/notes/write.rb
CHANGED
@@ -5,15 +5,12 @@ module Release
|
|
5
5
|
class Write
|
6
6
|
include Link
|
7
7
|
include PrettyPrint
|
8
|
-
include WithConfiguration
|
9
|
-
|
10
|
-
attr_accessor :config
|
11
8
|
|
12
9
|
delegate :output_file, :temp_file, :link_commits?, :all_labels,
|
13
|
-
:prettify_messages?, :release_notes_exist?,
|
10
|
+
:prettify_messages?, :release_notes_exist?,
|
11
|
+
:force_rewrite, to: :"Release::Notes.configuration"
|
14
12
|
|
15
|
-
def initialize
|
16
|
-
@config = config
|
13
|
+
def initialize
|
17
14
|
# create a new temp file regardless if it exists
|
18
15
|
new_temp_file_template
|
19
16
|
end
|
@@ -63,7 +60,7 @@ module Release
|
|
63
60
|
|
64
61
|
# @api private
|
65
62
|
def remove_tags
|
66
|
-
|
63
|
+
prettify(line: link_messages) if prettify_messages?
|
67
64
|
end
|
68
65
|
|
69
66
|
# @api private
|
@@ -83,15 +80,12 @@ module Release
|
|
83
80
|
def link_message(log_message)
|
84
81
|
return log_message unless link_commits?
|
85
82
|
|
86
|
-
|
87
|
-
link_lines(lines: log_message)
|
88
|
-
end
|
83
|
+
link_lines(lines: log_message)
|
89
84
|
end
|
90
85
|
|
91
86
|
# @api private
|
92
87
|
def new_temp_file_template
|
93
|
-
File.
|
94
|
-
File.open(temp_file, "a") do |fi|
|
88
|
+
File.open(temp_file, "w") do |fi|
|
95
89
|
fi << "# Release Notes\n"
|
96
90
|
end
|
97
91
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: release-notes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Drew Monroe
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -83,7 +83,8 @@ dependencies:
|
|
83
83
|
description: Generate automated release notes for any project
|
84
84
|
email:
|
85
85
|
- dvmonroe6@gmail.com
|
86
|
-
executables:
|
86
|
+
executables:
|
87
|
+
- release-notes
|
87
88
|
extensions: []
|
88
89
|
extra_rdoc_files: []
|
89
90
|
files:
|
@@ -103,6 +104,7 @@ files:
|
|
103
104
|
- bin/console
|
104
105
|
- bin/setup
|
105
106
|
- bin/test
|
107
|
+
- exe/release-notes
|
106
108
|
- lib/generators/release/notes/install/install_generator.rb
|
107
109
|
- lib/generators/release/notes/install/templates/README
|
108
110
|
- lib/generators/release/notes/install/templates/release_notes.rb
|
@@ -110,13 +112,14 @@ files:
|
|
110
112
|
- lib/release/notes/configuration.rb
|
111
113
|
- lib/release/notes/date_format.rb
|
112
114
|
- lib/release/notes/git.rb
|
115
|
+
- lib/release/notes/install.rb
|
113
116
|
- lib/release/notes/link.rb
|
114
117
|
- lib/release/notes/log.rb
|
115
118
|
- lib/release/notes/pretty_print.rb
|
116
119
|
- lib/release/notes/railtie.rb
|
117
120
|
- lib/release/notes/system.rb
|
121
|
+
- lib/release/notes/tasks/install.rake
|
118
122
|
- lib/release/notes/version.rb
|
119
|
-
- lib/release/notes/with_configuration.rb
|
120
123
|
- lib/release/notes/write.rb
|
121
124
|
- lib/tasks/update_release_notes.rake
|
122
125
|
- release-notes.gemspec
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Release
|
4
|
-
module Notes
|
5
|
-
module WithConfiguration
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
attr_reader :config, :date_formatter
|
10
|
-
|
11
|
-
def with_config(**opts, &_block)
|
12
|
-
@confg = opts.fetch(:config, {})
|
13
|
-
yield
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|