scallop 0.3.2 → 0.9.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: 0a0715eb2ba21f83bd3fc10ec7195b994ac5e31d346fb6b1bc200aaf5e00cf0b
4
- data.tar.gz: b1ec1adfd41dea460a08c48e71e58153d26e3126552af14c010a2a87de29020b
3
+ metadata.gz: fc5152e49392ede55c37e9deca067897a24056e3d91b102eb6450e52f776e59f
4
+ data.tar.gz: 6ee2973cbc1ef539df8f9dccf45f03e50e83a92ae1907c9d0d3652f2d9de2711
5
5
  SHA512:
6
- metadata.gz: 4f06ae937fa91af87b1ae1c6e475314f08ab311186021b8982195954e87c21b2bf0fe30197ad7bbe086a382c219476bf56bb166c646e8f4366148f56fbf7e5ca
7
- data.tar.gz: dc56ec977de18c408fb07e7c589545a28b38a5d12ebc56907acb5bbac7ba325512a4c0b623580df60509bc21b0dcb9215b1bd576f86a76c3906adce22149ce0d
6
+ metadata.gz: 04220fa89226641cb40cc2e74603fa5949be4adfff1d7f700e399fec3e18addca74fb72f92ee643487792d35bfcc056d25b999ca79b47f007684796fc4e03620
7
+ data.tar.gz: aca77b550c6513dd52058935181d1224d2014983a92b6723d8bbb63444c5513b200e1375e3a636ba6edeedf5b70f900d7b4ec40ceafdb360d3fee85b9752361f
data/.rubocop.yml ADDED
@@ -0,0 +1,11 @@
1
+ AllCops:
2
+ Exclude:
3
+ - 'spec/**/*'
4
+
5
+ Metrics/LineLength:
6
+ Max: 120
7
+ Metrics/MethodLength:
8
+ Max: 20
9
+
10
+ Style/TrailingCommaInArguments:
11
+ EnforcedStyleForMultiline: comma
data/Gemfile CHANGED
@@ -1,6 +1,8 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
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.3.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
- hashie (3.6.0)
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
+ [![Gem Version](https://badge.fury.io/rb/scallop.svg)](https://badge.fury.io/rb/scallop)
2
+ [![CircleCI](https://circleci.com/gh/fetlife/scallop.svg?style=svg)](https://circleci.com/gh/fetlife/scallop)
3
+ [![Maintainability](https://api.codeclimate.com/v1/badges/b7d9660aa51c7205fbac/maintainability)](https://codeclimate.com/github/fetlife/scallop/maintainability)
4
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/b7d9660aa51c7205fbac/test_coverage)](https://codeclimate.com/github/fetlife/scallop/test_coverage)
5
+
1
6
  # Scallop
2
7
 
3
- Simple shell wrapper
8
+ ![](./scallop.png)
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
- [See specs](./spec/scallop_spec.rb)
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
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
data/bin/console CHANGED
@@ -1,14 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "scallop"
4
+ require 'bundler/setup'
5
+ require 'scallop'
5
6
 
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
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
- require "hashie"
2
- require "open3"
3
-
4
- require "scallop/version"
5
-
6
- class Scallop
7
- module Errors
8
- class CommandFailed < StandardError
9
- attr_reader :result
10
-
11
- def initialize(message, result)
12
- @result = result
13
- super(message)
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,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scallop
4
+ # Represents named command parameter.
5
+ class Param
6
+ def self.[](key)
7
+ new(key)
8
+ end
9
+
10
+ attr_reader :key
11
+
12
+ def initialize(key)
13
+ @key = key
14
+ end
15
+ end
16
+ 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
@@ -1,3 +1,5 @@
1
- class Scallop
2
- VERSION = "0.3.2"
1
+ # frozen_string_literal: true
2
+
3
+ module Scallop
4
+ VERSION = '0.9.0'
3
5
  end
data/scallop.gemspec CHANGED
@@ -1,34 +1,36 @@
1
+ # frozen_string_literal: true
1
2
 
2
- lib = File.expand_path("../lib", __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "scallop/version"
5
+ require 'scallop/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = "scallop"
8
+ spec.name = 'scallop'
8
9
  spec.version = Scallop::VERSION
9
- spec.authors = ["FetLife"]
10
- spec.email = ["dev@fetlife.com"]
10
+ spec.authors = ['FetLife']
11
+ spec.email = ['dev@fetlife.com']
11
12
 
12
- spec.summary = "Simple shell wrapper"
13
- spec.description = "Simple shell wrapper"
14
- spec.homepage = "https://github.com/fetlife/scallop"
15
- spec.license = "MIT"
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
- # Specify which files should be added to the gem when it is released.
18
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
20
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
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 = "bin"
23
+ spec.bindir = 'bin'
23
24
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
24
- spec.require_paths = ["lib"]
25
+ spec.require_paths = ['lib']
25
26
 
26
- spec.required_ruby_version = ">= 2.6.0"
27
+ spec.required_ruby_version = '>= 2.3.0'
27
28
 
28
- spec.add_dependency "hashie", "~> 3.0"
29
-
30
- spec.add_development_dependency "bundler", "~> 1.17"
31
- spec.add_development_dependency "pry", "~> 0.12"
32
- spec.add_development_dependency "rake", "~> 10.0"
33
- spec.add_development_dependency "rspec", "~> 3.0"
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.3.2
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-18 00:00:00.000000000 Z
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
- description: Simple shell wrapper
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.6.0
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: Simple shell wrapper
162
+ summary: Ergonomic shell wrapper.
128
163
  test_files: []