structured_changelog 0.8.3 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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.