raketeer 0.2.3 → 0.2.4

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: 5c38d651b22554d93b5986c5d12461efc2d3323f7d3b19aadfd7e361e611dd7a
4
- data.tar.gz: 612dc5ab931a7e794c36a4f01925e008923c4894680edb6ea2e9a38f828d28ad
3
+ metadata.gz: 3e6ed3bd0408cc6af232b21a069ea2515d63ea1db1fc40b6d0a1c2e29fa61838
4
+ data.tar.gz: 46809d4b3d4d65b62a3f4f72fc136b2393727ca871aa0321fefc64cf8cfa62c6
5
5
  SHA512:
6
- metadata.gz: '0316239d48a10b37f972ae845813cd2bd50375d766cdeefe2227f419ed315f44da826e058d9a61c2dfae1a40eaa9847d45b7177fdffa16d845a6ed53e438c909'
7
- data.tar.gz: c44703d264b50f802e7c7efc2d62f62269b5e83e430d5277304da246cf3ca0f46d527ce133eee7f81ec46545af1f778ab910a2e64fa48067a8409c0766f94252
6
+ metadata.gz: ffdf10d2f65ca8e0e6d9b8866c1a807749da9aa151c92d44b9f0588478f30b94008f9b100ce709b10f6ef07c1a3fbba43bc74178f0ebcf1c3d46ff8cd157e038
7
+ data.tar.gz: 4052757cc76e4826759e0f1fc09b664d02ea44b63d00856f9f914ba099c97d5be1eb497e2101ebcb054d71452e31975ed36ef6f4c089b3b640c0cb62ee89ca5b
data/CHANGELOG.md CHANGED
@@ -2,22 +2,36 @@
2
2
 
3
3
  Format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
4
4
 
5
- ## [[Unreleased]](https://github.com/esotericpig/raketeer/compare/v0.2.3...master)
5
+ ## [[Unreleased]](https://github.com/esotericpig/raketeer/compare/v0.2.4...master)
6
+
7
+ ## [v0.2.4] - 2019-08-02
8
+ ### Added
9
+ - BumpTask & 'raketeer/bump'
10
+ - FilesBumper (lib/raketeer/files_bumper.rb)
11
+ - SemVer (lib/raketeer/sem_ver.rb)
12
+ - BumpVer (lib/raketeer/bump_ver.rb)
13
+ - To Util:
14
+ - to_bool() & TRUE_BOOLS (from my yard_ghurt project)
15
+ - To version.rb:
16
+ - DEP_VERSIONS & try_require_dev() (for future use)
17
+
18
+ ### Changed
19
+ - Util.find_main_executable() to not search for 'bin/*.rb' since almost no project uses an extension in the bin directory
6
20
 
7
21
  ## [v0.2.3] - 2019-07-30
8
22
  ### Fixed
9
23
  - Fixed 'yield' typo in some tasks
10
24
 
11
25
  ## [v0.2.2] - 2019-07-29
12
- ### Changed
13
- - Refactored some code (minor)
14
- - Changed some documentation (minor)
15
-
16
26
  ### Added
17
27
  - RunTask & 'raketeer/run'
18
28
  - Util
19
29
  - bin/raketeer (for testing purposes only, not included in the Gem package)
20
30
 
31
+ ### Changed
32
+ - Refactored some code (minor)
33
+ - Changed some documentation (minor)
34
+
21
35
  ## [v0.2.1] - 2019-07-24
22
36
  ### Changed
23
37
  - Fixed minor/cosmetic typo
data/Rakefile CHANGED
@@ -22,6 +22,8 @@
22
22
 
23
23
  require 'bundler/gem_tasks'
24
24
 
25
+ require 'raketeer'
26
+
25
27
  require 'rake/clean'
26
28
 
27
29
  task default: []
data/lib/raketeer.rb CHANGED
@@ -21,9 +21,14 @@
21
21
  #++
22
22
 
23
23
 
24
+ require 'raketeer/bump_task'
25
+ require 'raketeer/bump_ver'
26
+ require 'raketeer/files_bumper'
24
27
  require 'raketeer/irb_task'
25
28
  require 'raketeer/nokogiri_install_tasks'
26
29
  require 'raketeer/run_task'
30
+ require 'raketeer/sem_ver'
31
+ require 'raketeer/util'
27
32
  require 'raketeer/version'
28
33
 
29
34
  ###
data/lib/raketeer/all.rb CHANGED
@@ -21,6 +21,7 @@
21
21
  #++
22
22
 
23
23
 
24
+ require 'raketeer/bump' # @since 0.2.4
24
25
  require 'raketeer/irb' # @since 0.2.0
25
26
  require 'raketeer/nokogiri_installs' # @since 0.1.0
26
27
  require 'raketeer/run' # @since 0.2.2
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # frozen_string_literal: true
4
+
5
+ #--
6
+ # This file is part of Raketeer.
7
+ # Copyright (c) 2019 Jonathan Bradley Whited (@esotericpig)
8
+ #
9
+ # Raketeer is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU Lesser General Public License as published by
11
+ # the Free Software Foundation, either version 3 of the License, or
12
+ # (at your option) any later version.
13
+ #
14
+ # Raketeer is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU Lesser General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU Lesser General Public License
20
+ # along with Raketeer. If not, see <https://www.gnu.org/licenses/>.
21
+ #++
22
+
23
+
24
+ require 'raketeer/bump_task'
25
+
26
+ module Raketeer
27
+ ###
28
+ # @author Jonathan Bradley Whited (@esotericpig)
29
+ # @since 0.2.4
30
+ ###
31
+ module Bump
32
+ end
33
+ end
34
+
35
+ Raketeer::BumpTask.new() # @since 0.2.4
@@ -0,0 +1,333 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # frozen_string_literal: true
4
+
5
+ #--
6
+ # This file is part of Raketeer.
7
+ # Copyright (c) 2019 Jonathan Bradley Whited (@esotericpig)
8
+ #
9
+ # Raketeer is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU Lesser General Public License as published by
11
+ # the Free Software Foundation, either version 3 of the License, or
12
+ # (at your option) any later version.
13
+ #
14
+ # Raketeer is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU Lesser General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU Lesser General Public License
20
+ # along with Raketeer. If not, see <https://www.gnu.org/licenses/>.
21
+ #++
22
+
23
+
24
+ require 'date'
25
+ require 'rake'
26
+
27
+ require 'rake/tasklib'
28
+
29
+ require 'raketeer/bump_ver'
30
+ require 'raketeer/files_bumper'
31
+ require 'raketeer/sem_ver'
32
+ require 'raketeer/util'
33
+
34
+ module Raketeer
35
+ ###
36
+ # @author Jonathan Bradley Whited (@esotericpig)
37
+ # @since 0.2.4
38
+ ###
39
+ class BumpTask < Rake::TaskLib
40
+ attr_accessor :bump_bundle
41
+ attr_accessor :bump_files # Looks for a version number
42
+ attr_accessor :bundle_cmd
43
+ attr_accessor :changelogs # Looks for 'Unreleased' & a Markdown header
44
+ attr_accessor :dry_run
45
+ attr_accessor :git_msg
46
+ attr_accessor :name
47
+ attr_accessor :ruby_files # Looks for {ruby_var}
48
+ attr_accessor :ruby_var
49
+
50
+ alias_method :bump_bundle?,:bump_bundle
51
+ alias_method :dry_run?,:dry_run
52
+
53
+ def initialize(name=:bump)
54
+ super()
55
+
56
+ @bump_bundle = false
57
+ @bump_files = Rake::FileList[]
58
+ @bundle_cmd = 'bundle'
59
+ @changelogs = Rake::FileList['CHANGELOG.md']
60
+ @dry_run = false
61
+ @git_msg = %q(git commit -m 'Bump version to v%{version}')
62
+ @name = name
63
+ @ruby_files = Rake::FileList[File.join('lib','**','version.rb')]
64
+ @ruby_var = 'VERSION'
65
+
66
+ yield self if block_given?()
67
+ define()
68
+ end
69
+
70
+ def define()
71
+ desc 'Show/Set/Bump the version'
72
+ task @name,[:version] do |task,args|
73
+ check_env()
74
+ bump_all(BumpVer.new(
75
+ version: args.version,
76
+ major: ENV['major'],
77
+ minor: ENV['minor'],
78
+ patch: ENV['patch'],
79
+ prerelease: ENV['pre'],
80
+ build_meta: ENV['build']
81
+ ))
82
+ end
83
+
84
+ namespace @name do
85
+ desc 'Bump/Set the major version'
86
+ task :major,[:major] do |task,args|
87
+ bump_ver = BumpVer.new(major: args.major)
88
+
89
+ # You can't erase the major version (required)
90
+ bump_ver.major = '+1' if bump_ver.major.nil?() || bump_ver.major.empty?()
91
+
92
+ check_env()
93
+ bump_all(bump_ver)
94
+ end
95
+
96
+ desc 'Bump/Set the minor version'
97
+ task :minor,[:minor] do |task,args|
98
+ bump_ver = BumpVer.new(minor: args.minor)
99
+ bump_ver.minor = '+1' if bump_ver.minor.nil?()
100
+
101
+ check_env()
102
+ bump_all(bump_ver)
103
+ end
104
+
105
+ desc 'Bump/Set the patch version'
106
+ task :patch,[:patch] do |task,args|
107
+ bump_ver = BumpVer.new(patch: args.patch)
108
+ bump_ver.patch = '+1' if bump_ver.patch.nil?()
109
+
110
+ check_env()
111
+ bump_all(bump_ver)
112
+ end
113
+
114
+ desc 'Set/Erase the pre-release version'
115
+ task :pre,[:pre] do |task,args|
116
+ bump_ver = BumpVer.new(prerelease: args.pre)
117
+ bump_ver.prerelease = '' if bump_ver.prerelease.nil?()
118
+
119
+ check_env()
120
+ bump_all(bump_ver)
121
+ end
122
+
123
+ desc 'Set/Erase the build metadata'
124
+ task :build,[:build] do |task,args|
125
+ bump_ver = BumpVer.new(build_meta: args.build)
126
+ bump_ver.build_meta = '' if bump_ver.build_meta.nil?()
127
+
128
+ check_env()
129
+ bump_all(bump_ver)
130
+ end
131
+
132
+ desc 'Bump the Gemfile.lock version'
133
+ task :bundle do
134
+ check_env()
135
+ bump_bundle_file()
136
+ end
137
+
138
+ desc "Show the help/usage for #{name} tasks"
139
+ task :help do
140
+ print_help()
141
+ end
142
+ end
143
+ end
144
+
145
+ def bump_all(bump_ver)
146
+ sem_vers = []
147
+
148
+ # Order matters for outputting the most accurate version
149
+ sem_vers << bump_ruby_files(bump_ver)
150
+ sem_vers << bump_bump_files(bump_ver)
151
+ sem_vers << bump_changelogs(bump_ver)
152
+
153
+ sem_vers.compact!()
154
+
155
+ if @bump_bundle && !bump_ver.empty?() && !sem_vers.empty?()
156
+ bump_bundle_file()
157
+ end
158
+
159
+ # Always output it, in case the user just wants to see what the git message
160
+ # should be without making changes.
161
+ if !@git_msg.nil?() && !sem_vers.empty?()
162
+ puts '[Git]:'
163
+ puts '= ' + (@git_msg % {version: sem_vers[0].to_s()})
164
+ end
165
+ end
166
+
167
+ def bump_bump_files(bump_ver)
168
+ bumper = FilesBumper.new(@bump_files,bump_ver,@dry_run)
169
+
170
+ bumper.bump_files() do
171
+ next if bumper.changes > 0 || bumper.line !~ SemVer::REGEX
172
+
173
+ break if bumper.bump_line!() && bumper.bump_ver_empty?()
174
+ end
175
+
176
+ return bumper.version
177
+ end
178
+
179
+ def bump_bundle_file()
180
+ sh_cmd = [@bundle_cmd,'list']
181
+
182
+ puts "[#{sh_cmd.join(' ')}]:"
183
+
184
+ if @dry_run
185
+ puts '= Nothing written (dry run)'
186
+
187
+ return
188
+ end
189
+
190
+ sh(*sh_cmd,{:verbose => false})
191
+ end
192
+
193
+ # @see https://keepachangelog.com/en/1.0.0/
194
+ def bump_changelogs(bump_ver)
195
+ bumper = FilesBumper.new(@changelogs,bump_ver,@dry_run) do
196
+ @header_bumped = false
197
+ @unreleased_bumped = false
198
+ end
199
+
200
+ header_regex = /\A(\s*##\s*\[+\D*)(#{SemVer::REGEX.to_s()})(.*)\z/m
201
+ unreleased_regex = /\A.*Unreleased.*http.*\.{3}/
202
+
203
+ bumper.bump_files() do
204
+ if @header_bumped && @unreleased_bumped
205
+ if bumper.bump_ver_empty?()
206
+ break
207
+ else
208
+ next
209
+ end
210
+ end
211
+
212
+ if bumper.line =~ unreleased_regex
213
+ next if @unreleased_bumped
214
+
215
+ # Match from the end, in case the URL has a number (like '%20')
216
+ match = bumper.line.match(/(#{SemVer::REGEX.to_s()})(\.{3}.*)\z/m)
217
+
218
+ next if match.nil?() || match.length < 3 || (i = match.begin(0)) < 1
219
+
220
+ match = [bumper.line[0..i - 1],match[1],match[-1]]
221
+
222
+ next if match.any?() {|m| m.nil?() || m.strip().empty?()}
223
+
224
+ orig_line = bumper.line.dup()
225
+ bumper.line = match[1]
226
+
227
+ if bumper.bump_line!(add_change: false)
228
+ bumper.line = match[0] << bumper.line << match[2]
229
+
230
+ bumper.add_change(bumper.line,push: false)
231
+
232
+ @unreleased_bumped = true
233
+ else
234
+ bumper.line = orig_line
235
+ end
236
+ elsif !(match = bumper.line.match(header_regex)).nil?()
237
+ next if @header_bumped || match.length < 4
238
+
239
+ match = [match[1],match[2],match[-1]]
240
+
241
+ next if match.any?() {|m| m.nil?() || m.strip().empty?()}
242
+
243
+ orig_line = bumper.line.dup()
244
+ bumper.line = match[1]
245
+
246
+ if bumper.bump_line!(add_change: false)
247
+ bumper.line = match[0] << bumper.line
248
+
249
+ # Replace the date with today's date for the new Markdown header, if it exists
250
+ match[2].sub!(/\d+\s*\-\s*\d+\s*\-\s*\d+(.*)\z/m,"#{Date.today().strftime('%F')}\\1")
251
+ bumper.line << match[2]
252
+
253
+ bumper.add_change(bumper.line,push: true)
254
+ bumper.line << "\n" # Don't print this newline to the console
255
+
256
+ @header_bumped = true
257
+ end
258
+
259
+ # We are adding a new Markdown header, so always set the line back to its original value
260
+ bumper.line = orig_line
261
+ end
262
+ end
263
+
264
+ return bumper.version
265
+ end
266
+
267
+ def bump_ruby_files(bump_ver)
268
+ bumper = FilesBumper.new(@ruby_files,bump_ver,@dry_run)
269
+ version_var_regex = /\A(\s*#{Regexp.quote(@ruby_var)}\s*=\D*)(#{SemVer::REGEX.to_s()})(.*)\z/m
270
+
271
+ bumper.bump_files() do
272
+ next if bumper.changes > 0
273
+ next if (match = bumper.line.match(version_var_regex)).nil?()
274
+ next if match.length < 4
275
+ next if match[1..2].any?() {|m| m.nil?() || m.strip().empty?()}
276
+
277
+ orig_line = bumper.line.dup()
278
+ bumper.line = match[2]
279
+
280
+ if bumper.bump_line!(add_change: false)
281
+ bumper.line = match[1] << bumper.line
282
+ bumper.line << match[-1] unless match[-1].nil?()
283
+
284
+ bumper.add_change(bumper.line,push: false)
285
+
286
+ break if bumper.bump_ver_empty?()
287
+ else
288
+ bumper.line = orig_line
289
+ end
290
+ end
291
+
292
+ return bumper.version
293
+ end
294
+
295
+ def check_env()
296
+ env_dryrun = ENV['dryrun']
297
+
298
+ if !env_dryrun.nil?() && !(env_dryrun = env_dryrun.to_s().strip()).empty?()
299
+ @dry_run = Util.to_bool(env_dryrun)
300
+ end
301
+ end
302
+
303
+ def print_help()
304
+ puts <<-EOH
305
+ rake #{@name} # Print the current version
306
+
307
+ # You can run a dry run for any task (will not write to files)
308
+ rake #{@name} dryrun=true
309
+
310
+ rake #{@name}[1.2.3-alpha.4-beta.5] # Set the version manually
311
+ rake #{@name} major=1 minor=2 patch=3 # Set the version numbers
312
+ rake #{@name} pre=alpha.4 build=beta.5 # Set the version extensions
313
+ rake #{@name} major=+1 minor=+1 patch=+1 # Bump the version numbers by 1
314
+ rake #{@name} major=+2 minor=+3 patch=+4 # Bump the version numbers by X
315
+
316
+ rake #{@name}:major # Bump the major version by 1
317
+ rake #{@name}:major[1] # Set the major version
318
+ rake #{@name}:major[+2] # Bump the major version by 2
319
+ rake #{@name}:minor # Bump the minor version by 1
320
+ rake #{@name}:minor[2] # Set the minor version
321
+ rake #{@name}:minor[+3] # Bump the minor version by 3
322
+ rake #{@name}:patch # Bump the patch version by 1
323
+ rake #{@name}:patch[3] # Set the patch version
324
+ rake #{@name}:patch[+4] # Bump the patch version by 4
325
+ rake #{@name}:pre # Erase the pre-release version
326
+ rake #{@name}:pre[alpha.4] # Set the pre-release version
327
+ rake #{@name}:build # Erase the build metadata
328
+ rake #{@name}:build[beta.5] # Set the build metadata
329
+ rake #{@name}:bundle # Bump the Gemfile.lock version
330
+ EOH
331
+ end
332
+ end
333
+ end
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # frozen_string_literal: true
4
+
5
+ #--
6
+ # This file is part of Raketeer.
7
+ # Copyright (c) 2019 Jonathan Bradley Whited (@esotericpig)
8
+ #
9
+ # Raketeer is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU Lesser General Public License as published by
11
+ # the Free Software Foundation, either version 3 of the License, or
12
+ # (at your option) any later version.
13
+ #
14
+ # Raketeer is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU Lesser General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU Lesser General Public License
20
+ # along with Raketeer. If not, see <https://www.gnu.org/licenses/>.
21
+ #++
22
+
23
+
24
+ require 'raketeer/sem_ver'
25
+
26
+ module Raketeer
27
+ ###
28
+ # Bump Version
29
+ #
30
+ # @author Jonathan Bradley Whited (@esotericpig)
31
+ # @since 0.2.4
32
+ ###
33
+ class BumpVer < SemVer
34
+ def initialize(version: nil,major: nil,minor: nil,patch: nil,prerelease: nil,build_meta: nil)
35
+ self.build_meta = build_meta
36
+ self.major = major
37
+ self.minor = minor
38
+ self.patch = patch
39
+ self.prerelease = prerelease
40
+ self.version = version
41
+ end
42
+
43
+ def init_int_or_str(obj)
44
+ return nil if obj.nil?()
45
+ return obj if obj.is_a?(Integer)
46
+
47
+ obj = obj.to_s().strip()
48
+
49
+ return obj if obj.empty?() || obj[0] == '+'
50
+ return obj.to_i()
51
+ end
52
+
53
+ def init_str(obj)
54
+ return obj.nil?() ? nil : obj.to_s().strip()
55
+ end
56
+
57
+ def bump!(sem_ver)
58
+ if !@version.nil?()
59
+ sem_ver.version = @version
60
+ else
61
+ if !@major.nil?()
62
+ if @major.is_a?(Integer)
63
+ sem_ver.major = @major
64
+ elsif @major.empty?()
65
+ sem_ver.major = 0 # There must always be a major version
66
+ else
67
+ sem_ver.major = 0 if sem_ver.major.nil?()
68
+ sem_ver.major += @major.to_i()
69
+ end
70
+ end
71
+
72
+ if !@minor.nil?()
73
+ if @minor.is_a?(Integer)
74
+ sem_ver.minor = @minor
75
+ elsif @minor.empty?()
76
+ sem_ver.minor = nil
77
+ else
78
+ sem_ver.minor = 0 if sem_ver.minor.nil?()
79
+ sem_ver.minor += @minor.to_i()
80
+ end
81
+ end
82
+
83
+ if !@patch.nil?()
84
+ if @patch.is_a?(Integer)
85
+ sem_ver.patch = @patch
86
+ elsif @patch.empty?()
87
+ sem_ver.patch = nil
88
+ else
89
+ sem_ver.patch = 0 if sem_ver.patch.nil?()
90
+ sem_ver.patch += @patch.to_i()
91
+ end
92
+ end
93
+
94
+ if !@prerelease.nil?()
95
+ if @prerelease.empty?()
96
+ sem_ver.prerelease = nil
97
+ else
98
+ sem_ver.prerelease = @prerelease
99
+ end
100
+ end
101
+
102
+ if !@build_meta.nil?()
103
+ if @build_meta.empty?()
104
+ sem_ver.build_meta = nil
105
+ else
106
+ sem_ver.build_meta = @build_meta
107
+ end
108
+ end
109
+ end
110
+
111
+ return sem_ver
112
+ end
113
+
114
+ def bump_line!(line,sem_ver)
115
+ line.sub!(REGEX,bump!(sem_ver).to_s())
116
+
117
+ return line
118
+ end
119
+
120
+ def build_meta=(build_meta)
121
+ super(init_str(build_meta))
122
+ end
123
+
124
+ def major=(major)
125
+ super(init_int_or_str(major))
126
+ end
127
+
128
+ def minor=(minor)
129
+ super(init_int_or_str(minor))
130
+ end
131
+
132
+ def patch=(patch)
133
+ super(init_int_or_str(patch))
134
+ end
135
+
136
+ def prerelease=(prerelease)
137
+ super(init_str(prerelease))
138
+ end
139
+
140
+ def version=(version)
141
+ super(init_str(version))
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # frozen_string_literal: true
4
+
5
+ #--
6
+ # This file is part of Raketeer.
7
+ # Copyright (c) 2019 Jonathan Bradley Whited (@esotericpig)
8
+ #
9
+ # Raketeer is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU Lesser General Public License as published by
11
+ # the Free Software Foundation, either version 3 of the License, or
12
+ # (at your option) any later version.
13
+ #
14
+ # Raketeer is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU Lesser General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU Lesser General Public License
20
+ # along with Raketeer. If not, see <https://www.gnu.org/licenses/>.
21
+ #++
22
+
23
+
24
+ require 'raketeer/bump_ver'
25
+ require 'raketeer/sem_ver'
26
+
27
+ module Raketeer
28
+ ###
29
+ # @author Jonathan Bradley Whited (@esotericpig)
30
+ # @since 0.2.4
31
+ ###
32
+ class FilesBumper
33
+ attr_reader :bump_ver
34
+ attr_reader :bump_ver_empty
35
+ attr_accessor :changes
36
+ attr_reader :dry_run
37
+ attr_reader :files
38
+ attr_accessor :init_per_file
39
+ attr_accessor :line
40
+ attr_accessor :lines
41
+ attr_accessor :sem_ver
42
+ attr_accessor :version
43
+ attr_accessor :version_bumped # Was the version actually bumped?
44
+
45
+ alias_method :bump_ver_empty?,:bump_ver_empty
46
+ alias_method :dry_run?,:dry_run
47
+ alias_method :version_bumped?,:version_bumped
48
+
49
+ def initialize(files,bump_ver,dry_run,&init_per_file)
50
+ @bump_ver = bump_ver
51
+ @bump_ver_empty = bump_ver.empty?()
52
+ @dry_run = dry_run
53
+ @files = files.to_a()
54
+ @init_per_file = init_per_file
55
+ @sem_ver = nil
56
+ @version = nil
57
+ @version_bumped = false
58
+ end
59
+
60
+ def add_change(line,push: true)
61
+ puts "+ #{line}"
62
+
63
+ @changes += 1
64
+ @lines << line if push
65
+ end
66
+
67
+ def bump_files(&block)
68
+ @files.each do |filename|
69
+ puts "[#{filename}]:"
70
+
71
+ if !File.exist?(filename)
72
+ puts '! File does not exist'
73
+
74
+ next
75
+ end
76
+
77
+ @changes = 0 # For possible future use
78
+ @lines = []
79
+ @sem_ver = nil
80
+
81
+ @init_per_file.call(self) unless @init_per_file.nil?()
82
+
83
+ File.foreach(filename) do |line|
84
+ @line = line
85
+
86
+ block.call(self) if !@line.strip().empty?()
87
+
88
+ @lines << @line
89
+ end
90
+
91
+ next if bump_ver_empty?()
92
+
93
+ print '= '
94
+
95
+ if @changes > 0
96
+ if dry_run?()
97
+ puts "Nothing written (dry run): #{@sem_ver}"
98
+ else
99
+ File.open(filename,'w') do |file|
100
+ file.puts @lines
101
+ end
102
+
103
+ puts "#{@changes} change#{@changes == 1 ? '' : 's'} written"
104
+ end
105
+ else
106
+ puts "Nothing written (up-to-date): #{@sem_ver}"
107
+ end
108
+ end
109
+ end
110
+
111
+ def bump_line!(add_change: true)
112
+ @sem_ver = SemVer.parse_line(@line)
113
+
114
+ return false if @sem_ver.nil?()
115
+
116
+ @version = @sem_ver if @version.nil?()
117
+
118
+ if bump_ver_empty?()
119
+ puts "= #{@sem_ver}"
120
+
121
+ return true
122
+ else
123
+ orig_line = @line.dup()
124
+ @bump_ver.bump_line!(@line,@sem_ver)
125
+
126
+ if @line != orig_line
127
+ if !@version_bumped
128
+ @version = @sem_ver
129
+ @version_bumped = true
130
+ end
131
+
132
+ self.add_change(@line,push: false) if add_change
133
+
134
+ return true
135
+ end
136
+ end
137
+
138
+ return false
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # frozen_string_literal: true
4
+
5
+ #--
6
+ # This file is part of Raketeer.
7
+ # Copyright (c) 2019 Jonathan Bradley Whited (@esotericpig)
8
+ #
9
+ # Raketeer is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU Lesser General Public License as published by
11
+ # the Free Software Foundation, either version 3 of the License, or
12
+ # (at your option) any later version.
13
+ #
14
+ # Raketeer is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU Lesser General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU Lesser General Public License
20
+ # along with Raketeer. If not, see <https://www.gnu.org/licenses/>.
21
+ #++
22
+
23
+
24
+ module Raketeer
25
+ ###
26
+ # Semantic Version
27
+ #
28
+ # This is a non-strict version of Semantic Versioning v2.0.0.
29
+ #
30
+ # @author Jonathan Bradley Whited (@esotericpig)
31
+ # @since 0.2.4
32
+ # @see https://semver.org
33
+ ###
34
+ class SemVer
35
+ REGEX = /\d+(\.\d+)?(\.\d+)?(\-[0-9A-Za-z\-\.]+)?(\+[0-9A-Za-z\-\.]+)?/
36
+
37
+ attr_accessor :build_meta
38
+ attr_accessor :major
39
+ attr_accessor :minor
40
+ attr_accessor :patch
41
+ attr_accessor :prerelease
42
+ attr_accessor :version # If not +nil+, {to_s} will only return this.
43
+
44
+ def initialize(major: nil,minor: nil,patch: nil,prerelease: nil,build_meta: nil)
45
+ @build_meta = build_meta
46
+ @major = major
47
+ @minor = minor
48
+ @patch = patch
49
+ @prerelease = prerelease
50
+ @version = nil
51
+ end
52
+
53
+ def initialize_copy(orig)
54
+ super(orig)
55
+
56
+ is_clone = caller[0].include?('clone')
57
+
58
+ @build_meta = is_clone ? orig.build_meta.clone() : orig.build_meta.dup()
59
+ @major = is_clone ? orig.major.clone() : orig.major.dup()
60
+ @minor = is_clone ? orig.minor.clone() : orig.minor.dup()
61
+ @patch = is_clone ? orig.patch.clone() : orig.patch.dup()
62
+ @prerelease = is_clone ? orig.prerelease.clone() : orig.prerelease.dup()
63
+ @version = is_clone ? orig.version.clone() : orig.version.dup()
64
+ end
65
+
66
+ def self.parse(str)
67
+ # Parsing backwards makes the logic easier
68
+ build_meta = str.split('+',2)
69
+ prerelease = build_meta[0].split('-',2)
70
+ numbers = prerelease[0].split('.',3)
71
+
72
+ sem_ver = SemVer.new()
73
+ sem_ver.major = numbers[0].to_i() # There must always be a major version
74
+
75
+ if numbers.length >= 2
76
+ minor = numbers[1].strip()
77
+ sem_ver.minor = minor.to_i() unless minor.empty?()
78
+
79
+ if numbers.length == 3
80
+ patch = numbers[2].strip()
81
+ sem_ver.patch = patch.to_i() unless patch.empty?()
82
+ end
83
+ end
84
+
85
+ if prerelease.length == 2
86
+ prerelease = prerelease[1].strip()
87
+ sem_ver.prerelease = prerelease unless prerelease.empty?()
88
+ end
89
+
90
+ if build_meta.length == 2
91
+ build_meta = build_meta[1].strip()
92
+ sem_ver.build_meta = build_meta unless build_meta.empty?()
93
+ end
94
+
95
+ return sem_ver
96
+ end
97
+
98
+ def self.parse_line(line)
99
+ str = line[REGEX]
100
+
101
+ return nil if str.nil?() || (str = str.strip()).empty?()
102
+ return parse(str)
103
+ end
104
+
105
+ def empty?()
106
+ return @build_meta.nil?() &&
107
+ @major.nil?() &&
108
+ @minor.nil?() &&
109
+ @patch.nil?() &&
110
+ @prerelease.nil?() &&
111
+ @version.nil?()
112
+ end
113
+
114
+ def to_s()
115
+ s = ''.dup()
116
+
117
+ if !@version.nil?()
118
+ s << @version.to_s()
119
+ elsif !@major.nil?()
120
+ s << @major.to_s()
121
+ s << ".#{@minor.to_s()}" unless @minor.nil?()
122
+ s << ".#{@patch.to_s()}" unless @patch.nil?()
123
+ s << "-#{@prerelease.to_s()}" unless @prerelease.nil?()
124
+ s << "+#{@build_meta.to_s()}" unless @build_meta.nil?()
125
+ end
126
+
127
+ return s
128
+ end
129
+ end
130
+ end
data/lib/raketeer/util.rb CHANGED
@@ -27,17 +27,15 @@ module Raketeer
27
27
  # @since 0.2.2
28
28
  ###
29
29
  module Util
30
+ # @since 0.2.4
31
+ TRUE_BOOLS = ['1','on','t','true','y','yes'].freeze()
32
+
30
33
  def self.find_main_executable(bin_dir)
31
- # Try any file
34
+ # Try the bin/ dir
32
35
  main_exe = Dir.glob(File.join(bin_dir,'*'))
33
36
 
34
37
  return File.basename(main_exe[0]) if main_exe.length == 1
35
38
 
36
- # Try only .rb files
37
- main_exe = Dir.glob(File.join(bin_dir,'*.rb'))
38
-
39
- return File.basename(main_exe[0]) if main_exe.length == 1
40
-
41
39
  # Try using the main module
42
40
  main_mod = find_main_module()
43
41
 
@@ -63,5 +61,10 @@ module Raketeer
63
61
 
64
62
  return nil
65
63
  end
64
+
65
+ # @since 0.2.4
66
+ def self.to_bool(obj)
67
+ return TRUE_BOOLS.include?(obj.to_s().downcase())
68
+ end
66
69
  end
67
70
  end
@@ -22,5 +22,19 @@
22
22
 
23
23
 
24
24
  module Raketeer
25
- VERSION = '0.2.3'
25
+ VERSION = '0.2.4'
26
+
27
+ # @since 0.2.4
28
+ DEP_VERSIONS = {
29
+ 'irb' => '~> 1.0'
30
+ }
31
+
32
+ # @since 0.2.4
33
+ def self.try_require_dev(gem_name)
34
+ begin
35
+ require gem_name
36
+ rescue LoadError => e
37
+ raise e.exception("Add development dependency: '#{gem_name}','#{DEP_VERSIONS[gem_name]}'")
38
+ end
39
+ end
26
40
  end
data/raketeer.gemspec CHANGED
@@ -52,8 +52,9 @@ Gem::Specification.new() do |spec|
52
52
  spec.required_ruby_version = '>= 2.1.10'
53
53
 
54
54
  # TODO: also add the below comment to the README & reword for user
55
+ #
55
56
  # If it is a dependency specific to a task, then it should probably be added
56
- # as a dev dependency (not a runtime dependency) so that a bunch of
57
+ # as a development dependency (not a runtime dependency) so that a bunch of
57
58
  # non-essential dependencies (to the user) are not added.
58
59
  #
59
60
  # For example, if the user only uses the Nokogiri tasks, then they don't need
@@ -63,9 +64,11 @@ Gem::Specification.new() do |spec|
63
64
  # If the user uses the IRB task, then they will have to add 'irb' as a
64
65
  # development dependency in their own project's Gemspec.
65
66
 
67
+ dv = Raketeer::DEP_VERSIONS
68
+
66
69
  spec.add_runtime_dependency 'rake' #,'~> 12.3'
67
70
 
68
71
  spec.add_development_dependency 'bundler','~> 1.17'
69
- spec.add_development_dependency 'irb' ,'~> 1.0' # For IRBTask
70
- spec.add_development_dependency 'yard' ,'~> 0.9' # For doc
72
+ spec.add_development_dependency 'irb' ,dv['irb'] # For IRBTask
73
+ spec.add_development_dependency 'yard' ,'~> 0.9' # For documentation
71
74
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: raketeer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Bradley Whited (@esotericpig)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-30 00:00:00.000000000 Z
11
+ date: 2019-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -80,12 +80,17 @@ files:
80
80
  - Rakefile
81
81
  - lib/raketeer.rb
82
82
  - lib/raketeer/all.rb
83
+ - lib/raketeer/bump.rb
84
+ - lib/raketeer/bump_task.rb
85
+ - lib/raketeer/bump_ver.rb
86
+ - lib/raketeer/files_bumper.rb
83
87
  - lib/raketeer/irb.rb
84
88
  - lib/raketeer/irb_task.rb
85
89
  - lib/raketeer/nokogiri_install_tasks.rb
86
90
  - lib/raketeer/nokogiri_installs.rb
87
91
  - lib/raketeer/run.rb
88
92
  - lib/raketeer/run_task.rb
93
+ - lib/raketeer/sem_ver.rb
89
94
  - lib/raketeer/util.rb
90
95
  - lib/raketeer/version.rb
91
96
  - raketeer.gemspec