ggem 1.9.5 → 1.10.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 +4 -4
- data/ggem.gemspec +9 -7
- data/lib/ggem/cli.rb +17 -15
- data/lib/ggem/cli/commands.rb +51 -45
- data/lib/ggem/gem.rb +7 -6
- data/lib/ggem/gemspec.rb +20 -10
- data/lib/ggem/git_repo.rb +2 -1
- data/lib/ggem/template.rb +12 -8
- data/lib/ggem/template_file/gemspec.erb +5 -3
- data/lib/ggem/template_file/gitignore.erb +1 -0
- data/lib/ggem/template_file/l.yml.erb +8 -0
- data/lib/ggem/template_file/rubocop.yml.erb +3 -0
- data/lib/ggem/template_file/ruby-version.erb +1 -1
- data/lib/ggem/template_file/t.yml.erb +6 -0
- data/lib/ggem/version.rb +1 -1
- data/test/support/cmd_tests_helpers.rb +7 -7
- data/test/support/gem1/gem1.gemspec +3 -4
- data/test/support/gem2/gem2.gemspec +3 -4
- data/test/support/name_set.rb +6 -3
- data/test/system/ggem_tests.rb +7 -6
- data/test/unit/cli_tests.rb +84 -59
- data/test/unit/gemspec_tests.rb +11 -6
- data/test/unit/git_repo_tests.rb +9 -7
- metadata +27 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45eb4dacea143c3b186a3ae2ec76ec01990fdf602f3d0a7d64c1f83d29ce0771
|
4
|
+
data.tar.gz: e9bedb479b361a24597449322250da74a12313875ad0ddc7a53a3b9870bd4aaf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0680e6ccd2bf26a2b8521364e206ea049f712e0de44f814fcc9fa9621d42c69a826c192ef4a1f9f30c450618d830c183c39bf38ffdc26ef1572156175bd1f73f'
|
7
|
+
data.tar.gz: 48c14bda11865bde52b80cf1967ef3cfaf9727a33439680ecbaf9fd8a9f6ad0b622a794654b1c99cc75b737d2c506a8571fb1ebbb9b082ae133cea798a49a7f0
|
data/ggem.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
|
-
# -*- encoding: utf-8 -*-
|
4
4
|
lib = File.expand_path("../lib", __FILE__)
|
5
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
6
|
require "ggem/version"
|
@@ -10,20 +10,22 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.version = GGem::VERSION
|
11
11
|
gem.authors = ["Kelly Redding", "Collin Redding"]
|
12
12
|
gem.email = ["kelly@kellyredding.com", "collin.redding@me.com"]
|
13
|
-
gem.summary =
|
14
|
-
gem.description =
|
13
|
+
gem.summary = '"Juh Gem", baby! (a gem utility CLI)'
|
14
|
+
gem.description = '"Juh Gem", baby! (a gem utility CLI)'
|
15
15
|
gem.homepage = "http://github.com/redding/ggem"
|
16
16
|
gem.license = "MIT"
|
17
17
|
|
18
|
-
gem.files
|
18
|
+
gem.files = `git ls-files | grep "^[^.]"`.split($INPUT_RECORD_SEPARATOR)
|
19
|
+
|
19
20
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
20
21
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
21
22
|
gem.require_paths = ["lib"]
|
22
23
|
|
23
24
|
gem.required_ruby_version = "~> 2.5"
|
24
25
|
|
25
|
-
gem.add_development_dependency("
|
26
|
+
gem.add_development_dependency("much-style-guide", ["~> 0.6.4"])
|
27
|
+
gem.add_development_dependency("assert", ["~> 2.19.6"])
|
26
28
|
|
27
|
-
gem.add_dependency("much-
|
28
|
-
gem.add_dependency("scmd",
|
29
|
+
gem.add_dependency("much-mixin", ["~> 0.2.4"])
|
30
|
+
gem.add_dependency("scmd", ["~> 3.0.4"])
|
29
31
|
end
|
data/lib/ggem/cli.rb
CHANGED
@@ -5,18 +5,20 @@ require "ggem/cli/clirb"
|
|
5
5
|
require "ggem/cli/commands"
|
6
6
|
|
7
7
|
module GGem; end
|
8
|
+
|
8
9
|
class GGem::CLI
|
9
|
-
COMMANDS =
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
COMMANDS =
|
11
|
+
CommandSet.new{ |unknown| InvalidCommand.new(unknown) }.tap do |c|
|
12
|
+
c.add(GenerateCommand, "generate", "g")
|
13
|
+
c.add(BuildCommand, "build", "b")
|
14
|
+
c.add(InstallCommand, "install", "i")
|
15
|
+
c.add(PushCommand, "push", "p")
|
16
|
+
c.add(TagCommand, "tag", "t")
|
17
|
+
c.add(ReleaseCommand, "release", "r")
|
18
|
+
end
|
17
19
|
|
18
20
|
def self.run(args)
|
19
|
-
|
21
|
+
new.run(args)
|
20
22
|
end
|
21
23
|
|
22
24
|
def initialize(kernel = nil, stdout = nil, stderr = nil)
|
@@ -34,16 +36,16 @@ class GGem::CLI
|
|
34
36
|
@stdout.puts cmd.help
|
35
37
|
rescue CLIRB::VersionExit
|
36
38
|
@stdout.puts GGem::VERSION
|
37
|
-
rescue CLIRB::Error, ArgumentError, InvalidCommandError =>
|
38
|
-
display_debug(
|
39
|
-
@stderr.puts "#{
|
39
|
+
rescue CLIRB::Error, ArgumentError, InvalidCommandError => ex
|
40
|
+
display_debug(ex)
|
41
|
+
@stderr.puts "#{ex.message}\n\n"
|
40
42
|
@stdout.puts cmd.help
|
41
43
|
@kernel.exit 1
|
42
44
|
rescue CommandExitError
|
43
45
|
@kernel.exit 1
|
44
|
-
rescue
|
45
|
-
@stderr.puts "#{
|
46
|
-
@stderr.puts
|
46
|
+
rescue => ex
|
47
|
+
@stderr.puts "#{ex.class}: #{ex.message}"
|
48
|
+
@stderr.puts ex.backtrace.join("\n")
|
47
49
|
@kernel.exit 1
|
48
50
|
end
|
49
51
|
@kernel.exit 0
|
data/lib/ggem/cli/commands.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "ggem/cli/clirb"
|
4
|
-
require "much-
|
4
|
+
require "much-mixin"
|
5
5
|
|
6
6
|
module GGem; end
|
7
|
+
|
7
8
|
class GGem::CLI
|
8
9
|
InvalidCommandError = Class.new(ArgumentError)
|
9
10
|
CommandExitError = Class.new(RuntimeError)
|
@@ -16,12 +17,14 @@ class GGem::CLI
|
|
16
17
|
@clirb = CLIRB.new
|
17
18
|
end
|
18
19
|
|
19
|
-
def new
|
20
|
+
def new
|
21
|
+
self
|
22
|
+
end
|
20
23
|
|
21
24
|
def run(argv)
|
22
25
|
@clirb.parse!([@name, argv].flatten.compact)
|
23
26
|
raise CLIRB::HelpExit if @name.to_s.empty?
|
24
|
-
raise InvalidCommandError, "`#{
|
27
|
+
raise InvalidCommandError, "`#{name}` is not a command."
|
25
28
|
end
|
26
29
|
|
27
30
|
def help
|
@@ -33,14 +36,16 @@ class GGem::CLI
|
|
33
36
|
end
|
34
37
|
|
35
38
|
module ValidCommand
|
36
|
-
include
|
39
|
+
include MuchMixin
|
37
40
|
|
38
|
-
|
41
|
+
mixin_instance_methods do
|
39
42
|
def initialize(&clirb_build)
|
40
43
|
@clirb = CLIRB.new(&clirb_build)
|
41
44
|
end
|
42
45
|
|
43
|
-
def clirb
|
46
|
+
def clirb
|
47
|
+
@clirb
|
48
|
+
end
|
44
49
|
|
45
50
|
def run(argv, stdout = nil, stderr = nil)
|
46
51
|
@clirb.parse!(argv)
|
@@ -55,9 +60,9 @@ class GGem::CLI
|
|
55
60
|
end
|
56
61
|
|
57
62
|
module NotifyCmdCommand
|
58
|
-
include
|
63
|
+
include MuchMixin
|
59
64
|
|
60
|
-
|
65
|
+
mixin_instance_methods do
|
61
66
|
private
|
62
67
|
|
63
68
|
def notify(success_msg, &cmd_block)
|
@@ -66,7 +71,7 @@ class GGem::CLI
|
|
66
71
|
end
|
67
72
|
|
68
73
|
def cmd(&cmd_block)
|
69
|
-
cmd,
|
74
|
+
cmd, _status, output = cmd_block.call
|
70
75
|
if ENV["DEBUG"]
|
71
76
|
@stdout.puts cmd
|
72
77
|
@stdout.puts output
|
@@ -76,14 +81,14 @@ class GGem::CLI
|
|
76
81
|
end
|
77
82
|
|
78
83
|
module GitRepoCommand
|
79
|
-
include
|
84
|
+
include MuchMixin
|
80
85
|
|
81
|
-
|
86
|
+
mixin_included do
|
82
87
|
include ValidCommand
|
83
88
|
include NotifyCmdCommand
|
84
89
|
end
|
85
90
|
|
86
|
-
|
91
|
+
mixin_instance_methods do
|
87
92
|
def initialize(*args)
|
88
93
|
super
|
89
94
|
|
@@ -96,8 +101,8 @@ class GGem::CLI
|
|
96
101
|
def notify(*args, &block)
|
97
102
|
begin
|
98
103
|
super
|
99
|
-
rescue GGem::GitRepo::CmdError =>
|
100
|
-
@stderr.puts
|
104
|
+
rescue GGem::GitRepo::CmdError => ex
|
105
|
+
@stderr.puts ex.message
|
101
106
|
raise CommandExitError
|
102
107
|
end
|
103
108
|
end
|
@@ -114,9 +119,9 @@ class GGem::CLI
|
|
114
119
|
require "ggem/gem"
|
115
120
|
path = GGem::Gem.new(Dir.pwd, @clirb.args.first).save!.path
|
116
121
|
@stdout.puts "created gem in #{path}"
|
117
|
-
rescue GGem::Gem::NoNameError =>
|
122
|
+
rescue GGem::Gem::NoNameError => ex
|
118
123
|
error = ArgumentError.new("GEM-NAME must be provided")
|
119
|
-
error.set_backtrace(
|
124
|
+
error.set_backtrace(ex.backtrace)
|
120
125
|
raise error
|
121
126
|
end
|
122
127
|
|
@@ -132,28 +137,28 @@ class GGem::CLI
|
|
132
137
|
"Usage: ggem generate [options] GEM-NAME\n\n" \
|
133
138
|
"Options: #{@clirb}\n" \
|
134
139
|
"Description:\n" \
|
135
|
-
" #{
|
140
|
+
" #{summary}"
|
136
141
|
end
|
137
142
|
end
|
138
143
|
|
139
144
|
module GemspecCommand
|
140
|
-
include
|
145
|
+
include MuchMixin
|
141
146
|
|
142
|
-
|
147
|
+
mixin_included do
|
143
148
|
include ValidCommand
|
144
149
|
include NotifyCmdCommand
|
145
150
|
end
|
146
151
|
|
147
|
-
|
152
|
+
mixin_instance_methods do
|
148
153
|
def initialize(*args)
|
149
154
|
super
|
150
155
|
|
151
156
|
require "ggem/gemspec"
|
152
157
|
begin
|
153
158
|
@spec = GGem::Gemspec.new(Dir.pwd)
|
154
|
-
rescue GGem::Gemspec::NotFoundError =>
|
159
|
+
rescue GGem::Gemspec::NotFoundError => ex
|
155
160
|
error = ArgumentError.new("There are no gemspecs at #{Dir.pwd}")
|
156
|
-
error.set_backtrace(
|
161
|
+
error.set_backtrace(ex.backtrace)
|
157
162
|
raise error
|
158
163
|
end
|
159
164
|
end
|
@@ -163,8 +168,8 @@ class GGem::CLI
|
|
163
168
|
def notify(*args, &block)
|
164
169
|
begin
|
165
170
|
super
|
166
|
-
rescue GGem::Gemspec::CmdError =>
|
167
|
-
@stderr.puts
|
171
|
+
rescue GGem::Gemspec::CmdError => ex
|
172
|
+
@stderr.puts ex.message
|
168
173
|
raise CommandExitError
|
169
174
|
end
|
170
175
|
end
|
@@ -190,7 +195,7 @@ class GGem::CLI
|
|
190
195
|
"Usage: ggem build [options]\n\n" \
|
191
196
|
"Options: #{@clirb}\n" \
|
192
197
|
"Description:\n" \
|
193
|
-
" #{
|
198
|
+
" #{summary}"
|
194
199
|
end
|
195
200
|
end
|
196
201
|
|
@@ -219,7 +224,7 @@ class GGem::CLI
|
|
219
224
|
"Usage: ggem install [options]\n\n" \
|
220
225
|
"Options: #{@clirb}\n" \
|
221
226
|
"Description:\n" \
|
222
|
-
" #{
|
227
|
+
" #{summary}"
|
223
228
|
end
|
224
229
|
end
|
225
230
|
|
@@ -249,22 +254,22 @@ class GGem::CLI
|
|
249
254
|
"Usage: ggem push [options]\n\n" \
|
250
255
|
"Options: #{@clirb}\n" \
|
251
256
|
"Description:\n" \
|
252
|
-
" #{
|
257
|
+
" #{summary}"
|
253
258
|
end
|
254
259
|
end
|
255
260
|
|
256
261
|
module ForceTagOptionCommand
|
257
|
-
include
|
262
|
+
include MuchMixin
|
258
263
|
|
259
|
-
|
264
|
+
mixin_included do
|
260
265
|
include ValidCommand
|
261
266
|
end
|
262
267
|
|
263
|
-
|
268
|
+
mixin_instance_methods do
|
264
269
|
def initialize
|
265
270
|
super do
|
266
271
|
option "force-tag", "force tagging even with uncommitted files", {
|
267
|
-
:
|
272
|
+
abbrev: "f",
|
268
273
|
}
|
269
274
|
end
|
270
275
|
end
|
@@ -282,9 +287,9 @@ class GGem::CLI
|
|
282
287
|
begin
|
283
288
|
cmd{ @repo.run_validate_clean_cmd }
|
284
289
|
cmd{ @repo.run_validate_committed_cmd }
|
285
|
-
rescue GGem::GitRepo::CmdError
|
290
|
+
rescue GGem::GitRepo::CmdError
|
286
291
|
@stderr.puts "There are files that need to be committed first."
|
287
|
-
if
|
292
|
+
if clirb.opts["force-tag"]
|
288
293
|
@stderr.puts "Forcing tag anyway..."
|
289
294
|
else
|
290
295
|
raise CommandExitError
|
@@ -303,8 +308,8 @@ class GGem::CLI
|
|
303
308
|
end
|
304
309
|
|
305
310
|
@stdout.puts "Pushed git commits and tags."
|
306
|
-
rescue GGem::GitRepo::CmdError =>
|
307
|
-
@stderr.puts
|
311
|
+
rescue GGem::GitRepo::CmdError => ex
|
312
|
+
@stderr.puts ex.message
|
308
313
|
raise CommandExitError
|
309
314
|
end
|
310
315
|
|
@@ -316,7 +321,7 @@ class GGem::CLI
|
|
316
321
|
"Usage: ggem tag [options]\n\n" \
|
317
322
|
"Options: #{@clirb}\n" \
|
318
323
|
"Description:\n" \
|
319
|
-
" #{
|
324
|
+
" #{summary}"
|
320
325
|
end
|
321
326
|
end
|
322
327
|
|
@@ -332,7 +337,7 @@ class GGem::CLI
|
|
332
337
|
|
333
338
|
def run(argv, *args)
|
334
339
|
super
|
335
|
-
@tag_command.run(
|
340
|
+
@tag_command.run(clirb.opts["force-tag"] ? ["--force-tag"] : [])
|
336
341
|
@push_command.run([])
|
337
342
|
end
|
338
343
|
|
@@ -345,14 +350,14 @@ class GGem::CLI
|
|
345
350
|
"Usage: ggem release [options]\n\n" \
|
346
351
|
"Options: #{@clirb}\n" \
|
347
352
|
"Description:\n" \
|
348
|
-
" #{
|
353
|
+
" #{summary}\n" \
|
349
354
|
" (macro for running `ggem tag && ggem push`)"
|
350
355
|
end
|
351
356
|
end
|
352
357
|
|
353
358
|
class CommandSet
|
354
359
|
def initialize(&unknown_cmd_block)
|
355
|
-
@lookup = Hash.new{ |
|
360
|
+
@lookup = Hash.new{ |_h, k| unknown_cmd_block.call(k) }
|
356
361
|
@names = []
|
357
362
|
@aliases = {}
|
358
363
|
@summaries = {}
|
@@ -361,7 +366,7 @@ class GGem::CLI
|
|
361
366
|
def add(klass, name, *aliases)
|
362
367
|
begin
|
363
368
|
cmd = klass.new
|
364
|
-
rescue
|
369
|
+
rescue
|
365
370
|
# don't add any commands you can't init
|
366
371
|
else
|
367
372
|
([name] + aliases).each{ |n| @lookup[n] = cmd }
|
@@ -388,12 +393,13 @@ class GGem::CLI
|
|
388
393
|
end
|
389
394
|
|
390
395
|
def to_s
|
391
|
-
max_name_size = @names.map
|
392
|
-
max_alias_size = @aliases.values.map
|
396
|
+
max_name_size = @names.map(&:size).max || 0
|
397
|
+
max_alias_size = @aliases.values.map(&:size).max || 0
|
393
398
|
|
394
|
-
@to_s ||= @names.map
|
395
|
-
"#{n.ljust(max_name_size)} #{@aliases[n].ljust(max_alias_size)}
|
396
|
-
|
399
|
+
@to_s ||= @names.map{ |n|
|
400
|
+
"#{n.ljust(max_name_size)} #{@aliases[n].ljust(max_alias_size)} "\
|
401
|
+
"#{@summaries[n]}"
|
402
|
+
}.join("\n")
|
397
403
|
end
|
398
404
|
end
|
399
405
|
end
|
data/lib/ggem/gem.rb
CHANGED
@@ -4,6 +4,7 @@ require "fileutils"
|
|
4
4
|
require "ggem/template"
|
5
5
|
|
6
6
|
module GGem; end
|
7
|
+
|
7
8
|
class GGem::Gem
|
8
9
|
NoNameError = Class.new(ArgumentError)
|
9
10
|
|
@@ -30,13 +31,13 @@ class GGem::Gem
|
|
30
31
|
def module_name
|
31
32
|
transforms = {
|
32
33
|
"_" => "",
|
33
|
-
"-" => ""
|
34
|
+
"-" => "",
|
34
35
|
}
|
35
|
-
@module_name ||= transform_name(transforms
|
36
|
+
@module_name ||= transform_name(transforms, &:capitalize)
|
36
37
|
end
|
37
38
|
|
38
39
|
def ruby_name
|
39
|
-
@ruby_name ||= transform_name
|
40
|
+
@ruby_name ||= transform_name(&:downcase)
|
40
41
|
end
|
41
42
|
|
42
43
|
private
|
@@ -44,15 +45,15 @@ class GGem::Gem
|
|
44
45
|
def normalize_name(name)
|
45
46
|
und_camelcs = [/([A-Z])([a-z])/, '_\1\2']
|
46
47
|
rm_dup_und = [/_+/, "_"]
|
47
|
-
rm_lead_und = [/^_/, ""
|
48
|
+
rm_lead_und = [/^_/, ""]
|
48
49
|
name.gsub(*und_camelcs).gsub(*rm_dup_und).sub(*rm_lead_und).downcase
|
49
50
|
end
|
50
51
|
|
51
52
|
def transform_name(conditions = {}, &block)
|
52
|
-
n = (block ? block.call(
|
53
|
+
n = (block ? block.call(name) : name)
|
53
54
|
conditions.each do |on, glue|
|
54
55
|
if (a = n.split(on)).size > 1
|
55
|
-
n = a.map{ |part| block
|
56
|
+
n = a.map{ |part| block&.call(part) }.join(glue)
|
56
57
|
end
|
57
58
|
end
|
58
59
|
n
|
data/lib/ggem/gemspec.rb
CHANGED
@@ -4,10 +4,11 @@ require "pathname"
|
|
4
4
|
require "scmd"
|
5
5
|
|
6
6
|
module GGem; end
|
7
|
+
|
7
8
|
class GGem::Gemspec
|
8
9
|
PUSH_HOST_META_KEY = "allowed_push_host"
|
9
|
-
DEFAULT_PUSH_HOST = "https://rubygems.org"
|
10
|
-
BUILD_TO_DIRNAME = "pkg"
|
10
|
+
DEFAULT_PUSH_HOST = "https://rubygems.org"
|
11
|
+
BUILD_TO_DIRNAME = "pkg"
|
11
12
|
|
12
13
|
NotFoundError = Class.new(ArgumentError)
|
13
14
|
LoadError = Class.new(ArgumentError)
|
@@ -55,25 +56,34 @@ class GGem::Gemspec
|
|
55
56
|
def run_cmd(cmd_string)
|
56
57
|
cmd = Scmd.new(cmd_string)
|
57
58
|
cmd.run
|
58
|
-
|
59
|
-
raise
|
60
|
-
|
59
|
+
unless cmd.success?
|
60
|
+
raise(
|
61
|
+
CmdError,
|
62
|
+
"#{cmd_string}\n#{cmd.stderr.empty? ? cmd.stdout : cmd.stderr}",
|
63
|
+
)
|
61
64
|
end
|
62
65
|
[cmd_string, cmd.exitstatus, cmd.stdout]
|
63
66
|
end
|
64
67
|
|
65
68
|
def load_gemspec(path)
|
66
|
-
eval(
|
67
|
-
|
68
|
-
|
69
|
-
|
69
|
+
eval( # rubocop:disable Security/Eval
|
70
|
+
path.read,
|
71
|
+
TOPLEVEL_BINDING,
|
72
|
+
path.expand_path.to_s,
|
73
|
+
)
|
74
|
+
rescue ScriptError, StandardError => ex
|
75
|
+
original_line = ex.backtrace.find{ |line| line.include?(path.to_s) }
|
76
|
+
msg =
|
77
|
+
"There was a #{ex.class} while loading #{path.basename}: \n#{ex.message}"
|
70
78
|
msg << " from\n #{original_line}" if original_line
|
71
79
|
msg << "\n"
|
72
80
|
raise LoadError, msg
|
73
81
|
end
|
74
82
|
|
75
83
|
def get_push_host(spec)
|
76
|
-
ENV["GGEM_PUSH_HOST"] ||
|
84
|
+
ENV["GGEM_PUSH_HOST"] ||
|
85
|
+
get_meta(spec)[PUSH_HOST_META_KEY] ||
|
86
|
+
DEFAULT_PUSH_HOST
|
77
87
|
end
|
78
88
|
|
79
89
|
def get_meta(spec)
|