arguvia 0.1.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 +7 -0
- data/LICENSE.txt +23 -0
- data/README.md +62 -0
- data/lib/arguvia.rb +58 -0
- data/lib/arguvia/version.rb +3 -0
- data/test/test_arguvia.rb +71 -0
- metadata +49 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 649a7cfe18e7aea4094964e4a5974b8983dc43f3
|
|
4
|
+
data.tar.gz: 8e363991a977f8d560a649c9999dee1aeae2e14e
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 25474e2f5bbb4decb95fe282a85594981257b69fbf939239aba0b3f17598a7d115cc6024ac14ca9c602737fda1c89c7b51052903ba2c8a9525db44f5c0453771
|
|
7
|
+
data.tar.gz: 10ec1e19d3909014bae42be9ca82bd10b72b4fa3c569b5e6227c425453f769961b34e1ac9bb941fb7fa6bc1ce4f5e1ca798ef5f407681a843b38818c36d87f55
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
Copyright (c) 2013 Joseph (fluorine@github)
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any
|
|
4
|
+
person obtaining a copy of this software and associated
|
|
5
|
+
documentation files (the "Software"), to deal in the
|
|
6
|
+
Software without restriction, including without limitation
|
|
7
|
+
the rights to use, copy, modify, merge, publish,
|
|
8
|
+
distribute, sublicense, and/or sell copies of the
|
|
9
|
+
Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice
|
|
13
|
+
shall be included in all copies or substantial portions of
|
|
14
|
+
the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
|
17
|
+
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
18
|
+
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
|
19
|
+
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
|
20
|
+
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
21
|
+
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
22
|
+
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
23
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
Arguvia v0.1.0
|
|
2
|
+
==============
|
|
3
|
+
This gem contains a function-like argument parser
|
|
4
|
+
for command-line applications.
|
|
5
|
+
|
|
6
|
+
This is an example of a command-line application
|
|
7
|
+
that uses function-like arguments:
|
|
8
|
+
|
|
9
|
+
dictionary.rb words(10) open-file(words.txt) Singular
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
Description
|
|
13
|
+
-----------
|
|
14
|
+
Arguvia gem allows any Ruby application to use function-like
|
|
15
|
+
arguments for its command-line interface.
|
|
16
|
+
|
|
17
|
+
This gem contains the `Arguvia` class, which parses the given
|
|
18
|
+
list of arguments to map them to class members and indeternal
|
|
19
|
+
Ruby values.
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
Using the Arguvia class
|
|
23
|
+
-----------------------
|
|
24
|
+
Let's take the introductory example to show how
|
|
25
|
+
the `Arguvia` class works:
|
|
26
|
+
|
|
27
|
+
dictionary.rb words(10) open-file(words.txt) Singular
|
|
28
|
+
|
|
29
|
+
The `dictionary.rb` hypothetic script uses function-like
|
|
30
|
+
command-line arguments through the `arguvia` gem.
|
|
31
|
+
|
|
32
|
+
The `Arguvia` class generates the class members for
|
|
33
|
+
the given command-line arguments.
|
|
34
|
+
|
|
35
|
+
require 'arguvia'
|
|
36
|
+
x = Arguvia.new # It equals to 'Arguvia.new(ARGV)'
|
|
37
|
+
x.words # => 10
|
|
38
|
+
x.open_file # => "words.txt"
|
|
39
|
+
x.singular # => true
|
|
40
|
+
x.undefined # => false
|
|
41
|
+
|
|
42
|
+
`Arguvia` class uses the dynamic and metaprogramming
|
|
43
|
+
features of Ruby to generate an object, which members maps
|
|
44
|
+
the given arguments.
|
|
45
|
+
|
|
46
|
+
Examples of valid arguments
|
|
47
|
+
----------------------------------
|
|
48
|
+
|Argument |Identifier | Value |
|
|
49
|
+
|:---------:|:---------:|:------:|
|
|
50
|
+
|foo |`x.foo` |true |
|
|
51
|
+
|--etc |`x._etc ` |true |
|
|
52
|
+
|-h |`x._h` |true |
|
|
53
|
+
| |`x.baz` |nil |
|
|
54
|
+
|func(1) |`x.func` |1 |
|
|
55
|
+
|dir(etc) |`x.dir` |"etc" |
|
|
56
|
+
|xs(1, 2, 3)|`x.xs` |[1,2,3] |
|
|
57
|
+
|pair(a, 7) |`x.pair` |["a", 7]|
|
|
58
|
+
|
|
59
|
+
To do
|
|
60
|
+
-----
|
|
61
|
+
- Support for special symbols.
|
|
62
|
+
- Support for literal strings (allow internal spaces)
|
data/lib/arguvia.rb
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
class Arguvia
|
|
2
|
+
def initialize(args = ARGV)
|
|
3
|
+
@args = {}
|
|
4
|
+
|
|
5
|
+
# Add bindings
|
|
6
|
+
args.each do |arg|
|
|
7
|
+
case arg
|
|
8
|
+
when /^([\w\-]+)$/
|
|
9
|
+
@args[__parse_key(arg)] = true
|
|
10
|
+
when /^([\w\-]+)\((.*)\)$/
|
|
11
|
+
@args[__parse_key($1)] = __parse_value($2)
|
|
12
|
+
else
|
|
13
|
+
raise ArgumentError
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Generate ghost methods, if requiered
|
|
19
|
+
def method_missing(name, *args)
|
|
20
|
+
super unless args.length == 0
|
|
21
|
+
@args[name]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Add responding methods
|
|
25
|
+
def respond_to?(name)
|
|
26
|
+
return true if @args.keys.include? name
|
|
27
|
+
super(name)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# Internal methods
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# Parse key type
|
|
37
|
+
def __parse_key(str)
|
|
38
|
+
return str.gsub(/-+/, "_").downcase.to_sym
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Parse value type
|
|
42
|
+
def __parse_value(str)
|
|
43
|
+
case str
|
|
44
|
+
when /,/
|
|
45
|
+
# Split and evaluate recursively
|
|
46
|
+
# if multiple arguments.
|
|
47
|
+
str.split(/,/).map do |item|
|
|
48
|
+
__parse_value(item.strip)
|
|
49
|
+
end
|
|
50
|
+
when /-?\d+\.\d+/
|
|
51
|
+
str.to_f
|
|
52
|
+
when /-?\d+/
|
|
53
|
+
str.to_i
|
|
54
|
+
else
|
|
55
|
+
str
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require 'arguvia'
|
|
2
|
+
require 'test/unit'
|
|
3
|
+
|
|
4
|
+
class TestArguvia < Test::Unit::TestCase
|
|
5
|
+
def setup
|
|
6
|
+
# Simple boolean arguments
|
|
7
|
+
@simple_strs = ["hola", "mundo", "vi-va", "--foo", "rivendel"]
|
|
8
|
+
@simple_args = Arguvia.new(@simple_strs)
|
|
9
|
+
|
|
10
|
+
# Function-like arguments
|
|
11
|
+
@func_strs = ["hola(mundo)", "integer(12)", "float(12.345)",
|
|
12
|
+
"multi(1, 2, 3)", "ma-ny(a, ab, cde)"]
|
|
13
|
+
@func_res = {hola: "mundo", integer: 12,
|
|
14
|
+
float: 12.345, multi: [1, 2, 3],
|
|
15
|
+
ma_ny: ["a", "ab", "cde"]}
|
|
16
|
+
@func_args = Arguvia.new(@func_strs)
|
|
17
|
+
|
|
18
|
+
# Complex arguments
|
|
19
|
+
@complex_strs = ["hola-mundo(saludo, despedida)", "--help",
|
|
20
|
+
"numbers(1, 1.23, -1, -3.245)",
|
|
21
|
+
"--file(/usr/hi/hola.txt)", "--PATH(ruby.exe)"]
|
|
22
|
+
@complex_res = {hola_mundo: ["saludo", "despedida"], _help: true,
|
|
23
|
+
numbers: [1, 1.23, -1, -3.245], _file: "/usr/hi/hola.txt",
|
|
24
|
+
_path: "ruby.exe"}
|
|
25
|
+
@complex_args = Arguvia.new(@complex_strs)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Test simple arguments's method respond_to?
|
|
30
|
+
#
|
|
31
|
+
|
|
32
|
+
def test_false_respond_to
|
|
33
|
+
false_strs = ["a", "bar", "gaga", "etc", "demons"]
|
|
34
|
+
false_strs.each do |item|
|
|
35
|
+
assert_equal(@simple_args.respond_to?(item.to_sym), false)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_true_respond_to
|
|
40
|
+
@simple_strs.each do |item|
|
|
41
|
+
assert(@simple_args.respond_to? item.gsub(/-+/, "_").to_sym)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Test simple arguments's generated members
|
|
47
|
+
#
|
|
48
|
+
def test_simple_arguvia_members
|
|
49
|
+
@simple_strs.each do |name|
|
|
50
|
+
assert(eval("@simple_args.#{name.gsub(/-+/, "_")}"))
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
#
|
|
55
|
+
# Test function-like argumens
|
|
56
|
+
#
|
|
57
|
+
def test_function_like_arguments
|
|
58
|
+
@func_res.each do |key, value|
|
|
59
|
+
assert_equal(eval("@func_args.#{key}"), value)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# Test complex function-like argumens
|
|
65
|
+
#
|
|
66
|
+
def test_complex_arguments
|
|
67
|
+
@complex_res.each do |key, value|
|
|
68
|
+
assert_equal(eval("@complex_args.#{key}"), value)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: arguvia
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Joseph
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2013-07-24 00:00:00.000000000 Z
|
|
12
|
+
dependencies: []
|
|
13
|
+
description: This script allows applications to parse and use command-line arguments
|
|
14
|
+
in a function-like fashion. For example, 'dict words(10) open-file(words.txt)'
|
|
15
|
+
email: fluorine@github.com
|
|
16
|
+
executables: []
|
|
17
|
+
extensions: []
|
|
18
|
+
extra_rdoc_files: []
|
|
19
|
+
files:
|
|
20
|
+
- lib/arguvia.rb
|
|
21
|
+
- lib/arguvia/version.rb
|
|
22
|
+
- README.md
|
|
23
|
+
- LICENSE.txt
|
|
24
|
+
- test/test_arguvia.rb
|
|
25
|
+
homepage: https://github.com/fluorine/Arguvia
|
|
26
|
+
licenses:
|
|
27
|
+
- MIT
|
|
28
|
+
metadata: {}
|
|
29
|
+
post_install_message:
|
|
30
|
+
rdoc_options: []
|
|
31
|
+
require_paths:
|
|
32
|
+
- lib
|
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
34
|
+
requirements:
|
|
35
|
+
- - '>='
|
|
36
|
+
- !ruby/object:Gem::Version
|
|
37
|
+
version: '0'
|
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
39
|
+
requirements:
|
|
40
|
+
- - '>='
|
|
41
|
+
- !ruby/object:Gem::Version
|
|
42
|
+
version: '0'
|
|
43
|
+
requirements: []
|
|
44
|
+
rubyforge_project:
|
|
45
|
+
rubygems_version: 2.0.3
|
|
46
|
+
signing_key:
|
|
47
|
+
specification_version: 4
|
|
48
|
+
summary: A function-like argument parser for command-line applications.
|
|
49
|
+
test_files: []
|