reissue 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cea3fe8e5fffe1889e022f6acb6caf168c28e3af84c94639fbda06ce33dbf326
4
+ data.tar.gz: 68e0a7d97426359fdd708fbf147e62fc0904acaa93f245f3f1e4f39f7d1d940a
5
+ SHA512:
6
+ metadata.gz: 87626ce0220e19646aab027249f9555a5c201767db04ab146b2bb962aad302423a2f067a93c8c9993d62bafd208de0ff470c9b45376e7030efa4b2fa6c1f1d08
7
+ data.tar.gz: 159120e2c1656e1d30470f57bb9c7f2914747f1d8fd8ae88d2fa6f17a9bff8267f7c29be71d0c49c21d6898cff850532578ab1a2263c5cbcb5a4d0266e254966
data/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # Change log
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](http://keepachangelog.com/)
5
+ and this project adheres to [Semantic Versioning](http://semver.org/).
6
+
7
+ ## 0.1.0 - 2024-04-11
8
+ ### Added:
9
+ - Initial release
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 SOFware LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # Reissue
2
+
3
+ Prepare the releases of your Ruby gems with ease.
4
+
5
+ When creating versioned software, it is important to keep track of the changes and the versions that are released.
6
+
7
+ After each release of a gem, you should immediatly bump the version with a new number and update the changelog with a place
8
+ to capture the information about new changes.
9
+
10
+ Reissue helps you to prepare the next version of your project by providing tools which will update version numbers and
11
+ update the changelog with a new version and a date.
12
+
13
+ Use Reissue to prepare your first commit going into the new version.
14
+
15
+ ## Installation
16
+
17
+ Install the gem and add to the application's Gemfile by executing:
18
+
19
+ $ bundle add reissue
20
+
21
+ If bundler is not being used to manage dependencies, install the gem by executing:
22
+
23
+ $ gem install reissue
24
+
25
+ ## Usage
26
+
27
+ Build your own release with rake tasks provided by the gem. The following tasks are available:
28
+
29
+ - `rake reissue[segment]` - Prepare a new version for future work for the given version segment.
30
+ - `rake reissue:finalize` - Update the CHANGELOG.md file with a date for the latest version.
31
+
32
+ ## Development
33
+
34
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
35
+
36
+ ## Contributing
37
+
38
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[SOFware]/reissue.
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << "test"
8
+ t.libs << "lib"
9
+ t.warning = true
10
+ t.test_files = FileList["test/**/test_*.rb"]
11
+ end
12
+
13
+ task default: :test
14
+
15
+ desc "Prepare the code for work on a new version."
16
+ task :reissue, [:segment] => ["build:checksum"] do |task, args|
17
+ require "reissue"
18
+ segment = args[:segment] || "patch"
19
+ Reissue.call(segment: segment, version_file: "lib/reissue/version.rb")
20
+ end
21
+
22
+ namespace :reissue do
23
+ task :finalize, [:date] do |task, args|
24
+ require "reissue"
25
+ date = args[:date] || Time.now.strftime("%Y-%m-%d")
26
+ Reissue.finalize(date, changelog_file: "CHANGELOG.md")
27
+ end
28
+ end
@@ -0,0 +1,68 @@
1
+ require "keepachangelog"
2
+
3
+ module Reissue
4
+ # Updates the changelog file with new versions and changes.
5
+ class ChangelogUpdater
6
+ def initialize(changelog_file)
7
+ @changelog_file = changelog_file
8
+ @changelog = {}
9
+ end
10
+
11
+ attr_reader :changelog
12
+
13
+ # Updates the changelog with a new version and its changes.
14
+ #
15
+ # @param version [String] The version number.
16
+ # @param date [String] The release date (default: "Unreleased").
17
+ # @param changes [Hash] The changes for the version (default: {}).
18
+ # @param changelog_file [String] The path to the changelog file (default: @changelog_file).
19
+ def call(version, date: "Unreleased", changes: {}, changelog_file: @changelog_file)
20
+ update(version, date: date, changes: changes)
21
+ write(changelog_file)
22
+ changelog
23
+ end
24
+
25
+ def finalize(date: Date.today, changelog_file: @changelog_file)
26
+ @changelog = Keepachangelog::MarkdownParser.parse(File.read(changelog_file))
27
+ # find the highest version number and if it is unreleased, update the date
28
+ version = changelog["versions"].keys.max
29
+ version_date = changelog.dig("versions", version, "date")
30
+ if version_date.nil? || version_date == "Unreleased"
31
+ updated = changelog["versions"].delete(version)
32
+ new_version = version.sub(/\s-.*/, "")
33
+ changelog["versions"][new_version] = updated.merge("date" => date)
34
+ end
35
+ write(changelog_file)
36
+ changelog
37
+ end
38
+
39
+ # Updates the changelog with a new version and its changes.
40
+ #
41
+ # @param version [String] The version number.
42
+ # @param date [String] The release date (default: "Unreleased").
43
+ # @param changes [Hash] The changes for the version (default: {}).
44
+ def update(version, date: "Unreleased", changes: {})
45
+ @changelog = Keepachangelog::MarkdownParser.parse(File.read(@changelog_file))
46
+
47
+ changelog["versions"][version] = { "date" => date, "changes" => changes }
48
+ changes.each do |section, change|
49
+ changelog["versions"][version]["changes"][section] = change
50
+ end
51
+ changelog
52
+ end
53
+
54
+ # Returns the string representation of the changelog.
55
+ #
56
+ # @return [String] The Markdown string representation of the changelog.
57
+ def to_s
58
+ Keepachangelog::MarkdownPrinter.new(changelog["versions"]).to_s
59
+ end
60
+
61
+ # Writes the changelog to the specified file.
62
+ #
63
+ # @param changelog_file [String] The path to the changelog file (default: @changelog_file).
64
+ def write(changelog_file = @changelog_file)
65
+ File.write(changelog_file, to_s)
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Reissue
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,74 @@
1
+ module Reissue
2
+ # Provides versioning functionality for the application.
3
+ module Versioning
4
+ # Provides versioning functionality for the application.
5
+ refine Gem::Version do
6
+ # Redoes the version based on the specified segment_name.
7
+ #
8
+ # @param segment_name [Symbol] The segment_name to redo the version.
9
+ # Possible values are :major, :minor, or any other symbol.
10
+ # @return [Gem::Version] The updated version.
11
+ def redo(segment_name)
12
+ if segment_name.to_s == "major"
13
+ Gem::Version.new("#{segments[0].to_i + 1}.0.0")
14
+ elsif segment_name.to_s == "minor"
15
+ Gem::Version.new("#{segments[0]}.#{segments[1].to_i + 1}.0")
16
+ else
17
+ Gem::Version.new("#{segments[0]}.#{segments[1]}.#{segments[2].to_i + 1}")
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ class VersionUpdater
24
+ using Versioning
25
+
26
+ # Initializes a new instance of the VersionUpdater class.
27
+ #
28
+ # @param version_file [String] The path to the version file.
29
+ def initialize(version_file)
30
+ @version_file = version_file
31
+ @original_version = nil
32
+ @new_version = nil
33
+ @updated_body = ""
34
+ end
35
+
36
+ # Updates the version segment and writes the updated version to the file.
37
+ #
38
+ # This allows you to read from one file and write to another.
39
+ #
40
+ # @param segment [Symbol] The segment to update (:major, :minor, or :patch).
41
+ # @param version_file [String] The version_file to the version file (optional, defaults to @version_file).
42
+ # @return [String] The updated version string.
43
+ def call(segment, version_file: @version_file)
44
+ update(segment)
45
+ write(version_file)
46
+ @new_version
47
+ end
48
+
49
+ # Updates the specified segment of the version string.
50
+ #
51
+ # @param segment [Symbol] The segment to update (:major, :minor, or :patch).
52
+ # @return [String] The updated version string.
53
+ def update(segment)
54
+ version_file = File.read(@version_file)
55
+ @updated_body = version_file.gsub(version_regex) do |string|
56
+ @original_version = Gem::Version.new(string)
57
+ @new_version = Gem::Version.new(string).redo(segment).to_s
58
+ end
59
+ @new_version
60
+ end
61
+
62
+ # Regular expression pattern for matching the version string.
63
+ #
64
+ # @return [Regexp] The version regex pattern.
65
+ def version_regex = /(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/
66
+
67
+ # Writes the updated version to the specified file.
68
+ #
69
+ # @param version_file [String] The version_file to the version file (optional, defaults to @version_file).
70
+ def write(version_file = @version_file)
71
+ File.write(version_file, @updated_body)
72
+ end
73
+ end
74
+ end
data/lib/reissue.rb ADDED
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "reissue/version"
4
+ require_relative "reissue/version_updater"
5
+ require_relative "reissue/changelog_updater"
6
+
7
+ # Reissue is a module that provides functionality for updating version numbers and changelogs.
8
+ module Reissue
9
+ # Updates the version number and changelog.
10
+ #
11
+ # @param version_file [String] The path to the version file.
12
+ # @param changelog_file [String] The path to the changelog file.
13
+ # @param segment [String] The segment of the version number to update.
14
+ # @param date [String] The release date.
15
+ # @param changes [Hash] The changes made in this release.
16
+ # @return [String] The new version number.
17
+ def self.call(version_file:, changelog_file: "CHANGELOG.md", segment: "patch", date: "Unreleased", changes: {})
18
+ version_updater = VersionUpdater.new(version_file)
19
+ new_version = version_updater.call(segment, version_file:)
20
+ if changelog_file
21
+ changelog_updater = ChangelogUpdater.new(changelog_file)
22
+ changelog_updater.call(new_version, date:, changes:, changelog_file:)
23
+ end
24
+ new_version
25
+ end
26
+
27
+ # Finalizes the changelog for an unreleased version to set the release date.
28
+ #
29
+ # @param date [String] The release date.
30
+ # @param changelog_file [String] The path to the changelog file.
31
+ def self.finalize(date = Date.today, changelog_file: "CHANGELOG.md")
32
+ changelog_updater = ChangelogUpdater.new(changelog_file)
33
+ changelog_updater.finalize(date:, changelog_file:)
34
+ end
35
+ end
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reissue
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jim Gay
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-04-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: keepachangelog
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: This gem helps you to prepare for releases of new versions of your code.
28
+ email:
29
+ - jim@saturnflyer.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - CHANGELOG.md
35
+ - LICENSE.txt
36
+ - README.md
37
+ - Rakefile
38
+ - lib/reissue.rb
39
+ - lib/reissue/changelog_updater.rb
40
+ - lib/reissue/version.rb
41
+ - lib/reissue/version_updater.rb
42
+ homepage: https://github.com/SOFware/reissue
43
+ licenses: []
44
+ metadata:
45
+ homepage_uri: https://github.com/SOFware/reissue
46
+ source_code_uri: https://github.com/SOFware/reissue
47
+ changelog_uri: https://github.com/SOFware/reissue/blob/main/CHANGELOG.md
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 3.0.0
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirements: []
63
+ rubygems_version: 3.5.5
64
+ signing_key:
65
+ specification_version: 4
66
+ summary: Keep your versions and changelogs up to date and prepared for release.
67
+ test_files: []