Skip to content

Commit fc9135c

Browse files
committed
unknown model item
1 parent cdf1e7c commit fc9135c

File tree

9 files changed

+91
-9
lines changed

9 files changed

+91
-9
lines changed

shard.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: optarg
2-
version: 0.5.4
2+
version: 0.5.5
33

44
authors:
55
- mosop

spec/internal/unknown_spec.cr

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
require "../spec_helper"
2+
3+
module OptargInternalSpec::Unknown
4+
class Model < Optarg::Model
5+
string "-s"
6+
unknown
7+
end
8+
9+
describe name do
10+
it "with option" do
11+
result = Model.parse(%w(-s foo bar))
12+
result.s?.should eq "foo"
13+
result.unparsed_args.should eq %w(bar)
14+
end
15+
16+
it "without different option" do
17+
result = Model.parse(%w(-b foo bar))
18+
result.unparsed_args.should eq %w(-b foo bar)
19+
end
20+
21+
it "without option" do
22+
result = Model.parse(%w(foo bar))
23+
result.unparsed_args.should eq %w(foo bar)
24+
end
25+
end
26+
end

src/lib/completion_generators/base.cr

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ module Optarg::CompletionGenerators
100100
end
101101

102102
def make_definition(df)
103+
return if df.is_a?(Definitions::Unknown)
103104
@keymap[df.key] = @keymap.size
104105
add_key df
105106
add_act df

src/lib/definition_set.cr

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ module Optarg
3636
__set Definitions::Terminator, terminators
3737
__set DefinitionMixins::Value, values
3838
__set Definitions::StringArrayArgument, string_array_arguments
39+
__set Definitions::Unknown, unknowns
3940
end
4041

4142
getter all = {} of String => Definitions::Base
@@ -44,6 +45,7 @@ module Optarg
4445
getter value_options = {} of String => DefinitionMixins::ValueOption
4546
getter handlers = {} of String => Definitions::Handler
4647
getter terminators = {} of String => Definitions::Terminator
48+
getter unknowns = {} of String => Definitions::Unknown
4749
getter values = {} of String => DefinitionMixins::Value
4850
getter string_array_arguments = {} of String => Definitions::StringArrayArgument
4951

src/lib/definitions/base.cr

+7-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module Optarg::Definitions
77
getter names : Array(String)
88
getter metadata : Metadata
99

10-
def initialize(names : String | Array(String), metadata : Metadata? = nil, stop : Bool? = nil, terminate : Bool? = nil, complete : String | Symbol | Array(String) | Nil = nil)
10+
def initialize(names : String | Array(String), metadata : Metadata? = nil, stop : Bool? = nil, terminate : Bool? = nil, complete : String | Symbol | Array(String) | Nil = nil, unknown : Bool? = nil)
1111
@names = case names
1212
when String
1313
[names]
@@ -18,6 +18,7 @@ module Optarg::Definitions
1818
@metadata.definition = self
1919
@stops = !!stop
2020
@terminates = !!terminate
21+
@unknown = !!unknown
2122
initialize_completion complete: (complete || "")
2223
end
2324

@@ -31,6 +32,11 @@ module Optarg::Definitions
3132
@terminates.as(Bool)
3233
end
3334

35+
@unknown : Bool?
36+
def unknown?
37+
@unknown.as(Bool)
38+
end
39+
3440
def key
3541
@names[0]
3642
end

src/lib/definitions/unknown.cr

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module Optarg::Definitions
2+
class Unknown < Base
3+
def initialize(metadata = nil)
4+
super "@unknown", metadata: metadata, unknown: true
5+
end
6+
7+
def completion_length(gen)
8+
1
9+
end
10+
11+
def completion_max_occurs(gen)
12+
1
13+
end
14+
end
15+
end

src/lib/model/dsl/unknown.cr

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module Optarg
2+
class Model
3+
# Defines an unknown model item.
4+
macro unknown(metadata = nil)
5+
%unknown = ::Optarg::Definitions::Unknown.new(metadata: {{metadata}})
6+
@@__klass.definitions << %unknown
7+
end
8+
end
9+
end

src/lib/parser.cr

+29-6
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ module Optarg
6060
# :nodoc:
6161
def stopped?
6262
return false if parsed_nodes.size == 0
63-
return parsed_nodes.last[:definitions].any?{|i| i.stops? || i.terminates?}
63+
return parsed_nodes.last[:definitions].any?{|i| i.stops? || i.terminates? || i.unknown?}
6464
end
6565

6666
on_validate do |o|
@@ -101,13 +101,21 @@ module Optarg
101101
def visit
102102
arg = self[0]
103103
if visit_terminator
104-
elsif arg =~ /^-\w\w/
104+
return
105+
end
106+
if arg =~ /^-\w\w/
105107
visit_concatenated_options
106-
elsif arg =~ /^-/
107-
visit_option
108-
else
109-
visit_argument
108+
return
110109
end
110+
if arg =~ /^-/
111+
begin
112+
visit_option
113+
return
114+
rescue ex : UnknownOption
115+
raise ex if definitions.unknowns.empty?
116+
end
117+
end
118+
visit_argument
111119
end
112120

113121
# :nodoc:
@@ -157,6 +165,15 @@ module Optarg
157165

158166
# :nodoc:
159167
def visit_argument
168+
if definitions.unknowns.empty?
169+
visit_argument2
170+
else
171+
visit_unknown
172+
end
173+
end
174+
175+
# :nodoc:
176+
def visit_argument2
160177
while @argument_index < definitions.arguments.size
161178
df = definitions.argument_list[@argument_index]
162179
unless df.visitable?(self)
@@ -175,6 +192,12 @@ module Optarg
175192
@index += 1
176193
end
177194

195+
# :nodoc:
196+
def visit_unknown
197+
node = Parser.new_node(%w(), definitions.unknowns.first[1])
198+
@parsed_nodes << node
199+
end
200+
178201
# :nodoc:
179202
def [](*args)
180203
input_args[@index..-1][*args]

src/version.cr

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module Optarg
2-
VERSION = "0.5.4"
2+
VERSION = "0.5.5"
33
end

0 commit comments

Comments
 (0)