opt_struct 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 20cc3d259d8f9a17a7804fa4022e01862483a8b8
4
- data.tar.gz: 92344e5ac8ec8d8abd8a4512fed58584c67041ff
3
+ metadata.gz: 55e3b71a809a00e523194d64dafde4a2d6e2e738
4
+ data.tar.gz: 2cacaade967a5840dfe41d0f7d2358b55b1dc603
5
5
  SHA512:
6
- metadata.gz: 349c78d63e1f56eaa801de15ad3294de2e2877c5345997e68568b5a4c985ffcbaee11abf0b01584a5d5a81bc022aa48e8a87e20bf6ca343c1858f37ac6f3ff1e
7
- data.tar.gz: d2d65670ac1c8a1f4e0a09a0ad1836a67190ad6d81d06b5a50613c4921b49431436cc24f1aac7eec69503bad4db5ac2497a203df4f9837342e131a6d402eb19f
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
- class CarClass
115
- include OptStruct.build do
116
- required :make, :model
117
- options :year, transmission: "Automatic"
114
+ CarModule = OptStruct.build do
115
+ required :make, :model
116
+ options :year, transmission: "Automatic"
118
117
 
119
- def name
120
- [year, make, model].compact.join(" ")
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
- meths << <<~RUBY
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
- meths << <<~RUBY
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
- @expected_arguments = arguments
69
- attr_accessor *arguments
70
- assignment_lines = String.new
55
+ existing = expected_arguments.count
56
+ expected_arguments.concat(arguments)
57
+
71
58
  arguments.each_with_index do |arg, i|
72
- assignment_lines << <<~RUBY
73
- @#{arg} = @options.delete(:#{arg}) if @options.key?(:#{arg})
74
- @#{arg} = values[#{i}] if values.length > #{i}
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
- self.class_eval <<~RUBY
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 expected_arguments
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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "opt_struct"
3
- spec.version = "0.4.0"
3
+ spec.version = "0.5.0"
4
4
  spec.authors = ["Carl Zulauf"]
5
5
  spec.email = ["carl@linkleaf.com"]
6
6
 
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.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-05-29 00:00:00.000000000 Z
11
+ date: 2017-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler