opt_struct 0.4.0 → 0.5.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 +9 -7
- data/lib/opt_struct/class_methods.rb +10 -31
- data/lib/opt_struct/instance_methods.rb +12 -3
- data/opt_struct.gemspec +1 -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: 55e3b71a809a00e523194d64dafde4a2d6e2e738
|
4
|
+
data.tar.gz: 2cacaade967a5840dfe41d0f7d2358b55b1dc603
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62439a89421d58a67470a4c3c614833a160781cd9a58711eeb4e5c4683986433d1eca64433f059f79bd6bfe12608096886eccca13cbea748ce813fb2f02cffa5
|
7
|
+
data.tar.gz: a33b20f55781929e3d955c69826ef0287cdefc388e0f88ef7eb57baaa8f12716704299b32b3dbd0eda22a301b6801b9b0f346b10df39036fd07981eee8244486
|
data/README.md
CHANGED
@@ -111,17 +111,19 @@ t.last_name = "Smith"
|
|
111
111
|
t.name
|
112
112
|
# => "Trish Smith"
|
113
113
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
options :year, transmission: "Automatic"
|
114
|
+
CarModule = OptStruct.build do
|
115
|
+
required :make, :model
|
116
|
+
options :year, transmission: "Automatic"
|
118
117
|
|
119
|
-
|
120
|
-
|
121
|
-
end
|
118
|
+
def name
|
119
|
+
[year, make, model].compact.join(" ")
|
122
120
|
end
|
123
121
|
end
|
124
122
|
|
123
|
+
class CarClass
|
124
|
+
include CarModule
|
125
|
+
end
|
126
|
+
|
125
127
|
c = CarClass.new(make: "Infiniti", model: "G37", year: 2012)
|
126
128
|
c.name
|
127
129
|
# => "2012 Infinit G37"
|
@@ -16,27 +16,15 @@ module OptStruct
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def option_reader(*keys)
|
19
|
-
meths = String.new
|
20
19
|
keys.each do |key|
|
21
|
-
|
22
|
-
def #{key}
|
23
|
-
options[:#{key}]
|
24
|
-
end
|
25
|
-
RUBY
|
20
|
+
define_method(key) { options[key] }
|
26
21
|
end
|
27
|
-
self.class_eval meths
|
28
22
|
end
|
29
23
|
|
30
24
|
def option_writer(*keys)
|
31
|
-
meths = String.new
|
32
25
|
keys.each do |key|
|
33
|
-
|
34
|
-
def #{key}=(value)
|
35
|
-
options[:#{key}] = value
|
36
|
-
end
|
37
|
-
RUBY
|
26
|
+
define_method("#{key}=") { |value| options[key] = value }
|
38
27
|
end
|
39
|
-
self.class_eval meths
|
40
28
|
end
|
41
29
|
|
42
30
|
def option_accessor(*keys)
|
@@ -63,29 +51,20 @@ module OptStruct
|
|
63
51
|
@defaults ||= {}
|
64
52
|
end
|
65
53
|
|
66
|
-
# For the record, I don't like this, but it's undeniably faster than alternatives
|
67
54
|
def expect_arguments(*arguments)
|
68
|
-
|
69
|
-
|
70
|
-
|
55
|
+
existing = expected_arguments.count
|
56
|
+
expected_arguments.concat(arguments)
|
57
|
+
|
71
58
|
arguments.each_with_index do |arg, i|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
raise ArgumentError, "missing required argument: #{arg}" unless defined?(@#{arg})
|
76
|
-
RUBY
|
59
|
+
n = i + existing
|
60
|
+
define_method(arg) { @arguments[n] }
|
61
|
+
define_method("#{arg}=") { |value| @arguments[n] = value }
|
77
62
|
end
|
78
|
-
|
79
|
-
def initialize(*values, **options)
|
80
|
-
@options = self.class.defaults.merge(options)
|
81
|
-
#{assignment_lines}
|
82
|
-
check_required_keys
|
83
|
-
end
|
84
|
-
RUBY
|
63
|
+
|
85
64
|
end
|
86
65
|
|
87
66
|
def expected_arguments
|
88
|
-
@expected_arguments
|
67
|
+
@expected_arguments ||= []
|
89
68
|
end
|
90
69
|
end
|
91
70
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module OptStruct
|
2
2
|
module InstanceMethods
|
3
|
-
def initialize(**options)
|
3
|
+
def initialize(*arguments, **options)
|
4
|
+
@arguments = arguments
|
4
5
|
@options = self.class.defaults.merge(options)
|
6
|
+
check_required_args
|
5
7
|
check_required_keys
|
6
8
|
end
|
7
9
|
|
@@ -18,8 +20,15 @@ module OptStruct
|
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
|
-
def
|
22
|
-
self.class.expected_arguments
|
23
|
+
def check_required_args
|
24
|
+
self.class.expected_arguments.each_with_index do |arg, i|
|
25
|
+
if i >= @arguments.length
|
26
|
+
unless options.key?(arg)
|
27
|
+
raise ArgumentError, "missing required argument: #{arg}"
|
28
|
+
end
|
29
|
+
@arguments[i] = options.delete(arg)
|
30
|
+
end
|
31
|
+
end
|
23
32
|
end
|
24
33
|
end
|
25
34
|
end
|
data/opt_struct.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opt_struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carl Zulauf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|