structured_changelog 0.8.3 → 0.10.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 039e8126bbe0d2248dbc9c3b6baeac898c58178e
4
- data.tar.gz: f92ca1915c1e0aa2a199d85f83a1be7f4154d0ce
3
+ metadata.gz: 5cfa0269a454722bb8144fee70626dbd4afddcb5
4
+ data.tar.gz: cd69bdcbdf0a54b210868bf7476b2fd92b759665
5
5
  SHA512:
6
- metadata.gz: e06c3e60b2dc080867b919f59de5e74f85d3dd7af1e6696ed3cc1647aa47581ddf011b2b63c12222ad968a64e6a4097924935f44296d87091193b76564f1cfa8
7
- data.tar.gz: bc2cc2b4c9b4c187b1fd203f1c1df68efccec9edd23b92d3a6c1b187cd4512167f2e5bc3f758a23bf703947f15d724132b13447cf7809919bc9f20267f63805d
6
+ metadata.gz: cb59d3cd247e5618d277e173d067b23037935d8c008ec84c7b907ffb39c1cdabf5e473caffb8bd8b23915dd3414503fcd8de3aed2b1972200a9891d2d0e10958
7
+ data.tar.gz: 43512333d80038357eeba472bfa991e33f3f35181474d13def7a716a526d980fd8c501ed3426cdef47c800cd7b86e7320bef427b2c76adc993385dfe450da470
@@ -1,16 +1,18 @@
1
- ## ROADMAP 1.1.0
1
+ ## ROADMAP
2
2
 
3
3
  * investigate partial parsing of a file if parsing slows down *too much* on large changelogs
4
-
5
- ## ROADMAP 1.0.0
6
-
7
- * consider moving from BREAKING/FEATURE/FIX to MAJOR/MINOR/PATCH
8
- * validate that each line starts with BREAKING:/FEATURE:/FIX:
9
- * validate that each release has the appropriate version
10
- * validate that release numbers increase monotonically
4
+ * validate that each line starts with BREAKING/FEATURE/FIX/ENHANCEMENT/DEPRECATION
11
5
  * require release block lines to be ordered in descending severity
12
6
  * disable strict semver version validation before 1.0.0
13
7
 
8
+ ## RELEASE 0.10.0
9
+
10
+ * FEATURE: `changelog:compile` task that pulls all `[CHANGELOG]` commit messages since the last release, determines the minimum necessary release version, and appends a new section to the top of the releases in the changelog. See the README for more information.
11
+
12
+ ## RELEASE 0.9.0
13
+
14
+ * FEATURE: `changelog:prep` task that performs `changelog:validate`, `changelog:sync`, and `changelog:commit`.
15
+
14
16
  ## RELEASE 0.8.3
15
17
 
16
18
  * FIX: `Gemfile.lock` now gets updated with the new version before `changelog:commit` runs during `changelog:release`
data/README.md CHANGED
@@ -8,40 +8,67 @@ Add this to your Rakefile:
8
8
  require 'structured_changelog/tasks'
9
9
  ```
10
10
 
11
- This will create a `rake changelog:release` task that:
11
+ ## With A Single Contributor
12
12
 
13
- 1. validates your `CHANGELOG.md`
14
- 2. sets your gem's `VERSION` constant to the latest release version specified by your `CHANGELOG.md`
15
- 3. commits that version bump
16
- 4. runs `rake release`
13
+ If you have a single-contributor project, you can simply add release lines to `CHANGELOG.md`:
17
14
 
18
- Turns out modifying `rake release` was _way_ more trouble than it was worth, so we had to make a separate task. Sorry folks.
15
+ ```
16
+ * FEATURE: we added a new thing
17
+ * FIX: we fixed a broken thing
18
+ ```
19
19
 
20
- You'll also get these wonderful rake tasks:
20
+ then when you want to cut a release, add a `"## RELEASE X.Y.Z"` section, making the above look like:
21
21
 
22
- ## Wonderful Rake Tasks
22
+ ```
23
+ ## RELEASE X.Y.Z
23
24
 
24
- To validate your changelog:
25
+ * FEATURE: we added a new thing
26
+ * FIX: we fixed a broken thing
27
+ ```
25
28
 
26
- $ rake changelog:validate
27
-
28
- To update your gem's `VERSION` constant to the latest release in your Changelog:
29
+ and run
29
30
 
30
- $ rake changelog:sync
31
+ $ rake changelog:release
31
32
 
32
- To commit your version bump--and only your version bump:
33
+ This will:
33
34
 
34
- $ rake changelog:commit
35
+ 1. validate your `CHANGELOG.md`
36
+ 2. set your gem's `VERSION` constant to the latest release version specified by your `CHANGELOG.md`
37
+ 3. commit that version bump
38
+ 4. package your gem and push it to the specified gem server (rubygems.org by default)
35
39
 
36
- To determine the version of the latest release *according to the Changelog*:
40
+ ## With Multiple Contributors
37
41
 
38
- $ rake changelog:version
42
+ If you have multiple contributors, and you follow the single-contributor workflow, you'll end up with conflicts every time multiple people go to add a line to the changelog. We have a separate workflow for you.
43
+
44
+ When you want to add changelog lines, instead of adding it directly to the changelog, write a git commit:
45
+
46
+ ```
47
+ [CHANGELOG]
48
+
49
+ * FEATURE: we added a new thing
50
+ * FIX: we fixed a thing that was broken
51
+ ```
52
+
53
+ The commit message needs to start with `[CHANGELOG]\n\n` and each line should start with `* BREAKING: `, `* FEATURE: `, `* FIX: `, `* ENHANCEMENT: `, or `* DEPRECATION: `.
54
+
55
+ Then, when you're ready to cut a release, run:
56
+
57
+ $ rake changelog:compile
58
+
59
+ This will pull all the `[CHANGELOG]` commit message bodies you've written since the last release from the commit log, and create a new release section in your changelog. It will have the minimum version possible given the change types (BREAKING is a major bump, FEATURE is a minor bump, and FIX, ENHANCEMENT, and DEPRECATION are all patch bumps). Once the rake task has written the new section to the changelog, it's often beneficial to give it a look and make sure it's free of typos and any other mistakes. Then, run
60
+
61
+ $ rake changelog:release
62
+
63
+ as usual to actually release your gem.
64
+
65
+ ## Viewing Release Notes
39
66
 
40
67
  To view the release notes of the current release:
41
68
 
42
69
  $ rake changelog:notes
43
70
  $ rake changelog:notes[current]
44
-
71
+
45
72
  To view the release notes of every release:
46
73
 
47
74
  $ rake changelog:notes[all]
@@ -70,6 +97,28 @@ To view the last N releases:
70
97
 
71
98
  $ rake changelog:recent[N]
72
99
 
100
+ ## Other Rake Tasks
101
+
102
+ To determine the version of the latest release *according to the Changelog*:
103
+
104
+ $ rake changelog:version
105
+
106
+ To validate your changelog:
107
+
108
+ $ rake changelog:validate
109
+
110
+ To update your gem's `VERSION` constant to the latest release in your Changelog:
111
+
112
+ $ rake changelog:sync
113
+
114
+ To commit your version bump--and only your version bump:
115
+
116
+ $ rake changelog:commit
117
+
118
+ To do everything but release your code (so that it can go through a PR for CI, for instance):
119
+
120
+ $ rake changelog:prep
121
+
73
122
  ## Installation
74
123
 
75
124
  Add this line to your application's Gemfile:
@@ -0,0 +1,33 @@
1
+ class StructuredChangelog
2
+ module VersionInstanceMethods
3
+ def bump_major
4
+ bump_at_segment_index(0)
5
+ end
6
+
7
+ def bump_minor
8
+ bump_at_segment_index(1)
9
+ end
10
+
11
+ def bump_patch
12
+ bump_at_segment_index(2)
13
+ end
14
+
15
+ private
16
+
17
+ def bump_at_segment_index(index)
18
+ unbumped_segments = segments[0...index]
19
+ bumped_segment = [segments[index] + 1]
20
+ # zero out the remaining segments until we hit a non-numeric (rc, say) segment
21
+ trailing_zeroes = [0] * segments[(index + 1)..-1].take_while { |x| x.is_a?(Fixnum) }.size
22
+
23
+ bumped_segments =
24
+ unbumped_segments +
25
+ bumped_segment +
26
+ trailing_zeroes
27
+
28
+ self.class.new(bumped_segments.join('.'))
29
+ end
30
+ end
31
+ end
32
+
33
+ Gem::Version.send(:include, StructuredChangelog::VersionInstanceMethods)
@@ -0,0 +1,9 @@
1
+ class StructuredChangelog
2
+ module StringInstanceMethods
3
+ def match?(*args)
4
+ !!match(*args)
5
+ end
6
+ end
7
+ end
8
+
9
+ String.send(:include, StructuredChangelog::StringInstanceMethods)
@@ -0,0 +1,42 @@
1
+ require 'structured_changelog'
2
+ require 'structured_changelog/core_ext/string'
3
+ require 'structured_changelog/core_ext/gem'
4
+ require 'git'
5
+
6
+ task "changelog:compile", [:repo_path, :changelog_path] do |_task, arguments|
7
+ repo_path = arguments.to_h.fetch(:repo_path) { Pathname.pwd }
8
+ changelog_path = arguments.to_h.fetch(:changelog_path) { Pathname.pwd/"CHANGELOG.md" }
9
+
10
+ current_version = StructuredChangelog.new(changelog_path).version
11
+
12
+ repo = Git.open(repo_path)
13
+
14
+ commit_messages = repo.log.since("v#{current_version}").map(&:message).select do |message|
15
+ message.match?(/^\[CHANGELOG\]\n\n\*\ /)
16
+ end
17
+
18
+ abort("No [CHANGELOG] commits since the last release") if commit_messages.empty?
19
+
20
+ message = commit_messages.flat_map do |message|
21
+ message.sub(/^\[CHANGELOG\]\n\n/, "")
22
+ end.join("\n")
23
+
24
+ new_version = if message.match?(/^*\ BREAKING:/)
25
+ current_version.bump_major
26
+ elsif message.match?(/^*\ FEATURE:/)
27
+ current_version.bump_minor
28
+ elsif message.match?(/^*\ FIX:/)
29
+ current_version.bump_patch
30
+ elsif message.match?(/^*\ ENHANCEMENT:/)
31
+ current_version.bump_patch
32
+ elsif message.match?(/^*\ DEPRECATION:/)
33
+ current_version.bump_patch
34
+ end
35
+
36
+ changelog_path.write(
37
+ changelog_path.read.sub(
38
+ /^##\ RELEASE\ #{current_version}/,
39
+ "## RELEASE #{new_version}\n\n#{message}\n\n## RELEASE #{current_version}"
40
+ )
41
+ )
42
+ end
@@ -0,0 +1,7 @@
1
+ desc "Validates your Changelog, updates your VERSION constant, then commits that (when you want to PR releases)"
2
+ task "changelog:prep", [:repo_path, :changelog_path, :version_path] do |_task, arguments|
3
+ Rake::Task['changelog:validate'].execute(arguments)
4
+ Rake::Task['changelog:sync'].execute(arguments)
5
+ `bundle`
6
+ Rake::Task['changelog:commit'].execute(arguments)
7
+ end
@@ -1,9 +1,6 @@
1
1
  desc "Validates your Changelog, updates your VERSION constant, commits that, then releases your gem."
2
2
  task 'changelog:release', [:repo_path, :changelog_path, :version_path] do |_task, arguments|
3
- Rake::Task['changelog:validate'].execute(arguments)
4
- Rake::Task['changelog:sync'].execute(arguments)
5
- `bundle`
6
- Rake::Task['changelog:commit'].execute(arguments)
3
+ Rake::Task['changelog:prep'].execute(arguments)
7
4
 
8
5
  # Merely requiring `bundler/gem_tasks` instantiates & caches a gemspec. At this point in this code,
9
6
  # it's already set and attached to the `Bundler::GemHelper` module. In fact, it's there before this
@@ -4,7 +4,7 @@ require 'structured_changelog/version_pattern'
4
4
  desc "Set the gem's VERSION constant to be the changelog's version"
5
5
  task 'changelog:sync', [:changelog_path, :version_path] do |_task, arguments|
6
6
  changelog_path = arguments.to_h.fetch(:changelog_path) { "CHANGELOG.md" }
7
- version_path = arguments.to_h.fetch(:version_path) { "lib/#{Pathname.pwd.basename}/version.rb"}
7
+ version_path = arguments.to_h.fetch(:version_path) { "lib/#{Pathname.pwd.basename}/version.rb" }
8
8
 
9
9
  changelog = StructuredChangelog.new(changelog_path)
10
10
  version_file = Pathname.new(version_path)
@@ -1,3 +1,3 @@
1
1
  class StructuredChangelog
2
- VERSION = "0.8.3"
2
+ VERSION = "0.10.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: structured_changelog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Hoffman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-01 00:00:00.000000000 Z
11
+ date: 2018-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -126,6 +126,8 @@ files:
126
126
  - bin/console
127
127
  - bin/setup
128
128
  - lib/structured_changelog.rb
129
+ - lib/structured_changelog/core_ext/gem.rb
130
+ - lib/structured_changelog/core_ext/string.rb
129
131
  - lib/structured_changelog/release.rb
130
132
  - lib/structured_changelog/release_filters.rb
131
133
  - lib/structured_changelog/release_filters/base.rb
@@ -138,7 +140,9 @@ files:
138
140
  - lib/structured_changelog/roadmap.rb
139
141
  - lib/structured_changelog/tasks.rb
140
142
  - lib/structured_changelog/tasks/commit.rb
143
+ - lib/structured_changelog/tasks/compile.rb
141
144
  - lib/structured_changelog/tasks/notes.rb
145
+ - lib/structured_changelog/tasks/prep.rb
142
146
  - lib/structured_changelog/tasks/recent.rb
143
147
  - lib/structured_changelog/tasks/release.rb
144
148
  - lib/structured_changelog/tasks/sync.rb
@@ -166,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
170
  version: '0'
167
171
  requirements: []
168
172
  rubyforge_project:
169
- rubygems_version: 2.6.3
173
+ rubygems_version: 2.6.12
170
174
  signing_key:
171
175
  specification_version: 4
172
176
  summary: A useful changelog, for a change.