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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: ec2b0f6174b9f0028d6faea23e75dd14feaefdf78e6f75d0755340b1af6939cd
4
- data.tar.gz: 962b784ed0a400ddd3aa447b7c21c0db27045078c057b130ffd748b99fc864f5
2
+ SHA1:
3
+ metadata.gz: dff9d90b687d261bae2c0820b5ea7b7f812d472d
4
+ data.tar.gz: 5543ca5b69b14891cbd8e1744df8b7b7480edcd0
5
5
  SHA512:
6
- metadata.gz: 6afb2e4476f88bb3c6b9b56be0aaa3ecad8cf902bcce45b4cb3e121775d5d3fc4dd718b8112c70021a94a400007cc1cfbb8feca06d4779508a81d7293aa81ea0
7
- data.tar.gz: 3111687814a6fa0358b2530cde1e3b19c89be0999903d9a999e93a6d3e24f996816629595f1c90e9d8cfa74267acd5d605a89d3363b4320e68395151d7efc967
6
+ metadata.gz: 3ee7ec946a02ce9200fbf9318d708e5ae1a652092f9891050253e34b0ad628ba1aad81e0aa1431e655ebb20a1805b79d3e0800be67e9ed881cb7ad4a5c98673e
7
+ data.tar.gz: 8372f49e4daca19886b4850bfd1e6f04929a81a6584af4c57babccc0a9aa561bf5eaac035147c786a555e954639fe6ad5b35b301d603514db388d91a185c21a8
data/.gitignore CHANGED
@@ -9,4 +9,3 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
- /Gemfile.lock
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.5.3
7
+ before_install: gem install bundler -v 2.0.2
data/Gemfile CHANGED
@@ -3,4 +3,4 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in argy.gemspec
4
4
  gemspec
5
5
 
6
- gem "coveralls", require: false
6
+ gem 'pry'
@@ -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
- <h1 align="center">Argy</h1>
1
+ # Argy
2
2
 
3
- <div align="center">
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
- ![Build](https://github.com/rzane/argy/workflows/CI/badge.svg)
6
- ![Version](https://img.shields.io/gem/v/argy)
7
- [![Coverage Status](https://coveralls.io/repos/github/rzane/argy/badge.svg?branch=master)](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
- Here's an example:
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
- However, Argy also supports custom option types. For example:
27
+ ## Development
81
28
 
82
- ```ruby
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
- An option type is anything that responds to `call`. So, your option type could just be a lambda.
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/rzane/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.
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/rzane/argy/blob/master/CODE_OF_CONDUCT.md).
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
@@ -1,9 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
-
3
- require "coveralls/rake/task"
4
- Coveralls::RakeTask.new
5
-
6
2
  require "rspec/core/rake_task"
3
+
7
4
  RSpec::Core::RakeTask.new(:spec)
8
5
 
9
- task default: :spec
6
+ task :default => :spec
@@ -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{Yet another command-line option parser.}
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", "~> 13.0"
24
+ spec.add_development_dependency "rake", "~> 10.0"
28
25
  spec.add_development_dependency "rspec", "~> 3.0"
29
26
  end
@@ -3,30 +3,16 @@
3
3
  require "bundler/setup"
4
4
  require "argy"
5
5
 
6
- parser = Argy.new do |o|
7
- o.description "Prints messages"
6
+ options = Argy.parse(ARGV) do |o|
8
7
  o.usage "example"
9
- o.example "$ example hello"
10
- o.argument :message, desc: "message to print", required: true
11
- o.option :loud, type: :boolean, desc: "say the message loudly"
12
- o.option :times, type: :integer, desc: "number of times to print", default: 1
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
- begin
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
@@ -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
- # Define a parser and return the options in one go.
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
@@ -1,10 +1,7 @@
1
1
  require "argy/parameter"
2
2
 
3
3
  module Argy
4
- # An positional argument to be parsed from the command line
5
4
  class Argument < Parameter
6
- # The display label for the argument
7
- # @return [String]
8
5
  def label
9
6
  name.to_s.upcase
10
7
  end
@@ -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
- entry(a.label, desc: a.desc, required: a.required?, default: a.default)
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
- entry(label.join(", "), desc: o.desc, required: o.required?, default: o.default)
55
+ parameter(label.join(", "), o.desc, o.required?, o.default)
83
56
  end
84
57
 
85
58
  def flags(out)
86
- out << bold("\nFLAGS") if parser.flags.any?
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
- entry(flag.reverse.join(", "), desc: desc)
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
@@ -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?
@@ -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
- # The name of the parameter
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
@@ -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
- # The examples that were declared
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
- # Adds an argument
73
- # @see Argument#initialize
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
- # Adds an option
83
- # @see Option#initialize
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
- parameters.reduce(unused_args: []) do |acc, opt|
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
- # Build the default values for the declared paramters.
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
- case strategy
138
- when :order
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
- Options.new validate!(values)
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[:unused_args] << value
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
@@ -1,3 +1,3 @@
1
1
  module Argy
2
- VERSION = "0.0.0"
2
+ VERSION = "0.1.0"
3
3
  end
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.0.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: 2020-07-20 00:00:00.000000000 Z
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: '13.0'
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: '13.0'
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
- - ".yardopts"
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
- rubygems_version: 3.1.2
101
+ rubyforge_project:
102
+ rubygems_version: 2.6.14
106
103
  signing_key:
107
104
  specification_version: 4
108
- summary: Yet another command-line option parser.
105
+ summary: A fully featured option parser.
109
106
  test_files: []
@@ -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
@@ -1,6 +0,0 @@
1
- --output-dir=doc/api
2
- --embed-mixins
3
- --protected
4
- --no-private
5
- --markup-provider=redcarpet
6
- --markup=markdown
@@ -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