swamp-cli 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +2 -0
- data.tar.gz.sig +0 -0
- data/lib/swamp/cli.rb +53 -0
- data/lib/swamp/cli_dsl.rb +18 -0
- data/lib/swamp/command.rb +42 -0
- data/lib/swamp/command_dsl.rb +21 -0
- data/lib/swamp/context.rb +13 -0
- data/lib/swamp/error.rb +5 -0
- data/lib/swamp/version.rb +3 -0
- metadata +73 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f3ad3156b27833899de0a8bea26a3f4b29caed89442eac42a7a0a0067c7c1886
|
4
|
+
data.tar.gz: c696acaea6ce58239bce863d418c251d96510f1dd6ab9141b66891f094811093
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f412e6249e8730dbc36d7e527627cfb9340e968d3bce4a7c2face82f6ea43a77796154d8703c2538328cf93c85937cbb2e6a6c2a94545fdb777045d1a6eeb205
|
7
|
+
data.tar.gz: f35dcb638c842a0000bb5442f7f88acb0c1f087d83d62b0524ab57c43ab2f7c23a6bd03cf92d6065c14b8a9bebc08b5d1928e47a50b2ac11ff5fc8645454f758
|
checksums.yaml.gz.sig
ADDED
data.tar.gz.sig
ADDED
Binary file
|
data/lib/swamp/cli.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'swamp/version'
|
2
|
+
require 'swamp/command'
|
3
|
+
require 'swamp/command_dsl'
|
4
|
+
require 'swamp/cli_dsl'
|
5
|
+
require 'swamp/context'
|
6
|
+
require 'swamp/error'
|
7
|
+
|
8
|
+
module Swamp
|
9
|
+
class CLI
|
10
|
+
|
11
|
+
attr_reader :commands
|
12
|
+
attr_reader :app_name
|
13
|
+
attr_accessor :version
|
14
|
+
|
15
|
+
def initialize(app_name, options = {})
|
16
|
+
@app_name = app_name
|
17
|
+
@version = options[:version]
|
18
|
+
@commands = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def add(command)
|
22
|
+
@commands[command.name.to_sym] = command
|
23
|
+
end
|
24
|
+
|
25
|
+
def command(name)
|
26
|
+
@commands[name.to_sym]
|
27
|
+
end
|
28
|
+
|
29
|
+
def dispatch(argv, *additional_args)
|
30
|
+
command_name = argv.shift
|
31
|
+
if command_name && command = command(command_name)
|
32
|
+
context = Context.new(self)
|
33
|
+
context.options = command.parse_options(argv)
|
34
|
+
context.args = argv
|
35
|
+
|
36
|
+
command.action.call(context, *additional_args)
|
37
|
+
else
|
38
|
+
raise Error, "Command not found"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def load_from_directory(path)
|
43
|
+
unless File.directory?(path)
|
44
|
+
raise Error, "No commands directory at #{path}"
|
45
|
+
end
|
46
|
+
|
47
|
+
Dir[File.join(path, '**', '*.rb')].each do |path|
|
48
|
+
CLIDSL.new(self).instance_eval(File.read(path))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'swamp/command'
|
2
|
+
require 'swamp/command_dsl'
|
3
|
+
|
4
|
+
module Swamp
|
5
|
+
class CLIDSL
|
6
|
+
|
7
|
+
def initialize(cli)
|
8
|
+
@cli = cli
|
9
|
+
end
|
10
|
+
|
11
|
+
def command(name, &block)
|
12
|
+
command = Command.new(@cli, name)
|
13
|
+
CommandDSL.new(command).instance_eval(&block)
|
14
|
+
@cli.add(command)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module Swamp
|
4
|
+
class Command
|
5
|
+
|
6
|
+
attr_reader :name
|
7
|
+
attr_reader :options
|
8
|
+
attr_reader :action
|
9
|
+
attr_accessor :description
|
10
|
+
|
11
|
+
def initialize(cli, name)
|
12
|
+
@cli = cli
|
13
|
+
@name = name
|
14
|
+
@options = {}
|
15
|
+
@args = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_action(&block)
|
19
|
+
@action = block
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_option(command, *args, &block)
|
23
|
+
@options[command] = {spec: [command] + args, block: block}
|
24
|
+
end
|
25
|
+
|
26
|
+
def parse_options(argv)
|
27
|
+
options = {}
|
28
|
+
OptionParser.new do |opts|
|
29
|
+
opts.version = @cli.version
|
30
|
+
opts.banner = "Usage: #{@cli.app_name} #{@name} [options]"
|
31
|
+
@options.values.each do |option|
|
32
|
+
opts_block = proc { |value| option[:block].call(value, options) }
|
33
|
+
opts.on(*option[:spec], &opts_block)
|
34
|
+
end
|
35
|
+
end.parse!(argv)
|
36
|
+
options
|
37
|
+
rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
|
38
|
+
raise Swamp::Error, e.message
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Swamp
|
2
|
+
class CommandDSL
|
3
|
+
|
4
|
+
def initialize(command)
|
5
|
+
@command = command
|
6
|
+
end
|
7
|
+
|
8
|
+
def action(&block)
|
9
|
+
@command.set_action(&block)
|
10
|
+
end
|
11
|
+
|
12
|
+
def option(*args, &block)
|
13
|
+
@command.add_option(*args, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def desc(text)
|
17
|
+
@command.description = text
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
data/lib/swamp/error.rb
ADDED
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: swamp-cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Cooke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDZDCCAkygAwIBAgIBATANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQDDAJtZTEZ
|
14
|
+
MBcGCgmSJomT8ixkARkWCWFkYW1jb29rZTESMBAGCgmSJomT8ixkARkWAmlvMB4X
|
15
|
+
DTE5MDUxNDEzNTIxM1oXDTIwMDUxMzEzNTIxM1owPDELMAkGA1UEAwwCbWUxGTAX
|
16
|
+
BgoJkiaJk/IsZAEZFglhZGFtY29va2UxEjAQBgoJkiaJk/IsZAEZFgJpbzCCASIw
|
17
|
+
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUohRlPw3iIOhWZq+qf5N1ATm1H
|
18
|
+
7gBO4TpsUrw/FL/+urFExzt1+4MPfiKjILge48vKpjoTfuZusRsOQebaFidOfmhk
|
19
|
+
sEqa941CvN3OeUYARA53ORlmoLDLmdcrxq430+woFp4uuSYwim/2YQgIMdgiOTqs
|
20
|
+
cHaM9yh/xUGMnH4lB9bBDNfggMmkSFb6P8Ax4rvdX3EVv5P58RHwHszd+UI4fyy9
|
21
|
+
0W143m6ntNmqena4ZOc7HtWtRyDHHXXzlGgmghKEZgOA+/LO53VHp+cM0JqB7lq5
|
22
|
+
ZxN43fQrIT5yY9Dy7dRBeiDo53WNJPspa5soEivCBVYstMqfd+LGk/BnsyMCAwEA
|
23
|
+
AaNxMG8wCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFGlRGerNfr6J
|
24
|
+
Dprgl6DQ3kLvgVvPMBoGA1UdEQQTMBGBD21lQGFkYW1jb29rZS5pbzAaBgNVHRIE
|
25
|
+
EzARgQ9tZUBhZGFtY29va2UuaW8wDQYJKoZIhvcNAQEFBQADggEBAK2TQPMeW9qh
|
26
|
+
NDNoVbbplfSc8/uscSP2DfssCbhXQqeDfF2z+kQpxv8iAc++KTlotqOaX5A6RvLb
|
27
|
+
NvuwMHPJRQJ2e8rbuN8Sh3tUjbkAEv3SFw4hqbKmtp0j2oKBU0dxHWNfp+5ulh2l
|
28
|
+
UXnQAt4zg3v1hTD1VrwLqG/hyk9xAaWB38lEDBuPhLrDIdDJklg9bD1E2TUvoMrg
|
29
|
+
L6TIbdP1TRrxINO1D9GzboR+OuWos7qMLBEEbjat/fQchYrW1KLcHIUCyrGkZTLm
|
30
|
+
3wUJNGnT5XYq+qvTqmjkTSTfdGvZCM63C6bGdN5CAyMokGOOatGqyCMAONolWnfC
|
31
|
+
gm3t2GWWrxY=
|
32
|
+
-----END CERTIFICATE-----
|
33
|
+
date: 2019-10-13 00:00:00.000000000 Z
|
34
|
+
dependencies: []
|
35
|
+
description: A framework for writing simple CLI applications in Ruby.
|
36
|
+
email:
|
37
|
+
- me@adamcooke.io
|
38
|
+
executables: []
|
39
|
+
extensions: []
|
40
|
+
extra_rdoc_files: []
|
41
|
+
files:
|
42
|
+
- lib/swamp/cli.rb
|
43
|
+
- lib/swamp/cli_dsl.rb
|
44
|
+
- lib/swamp/command.rb
|
45
|
+
- lib/swamp/command_dsl.rb
|
46
|
+
- lib/swamp/context.rb
|
47
|
+
- lib/swamp/error.rb
|
48
|
+
- lib/swamp/version.rb
|
49
|
+
homepage: https://github.com/adamcooke/swamp
|
50
|
+
licenses:
|
51
|
+
- MIT
|
52
|
+
metadata: {}
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options: []
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
requirements: []
|
68
|
+
rubygems_version: 3.0.6
|
69
|
+
signing_key:
|
70
|
+
specification_version: 4
|
71
|
+
summary: Used by Procodile and Bask, this is a simple framework for developing simple
|
72
|
+
CLI applications in Ruby.
|
73
|
+
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|