hashmake 0.1.4 → 0.1.5
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.
- data/lib/hashmake/arg_spec.rb +4 -12
- data/lib/hashmake/hash_makeable.rb +38 -23
- data/lib/hashmake/version.rb +1 -1
- data/spec/arg_spec_spec.rb +2 -2
- data/spec/hash_makeable_spec.rb +8 -7
- metadata +4 -4
data/lib/hashmake/arg_spec.rb
CHANGED
@@ -7,18 +7,9 @@ module Hashmake
|
|
7
7
|
#
|
8
8
|
class ArgSpec
|
9
9
|
|
10
|
-
#
|
11
|
-
# :type (rather than a container which contains values of type :type).
|
12
|
-
CONTAINER_NONE = :containerNone
|
13
|
-
# Used to specify that an arg key is mapped to an Array that contains values
|
14
|
-
# of type :type.
|
15
|
-
CONTAINER_ARRAY = :containerArray
|
16
|
-
# Used to specify that an arg key is mapped to a Hash that contains values
|
17
|
-
# of type :type.
|
18
|
-
CONTAINER_HASH = :containerHash
|
19
|
-
# The valid container types. CONTAINER_NONE indicates no container is expected,
|
10
|
+
# The valid container types. If nil, indicates no container is expected,
|
20
11
|
# just a plain object of type given by :type.
|
21
|
-
CONTAINERS = [
|
12
|
+
CONTAINERS = [ nil, Hash, Array ]
|
22
13
|
|
23
14
|
# Defines default key/value pairs to use in initializing an instance.
|
24
15
|
# The :reqd key is set to true by default.
|
@@ -27,7 +18,8 @@ class ArgSpec
|
|
27
18
|
DEFAULT_ARGS = {
|
28
19
|
:reqd => true,
|
29
20
|
:validator => ->(a){true},
|
30
|
-
:container =>
|
21
|
+
:container => nil,
|
22
|
+
:type => Object,
|
31
23
|
}
|
32
24
|
|
33
25
|
attr_reader :key, :type, :validator, :reqd, :default, :container
|
@@ -24,13 +24,12 @@ module HashMakeable
|
|
24
24
|
# not then a default value is assigned (again, according to
|
25
25
|
# arg_specs passed in).
|
26
26
|
def hash_make arg_specs, hashed_args, assign_args = true
|
27
|
-
arg_specs.each do |arg_spec|
|
27
|
+
arg_specs.each do |key, arg_spec|
|
28
28
|
raise ArgumentError, "arg_specs item #{arg_spec} is not a ArgSpec" unless arg_spec.is_a?(ArgSpec)
|
29
29
|
end
|
30
30
|
raise ArgumentError, "hashed_args is not a Hash" unless hashed_args.is_a?(Hash)
|
31
31
|
|
32
|
-
arg_specs.each do |arg_spec|
|
33
|
-
key = arg_spec.key
|
32
|
+
arg_specs.each do |key, arg_spec|
|
34
33
|
if hashed_args.has_key?(key)
|
35
34
|
val = hashed_args[key]
|
36
35
|
else
|
@@ -45,36 +44,52 @@ module HashMakeable
|
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
48
|
-
|
49
|
-
when ArgSpec::CONTAINER_ARRAY
|
50
|
-
raise ArgumentError, "val #{val} is not an array" unless val.is_a?(Array)
|
51
|
-
val.each do |item|
|
52
|
-
raise ArgumentError, "array item #{item} is not a #{arg_spec.type}" unless item.is_a?(arg_spec.type)
|
53
|
-
raise ArgumentError, "array item #{item} is not valid" unless arg_spec.validator.call(item)
|
54
|
-
end
|
55
|
-
when ArgSpec::CONTAINER_HASH
|
56
|
-
raise ArgumentError, "val #{val} is not a hash" unless val.is_a?(Hash)
|
57
|
-
val.values.each do |item|
|
58
|
-
raise ArgumentError, "hash item #{item} is not a #{arg_spec.type}" unless item.is_a?(arg_spec.type)
|
59
|
-
raise ArgumentError, "hash item #{item} is not valid" unless arg_spec.validator.call(item)
|
60
|
-
end
|
61
|
-
when ArgSpec::CONTAINER_NONE
|
62
|
-
raise ArgumentError, "val #{val} is not a #{arg_spec.type}" unless val.is_a?(arg_spec.type)
|
63
|
-
raise ArgumentError, "val #{val} is not valid" unless arg_spec.validator.call(val)
|
64
|
-
else
|
65
|
-
raise ArgumentError, "arg_spec.container #{arg_spec.container} is not valid"
|
66
|
-
end
|
67
|
-
|
47
|
+
validate_arg arg_spec, val
|
68
48
|
if assign_args
|
69
49
|
self.instance_variable_set("@#{key.to_s}".to_sym, val)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def validate_arg arg_spec, val
|
55
|
+
if arg_spec.container == Array
|
56
|
+
raise ArgumentError, "val #{val} is not an array" unless val.is_a?(Array)
|
57
|
+
val.each do |item|
|
58
|
+
raise ArgumentError, "array item #{item} is not a #{arg_spec.type}" unless item.is_a?(arg_spec.type)
|
59
|
+
raise ArgumentError, "array item #{item} is not valid" unless arg_spec.validator.call(item)
|
60
|
+
end
|
61
|
+
elsif arg_spec.container == Hash
|
62
|
+
raise ArgumentError, "val #{val} is not a hash" unless val.is_a?(Hash)
|
63
|
+
val.values.each do |item|
|
64
|
+
raise ArgumentError, "hash item #{item} is not a #{arg_spec.type}" unless item.is_a?(arg_spec.type)
|
65
|
+
raise ArgumentError, "hash item #{item} is not valid" unless arg_spec.validator.call(item)
|
70
66
|
end
|
67
|
+
elsif arg_spec.container.nil?
|
68
|
+
raise ArgumentError, "val #{val} is not a #{arg_spec.type}" unless val.is_a?(arg_spec.type)
|
69
|
+
raise ArgumentError, "val #{val} is not valid" unless arg_spec.validator.call(val)
|
70
|
+
else
|
71
|
+
raise ArgumentError, "arg_spec.container #{arg_spec.container} is not valid"
|
71
72
|
end
|
73
|
+
|
74
|
+
return true
|
72
75
|
end
|
73
76
|
|
74
77
|
# Contains class methods to be added to a class that includes the
|
75
78
|
# HashMakeable module.
|
76
79
|
module ClassMethods
|
80
|
+
def arg_spec args
|
81
|
+
ArgSpec.new args
|
82
|
+
end
|
77
83
|
|
84
|
+
def arg_spec_array args
|
85
|
+
args = { :container => Array, :default => ->(){Array.new} }.merge(args)
|
86
|
+
ArgSpec.new args
|
87
|
+
end
|
88
|
+
|
89
|
+
def arg_spec_hash args
|
90
|
+
args = { :container => Hash, :default => ->(){Hash.new} }.merge(args)
|
91
|
+
ArgSpec.new args
|
92
|
+
end
|
78
93
|
end
|
79
94
|
|
80
95
|
end
|
data/lib/hashmake/version.rb
CHANGED
data/spec/arg_spec_spec.rb
CHANGED
@@ -17,7 +17,7 @@ describe Hashmake::ArgSpec do
|
|
17
17
|
lambda { Hashmake::ArgSpec.new hash }.should_not raise_error(ArgumentError)
|
18
18
|
end
|
19
19
|
|
20
|
-
it 'should raise ArgumentError if valid container is given' do
|
20
|
+
it 'should not raise ArgumentError if valid container is given' do
|
21
21
|
Hashmake::ArgSpec::CONTAINERS.each do |container|
|
22
22
|
hash = {
|
23
23
|
:reqd => true, :key => :stuff, :type => String, :container => container
|
@@ -29,7 +29,7 @@ describe Hashmake::ArgSpec do
|
|
29
29
|
|
30
30
|
it 'should raise ArgumentError if invalid container is given' do
|
31
31
|
hash = {
|
32
|
-
:reqd => true, :key => :stuff, :type => String, :container =>
|
32
|
+
:reqd => true, :key => :stuff, :type => String, :container => Fixnum
|
33
33
|
}
|
34
34
|
|
35
35
|
lambda { Hashmake::ArgSpec.new hash }.should raise_error(ArgumentError)
|
data/spec/hash_makeable_spec.rb
CHANGED
@@ -1,20 +1,21 @@
|
|
1
|
+
require 'pry'
|
1
2
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
3
|
|
3
4
|
describe Hashmake::HashMakeable do
|
4
5
|
class MyTestClass
|
5
6
|
include HashMakeable
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
ARG_SPECS = {
|
9
|
+
:reqd_string => arg_spec(:reqd => true, :type => String, :validator => ->(a){ a.length < 10 }),
|
10
|
+
:not_reqd_float => arg_spec(:reqd => false, :type => Float, :default => 0.0, :validator => ->(a){ a.between?(0.0,1.0) }),
|
11
|
+
:not_reqd_array_of_float => arg_spec_array(:reqd => false, :type => Float, :validator => ->(a){ a.between?(0.0,1.0) }),
|
12
|
+
:not_reqd_hash_of_float => arg_spec_hash(:reqd => false, :type => Float, :validator => ->(a){ a.between?(0.0,1.0) }),
|
13
|
+
}
|
13
14
|
|
14
15
|
attr_reader :reqd_string, :not_reqd_float, :not_reqd_array_of_float, :not_reqd_hash_of_float
|
15
16
|
|
16
17
|
def initialize hashed_args = {}
|
17
|
-
hash_make
|
18
|
+
hash_make ARG_SPECS, hashed_args
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hashmake
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -133,7 +133,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
133
133
|
version: '0'
|
134
134
|
segments:
|
135
135
|
- 0
|
136
|
-
hash:
|
136
|
+
hash: 144920435
|
137
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
@@ -142,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
142
|
version: '0'
|
143
143
|
segments:
|
144
144
|
- 0
|
145
|
-
hash:
|
145
|
+
hash: 144920435
|
146
146
|
requirements: []
|
147
147
|
rubyforge_project:
|
148
148
|
rubygems_version: 1.8.23
|