lab42_options 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -0
- data/lib/lab42/options/parser.rb +36 -3
- data/lib/lab42/options/version.rb +1 -1
- data/lib/lab42/options.rb +23 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7cc89febbade4730d1c7112704d5655af6d9cd5
|
4
|
+
data.tar.gz: 5de219eff28bf69199cdb5c1c59ef157eed0efd9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1dc5104a71fbe2ca6572fdebb57b88d22215086fb2f8d69b020f49fc9d52f75aeae2c012d590ba20096dc48da311b69eb6478600f079b40b6992fcb9e5c3ce67
|
7
|
+
data.tar.gz: 3fdaf3fcd7413022e98b1e322c4ded53296bc0005547a49aa492dac0a12ad9bf41e91f27a9cb922633ec60b9ff547c6b2ddab9995dcae2de7e3e0c0952396bdd
|
data/README.md
CHANGED
@@ -53,6 +53,24 @@ will parse as follows:
|
|
53
53
|
greet greeting: "howdy" # error missing required argument :target"
|
54
54
|
```
|
55
55
|
|
56
|
+
## Reading from yaml files
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
options = Lab42::Options.new greeting: "hello", target: :required
|
60
|
+
options.read_from "./options.yml"
|
61
|
+
# or
|
62
|
+
options.read_from :load # read from file indicated by load: <file>
|
63
|
+
# or
|
64
|
+
options.read_from load: "./.default_options.yml" # read from file indicated by load: <file>
|
65
|
+
# defaulting to "./.default_options.yml"
|
66
|
+
```
|
67
|
+
|
68
|
+
Although this allows for nested parameters, defaults and requirements for deeper levels are not implemented right now (and are maybe not in the scope of a parameter parser).
|
69
|
+
|
70
|
+
Existence of the yaml file is not reenforced either but that might be a good enhancement for the near
|
71
|
+
future.
|
72
|
+
|
73
|
+
|
56
74
|
## Missing Features
|
57
75
|
|
58
76
|
* Help Message Generation
|
data/lib/lab42/options/parser.rb
CHANGED
@@ -1,16 +1,31 @@
|
|
1
|
+
require 'yaml'
|
1
2
|
module Lab42
|
2
3
|
class Options
|
3
4
|
class Parser
|
4
|
-
attr_accessor :data, :kwds, :positionals
|
5
|
-
def parse args
|
5
|
+
attr_accessor :data, :defaults, :kwds, :positionals, :yaml_file
|
6
|
+
def parse options, args
|
7
|
+
self.yaml_file = options.yaml_file
|
6
8
|
self.data = {to_a: args}
|
7
9
|
self.kwds = {}
|
8
10
|
self.positionals = []
|
9
11
|
parse_all args
|
10
|
-
|
12
|
+
# read_yaml file might need the args parsed
|
13
|
+
defaults = read_yaml_file
|
14
|
+
data.merge kwds: OpenStruct.new(defaults.merge(kwds)), args: positionals
|
11
15
|
end
|
12
16
|
|
13
17
|
private
|
18
|
+
def convert_hash hs
|
19
|
+
return hs unless Hash === hs
|
20
|
+
hs.keys.inject Hash.new do |h, k|
|
21
|
+
if String === k
|
22
|
+
h.merge k.to_sym => convert_hash( hs[k] )
|
23
|
+
else
|
24
|
+
h.merge k => convert_hash( hs[k] )
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
14
29
|
def parse_all args
|
15
30
|
e = (args[0..-1] || []).enum_for :each
|
16
31
|
loop do
|
@@ -25,6 +40,24 @@ module Lab42
|
|
25
40
|
end
|
26
41
|
end
|
27
42
|
|
43
|
+
def read_yaml_file
|
44
|
+
read_yaml_file!
|
45
|
+
rescue Errno::ENOENT
|
46
|
+
{}
|
47
|
+
end
|
48
|
+
|
49
|
+
def read_yaml_file!
|
50
|
+
case yaml_file
|
51
|
+
when Hash
|
52
|
+
file = kwds.fetch( yaml_file.keys.first, yaml_file.values.first )
|
53
|
+
file ? convert_hash( YAML.load File.read file ) : {}
|
54
|
+
when String
|
55
|
+
convert_hash YAML.load File.read yaml_file
|
56
|
+
else
|
57
|
+
{}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
28
61
|
def update_value key, val
|
29
62
|
kwds.merge! key => val do |k, oldv, newv|
|
30
63
|
Array( oldv ) << newv
|
data/lib/lab42/options.rb
CHANGED
@@ -4,9 +4,11 @@ require_relative './options/forwarder'
|
|
4
4
|
|
5
5
|
module Lab42
|
6
6
|
class Options
|
7
|
+
attr_reader :yaml_file
|
8
|
+
|
7
9
|
def parse *args
|
8
10
|
args = args.first if Array === args.first
|
9
|
-
@parsed = Lab42::Options::Parser.new.parse( args )
|
11
|
+
@parsed = Lab42::Options::Parser.new.parse( self, args )
|
10
12
|
set_defaults
|
11
13
|
check_required
|
12
14
|
issue_errors!
|
@@ -14,6 +16,17 @@ module Lab42
|
|
14
16
|
result.forwarding_to :kwds
|
15
17
|
end
|
16
18
|
|
19
|
+
def read_from file_sym_or_hash
|
20
|
+
case file_sym_or_hash
|
21
|
+
when String
|
22
|
+
read_from_file file_sym_or_hash
|
23
|
+
when Symbol
|
24
|
+
read_from_parameterized_file file_sym_or_hash => nil
|
25
|
+
else
|
26
|
+
read_from_parameterized_file file_sym_or_hash
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
17
30
|
private
|
18
31
|
def initialize options={}
|
19
32
|
@registered = {}
|
@@ -42,6 +55,15 @@ module Lab42
|
|
42
55
|
@registered[k] = v
|
43
56
|
end
|
44
57
|
|
58
|
+
def read_from_file file
|
59
|
+
@yaml_file = file
|
60
|
+
end
|
61
|
+
|
62
|
+
def read_from_parameterized_file params
|
63
|
+
raise ArgumentError, "#{params} is not a Hash" unless Hash === params
|
64
|
+
@yaml_file = params
|
65
|
+
end
|
66
|
+
|
45
67
|
def required_options
|
46
68
|
@__required_options__ ||=
|
47
69
|
@registered.select{|_,v| v == :required}.keys
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lab42_options
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Dober
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-08-
|
11
|
+
date: 2013-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|