reissue 0.1.7 → 0.2.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
  SHA256:
3
- metadata.gz: c277981b6bc7dc46a2ae0d84bddd6b8f04a7328d2bd0949d380bb948cb3acbff
4
- data.tar.gz: d9078fed64c4fc984e150a6c03bcdcd912663e3f8c9d550b571b8ba77b55a644
3
+ metadata.gz: b29a6f2ef60fb2fcd7c8a87473a6331b7761c6396f1274128821540f562ec06c
4
+ data.tar.gz: fd813df98ea7a642b4b65895db0155a5ba34100f65358fbd0fb65863fcb992d4
5
5
  SHA512:
6
- metadata.gz: 3d1677cb2633cc8b3b19c5842fb7edbc7ef46e6f8299b5a8886385822ad07f2657f2f3ff44c77a0bb68027c3227a4ce8ec298bd00b8d585f765368f2a64f4673
7
- data.tar.gz: 27d09c82326c667a357cd77c8f1536dbb163e72445ff6b1d02f97738a1bcc0ba28080e74f2ab2e21d6cf42fbf3c43c0e6b54607b9c4052e7791603f47c14e046
6
+ metadata.gz: ed99a9041e9ab54640c75d5eb5ff6dc86688a120069d8b5d9c866f0299c15c883bc4e7aecb7cd511c43e44dc4667d4f029e7cbab794ad84a4d45b9c43a7b8da7
7
+ data.tar.gz: f693b77d20a53cd92619efc3d3c984d93788b98caaac3d88a853bed175b8c7f589f8d4837196769dd8f9f6f7650a5c23dab1a956140c4bf774f5001df6b953d1
data/CHANGELOG.md CHANGED
@@ -5,18 +5,28 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/).
7
7
 
8
- ## [0.1.7] - 2024-06-10
8
+ ## [0.2.0] - 2024-07-02
9
+
10
+ ### Added
11
+
12
+ - Reissue::Markdown class to implement the Reissue::Parser.parse behavior
13
+
14
+ ### Removed
15
+
16
+ - Reissue::Parser implementation
9
17
 
10
18
  ### Fixed
11
19
 
12
- - Pass the version_redo_proc to the Reissue.call in the reissue task.
20
+ - Handle multiline changes
13
21
 
14
- ## [0.1.6] - 2024-06-10
22
+ ## [0.1.8] - Unreleased
15
23
 
16
- ### Added
24
+ ### Changed
17
25
 
18
- - The ability to specify the version_redo_proc to customize the version number update process.
26
+ - Update the README.md to specify the default values for some configuration.
27
+
28
+ ## [0.1.7] - 2024-06-10
19
29
 
20
30
  ### Fixed
21
31
 
22
- - Incorrect testing of Reissue.reformat
32
+ - Pass the version_redo_proc to the Reissue.call in the reissue task.
data/README.md CHANGED
@@ -89,7 +89,7 @@ Reissue::Task.create :your_name_and_namespace do |task|
89
89
  # Required: The file to update with the new version number.
90
90
  task.version_file = "path/to/version.rb"
91
91
 
92
- # Optional: The number of versions to maintain in the changelog.
92
+ # Optional: The number of versions to maintain in the changelog. Defaults to 2.
93
93
  task.version_limit = 5
94
94
 
95
95
  # Optional: A Proc to format the version number. Receives a Gem::Version object, and segment.
@@ -97,7 +97,7 @@ Reissue::Task.create :your_name_and_namespace do |task|
97
97
  # your special versioning logic
98
98
  end
99
99
 
100
- # Optional: The file to update with the new version number.
100
+ # Optional: The file to update with the new version number. Defaults to "CHANGELOG.md".
101
101
  task.changelog_file = "path/to/CHANGELOG.md"
102
102
 
103
103
  # Optional: Whether to commit the changes automatically. Defaults to true.
@@ -0,0 +1,115 @@
1
+ module Reissue
2
+ class Markdown
3
+ def self.parse(changelog)
4
+ new(changelog).to_h
5
+ end
6
+
7
+ def initialize(changelog)
8
+ @changelog = changelog
9
+ @versions = {}
10
+ @header = nil
11
+ @parts = []
12
+ end
13
+
14
+ def parse
15
+ return unless @header.nil? && @versions.empty?
16
+
17
+ header, *chunks = @changelog.split(/^## /)
18
+
19
+ @header = Header.new(header)
20
+ @versions = Array(chunks).map { |part| Version.new(part) }
21
+ end
22
+
23
+ def to_h
24
+ parse
25
+ @header.to_h.merge("versions" => @versions.map(&:to_h))
26
+ end
27
+
28
+ class Header
29
+ def initialize(chunk)
30
+ @chunk = chunk.to_s
31
+ @title = nil
32
+ @preamble = nil
33
+ end
34
+
35
+ def parse
36
+ return unless @title.nil? && @preamble.nil?
37
+
38
+ scanner = StringScanner.new(@chunk.dup << "\n")
39
+ scanner.scan(/# ([\w\s]+)$/)
40
+ @title = scanner[1].to_s.strip
41
+ # the rest of the text is the preamble
42
+ @preamble = scanner.rest.strip
43
+ end
44
+
45
+ def to_h
46
+ parse
47
+ {
48
+ "title" => @title,
49
+ "preamble" => @preamble
50
+ }
51
+ end
52
+ end
53
+
54
+ class Version
55
+ def initialize(chunk)
56
+ @chunk = chunk
57
+ @version = nil
58
+ @date = nil
59
+ @changes = []
60
+ end
61
+
62
+ def parse
63
+ return unless @version.nil? && @date.nil? && @changes.empty?
64
+ # the first line contains the version and date
65
+ scanner = StringScanner.new(@chunk) << "\n"
66
+ scanner.scan(/\[?(.[^\]]+)\]? - (.+)$/)
67
+ @version = scanner[1].to_s.strip
68
+ @date = scanner[2].to_s.strip || "Unreleased"
69
+
70
+ # the rest of the text is the changes
71
+ @changes = scanner.rest.strip.split("### ").reject(&:empty?).map { |change| Change.new(change) }
72
+ end
73
+
74
+ def to_h
75
+ parse
76
+ {
77
+ "version" => @version,
78
+ "date" => @date,
79
+ "changes" => @changes.inject({}) { |h, change| h.merge(change.to_h) }
80
+ }
81
+ end
82
+ end
83
+
84
+ class Change
85
+ def initialize(chunk)
86
+ @chunk = chunk
87
+ @type = nil
88
+ @changes = []
89
+ end
90
+
91
+ def parse
92
+ return unless @type.nil? && @changes.empty?
93
+ scanner = StringScanner.new(@chunk) << "\n"
94
+ scanner.scan(/([\w\s]+)$/)
95
+
96
+ @type = scanner[1].to_s.strip
97
+
98
+ # the rest of the text are the changes
99
+ @changes = scanner
100
+ .rest
101
+ .strip
102
+ .split(/^-/m)
103
+ .map { |change| change.strip.gsub(/^- /m, "") }
104
+ .reject(&:empty?)
105
+ end
106
+
107
+ def to_h
108
+ parse
109
+ {
110
+ @type => @changes.map { |change| change.split("\n").map(&:strip).join("\n ") }
111
+ }
112
+ end
113
+ end
114
+ end
115
+ end
@@ -1,4 +1,5 @@
1
1
  require "strscan"
2
+ require_relative "markdown"
2
3
 
3
4
  module Reissue
4
5
  class Parser
@@ -8,94 +9,10 @@ module Reissue
8
9
 
9
10
  def initialize(changelog)
10
11
  @changelog = changelog
11
- @versions = {}
12
- @parts = []
13
12
  end
14
13
 
15
14
  def parse
16
- scanner = StringScanner.new(@changelog) << "\n"
17
- @parts << parse_title(scanner)
18
- @parts << parse_preamble(scanner)
19
- @parts << parse_versions(scanner)
20
- @parts.compact.reduce(&:merge)
21
- end
22
-
23
- VERSION_BREAK = "## "
24
- CHANGE_BREAK = "### "
25
- VERSION_MATCH = /^#{VERSION_BREAK}/
26
- VERSION_OR_CHANGE_MATCH = Regexp.union(CHANGE_BREAK, VERSION_BREAK)
27
- VERSION_OR_CHANGE_OR_NEWLINE_MATCH = Regexp.union(/\n/, CHANGE_BREAK, VERSION_BREAK)
28
-
29
- private
30
-
31
- def parse_title(scanner)
32
- scanner.scan(/# ([\w\s]+)$/)
33
- title = scanner[1].to_s.strip
34
- {"title" => title}
35
- end
36
-
37
- def parse_preamble(scanner)
38
- preamble = scanner.scan_until(VERSION_MATCH)
39
- preamble = preamble.to_s.gsub(VERSION_BREAK, "").strip
40
- scanner.unscan unless preamble.empty?
41
- {"preamble" => preamble.strip}
42
- end
43
-
44
- def parse_versions(scanner)
45
- until scanner.eos?
46
- scanner.skip(/\s+/)
47
- next_line = scanner.scan_until(VERSION_OR_CHANGE_OR_NEWLINE_MATCH)
48
- break if next_line.nil? || next_line.strip.empty?
49
- unless next_line.match?(VERSION_OR_CHANGE_MATCH)
50
- parse_versions(scanner)
51
- end
52
- if next_line.match?(VERSION_MATCH)
53
- scanner.scan_until(/(.+)\n/)
54
- version, date = scanner[1].split(" - ")
55
- date ||= "Unreleased"
56
- version = version.gsub(VERSION_BREAK, "").strip.tr("[]", "")
57
- changes = parse_changes(scanner)
58
- @versions[version] = {"version" => version, "date" => date, "changes" => changes}
59
- parse_versions(scanner)
60
- end
61
- end
62
- {"versions" => @versions.values}
63
- end
64
-
65
- def parse_changes(scanner, changes: {})
66
- return changes if scanner.eos?
67
- scanner.skip(/\s+/)
68
-
69
- next_line = scanner.scan_until(/\n/)
70
- if next_line.nil? || next_line.strip.empty?
71
- return changes
72
- elsif next_line.match?(VERSION_MATCH)
73
- scanner.unscan
74
- return changes
75
- end
76
-
77
- if next_line.match?(CHANGE_BREAK)
78
- change_type = next_line.gsub(CHANGE_BREAK, "").strip
79
- changes[change_type] = parse_change_list(scanner)
80
- end
81
- parse_changes(scanner, changes: changes)
82
- end
83
-
84
- def parse_change_list(scanner, collection: [])
85
- return collection if scanner.eos?
86
- scanner.skip(/\s+/)
87
- change = scanner.scan_until(/\n/)
88
- if change.nil? || change.strip.empty?
89
- return collection
90
- elsif change.match?(VERSION_OR_CHANGE_MATCH)
91
- scanner.unscan
92
- return collection
93
- else
94
- item = change.sub(/^\s?-\s?/, "").strip
95
- collection << item
96
- parse_change_list(scanner, collection:)
97
- end
98
- collection.reject(&:empty?).compact
15
+ Markdown.parse(@changelog).to_h
99
16
  end
100
17
  end
101
18
  end
@@ -25,8 +25,8 @@ module Reissue
25
25
  {}
26
26
  end
27
27
  version_string = "## [#{version}] - #{date}"
28
- changes_string = changes.map do |section, changes|
29
- format_section(section, changes)
28
+ changes_string = changes.map do |section, section_changes|
29
+ format_section(section, section_changes)
30
30
  end.join("\n\n")
31
31
  [version_string, changes_string].filter_map { |str| str unless str.empty? }.join("\n\n")
32
32
  end.then do |data|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Reissue
4
- VERSION = "0.1.7"
4
+ VERSION = "0.2.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reissue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Gay
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-10 00:00:00.000000000 Z
11
+ date: 2024-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -38,6 +38,7 @@ files:
38
38
  - lib/reissue.rb
39
39
  - lib/reissue/changelog_updater.rb
40
40
  - lib/reissue/gem.rb
41
+ - lib/reissue/markdown.rb
41
42
  - lib/reissue/parser.rb
42
43
  - lib/reissue/printer.rb
43
44
  - lib/reissue/rake.rb