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 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