argy 0.0.0 → 0.1.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 +5 -5
- data/.gitignore +0 -1
- data/.travis.yml +7 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +47 -0
- data/README.md +9 -79
- data/Rakefile +2 -5
- data/argy.gemspec +2 -5
- data/bin/example +7 -21
- data/lib/argy.rb +2 -36
- data/lib/argy/argument.rb +0 -3
- data/lib/argy/help.rb +13 -31
- data/lib/argy/option.rb +0 -13
- data/lib/argy/parameter.rb +1 -36
- data/lib/argy/parser.rb +24 -100
- data/lib/argy/version.rb +1 -1
- metadata +10 -13
- data/.github/workflows/build.yml +0 -22
- data/.github/workflows/publish.yml +0 -38
- data/.yardopts +0 -6
- data/lib/argy/options.rb +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dff9d90b687d261bae2c0820b5ea7b7f812d472d
|
4
|
+
data.tar.gz: 5543ca5b69b14891cbd8e1744df8b7b7480edcd0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ee7ec946a02ce9200fbf9318d708e5ae1a652092f9891050253e34b0ad628ba1aad81e0aa1431e655ebb20a1805b79d3e0800be67e9ed881cb7ad4a5c98673e
|
7
|
+
data.tar.gz: 8372f49e4daca19886b4850bfd1e6f04929a81a6584af4c57babccc0a9aa561bf5eaac035147c786a555e954639fe6ad5b35b301d603514db388d91a185c21a8
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
argy (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
coderay (1.1.2)
|
10
|
+
diff-lcs (1.3)
|
11
|
+
equatable (0.6.1)
|
12
|
+
method_source (0.9.2)
|
13
|
+
pastel (0.7.3)
|
14
|
+
equatable (~> 0.6)
|
15
|
+
tty-color (~> 0.5)
|
16
|
+
pry (0.12.2)
|
17
|
+
coderay (~> 1.1.0)
|
18
|
+
method_source (~> 0.9.0)
|
19
|
+
rake (10.5.0)
|
20
|
+
rspec (3.9.0)
|
21
|
+
rspec-core (~> 3.9.0)
|
22
|
+
rspec-expectations (~> 3.9.0)
|
23
|
+
rspec-mocks (~> 3.9.0)
|
24
|
+
rspec-core (3.9.0)
|
25
|
+
rspec-support (~> 3.9.0)
|
26
|
+
rspec-expectations (3.9.0)
|
27
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
28
|
+
rspec-support (~> 3.9.0)
|
29
|
+
rspec-mocks (3.9.0)
|
30
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
31
|
+
rspec-support (~> 3.9.0)
|
32
|
+
rspec-support (3.9.0)
|
33
|
+
tty-color (0.5.0)
|
34
|
+
|
35
|
+
PLATFORMS
|
36
|
+
ruby
|
37
|
+
|
38
|
+
DEPENDENCIES
|
39
|
+
argy!
|
40
|
+
bundler (~> 2.0)
|
41
|
+
pastel
|
42
|
+
pry
|
43
|
+
rake (~> 10.0)
|
44
|
+
rspec (~> 3.0)
|
45
|
+
|
46
|
+
BUNDLED WITH
|
47
|
+
2.0.2
|
data/README.md
CHANGED
@@ -1,14 +1,8 @@
|
|
1
|
-
|
1
|
+
# Argy
|
2
2
|
|
3
|
-
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/argy`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
4
|
|
5
|
-
|
6
|
-

|
7
|
-
[](https://coveralls.io/github/rzane/argy?branch=master)
|
8
|
-
|
9
|
-
</div>
|
10
|
-
|
11
|
-
Yet another command-line option parser.
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
12
6
|
|
13
7
|
## Installation
|
14
8
|
|
@@ -28,81 +22,17 @@ Or install it yourself as:
|
|
28
22
|
|
29
23
|
## Usage
|
30
24
|
|
31
|
-
|
32
|
-
|
33
|
-
```ruby
|
34
|
-
require "argy"
|
35
|
-
|
36
|
-
parser = Argy.new do |o|
|
37
|
-
o.description "Prints messages"
|
38
|
-
o.usage "example"
|
39
|
-
o.example "$ example hello"
|
40
|
-
|
41
|
-
o.argument :message, desc: "message to print", required: true
|
42
|
-
|
43
|
-
o.option :loud, type: :boolean, desc: "say the message loudly"
|
44
|
-
o.option :count, type: :integer, desc: "number of times to print", default: 1
|
45
|
-
|
46
|
-
o.on "-v", "print the verison and exit" do
|
47
|
-
puts Example::VERSION
|
48
|
-
exit
|
49
|
-
end
|
50
|
-
|
51
|
-
o.on "-h", "--help", "show this help and exit" do
|
52
|
-
puts o.help
|
53
|
-
puts o.help.section "SECTION"
|
54
|
-
puts o.help.entry "foo", desc: "bar"
|
55
|
-
exit
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
begin
|
60
|
-
options = parser.parse(ARGV)
|
61
|
-
message = options.message
|
62
|
-
message = message.upcase if options.loud?
|
63
|
-
options.count.times { puts message }
|
64
|
-
rescue Argy::Error => err
|
65
|
-
abort err.message
|
66
|
-
end
|
67
|
-
```
|
68
|
-
|
69
|
-
## Option Types
|
70
|
-
|
71
|
-
Argy supports the following option types:
|
72
|
-
|
73
|
-
- `:string`
|
74
|
-
- `:boolean`
|
75
|
-
- `:integer`
|
76
|
-
- `:float`
|
77
|
-
- `:array`
|
78
|
-
- `:pathname`
|
25
|
+
TODO: Write usage instructions here
|
79
26
|
|
80
|
-
|
27
|
+
## Development
|
81
28
|
|
82
|
-
|
83
|
-
class NameOption
|
84
|
-
def self.call(input)
|
85
|
-
parts = input.split(" ")
|
86
|
-
raise Argy::CoersionError, "Invalid name" if parts.length != 2
|
87
|
-
new(*parts)
|
88
|
-
end
|
89
|
-
|
90
|
-
def initialize(first, last)
|
91
|
-
@first = first
|
92
|
-
@last = last
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
Argy.new do |o|
|
97
|
-
o.option :name, type: NameOption
|
98
|
-
end
|
99
|
-
```
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
100
30
|
|
101
|
-
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
102
32
|
|
103
33
|
## Contributing
|
104
34
|
|
105
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/argy. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
106
36
|
|
107
37
|
## License
|
108
38
|
|
@@ -110,4 +40,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
110
40
|
|
111
41
|
## Code of Conduct
|
112
42
|
|
113
|
-
Everyone interacting in the Argy project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
43
|
+
Everyone interacting in the Argy project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/argy/blob/master/CODE_OF_CONDUCT.md).
|
data/Rakefile
CHANGED
data/argy.gemspec
CHANGED
@@ -8,12 +8,9 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["Ray Zane"]
|
9
9
|
spec.email = ["raymondzane@gmail.com"]
|
10
10
|
|
11
|
-
spec.summary = %q{
|
11
|
+
spec.summary = %q{A fully featured option parser.}
|
12
12
|
spec.license = "MIT"
|
13
13
|
|
14
|
-
spec.metadata["source_code_uri"] = "https://github.com/rzane/argy"
|
15
|
-
spec.metadata["documentation_uri"] = "https://rubydoc.info/github/rzane/argy"
|
16
|
-
|
17
14
|
# Specify which files should be added to the gem when it is released.
|
18
15
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
19
16
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
@@ -24,6 +21,6 @@ Gem::Specification.new do |spec|
|
|
24
21
|
spec.require_paths = ["lib"]
|
25
22
|
|
26
23
|
spec.add_development_dependency "bundler", "~> 2.0"
|
27
|
-
spec.add_development_dependency "rake", "~>
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
25
|
spec.add_development_dependency "rspec", "~> 3.0"
|
29
26
|
end
|
data/bin/example
CHANGED
@@ -3,30 +3,16 @@
|
|
3
3
|
require "bundler/setup"
|
4
4
|
require "argy"
|
5
5
|
|
6
|
-
|
7
|
-
o.description "Prints messages"
|
6
|
+
options = Argy.parse(ARGV) do |o|
|
8
7
|
o.usage "example"
|
9
|
-
o.
|
10
|
-
o.
|
11
|
-
o.
|
12
|
-
o.option :
|
8
|
+
o.description "A cool thing that does stuff"
|
9
|
+
o.example "$ example foo"
|
10
|
+
o.argument :jint, desc: "do a thing"
|
11
|
+
o.option :fizz, required: true, desc: "blah"
|
12
|
+
o.option :foo_bar, aliases: ["-f"], default: "jawn"
|
13
13
|
o.on "-v", "print the verison and exit" do
|
14
14
|
puts Argy::VERSION
|
15
|
-
exit
|
16
|
-
end
|
17
|
-
o.on "-h", "--help", "show this help and exit" do
|
18
|
-
puts o.help
|
19
|
-
puts o.help.section "SECTION"
|
20
|
-
puts o.help.entry "foo", desc: "bar"
|
21
|
-
exit
|
22
15
|
end
|
23
16
|
end
|
24
17
|
|
25
|
-
|
26
|
-
options = parser.parse(ARGV)
|
27
|
-
message = options.message
|
28
|
-
message = message.upcase if options.loud?
|
29
|
-
options.times.times { puts message }
|
30
|
-
rescue Argy::Error => err
|
31
|
-
abort err.message
|
32
|
-
end
|
18
|
+
puts options
|
data/lib/argy.rb
CHANGED
@@ -2,50 +2,16 @@ require "argy/version"
|
|
2
2
|
require "argy/parser"
|
3
3
|
|
4
4
|
module Argy
|
5
|
-
# Base class for all of Argy's errors.
|
6
5
|
Error = Class.new(StandardError)
|
7
|
-
|
8
|
-
# An error that is raised when an option
|
9
|
-
# cannot be coerced to the correct type
|
10
6
|
CoersionError = Class.new(Error)
|
11
|
-
|
12
|
-
# An error that is raised when an option
|
13
|
-
# is not valid.
|
14
7
|
ValidationError = Class.new(Error)
|
8
|
+
MissingArgumentError = Class.new(Error)
|
15
9
|
|
16
|
-
# An error that is raised when parsing fails.
|
17
|
-
class ParseError < Error
|
18
|
-
# The original error from OptionParser.
|
19
|
-
# @return [OptionParser::ParseError]
|
20
|
-
attr_reader :original
|
21
|
-
|
22
|
-
def initialize(original)
|
23
|
-
@original = original
|
24
|
-
super(original.message)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# Define a new parser.
|
29
|
-
# @see Parser
|
30
|
-
# @example
|
31
|
-
# parser = Argy.new do |o|
|
32
|
-
# o.argument :input, desc: "the input file"
|
33
|
-
# o.option :verbose, type: :boolean
|
34
|
-
# end
|
35
|
-
#
|
36
|
-
# options = parser.parse(ARGV)
|
37
10
|
def self.new(&block)
|
38
11
|
Argy::Parser.new(&block)
|
39
12
|
end
|
40
13
|
|
41
|
-
|
42
|
-
# @see Parser
|
43
|
-
# @example
|
44
|
-
# options = Argy.parse do
|
45
|
-
# o.argument :input, desc: "the input file"
|
46
|
-
# o.option :verbose, type: :boolean
|
47
|
-
# end
|
48
|
-
def self.parse(argv: ARGV, &block)
|
14
|
+
def self.parse(argv, &block)
|
49
15
|
new(&block).parse(argv)
|
50
16
|
end
|
51
17
|
end
|
data/lib/argy/argument.rb
CHANGED
data/lib/argy/help.rb
CHANGED
@@ -1,18 +1,11 @@
|
|
1
1
|
module Argy
|
2
|
-
# Builds help information
|
3
2
|
class Help
|
4
|
-
# Create a new Help
|
5
|
-
# @param parser [Parser] the parser to generate help for
|
6
|
-
# @param column [Integer] the column width of the help
|
7
|
-
# @param color [TrueClass,FalseClass] whether or not to print with color
|
8
3
|
def initialize(parser, column: 30, color: $stdout.tty?)
|
9
4
|
@parser = parser
|
10
5
|
@column = column
|
11
6
|
@color = color
|
12
7
|
end
|
13
8
|
|
14
|
-
# The help information
|
15
|
-
# @return [String]
|
16
9
|
def to_s
|
17
10
|
out = []
|
18
11
|
|
@@ -26,26 +19,6 @@ module Argy
|
|
26
19
|
out.join("\n") + "\n"
|
27
20
|
end
|
28
21
|
|
29
|
-
# Format the title of a custom section
|
30
|
-
# @return [String]
|
31
|
-
def section(title)
|
32
|
-
bold "\n#{title}"
|
33
|
-
end
|
34
|
-
|
35
|
-
# Format an entry of a section
|
36
|
-
# @param name [String] left column of the entry
|
37
|
-
# @param desc [String] right column of the entry
|
38
|
-
# @param required [TrueClass,FalseClass] whether or not the entry is required
|
39
|
-
# @param default [Object] default value for the entry
|
40
|
-
# @return [String]
|
41
|
-
def entry(name, desc: nil, required: false, default: nil)
|
42
|
-
out = " #{name.ljust(column)}"
|
43
|
-
out += dim("#{desc} ") if desc
|
44
|
-
out += dim("(required) ") if required
|
45
|
-
out += dim("[default: #{default.inspect}]") if default
|
46
|
-
out.rstrip
|
47
|
-
end
|
48
|
-
|
49
22
|
private
|
50
23
|
|
51
24
|
def description(out)
|
@@ -68,7 +41,7 @@ module Argy
|
|
68
41
|
end
|
69
42
|
|
70
43
|
def argument(a)
|
71
|
-
|
44
|
+
parameter(a.label, a.desc, a.required?, a.default)
|
72
45
|
end
|
73
46
|
|
74
47
|
def options(out)
|
@@ -79,18 +52,19 @@ module Argy
|
|
79
52
|
def option(o)
|
80
53
|
label = [option_label(o.label, o.type)]
|
81
54
|
label += o.aliases.map { |a| option_label(a, o.type) }
|
82
|
-
|
55
|
+
parameter(label.join(", "), o.desc, o.required?, o.default)
|
83
56
|
end
|
84
57
|
|
85
58
|
def flags(out)
|
86
|
-
out << bold("\nFLAGS")
|
59
|
+
out << bold("\nFLAGS")
|
87
60
|
out.concat parser.flags.map { |f, _| flag(f) }
|
61
|
+
out << parameter("--help, -h", "show this help and exit")
|
88
62
|
end
|
89
63
|
|
90
64
|
def flag(flag)
|
91
65
|
flag = flag.dup
|
92
66
|
desc = flag.pop unless flag.last.match?(/^-/)
|
93
|
-
|
67
|
+
parameter(flag.reverse.join(", "), desc)
|
94
68
|
end
|
95
69
|
|
96
70
|
def option_label(label, type)
|
@@ -98,6 +72,14 @@ module Argy
|
|
98
72
|
label.start_with?("--") ? "#{label}=VALUE" : "#{label} VALUE"
|
99
73
|
end
|
100
74
|
|
75
|
+
def parameter(left, right, required = false, default = nil)
|
76
|
+
label = " #{left.ljust(column)}"
|
77
|
+
label += dim("#{right} ") if right
|
78
|
+
label += dim("(required) ") if required
|
79
|
+
label += dim("[default: #{default.inspect}]") if default
|
80
|
+
label.rstrip
|
81
|
+
end
|
82
|
+
|
101
83
|
def bold(text)
|
102
84
|
color? ? "\e[1m#{text}\e[0m" : text
|
103
85
|
end
|
data/lib/argy/option.rb
CHANGED
@@ -1,26 +1,14 @@
|
|
1
1
|
require "argy/parameter"
|
2
2
|
|
3
3
|
module Argy
|
4
|
-
# An option to be parsed from the command line
|
5
4
|
class Option < Parameter
|
6
|
-
# A list of alternative flags
|
7
|
-
# @return [Array<String>]
|
8
5
|
attr_reader :aliases
|
9
6
|
|
10
|
-
# Create a new Option
|
11
|
-
# @param name [Symbol] name of the parameter
|
12
|
-
# @param aliases [Array<String>] a list of alternative flags
|
13
|
-
# @param desc [String,nil] description for the parameter
|
14
|
-
# @param type [Symbol,#call] type of parameter
|
15
|
-
# @param default [Object] default value for the parameter
|
16
|
-
# @param required [TrueClass,FalseClass] whether or not the field is required
|
17
7
|
def initialize(*args, aliases: [], **opts)
|
18
8
|
super(*args, **opts)
|
19
9
|
@aliases = aliases
|
20
10
|
end
|
21
11
|
|
22
|
-
# The display label for the argument
|
23
|
-
# @return [String]
|
24
12
|
def label
|
25
13
|
case type
|
26
14
|
when :boolean
|
@@ -30,7 +18,6 @@ module Argy
|
|
30
18
|
end
|
31
19
|
end
|
32
20
|
|
33
|
-
# @private
|
34
21
|
def to_option_parser
|
35
22
|
options = []
|
36
23
|
options << aliases.join(" ") unless aliases.empty?
|
data/lib/argy/parameter.rb
CHANGED
@@ -1,31 +1,9 @@
|
|
1
|
-
require "pathname"
|
2
1
|
require "argy/parameter"
|
3
2
|
|
4
3
|
module Argy
|
5
|
-
# @abstract Subclasses must implement {#label}
|
6
4
|
class Parameter
|
7
|
-
|
8
|
-
# @return [String]
|
9
|
-
attr_reader :name
|
5
|
+
attr_reader :name, :type, :default, :desc
|
10
6
|
|
11
|
-
# The type of the parameter
|
12
|
-
# @return [String]
|
13
|
-
attr_reader :type
|
14
|
-
|
15
|
-
# The default value for the parameter
|
16
|
-
# @return [Object]
|
17
|
-
attr_reader :default
|
18
|
-
|
19
|
-
# The description for the parameter
|
20
|
-
# @return [String]
|
21
|
-
attr_reader :desc
|
22
|
-
|
23
|
-
# Create a new Parameter
|
24
|
-
# @param name [Symbol] name of the parameter
|
25
|
-
# @param desc [String,nil] description for the parameter
|
26
|
-
# @param type [Symbol,#call] type of parameter
|
27
|
-
# @param default [Object] default value for the parameter
|
28
|
-
# @param required [TrueClass,FalseClass] whether or not the field is required
|
29
7
|
def initialize(name, desc: nil, type: :string, default: nil, required: false)
|
30
8
|
@name = name
|
31
9
|
@type = type
|
@@ -34,33 +12,20 @@ module Argy
|
|
34
12
|
@required = required
|
35
13
|
end
|
36
14
|
|
37
|
-
# The display label for the paramter
|
38
|
-
# @abstract
|
39
|
-
# @return [String]
|
40
15
|
def label
|
41
16
|
raise NotImplementedError, __method__
|
42
17
|
end
|
43
18
|
|
44
|
-
# Check if the parameter is required
|
45
|
-
# @return [TrueClass,FalseClass]
|
46
19
|
def required?
|
47
20
|
@required
|
48
21
|
end
|
49
22
|
|
50
|
-
# Validates a value.
|
51
|
-
# @return [Object] the value
|
52
|
-
# @raise [ValidationError] if the valid is invalid
|
53
23
|
def validate(value)
|
54
24
|
if required? && value.nil?
|
55
25
|
raise ValidationError, "`#{label}` is a required parameter"
|
56
26
|
end
|
57
|
-
|
58
|
-
value
|
59
27
|
end
|
60
28
|
|
61
|
-
# Coerces a value to the correct type.
|
62
|
-
# @param value [Object] the value to coerce
|
63
|
-
# @raise [CoersionError] if the value cannot be coerced
|
64
29
|
def coerce(value)
|
65
30
|
case type
|
66
31
|
when :string, :boolean
|
data/lib/argy/parser.rb
CHANGED
@@ -2,26 +2,10 @@ require "optparse"
|
|
2
2
|
require "argy/help"
|
3
3
|
require "argy/option"
|
4
4
|
require "argy/argument"
|
5
|
-
require "argy/options"
|
6
5
|
|
7
6
|
module Argy
|
8
|
-
# Parses command line arguments.
|
9
7
|
class Parser
|
10
|
-
|
11
|
-
# @return [Array<String>]
|
12
|
-
attr_reader :examples
|
13
|
-
|
14
|
-
# The arguments that were declared
|
15
|
-
# @return [Array<Argument>]
|
16
|
-
attr_reader :arguments
|
17
|
-
|
18
|
-
# The options that were declared
|
19
|
-
# @return [Array<Option>]
|
20
|
-
attr_reader :options
|
21
|
-
|
22
|
-
# The flags that were declared
|
23
|
-
# @return [Array<Array(Array<String>, Proc)>]
|
24
|
-
attr_reader :flags
|
8
|
+
attr_reader :examples, :arguments, :options, :flags
|
25
9
|
|
26
10
|
def initialize
|
27
11
|
@usage = $0
|
@@ -33,131 +17,60 @@ module Argy
|
|
33
17
|
yield self if block_given?
|
34
18
|
end
|
35
19
|
|
36
|
-
# Gets or sets the usage for your program. If the
|
37
|
-
# provided usage is nil, the usage will not change.
|
38
|
-
# @param usage [String,nil] sets the usage if not nil
|
39
|
-
# @return [String] usage
|
40
|
-
# @example
|
41
|
-
# Argy.new do |o|
|
42
|
-
# o.usage "example [INPUT]"
|
43
|
-
# end
|
44
20
|
def usage(usage = nil)
|
45
21
|
@usage = usage if usage
|
46
22
|
@usage
|
47
23
|
end
|
48
24
|
|
49
|
-
# Gets or sets a description for your program. If the
|
50
|
-
# provided description is nil, the description will
|
51
|
-
# not change.
|
52
|
-
# @param description [String,nil]
|
53
|
-
# @return [String]
|
54
|
-
# @example
|
55
|
-
# Argy.new do |o|
|
56
|
-
# o.description "a really useful program"
|
57
|
-
# end
|
58
25
|
def description(description = nil)
|
59
26
|
@description = description if description
|
60
27
|
@description
|
61
28
|
end
|
62
29
|
|
63
|
-
# Adds an example
|
64
|
-
# @example
|
65
|
-
# Argy.new do |o|
|
66
|
-
# o.example "$ example foo"
|
67
|
-
# end
|
68
30
|
def example(example)
|
69
31
|
@examples << example
|
70
32
|
end
|
71
33
|
|
72
|
-
|
73
|
-
|
74
|
-
# @example
|
75
|
-
# Argy.new do |o|
|
76
|
-
# o.argument :input
|
77
|
-
# end
|
78
|
-
def argument(*args, **opts)
|
79
|
-
@arguments << Argument.new(*args, **opts)
|
34
|
+
def argument(*args)
|
35
|
+
@arguments << Argument.new(*args)
|
80
36
|
end
|
81
37
|
|
82
|
-
|
83
|
-
|
84
|
-
# @example
|
85
|
-
# Argy.new do |o|
|
86
|
-
# o.option :verbose, type: :boolean
|
87
|
-
# end
|
88
|
-
def option(*args, **opts)
|
89
|
-
@options << Option.new(*args, **opts)
|
38
|
+
def option(*args)
|
39
|
+
@options << Option.new(*args)
|
90
40
|
end
|
91
41
|
|
92
|
-
# Adds a flag
|
93
|
-
# @example
|
94
|
-
# Argy.new do |o|
|
95
|
-
# o.on "-v", "--version" do
|
96
|
-
# puts Example::VERSION
|
97
|
-
# exit
|
98
|
-
# end
|
99
|
-
# end
|
100
42
|
def on(*args, &action)
|
101
43
|
@flags << [args, action]
|
102
44
|
end
|
103
45
|
|
104
|
-
# All parameters that are defined
|
105
|
-
# @return [Array<Argument, Option>]
|
106
46
|
def parameters
|
107
47
|
arguments + options
|
108
48
|
end
|
109
49
|
|
110
|
-
# Generate help for this parser.
|
111
|
-
# @see Help#initialize
|
112
|
-
# @return [Help]
|
113
50
|
def help(**opts)
|
114
51
|
Help.new(self, **opts)
|
115
52
|
end
|
116
53
|
|
117
|
-
# Build the default values for the declared paramters.
|
118
|
-
# @return [Hash{Symbol => Object}]
|
119
54
|
def default_values
|
120
|
-
|
55
|
+
(arguments + options).reduce(unused_arguments: []) do |acc, opt|
|
121
56
|
acc[opt.name] = opt.default
|
122
57
|
acc
|
123
58
|
end
|
124
59
|
end
|
125
60
|
|
126
|
-
|
127
|
-
# @param argv [Array<String>] the command line arguments to parse
|
128
|
-
# @param strategy [Symbol,nil] can be either `:order` or `:permute`. See
|
129
|
-
# `OptionParser#order!` and `OptionParser#permute!` for more info.
|
130
|
-
# @raise [ParseError] when the arguments can't be parsed
|
131
|
-
# @return [Hash{Symbol => Object}]
|
132
|
-
def parse(argv, strategy: nil)
|
61
|
+
def parse(argv)
|
133
62
|
argv = argv.dup
|
134
63
|
values = default_values
|
135
|
-
parser = build_parser(values)
|
136
64
|
|
137
|
-
|
138
|
-
|
139
|
-
parser.order!(argv)
|
140
|
-
when :permute
|
141
|
-
parser.permute!(argv)
|
142
|
-
else
|
143
|
-
parser.parse!(argv)
|
144
|
-
end
|
65
|
+
parser = build_parser(values)
|
66
|
+
parser.parse!(argv)
|
145
67
|
|
146
68
|
populate_arguments(values, argv)
|
147
|
-
|
148
|
-
rescue OptionParser::ParseError => error
|
149
|
-
raise ParseError.new(error)
|
150
|
-
end
|
69
|
+
validate!(values)
|
151
70
|
|
152
|
-
# Validate the values
|
153
|
-
# @param values [Hash{Symbol => Object}]
|
154
|
-
# @return [Hash{Symbol => Object}]
|
155
|
-
# @raise [ValidationError] when the input is invalid
|
156
|
-
def validate!(values)
|
157
|
-
parameters.each do |param|
|
158
|
-
param.validate(values[param.name])
|
159
|
-
end
|
160
71
|
values
|
72
|
+
rescue OptionParser::MissingArgument => error
|
73
|
+
raise MissingArgumentError, error.message
|
161
74
|
end
|
162
75
|
|
163
76
|
private
|
@@ -165,13 +78,19 @@ module Argy
|
|
165
78
|
def populate_arguments(values, argv)
|
166
79
|
argv.zip(arguments).each do |value, arg|
|
167
80
|
if arg.nil?
|
168
|
-
values[:
|
81
|
+
values[:unused_arguments] << value
|
169
82
|
else
|
170
83
|
values[arg.name] = arg.coerce(value)
|
171
84
|
end
|
172
85
|
end
|
173
86
|
end
|
174
87
|
|
88
|
+
def validate!(values)
|
89
|
+
parameters.each do |param|
|
90
|
+
param.validate(values[param.name])
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
175
94
|
def build_parser(values)
|
176
95
|
OptionParser.new do |o|
|
177
96
|
options.each do |opt|
|
@@ -183,6 +102,11 @@ module Argy
|
|
183
102
|
flags.each do |flag, action|
|
184
103
|
o.on(*flag, &action)
|
185
104
|
end
|
105
|
+
|
106
|
+
o.on("-h", "--help") do
|
107
|
+
puts help
|
108
|
+
exit
|
109
|
+
end
|
186
110
|
end
|
187
111
|
end
|
188
112
|
end
|
data/lib/argy/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: argy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ray Zane
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '10.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '10.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,13 +59,12 @@ executables: []
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
-
- ".github/workflows/build.yml"
|
63
|
-
- ".github/workflows/publish.yml"
|
64
62
|
- ".gitignore"
|
65
63
|
- ".rspec"
|
66
|
-
- ".
|
64
|
+
- ".travis.yml"
|
67
65
|
- CODE_OF_CONDUCT.md
|
68
66
|
- Gemfile
|
67
|
+
- Gemfile.lock
|
69
68
|
- LICENSE.txt
|
70
69
|
- README.md
|
71
70
|
- Rakefile
|
@@ -77,16 +76,13 @@ files:
|
|
77
76
|
- lib/argy/argument.rb
|
78
77
|
- lib/argy/help.rb
|
79
78
|
- lib/argy/option.rb
|
80
|
-
- lib/argy/options.rb
|
81
79
|
- lib/argy/parameter.rb
|
82
80
|
- lib/argy/parser.rb
|
83
81
|
- lib/argy/version.rb
|
84
82
|
homepage:
|
85
83
|
licenses:
|
86
84
|
- MIT
|
87
|
-
metadata:
|
88
|
-
source_code_uri: https://github.com/rzane/argy
|
89
|
-
documentation_uri: https://rubydoc.info/github/rzane/argy
|
85
|
+
metadata: {}
|
90
86
|
post_install_message:
|
91
87
|
rdoc_options: []
|
92
88
|
require_paths:
|
@@ -102,8 +98,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
98
|
- !ruby/object:Gem::Version
|
103
99
|
version: '0'
|
104
100
|
requirements: []
|
105
|
-
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 2.6.14
|
106
103
|
signing_key:
|
107
104
|
specification_version: 4
|
108
|
-
summary:
|
105
|
+
summary: A fully featured option parser.
|
109
106
|
test_files: []
|
data/.github/workflows/build.yml
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
name: Build
|
2
|
-
on: [push]
|
3
|
-
jobs:
|
4
|
-
build:
|
5
|
-
runs-on: ubuntu-latest
|
6
|
-
steps:
|
7
|
-
- name: Checkout
|
8
|
-
uses: actions/checkout@v2
|
9
|
-
|
10
|
-
- name: Setup Ruby
|
11
|
-
uses: actions/setup-ruby@v1
|
12
|
-
with:
|
13
|
-
ruby-version: 2.7.x
|
14
|
-
|
15
|
-
- name: Install bundler
|
16
|
-
run: gem install bundler
|
17
|
-
|
18
|
-
- name: Install dependencies
|
19
|
-
run: bundle install
|
20
|
-
|
21
|
-
- name: Test
|
22
|
-
run: bundle exec rspec
|
@@ -1,38 +0,0 @@
|
|
1
|
-
name: Publish
|
2
|
-
on:
|
3
|
-
release:
|
4
|
-
types: [published]
|
5
|
-
jobs:
|
6
|
-
publish:
|
7
|
-
runs-on: ubuntu-latest
|
8
|
-
steps:
|
9
|
-
- name: Checkout
|
10
|
-
uses: actions/checkout@v2
|
11
|
-
|
12
|
-
- name: Setup Ruby
|
13
|
-
uses: actions/setup-ruby@v1
|
14
|
-
with:
|
15
|
-
ruby-version: 2.7.x
|
16
|
-
|
17
|
-
- name: Install bundler
|
18
|
-
run: gem install bundler
|
19
|
-
|
20
|
-
- name: Install dependencies
|
21
|
-
run: bundle install
|
22
|
-
|
23
|
-
- name: Test
|
24
|
-
run: bundle exec rspec
|
25
|
-
|
26
|
-
- name: Set version
|
27
|
-
run: perl -pi -e "s/0\.0\.0/${GITHUB_REF:11}/" lib/graphql/extras/version.rb
|
28
|
-
|
29
|
-
- name: Publish
|
30
|
-
run: |
|
31
|
-
mkdir -p $HOME/.gem
|
32
|
-
touch $HOME/.gem/credentials
|
33
|
-
chmod 0600 $HOME/.gem/credentials
|
34
|
-
printf -- "---\n:rubygems_api_key: ${RUBYGEMS_TOKEN}\n" > $HOME/.gem/credentials
|
35
|
-
gem build *.gemspec
|
36
|
-
gem push *.gem
|
37
|
-
env:
|
38
|
-
RUBYGEMS_TOKEN: ${{ secrets.RUBYGEMS_TOKEN }}
|
data/.yardopts
DELETED
data/lib/argy/options.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
module Argy
|
2
|
-
# The resulting options that were parsed from the command line.
|
3
|
-
# @example Getting a value
|
4
|
-
# options = Options.new(foo: "bar")
|
5
|
-
# options.foo #=> "bar"
|
6
|
-
# @example Querying for a value's truthiness
|
7
|
-
# options = Options.new(foo: "bar")
|
8
|
-
# options.foo? #=> true
|
9
|
-
class Options
|
10
|
-
# Create a new Options
|
11
|
-
# @param values [Hash{Symbol => Object}]
|
12
|
-
def initialize(values)
|
13
|
-
@values = values
|
14
|
-
end
|
15
|
-
|
16
|
-
# The values as a hash
|
17
|
-
# @return [Hash{Symbol => Object}]
|
18
|
-
def to_h
|
19
|
-
@values
|
20
|
-
end
|
21
|
-
|
22
|
-
# Get a value by key
|
23
|
-
# @see Hash#[]
|
24
|
-
def [](key)
|
25
|
-
@values[key]
|
26
|
-
end
|
27
|
-
|
28
|
-
# Fetch a value by key or provide a default.
|
29
|
-
# @see Hash#fetch
|
30
|
-
def fetch(*args, &block)
|
31
|
-
@values.fetch(*args, &block)
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def respond_to_missing?(meth, *)
|
37
|
-
@values.key?(meth.to_s.sub(/\?$/, "").to_sym) || super
|
38
|
-
end
|
39
|
-
|
40
|
-
def method_missing(meth, *args)
|
41
|
-
query = meth[-1] == "?"
|
42
|
-
key = query ? meth[0..-2].to_sym : meth.to_sym
|
43
|
-
|
44
|
-
return super unless @values.key?(key)
|
45
|
-
|
46
|
-
unless args.empty?
|
47
|
-
raise ArgumentError, "wrong number of arguments (given #{args.length}, expected 0)"
|
48
|
-
end
|
49
|
-
|
50
|
-
query ? !!@values[key] : @values[key]
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|