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