opt_struct 0.2.0 → 0.3.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 +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