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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8ffdb6352a7c6f0ac1b8ace9d92f9618b6f15b6d
4
- data.tar.gz: d87218eb3c56609fab3185facd228771ae2ac2bd
3
+ metadata.gz: 13aeb90dc88ca1e4eabb9ab9f0a82b595cae5953
4
+ data.tar.gz: bb6faaad48a7fe17a7963b85f7612d2321f1e973
5
5
  SHA512:
6
- metadata.gz: b310d805c7e04e852828893c04591620ff55e922747b25a5551e1dc57f3bf832b401c2ad0f2a8a83bdaf39150582389a18449e9d2f9d7a08ec24bca4d05ac78d
7
- data.tar.gz: 630df79a1c2ba0c2899324b69f14e2e90f72a0d366487bba94c388a63966214efa5e0fe324e72a6bacf01674a3b1fdeeffe5de264209f49de1d1bbcbedd8bb1d
6
+ metadata.gz: 917067f619231d3575b0d2ddeb3cf921e749e5d12191fa7ab58844630e34059c8823d8b1dc5415c63b623d6a6da53c8f3376fdc2dfa2c88a262bf930455b2988
7
+ data.tar.gz: 49a85c43f919def4a677898dd83a67f68944262314fae1a316106ef3a6a9c84fb3005c1f44254eb5cbc18cfacac676acf8384b694e3d85a75fa34391e0f9cf34
data/README.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  A struct around a hash
4
4
 
5
+ ```ruby
6
+ gem "opt_struct"
7
+ ```
8
+
5
9
  ## Example 1
6
10
 
7
11
  Can work mostly like a regular struct, while accepting options
@@ -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
- define_method(key) { options[key] }
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
- define_method("#{key}=") { |value| options[key] = value }
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(*values, **options)
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.select { |key| !options.key?(key) }
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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "opt_struct"
3
- spec.version = "0.2.0"
3
+ spec.version = "0.3.0"
4
4
  spec.authors = ["Carl Zulauf"]
5
5
  spec.email = ["carl@linkleaf.com"]
6
6
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opt_struct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carl Zulauf