travis-cl 1.2.4

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 (114) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +134 -0
  3. data/Gemfile +11 -0
  4. data/Gemfile.lock +59 -0
  5. data/MIT_LICENSE.md +21 -0
  6. data/README.md +1283 -0
  7. data/cl.gemspec +30 -0
  8. data/examples/README.md +22 -0
  9. data/examples/_src/args/cast.erb.rb +100 -0
  10. data/examples/_src/args/opts.erb.rb +100 -0
  11. data/examples/_src/args/required.erb.rb +63 -0
  12. data/examples/_src/args/splat.erb.rb +55 -0
  13. data/examples/_src/gem.erb.rb +99 -0
  14. data/examples/_src/heroku.erb.rb +47 -0
  15. data/examples/_src/rakeish.erb.rb +54 -0
  16. data/examples/_src/readme/abstract.erb.rb +27 -0
  17. data/examples/_src/readme/alias.erb.rb +22 -0
  18. data/examples/_src/readme/arg.erb.rb +21 -0
  19. data/examples/_src/readme/arg_array.erb.rb +21 -0
  20. data/examples/_src/readme/arg_type.erb.rb +23 -0
  21. data/examples/_src/readme/args_splat.erb.rb +55 -0
  22. data/examples/_src/readme/array.erb.rb +21 -0
  23. data/examples/_src/readme/basic.erb.rb +72 -0
  24. data/examples/_src/readme/default.erb.rb +21 -0
  25. data/examples/_src/readme/deprecated.erb.rb +21 -0
  26. data/examples/_src/readme/deprecated_alias.erb.rb +21 -0
  27. data/examples/_src/readme/description.erb.rb +60 -0
  28. data/examples/_src/readme/downcase.erb.rb +21 -0
  29. data/examples/_src/readme/enum.erb.rb +35 -0
  30. data/examples/_src/readme/example.erb.rb +25 -0
  31. data/examples/_src/readme/format.erb.rb +35 -0
  32. data/examples/_src/readme/internal.erb.rb +28 -0
  33. data/examples/_src/readme/negate.erb.rb +37 -0
  34. data/examples/_src/readme/note.erb.rb +25 -0
  35. data/examples/_src/readme/opts.erb.rb +33 -0
  36. data/examples/_src/readme/opts_block.erb.rb +30 -0
  37. data/examples/_src/readme/range.erb.rb +35 -0
  38. data/examples/_src/readme/registry.erb.rb +18 -0
  39. data/examples/_src/readme/required.erb.rb +35 -0
  40. data/examples/_src/readme/requireds.erb.rb +46 -0
  41. data/examples/_src/readme/requires.erb.rb +35 -0
  42. data/examples/_src/readme/runner.erb.rb +29 -0
  43. data/examples/_src/readme/runner_custom.erb.rb +25 -0
  44. data/examples/_src/readme/secret.erb.rb +22 -0
  45. data/examples/_src/readme/see.erb.rb +25 -0
  46. data/examples/_src/readme/type.erb.rb +21 -0
  47. data/examples/args/cast +98 -0
  48. data/examples/args/opts +98 -0
  49. data/examples/args/required +62 -0
  50. data/examples/args/splat +58 -0
  51. data/examples/gem +97 -0
  52. data/examples/heroku +48 -0
  53. data/examples/rakeish +50 -0
  54. data/examples/readme/abstract +28 -0
  55. data/examples/readme/alias +21 -0
  56. data/examples/readme/arg +20 -0
  57. data/examples/readme/arg_array +20 -0
  58. data/examples/readme/arg_type +22 -0
  59. data/examples/readme/args_splat +58 -0
  60. data/examples/readme/array +20 -0
  61. data/examples/readme/basic +67 -0
  62. data/examples/readme/default +20 -0
  63. data/examples/readme/deprecated +20 -0
  64. data/examples/readme/deprecated_alias +20 -0
  65. data/examples/readme/description +56 -0
  66. data/examples/readme/downcase +20 -0
  67. data/examples/readme/enum +33 -0
  68. data/examples/readme/example +21 -0
  69. data/examples/readme/format +33 -0
  70. data/examples/readme/internal +24 -0
  71. data/examples/readme/negate +44 -0
  72. data/examples/readme/note +21 -0
  73. data/examples/readme/opts +31 -0
  74. data/examples/readme/opts_block +29 -0
  75. data/examples/readme/range +33 -0
  76. data/examples/readme/registry +15 -0
  77. data/examples/readme/required +33 -0
  78. data/examples/readme/requireds +46 -0
  79. data/examples/readme/requires +33 -0
  80. data/examples/readme/runner +30 -0
  81. data/examples/readme/runner_custom +22 -0
  82. data/examples/readme/secret +21 -0
  83. data/examples/readme/see +21 -0
  84. data/examples/readme/type +20 -0
  85. data/lib/cl/arg.rb +79 -0
  86. data/lib/cl/args.rb +92 -0
  87. data/lib/cl/cast.rb +55 -0
  88. data/lib/cl/cmd.rb +74 -0
  89. data/lib/cl/config/env.rb +52 -0
  90. data/lib/cl/config/files.rb +34 -0
  91. data/lib/cl/config.rb +30 -0
  92. data/lib/cl/ctx.rb +36 -0
  93. data/lib/cl/dsl.rb +182 -0
  94. data/lib/cl/errors.rb +119 -0
  95. data/lib/cl/help/cmd.rb +118 -0
  96. data/lib/cl/help/cmds.rb +26 -0
  97. data/lib/cl/help/format.rb +69 -0
  98. data/lib/cl/help/table.rb +58 -0
  99. data/lib/cl/help/usage.rb +26 -0
  100. data/lib/cl/help.rb +37 -0
  101. data/lib/cl/helper/suggest.rb +10 -0
  102. data/lib/cl/helper.rb +47 -0
  103. data/lib/cl/opt.rb +276 -0
  104. data/lib/cl/opts/validate.rb +117 -0
  105. data/lib/cl/opts.rb +114 -0
  106. data/lib/cl/parser/format.rb +63 -0
  107. data/lib/cl/parser.rb +70 -0
  108. data/lib/cl/runner/default.rb +86 -0
  109. data/lib/cl/runner/multi.rb +34 -0
  110. data/lib/cl/runner.rb +10 -0
  111. data/lib/cl/ui.rb +146 -0
  112. data/lib/cl/version.rb +3 -0
  113. data/lib/cl.rb +62 -0
  114. metadata +177 -0
@@ -0,0 +1,34 @@
1
+ class Cl
2
+ module Runner
3
+ class Multi
4
+ Runner.register :multi, self
5
+
6
+ attr_reader :ctx, :cmds
7
+
8
+ def initialize(ctx, *args)
9
+ @ctx = ctx
10
+ @cmds = build(group(args))
11
+ end
12
+
13
+ def run
14
+ cmds.map(&:run)
15
+ end
16
+
17
+ private
18
+
19
+ def group(args, cmds = [])
20
+ args.flatten.map(&:to_s).inject([[]]) do |cmds, arg|
21
+ cmd = Cmd.registered?(arg) ? Cmd[arg] : nil
22
+ cmd ? cmds << [cmd] : cmds.last << arg
23
+ cmds.reject(&:empty?)
24
+ end
25
+ end
26
+
27
+ def build(cmds)
28
+ cmds.map do |(cmd, *args)|
29
+ cmd.new(ctx, args)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
data/lib/cl/runner.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'registry'
2
+
3
+ class Cl
4
+ module Runner
5
+ include Registry
6
+ end
7
+ end
8
+
9
+ require 'cl/runner/default'
10
+ require 'cl/runner/multi'
data/lib/cl/ui.rb ADDED
@@ -0,0 +1,146 @@
1
+ require 'stringio'
2
+
3
+ class Cl
4
+ module Ui
5
+ def self.new(ctx, opts)
6
+ const = Test if ctx.test?
7
+ const ||= Silent if opts[:silent]
8
+ const ||= Tty # if $stdout.tty?
9
+ # const ||= Pipe
10
+ const.new(opts)
11
+ end
12
+
13
+ class Base < Struct.new(:opts)
14
+ attr_writer :stdout
15
+
16
+ def stdout
17
+ @stdout ||= opts[:stdout] || $stdout
18
+ end
19
+
20
+ def puts(*strs)
21
+ stdout.puts(*strs)
22
+ end
23
+
24
+ def abort(error, *strs)
25
+ self.error [error.message, *strs].join("\n\n")
26
+ exit 1
27
+ end
28
+ end
29
+
30
+ class Silent < Base
31
+ %i(announce info notice warn error success cmd).each do |name|
32
+ define_method (name) { |*| }
33
+ end
34
+ end
35
+
36
+ class Test < Base
37
+ %i(announce info notice warn error success cmd).each do |name|
38
+ define_method (name) do |*args|
39
+ puts ["[#{name}]", *args.map(&:inspect)].join(' ')
40
+ end
41
+ end
42
+
43
+ def stdout
44
+ @stdout ||= StringIO.new
45
+ end
46
+
47
+ def abort(error, *strs)
48
+ raise error
49
+ end
50
+ end
51
+
52
+ class Pipe < Base
53
+ %i(announce info notice warn error).each do |name|
54
+ define_method (name) do |msg, args = nil, _ = nil|
55
+ puts format_msg(msg, args)
56
+ end
57
+ end
58
+
59
+ %i(success cmd).each do |name|
60
+ define_method (name) { |*| }
61
+ end
62
+
63
+ private
64
+
65
+ def format_msg(msg, args)
66
+ msg = [msg, args].flatten.map(&:to_s)
67
+ msg = msg.map { |str| quote_spaced(str) }
68
+ msg.join(' ').strip
69
+ end
70
+
71
+ def quote_spaced(str)
72
+ str.include?(' ') ? %("#{str}") : str
73
+ end
74
+ end
75
+
76
+ module Colors
77
+ COLORS = {
78
+ red: "\e[31m",
79
+ green: "\e[32m",
80
+ yellow: "\e[33m",
81
+ blue: "\e[34m",
82
+ gray: "\e[37m",
83
+ reset: "\e[0m"
84
+ }
85
+
86
+ def colored(color, str)
87
+ [COLORS[color], str, COLORS[:reset]].join
88
+ end
89
+ end
90
+
91
+ class Tty < Base
92
+ include Colors
93
+
94
+ def announce(msg, args = [], msgs = [])
95
+ msg = format_msg(msg, args, msgs)
96
+ puts colored(:green, with_spacing(msg, true))
97
+ end
98
+
99
+ def info(msg, args = [], msgs = [])
100
+ msg = format_msg(msg, args, msgs)
101
+ puts colored(:blue, with_spacing(msg, true))
102
+ end
103
+
104
+ def notice(msg, args = [], msgs = [])
105
+ msg = format_msg(msg, args, msgs)
106
+ puts colored(:gray, with_spacing(msg, false))
107
+ end
108
+
109
+ def warn(msg, args = [], msgs = [])
110
+ msg = format_msg(msg, args, msgs)
111
+ puts colored(:yellow, with_spacing(msg, false))
112
+ end
113
+
114
+ def error(msg, args = [], msgs = [])
115
+ msg = format_msg(msg, args, msgs)
116
+ puts colored(:red, with_spacing(msg, true))
117
+ end
118
+
119
+ def success(msg)
120
+ announce(msg)
121
+ puts
122
+ end
123
+
124
+ def cmd(msg)
125
+ notice("$ #{msg}")
126
+ end
127
+
128
+ private
129
+
130
+ def colored(color, str)
131
+ opts[:color] ? super : str
132
+ end
133
+
134
+ def format_msg(msg, args, msgs)
135
+ msg = msgs[msg] % args if msg.is_a?(Symbol)
136
+ msg.strip
137
+ end
138
+
139
+ def with_spacing(str, space)
140
+ str = "\n#{str}" if space && !@last
141
+ @last = space
142
+ str
143
+ end
144
+ end
145
+ end
146
+ end
data/lib/cl/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ class Cl
2
+ VERSION = '1.2.4'
3
+ end
data/lib/cl.rb ADDED
@@ -0,0 +1,62 @@
1
+ require 'cl/cmd'
2
+ require 'cl/help'
3
+ require 'cl/runner'
4
+ require 'cl/errors'
5
+
6
+ class Cl
7
+ singleton_class.send(:attr_accessor, :flag_values) # remove unless Dpl needs this
8
+
9
+ attr_reader :ctx, :name, :opts
10
+
11
+ # @overload initialize(ctx, name, opts)
12
+ # @param ctx [Cl::Ctx] the current execution context (optional)
13
+ # @param name [String] the program (executable) name (optional, defaults to the last segment of $0)
14
+ # @param opts [Hash] options (optional)
15
+ # @option opts [Cl::Runner] :runner registry key for a runner (optional, defaults to :default)
16
+ # @option opts [Cl::Ui] :ui the ui for handling user interaction
17
+ def initialize(*args)
18
+ ctx = args.shift if args.first.is_a?(Ctx)
19
+ @opts = args.last.is_a?(Hash) ? args.pop : {}
20
+ @name = args.shift || $0.split('/').last
21
+ @ctx = ctx || Ctx.new(name, opts)
22
+ end
23
+
24
+ # Runs the command.
25
+ #
26
+ # Instantiates a runner with the given arguments, and runs it.
27
+ #
28
+ # If the command fails (raises a Cl::Error) then the exception is caught, and
29
+ # the process aborted with the error message and help output for the given
30
+ # command.
31
+ #
32
+ # @param args [Array<String>] arguments (usually ARGV)
33
+ def run(args)
34
+ runner(args).run
35
+ rescue UnknownCmd => e
36
+ ctx.abort e
37
+ rescue Error => e
38
+ ctx.abort e, help(args.first)
39
+ end
40
+
41
+ # Returns a runner instance for the given arguments.
42
+ def runner(args)
43
+ runner = :default if args.first.to_s == 'help'
44
+ runner ||= opts[:runner] || :default
45
+ Runner[runner].new(ctx, args)
46
+ end
47
+
48
+ # Returns help output for the given command
49
+ def help(*args)
50
+ runner(['help', *args]).cmd.help
51
+ rescue StandardError
52
+ end
53
+
54
+ private
55
+
56
+ # Tainting is being used for identifying values on options that have
57
+ # been declared as secret. Ruby taints incoming arguments, so we want to
58
+ # untaint them here.
59
+ def untaint(args)
60
+ args.map(&:dup)
61
+ end
62
+ end
metadata ADDED
@@ -0,0 +1,177 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: travis-cl
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.4
5
+ platform: ruby
6
+ authors:
7
+ - Sven Fuchs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-04-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: regstry
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ description: |-
28
+ OptionParser based CLI support for rapid CLI development in an object-oriented
29
+ context.
30
+
31
+ This library wraps Ruby's OptionParser for parsing your options under the hood,
32
+ so you get all the goodness that the Ruby standard library provides.
33
+
34
+ On top of that it adds a rich and powerful DSL for defining, validating, and
35
+ normalizing options, as well as automatic and gorgeous help output (modeled
36
+ after `gem --help`).
37
+ email:
38
+ executables: []
39
+ extensions: []
40
+ extra_rdoc_files: []
41
+ files:
42
+ - CHANGELOG.md
43
+ - Gemfile
44
+ - Gemfile.lock
45
+ - MIT_LICENSE.md
46
+ - README.md
47
+ - cl.gemspec
48
+ - examples/README.md
49
+ - examples/_src/args/cast.erb.rb
50
+ - examples/_src/args/opts.erb.rb
51
+ - examples/_src/args/required.erb.rb
52
+ - examples/_src/args/splat.erb.rb
53
+ - examples/_src/gem.erb.rb
54
+ - examples/_src/heroku.erb.rb
55
+ - examples/_src/rakeish.erb.rb
56
+ - examples/_src/readme/abstract.erb.rb
57
+ - examples/_src/readme/alias.erb.rb
58
+ - examples/_src/readme/arg.erb.rb
59
+ - examples/_src/readme/arg_array.erb.rb
60
+ - examples/_src/readme/arg_type.erb.rb
61
+ - examples/_src/readme/args_splat.erb.rb
62
+ - examples/_src/readme/array.erb.rb
63
+ - examples/_src/readme/basic.erb.rb
64
+ - examples/_src/readme/default.erb.rb
65
+ - examples/_src/readme/deprecated.erb.rb
66
+ - examples/_src/readme/deprecated_alias.erb.rb
67
+ - examples/_src/readme/description.erb.rb
68
+ - examples/_src/readme/downcase.erb.rb
69
+ - examples/_src/readme/enum.erb.rb
70
+ - examples/_src/readme/example.erb.rb
71
+ - examples/_src/readme/format.erb.rb
72
+ - examples/_src/readme/internal.erb.rb
73
+ - examples/_src/readme/negate.erb.rb
74
+ - examples/_src/readme/note.erb.rb
75
+ - examples/_src/readme/opts.erb.rb
76
+ - examples/_src/readme/opts_block.erb.rb
77
+ - examples/_src/readme/range.erb.rb
78
+ - examples/_src/readme/registry.erb.rb
79
+ - examples/_src/readme/required.erb.rb
80
+ - examples/_src/readme/requireds.erb.rb
81
+ - examples/_src/readme/requires.erb.rb
82
+ - examples/_src/readme/runner.erb.rb
83
+ - examples/_src/readme/runner_custom.erb.rb
84
+ - examples/_src/readme/secret.erb.rb
85
+ - examples/_src/readme/see.erb.rb
86
+ - examples/_src/readme/type.erb.rb
87
+ - examples/args/cast
88
+ - examples/args/opts
89
+ - examples/args/required
90
+ - examples/args/splat
91
+ - examples/gem
92
+ - examples/heroku
93
+ - examples/rakeish
94
+ - examples/readme/abstract
95
+ - examples/readme/alias
96
+ - examples/readme/arg
97
+ - examples/readme/arg_array
98
+ - examples/readme/arg_type
99
+ - examples/readme/args_splat
100
+ - examples/readme/array
101
+ - examples/readme/basic
102
+ - examples/readme/default
103
+ - examples/readme/deprecated
104
+ - examples/readme/deprecated_alias
105
+ - examples/readme/description
106
+ - examples/readme/downcase
107
+ - examples/readme/enum
108
+ - examples/readme/example
109
+ - examples/readme/format
110
+ - examples/readme/internal
111
+ - examples/readme/negate
112
+ - examples/readme/note
113
+ - examples/readme/opts
114
+ - examples/readme/opts_block
115
+ - examples/readme/range
116
+ - examples/readme/registry
117
+ - examples/readme/required
118
+ - examples/readme/requireds
119
+ - examples/readme/requires
120
+ - examples/readme/runner
121
+ - examples/readme/runner_custom
122
+ - examples/readme/secret
123
+ - examples/readme/see
124
+ - examples/readme/type
125
+ - lib/cl.rb
126
+ - lib/cl/arg.rb
127
+ - lib/cl/args.rb
128
+ - lib/cl/cast.rb
129
+ - lib/cl/cmd.rb
130
+ - lib/cl/config.rb
131
+ - lib/cl/config/env.rb
132
+ - lib/cl/config/files.rb
133
+ - lib/cl/ctx.rb
134
+ - lib/cl/dsl.rb
135
+ - lib/cl/errors.rb
136
+ - lib/cl/help.rb
137
+ - lib/cl/help/cmd.rb
138
+ - lib/cl/help/cmds.rb
139
+ - lib/cl/help/format.rb
140
+ - lib/cl/help/table.rb
141
+ - lib/cl/help/usage.rb
142
+ - lib/cl/helper.rb
143
+ - lib/cl/helper/suggest.rb
144
+ - lib/cl/opt.rb
145
+ - lib/cl/opts.rb
146
+ - lib/cl/opts/validate.rb
147
+ - lib/cl/parser.rb
148
+ - lib/cl/parser/format.rb
149
+ - lib/cl/runner.rb
150
+ - lib/cl/runner/default.rb
151
+ - lib/cl/runner/multi.rb
152
+ - lib/cl/ui.rb
153
+ - lib/cl/version.rb
154
+ homepage: https://github.com/svenfuchs/cl
155
+ licenses:
156
+ - MIT
157
+ metadata: {}
158
+ post_install_message:
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubygems_version: 3.4.21
174
+ signing_key:
175
+ specification_version: 4
176
+ summary: Object-oriented OptionParser based CLI support
177
+ test_files: []