lab42_rgxargs 0.1.3 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e7ea5cf52b4dcf047e658abb12af417cbc24a055941f79645eb51f22e0697707
4
- data.tar.gz: f5970679785663ca6ea8e831cc26f060824bc6ea8f79c8f00eebd6502b4b5201
3
+ metadata.gz: 859bcfceec315a00418253c045cb8819276bafd306e52c36a9f3c1f2f0c657aa
4
+ data.tar.gz: 1cb197a190eada29279019ef914e98af7015589a8aacfd1e16e3a4c728615892
5
5
  SHA512:
6
- metadata.gz: c4d7c897da552ee32fa69d40fde98a398fbd274337fb64aa5739ebd01533807cc4e5d185512a5af75a561d805e82eacdad603dd9cba3275bb81866ad68bc71bc
7
- data.tar.gz: 45854555bb805ea65e797cc3b835f440efa2505107a73e5a6b58d4a1c884b2b8776378061a4ea5e6bc50c1a493a9b230dc9b983e39e480819ca702826b86bb6b
6
+ metadata.gz: c8c31ee9df616a66e6a0463a3778b227395cee9acabed1203d4ce46d840208d65829d9c4b48218453cd74d8f770e03538a737d5c6946cdb6486872fd964cd320
7
+ data.tar.gz: d817a9984f1853028979f179f97fd4b421a58deed2b081fa359f35351e73209b7183aabd1cf5466b86e4e0a20383d7f0b9927d369645ceaf0a47731085e5af7b
@@ -4,28 +4,42 @@ require 'lab42/enumerable'
4
4
  module Lab42
5
5
 
6
6
  class Rgxargs
7
+ require_relative 'rgxargs/checker'
8
+ require_relative 'rgxargs/constrainer'
7
9
  require_relative 'rgxargs/predefined_matchers'
8
10
  require_relative 'rgxargs/argument_matcher'
9
11
  require_relative 'rgxargs/syntax_definer'
12
+ include Checker
13
+ include Constrainer
14
+
10
15
  Predefined = PredefinedMatchers
11
16
 
12
17
  extend Forwardable
13
18
  def_delegators Predefined, :list_matcher
14
19
 
15
- attr_reader :args, :conversions, :defined_rules, :errors, :options, :syntaxes
20
+ attr_reader :allowed, :args, :conversions, :defaults, :defined_rules, :errors, :options, :required, :syntaxes
16
21
 
17
22
 
18
- def add_conversion(param, conversion)
23
+ def add_conversion(param, conversion=nil, required=nil, &block)
19
24
  case conversion
20
25
  when Symbol
21
- conversions[param] = Predefined.fetch(conversion, conversion)
26
+ _add_symbolic_conversion(param, conversion, required)
27
+ when NilClass
28
+ _add_simple_conversion(param, block)
22
29
  else
23
- conversions[param] = conversion
30
+ _add_proc_conversion(param, conversion, block, required)
24
31
  end
25
32
  end
26
33
 
27
34
  def add_syntax(rgx, parser=nil, as: nil)
28
- syntaxes << ArgumentMatcher.new(rgx, parser, arg_name: as)
35
+ case rgx
36
+ when Symbol, Regexp
37
+ syntaxes << ArgumentMatcher.new(rgx, parser, arg_name: as)
38
+ when Array
39
+ rgx.each do |rg1|
40
+ add_syntax( rg1, parser, as: as)
41
+ end
42
+ end
29
43
  end
30
44
 
31
45
  def define_arg name, &blk
@@ -36,6 +50,7 @@ module Lab42
36
50
  until argv.empty?
37
51
  argv = _parse_next argv
38
52
  end
53
+ _check_required_kwds
39
54
  [options, args, errors]
40
55
  end
41
56
 
@@ -44,16 +59,19 @@ module Lab42
44
59
 
45
60
  def initialize &blk
46
61
  @args = []
62
+ @allowed = nil
47
63
  @conversions = {}
64
+ @defaults = {}
48
65
  @defined_rules = []
49
66
  @errors = []
50
- @options = OpenStruct.new
67
+ @required = Set.new
51
68
  @syntaxes = []
52
69
 
53
70
  instance_exec(&blk) if blk
71
+ @options = OpenStruct.new(defaults)
54
72
  end
55
73
 
56
- def _convert(value, name:)
74
+ def _convert(value, name:)
57
75
  conv = conversions.fetch(name, nil)
58
76
  case conv
59
77
  when Symbol
@@ -62,7 +80,7 @@ module Lab42
62
80
  conv.(value)
63
81
  when Array
64
82
  if (match = conv.first.match(value))
65
- conv[1].(match.captures)
83
+ conv[1].(*match.captures)
66
84
  else
67
85
  errors << [:syntax_error, name, "#{value} does not match #{conv.first}"]
68
86
  nil
@@ -72,6 +90,25 @@ module Lab42
72
90
  end
73
91
  end
74
92
 
93
+ def _add_proc_conversion(param, conversion, block, required)
94
+ Array(param).each do |para|
95
+ @required.add para if required == :required
96
+ conversions[para] = block ? [conversion, block] : conversion
97
+ end
98
+ end
99
+
100
+ def _add_simple_conversion(param, block)
101
+ Array(param).each do |para|
102
+ conversions[para] = block
103
+ end
104
+ end
105
+
106
+ def _add_symbolic_conversion(param, conversion, required)
107
+ Array(param).each do |para|
108
+ @required.add para if required == :required
109
+ conversions[para] = Predefined.fetch(conversion, conversion)
110
+ end
111
+ end
75
112
 
76
113
  def _parse_next argv
77
114
  first, *rest = argv
@@ -85,10 +122,17 @@ module Lab42
85
122
  def _parse_symbolic first, rest
86
123
  case first
87
124
  when %r{\A:(.*)}
88
- options[$1.gsub('-','_').to_sym]=true
125
+ switch = $1.gsub('-','_').to_sym
126
+ _check_switch(switch)
127
+ options[switch]=true
89
128
  rest
90
129
  when %r{(.*):\z}
91
- _parse_value $1.gsub('-', '_').to_sym, rest
130
+ kwd = $1.gsub('-', '_').to_sym
131
+ _check_kwd(kwd)
132
+ _parse_value kwd, rest
133
+ when %r{\A\\(.*)}
134
+ args << $1
135
+ rest
92
136
  else
93
137
  _parse_syntax(first)
94
138
  rest
@@ -13,7 +13,7 @@ class Lab42::Rgxargs::ArgumentMatcher
13
13
  case matcher
14
14
  when Regexp
15
15
  match = matcher.match(value)
16
- match && [converter.(match.captures), arg_name]
16
+ match && [converter.(*match.captures), arg_name]
17
17
  else
18
18
  matcher.to_s == value && [converter.(), arg_name]
19
19
  end
@@ -0,0 +1,33 @@
1
+ module Lab42
2
+ class Rgxargs
3
+ module Checker
4
+
5
+ private
6
+
7
+ def _check_kwd(kwd)
8
+ return if allowed.nil?
9
+ return if allowed.member? kwd
10
+ return if required.member? kwd
11
+ errors << [:unauthorized_kwd, kwd]
12
+ end
13
+
14
+ def _check_required_kwds
15
+ missing = required - options.to_h.keys
16
+ @errors += missing.map(&_mk_pair(:required_kwd_missing))
17
+ end
18
+
19
+
20
+ def _mk_pair(prefix)
21
+ -> element do
22
+ [prefix, element]
23
+ end
24
+ end
25
+
26
+ def _check_switch(_)
27
+
28
+ end
29
+
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,15 @@
1
+ module Lab42
2
+ class Rgxargs
3
+ module Constrainer
4
+
5
+ def allow_kwds(*kwds)
6
+ @allowed = (allowed||Set.new).union(Set.new(kwds.flatten))
7
+ end
8
+
9
+ def require_kwds(*kwds)
10
+ @required = (required||Set.new).union(Set.new(kwds.flatten))
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -1,9 +1,10 @@
1
1
  module Lab42::Rgxargs::PredefinedMatchers extend self
2
2
  PREDEFINED = {
3
- int_list: [%r{\A(-?\d+(?:,-?\d+)*)\z}, ->(groups){ groups.first.split(",").map(&:to_i)}],
4
- int_range: [%r{\A(-?\d+)(?:-|\.\.)(-?\d+)\z}, ->((f, l)){ Range.new(f.to_i, l.to_i) }],
5
- list: [%r{(\w+)(?:,(\w+))*}, ->(groups){ groups.compact }],
6
- range: [%r{\A(\d+)\.\.(\d+)\z}, ->(groups){ Range.new(*groups.map(&:to_i)) }]
3
+ int: [%r{\A([-+]?\d+)\z}, :to_i.to_proc],
4
+ int_list: [%r{\A(-?\d+(?:,-?\d+)*)\z}, ->(*groups){ groups.first.split(",").map(&:to_i)}],
5
+ int_range: [%r{\A(-?\d+)(?:-|\.\.)(-?\d+)\z}, ->(f, l){ Range.new(f.to_i, l.to_i) }],
6
+ list: [%r{(\w+)(?:,(\w+))*}, ->(*groups){ groups.compact }],
7
+ range: [%r{\A(\d+)\.\.(\d+)\z}, ->(*groups){ Range.new(*groups.map(&:to_i)) }]
7
8
  }
8
9
 
9
10
  def defined_names
@@ -16,12 +17,11 @@ module Lab42::Rgxargs::PredefinedMatchers extend self
16
17
  end
17
18
 
18
19
  def list_matcher values
19
- [%r{\A((?:#{values.join("|")})(?:,(?:#{values.join("|")}))*)\z}, _list_extractor]
20
+ [%r{\A((?:#{values.join("|")})(?:,(?:#{values.join("|")}))*)\z}, method(:_list_extractor)]
20
21
  end
21
22
 
22
23
 
23
- # Memoized
24
- def _list_extractor
25
- @__list_extractor__ ||= ->(groups){ groups.first.split(",") }
24
+ def _list_extractor(*groups)
25
+ groups.first.split(",")
26
26
  end
27
27
  end
@@ -0,0 +1,19 @@
1
+ class Lab42::Rgxargs::Syntax
2
+
3
+ attr_reader :converter, :matcher
4
+
5
+ def matches? value
6
+ if match = matcher.match(value)
7
+ yield converter.(*match.captures)
8
+ true
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ def initialize matcher, converter
15
+ @converter = converter
16
+ @matcher = matcher
17
+ end
18
+
19
+ end
@@ -1,5 +1,16 @@
1
+ # Instanciated with an Rgxargs parser it can run a block
2
+ # in its own context so that the block accesses the
3
+ # parser's functionality with syntactic sugar w/o cluttering
4
+ # ther parser itself with too many methods
5
+ # E.g.:
6
+ #
7
+ # ```ruby
8
+ # syntax
9
+ #
10
+ # ```
1
11
  class Lab42::Rgxargs::SyntaxDefiner
2
12
 
13
+
3
14
  attr_reader :arg_name, :parser
4
15
 
5
16
  def run code
@@ -0,0 +1,5 @@
1
+ module Lab42
2
+ class Rgxargs
3
+ VERSION = "0.1.8"
4
+ end
5
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lab42_rgxargs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Dober
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-18 00:00:00.000000000 Z
11
+ date: 2020-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: speculate_about
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.2
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.2
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rspec
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,20 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '3.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-doc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
41
69
  description: Parse CL args according to regexen
42
70
  email: robert.dober@gmail.com
43
71
  executables: []
@@ -47,14 +75,18 @@ files:
47
75
  - lib/lab42/enumerable.rb
48
76
  - lib/lab42/rgxargs.rb
49
77
  - lib/lab42/rgxargs/argument_matcher.rb
78
+ - lib/lab42/rgxargs/checker.rb
79
+ - lib/lab42/rgxargs/constrainer.rb
50
80
  - lib/lab42/rgxargs/error.rb
51
81
  - lib/lab42/rgxargs/predefined_matchers.rb
82
+ - lib/lab42/rgxargs/syntax.rb
52
83
  - lib/lab42/rgxargs/syntax_definer.rb
84
+ - lib/lab42/rgxargs/version.rb
53
85
  homepage: https://github.com/robertdober/lab42_rgxargs
54
86
  licenses:
55
87
  - Apache-2.0
56
88
  metadata: {}
57
- post_install_message:
89
+ post_install_message:
58
90
  rdoc_options: []
59
91
  require_paths:
60
92
  - lib
@@ -62,15 +94,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
62
94
  requirements:
63
95
  - - ">="
64
96
  - !ruby/object:Gem::Version
65
- version: '0'
97
+ version: 2.7.0
66
98
  required_rubygems_version: !ruby/object:Gem::Requirement
67
99
  requirements:
68
100
  - - ">="
69
101
  - !ruby/object:Gem::Version
70
102
  version: '0'
71
103
  requirements: []
72
- rubygems_version: 3.0.6
73
- signing_key:
104
+ rubygems_version: 3.1.2
105
+ signing_key:
74
106
  specification_version: 4
75
107
  summary: Parse CL args according to regexen
76
108
  test_files: []