dencli 0.5.0 → 0.5.4

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: b59309b03abb2d1a44eda112c289335eed1a252bccd89404a4e5017ff876657f
4
- data.tar.gz: 0ecfaff2dd2928bfdc134ee3dc92737ae2776737e6ada66fd1432de5b470ab76
3
+ metadata.gz: 71cb3a66fe8101078796ec7dfb0c793d315416020c76e11f2b312c32f6d3c1b2
4
+ data.tar.gz: 1675ca2b4f22fc083948bec274aa75c067e41622dc3d65059a9b200a86d21e0e
5
5
  SHA512:
6
- metadata.gz: d27d7f9d307e1e86684ebb7e771ff865d0d10e4cde501951947997e98d25aafff123826c1973e7615ab45edd7c2bd3d60eacefa56835eacd976a4e9a9f4ed2d8
7
- data.tar.gz: 70f63e628dcd9b7c2cc8da2302ef0dc33a170efc6281173c05f31b09657c0f4b616cd71faaa3ea09738e629b021e51e6018fda33535d2d34d8570caa0db32acc
6
+ metadata.gz: 938480ac26fa9cbac07118edfa407b1a59d2e9534b43fdd308bf4e81a96e78a20fc2b3d3143029d6a8b1f516ebbd14af7507ae703e395d46ad4abfdbd3b42844
7
+ data.tar.gz: af52e24ace634da494e17b5efa06bdc475fa64d9250218d38b1c60ee7d4b9897cfdce6cf6cf54f141acca8ec836140a2ad368ac27ceb0bbd2b1cdf1c3b43598a
data/bin/example.rb CHANGED
@@ -4,21 +4,24 @@ require 'pathname'
4
4
  $:.unshift Pathname.new(__FILE__).dirname.dirname.join('lib').to_s
5
5
  require 'dencli'
6
6
 
7
- cli = DenCli.new 'example', "This is an example for generate a DenCli-API"
8
- cli.cmd( :args, "Expects and prints given arguments", &lambda {|a, b, c:, d:, e:|
7
+ cli = DenCli.new :example, "This is an example for generate a DenCli-API"
8
+ cli.cmd( :args, "Expects and prints given arguments",
9
+ &lambda {|a, b, c:, d:, e:, f:, g:|
9
10
  p a: a, b: b, c: c, d: d, e: e
10
11
  }).
11
12
  opt( :c, '-c=ForC', "Option c").
12
- opt( :d, '-d=ForD', "Option d", default: "something").
13
+ opt( :d, '-dForD', "Option d", default: "something").
13
14
  opt( :e, '-e', "Toggle e", default: false).
14
- opt( :f, '--[no-]f', "Toggle f", default: false)
15
+ opt( :f, '--[no-]f', "Toggle f", default: false).
16
+ opt( :g, '--long-option=sth', "Long option, no short option", default: "nothing").
17
+ opt( :h, '-hsth', "No long option, only short option", default: "nothing")
15
18
 
16
19
  cli.cmd( :example, "I have an example command") { STDERR.puts "This is an example" }
17
- cli.cmd( :help, "", aliases: [nil, '-h', '--help'], &lambda {|*args, full:|
20
+ cli.cmd( :help, "An example for help", aliases: [nil, '-h', '--help'], &lambda {|*commands, full:|
18
21
  if full
19
- cli.help_full *args, output: STDERR
22
+ cli.help_full *commands, output: STDERR
20
23
  else
21
- cli.help *args, output: STDERR
24
+ cli.help *commands, output: STDERR
22
25
  end
23
26
  }).
24
27
  opt( :full, '-f', '--[no-]full', "Print all commands and sub-commands.", default: false)
@@ -37,7 +40,7 @@ cli.sub( :more, "Sub-Commands are also possible with a new cli") do |sub|
37
40
  opt( :e, '-e', "Toggle e")
38
41
 
39
42
  sub.sub( :deeper, "You want to have Sub-Sub-Commands?") do |sub2|
40
- sub2.cmd( :help, "", aliases: [nil, '-h', '--help'], &lambda {|*args| sub2.help( *args, output: STDERR) })
43
+ sub2.cmd( :help, "", aliases: [nil, '-h', '--help'], &lambda {|*commands| sub2.help( *commands, output: STDERR) })
41
44
  sub2.cmd( :last, "The last example", &lambda { STDERR.puts "The last example" })
42
45
 
43
46
  sub2.sub( :'sub-commands', "Endless Sub-Sub- ...") do |sub3|
data/lib/dencli/cmd.rb CHANGED
@@ -7,6 +7,12 @@ class DenCli::CMD
7
7
  def initialize parent, name, description, exe
8
8
  raise "Proc expected, instead of: #{exe.inspect}" unless Proc === exe
9
9
  @parent, @name, @description, @exe = parent, name, description, lambda( &exe)
10
+ @parameters = @exe.parameters
11
+ @arguments_required = @exe.parameters.select {|e| :req == e[0] }.map {|e| e[1] }
12
+ @arguments_additional = @exe.parameters.select {|e| :opt == e[0] }.map {|e| e[1] }
13
+ @arguments = @exe.parameters.select {|e| :req == e[0] or :opt == e[0] }.map {|e| e[1] }
14
+ @options_required = @exe.parameters.select {|e| :keyreq == e[0] }.map {|e| e[1] }
15
+ @options_additional = @exe.parameters.select {|e| :key == e[0] }.map {|e| e[1] }
10
16
  @options = {}
11
17
  completion {|*a| [] }
12
18
  end
@@ -14,14 +20,11 @@ class DenCli::CMD
14
20
  def _full_cmd( post) parent._full_cmd [@name]+post end
15
21
  def full_cmd() _full_cmd [] end
16
22
 
17
- def parameters() @exe.parameters end
18
- def arguments_required() @exe.parameters.select {|e| :req == e[0] }.map {|e| e[1] } end
23
+ attr_reader :parameters,
24
+ :arguments_required, :arguments_additional, :arguments,
25
+ :options_required, :options_additional
19
26
  alias required arguments_required
20
- def arguments_additional() @exe.parameters.select {|e| :opt == e[0] }.map {|e| e[1] } end
21
27
  alias additional arguments_additional
22
- def arguments() @exe.parameters.select {|e| :req == e[0] or :opt == e[0] }.map {|e| e[1] } end
23
- def options_required() @exe.parameters.select {|e| :keyreq == e[0] }.map {|e| e[1] } end
24
- def options_additional() @exe.parameters.select {|e| :key == e[0] }.map {|e| e[1] } end
25
28
 
26
29
  def complete *pre, str
27
30
  @completion.call *pre, str
@@ -54,7 +57,7 @@ class DenCli::CMD
54
57
  end
55
58
  kr = @options.select {|_, o| o.required? and not os.has_key? o.name }
56
59
  unless kr.empty?
57
- raise DenCli::UsageError, "Missing argument(s): #{kr.map {|o| o.long || o.short }.join ', '}"
60
+ raise DenCli::UsageError, "Missing argument(s): #{kr.map {|_, o| o.long || o.short }.join ', '}"
58
61
  end
59
62
  end
60
63
  @exe.call *as, **os
@@ -69,19 +72,27 @@ class DenCli::CMD
69
72
  def _usage output
70
73
  output << full_cmd.join( ' ')
71
74
  @options.each do |_, o|
72
- s = "#{o.short||o.long}#{o.val ? ?= : ''}#{o.val}"
75
+ s = "#{o.short||o.long}#{(!o.short && o.val) ? ?= : ''}#{o.val}"
73
76
  output << (o.required? ? " #{s}" : " [#{s}]")
74
77
  end
75
78
  if @exe.lambda?
76
- required.each {|s| output << " <#{s}>" }
77
- output << " [#{additional.map{|s|"<#{s}>"}.join " "}]" unless additional.empty?
79
+ parameters.each do |(type, name)|
80
+ case type
81
+ when :req
82
+ output << " <#{name}>"
83
+ when :opt
84
+ output << " [<#{name}>]"
85
+ when :rest
86
+ output << " [<#{name}> ...]"
87
+ end
88
+ end
78
89
  else
79
90
  output << ' ...'
80
91
  end
81
92
  end
82
93
 
83
- def commands *args, &exe
84
- yield self
94
+ def commands *args
95
+ yield name, self
85
96
  end
86
97
 
87
98
  def goto *args
@@ -127,7 +138,7 @@ class DenCli::CMD
127
138
  @options.map do |_, o|
128
139
  s, l, v, y = o.short, o.long, o.val, ','
129
140
  if l.nil?
130
- s += "=#{v}" if v
141
+ s += "#{v}" if v
131
142
  y = ' '
132
143
  elsif s.nil?
133
144
  l += "=#{v}" if v
@@ -158,9 +169,9 @@ class DenCli::CMD
158
169
  @long, @val = $1, $2 || @val
159
170
  when /\A(--[^=]+)\z/
160
171
  @long, @val = $1, nil
161
- when /\A(-[^=-]+)=(.+)\z/
172
+ when /\A(-[^=-])=?(.+)\z/
162
173
  @short, @val = $1, $2 || @val
163
- when /\A(-[^=-]+)\z/
174
+ when /\A(-[^=-])\z/
164
175
  @short, @val = $1, nil
165
176
  else
166
177
  raise ArgumentError, "Unexpected format for option: #{opt.inspect}"
data/lib/dencli/sub.rb CHANGED
@@ -4,6 +4,9 @@ class DenCli::Sub
4
4
  attr_reader :parent, :name, :description, :subs, :aliases
5
5
 
6
6
  def initialize parent, name, description
7
+ #DenCli::assert_type self, __method__, :name, name, Symbol
8
+ #DenCli::assert_type self, __method__, :parent, parent, DenCli, DenCli::Sub
9
+ #DenCli::assert_type self, __method__, :description, description, String
7
10
  @parent, @name, @description, @subs, @aliases = parent, name, "-> #{description}", {}, {}
8
11
  end
9
12
 
@@ -11,8 +14,19 @@ class DenCli::Sub
11
14
  def full_cmd() _full_cmd [] end
12
15
  def []( k) @aliases[k] end
13
16
 
14
- def usage
15
- "#{full_cmd.join ' '} ..."
17
+ def usage output: nil
18
+ output ||= ''
19
+ _usage output
20
+ output
21
+ end
22
+
23
+ def _usage output
24
+ output << full_cmd.join( ' ')
25
+ if @aliases.has_key? nil
26
+ output << " [<command> ...]"
27
+ else
28
+ output << " <command> [...]"
29
+ end
16
30
  end
17
31
 
18
32
  def help n = nil, *a, output: nil
@@ -33,7 +47,7 @@ class DenCli::Sub
33
47
  end
34
48
 
35
49
  def commands &exe
36
- yield self
50
+ yield name, self
37
51
  @subs.each {|k, c| c.commands &exe }
38
52
  end
39
53
 
@@ -43,37 +57,39 @@ class DenCli::Sub
43
57
  output
44
58
  end
45
59
 
46
- def self._help_commands output, subs
47
- m = subs.map {|c| x = c.usage.length; 25 < x ? 0 : x }.max
48
- subs.each do |c|
49
- if 25 < c.usage.length
50
- output << "% -#{m}s\n#{' ' * m} " % [c.usage]
51
- else
52
- output << "% -#{m}s " % [c.usage]
53
- end
54
- n = m+2
55
- prefix = nil
56
- c.description.split /\n/ do |l|
57
- c = 0
58
- l.split %r< > do |w|
59
- if prefix
60
- output << prefix
61
- prefix = nil
62
- end
63
- wl = w.length
64
- if 75 < c+wl
65
- output << "\n#{' ' * n}#{w}"
66
- c = n+2+wl
67
- else
68
- output << " #{w}"
69
- c += 1 + wl
60
+ class <<self
61
+ def _help_commands output, subs
62
+ m = subs.map {|_name,c| x = c.usage.length; 25 < x ? 0 : x }.max
63
+ subs.each do |_name, c|
64
+ if 25 < c.usage.length
65
+ output << "% -#{m}s\n#{' ' * m} " % [c.usage]
66
+ else
67
+ output << "% -#{m}s " % [c.usage]
68
+ end
69
+ n = m+2
70
+ prefix = nil
71
+ c.description.split( /\n/).each do |l|
72
+ c = 0
73
+ l.split( %r< >).each do |w|
74
+ if prefix
75
+ output << prefix
76
+ prefix = nil
77
+ end
78
+ wl = w.length
79
+ if 75 < c+wl
80
+ output << "\n#{' ' * n}#{w}"
81
+ c = n+2+wl
82
+ else
83
+ output << " #{w}"
84
+ c += 1 + wl
85
+ end
70
86
  end
87
+ prefix = "\n#{' ' * n}"
71
88
  end
72
- prefix = "\n#{' ' * n}"
89
+ output << "\n"
73
90
  end
74
- output << "\n"
91
+ output
75
92
  end
76
- output
77
93
  end
78
94
 
79
95
  def goto *a
@@ -96,6 +112,10 @@ class DenCli::Sub
96
112
  end
97
113
 
98
114
  def _add name, min, obj, aliases
115
+ #DenCli::assert_type self, __method__, :name, name, Symbol, NilClass
116
+ #DenCli::assert_type self, __method__, :min, min, Integer, NilClass
117
+ #DenCli::assert_type self, __method__, :obj, obj, DenCli::Sub, DenCli::CMD
118
+ #DenCli::assert_type self, __method__, :aliases, aliases, Array, NilClass
99
119
  name = name.to_s unless name.nil?
100
120
  @subs[name] = obj
101
121
  DenCli.gen_aliases( name, min) {|a| @aliases[a] = obj }
@@ -1,3 +1,3 @@
1
1
  class DenCli
2
- VERSION = '0.5.0'
2
+ VERSION = '0.5.4'
3
3
  end
data/lib/dencli.rb CHANGED
@@ -1,6 +1,13 @@
1
1
  require 'optparse'
2
2
 
3
+
3
4
  class DenCli
5
+ def self.assert_type klass, method, argument_name, object, *types
6
+ unless types.any? {|type| object.is_a? type }
7
+ raise ArgumentError, "#{klass.name}.#{method} expects #{types.map( &:to_s).join '|' } for #{argument_name}, not: #{object.inspect}"
8
+ end
9
+ end
10
+
4
11
  class UsageError < ::RuntimeError
5
12
  end
6
13
  class UnknownCommand < UsageError
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dencli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Knauf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-30 00:00:00.000000000 Z
11
+ date: 2021-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec