release-notes 2.0.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +0 -1
- data/CHANGELOG.md +57 -43
- data/CODE_OF_CONDUCT.md +1 -1
- data/LICENSE.txt +1 -1
- data/lib/release/notes.rb +13 -6
- data/lib/release/notes/commits.rb +141 -0
- data/lib/release/notes/configurable.rb +16 -0
- data/lib/release/notes/date_formatter.rb +31 -0
- data/lib/release/notes/git.rb +60 -25
- data/lib/release/notes/link.rb +55 -13
- data/lib/release/notes/log.rb +71 -103
- data/lib/release/notes/prettify.rb +39 -0
- data/lib/release/notes/system.rb +58 -25
- data/lib/release/notes/tag.rb +152 -0
- data/lib/release/notes/version.rb +1 -1
- data/lib/release/notes/write.rb +86 -30
- metadata +7 -4
- data/lib/release/notes/date_format.rb +0 -19
- data/lib/release/notes/pretty_print.rb +0 -24
data/lib/release/notes/system.rb
CHANGED
@@ -2,40 +2,73 @@
|
|
2
2
|
|
3
3
|
module Release
|
4
4
|
module Notes
|
5
|
-
|
6
|
-
|
5
|
+
class System
|
6
|
+
include Configurable
|
7
|
+
attr_reader :opts
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
#
|
10
|
+
# Release::Notes::System initializer
|
11
|
+
#
|
12
|
+
# @param **opts
|
13
|
+
#
|
14
|
+
# @return none
|
15
|
+
#
|
16
|
+
def initialize(**opts)
|
17
|
+
@opts = opts
|
10
18
|
|
11
|
-
|
19
|
+
return unless opts.delete(:log_all) == true
|
12
20
|
|
13
|
-
|
14
|
-
|
15
|
-
if opts.delete(:log_all) == true
|
16
|
-
opts[:label] = all_labels
|
17
|
-
opts[:invert_grep] = " --invert-grep"
|
18
|
-
end
|
19
|
-
|
20
|
-
`#{log(opts)}`
|
21
|
-
end
|
21
|
+
opts[:label] = config_all_labels
|
22
|
+
opts[:invert_grep] = " --invert-grep"
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
-
|
25
|
+
#
|
26
|
+
# Call Git.log method with configurable options
|
27
|
+
#
|
28
|
+
# @return [String] shell output of running Git.log
|
29
|
+
#
|
30
|
+
def log
|
31
|
+
`#{Git.log(opts)}`
|
26
32
|
end
|
27
33
|
|
28
|
-
|
29
|
-
|
30
|
-
|
34
|
+
class << self
|
35
|
+
#
|
36
|
+
# Call Git.first_commit method
|
37
|
+
#
|
38
|
+
# @return [String] shell output of running Git.first_commit
|
39
|
+
#
|
40
|
+
def first_commit
|
41
|
+
`#{Git.first_commit}`
|
42
|
+
end
|
31
43
|
|
32
|
-
|
33
|
-
|
34
|
-
|
44
|
+
#
|
45
|
+
# Call Git.read_all_tags method
|
46
|
+
#
|
47
|
+
# @return [String] shell output of running Git.read_all_tags
|
48
|
+
#
|
49
|
+
def all_tags
|
50
|
+
`#{Git.read_all_tags}`
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Call Git.last_tag method
|
55
|
+
#
|
56
|
+
# @return [String] shell output of running Git.last_tag
|
57
|
+
#
|
58
|
+
def last_tag
|
59
|
+
`#{Git.last_tag}`
|
60
|
+
end
|
35
61
|
|
36
|
-
|
37
|
-
|
38
|
-
|
62
|
+
#
|
63
|
+
# Call Git.tag_date method
|
64
|
+
#
|
65
|
+
# @param [String] tag - a tag that you want to get the date created for
|
66
|
+
#
|
67
|
+
# @return [String] shell output of running Git.tag_date
|
68
|
+
#
|
69
|
+
def tag_date(tag: nil)
|
70
|
+
`#{Git.tag_date(tag || last_tag)}`
|
71
|
+
end
|
39
72
|
end
|
40
73
|
end
|
41
74
|
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Release
|
4
|
+
module Notes
|
5
|
+
class Tag
|
6
|
+
include Configurable
|
7
|
+
attr_accessor :_hashes
|
8
|
+
attr_reader :tag, :previous_tag
|
9
|
+
|
10
|
+
delegate :digest_header, prefix: :writer, to: :@writer
|
11
|
+
|
12
|
+
# Release::Notes::Tag initializer
|
13
|
+
#
|
14
|
+
# @param [String] tag - a git tag (ex: v2.0.0)
|
15
|
+
# @param [Release::Notes::Write] writer - an object containing a header, title, and associated log messages
|
16
|
+
# @param [String] previous_tag - the previous git tag (ex: v1.3.0)
|
17
|
+
def initialize(tag:, writer:, previous_tag:)
|
18
|
+
@tag = tag
|
19
|
+
@writer = writer
|
20
|
+
@previous_tag = previous_tag
|
21
|
+
|
22
|
+
@_commits = {}
|
23
|
+
@_hashes = []
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Adds log messages to @_commits variable, and if there are commits that need to be added to
|
28
|
+
# changelog, add the header and associated log messages
|
29
|
+
#
|
30
|
+
# @return none
|
31
|
+
#
|
32
|
+
def perform
|
33
|
+
store_commits # adds to @_commits
|
34
|
+
|
35
|
+
if commits_available? # true
|
36
|
+
writer_digest_header(header_title) # <File:./release-notes.tmp.md (closed)>
|
37
|
+
log_commits # hash [0,1,2...], messages for sha
|
38
|
+
end
|
39
|
+
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
#
|
46
|
+
# Are there git sha's with commits?
|
47
|
+
#
|
48
|
+
# @return [Boolean] true: commits are present, false: there are no commits
|
49
|
+
#
|
50
|
+
def commits_available?
|
51
|
+
@_commits.present?
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# Formats a supplied date
|
56
|
+
#
|
57
|
+
# @param [String] date - a date
|
58
|
+
#
|
59
|
+
# @return [String] formatted date
|
60
|
+
#
|
61
|
+
def formatted_date(date = nil)
|
62
|
+
DateFormatter.new(date).humanize
|
63
|
+
end
|
64
|
+
|
65
|
+
#
|
66
|
+
# Generate header title
|
67
|
+
#
|
68
|
+
# @return [String] the header to be added to changelog
|
69
|
+
#
|
70
|
+
def header_title
|
71
|
+
config_header_title.yield_self { |t| title(t) } # config_header_title = "tag"
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
# Creates new commit objects from the @_commits object
|
76
|
+
#
|
77
|
+
# @return [Hash] unique log messages per tag
|
78
|
+
#
|
79
|
+
def log_commits
|
80
|
+
@_commits.each do |key, val|
|
81
|
+
Commits.new(title: titles[key], value: val, writer: @writer, tagger: self).perform
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
#
|
86
|
+
# Transform tag into date
|
87
|
+
#
|
88
|
+
# @return [String] date the tag was created
|
89
|
+
#
|
90
|
+
def tag_date
|
91
|
+
System.tag_date(tag: tag)
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# Adds log messages to @_commits
|
96
|
+
#
|
97
|
+
# @return none
|
98
|
+
#
|
99
|
+
def store_commits
|
100
|
+
all_labels.each_with_index do |lab, i|
|
101
|
+
system_log(label: lab).tap { |str| @_commits[i] = str if str.present? }
|
102
|
+
end
|
103
|
+
|
104
|
+
# if log_all = true
|
105
|
+
@_commits[all_labels.size] = system_log(log_all: true) if config_log_all
|
106
|
+
end
|
107
|
+
|
108
|
+
#
|
109
|
+
# Create new system object that contains log messages between tag_from and tag_to
|
110
|
+
# with the relevant options
|
111
|
+
#
|
112
|
+
# @param [Hash] opts - options like the label to grep
|
113
|
+
#
|
114
|
+
# @return [String] log messages that meet the criteria
|
115
|
+
#
|
116
|
+
def system_log(**opts)
|
117
|
+
System.new({ tag_from: previous_tag, tag_to: tag }.merge(opts)).log
|
118
|
+
end
|
119
|
+
|
120
|
+
#
|
121
|
+
# Array of strings containing all labels
|
122
|
+
#
|
123
|
+
# @return [Array] array of all labels
|
124
|
+
#
|
125
|
+
def all_labels
|
126
|
+
[config_features, config_bugs, config_misc]
|
127
|
+
end
|
128
|
+
|
129
|
+
#
|
130
|
+
# Array of strings containing all titles
|
131
|
+
#
|
132
|
+
# @return [Array] array of all titles
|
133
|
+
#
|
134
|
+
def titles
|
135
|
+
[config_feature_title, config_bug_title,
|
136
|
+
config_misc_title, config_log_all_title]
|
137
|
+
end
|
138
|
+
|
139
|
+
#
|
140
|
+
# Title or formatted tag date
|
141
|
+
#
|
142
|
+
# @param [String] title - should the title be the git tag? If yes, use the git
|
143
|
+
# tag as the title, if not use the tag date
|
144
|
+
#
|
145
|
+
# @return [String] tag title or formatted tag date to be added to changelog
|
146
|
+
#
|
147
|
+
def title(title)
|
148
|
+
title == "tag" ? tag : formatted_date(tag_date)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
data/lib/release/notes/write.rb
CHANGED
@@ -4,24 +4,33 @@ module Release
|
|
4
4
|
module Notes
|
5
5
|
class Write
|
6
6
|
include Link
|
7
|
-
include
|
8
|
-
|
9
|
-
delegate :output_file, :temp_file, :link_commits?, :all_labels,
|
10
|
-
:prettify_messages?, :release_notes_exist?,
|
11
|
-
:force_rewrite, to: :"Release::Notes.configuration"
|
7
|
+
include Configurable
|
12
8
|
|
9
|
+
#
|
10
|
+
# Release::Notes::Write initializer
|
11
|
+
#
|
12
|
+
# @return none
|
13
|
+
#
|
13
14
|
def initialize
|
14
|
-
# create a new temp file regardless if it exists
|
15
15
|
new_temp_file_template
|
16
16
|
end
|
17
17
|
|
18
|
-
#
|
18
|
+
#
|
19
|
+
# Write strings to tempfile
|
20
|
+
#
|
21
|
+
# @param [String] str - string to add to the temp file
|
22
|
+
#
|
19
23
|
def digest(str)
|
20
|
-
File.open(
|
24
|
+
File.open(config_temp_file, "a") { |fi| fi << str }
|
21
25
|
end
|
22
26
|
|
23
|
-
#
|
24
|
-
#
|
27
|
+
# Formats titles to be added to the new file and removes tags from title if configured
|
28
|
+
#
|
29
|
+
# @param [String] title - string representing a label title
|
30
|
+
# @param [String] log_message - string containing log messages that fall under the title
|
31
|
+
#
|
32
|
+
# @return [String] formatted label title and log messages that fall under it.
|
33
|
+
#
|
25
34
|
def digest_title(title: nil, log_message: nil)
|
26
35
|
@title = title
|
27
36
|
@log_message = log_message
|
@@ -30,64 +39,111 @@ module Release
|
|
30
39
|
digest(titles)
|
31
40
|
end
|
32
41
|
|
33
|
-
#
|
42
|
+
#
|
43
|
+
# Adds formatted header to changelog
|
44
|
+
#
|
45
|
+
# @param [String] header - unformatted header that needs to be added to changelog
|
46
|
+
#
|
34
47
|
def digest_header(header)
|
35
48
|
@header = header
|
36
49
|
digest(header_present)
|
37
50
|
end
|
38
51
|
|
52
|
+
#
|
39
53
|
# append old file to new temp file
|
40
54
|
# overwrite output file with tmp file
|
55
|
+
#
|
56
|
+
# @return none
|
57
|
+
#
|
41
58
|
def write_new_file
|
42
|
-
copy_over_notes if
|
59
|
+
copy_over_notes if config_release_notes_exist? && !config_force_rewrite
|
43
60
|
|
44
|
-
FileUtils.cp(
|
45
|
-
FileUtils.rm
|
61
|
+
FileUtils.cp(config_temp_file, config_output_file)
|
62
|
+
FileUtils.rm config_temp_file
|
46
63
|
end
|
47
64
|
|
48
65
|
private
|
49
66
|
|
50
|
-
#
|
67
|
+
#
|
68
|
+
# Formats the header
|
69
|
+
#
|
70
|
+
# @return [String] formatted header to be added to changelog
|
71
|
+
#
|
51
72
|
def header_present
|
52
|
-
"
|
73
|
+
"#{NEWLINE}## #{@header}#{NEWLINE}"
|
53
74
|
end
|
54
75
|
|
55
|
-
#
|
76
|
+
#
|
77
|
+
# Formats the title
|
78
|
+
#
|
79
|
+
# @return [String] formatted title to be added to changelog
|
80
|
+
#
|
56
81
|
def title_present
|
57
|
-
"
|
82
|
+
"#{NEWLINE}#{@title}#{NEWLINE}#{NEWLINE}"
|
58
83
|
end
|
59
84
|
|
60
|
-
#
|
85
|
+
#
|
86
|
+
# If prettify_messages is true, remove the label keyword from log message
|
87
|
+
# else, just return the log message
|
88
|
+
#
|
89
|
+
# @return [String] log message to be added to changelog
|
90
|
+
#
|
61
91
|
def format_line
|
62
|
-
return "#{
|
92
|
+
return "#{prettify_linked_messages}#{NEWLINE}" if config_prettify_messages?
|
63
93
|
|
64
94
|
link_messages
|
65
95
|
end
|
66
96
|
|
67
|
-
#
|
97
|
+
#
|
98
|
+
# Calls link_message method with a log message
|
99
|
+
#
|
100
|
+
# @return [String] log message to be added to the changelog
|
101
|
+
#
|
68
102
|
def link_messages
|
69
103
|
link_message @log_message
|
70
104
|
end
|
71
105
|
|
72
|
-
#
|
106
|
+
#
|
107
|
+
# Prettifies linked log messages
|
108
|
+
#
|
109
|
+
# @return [String] formatted log message
|
110
|
+
#
|
111
|
+
def prettify_linked_messages
|
112
|
+
Prettify.new(line: link_messages).perform
|
113
|
+
end
|
114
|
+
|
115
|
+
#
|
116
|
+
# Appends previous changelog to a temporary file
|
117
|
+
#
|
118
|
+
# @return none
|
119
|
+
#
|
73
120
|
def copy_over_notes
|
74
|
-
File.open(
|
75
|
-
f <<
|
76
|
-
IO.readlines(
|
121
|
+
File.open(config_temp_file, "a") do |f|
|
122
|
+
f << NEWLINE
|
123
|
+
IO.readlines(config_output_file)[2..-1].each { |line| f << line }
|
77
124
|
end
|
78
125
|
end
|
79
126
|
|
80
|
-
#
|
127
|
+
#
|
128
|
+
# Returns the log message if message linking is not configured
|
129
|
+
# else, return the linked log_message
|
130
|
+
#
|
131
|
+
# @return [String] original or updated log essage
|
132
|
+
#
|
81
133
|
def link_message(log_message)
|
82
|
-
return log_message unless
|
134
|
+
return log_message unless config_link_commits?
|
83
135
|
|
84
136
|
link_lines(lines: log_message)
|
85
137
|
end
|
86
138
|
|
87
|
-
#
|
139
|
+
#
|
140
|
+
# Open temp file and output release notes header
|
141
|
+
#
|
142
|
+
# @return none
|
143
|
+
#
|
88
144
|
def new_temp_file_template
|
89
|
-
File.open(
|
90
|
-
fi << "# Release Notes
|
145
|
+
File.open(config_temp_file, "w") do |fi|
|
146
|
+
fi << "# Release Notes#{NEWLINE}"
|
91
147
|
end
|
92
148
|
end
|
93
149
|
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:
|
4
|
+
version: 3.0.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: 2019-01-
|
11
|
+
date: 2019-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -112,15 +112,18 @@ files:
|
|
112
112
|
- lib/generators/release/notes/install/templates/README
|
113
113
|
- lib/generators/release/notes/install/templates/release_notes.rb
|
114
114
|
- lib/release/notes.rb
|
115
|
+
- lib/release/notes/commits.rb
|
116
|
+
- lib/release/notes/configurable.rb
|
115
117
|
- lib/release/notes/configuration.rb
|
116
|
-
- lib/release/notes/
|
118
|
+
- lib/release/notes/date_formatter.rb
|
117
119
|
- lib/release/notes/git.rb
|
118
120
|
- lib/release/notes/install.rb
|
119
121
|
- lib/release/notes/link.rb
|
120
122
|
- lib/release/notes/log.rb
|
121
|
-
- lib/release/notes/
|
123
|
+
- lib/release/notes/prettify.rb
|
122
124
|
- lib/release/notes/railtie.rb
|
123
125
|
- lib/release/notes/system.rb
|
126
|
+
- lib/release/notes/tag.rb
|
124
127
|
- lib/release/notes/tasks/install.rake
|
125
128
|
- lib/release/notes/version.rb
|
126
129
|
- lib/release/notes/write.rb
|