appl 1.6.2 → 1.8

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.
Files changed (7) hide show
  1. checksums.yaml +4 -4
  2. data/bin/intar +18 -29
  3. data/doc/demoappl +3 -3
  4. data/doc/demofan +90 -0
  5. data/lib/appl.rb +47 -68
  6. data/lib/applfan.rb +81 -0
  7. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3006d9d18efb0699ffb9cce15b9f5ebad26dbe0d62e723b982ef010f0667d2fd
4
- data.tar.gz: f13bdd180f26807607895846f19130a3e927b1cbb97bdc54beab2fc6f2d62762
3
+ metadata.gz: 799aaa0707086bc632ccb65a3edfd9adc5d8078e06f60114ffe01b92e086657d
4
+ data.tar.gz: 5283ca005a83855d096f2f5fca5015fd64afaa1df1e0348a0a5f814d33a66dcd
5
5
  SHA512:
6
- metadata.gz: 76f086e3cacbd25034ce77d242c0eae9d1b8c161f02a7cce354796f9d344751ce9425613357e945f9ef50e854ff7bbd84f8255b111cdecd21acc53b0be0b214c
7
- data.tar.gz: 701155765e67cf6519b5cb91a8b528e65b14f2175bc6dd53dbb76d232c7a6c41bfa8a0e7467eb2bbed373fbde3ca9437e65f73a763658ba430487565e31d9e87
6
+ metadata.gz: 8b7529480160d067b949652c5003e77864a5a358e45b1999713f770082f93cdf6ae70fa9886ba0b7b934b130e1b453931ba6396ad0296791628547bdaada6ddd
7
+ data.tar.gz: 62629af63de9b84692ff6e02eafad0601e13d9a3ed0b83ba294b83b37b0ca0f7a637135d89966f7a3e79b9b0d36d2328d0ba477a31144c31776e6b02bcf21786
data/bin/intar CHANGED
@@ -28,33 +28,10 @@ class IntarApp < Application
28
28
 
29
29
  EOT
30
30
 
31
- def quiet!
32
- Intar.show = nil
33
- end
34
- def show= s
35
- Intar.show = s.to_i
36
- end
37
- def prompt= p
38
- Intar.prompt = p if p
39
- end
40
- def bw!
41
- Intar.colour = false
42
- end
43
- def catch_exit!
44
- Intar.catch_exit = (Intar.catch_exit||0) + 3
45
- end
46
- def histall!
47
- Intar.histhid = false
48
- end
49
- def histfile= h
50
- Intar.histfile = nil_if_none h
51
- end
52
- def histmax= m
53
- Intar.histmax = (Integer m rescue m.to_i)
54
- end
55
- def configfile= c
56
- @configfile = nil_if_none c
57
- end
31
+ attr_writer :show, :prompt, :histmax
32
+ def histfile= f ; @histfile = nil_if_none f ; end
33
+ def configfile= f ; @configfile = nil_if_none f ; end
34
+ attr_bang :quiet, :bw, :catch_exit, :histall
58
35
 
59
36
  define_option "p", :prompt=, "STR",
60
37
  "prompt - see source code for % escapes"
@@ -63,8 +40,8 @@ class IntarApp < Application
63
40
  define_option "q", :quiet!, "don't show results"
64
41
  alias_option "q", "quiet"
65
42
 
66
- define_option "S", :show=, "N", 1, "show result line limit (0=all)"
67
- alias_option "S", "show"
43
+ define_option "s", :show=, "N", "show result line limit (0=all)"
44
+ alias_option "s", "show"
68
45
 
69
46
  define_option "r", :require, "FILE", "Ruby require"
70
47
  alias_option "r", "require"
@@ -103,6 +80,18 @@ class IntarApp < Application
103
80
  def run
104
81
  # @debug = true # Only development.
105
82
  read_cfg
83
+ if @quiet then
84
+ Intar.show = 0
85
+ elsif @show then
86
+ Intar.show = Integer @show
87
+ end
88
+ Intar.prompt = @prompt if @prompt
89
+ Intar.colour = false if @bw
90
+ Intar.catch_exit = (Intar.catch_exit||0) + 3 if @catch_exit
91
+ Intar.histhid = false if @histall
92
+ Intar.histfile = @histfile if @histfile
93
+ Intar.histmax = Integer @histmax if @histmax
94
+
106
95
  main = eval "self", TOPLEVEL_BINDING
107
96
  Intar.open main do |i|
108
97
  i.run *(@args.shift @args.length)
@@ -46,9 +46,9 @@ class DemoAppl < Application
46
46
  define_option "V", :version, "show version information"
47
47
  alias_option "V", "version"
48
48
 
49
- UNKNOWN = "Sorry, unknown option"
50
- STOPOPT = "no more options"
51
- UNPROCA = "Warning: unprocessed arguments left"
49
+ STOPOPT = "Stop option processing"
50
+ UNKNOWN = "Not a valid option: `%s'."
51
+ UNPROCA = "Warning. Unprocessed arguments: %s"
52
52
 
53
53
  def run
54
54
  puts inspect
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # demofan -- Test the Application class with commands
5
+ #
6
+
7
+ require "applfan"
8
+
9
+
10
+ class DemoFan < ApplicationFan
11
+
12
+ NAME = "demofan"
13
+ VERSION = "1.0"
14
+ SUMMARY = "Test the Application class with commands"
15
+ COPYRIGHT = "(C) 2020 Bertram Scharpf"
16
+ LICENSE = "For internal use only"
17
+ AUTHOR = "Bertram Scharpf <software@bertram-scharpf.de>"
18
+
19
+ DESCRIPTION = <<~EOT
20
+ This is an example how to define an Application subclass
21
+ with commands inside.
22
+ EOT
23
+
24
+ attr_bang :verbose
25
+ define_option "v", :verbose!, "verbose mode"
26
+
27
+ define_option "h", :help, "show this options list"
28
+ alias_option "h", "help"
29
+ define_option "V", :version, "show version information"
30
+ alias_option "V", "version"
31
+
32
+ def run
33
+ super do |cmd|
34
+ cmd.verbose! if @verbose
35
+ end
36
+ end
37
+
38
+ class Init < Command
39
+ NAME = "init"
40
+ SUMMARY = "Initialize"
41
+ DESCRIPTION = <<~EOT
42
+ Initialization of nothing.
43
+ EOT
44
+ define_option "h", :help, "show init's options list"
45
+ alias_option "h", "help"
46
+ def verbose! ; end
47
+ def run
48
+ puts "Initializing...done."
49
+ end
50
+ end
51
+
52
+ class Run < Command
53
+ NAME = "run"
54
+ SUMMARY = "Run a job"
55
+ DESCRIPTION = <<~EOT
56
+ Running nothing.
57
+ EOT
58
+ define_option "h", :help, "show run's options list"
59
+ alias_option "h", "help"
60
+ def verbose! ; @verbose = true ; end
61
+ def run
62
+ if @verbose then
63
+ puts "Starting..."
64
+ puts "Running..."
65
+ puts "Done."
66
+ else
67
+ puts "Running...done."
68
+ end
69
+ end
70
+ end
71
+
72
+ class Cleanup < Command
73
+ NAME = "cleanup"
74
+ SUMMARY = "Cleanup"
75
+ DESCRIPTION = <<~EOT
76
+ Cleanup of nothing.
77
+ EOT
78
+ define_option "h", :help, "show cleanup's options list"
79
+ alias_option "h", "help"
80
+ def verbose! ; end
81
+ def run
82
+ puts "Cleaning up...done."
83
+ end
84
+ end
85
+
86
+ end
87
+
88
+
89
+ DemoFan.run
90
+
@@ -5,13 +5,16 @@
5
5
 
6
6
  class Application
7
7
 
8
- APPL_VERSION = "1.6.2".freeze
8
+ APPL_VERSION = "1.8".freeze
9
9
 
10
10
  OPTIONS_ENV = nil
11
11
 
12
12
  STOPOPT = "stop option processing"
13
- UNKNOWN = "Unknown option"
14
- UNPROCA = "Warning: unprocessed arguments"
13
+ UNKNOWN = "Unknown option: `%s'."
14
+ UNPROCA = "Warning: unprocessed arguments: %s"
15
+
16
+ W_OPTS = 10
17
+ W_ARGS = 16
15
18
 
16
19
  class OptionError < StandardError ; end
17
20
  class Done < Exception ; end
@@ -46,40 +49,27 @@ class Application
46
49
  end
47
50
 
48
51
  def help
49
- c = self.class
50
- puts c.version
51
- puts
52
- puts c::DESCRIPTION
53
- puts
54
- c.show_options
55
- if block_given? then
56
- puts
57
- yield
58
- end
52
+ self.class.help
59
53
  raise Done
60
54
  end
61
55
 
62
56
  def version
63
- self.class.show_version
57
+ self.class.version
64
58
  raise Done
65
59
  end
66
60
 
67
- VERSION = "0"
68
- NAME = "appl"
69
- SUMMARY = "Dummy application"
70
- DESCRIPTION = <<~EOT
71
- This base class does nothing by default.
72
- EOT
73
-
74
61
  def run
75
62
  end
76
63
 
77
- def execute
78
- run
64
+ def warn_unprocessed
79
65
  if @args.any? then
80
- u = @args.join " "
81
- puts "#{self.class::UNPROCA}: #{u}"
66
+ $stderr.puts self.class.root::UNPROCA % (@args.join " ")
82
67
  end
68
+ end
69
+
70
+ def execute
71
+ run
72
+ warn_unprocessed
83
73
  0
84
74
  rescue SignalException
85
75
  raise if @debug
@@ -98,14 +88,6 @@ class Application
98
88
  exit e
99
89
  end
100
90
 
101
- def version
102
- if self::VERSION =~ %r/\s/ then
103
- self::VERSION
104
- else
105
- "#{self::NAME} #{self::VERSION} -- #{self::SUMMARY}"
106
- end
107
- end
108
-
109
91
  private
110
92
 
111
93
  def execute args = nil
@@ -119,7 +101,9 @@ class Application
119
101
  end
120
102
 
121
103
  def inherited sub
122
- sub.instance_eval { @options, @aliases = {}, {} }
104
+ sub.name or return
105
+ o, a = @options.dup.to_h, @aliases.dup.to_h
106
+ sub.instance_eval { @options, @aliases = o, a }
123
107
  end
124
108
 
125
109
  def attr_bang *syms
@@ -162,16 +146,12 @@ class Application
162
146
  end
163
147
 
164
148
  def delete_option opt
165
- self < Application or return
166
- superclass.delete_option opt
167
- @options.delete opt
168
149
  @aliases.reject! { |k,v| v == opt }
150
+ @options.delete opt
169
151
  nil
170
152
  end
171
153
 
172
154
  def unalias_option opt
173
- self < Application or return
174
- superclass.unalias_option opt
175
155
  @aliases.delete opt
176
156
  nil
177
157
  end
@@ -179,32 +159,12 @@ class Application
179
159
  protected
180
160
 
181
161
  def find_option_act opt
182
- self < Application or return
183
- @options[ opt] || @options[ @aliases[ opt]] ||
184
- (superclass.find_option_act opt)
185
- end
186
-
187
- def all_options
188
- if self < Application then
189
- r = superclass.all_options
190
- r.update @options
191
- else
192
- {}
193
- end
194
- end
195
-
196
- def all_aliases
197
- if self < Application then
198
- r = superclass.all_aliases
199
- r.update @aliases
200
- else
201
- {}
202
- end
162
+ @options[ opt] || @options[ @aliases[ opt]]
203
163
  end
204
164
 
205
165
  def options_desc &block
206
166
  a = Hash.new do |h,k| h[ k] = [] end
207
- all_aliases.each { |k,v|
167
+ @aliases.each { |k,v|
208
168
  a[ v].push k
209
169
  }
210
170
  each_option { |opt,desc,arg,dfl,|
@@ -213,14 +173,13 @@ class Application
213
173
  yield l, nil, nil, nil
214
174
  }
215
175
  }
216
- yield "", nil, nil, self::STOPOPT
176
+ yield "", nil, nil, root::STOPOPT
217
177
  end
218
178
 
219
179
  public
220
180
 
221
181
  def each_option
222
- o = all_options
223
- o.each { |opt,(desc,arg,dfl,act)|
182
+ @options.each { |opt,(desc,arg,dfl,act)|
224
183
  case dfl
225
184
  when Symbol then dfl = const_get dfl
226
185
  end
@@ -230,7 +189,7 @@ class Application
230
189
 
231
190
  def option_act args, opt, rest
232
191
  dada = find_option_act opt
233
- dada or raise OptionError, "#{self::UNKNOWN}: `#{opt}'."
192
+ dada or raise OptionError, root::UNKNOWN % opt
234
193
  desc, arg, dfl, act = *dada
235
194
  r = [ act]
236
195
  if arg then
@@ -246,12 +205,32 @@ class Application
246
205
  arg &&= "#{arg}"
247
206
  dfl &&= "[#{dfl}]"
248
207
  arg << dfl if arg && dfl
249
- puts " %-10s %-12s %s" % [ opt, arg, desc]
208
+ puts " %-*s %-*s %s" % [ root::W_OPTS, opt, root::W_ARGS, arg, desc]
250
209
  end
251
210
  end
252
211
 
253
- def show_version
254
- puts version
212
+ def root
213
+ self
214
+ end
215
+
216
+ def applname
217
+ self::NAME
218
+ end
219
+
220
+ def help
221
+ puts "#{applname} -- #{self::SUMMARY}"
222
+ puts
223
+ puts self::DESCRIPTION
224
+ puts
225
+ show_options
226
+ if block_given? then
227
+ puts
228
+ yield
229
+ end
230
+ end
231
+
232
+ def version
233
+ puts "#{applname} #{self::VERSION} -- #{self::SUMMARY}"
255
234
  puts self::COPYRIGHT if const_defined? :COPYRIGHT
256
235
  puts "License: #{self::LICENSE}" if const_defined? :LICENSE
257
236
  a = []
@@ -0,0 +1,81 @@
1
+ #
2
+ # lib/applfan.rb -- ApplicationFan class
3
+ #
4
+
5
+ require "appl"
6
+
7
+
8
+ ApplicationFan = Class.new Application
9
+
10
+ class ApplicationFan
11
+
12
+ AVAILCMDS = "Available commands (say -h after one for help)"
13
+ NOCOMMAND = "No command given. Say -h for a list."
14
+ UNKNWNCMD = "Unknown command: `%s'. Say -h for a list."
15
+
16
+ W_CMDS = 16
17
+
18
+ class CommandError < StandardError ; end
19
+
20
+ class <<self
21
+
22
+ attr_accessor :commands
23
+
24
+ def find_command name
25
+ @commands.find { |c| c::NAME == name }
26
+ end
27
+
28
+
29
+ def help
30
+ super do
31
+ if block_given? then
32
+ yield
33
+ puts
34
+ end
35
+ puts self::AVAILCMDS
36
+ puts
37
+ @commands.each { |c|
38
+ puts " %-*s %s" % [ self::W_CMDS, c::NAME, c::SUMMARY]
39
+ }
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def inherited sub
46
+ sub.instance_eval do
47
+ @commands = []
48
+ const_set :Command, (
49
+ Class.new Application do
50
+ define_singleton_method :inherited do |c|
51
+ sub.commands.push c
52
+ super c
53
+ end
54
+ define_singleton_method :root do
55
+ sub
56
+ end
57
+ define_singleton_method :applname do
58
+ "#{root::NAME} #{self::NAME}"
59
+ end
60
+ end
61
+ )
62
+ end
63
+ super
64
+ end
65
+
66
+ end
67
+
68
+ def run
69
+ c = @args.shift
70
+ c or raise CommandError, self.class::NOCOMMAND
71
+ cmd = self.class.find_command c
72
+ cmd or raise CommandError, self.class::UNKNWNCMD % c
73
+ (cmd.new @args.slice! 0, @args.length).tap { |sub|
74
+ yield sub if block_given?
75
+ sub.run
76
+ sub.warn_unprocessed
77
+ }
78
+ end
79
+
80
+ end
81
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.2
4
+ version: '1.8'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bertram Scharpf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-31 00:00:00.000000000 Z
11
+ date: 2020-03-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  A base class for command line applications doing options parsing
@@ -21,7 +21,9 @@ extra_rdoc_files: []
21
21
  files:
22
22
  - bin/intar
23
23
  - doc/demoappl
24
+ - doc/demofan
24
25
  - lib/appl.rb
26
+ - lib/applfan.rb
25
27
  - lib/intar.rb
26
28
  homepage: http://www.bertram-scharpf.de/software/appl
27
29
  licenses: