scallop 0.3.2 → 0.9.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 +4 -4
- data/.rubocop.yml +11 -0
- data/Gemfile +4 -2
- data/Gemfile.lock +28 -3
- data/README.md +79 -2
- data/Rakefile +5 -3
- data/bin/console +5 -11
- data/lib/scallop.rb +13 -129
- data/lib/scallop/command_builder.rb +87 -0
- data/lib/scallop/errors.rb +19 -0
- data/lib/scallop/executor.rb +38 -0
- data/lib/scallop/param.rb +16 -0
- data/lib/scallop/public_api.rb +24 -0
- data/lib/scallop/result.rb +24 -0
- data/lib/scallop/version.rb +4 -2
- data/scallop.gemspec +24 -22
- metadata +54 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc5152e49392ede55c37e9deca067897a24056e3d91b102eb6450e52f776e59f
|
4
|
+
data.tar.gz: 6ee2973cbc1ef539df8f9dccf45f03e50e83a92ae1907c9d0d3652f2d9de2711
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04220fa89226641cb40cc2e74603fa5949be4adfff1d7f700e399fec3e18addca74fb72f92ee643487792d35bfcc056d25b999ca79b47f007684796fc4e03620
|
7
|
+
data.tar.gz: aca77b550c6513dd52058935181d1224d2014983a92b6723d8bbb63444c5513b200e1375e3a636ba6edeedf5b70f900d7b4ec40ceafdb360d3fee85b9752361f
|
data/.rubocop.yml
ADDED
data/Gemfile
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
|
5
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
4
6
|
|
5
7
|
# Specify your gem's dependencies in scallop.gemspec
|
6
8
|
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,19 +1,25 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
scallop (0.
|
5
|
-
hashie (~> 3.0)
|
4
|
+
scallop (0.9.0)
|
6
5
|
|
7
6
|
GEM
|
8
7
|
remote: https://rubygems.org/
|
9
8
|
specs:
|
9
|
+
ast (2.4.0)
|
10
10
|
coderay (1.1.2)
|
11
11
|
diff-lcs (1.3)
|
12
|
-
|
12
|
+
docile (1.3.2)
|
13
|
+
jaro_winkler (1.5.3)
|
14
|
+
json (2.2.0)
|
13
15
|
method_source (0.9.2)
|
16
|
+
parallel (1.17.0)
|
17
|
+
parser (2.6.3.0)
|
18
|
+
ast (~> 2.4.0)
|
14
19
|
pry (0.12.2)
|
15
20
|
coderay (~> 1.1.0)
|
16
21
|
method_source (~> 0.9.0)
|
22
|
+
rainbow (3.0.0)
|
17
23
|
rake (10.5.0)
|
18
24
|
rspec (3.8.0)
|
19
25
|
rspec-core (~> 3.8.0)
|
@@ -28,6 +34,22 @@ GEM
|
|
28
34
|
diff-lcs (>= 1.2.0, < 2.0)
|
29
35
|
rspec-support (~> 3.8.0)
|
30
36
|
rspec-support (3.8.0)
|
37
|
+
rspec_junit_formatter (0.4.1)
|
38
|
+
rspec-core (>= 2, < 4, != 2.12.0)
|
39
|
+
rubocop (0.71.0)
|
40
|
+
jaro_winkler (~> 1.5.1)
|
41
|
+
parallel (~> 1.10)
|
42
|
+
parser (>= 2.6)
|
43
|
+
rainbow (>= 2.2.2, < 4.0)
|
44
|
+
ruby-progressbar (~> 1.7)
|
45
|
+
unicode-display_width (>= 1.4.0, < 1.7)
|
46
|
+
ruby-progressbar (1.10.1)
|
47
|
+
simplecov (0.16.1)
|
48
|
+
docile (~> 1.1)
|
49
|
+
json (>= 1.8, < 3)
|
50
|
+
simplecov-html (~> 0.10.0)
|
51
|
+
simplecov-html (0.10.2)
|
52
|
+
unicode-display_width (1.6.0)
|
31
53
|
|
32
54
|
PLATFORMS
|
33
55
|
ruby
|
@@ -37,7 +59,10 @@ DEPENDENCIES
|
|
37
59
|
pry (~> 0.12)
|
38
60
|
rake (~> 10.0)
|
39
61
|
rspec (~> 3.0)
|
62
|
+
rspec_junit_formatter (~> 0.4)
|
63
|
+
rubocop (~> 0.71)
|
40
64
|
scallop!
|
65
|
+
simplecov (~> 0.16)
|
41
66
|
|
42
67
|
BUNDLED WITH
|
43
68
|
1.17.2
|
data/README.md
CHANGED
@@ -1,6 +1,21 @@
|
|
1
|
+
[](https://badge.fury.io/rb/scallop)
|
2
|
+
[](https://circleci.com/gh/fetlife/scallop)
|
3
|
+
[](https://codeclimate.com/github/fetlife/scallop/maintainability)
|
4
|
+
[](https://codeclimate.com/github/fetlife/scallop/test_coverage)
|
5
|
+
|
1
6
|
# Scallop
|
2
7
|
|
3
|
-
|
8
|
+

|
9
|
+
|
10
|
+
Ergonomic shell wrapper.
|
11
|
+
|
12
|
+
Features:
|
13
|
+
|
14
|
+
* Easy access to command's output (stdout & stderr)
|
15
|
+
* Failure handling
|
16
|
+
* Parameterization
|
17
|
+
* Measuring execution time
|
18
|
+
* No dependencies
|
4
19
|
|
5
20
|
## Installation
|
6
21
|
|
@@ -20,4 +35,66 @@ Or install it yourself as:
|
|
20
35
|
|
21
36
|
## Usage
|
22
37
|
|
23
|
-
|
38
|
+
To run `sudo -u chuck grep -R /home/chuck`
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
result = Scallop.sudo(:chuck).cmd(:grep, '-R', '/home/chuck').run
|
42
|
+
```
|
43
|
+
|
44
|
+
You can then check whether command succeeded
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
result.success?
|
48
|
+
```
|
49
|
+
|
50
|
+
See its output
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
result.stdout
|
54
|
+
result.stderr
|
55
|
+
result.output # STDOUT and STDERR combined
|
56
|
+
```
|
57
|
+
|
58
|
+
You can also access information about command execution time
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
result.timing.real # Elapsed real time
|
62
|
+
result.timing.stime # System CPU time
|
63
|
+
result.timing.utime # User CPU time
|
64
|
+
result.timing.total # Total time, that is utime + stime + cutime + cstime
|
65
|
+
```
|
66
|
+
|
67
|
+
### Handling failures with exceptions
|
68
|
+
|
69
|
+
If you replace `run` with `run!`, exception will be raised in case command fails
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
begin
|
73
|
+
Scallop.cmd(some_command).run!
|
74
|
+
rescue Scallop::Errors::CommandFailed => error
|
75
|
+
# you can access result right on the error itself
|
76
|
+
error.result.stderr
|
77
|
+
end
|
78
|
+
```
|
79
|
+
|
80
|
+
### Piping
|
81
|
+
|
82
|
+
To run `cat /some/file | grep something`
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
command = Scallop.cmd(:cat, '/some/file') | Scallop.cmd(:grep, 'something')
|
86
|
+
command.run
|
87
|
+
```
|
88
|
+
|
89
|
+
### Parameterization
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
stored_command = Scallop.cmd(:rm, '-rf', Scallop::Param[:path])
|
93
|
+
|
94
|
+
stored_command.set(path: '/foo').run # rm -rf /foo
|
95
|
+
stored_command.set(path: '/bar').run # rm -rf /bar
|
96
|
+
```
|
97
|
+
|
98
|
+
--------
|
99
|
+
|
100
|
+
You can also [check specs](./spec/scallop_spec.rb) for examples.
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,14 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
require
|
4
|
-
require
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'scallop'
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
7
|
+
require 'pry'
|
8
|
+
Pry.start
|
data/lib/scallop.rb
CHANGED
@@ -1,129 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class ValidationFailed < StandardError
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class Result < Hashie::Dash
|
22
|
-
property :stdout, required: true
|
23
|
-
property :stderr, required: true
|
24
|
-
property :status, required: true
|
25
|
-
|
26
|
-
def self.from_capture3(result)
|
27
|
-
stdout, stderr, status = result
|
28
|
-
new(stdout: stdout.strip, stderr: stderr.strip, status: status)
|
29
|
-
end
|
30
|
-
|
31
|
-
def success?
|
32
|
-
status.success?
|
33
|
-
end
|
34
|
-
|
35
|
-
# stdout & stderr combined
|
36
|
-
def output
|
37
|
-
@_output ||= [stdout, stderr].reject { |s| s.nil? || s.empty? }.join("\n")
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
class Param < Hashie::Dash
|
42
|
-
property :key, required: true
|
43
|
-
end
|
44
|
-
|
45
|
-
class << self
|
46
|
-
DSL_METHODS = %i{ cmd run run! sudo }
|
47
|
-
|
48
|
-
DSL_METHODS.each do |method|
|
49
|
-
define_method(method) do |*args|
|
50
|
-
new.public_send(method, *args)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def param(key)
|
55
|
-
Param.new(key: key)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def initialize
|
60
|
-
@params = {}
|
61
|
-
end
|
62
|
-
|
63
|
-
def sudo(sudo = true)
|
64
|
-
dup
|
65
|
-
.tap do |instance|
|
66
|
-
instance.instance_eval { @sudo = sudo }
|
67
|
-
end
|
68
|
-
.freeze
|
69
|
-
end
|
70
|
-
|
71
|
-
def cmd(*cmd)
|
72
|
-
dup
|
73
|
-
.tap do |instance|
|
74
|
-
instance.instance_eval { @cmd = cmd }
|
75
|
-
end
|
76
|
-
.freeze
|
77
|
-
end
|
78
|
-
|
79
|
-
def set(params)
|
80
|
-
new_params = @params.merge(params)
|
81
|
-
|
82
|
-
dup
|
83
|
-
.tap do |instance|
|
84
|
-
instance.instance_eval { @params = new_params }
|
85
|
-
end
|
86
|
-
.freeze
|
87
|
-
end
|
88
|
-
|
89
|
-
def to_command
|
90
|
-
raise Errors::ValidationFailed.new("cmd missing") if @cmd.nil?
|
91
|
-
|
92
|
-
prefix =
|
93
|
-
case @sudo
|
94
|
-
when true then "sudo"
|
95
|
-
when String, Symbol then "sudo -u #{@sudo}"
|
96
|
-
else nil
|
97
|
-
end
|
98
|
-
|
99
|
-
cmd =
|
100
|
-
[*@cmd]
|
101
|
-
.flatten
|
102
|
-
.map do |cmd_part|
|
103
|
-
case cmd_part
|
104
|
-
when Param
|
105
|
-
@params[cmd_part.key].tap do |value|
|
106
|
-
raise Errors::ValidationFailed.new("value for param '#{cmd_part.key}' not set") if value.nil?
|
107
|
-
end
|
108
|
-
else
|
109
|
-
cmd_part.to_s
|
110
|
-
end
|
111
|
-
end
|
112
|
-
.map(&Shellwords.method(:escape))
|
113
|
-
.join(" ")
|
114
|
-
|
115
|
-
[prefix, cmd].compact.join(" ")
|
116
|
-
end
|
117
|
-
|
118
|
-
def run
|
119
|
-
to_command
|
120
|
-
.yield_self(&Open3.method(:capture3))
|
121
|
-
.yield_self(&Result.method(:from_capture3))
|
122
|
-
end
|
123
|
-
|
124
|
-
def run!
|
125
|
-
run.tap do |result|
|
126
|
-
raise Errors::CommandFailed.new(result.stderr, result) unless result.success?
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'benchmark'
|
4
|
+
require 'open3'
|
5
|
+
require 'shellwords'
|
6
|
+
|
7
|
+
require 'scallop/command_builder'
|
8
|
+
require 'scallop/errors'
|
9
|
+
require 'scallop/executor'
|
10
|
+
require 'scallop/param'
|
11
|
+
require 'scallop/public_api'
|
12
|
+
require 'scallop/result'
|
13
|
+
require 'scallop/version'
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Scallop
|
4
|
+
# Implements command building interface with immutability.
|
5
|
+
class CommandBuilder
|
6
|
+
def initialize
|
7
|
+
@params = {}
|
8
|
+
@cmd = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def sudo(sudo = true)
|
12
|
+
dup
|
13
|
+
.tap do |instance|
|
14
|
+
instance.instance_eval { @sudo = sudo }
|
15
|
+
end
|
16
|
+
.freeze
|
17
|
+
end
|
18
|
+
|
19
|
+
def cmd(*cmd)
|
20
|
+
dup
|
21
|
+
.tap do |instance|
|
22
|
+
instance.instance_eval { @cmd += cmd }
|
23
|
+
end
|
24
|
+
.freeze
|
25
|
+
end
|
26
|
+
|
27
|
+
def read_cmd
|
28
|
+
@cmd
|
29
|
+
end
|
30
|
+
|
31
|
+
def set(params)
|
32
|
+
new_params = @params.merge(params)
|
33
|
+
|
34
|
+
dup
|
35
|
+
.tap do |instance|
|
36
|
+
instance.instance_eval { @params = new_params }
|
37
|
+
end
|
38
|
+
.freeze
|
39
|
+
end
|
40
|
+
|
41
|
+
def |(other)
|
42
|
+
cmd(:|, other.read_cmd)
|
43
|
+
end
|
44
|
+
|
45
|
+
def run
|
46
|
+
Executor.run(to_command)
|
47
|
+
end
|
48
|
+
|
49
|
+
def run!
|
50
|
+
Executor.run!(to_command)
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_command
|
54
|
+
raise Errors::ValidationFailed, 'cmd missing' if @cmd.empty?
|
55
|
+
|
56
|
+
[build_prefix, build_command].compact.join(' ')
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def build_prefix
|
62
|
+
case @sudo
|
63
|
+
when true then 'sudo'
|
64
|
+
when String, Symbol then "sudo -u #{@sudo}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def build_command
|
69
|
+
[*@cmd]
|
70
|
+
.flatten
|
71
|
+
.map do |cmd_part|
|
72
|
+
case cmd_part
|
73
|
+
when Param
|
74
|
+
value = @params[cmd_part.key]
|
75
|
+
raise Errors::ValidationFailed, "value for param '#{cmd_part.key}' not set" if value.nil?
|
76
|
+
|
77
|
+
Shellwords.escape(value.to_s)
|
78
|
+
when :|
|
79
|
+
cmd_part
|
80
|
+
else
|
81
|
+
Shellwords.escape(cmd_part.to_s)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
.join(' ')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Scallop
|
4
|
+
module Errors
|
5
|
+
# Error representing command failure.
|
6
|
+
class CommandFailed < StandardError
|
7
|
+
attr_reader :result
|
8
|
+
|
9
|
+
def initialize(message, result)
|
10
|
+
@result = result
|
11
|
+
super(message)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Error representing absense of required parameters or incorrect usage
|
16
|
+
class ValidationFailed < StandardError
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Scallop
|
4
|
+
# Executes command and returns result.
|
5
|
+
module Executor
|
6
|
+
def self.run(command)
|
7
|
+
capture3, timing = measure do
|
8
|
+
Open3.capture3(command)
|
9
|
+
end
|
10
|
+
build_result(capture3, timing)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.run!(command)
|
14
|
+
run(command).tap do |result|
|
15
|
+
raise Errors::CommandFailed.new(result.stderr, result) unless result.success?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.measure
|
20
|
+
result = nil
|
21
|
+
timing = Benchmark.measure { result = yield }
|
22
|
+
[result, timing]
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.build_result(capture3, timing)
|
26
|
+
stdout, stderr, status = capture3
|
27
|
+
|
28
|
+
Result
|
29
|
+
.new(
|
30
|
+
stdout: stdout.strip,
|
31
|
+
stderr: stderr.strip,
|
32
|
+
status: status,
|
33
|
+
timing: timing,
|
34
|
+
)
|
35
|
+
.freeze
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# :nodoc:
|
4
|
+
module Scallop
|
5
|
+
# Adds ergonomic public API methods.
|
6
|
+
module PublicAPI
|
7
|
+
METHODS = %i[cmd sudo].freeze
|
8
|
+
|
9
|
+
def self.included(base)
|
10
|
+
base.extend ClassMethods
|
11
|
+
end
|
12
|
+
|
13
|
+
# :nodoc:
|
14
|
+
module ClassMethods
|
15
|
+
METHODS.each do |method|
|
16
|
+
define_method(method) do |*args|
|
17
|
+
CommandBuilder.new.public_send(method, *args)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
include PublicAPI
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Scallop
|
4
|
+
# Represents a result of command execution.
|
5
|
+
class Result
|
6
|
+
attr_reader :stdout
|
7
|
+
attr_reader :stderr
|
8
|
+
attr_reader :status
|
9
|
+
attr_reader :timing
|
10
|
+
attr_reader :output
|
11
|
+
|
12
|
+
def initialize(stdout:, stderr:, status:, timing:)
|
13
|
+
@stdout = stdout
|
14
|
+
@stderr = stderr
|
15
|
+
@status = status
|
16
|
+
@timing = timing
|
17
|
+
@output = [stdout, stderr].reject { |s| s.nil? || s.empty? }.join("\n")
|
18
|
+
end
|
19
|
+
|
20
|
+
def success?
|
21
|
+
@status.success?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/scallop/version.rb
CHANGED
data/scallop.gemspec
CHANGED
@@ -1,34 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
5
|
+
require 'scallop/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
+
spec.name = 'scallop'
|
8
9
|
spec.version = Scallop::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
10
|
+
spec.authors = ['FetLife']
|
11
|
+
spec.email = ['dev@fetlife.com']
|
11
12
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
13
|
+
spec.summary = 'Ergonomic shell wrapper.'
|
14
|
+
spec.description = 'Ergonomic shell wrapper.'
|
15
|
+
spec.homepage = 'https://github.com/fetlife/scallop'
|
16
|
+
spec.license = 'MIT'
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
19
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
20
|
+
f.match(%r{^(test|spec|features|.circleci)/}) || f.end_with?('.png')
|
21
|
+
end
|
21
22
|
end
|
22
|
-
spec.bindir =
|
23
|
+
spec.bindir = 'bin'
|
23
24
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
24
|
-
spec.require_paths = [
|
25
|
+
spec.require_paths = ['lib']
|
25
26
|
|
26
|
-
spec.required_ruby_version =
|
27
|
+
spec.required_ruby_version = '>= 2.3.0'
|
27
28
|
|
28
|
-
spec.
|
29
|
-
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
29
|
+
spec.add_development_dependency 'bundler', '~> 1.17'
|
30
|
+
spec.add_development_dependency 'pry', '~> 0.12'
|
31
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
32
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
33
|
+
spec.add_development_dependency 'rspec_junit_formatter', '~> 0.4'
|
34
|
+
spec.add_development_dependency 'rubocop', '~> 0.71'
|
35
|
+
spec.add_development_dependency 'simplecov', '~> 0.16'
|
34
36
|
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scallop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- FetLife
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: hashie
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '3.0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '3.0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: bundler
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,7 +66,49 @@ dependencies:
|
|
80
66
|
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '3.0'
|
83
|
-
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec_junit_formatter
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.4'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.4'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.71'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.71'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.16'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.16'
|
111
|
+
description: Ergonomic shell wrapper.
|
84
112
|
email:
|
85
113
|
- dev@fetlife.com
|
86
114
|
executables:
|
@@ -91,6 +119,7 @@ extra_rdoc_files: []
|
|
91
119
|
files:
|
92
120
|
- ".gitignore"
|
93
121
|
- ".rspec"
|
122
|
+
- ".rubocop.yml"
|
94
123
|
- CODE_OF_CONDUCT.md
|
95
124
|
- Gemfile
|
96
125
|
- Gemfile.lock
|
@@ -100,6 +129,12 @@ files:
|
|
100
129
|
- bin/console
|
101
130
|
- bin/setup
|
102
131
|
- lib/scallop.rb
|
132
|
+
- lib/scallop/command_builder.rb
|
133
|
+
- lib/scallop/errors.rb
|
134
|
+
- lib/scallop/executor.rb
|
135
|
+
- lib/scallop/param.rb
|
136
|
+
- lib/scallop/public_api.rb
|
137
|
+
- lib/scallop/result.rb
|
103
138
|
- lib/scallop/version.rb
|
104
139
|
- scallop.gemspec
|
105
140
|
homepage: https://github.com/fetlife/scallop
|
@@ -114,7 +149,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
149
|
requirements:
|
115
150
|
- - ">="
|
116
151
|
- !ruby/object:Gem::Version
|
117
|
-
version: 2.
|
152
|
+
version: 2.3.0
|
118
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
154
|
requirements:
|
120
155
|
- - ">="
|
@@ -124,5 +159,5 @@ requirements: []
|
|
124
159
|
rubygems_version: 3.0.1
|
125
160
|
signing_key:
|
126
161
|
specification_version: 4
|
127
|
-
summary:
|
162
|
+
summary: Ergonomic shell wrapper.
|
128
163
|
test_files: []
|