mister_bin 0.7.5 → 0.8.0
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.
- checksums.yaml +4 -4
- data/README.md +37 -59
- data/lib/mister_bin/command.rb +1 -1
- data/lib/mister_bin/runner.rb +31 -7
- data/lib/mister_bin/version.rb +1 -1
- data/lib/mister_bin.rb +6 -6
- metadata +16 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8b37499324199dee43edefc92606a2a697ce9dd132c6ef11803a6037e259c23
|
4
|
+
data.tar.gz: 5bd2375c5eea1a0a936cdbde439d8864975bc068ab61ac24a79f6c52ef2987a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e31a33f9192da8ad523bc29a299bc373d39dcedbc8dc96d39e4a90e748a5e4321189eaea462a1823ee88226f2d22bcebf8fab05cfca5850219ef9d2fb094560b
|
7
|
+
data.tar.gz: 97c81e608bc71af98922ce740792dc0ee0d235a1dca08c18f6383fe9aa87a23d0d09cb620c564ad3066cd848d0918a0c499e1e43075205058b18051cf8bf9f4f
|
data/README.md
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
Mister Bin
|
2
|
-
==================================================
|
1
|
+
# Mister Bin
|
3
2
|
|
4
3
|
[](https://badge.fury.io/rb/mister_bin)
|
5
4
|
[](https://github.com/DannyBen/mister_bin/actions?query=workflow%3ATest)
|
@@ -12,55 +11,32 @@ interfaces for your gem or other Ruby application.
|
|
12
11
|
|
13
12
|
---
|
14
13
|
|
15
|
-
|
16
|
-
--------------------------------------------------
|
17
|
-
|
18
|
-
* [Installation](#installation)
|
19
|
-
* [Feature Highlights](#feature-highlights)
|
20
|
-
* [Examples](#examples)
|
21
|
-
* [Usage](#usage)
|
22
|
-
* [Creating the Main Executable](#creating-the-main-executable)
|
23
|
-
* [Runner Options](#runner-options)
|
24
|
-
* [Runner Routes](#runner-routes)
|
25
|
-
* [Creating Commands](#creating-commands)
|
26
|
-
* [Command DSL](#command-dsl)
|
27
|
-
* [Interactive Terminal](#interactive-terminal)
|
28
|
-
* [Terminal features](#terminal-features)
|
29
|
-
* [Terminal options](#terminal-options)
|
30
|
-
* [In the Wild](#in-the-wild)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
Installation
|
35
|
-
--------------------------------------------------
|
36
|
-
|
37
|
-
$ gem install mister_bin
|
38
|
-
|
14
|
+
## Installation
|
39
15
|
|
16
|
+
```
|
17
|
+
$ gem install mister_bin
|
18
|
+
```
|
40
19
|
|
41
|
-
Feature Highlights
|
42
|
-
--------------------------------------------------
|
20
|
+
## Feature Highlights
|
43
21
|
|
44
22
|
- Easy to use and minimalistic DSL for describing your command line actions.
|
45
23
|
- Each command is defined with a separate class for maximum testability and
|
46
24
|
scalability.
|
47
25
|
- Commands can have subcommands.
|
48
|
-
-
|
49
|
-
|
26
|
+
- Commands can have aliases.
|
27
|
+
- Designed primarily for gem developers.
|
50
28
|
|
29
|
+
## Examples
|
51
30
|
|
52
|
-
|
53
|
-
|
31
|
+
This screencast shows the command line output of several Ruby gems that were
|
32
|
+
created with Mister Bin:
|
54
33
|
|
55
|
-

|
56
35
|
|
57
36
|
- See the [examples](/examples) folder for several example use cases.
|
58
37
|
- For real world examples, see the [In the Wild](#in-the-wild) section.
|
59
38
|
|
60
|
-
|
61
|
-
|
62
|
-
Usage
|
63
|
-
--------------------------------------------------
|
39
|
+
## Usage
|
64
40
|
|
65
41
|
Creating a command line utility with Mister Bin involves at least two files:
|
66
42
|
|
@@ -75,10 +51,7 @@ input, and if it finds one and one only, it will execute it. For example,
|
|
75
51
|
if you have a `server` command, you can execute it with `yourapp s` if it
|
76
52
|
is the only command that starts with an `s`.
|
77
53
|
|
78
|
-
|
79
|
-
|
80
|
-
Creating the Main Executable
|
81
|
-
--------------------------------------------------
|
54
|
+
## Creating the Main Executable
|
82
55
|
|
83
56
|
The main executable is usually simple and only serves to initialize Mister
|
84
57
|
Bin with options.
|
@@ -152,6 +125,15 @@ runner.route 'greet', to: GreetCommand
|
|
152
125
|
runner.route 'config', to: ConfigCommand
|
153
126
|
```
|
154
127
|
|
128
|
+
The first argument to the `route` method can be an array. In this case, the
|
129
|
+
first element of the array will be considered the primary command name, and the
|
130
|
+
other elements will be considered aliases.
|
131
|
+
|
132
|
+
```ruby
|
133
|
+
runner = MisterBin::Runner.new
|
134
|
+
runner.route %w[dir ls list], to: DirCommand
|
135
|
+
```
|
136
|
+
|
155
137
|
If you wish to route all commands to the same class, you can use:
|
156
138
|
|
157
139
|
```ruby
|
@@ -166,10 +148,7 @@ runner = MisterBin::Runner.new
|
|
166
148
|
runner.route_all to: GlobalCommand
|
167
149
|
```
|
168
150
|
|
169
|
-
|
170
|
-
|
171
|
-
Creating Commands
|
172
|
-
--------------------------------------------------
|
151
|
+
## Creating Commands
|
173
152
|
|
174
153
|
Create command classes by inheriting from `MisterBin::Command`, for example:
|
175
154
|
|
@@ -182,7 +161,7 @@ class GreetCommand < MisterBin::Command
|
|
182
161
|
param "NAME", "The recipient of the greeting"
|
183
162
|
|
184
163
|
def run
|
185
|
-
# args hash is available everywhere in the
|
164
|
+
# args hash is available everywhere in the class
|
186
165
|
name = args['NAME'] || 'Luke'
|
187
166
|
puts "#{name}... I am your father..."
|
188
167
|
end
|
@@ -240,14 +219,12 @@ example "app ls"
|
|
240
219
|
example "app ls --all"
|
241
220
|
```
|
242
221
|
|
222
|
+
## Interactive Terminal
|
243
223
|
|
244
|
-
|
245
|
-
Interactive Terminal
|
246
|
-
--------------------------------------------------
|
247
224
|
Mister Bin comes with an interactive terminal that allows you to set up a
|
248
225
|
console that sends all commands to your runner.
|
249
226
|
|
250
|
-

|
251
228
|
|
252
229
|
See the [terminal example](/examples/06-terminal) folder.
|
253
230
|
|
@@ -276,7 +253,7 @@ terminal.start
|
|
276
253
|
The `MisterBin::Terminal.new` command accepts an optional second argument. If
|
277
254
|
provided, it should be a options hash:
|
278
255
|
|
279
|
-
```
|
256
|
+
```ruby
|
280
257
|
terminal = MisterBin::Terminal.new runner, {
|
281
258
|
header: "Welcome",
|
282
259
|
autocomplete: %w[--help greet]
|
@@ -288,7 +265,7 @@ commands that are not handled by your runner. For example, this piece of code
|
|
288
265
|
will capture the `/cd ...` command from the terminal and pass it to your
|
289
266
|
block:
|
290
267
|
|
291
|
-
```
|
268
|
+
```ruby
|
292
269
|
terminal = MisterBin::Terminal.new runner
|
293
270
|
terminal.on '/cd' do |args|
|
294
271
|
Dir.chdir args[0] if args[0]
|
@@ -340,8 +317,7 @@ If true, commands that start with `/` will *not* be delegated to the stsrem.
|
|
340
317
|
Default: `false`.
|
341
318
|
|
342
319
|
|
343
|
-
In the Wild
|
344
|
-
--------------------------------------------------
|
320
|
+
## In the Wild
|
345
321
|
|
346
322
|
Several examples of real world use of Mister Bin in the wild (well,
|
347
323
|
"In the Back Yard" really...).
|
@@ -351,16 +327,18 @@ Several examples of real world use of Mister Bin in the wild (well,
|
|
351
327
|
- [Jobly] - Compact job server with API, CLI and Web UI
|
352
328
|
- [Kojo] - Command line utility for generating config files from templates and definition files
|
353
329
|
- [Madman] - The Markdown Swiss Army Knife
|
330
|
+
- [Madness] - Instant Markdown Server
|
354
331
|
- [Slacktail] - Command line utility for following your Slack chat from the terminal
|
355
332
|
- [Site Link Analyzer] - Command line utility for finding broken links in a site
|
356
333
|
|
357
334
|
|
358
|
-
[docopt]: http://docopt.org/
|
359
|
-
[Kojo]: https://github.com/DannyBen/kojo
|
360
|
-
[Madman]: https://github.com/DannyBen/madman
|
361
335
|
[AudioAddict]: https://github.com/DannyBen/audio_addict
|
336
|
+
[Bashly]: https://github.com/DannyBen/bashly
|
362
337
|
[Colsole]: https://github.com/dannyben/colsole
|
338
|
+
[docopt]: http://docopt.org/
|
363
339
|
[Jobly]: https://github.com/dannyben/jobly
|
364
|
-
[
|
340
|
+
[Kojo]: https://github.com/DannyBen/kojo
|
341
|
+
[Madman]: https://github.com/DannyBen/madman
|
342
|
+
[Madness]: https://github.com/DannyBen/madness
|
365
343
|
[Site Link Analyzer]: https://github.com/dannyben/sla
|
366
|
-
[
|
344
|
+
[Slacktail]: https://github.com/dannyben/slacktail
|
data/lib/mister_bin/command.rb
CHANGED
data/lib/mister_bin/runner.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'colsole'
|
2
|
+
require 'debug'
|
2
3
|
|
3
4
|
module MisterBin
|
4
5
|
class Runner
|
@@ -15,7 +16,13 @@ module MisterBin
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def route(key, to:)
|
18
|
-
|
19
|
+
if key.is_a? Array
|
20
|
+
target = key.shift
|
21
|
+
commands[target] = to
|
22
|
+
key.each { |alias_name| aliases[alias_name] = target }
|
23
|
+
else
|
24
|
+
commands[key] = to
|
25
|
+
end
|
19
26
|
end
|
20
27
|
|
21
28
|
def route_all(to:)
|
@@ -30,13 +37,16 @@ module MisterBin
|
|
30
37
|
elsif (argv == ['--help']) || (argv == ['-h'])
|
31
38
|
show_help
|
32
39
|
elsif version && ((argv == ['--version']) || (argv == ['-v']))
|
33
|
-
|
34
|
-
1
|
40
|
+
show_version
|
35
41
|
else
|
36
42
|
execute argv
|
37
43
|
end
|
38
44
|
end
|
39
45
|
|
46
|
+
def aliases
|
47
|
+
@aliases ||= {}
|
48
|
+
end
|
49
|
+
|
40
50
|
private
|
41
51
|
|
42
52
|
def execute(argv)
|
@@ -55,11 +65,25 @@ module MisterBin
|
|
55
65
|
command = argv[0]
|
56
66
|
return argv if commands.has_key? command
|
57
67
|
|
58
|
-
|
59
|
-
argv[0] = candidates.first if candidates.count == 1
|
68
|
+
argv[0] = find_target_command argv[0]
|
60
69
|
argv
|
61
70
|
end
|
62
71
|
|
72
|
+
def find_target_command(input)
|
73
|
+
candidates = commands.keys.grep(/^#{input}/)
|
74
|
+
return candidates.first if candidates.count == 1
|
75
|
+
|
76
|
+
candidates = aliases.keys.grep(/^#{input}/)
|
77
|
+
return aliases[candidates.first] if candidates.count == 1
|
78
|
+
|
79
|
+
input
|
80
|
+
end
|
81
|
+
|
82
|
+
def show_version
|
83
|
+
puts version
|
84
|
+
0
|
85
|
+
end
|
86
|
+
|
63
87
|
def show_subs
|
64
88
|
if commands.empty?
|
65
89
|
say 'No subcommands found'
|
@@ -89,11 +113,11 @@ module MisterBin
|
|
89
113
|
def show_help
|
90
114
|
if commands.empty?
|
91
115
|
say 'No subcommands found'
|
116
|
+
1
|
92
117
|
else
|
93
118
|
show_help!
|
119
|
+
0
|
94
120
|
end
|
95
|
-
|
96
|
-
1
|
97
121
|
end
|
98
122
|
|
99
123
|
def show_help!
|
data/lib/mister_bin/version.rb
CHANGED
data/lib/mister_bin.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
module MisterBin
|
2
|
+
autoload :Command, 'mister_bin/command'
|
3
|
+
autoload :CommandMeta, 'mister_bin/command_meta'
|
4
|
+
autoload :Runner, 'mister_bin/runner'
|
5
|
+
autoload :Terminal, 'mister_bin/terminal'
|
6
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mister_bin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colsole
|
@@ -37,6 +37,9 @@ dependencies:
|
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: '0.7'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 0.7.1
|
40
43
|
type: :runtime
|
41
44
|
prerelease: false
|
42
45
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -44,6 +47,9 @@ dependencies:
|
|
44
47
|
- - "~>"
|
45
48
|
- !ruby/object:Gem::Version
|
46
49
|
version: '0.7'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 0.7.1
|
47
53
|
description: Easily add command line interface to your gems
|
48
54
|
email: db@dannyben.com
|
49
55
|
executables: []
|
@@ -61,8 +67,11 @@ homepage: https://github.com/dannyben/mister_bin
|
|
61
67
|
licenses:
|
62
68
|
- MIT
|
63
69
|
metadata:
|
70
|
+
bug_tracker_uri: https://github.com/DannyBen/mister_bin/issues
|
71
|
+
changelog_uri: https://github.com/DannyBen/mister_bin/blob/master/CHANGELOG.md
|
72
|
+
source_code_uri: https://github.com/DannyBen/mister_bin
|
64
73
|
rubygems_mfa_required: 'true'
|
65
|
-
post_install_message:
|
74
|
+
post_install_message:
|
66
75
|
rdoc_options: []
|
67
76
|
require_paths:
|
68
77
|
- lib
|
@@ -70,15 +79,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
79
|
requirements:
|
71
80
|
- - ">="
|
72
81
|
- !ruby/object:Gem::Version
|
73
|
-
version: '
|
82
|
+
version: '3.0'
|
74
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
84
|
requirements:
|
76
85
|
- - ">="
|
77
86
|
- !ruby/object:Gem::Version
|
78
87
|
version: '0'
|
79
88
|
requirements: []
|
80
|
-
rubygems_version: 3.
|
81
|
-
signing_key:
|
89
|
+
rubygems_version: 3.5.23
|
90
|
+
signing_key:
|
82
91
|
specification_version: 4
|
83
92
|
summary: Command line interface for your gems
|
84
93
|
test_files: []
|