Skip to content

Commit

Permalink
Change to collapse parser various arguments into parameters list
Browse files Browse the repository at this point in the history
  • Loading branch information
piotrmurach committed Mar 27, 2020
1 parent a078347 commit b239530
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 24 deletions.
6 changes: 4 additions & 2 deletions lib/tty/option.rb
Expand Up @@ -11,6 +11,9 @@ module Option
# Raised when number of arguments doesn't match
InvalidArity = Class.new(Error)

# Raised when attempting to register already registered parameter
ParameterConflict = Class.new(Error)

# Enhance object with command line option parsing
#
# @api public
Expand All @@ -27,8 +30,7 @@ def params
end

def parse(argv = ARGV, env = ENV)
parser = Parser.new(self.class.arguments, self.class.keywords,
self.class.environments)
parser = Parser.new(self.class.parameters)
@params = parser.parse(argv, env)
end
end
Expand Down
22 changes: 9 additions & 13 deletions lib/tty/option/dsl.rb
Expand Up @@ -3,6 +3,7 @@
require_relative "parameter/argument"
require_relative "parameter/environment"
require_relative "parameter/keyword"
require_relative "parameters"

module TTY
module Option
Expand All @@ -11,7 +12,7 @@ module DSL
#
# @api public
def argument(name, **settings, &block)
arguments << Parameter::Argument.create(name.to_sym, **settings, &block)
parameters << Parameter::Argument.create(name.to_sym, **settings, &block)
end

# Specify environment variable
Expand All @@ -21,7 +22,7 @@ def argument(name, **settings, &block)
#
# @api public
def environment(name, **settings, &block)
environments << Parameter::Environment.create(name, **settings, &block)
parameters << Parameter::Environment.create(name.to_sym, **settings, &block)
end
alias env environment

Expand All @@ -32,19 +33,14 @@ def environment(name, **settings, &block)
#
# @api public
def keyword(name, **settings, &block)
keywords << Parameter::Keyword.create(name.to_sym, **settings, &block)
parameters << Parameter::Keyword.create(name.to_sym, **settings, &block)
end

def arguments
@arguments ||= []
end

def environments
@environments ||= []
end

def keywords
@keywords ||= []
# Holds all parameters
#
# @api public
def parameters
@parameters ||= Parameters.new
end
end # DSL
end # Option
Expand Down
51 changes: 51 additions & 0 deletions lib/tty/option/parameters.rb
@@ -0,0 +1,51 @@
# frozen_string_literal: true

require "set"

module TTY
module Option
# A collection to hold all parameters
class Parameters
# A list of arguments
attr_reader :arguments

# A list of keywords
attr_reader :keywords

# A list of environments
attr_reader :environments

# A list of all parameters
attr_reader :all

# A parameters list
#
# @api private
def initialize
@arguments = []
@environments = []
@keywords = []
@all = []

@registered_names = Set.new
end

# Add parameter
#
# @api public
def <<(parameter)
if @registered_names.include?(parameter.name)
raise ParameterConflict,
"already registered parameter #{parameter.name.inspect}"
else
@registered_names << parameter.name
end

@all << parameter
arr = instance_variable_get("@#{parameter.to_sym}s")
arr.send :<<, parameter
end
alias add <<
end # Parameters
end # Option
end # TTY
21 changes: 12 additions & 9 deletions lib/tty/option/parser.rb
Expand Up @@ -7,17 +7,20 @@
module TTY
module Option
class Parser
%w[
arguments
environments
keywords
].each do |name|
define_method(name) do
parameters.send(name)
end
end

attr_reader :arguments

attr_reader :environments

attr_reader :keywords
attr_reader :parameters

def initialize(arguments, keywords, environments)
@arguments = arguments
@keywords = keywords
@environments = environments
def initialize(parameters)
@parameters = parameters
end

def parse(argv, env)
Expand Down
11 changes: 11 additions & 0 deletions spec/unit/parse_spec.rb
Expand Up @@ -12,6 +12,17 @@ def new_command(&block)
end

RSpec.describe TTY::Option do
it "doesn't allow to register same name parameter" do
expect {
command do
argument :foo

keyword :foo
end
}.to raise_error(TTY::Option::ParameterConflict,
"already registered parameter :foo")
end

context "argument" do
it "reads a single argument" do
cmd = new_command do
Expand Down

0 comments on commit b239530

Please sign in to comment.