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 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: []