strict_open_struct 0.0.1.1 → 0.0.2.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: 8472c72ec447b974aa0492d24169d22184bf1102
4
- data.tar.gz: 29145adf654bb7b8596e69e501f2b6a61d3b94f9
3
+ metadata.gz: bab137007912c58b5c4fb39406cfa72a241bfebb
4
+ data.tar.gz: 87646385dac31f05f5ce1ab9f483b93553ce2086
5
5
  SHA512:
6
- metadata.gz: b1d6318a21c1fa2261b6d8f11f91f176f15cba2d629e070fcda81b70d3b1f8a3734ea1670f3cfa18e4d04576dd9e1bf489ca2a9714204d17a54c03619036c98b
7
- data.tar.gz: 5073b4ad0687ff0ba253b8c0c2782ccdbbd74c5010e89dfe1df6e679fe0a35c397a67418e7383c1dd899056a701779f1713c759646fa972c827a4e369e09ab06
6
+ metadata.gz: 22e3d78e28453679d25b8789b35d8009edcd5ad1458635c94c650a358911db0ec00e2917f65145b2f884e72f636ed4c059da2ece9cce08c5ea18b151f49b152e
7
+ data.tar.gz: 979ef44087b87b08170446c40a4c28f5921f31ad006021a323ef452a14b5f9ed14f3563e9eb5ee7c3d429a06520a2ce8401ce81a5a85aebed5bc85e0dadf5f65
@@ -9,14 +9,33 @@ class StrictOpenStruct
9
9
  # Raises NoMethodError unless the underlying OpenStruct
10
10
  # responds to the method or the method is a setter
11
11
  def method_missing(method_name, *args, &block)
12
- if @open_struct.respond_to?(method_name) || method_name =~ /=$/
12
+ if open_struct_responds_to?(method_name)
13
13
  @open_struct.send(method_name, *args, &block)
14
14
  else
15
- fail NoMethodError, "undefined method `#{method_name}' for #{self}"
15
+ failure(method_name)
16
16
  end
17
17
  end
18
18
 
19
+ def respond_to_missing?(method_name, include_private = false)
20
+ open_struct_responds_to?(method_name)
21
+ end
22
+
19
23
  def ==(other)
20
24
  @open_struct == other.instance_variable_get("@open_struct")
21
25
  end
26
+
27
+ def [](key)
28
+ @open_struct.to_h.fetch(key.to_sym)
29
+ end
30
+
31
+ private
32
+
33
+ def failure(method_name)
34
+ fail NoMethodError, "undefined method `#{method_name}' for #{self}"
35
+ end
36
+
37
+ def open_struct_responds_to?(method_name)
38
+ @open_struct.respond_to?(method_name) || method_name =~ /=$/
39
+ end
40
+
22
41
  end
@@ -4,8 +4,8 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "strict_open_struct"
7
- spec.version = "0.0.1.1"
8
- spec.authors = ["Nathan Wenneker"]
7
+ spec.version = "0.0.2.0"
8
+ spec.authors = ["Nathan Wenneker, Jon Gautsch"]
9
9
  spec.email = ["nathan@preferral.com"]
10
10
  spec.summary = %q{Thin layer on top of OpenStruct to raise exceptions for undefined keys.}
11
11
  spec.homepage = "https://github.com/Preferral/strict_open_struct"
@@ -46,5 +46,17 @@ describe StrictOpenStruct do
46
46
  end
47
47
  end
48
48
 
49
+ describe "#[]" do
50
+ specify "returns value for key, when it exists" do
51
+ assert_equal StrictOpenStruct.new(a: 'a')[:a], 'a'
52
+ end
53
+
54
+ specify "raises an exception if key is undefined" do
55
+ assert_raises KeyError do
56
+ StrictOpenStruct.new[:a]
57
+ end
58
+ end
59
+ end
60
+
49
61
  end
50
62
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strict_open_struct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.1
4
+ version: 0.0.2.0
5
5
  platform: ruby
6
6
  authors:
7
- - Nathan Wenneker
7
+ - Nathan Wenneker, Jon Gautsch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-11 00:00:00.000000000 Z
11
+ date: 2016-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler