gem_toys 0.4.0 → 0.5.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
  SHA256:
3
- metadata.gz: 6726b77757e83675406164f809d24df97db7c6f62ccc868fb3bf36cc10345c05
4
- data.tar.gz: 3fa707cd47180bcb0783cfa4442aff662874cccdd5450287f33551b5de67c66a
3
+ metadata.gz: 48cef709e2407ff05f6d4b10a262ef20bd399f14aed89ec446f5a57790d86460
4
+ data.tar.gz: 2a1386e9f03dd8d818e2dd7e6ec402d502424a913f2f86e251af6a9a0f3bf151
5
5
  SHA512:
6
- metadata.gz: ac8fbbde1b554d7cff6d8b05003f2529a140d89269ec43412817d4ddfc0dfa8b104ad85378ebad470207fbe9c8cae1cfc7ff7dc984c484ffad2955156139105d
7
- data.tar.gz: 80708ae0701092648c7caa9f489a3477b88047ab1f5d970299e0ef8e376812b114d77656c55438b46ed863b5c376be01faf7bf1ebee90b8f158f3887abd20eda
6
+ metadata.gz: b4113d09e6f299ccc60c2880b3aeece288b9c018c9a41d3f805d080480017c56ddbeb7e5a1c85b9c0a8533b2a19dc62b2ea892a5b10d2d0917505624ba4ad573
7
+ data.tar.gz: bfcf1cd7c55c5aab00d9831f7f6ba587a588d4082af9a36d4e4d82191418a09e2f3bcfeaacf1c777c6699599a1cd052bc333648f98dd0a1f660d83cd82dd8121
@@ -2,8 +2,23 @@
2
2
 
3
3
  ## master (unreleased)
4
4
 
5
+ ## 0.5.0 (2020-11-29)
6
+
7
+ * Add `versions` tool with `releases` alias.
8
+ * Add `version` tool.
9
+ * Add an ability to release new `major`, `minor` or `patch` version.
10
+ Just specify keyword instead of number and it'll increase correctly.
11
+ * Print `git diff` for files which will be commited on `release`.
12
+ * Drop Ruby 2.4 support.
13
+ [Support of Ruby 2.4 has ended](https://www.ruby-lang.org/en/news/2020/04/05/support-of-ruby-2-4-has-ended/).
14
+ * Add and use `memery` dependency.
15
+ * Update `rubocop`, `remark`.
16
+
5
17
  ## 0.4.0 (2020-09-21)
6
18
 
19
+ * Improve version update script, support files with other String constants.
20
+ * Update bundle.
21
+
7
22
  ## 0.3.0 (2020-07-11)
8
23
 
9
24
  * Add support for Ruby 2.4
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'date'
4
3
  require 'toys-core'
5
4
 
6
5
  require_relative 'template/common_code'
@@ -46,97 +45,26 @@ module GemToys
46
45
  end
47
46
  end
48
47
 
49
- tool :release do
50
- required_arg :version
51
-
48
+ tool :version do
52
49
  to_run do
53
50
  @template = template
54
51
 
55
- @today = Date.today.to_s
56
-
57
- update_version_file
58
-
59
- ## Update CHANGELOG
60
- update_changelog_file
61
-
62
- ## Build new gem file
63
- exec_tool 'gem build'
64
-
65
- wait_for_manual_check
66
-
67
- ## Checkout to a new git branch, required for protected `master` with CI
68
- # sh "git switch -c v#{version}"
69
-
70
- commit_changes
71
-
72
- ## Tag commit
73
- puts 'Tagging the commit...'
74
- sh "git tag -a v#{version} -m 'Version #{version}'"
75
-
76
- ## Push commit
77
- puts 'Pushing commit...'
78
- sh 'git push'
79
-
80
- ## Push tags
81
- puts 'Pushing tags...'
82
- sh 'git push --tags'
83
-
84
- puts 'Pushing gem...'
85
- sh "gem push #{current_gem_file}"
86
- end
87
-
88
- private
89
-
90
- def update_version_file
91
- puts 'Updating version file...'
92
-
93
- File.write(
94
- version_file_path,
95
- version_file_content.sub(/(VERSION = )'.+'/, "\\1'#{version}'")
96
- )
97
- end
98
-
99
- def update_changelog_file
100
- puts 'Updating changelog file...'
101
-
102
- @changelog_lines = File.readlines(changelog_file_path)
103
-
104
- existing_line = find_version_line_in_changelog_file
105
-
106
- if existing_line
107
- return if (existing_date = existing_line.match(/\((.*)\)/)[1]) == @today
108
-
109
- abort "There is already #{version} version with date #{existing_date}"
52
+ version = rubygems_versions.find(-> { current_version_hash }) do |rubygems_version|
53
+ rubygems_version[:number] == current_version
110
54
  end
111
55
 
112
- File.write changelog_file_path, new_changelog_content
113
- end
114
-
115
- def find_version_line_in_changelog_file
116
- @changelog_lines.find { |line| line.start_with? "## #{version} " }
56
+ puts_versions [version]
117
57
  end
58
+ end
118
59
 
119
- def new_changelog_content
120
- unreleased_title = @template.unreleased_title
121
- @changelog_lines.insert(
122
- @changelog_lines.index("#{unreleased_title}\n") + 2,
123
- '#' * unreleased_title.scan(/^#+/).first.size + " #{version} (#{@today})\n\n"
124
- ).join
125
- end
126
-
127
- def commit_changes
128
- puts 'Committing changes...'
129
-
130
- sh "git add #{version_file_path} #{changelog_file_path}"
131
-
132
- sh "git commit -m 'Update version to #{version}'"
133
- end
60
+ require_relative 'template/versions'
61
+ expand Template::Versions,
62
+ version_file_path: template.version_file_path
134
63
 
135
- def wait_for_manual_check
136
- $stdout.puts 'Please, validate files and commits before pushing.'
137
- $stdin.gets
138
- end
139
- end
64
+ require_relative 'template/release'
65
+ expand Template::Release,
66
+ version_file_path: template.version_file_path,
67
+ unreleased_title: template.unreleased_title
140
68
  end
141
69
  end
142
70
  end
@@ -1,19 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'memery'
4
+
3
5
  module GemToys
4
6
  ## Template with gem tools, should be expanded in toys file
5
7
  class Template
6
8
  ## Module for common code between nested tools
7
9
  module CommonCode
10
+ include Memery
11
+
8
12
  private
9
13
 
10
- def project_name
11
- @project_name ||= File.basename context_directory
14
+ memoize def project_name
15
+ File.basename context_directory
12
16
  end
13
17
 
14
- def version_file_path
15
- @version_file_path ||=
16
- @template.version_file_path ||
18
+ memoize def version_file_path
19
+ @template.version_file_path ||
17
20
  begin
18
21
  project_path = project_name.tr '-', '/'
19
22
  File.join context_directory, 'lib', project_path, 'version.rb'
@@ -24,25 +27,58 @@ module GemToys
24
27
  File.read version_file_path
25
28
  end
26
29
 
27
- def current_version
28
- @current_version ||= version_file_content.match(/VERSION = '(.+)'/)[1]
30
+ memoize def current_version
31
+ version_file_content.match(/VERSION = '(.+)'/)[1]
29
32
  end
30
33
 
31
- def changelog_file_path
32
- @changelog_file_path ||= File.join context_directory, 'CHANGELOG.md'
34
+ memoize def changelog_file_path
35
+ File.join context_directory, 'CHANGELOG.md'
33
36
  end
34
37
 
35
- def gem_file_name
36
- @gem_file_name ||= "#{project_name}-#{current_version}.gem"
38
+ memoize def gem_file_name
39
+ "#{project_name}-#{current_version}.gem"
37
40
  end
38
41
 
39
- def pkg_directory
40
- @pkg_directory ||= "#{context_directory}/pkg"
42
+ memoize def pkg_directory
43
+ "#{context_directory}/pkg"
41
44
  end
42
45
 
43
46
  def current_gem_file
44
47
  "#{pkg_directory}/#{gem_file_name}"
45
48
  end
49
+
50
+ memoize def rubygems_connection
51
+ require 'faraday'
52
+ require 'faraday_middleware'
53
+
54
+ Faraday.new 'https://rubygems.org/api/v1' do |conn|
55
+ conn.response :json, parser_options: { symbolize_names: true }
56
+ end
57
+ end
58
+
59
+ memoize def rubygems_versions
60
+ rubygems_connection.get("versions/#{project_name}.json").body
61
+ end
62
+
63
+ def current_version_hash
64
+ { number: current_version, created_at: 'unreleased' }
65
+ end
66
+
67
+ def puts_versions(versions)
68
+ require 'date'
69
+
70
+ longest_version_number = versions.map { |version| version[:number].length }.max
71
+
72
+ versions.each do |version|
73
+ created_at = begin
74
+ DateTime.parse(version[:created_at]).strftime('%b %e %Y %R')
75
+ rescue Date::Error
76
+ version[:created_at]
77
+ end
78
+
79
+ puts "#{version[:number].ljust(longest_version_number)} (#{created_at})"
80
+ end
81
+ end
46
82
  end
47
83
  end
48
84
  end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemToys
4
+ class Template
5
+ ## Template with gem release tool, expanding internally
6
+ class Release
7
+ include Toys::Template
8
+
9
+ attr_reader :version_file_path, :unreleased_title
10
+
11
+ def initialize(version_file_path:, unreleased_title:)
12
+ @version_file_path = version_file_path
13
+ @unreleased_title = unreleased_title
14
+ end
15
+
16
+ on_expand do |template|
17
+ tool :release do
18
+ required_arg :new_version
19
+
20
+ to_run do
21
+ require 'date'
22
+
23
+ @template = template
24
+
25
+ @today = Date.today.to_s
26
+
27
+ handle_new_version
28
+
29
+ update_version_file
30
+
31
+ ## Update CHANGELOG
32
+ update_changelog_file
33
+
34
+ ## Build new gem file
35
+ exec_tool 'gem build'
36
+
37
+ wait_for_manual_check
38
+
39
+ ## Checkout to a new git branch, required for protected `master` with CI
40
+ # sh "git switch -c v#{@new_version}"
41
+
42
+ commit_changes
43
+
44
+ ## Tag commit
45
+ puts 'Tagging the commit...'
46
+ sh "git tag -a v#{@new_version} -m 'Version #{@new_version}'"
47
+
48
+ ## Push commit
49
+ puts 'Pushing commit...'
50
+ sh 'git push'
51
+
52
+ ## Push tags
53
+ puts 'Pushing tags...'
54
+ sh 'git push --tags'
55
+
56
+ puts 'Pushing gem...'
57
+ sh "gem push #{current_gem_file}"
58
+ end
59
+
60
+ private
61
+
62
+ self::VERSION_TYPES = %w[
63
+ major
64
+ minor
65
+ patch
66
+ ].freeze
67
+
68
+ def handle_new_version
69
+ ## https://github.com/dazuma/toys/issues/103
70
+ @new_version =
71
+ if (version_index = self.class::VERSION_TYPES.index(new_version))
72
+ current_version_parts =
73
+ current_version.split('.')[0..(self.class::VERSION_TYPES.count - 1)]
74
+ handle_keyword_in_new_version current_version_parts, version_index
75
+ else
76
+ new_version
77
+ end
78
+
79
+ clear_memery_cache! :current_version
80
+ end
81
+
82
+ def handle_keyword_in_new_version(current_version_parts, version_index)
83
+ current_version_parts.map.with_index do |version_part, index|
84
+ if index < version_index
85
+ version_part
86
+ elsif index == version_index
87
+ Integer(version_part) + 1
88
+ else
89
+ 0
90
+ end
91
+ end.join('.')
92
+ end
93
+
94
+ def update_version_file
95
+ puts 'Updating version file...'
96
+
97
+ File.write(
98
+ version_file_path,
99
+ version_file_content.sub(/(VERSION = )'.+'/, "\\1'#{@new_version}'")
100
+ )
101
+ end
102
+
103
+ def update_changelog_file
104
+ puts 'Updating changelog file...'
105
+
106
+ @changelog_lines = File.readlines(changelog_file_path)
107
+
108
+ existing_line = @changelog_lines.find { |line| line.start_with? "## #{@new_version} " }
109
+
110
+ if existing_line
111
+ return if (existing_date = existing_line.match(/\((.*)\)/)[1]) == @today
112
+
113
+ abort "There is already #{version} version with date #{existing_date}"
114
+ end
115
+
116
+ File.write changelog_file_path, new_changelog_content
117
+ end
118
+
119
+ def new_changelog_content
120
+ unreleased_title = @template.unreleased_title
121
+ @changelog_lines.insert(
122
+ @changelog_lines.index("#{unreleased_title}\n") + 2,
123
+ '#' * unreleased_title.scan(/^#+/).first.size + " #{@new_version} (#{@today})\n\n"
124
+ ).join
125
+ end
126
+
127
+ def commit_changes
128
+ puts 'Committing changes...'
129
+
130
+ sh "git add #{version_file_path} #{changelog_file_path}"
131
+
132
+ sh "git commit -m 'Update version to #{@new_version}'"
133
+ end
134
+
135
+ def wait_for_manual_check
136
+ $stdout.puts
137
+ sh "git diff #{version_file_path} #{changelog_file_path}"
138
+ $stdout.puts
139
+ $stdout.puts 'Please, validate files before committing and pushing!'
140
+ $stdout.puts 'Press anything to continue, Ctrl+C to cancel.'
141
+ $stdin.gets
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemToys
4
+ class Template
5
+ ## Template with gem versions tool, expanding internally
6
+ class Versions
7
+ include Toys::Template
8
+
9
+ attr_reader :version_file_path
10
+
11
+ def initialize(version_file_path:)
12
+ @version_file_path = version_file_path
13
+ end
14
+
15
+ on_expand do |template|
16
+ tool :versions do
17
+ to_run do
18
+ @template = template
19
+
20
+ versions = rubygems_versions
21
+
22
+ versions.unshift current_version_hash if current_version != versions.first[:number]
23
+
24
+ puts_versions versions
25
+ end
26
+ end
27
+ alias_tool :releases, :versions
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GemToys
4
- VERSION = '0.4.0'
4
+ VERSION = '0.5.0'
5
5
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gem_toys
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Popov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-20 00:00:00.000000000 Z
11
+ date: 2020-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: alt_memery
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday_middleware
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: pry-byebug
15
57
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +142,14 @@ dependencies:
100
142
  requirements:
101
143
  - - "~>"
102
144
  - !ruby/object:Gem::Version
103
- version: 0.91.0
145
+ version: '1.2'
104
146
  type: :development
105
147
  prerelease: false
106
148
  version_requirements: !ruby/object:Gem::Requirement
107
149
  requirements:
108
150
  - - "~>"
109
151
  - !ruby/object:Gem::Version
110
- version: 0.91.0
152
+ version: '1.2'
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: rubocop-performance
113
155
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +170,14 @@ dependencies:
128
170
  requirements:
129
171
  - - "~>"
130
172
  - !ruby/object:Gem::Version
131
- version: '1.0'
173
+ version: '2.0'
132
174
  type: :development
133
175
  prerelease: false
134
176
  version_requirements: !ruby/object:Gem::Requirement
135
177
  requirements:
136
178
  - - "~>"
137
179
  - !ruby/object:Gem::Version
138
- version: '1.0'
180
+ version: '2.0'
139
181
  description: 'Toys template for gems, like building, releasing, etc.
140
182
 
141
183
  '
@@ -151,6 +193,8 @@ files:
151
193
  - lib/gem_toys.rb
152
194
  - lib/gem_toys/template.rb
153
195
  - lib/gem_toys/template/common_code.rb
196
+ - lib/gem_toys/template/release.rb
197
+ - lib/gem_toys/template/versions.rb
154
198
  - lib/gem_toys/version.rb
155
199
  homepage: https://github.com/AlexWayfer/gem_toys
156
200
  licenses:
@@ -167,14 +211,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
167
211
  requirements:
168
212
  - - ">="
169
213
  - !ruby/object:Gem::Version
170
- version: '2.4'
214
+ version: '2.5'
171
215
  required_rubygems_version: !ruby/object:Gem::Requirement
172
216
  requirements:
173
217
  - - ">="
174
218
  - !ruby/object:Gem::Version
175
219
  version: '0'
176
220
  requirements: []
177
- rubygems_version: 3.1.2
221
+ rubygems_version: 3.1.4
178
222
  signing_key:
179
223
  specification_version: 4
180
224
  summary: Toys template for gems