argsy 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +24 -0
- data/README.md +111 -0
- data/argsy.gemspec +17 -0
- data/lib/argsy.rb +17 -0
- metadata +48 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 88526113ba2dd53ad74e38032ff79b7779e1aed1d45f7717405e850cc4b5ba83
|
4
|
+
data.tar.gz: a4a5fc03b8c24c355cd8dd9b59db891b4c90d36846f07602742f1ed46fa072ac
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2f64292c7aea41e91ba44eb0cde25aab733282aba5744e2b396a9e907b1501d892385d4dda3244fdc5c88a2f033b1c2de6016f2be10ecc840b2615615b60ab1e
|
7
|
+
data.tar.gz: '0789bbc4c7047c9e696f913b1868d1d7dd9ca1b77bbbcfe9d04b911f49bdee3a1524a85b6ff6ebbdab08eeda2320b6182538952cfd57ce557a10cd72e2b0e944'
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
This is free and unencumbered software released into the public domain.
|
2
|
+
|
3
|
+
Anyone is free to copy, modify, publish, use, compile, sell, or
|
4
|
+
distribute this software, either in source code form or as a compiled
|
5
|
+
binary, for any purpose, commercial or non-commercial, and by any
|
6
|
+
means.
|
7
|
+
|
8
|
+
In jurisdictions that recognize copyright laws, the author or authors
|
9
|
+
of this software dedicate any and all copyright interest in the
|
10
|
+
software to the public domain. We make this dedication for the benefit
|
11
|
+
of the public at large and to the detriment of our heirs and
|
12
|
+
successors. We intend this dedication to be an overt act of
|
13
|
+
relinquishment in perpetuity of all present and future rights to this
|
14
|
+
software under copyright law.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
20
|
+
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
21
|
+
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
For more information, please refer to <http://unlicense.org>
|
data/README.md
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
# Argsy
|
2
|
+
|
3
|
+
Tiny helper snippet you can paste into your CLI script(s) to obtain "commands + options" DSL without
|
4
|
+
external dependencies.
|
5
|
+
|
6
|
+
[![Build](https://travis-ci.org/kolotaev/argsy.svg?branch=master)](https://travis-ci.org/kolotaev/argsy)
|
7
|
+
[![License](https://upload.wikimedia.org/wikipedia/commons/e/ee/Unlicense_Blue_Badge.svg)](https://raw.githubusercontent.com/kolotaev/argsy/master/LICENSE.txt)
|
8
|
+
|
9
|
+
## Rationale
|
10
|
+
|
11
|
+
As you already know, Ruby is awesome for scripting and any sort of CLI tools: it gives you a superb OS commands
|
12
|
+
interaction interface, JSON/YAML parsing, HTTP tools, etc... All out of the box! But built-in `OptionParser` doesn't
|
13
|
+
provide easy-to-write functionality to create CLIs like `./script command --option 1`. The problem here is: how to
|
14
|
+
declare command, action and options conveniently?
|
15
|
+
|
16
|
+
> Sometimes, for any imaginable reason, you do not want you script to be dependent on external gems (say, you want to
|
17
|
+
> pass a script that "just works!" to your co-workers without telling them "Hey, you also need to install this or that
|
18
|
+
> gem")
|
19
|
+
|
20
|
+
`Argsy` gives you such possibility. It's [just 17 lines of code](lib/argsy.rb), published under `The Unlicense`,
|
21
|
+
so you can just copy-paste it inside your script and have a nice
|
22
|
+
tiny DSL. You can of course use it as a gem as well, if you want to.
|
23
|
+
|
24
|
+
**Disclaimer**: `Argsy` doesn't claim itself as a profound CLI DSL like `Thor` and the company,
|
25
|
+
thus for complex scripts, please, opt for those gems instead.
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
Argsy.new '1.0.0' do
|
31
|
+
command :list, 'List all files' do
|
32
|
+
action do |o|
|
33
|
+
puts %w(. .. .hidden.py).join("\n") if o[:all]
|
34
|
+
puts %w(todos.txt recipes.doc).join("\n")
|
35
|
+
puts "me.#{o[:extension]}" if o[:extension]
|
36
|
+
end
|
37
|
+
options do
|
38
|
+
on '-a', '--all', 'Show all, even hidden files'
|
39
|
+
on '-e', '--extension EXTENSION', 'List available files with extension'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
command 'print', 'Print all given options' do
|
44
|
+
action &method(:puts)
|
45
|
+
options do
|
46
|
+
on '-a', '--A', 'A option'
|
47
|
+
on '-b', 'B option'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
command 'hello:world', 'Greet the World group without options' do
|
52
|
+
action { puts 'Hello world!' }
|
53
|
+
end
|
54
|
+
|
55
|
+
command :post do |c|
|
56
|
+
action do |opts|
|
57
|
+
puts "I'm a command without description"
|
58
|
+
puts "Posting to facebook: #{opts[:message]}" if opts[:facebook]
|
59
|
+
puts "Posting to twitter: You're Tearing Me Apart, Lisa!" if opts[:twitter]
|
60
|
+
puts "Date and time posted: #{opts[:date]}"
|
61
|
+
end
|
62
|
+
options do
|
63
|
+
require 'optparse/time'
|
64
|
+
on_tail '-d', '--date=DATE', Time, 'Date when message was posted'
|
65
|
+
on '-f', '--facebook' do
|
66
|
+
c.opts[:message] = 'Oh, Hi Mark'
|
67
|
+
end
|
68
|
+
on '-t', '--twitter'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end.run
|
72
|
+
```
|
73
|
+
|
74
|
+
In console:
|
75
|
+
```
|
76
|
+
$ ./example
|
77
|
+
Usage: playground CMD [--help] [--version]
|
78
|
+
list List all files
|
79
|
+
print Print all given options
|
80
|
+
hello Greet the World without options
|
81
|
+
post
|
82
|
+
|
83
|
+
$ ./example post --help
|
84
|
+
Usage: playground post [options] [--help]
|
85
|
+
-f, --facebook
|
86
|
+
-t, --twitter
|
87
|
+
-d, --date=DATE Date when message was posted
|
88
|
+
|
89
|
+
$ ./example post -f -d 12-8-2016
|
90
|
+
I'm a command without description
|
91
|
+
Posting to facebook: Oh, Hi Mark
|
92
|
+
Date and time posted: 2016-08-12 00:00:00 +0300
|
93
|
+
|
94
|
+
|
95
|
+
$ ./example post --version
|
96
|
+
example version 1.0.0
|
97
|
+
```
|
98
|
+
|
99
|
+
## FAQ
|
100
|
+
|
101
|
+
| Q: | A: |
|
102
|
+
| ------------- |-------------|
|
103
|
+
| Does it support groups/subcommands? | Only in a way of declaring commands as `'group:subcommand'` |
|
104
|
+
| What can I do inside options block? | Anything that is possible inside a stdlib's `OptionParser` |
|
105
|
+
| Why not Thor, Commander, etc.? | See rationale |
|
106
|
+
| Can I use it as a gem? | Yes. `gem install argsy` |
|
107
|
+
| Why does it look like a minified jQuery? | Yes, it's not an idiomatic Ruby formatting. I wanted to make it terse, still readable |
|
108
|
+
| Copy-pasting is bad. It's not DRY! | Absolutely agree with you |
|
109
|
+
|
110
|
+
## License
|
111
|
+
The Unlicense
|
data/argsy.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
lib = 'lib/argsy.rb'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.authors = ['Egor Kolotaev']
|
7
|
+
spec.summary = 'Tiny "commands & options" DSL for your CLI scripts'
|
8
|
+
spec.email = %w(ekolotaev@gmail.com)
|
9
|
+
spec.homepage = 'https://github.com/kolotaev/argsy'
|
10
|
+
spec.license = 'The Unlicense'
|
11
|
+
spec.name = 'argsy'
|
12
|
+
spec.require_paths = [lib]
|
13
|
+
spec.required_ruby_version = '>= 2.4.5'
|
14
|
+
spec.description = spec.summary
|
15
|
+
spec.files = %w(LICENSE.txt README.md argsy.gemspec) + Dir[lib]
|
16
|
+
spec.version = '0.1.0'
|
17
|
+
end
|
data/lib/argsy.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
class Argsy
|
3
|
+
class Command
|
4
|
+
attr_reader :name, :desc, :do_it, :op, :opts
|
5
|
+
def initialize(name, desc, &bl) @name, @desc, @op, @opts = name, desc, OptionParser.new, {}; instance_eval(&bl) end
|
6
|
+
def options(&bl) @op.banner = "Usage: #{op.program_name} #{@name} [options] [--help]"; @op.instance_eval(&bl) end
|
7
|
+
def action(&block) @do_it = block end
|
8
|
+
def to_s() ' ' * 4 + @name + ' ' * (33 - @name.length).abs + @desc end
|
9
|
+
end
|
10
|
+
def initialize(ver='0.0.1', &bl) @name = File.basename($0, '.*'); @ver = ver; @cmds = {}; instance_eval(&bl) end
|
11
|
+
def command(name, desc='', &bl) @cmds[name.to_s] = Command.new(name.to_s, desc, &bl) end
|
12
|
+
def run(a=ARGV)
|
13
|
+
(puts "#{@name} version #{@ver}"; exit) if a == ['--version']
|
14
|
+
(puts "Usage: #{@name} CMD [--help] [--version]\n" + @cmds.values.map(&:to_s).join("\n"); exit) if !@cmds.key?(a[0])
|
15
|
+
c = @cmds[a[0]]; c.op.parse(a, into: c.opts); c.do_it.call(c.opts)
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: argsy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Egor Kolotaev
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-02-08 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Tiny "commands & options" DSL for your CLI scripts
|
14
|
+
email:
|
15
|
+
- ekolotaev@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- LICENSE.txt
|
21
|
+
- README.md
|
22
|
+
- argsy.gemspec
|
23
|
+
- lib/argsy.rb
|
24
|
+
homepage: https://github.com/kolotaev/argsy
|
25
|
+
licenses:
|
26
|
+
- The Unlicense
|
27
|
+
metadata: {}
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib/argsy.rb
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 2.4.5
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 2.7.6
|
45
|
+
signing_key:
|
46
|
+
specification_version: 4
|
47
|
+
summary: Tiny "commands & options" DSL for your CLI scripts
|
48
|
+
test_files: []
|