Commit 1a99c9f16d46034c5f07eae5c384303b100d3115
1 parent
176afba3
Exists in
less_deps
Less deps [skip ci]
Showing
2 changed files
with
36 additions
and
19 deletions
Show diff stats
lib/searchkick/hash_wrapper.rb
1 | module Searchkick | 1 | module Searchkick |
2 | - # Subclass of `Hashie::Mash` to wrap Hash-like structures | ||
3 | - # (responses from Elasticsearch) | ||
4 | - # | ||
5 | - # The primary goal of the subclass is to disable the | ||
6 | - # warning being printed by Hashie for re-defined | ||
7 | - # methods, such as `sort`. | ||
8 | - # | ||
9 | - class HashWrapper < ::Hashie::Mash | ||
10 | - disable_warnings if respond_to?(:disable_warnings) | 2 | + class HashWrapper |
3 | + def initialize(data) | ||
4 | + @data = data | ||
5 | + end | ||
6 | + | ||
7 | + def method_missing(m, *args, &block) | ||
8 | + if @data.key?(m.to_s) | ||
9 | + raise ArgumentError, "wrong number of arguments (given #{args.size}, expected 0)" if args.any? | ||
10 | + @data[m.to_s] | ||
11 | + else | ||
12 | + super | ||
13 | + end | ||
14 | + end | ||
15 | + | ||
16 | + def respond_to?(m, include_private = false) | ||
17 | + @data.key?(m.to_s) || super | ||
18 | + end | ||
19 | + | ||
20 | + def to_h | ||
21 | + @data | ||
22 | + end | ||
23 | + | ||
24 | + def inspect | ||
25 | + str = @data.map { |k, v| "#{k}=#{v.inspect}" }.join(" ") | ||
26 | + "#<Searchkick::HashWrapper #{str}>" | ||
27 | + end | ||
11 | end | 28 | end |
12 | end | 29 | end |
test/sql_test.rb
@@ -68,7 +68,7 @@ class SqlTest < Minitest::Test | @@ -68,7 +68,7 @@ class SqlTest < Minitest::Test | ||
68 | 68 | ||
69 | def test_load_false | 69 | def test_load_false |
70 | store_names ["Product A"] | 70 | store_names ["Product A"] |
71 | - assert_kind_of Hash, Product.search("product", load: false).first | 71 | + assert_kind_of Searchkick::HashWrapper, Product.search("product", load: false).first |
72 | end | 72 | end |
73 | 73 | ||
74 | def test_load_false_methods | 74 | def test_load_false_methods |
@@ -78,7 +78,7 @@ class SqlTest < Minitest::Test | @@ -78,7 +78,7 @@ class SqlTest < Minitest::Test | ||
78 | 78 | ||
79 | def test_load_false_with_includes | 79 | def test_load_false_with_includes |
80 | store_names ["Product A"] | 80 | store_names ["Product A"] |
81 | - assert_kind_of Hash, Product.search("product", load: false, includes: [:store]).first | 81 | + assert_kind_of Searchkick::HashWrapper, Product.search("product", load: false, includes: [:store]).first |
82 | end | 82 | end |
83 | 83 | ||
84 | def test_load_false_nested_object | 84 | def test_load_false_nested_object |
@@ -92,7 +92,7 @@ class SqlTest < Minitest::Test | @@ -92,7 +92,7 @@ class SqlTest < Minitest::Test | ||
92 | def test_select | 92 | def test_select |
93 | store [{name: "Product A", store_id: 1}] | 93 | store [{name: "Product A", store_id: 1}] |
94 | result = Product.search("product", load: false, select: [:name, :store_id]).first | 94 | result = Product.search("product", load: false, select: [:name, :store_id]).first |
95 | - assert_equal %w(id name store_id), result.keys.reject { |k| k.start_with?("_") }.sort | 95 | + assert_equal %w(id name store_id), result.to_h.keys.reject { |k| k.start_with?("_") }.sort |
96 | assert_equal "Product A", result.name | 96 | assert_equal "Product A", result.name |
97 | assert_equal 1, result.store_id | 97 | assert_equal 1, result.store_id |
98 | end | 98 | end |
@@ -106,9 +106,9 @@ class SqlTest < Minitest::Test | @@ -106,9 +106,9 @@ class SqlTest < Minitest::Test | ||
106 | def test_select_single_field | 106 | def test_select_single_field |
107 | store [{name: "Product A", store_id: 1}] | 107 | store [{name: "Product A", store_id: 1}] |
108 | result = Product.search("product", load: false, select: :name).first | 108 | result = Product.search("product", load: false, select: :name).first |
109 | - assert_equal %w(id name), result.keys.reject { |k| k.start_with?("_") }.sort | 109 | + assert_equal %w(id name), result.to_h.keys.reject { |k| k.start_with?("_") }.sort |
110 | assert_equal "Product A", result.name | 110 | assert_equal "Product A", result.name |
111 | - assert_nil result.store_id | 111 | + assert !result.respond_to?(:store_id) |
112 | end | 112 | end |
113 | 113 | ||
114 | def test_select_all | 114 | def test_select_all |
@@ -129,15 +129,15 @@ class SqlTest < Minitest::Test | @@ -129,15 +129,15 @@ class SqlTest < Minitest::Test | ||
129 | def test_select_includes | 129 | def test_select_includes |
130 | store [{name: "Product A", user_ids: [1, 2]}] | 130 | store [{name: "Product A", user_ids: [1, 2]}] |
131 | result = Product.search("product", load: false, select: {includes: [:name]}).first | 131 | result = Product.search("product", load: false, select: {includes: [:name]}).first |
132 | - assert_equal %w(id name), result.keys.reject { |k| k.start_with?("_") }.sort | 132 | + assert_equal %w(id name), result.to_h.keys.reject { |k| k.start_with?("_") }.sort |
133 | assert_equal "Product A", result.name | 133 | assert_equal "Product A", result.name |
134 | - assert_nil result.store_id | 134 | + assert !result.respond_to?(:store_id) |
135 | end | 135 | end |
136 | 136 | ||
137 | def test_select_excludes | 137 | def test_select_excludes |
138 | store [{name: "Product A", user_ids: [1, 2], store_id: 1}] | 138 | store [{name: "Product A", user_ids: [1, 2], store_id: 1}] |
139 | result = Product.search("product", load: false, select: {excludes: [:name]}).first | 139 | result = Product.search("product", load: false, select: {excludes: [:name]}).first |
140 | - assert_nil result.name | 140 | + assert !result.respond_to?(:name) |
141 | assert_equal [1, 2], result.user_ids | 141 | assert_equal [1, 2], result.user_ids |
142 | assert_equal 1, result.store_id | 142 | assert_equal 1, result.store_id |
143 | end | 143 | end |
@@ -147,8 +147,8 @@ class SqlTest < Minitest::Test | @@ -147,8 +147,8 @@ class SqlTest < Minitest::Test | ||
147 | store [{name: "Product A", user_ids: [1, 2], store_id: 1}] | 147 | store [{name: "Product A", user_ids: [1, 2], store_id: 1}] |
148 | result = Product.search("product", load: false, select: {includes: [:store_id], excludes: [:name]}).first | 148 | result = Product.search("product", load: false, select: {includes: [:store_id], excludes: [:name]}).first |
149 | assert_equal 1, result.store_id | 149 | assert_equal 1, result.store_id |
150 | - assert_nil result.name | ||
151 | - assert_nil result.user_ids | 150 | + assert !result.respond_to?(:name) |
151 | + assert !result.respond_to?(:user_ids) | ||
152 | end | 152 | end |
153 | 153 | ||
154 | # nested | 154 | # nested |