releasetool 0.3.0 → 0.5.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: 983770392f1e8f1b9e2a4d1c7ca5fbf20d60a3c6927e9592dd2550d7b8b055e0
4
- data.tar.gz: 33e70854792ca8494b51bb5db8df0fe5eecda6c4058d14448097fb4da4b5777e
3
+ metadata.gz: 1b46e141b87c5f056ab3af71cdf6a5157e6b559e51743a07383bc225676c9866
4
+ data.tar.gz: e9d0a785e91132404eee8aef1a96705834569d5933210dbae5e3a6cbe89f2360
5
5
  SHA512:
6
- metadata.gz: 50dcc0d3b1855bbfcdabb39fe51acf733702215599e0d36a9f17b04e0a99dd2db610cd1aaaa4f0b050488f9e0abc606ad5077f4c3b003e80dd6a3d155c1ef3b0
7
- data.tar.gz: 8dc72d2e9b6704f859d7812b39038b9e9c308d7e4c14975a9e1b8f4e2bf4ff62a69f0bc11a35c40ece91fe12f8cd77c50359750f5b615aac5a667b8c7de2c87b
6
+ metadata.gz: f0e80727a056d71917c33fb270685e16f7ec50e50a9aad75d0ae15c09380b993aec681fa340e45ecc126bda12a4a0778e807443dabba0e9f269b586f22cdc046
7
+ data.tar.gz: ad2a984cb079825de22f0efa986f6f4695e3df5f711c4eb8da5075ad726a2356eea050dff44d24efb48a78bf2d6069077a1126c4854a353b2ce2efa6d8cb4326
data/.rubocop.yml ADDED
@@ -0,0 +1,117 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ #require:
4
+ # - rubocop-performance
5
+ # - rubocop-rspec
6
+
7
+ AllCops:
8
+ TargetRubyVersion: 2.7
9
+ DefaultFormatter: fuubar
10
+ Exclude:
11
+ - 'tmp/**/*'
12
+ DisplayCopNames: true
13
+ NewCops: enable
14
+ CacheRootDirectory: tmp # ie. tmp/rubocop_cache
15
+ UseCache: true
16
+
17
+ Gemspec/DevelopmentDependencies:
18
+ EnforcedStyle: gemspec
19
+
20
+ # Don't like this, it's too annoying
21
+ Layout/LineLength:
22
+ Max: 120
23
+ Enabled: false
24
+
25
+ Layout/ParameterAlignment:
26
+ EnforcedStyle: with_fixed_indentation
27
+
28
+ Lint/AmbiguousBlockAssociation:
29
+ Enabled: true
30
+ Exclude:
31
+ - "spec/**/*" # https://github.com/rubocop/rubocop/issues/4222
32
+
33
+ Lint/AssignmentInCondition:
34
+ AutoCorrect: false
35
+
36
+ Lint/UnusedBlockArgument:
37
+ AutoCorrect: false
38
+
39
+ Lint/UnusedMethodArgument:
40
+ AutoCorrect: false
41
+
42
+ Metrics/AbcSize:
43
+ Enabled: false
44
+ # I don't think this is something we want to enforce (yet?)
45
+
46
+ Metrics/BlockLength:
47
+ AllowedMethods:
48
+ - "no_commands" # thor
49
+ Exclude:
50
+ - "spec/**/*.rb"
51
+
52
+ Metrics/ClassLength:
53
+ Enabled: false
54
+
55
+ Metrics/CyclomaticComplexity:
56
+ Enabled: false
57
+
58
+ Metrics/MethodLength:
59
+ Enabled: false
60
+ # No (not yet)
61
+
62
+ Metrics/PerceivedComplexity:
63
+ Enabled: false
64
+
65
+ Naming/AccessorMethodName:
66
+ Enabled: false
67
+ # In theory this is good. In practice lots of false errors
68
+
69
+ ## I'm not very keen on this one
70
+ #Performance/TimesMap:
71
+ # Enabled: false
72
+
73
+ ## I can't see the value of this
74
+ #RSpec/DescribeClass:
75
+ # Enabled: false
76
+
77
+ #RSpec/EmptyExampleGroup:
78
+ # # we need to fix manually - e.g. fill it in or delete it
79
+ # AutoCorrect: false
80
+ #
81
+ ## prefer this
82
+ #RSpec/ExpectChange:
83
+ # EnforcedStyle: block
84
+ #
85
+ ## I can't see the value of this
86
+ #RSpec/MultipleMemoizedHelpers:
87
+ # Enabled: false
88
+ #
89
+ ## This is actually wrong and a mistake (`expect ... to receive ... and return ...` is good practice)
90
+ #RSpec/StubbedMock:
91
+ # Enabled: false
92
+
93
+
94
+ Style/BlockDelimiters:
95
+ Exclude:
96
+ - 'spec/**/*'
97
+
98
+ Style/Documentation:
99
+ Enabled: false
100
+ # Sounds good, but really?
101
+
102
+ Style/DoubleNegation:
103
+ Enabled: false
104
+ # double negation is an ok way to enforce true / false when assigning
105
+
106
+ Style/NumericLiterals:
107
+ Enabled: false
108
+ # This is a pain, most long numeric literals are things like ids or times as numbers
109
+
110
+ Style/StringLiterals:
111
+ Enabled: true
112
+ EnforcedStyle: double_quotes
113
+
114
+ Style/SymbolProc:
115
+ Enabled: true
116
+ AllowMethodsWithArguments: true
117
+ AllowComments: true
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,139 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config --exclude-limit 100`
3
+ # on 2023-09-11 13:28:02 UTC using RuboCop version 1.56.3.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, CheckDefinitionPathHierarchyRoots, Regex, IgnoreExecutableScripts, AllowedAcronyms.
11
+ # CheckDefinitionPathHierarchyRoots: lib, spec, test, src
12
+ # AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
13
+ Naming/FileName:
14
+ Exclude:
15
+ - 'spec/fixtures/example_with_releases/config/initializers/00-version.rb'
16
+
17
+ # Offense count: 8
18
+ # Configuration parameters: ForbiddenDelimiters.
19
+ # ForbiddenDelimiters: (?i-mx:(^|\s)(EO[A-Z]{1}|END)(\s|$))
20
+ Naming/HeredocDelimiterNaming:
21
+ Exclude:
22
+ - 'lib/tasks/release_thor.rb'
23
+
24
+ # Offense count: 15
25
+ # Configuration parameters: EnforcedStyle, CheckMethodNames, CheckSymbols, AllowedIdentifiers, AllowedPatterns.
26
+ # SupportedStyles: snake_case, normalcase, non_integer
27
+ # AllowedIdentifiers: capture3, iso8601, rfc1123_date, rfc822, rfc2822, rfc3339, x86_64
28
+ Naming/VariableNumber:
29
+ Exclude:
30
+ - 'spec/releasetool_spec.rb'
31
+ - 'spec/version_spec.rb'
32
+
33
+ # Offense count: 1
34
+ # This cop supports safe autocorrection (--autocorrect).
35
+ # Configuration parameters: EnforcedStyle, EnforcedShorthandSyntax, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols.
36
+ # SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys
37
+ # SupportedShorthandSyntax: always, never, either, consistent
38
+ Style/HashSyntax:
39
+ Exclude:
40
+ - 'Rakefile'
41
+
42
+ # Offense count: 6
43
+ # This cop supports unsafe autocorrection (--autocorrect-all).
44
+ # Configuration parameters: EnforcedStyle.
45
+ # SupportedStyles: literals, strict
46
+ Style/MutableConstant:
47
+ Exclude:
48
+ - 'lib/releasetool.rb'
49
+ - 'lib/releasetool/util.rb'
50
+ - 'lib/tasks/release_thor.rb'
51
+ - 'spec/fixtures/example_with_releases/config/initializers/00-version.rb'
52
+
53
+ # Offense count: 1
54
+ # This cop supports unsafe autocorrection (--autocorrect-all).
55
+ # Configuration parameters: EnforcedStyle, AllowedMethods, AllowedPatterns.
56
+ # SupportedStyles: predicate, comparison
57
+ Style/NumericPredicate:
58
+ Exclude:
59
+ - 'spec/**/*'
60
+ - 'lib/tasks/release_thor.rb'
61
+
62
+ # Offense count: 2
63
+ # This cop supports safe autocorrection (--autocorrect).
64
+ # Configuration parameters: PreferredDelimiters.
65
+ Style/PercentLiteralDelimiters:
66
+ Exclude:
67
+ - 'releasetool.gemspec'
68
+
69
+ # Offense count: 3
70
+ # This cop supports safe autocorrection (--autocorrect).
71
+ # Configuration parameters: AllowedCompactTypes.
72
+ # SupportedStyles: compact, exploded
73
+ Style/RaiseArgs:
74
+ EnforcedStyle: compact
75
+
76
+ # Offense count: 2
77
+ # This cop supports safe autocorrection (--autocorrect).
78
+ Style/RedundantPercentQ:
79
+ Exclude:
80
+ - 'releasetool.gemspec'
81
+
82
+ # Offense count: 1
83
+ # This cop supports safe autocorrection (--autocorrect).
84
+ # Configuration parameters: EnforcedStyle.
85
+ # SupportedStyles: only_raise, only_fail, semantic
86
+ Style/SignalException:
87
+ Exclude:
88
+ - 'lib/releasetool/util.rb'
89
+
90
+ # Offense count: 1
91
+ # This cop supports unsafe autocorrection (--autocorrect-all).
92
+ Style/SlicingWithRange:
93
+ Exclude:
94
+ - 'lib/releasetool/version.rb'
95
+
96
+ # Offense count: 1
97
+ # This cop supports safe autocorrection (--autocorrect).
98
+ # Configuration parameters: AllowModifier.
99
+ Style/SoleNestedConditional:
100
+ Exclude:
101
+ - 'lib/releasetool/release.rb'
102
+
103
+ # Offense count: 1
104
+ # This cop supports unsafe autocorrection (--autocorrect-all).
105
+ # Configuration parameters: RequireEnglish, EnforcedStyle.
106
+ # SupportedStyles: use_perl_names, use_english_names, use_builtin_english_names
107
+ Style/SpecialGlobalVars:
108
+ Exclude:
109
+ - 'releasetool.gemspec'
110
+
111
+ # Offense count: 34
112
+ # This cop supports safe autocorrection (--autocorrect).
113
+ # Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
114
+ # SupportedStyles: single_quotes, double_quotes
115
+ Style/StringLiterals:
116
+ Exclude:
117
+ - 'Gemfile'
118
+ - 'bin/release'
119
+ - 'lib/releasetool/release.rb'
120
+ - 'lib/releasetool/util.rb'
121
+ - 'lib/tasks/release_thor.rb'
122
+ - 'releasetool.gemspec'
123
+ - 'spec/releasetool_spec.rb'
124
+ - 'spec/spec_helper.rb'
125
+ - 'spec/version_spec.rb'
126
+
127
+ # Offense count: 1
128
+ # This cop supports safe autocorrection (--autocorrect).
129
+ # Configuration parameters: EnforcedStyle.
130
+ # SupportedStyles: single_quotes, double_quotes
131
+ Style/StringLiteralsInInterpolation:
132
+ Exclude:
133
+ - 'lib/tasks/release_thor.rb'
134
+
135
+ # Offense count: 1
136
+ # This cop supports unsafe autocorrection (--autocorrect-all).
137
+ Style/ZeroLengthPredicate:
138
+ Exclude:
139
+ - 'lib/tasks/release_thor.rb'
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in releasetool.gemspec
data/README.md CHANGED
@@ -22,6 +22,8 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
+ ```release help```
26
+
25
27
  ### List existing tags
26
28
 
27
29
  ```release list```
@@ -67,6 +69,7 @@ It will ask for a one-line summary of the release (full details are in the relea
67
69
 
68
70
  The tests work on a known-good repo stored in `spec/fixtures/example_with_releases.tar`. To recreate this:
69
71
  ```
72
+ mkdir -p spec/fixtures/example_with_releases
70
73
  cd spec/fixtures/example_with_releases && tar -xvf ../example_with_releases.tar && cd -
71
74
  ```
72
75
 
@@ -75,11 +78,20 @@ then you can tweak it and save it back with:
75
78
  cd spec/fixtures/example_with_releases && tar -cvf ../example_with_releases.tar . && cd -
76
79
  ```
77
80
 
81
+ ditto for other one with config
82
+
83
+ cd spec/fixtures/example_with_releases && tar -cvf ../example_with_releases.tar . && cd -
84
+
78
85
  ## Configuration
79
86
 
80
87
  If you want it to automatically update the version number in a string then set the environment variable
81
88
  `RELEASETOOL_VERSION_FILE`, eg. `export RELEASETOOL_VERSION_FILE=./lib/releasetool.rb`. By default this is configured to config/initializers/00-version.rb (useful for rails projects).
82
89
 
90
+ If you want to run something after `release start` or after `release commit` then generate a hooks file:
91
+
92
+ release init
93
+
94
+ which will generate a file at `config/releasetool/hooks.rb` which you can adjust.
83
95
 
84
96
  ## Contributing
85
97
 
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
5
 
data/bin/release CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  $LOAD_PATH << File.expand_path('../lib', File.dirname(__FILE__))
3
5
  require File.expand_path('../lib/tasks/release_thor.rb', File.dirname(__FILE__))
4
6
 
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "releasetool/util"
4
+
5
+ module Releasetool
6
+ class BaseHooks
7
+ # @param config [Releasetool::Configuration]
8
+ def initialize(config)
9
+ @config = config
10
+ end
11
+
12
+ def after_prepare(version)
13
+ # noop
14
+ end
15
+
16
+ def after_commit(version)
17
+ # noop
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "releasetool/util"
4
+ require "pathname"
5
+
6
+ module Releasetool
7
+ class Configuration
8
+ def after_start_hook(version)
9
+ return nil unless hooks.respond_to?(:after_start)
10
+
11
+ hooks.after_start(version)
12
+ end
13
+
14
+ def after_commit_hook(version)
15
+ return nil unless hooks.respond_to?(:after_commit)
16
+
17
+ hooks.after_commit(version)
18
+ end
19
+
20
+ def generate
21
+ FileUtils.mkdir_p(config_dir)
22
+ if File.exist?(hooks_file)
23
+ say "File #{hooks_file.inspect} already exists"
24
+ return
25
+ end
26
+
27
+ File.write(hooks_file, default_hooks)
28
+ end
29
+
30
+ private
31
+
32
+ def config_dir
33
+ Pathname.new("./config/releasetool")
34
+ end
35
+
36
+ def hooks
37
+ @hooks ||= new_hooks
38
+ end
39
+
40
+ def new_hooks
41
+ return nil unless File.exist?(hooks_file)
42
+
43
+ load hooks_file # we use load so we can test it 🙁
44
+ return nil unless defined?(Releasetool::Hooks)
45
+
46
+ Releasetool::Hooks.new(self)
47
+ end
48
+
49
+ def hooks_file
50
+ config_dir / "hooks.rb"
51
+ end
52
+
53
+ def default_hooks
54
+ <<~HOOKS
55
+ # frozen_string_literal: true
56
+
57
+ require "releasetool/util"
58
+ require "releasetool/base_hooks"
59
+
60
+ module Releasetool
61
+ class Hooks < Releasetool::BaseHooks
62
+ include Releasetool::Util
63
+
64
+ # def after_start(version)
65
+ # puts "after_start has been called"
66
+ # end
67
+
68
+ # def after_commit(version)
69
+ # puts "after_commit has been called"
70
+ # end
71
+ end
72
+ end
73
+ HOOKS
74
+ end
75
+ end
76
+ end
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "releasetool/util"
4
+ require "fileutils"
2
5
 
3
6
  module Releasetool
4
7
  class Release
@@ -6,6 +9,7 @@ module Releasetool
6
9
 
7
10
  def initialize(version, previous:)
8
11
  raise "Version must be a Releasetool::Version" unless version.is_a?(Releasetool::Version)
12
+
9
13
  if previous
10
14
  raise "Previous must be nil or a Releasetool::Version" unless version.is_a?(Releasetool::Version)
11
15
  end
@@ -18,10 +22,10 @@ module Releasetool
18
22
  commits = `git log #{@previous}..HEAD --pretty=format:"- %B"`
19
23
  notes = commits.gsub("\n\n", "\n")
20
24
  notes_file = "#{DIR}/#{@version}.md"
21
- if File.exists?(notes_file)
22
- puts "-"*80
25
+ if File.exist?(notes_file)
26
+ puts "-" * 80
23
27
  puts " File '#{notes_file}' already exists (appending)"
24
- puts "-"*80
28
+ puts "-" * 80
25
29
  File.open(notes_file, 'a') do |f|
26
30
  f.puts("\n\nAPPENDED:\n\n")
27
31
  f.puts(notes)
@@ -33,22 +37,20 @@ module Releasetool
33
37
  f.puts(notes)
34
38
  end
35
39
  puts "written to #{notes_file}"
36
- if edit
37
- system("open #{notes_file}")
38
- end
39
- end
40
- if File.exists?(VERSION_FILE)
41
- from_version = @previous.to_s_without_v
42
- to_version = @version.to_s_without_v
43
- guarded_system("cat #{VERSION_FILE} | sed s/#{from_version}/#{to_version.gsub('.', '\.')}/ > #{VERSION_FILE}.tmp")
44
- guarded_system("mv #{VERSION_FILE}.tmp #{VERSION_FILE}")
40
+ system("open #{notes_file}") if edit
45
41
  end
42
+ return unless File.exist?(Releasetool::Util.version_file)
43
+
44
+ from_version = @previous.to_s_without_v
45
+ to_version = @version.to_s_without_v
46
+ guarded_system("cat #{Releasetool::Util.version_file} | sed s/#{from_version}/#{to_version.gsub('.', '\.')}/ > #{Releasetool::Util.version_file}.tmp")
47
+ guarded_system("mv #{Releasetool::Util.version_file}.tmp #{Releasetool::Util.version_file}")
46
48
  end
47
49
 
48
50
  private
49
51
 
50
52
  def ensure_dir
51
- Dir.mkdir(DIR) unless File.exists?(DIR)
53
+ FileUtils.mkdir_p(DIR)
52
54
  end
53
55
 
54
56
  def headers
@@ -62,20 +64,17 @@ module Releasetool
62
64
  def ensured_template_file
63
65
  ensure_dir
64
66
  template_file = "#{DIR}/#{TEMPLATE_FILE}"
65
- create_template_file(template_file) unless File.exists?(template_file)
67
+ create_template_file(template_file) unless File.exist?(template_file)
66
68
  template_file
67
69
  end
68
70
 
69
71
  def create_template_file(template_file)
70
- File.open(template_file, "w") do |f|
71
- f.write <<~FILEEND
72
+ File.write(template_file, <<~FILEEND)
72
73
  $VERSION Release Notes
73
-
74
+
74
75
  *Changes since $PREVIOUS*
75
76
 
76
- FILEEND
77
- end
77
+ FILEEND
78
78
  end
79
-
80
79
  end
81
80
  end
@@ -1,13 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'English'
4
+ require "releasetool/configuration"
5
+
1
6
  module Releasetool
2
7
  module Util
3
-
4
8
  DIR = "release_notes"
5
- VERSION_FILE = ENV['RELEASETOOL_VERSION_FILE'] || "config/initializers/00-version.rb" #rails out of box
6
9
  TEMPLATE_FILE = "__TEMPLATE__.md" # relative to DIR
7
10
  RELEASE_MARKER_FILE = ".RELEASE_NEW_VERSION" # should be a config var
8
11
 
12
+ def self.version_file
13
+ # rails out of box
14
+ ENV['RELEASETOOL_VERSION_FILE'] || "config/initializers/00-version.rb"
15
+ end
16
+
9
17
  def stored_version
10
18
  fail Thor::Error.new("No stored version... did you forget to do release start?") unless File.exist?(RELEASE_MARKER_FILE)
19
+
11
20
  File.read(RELEASE_MARKER_FILE).strip
12
21
  end
13
22
 
@@ -19,5 +28,18 @@ module Releasetool
19
28
  puts command
20
29
  system(command) or raise Thor::Error.new("Couldn't '#{command}'")
21
30
  end
31
+
32
+ def guarded_capture(command)
33
+ puts command
34
+ output = `#{command}`
35
+ raise Thor::Error.new("Couldn't '#{command}'") unless $CHILD_STATUS
36
+
37
+ output
38
+ end
39
+
40
+ # @return [Releasetool::Configuration]
41
+ def config
42
+ @config ||= Releasetool::Configuration.new
43
+ end
22
44
  end
23
45
  end
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Releasetool
2
4
  class Version
3
5
  attr_reader :ident
6
+
4
7
  def initialize(ident)
5
8
  raise "Not a valid version identifier: #{ident.inspect}" unless ident.is_a?(String)
9
+
6
10
  @ident = ident
7
11
  end
8
12
 
@@ -43,9 +47,11 @@ module Releasetool
43
47
  end
44
48
 
45
49
  private
46
- def incremented(v)
47
- raise "Can't work out next version from #{self}" unless v.to_i.to_s == v
48
- v.to_i + 1
50
+
51
+ def incremented(number)
52
+ raise "Can't work out next version from #{self}" unless number.to_i.to_s == number
53
+
54
+ number.to_i + 1
49
55
  end
50
56
 
51
57
  def segments
data/lib/releasetool.rb CHANGED
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "releasetool/release"
2
4
 
3
5
  module Releasetool
4
- VERSION = "0.3.0"
6
+ VERSION = "0.5.0"
5
7
  end
@@ -1,11 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'thor'
4
+ require "releasetool"
2
5
  require "releasetool/release"
3
6
  require "releasetool/util"
4
7
  require "releasetool/version"
5
8
 
6
9
  class Release < Thor
7
-
8
10
  include Releasetool::Util
11
+ desc "init", <<-END
12
+ generate optional config directory and optional hooks file
13
+ END
14
+
15
+ def init
16
+ config.generate
17
+ end
18
+
19
+ # ========================
20
+
9
21
  desc "list", <<-END
10
22
  show a list of tags ordered by date (just a git listing).
11
23
  END
@@ -38,7 +50,7 @@ class Release < Thor
38
50
  # ========================
39
51
 
40
52
  method_option :since, type: :string, desc: "since commit_ref (or will use most recent tag)", required: false,
41
- aliases: 's'
53
+ aliases: 's'
42
54
  method_option :edit, type: :boolean, desc: "edit", required: false, aliases: 'e'
43
55
  method_option :minor, type: :boolean, desc: "minor version", required: false, default: false
44
56
 
@@ -46,15 +58,13 @@ class Release < Thor
46
58
  Start a release by doing a prepare, and storing the target release in #{RELEASE_MARKER_FILE}.
47
59
  END
48
60
 
49
- def start(specified_version=nil)
50
- if File.exists?(RELEASE_MARKER_FILE)
51
- raise Thor::Error.new("Can't start when already started on a version. release abort or release finish")
52
- end
53
- version = next_version(specified_version)
54
- File.open(RELEASE_MARKER_FILE, 'w') do |f|
55
- f.write(version)
56
- end
61
+ def start(specified_version = nil)
62
+ raise Thor::Error.new("Can't start when already started on a version. release abort or release finish") if File.exist?(RELEASE_MARKER_FILE)
63
+
64
+ version = specified_version ? Releasetool::Version.new(specified_version) : next_version
65
+ File.write(RELEASE_MARKER_FILE, version)
57
66
  Releasetool::Release.new(version, previous: previous_version).prepare(edit: options[:edit])
67
+ config.after_start_hook(version)
58
68
  end
59
69
 
60
70
  DEFAULT_COMMIT_MESSAGE = 'preparing for release [CI SKIP]'
@@ -63,11 +73,14 @@ class Release < Thor
63
73
  If no version given, it will use the version stored by release start
64
74
  END
65
75
 
66
- def commit(version=nil)
76
+ # should take release commit --edit which allows you to edit, or --no-edit (default) which allows you to just skip
77
+ method_option :edit, type: :boolean, desc: "edit", aliases: 'e', default: false
78
+ def commit(version = nil)
67
79
  version ||= stored_version
68
80
  guarded_system("git add #{DIR}")
69
- guarded_system("git add #{VERSION_FILE}") if File.exists?(VERSION_FILE)
70
- guarded_system("git commit #{DIR} #{File.exists?(VERSION_FILE) ? VERSION_FILE : ''} -e -m\"#{DEFAULT_COMMIT_MESSAGE}\"")
81
+ guarded_system("git add #{Releasetool::Util.version_file}") if File.exist?(Releasetool::Util.version_file)
82
+ guarded_system("git commit #{DIR} #{File.exist?(Releasetool::Util.version_file) ? Releasetool::Util.version_file : ''} #{options[:edit] ? '-e' : nil} -m\"#{DEFAULT_COMMIT_MESSAGE}\"")
83
+ config.after_commit_hook(version)
71
84
  end
72
85
 
73
86
  desc "tag (NEW_VERSION)", <<-END
@@ -75,9 +88,10 @@ class Release < Thor
75
88
  If no version given, it will use the version stored by release start
76
89
  END
77
90
 
78
- def tag(version=nil)
91
+ def tag(version = nil)
79
92
  version ||= stored_version
80
- guarded_system("git tag -a #{version}")
93
+ last_useful_commit = guarded_capture("git log head^^..head^ --pretty=format:%s").strip.split("\n").first.strip
94
+ guarded_system("git tag -a #{version} -e -m \"#{last_useful_commit}\"")
81
95
  end
82
96
 
83
97
  desc "push (NEW_VERSION)", <<-END
@@ -85,7 +99,7 @@ class Release < Thor
85
99
  If no version given, it will use the version stored by release start.
86
100
  END
87
101
 
88
- def push(version=nil)
102
+ def push(version = nil)
89
103
  version ||= stored_version
90
104
  guarded_system("git push")
91
105
  guarded_system("git push origin #{version}")
@@ -100,10 +114,16 @@ class Release < Thor
100
114
  remove_stored_version
101
115
  end
102
116
 
117
+ map %w[--version -v] => :__print_version
118
+
119
+ desc "--version, -v", "print the version"
120
+ def __print_version
121
+ say "Releasetool v#{Releasetool::VERSION}"
122
+ end
123
+
103
124
  protected
104
125
 
105
- def next_version(specified)
106
- return Releasetool::Version.new(specified) if specified
126
+ def next_version
107
127
  if options[:major]
108
128
  previous_version.next_major
109
129
  elsif options[:minor]
@@ -0,0 +1,7 @@
1
+ v0.4.0 Release Notes
2
+
3
+ *Changes since v0.3.0*
4
+
5
+ * `release commit` now doesn't require you to edit message by default. If you want to edit use `release commit --edit`
6
+ * `release tag` now gives you the previous log message as the default tag message (useful in case of release a single-issue/commit)
7
+ * `release --version` to print version
@@ -0,0 +1,5 @@
1
+ v0.5.0 Release Notes
2
+
3
+ *Changes since v0.4.0*
4
+
5
+ - allow local configuration of after_start and after_commit (#12)
data/releasetool.gemspec CHANGED
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'releasetool'
5
6
 
@@ -15,12 +16,14 @@ Gem::Specification.new do |spec|
15
16
 
16
17
  spec.files = `git ls-files`.split($/)
17
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
+ spec.required_ruby_version = '>= 2.7.0'
20
21
 
21
22
  spec.add_dependency 'thor', '>= 0.18'
22
23
 
23
24
  spec.add_development_dependency "bundler", "~> 2.1"
24
25
  spec.add_development_dependency "rake"
25
26
  spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "rubocop", "1.56.3"
28
+ spec.metadata['rubygems_mfa_required'] = 'true'
26
29
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ # deliberately empty
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "releasetool/util"
4
+ require "releasetool/base_hooks"
5
+
6
+ module Releasetool
7
+ class Hooks < Releasetool::BaseHooks
8
+ include Releasetool::Util
9
+
10
+ def after_start(version)
11
+ puts "after_start(#{version}) has been called"
12
+ end
13
+
14
+ def after_commit(version)
15
+ puts "after_commit(#{version}) has been called"
16
+ end
17
+ end
18
+ end
@@ -1,40 +1,46 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'fileutils'
3
- require File.expand_path('../../lib/tasks/release_thor', __FILE__)
5
+ require File.expand_path('../lib/tasks/release_thor', __dir__)
4
6
 
5
- describe Releasetool do
7
+ RSpec.describe Releasetool do
6
8
  it 'should have a version number' do
7
9
  expect(Releasetool::VERSION).not_to be_nil
8
10
  end
9
11
  end
10
12
 
11
- describe Release, quietly: true do
13
+ RSpec.describe Release, quietly: false do
12
14
  subject { Release.new }
13
- TMPDIR = File.expand_path('../../tmp/testing', __FILE__)
14
- ROOT_DIR = File.expand_path('../..', __FILE__)
15
+
16
+ let(:tmpdir) { File.expand_path('../tmp/testing', __dir__) }
17
+ let(:root_dir) { File.expand_path('..', __dir__) }
18
+ let(:hooks_example_rb) { File.expand_path('./fixtures/hooks_example.rb', __dir__) }
19
+ let(:empty_file) { File.expand_path('./fixtures/empty_file.rb', __dir__) }
15
20
  before {
16
- FileUtils.rmtree(TMPDIR)
17
- FileUtils.mkdir_p(TMPDIR)
18
- FileUtils.chdir(TMPDIR)
21
+ Releasetool.send(:remove_const, :Hooks) if defined?(Releasetool::Hooks)
22
+ FileUtils.rmtree(tmpdir)
23
+ FileUtils.mkdir_p(tmpdir)
24
+ FileUtils.chdir(tmpdir)
19
25
  system('tar -xf ../../spec/fixtures/example_with_releases.tar')
20
26
  }
21
27
  after {
22
- FileUtils.chdir(ROOT_DIR)
28
+ FileUtils.chdir(root_dir)
23
29
  }
24
30
  it "should respond to list" do
25
31
  subject.list
26
32
  end
27
33
 
28
- let(:mock_target){ instance_double(Releasetool::Release)}
29
- let(:v_0_0_1) {Releasetool::Version.new("v0.0.1")}
30
- let(:v_0_0_2) {Releasetool::Version.new("v0.0.2")}
31
- let(:v_0_0_3) {Releasetool::Version.new("v0.0.3")}
32
- let(:v_0_1_0) {Releasetool::Version.new("v0.1.0")}
33
- let(:v_1_0_0) {Releasetool::Version.new("v1.0.0")}
34
+ let(:mock_target) { instance_double(Releasetool::Release) }
35
+ let(:v_0_0_1) { Releasetool::Version.new("v0.0.1") }
36
+ let(:v_0_0_2) { Releasetool::Version.new("v0.0.2") }
37
+ let(:v_0_0_3) { Releasetool::Version.new("v0.0.3") }
38
+ let(:v_0_1_0) { Releasetool::Version.new("v0.1.0") }
39
+ let(:v_1_0_0) { Releasetool::Version.new("v1.0.0") }
34
40
 
35
- context "start" do
41
+ describe "start" do
36
42
  context "with a since" do
37
- subject { Release.new([], {since: 'v0.0.2'}, {}) }
43
+ subject { Release.new([], { since: 'v0.0.2' }, {}) }
38
44
  it "it should do a prepare and store a file" do
39
45
  expect(Releasetool::Release).to receive(:new).with(v_0_0_3, previous: v_0_0_2).and_return(mock_target)
40
46
  expect(mock_target).to receive(:prepare)
@@ -44,14 +50,14 @@ describe Release, quietly: true do
44
50
  allow(Releasetool::Release).to receive(:new).with(v_0_0_3, previous: v_0_0_2).and_return(mock_target)
45
51
  allow(mock_target).to receive(:prepare)
46
52
  expect { subject.start('v0.0.3') }.to change {
47
- File.exist?(File.join(TMPDIR, '.RELEASE_NEW_VERSION'))
48
- }
49
- expect(File.read(File.join(TMPDIR, '.RELEASE_NEW_VERSION')).to_s).to eq('v0.0.3')
53
+ File.exist?(File.join(tmpdir, '.RELEASE_NEW_VERSION'))
54
+ }
55
+ expect(File.read(File.join(tmpdir, '.RELEASE_NEW_VERSION')).to_s).to eq('v0.0.3')
50
56
  end
51
57
 
52
58
  it "with existing release-version file, it should freak out" do
53
- FileUtils.touch(File.join(TMPDIR, '.RELEASE_NEW_VERSION'))
54
- expect { subject.start('v0.0.3') }.to raise_error
59
+ FileUtils.touch(File.join(tmpdir, '.RELEASE_NEW_VERSION'))
60
+ expect { subject.start('v0.0.3') }.to raise_error(/Can't start when already started on a version/)
55
61
  end
56
62
  end
57
63
 
@@ -72,7 +78,7 @@ describe Release, quietly: true do
72
78
  end
73
79
 
74
80
  context "without a new version but with --minor modifier" do
75
- subject { Release.new([], {minor: true}, {}) }
81
+ subject { Release.new([], { minor: true }, {}) }
76
82
 
77
83
  it "it should use next minor level" do
78
84
  expect(Releasetool::Release).to receive(:new).with(v_0_1_0, previous: v_0_0_1).and_return(mock_target)
@@ -82,7 +88,7 @@ describe Release, quietly: true do
82
88
  end
83
89
 
84
90
  context "without a new version but with --major modifier" do
85
- subject { Release.new([], {major: true}, {}) }
91
+ subject { Release.new([], { major: true }, {}) }
86
92
 
87
93
  it "it should use next minor level" do
88
94
  expect(Releasetool::Release).to receive(:new).with(v_1_0_0, previous: v_0_0_1).and_return(mock_target)
@@ -90,11 +96,89 @@ describe Release, quietly: true do
90
96
  subject.start
91
97
  end
92
98
  end
99
+
100
+ context "with config and..." do
101
+ context "with empty hooks" do
102
+ before do
103
+ FileUtils.mkdir_p("#{tmpdir}/config/releasetool")
104
+ FileUtils.cp(empty_file, "#{tmpdir}/config/releasetool/hooks.rb")
105
+ end
106
+ it "should still work" do
107
+ expect(Releasetool::Release).to receive(:new).with(v_0_0_2, previous: v_0_0_1).and_return(mock_target)
108
+ expect(mock_target).to receive(:prepare)
109
+ expected = "after_start(v0.0.2) has been called"
110
+ expect { subject.start }.not_to output(/#{Regexp.escape(expected)}/).to_stdout
111
+ end
112
+ end
113
+ context "with hook" do
114
+ before do
115
+ FileUtils.mkdir_p("#{tmpdir}/config/releasetool")
116
+ FileUtils.cp(hooks_example_rb, "#{tmpdir}/config/releasetool/hooks.rb")
117
+ end
118
+ it "should output hook" do
119
+ expected = "after_start(v0.0.2) has been called"
120
+ expect { subject.start }.to output(/#{Regexp.escape(expected)}/).to_stdout
121
+ end
122
+ end
123
+ end
124
+ end
125
+
126
+ describe "commit" do
127
+ before {
128
+ allow(ENV).to receive(:[]).with('RELEASETOOL_VERSION_FILE').and_return(nil) # in case it is defined...
129
+ expect(subject).to receive(:guarded_system).with("git add release_notes")
130
+ expect(subject).to receive(:guarded_system).with("git add config/initializers/00-version.rb")
131
+ }
132
+ context "with no args" do
133
+ it "outputs without -e" do
134
+ expect(subject).to receive(:guarded_system).with("git commit release_notes config/initializers/00-version.rb -m\"#{Release::DEFAULT_COMMIT_MESSAGE}\"")
135
+ subject.commit('v0.0.3')
136
+ end
137
+ end
138
+
139
+ context "with --edit" do
140
+ subject { Release.new([], { edit: true }, {}) }
141
+ it "outputs with e" do
142
+ expect(subject).to receive(:guarded_system).with("git commit release_notes config/initializers/00-version.rb -e -m\"#{Release::DEFAULT_COMMIT_MESSAGE}\"")
143
+ subject.commit('v0.0.3')
144
+ end
145
+ end
146
+
147
+ context "with generated config and hook" do
148
+ it "should generate and still work" do
149
+ subject.init
150
+ expected = "after_commit(v0.0.3) has been called"
151
+ expect(subject).to receive(:guarded_system).with("git commit release_notes config/initializers/00-version.rb -m\"#{Release::DEFAULT_COMMIT_MESSAGE}\"")
152
+ expect { subject.commit('v0.0.3') }.not_to output(/#{Regexp.escape(expected)}/).to_stdout
153
+ end
154
+ end
155
+
156
+ context "with config and hook" do
157
+ before do
158
+ FileUtils.mkdir_p("#{tmpdir}/config/releasetool")
159
+ FileUtils.cp(hooks_example_rb, "#{tmpdir}/config/releasetool/hooks.rb")
160
+ end
161
+ it "should output hook" do
162
+ expect(subject).to receive(:guarded_system).with("git commit release_notes config/initializers/00-version.rb -m\"#{Release::DEFAULT_COMMIT_MESSAGE}\"")
163
+ expected = "after_commit(v0.0.3) has been called"
164
+ expect { subject.commit('v0.0.3') }.to output(/#{Regexp.escape(expected)}/).to_stdout
165
+ end
166
+ end
167
+ end
168
+
169
+ describe "init" do
170
+ it "should generate " do
171
+ expect(Dir.exist?("#{tmpdir}/config/releasetool")).to be_falsey
172
+ expect(File.exist?("#{tmpdir}/config/releasetool/hooks.rb")).to be_falsey
173
+ subject.init
174
+ expect(Dir.exist?("#{tmpdir}/config/releasetool")).to be_truthy
175
+ expect(File.exist?("#{tmpdir}/config/releasetool/hooks.rb")).to be_truthy
176
+ end
93
177
  end
94
178
 
95
179
  describe "latest" do
96
180
  it "outputs latest version" do
97
- expect{subject.latest}.to output("v0.0.1\n").to_stdout
181
+ expect { subject.latest }.to output("v0.0.1\n").to_stdout
98
182
  end
99
183
  end
100
184
 
@@ -110,7 +194,6 @@ describe Release, quietly: true do
110
194
  end
111
195
  end
112
196
 
113
-
114
197
  # describe 'CLI' do
115
198
  # it "should work with source and no target" do
116
199
  # puts "CLI"
@@ -137,5 +220,4 @@ describe Release, quietly: true do
137
220
  # }.strip).not_to eq('')
138
221
  # end
139
222
  # end
140
-
141
223
  end
data/spec/spec_helper.rb CHANGED
@@ -1,17 +1,17 @@
1
- $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
2
4
  require 'releasetool'
3
5
 
4
6
  RSpec.configure do |config|
5
7
  config.around quietly: true do |example|
6
- RSpec.configure do |config|
7
- original_stderr = $stderr
8
- original_stdout = $stdout
9
- # Redirect stderr and stdout
10
- $stderr = File.open(File::NULL, "w")
11
- $stdout = File.open(File::NULL, "w")
12
- example.run
13
- $stderr = original_stderr
14
- $stdout = original_stdout
15
- end
8
+ original_stderr = $stderr
9
+ original_stdout = $stdout
10
+ # Redirect stderr and stdout
11
+ $stderr = File.open(File::NULL, "w")
12
+ $stdout = File.open(File::NULL, "w")
13
+ example.run
14
+ $stderr = original_stderr
15
+ $stdout = original_stdout
16
16
  end
17
17
  end
data/spec/version_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  require "releasetool/version"
@@ -21,9 +23,9 @@ describe Releasetool::Version do
21
23
  end
22
24
 
23
25
  describe "next_patch" do
24
- let(:v_0_0_1) {Releasetool::Version.new("v0.0.1")}
25
- let(:v_0_0_2) {Releasetool::Version.new("v0.0.2")}
26
- let(:v_0_0_3) {Releasetool::Version.new("v0.0.3")}
26
+ let(:v_0_0_1) { Releasetool::Version.new("v0.0.1") }
27
+ let(:v_0_0_2) { Releasetool::Version.new("v0.0.2") }
28
+ let(:v_0_0_3) { Releasetool::Version.new("v0.0.3") }
27
29
 
28
30
  it "is next" do
29
31
  expect(v_0_0_1.next_patch).to eq(v_0_0_2)
@@ -34,9 +36,9 @@ describe Releasetool::Version do
34
36
  end
35
37
 
36
38
  describe "next_minor" do
37
- let(:v_0_0_1) {Releasetool::Version.new("v0.0.1")}
38
- let(:v_0_1_0) {Releasetool::Version.new("v0.1.0")}
39
- let(:v_0_2_0) {Releasetool::Version.new("v0.2.0")}
39
+ let(:v_0_0_1) { Releasetool::Version.new("v0.0.1") }
40
+ let(:v_0_1_0) { Releasetool::Version.new("v0.1.0") }
41
+ let(:v_0_2_0) { Releasetool::Version.new("v0.2.0") }
40
42
 
41
43
  it "is next" do
42
44
  expect(v_0_0_1.next_minor).to eq(v_0_1_0)
@@ -47,9 +49,9 @@ describe Releasetool::Version do
47
49
  end
48
50
 
49
51
  describe "next_major" do
50
- let(:v_0_1_1) {Releasetool::Version.new("v0.1.1")}
51
- let(:v_1_0_0) {Releasetool::Version.new("v1.0.0")}
52
- let(:v_2_0_0) {Releasetool::Version.new("v2.0.0")}
52
+ let(:v_0_1_1) { Releasetool::Version.new("v0.1.1") }
53
+ let(:v_1_0_0) { Releasetool::Version.new("v1.0.0") }
54
+ let(:v_2_0_0) { Releasetool::Version.new("v2.0.0") }
53
55
 
54
56
  it "is next" do
55
57
  expect(v_0_1_1.next_major).to eq(v_1_0_0)
@@ -60,11 +62,8 @@ describe Releasetool::Version do
60
62
  end
61
63
 
62
64
  describe "==" do
63
- let(:v_0_0_2) {Releasetool::Version.new("v0.0.2")}
65
+ let(:v_0_0_2) { Releasetool::Version.new("v0.0.2") }
64
66
 
65
- it "is self same" do
66
- expect(v_0_0_2 == v_0_0_2).to be_truthy
67
- end
68
67
  it "is same if other is a version of same" do
69
68
  expect(v_0_0_2 == Releasetool::Version.new("v0.0.2")).to be_truthy
70
69
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: releasetool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Diggins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-26 00:00:00.000000000 Z
11
+ date: 2023-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.56.3
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.56.3
69
83
  description: Some release-related functions, initially just release notes management
70
84
  and creation
71
85
  email:
@@ -76,12 +90,16 @@ extensions: []
76
90
  extra_rdoc_files: []
77
91
  files:
78
92
  - ".gitignore"
93
+ - ".rubocop.yml"
94
+ - ".rubocop_todo.yml"
79
95
  - Gemfile
80
96
  - LICENSE.txt
81
97
  - README.md
82
98
  - Rakefile
83
99
  - bin/release
84
100
  - lib/releasetool.rb
101
+ - lib/releasetool/base_hooks.rb
102
+ - lib/releasetool/configuration.rb
85
103
  - lib/releasetool/release.rb
86
104
  - lib/releasetool/util.rb
87
105
  - lib/releasetool/version.rb
@@ -94,15 +112,20 @@ files:
94
112
  - release_notes/v0.1.1.md
95
113
  - release_notes/v0.2.0.md
96
114
  - release_notes/v0.3.0.md
115
+ - release_notes/v0.4.0.md
116
+ - release_notes/v0.5.0.md
97
117
  - releasetool.gemspec
118
+ - spec/fixtures/empty_file.rb
98
119
  - spec/fixtures/example_with_releases.tar
120
+ - spec/fixtures/hooks_example.rb
99
121
  - spec/releasetool_spec.rb
100
122
  - spec/spec_helper.rb
101
123
  - spec/version_spec.rb
102
124
  homepage: ''
103
125
  licenses:
104
126
  - MIT
105
- metadata: {}
127
+ metadata:
128
+ rubygems_mfa_required: 'true'
106
129
  post_install_message:
107
130
  rdoc_options: []
108
131
  require_paths:
@@ -111,19 +134,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
134
  requirements:
112
135
  - - ">="
113
136
  - !ruby/object:Gem::Version
114
- version: '0'
137
+ version: 2.7.0
115
138
  required_rubygems_version: !ruby/object:Gem::Requirement
116
139
  requirements:
117
140
  - - ">="
118
141
  - !ruby/object:Gem::Version
119
142
  version: '0'
120
143
  requirements: []
121
- rubygems_version: 3.2.5
144
+ rubygems_version: 3.2.33
122
145
  signing_key:
123
146
  specification_version: 4
124
147
  summary: Release management tools
125
- test_files:
126
- - spec/fixtures/example_with_releases.tar
127
- - spec/releasetool_spec.rb
128
- - spec/spec_helper.rb
129
- - spec/version_spec.rb
148
+ test_files: []