opt_struct 0.2.0 → 0.3.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 +4 -0
- data/lib/opt_struct/class_methods.rb +28 -2
- data/lib/opt_struct/instance_methods.rb +2 -27
- data/opt_struct.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13aeb90dc88ca1e4eabb9ab9f0a82b595cae5953
|
4
|
+
data.tar.gz: bb6faaad48a7fe17a7963b85f7612d2321f1e973
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 917067f619231d3575b0d2ddeb3cf921e749e5d12191fa7ab58844630e34059c8823d8b1dc5415c63b623d6a6da53c8f3376fdc2dfa2c88a262bf930455b2988
|
7
|
+
data.tar.gz: 49a85c43f919def4a677898dd83a67f68944262314fae1a316106ef3a6a9c84fb3005c1f44254eb5cbc18cfacac676acf8384b694e3d85a75fa34391e0f9cf34
|
data/README.md
CHANGED
@@ -16,15 +16,27 @@ module OptStruct
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def option_reader(*keys)
|
19
|
+
meths = String.new
|
19
20
|
keys.each do |key|
|
20
|
-
|
21
|
+
meths << <<~RUBY
|
22
|
+
def #{key}
|
23
|
+
options[:#{key}]
|
24
|
+
end
|
25
|
+
RUBY
|
21
26
|
end
|
27
|
+
self.class_eval meths
|
22
28
|
end
|
23
29
|
|
24
30
|
def option_writer(*keys)
|
31
|
+
meths = String.new
|
25
32
|
keys.each do |key|
|
26
|
-
|
33
|
+
meths << <<~RUBY
|
34
|
+
def #{key}=(value)
|
35
|
+
options[:#{key}] = value
|
36
|
+
end
|
37
|
+
RUBY
|
27
38
|
end
|
39
|
+
self.class_eval meths
|
28
40
|
end
|
29
41
|
|
30
42
|
def option_accessor(*keys)
|
@@ -51,9 +63,23 @@ module OptStruct
|
|
51
63
|
@defaults ||= {}
|
52
64
|
end
|
53
65
|
|
66
|
+
# For the record, I don't like this, but it's undeniably faster than alternatives
|
54
67
|
def expect_arguments(*arguments)
|
55
68
|
@expected_arguments = arguments
|
56
69
|
attr_accessor *arguments
|
70
|
+
lines = []
|
71
|
+
arguments.each_with_index do |arg, i|
|
72
|
+
lines << "@#{arg} = @options.delete(:#{arg}) if @options.key?(:#{arg})"
|
73
|
+
lines << "@#{arg} = values[#{i}] if values.length > #{i}"
|
74
|
+
lines << %[raise ArgumentError, "missing required argument: #{arg}" unless defined?(@#{arg})]
|
75
|
+
end
|
76
|
+
self.class_eval <<~RUBY
|
77
|
+
def initialize(*values, **options)
|
78
|
+
@options = self.class.defaults.merge(options)
|
79
|
+
#{lines.join("\n ")}
|
80
|
+
check_required_keys
|
81
|
+
end
|
82
|
+
RUBY
|
57
83
|
end
|
58
84
|
|
59
85
|
def expected_arguments
|
@@ -1,10 +1,7 @@
|
|
1
1
|
module OptStruct
|
2
2
|
module InstanceMethods
|
3
|
-
def initialize(
|
3
|
+
def initialize(**options)
|
4
4
|
@options = self.class.defaults.merge(options)
|
5
|
-
steal_arguments_from_options
|
6
|
-
assign_arguments(values)
|
7
|
-
check_arguments(values)
|
8
5
|
check_required_keys
|
9
6
|
end
|
10
7
|
|
@@ -14,30 +11,8 @@ module OptStruct
|
|
14
11
|
|
15
12
|
private
|
16
13
|
|
17
|
-
def steal_arguments_from_options
|
18
|
-
expected_arguments.each do |arg|
|
19
|
-
send("#{arg}=", options.delete(arg)) if options.key?(arg)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def assign_arguments(values)
|
24
|
-
values.each_with_index do |value, i|
|
25
|
-
send("#{expected_arguments[i]}=", value)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def check_arguments(args)
|
30
|
-
expected = expected_arguments.count
|
31
|
-
actual = expected_arguments.count do |arg|
|
32
|
-
instance_variable_defined?("@#{arg}")
|
33
|
-
end
|
34
|
-
unless actual == expected
|
35
|
-
raise ArgumentError, "only #{actual} of #{expected} required arguments present"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
14
|
def check_required_keys
|
40
|
-
missing = self.class.required_keys.
|
15
|
+
missing = self.class.required_keys.reject { |key| options.key?(key) }
|
41
16
|
if missing.any?
|
42
17
|
raise ArgumentError, "missing required keywords: #{missing.inspect}"
|
43
18
|
end
|
data/opt_struct.gemspec
CHANGED