Skip to content

Commit 4c211b0

Browse files
committed
Fall back to Rack::Utils for rails<8.0
1 parent 10c7344 commit 4c211b0

File tree

7 files changed

+153
-49
lines changed

7 files changed

+153
-49
lines changed

lib/active_resource/formats/url_encoded_format.rb

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,30 @@
11
# frozen_string_literal: true
22

3-
require "active_support/core_ext/array/wrap"
3+
require "active_resource/formats/url_encoded_format/query_parser"
44

55
module ActiveResource
66
module Formats
77
module UrlEncodedFormat
8-
extend self
8+
extend self, ActiveSupport::Autoload
99

10-
# An object that responds to +#from_pairs+ that transforms an Array of
11-
# name value pairs into a params Hash.
12-
#
13-
# Defaults to calling Array#to_h when ActionDispatch::ParamBuilder is unavailable.
14-
mattr_accessor :param_builder, default: self
10+
autoload :ActionDispatchQueryParser
11+
autoload :QueryParser
12+
autoload :RackQueryParser
13+
14+
# An object that responds to +#parse_nested_query+ to transforms a query
15+
# string into a params Hash.
16+
attr_reader :query_parser
17+
18+
def query_parser=(name)
19+
@query_parser =
20+
case name
21+
when nil, :active_resource then QueryParser
22+
when :rack then RackQueryParser
23+
when :action_dispatch then ActionDispatchQueryParser
24+
else name
25+
end
26+
end
27+
self.query_parser = QueryParser
1528

1629
def mime_type
1730
"application/x-www-form-urlencoded"
@@ -24,12 +37,9 @@ def encode(params, options = nil)
2437

2538
# URL decode the query string
2639
def decode(query, remove_root = true)
27-
query = URI.decode_www_form(query) if query.is_a?(String)
28-
param_builder.from_pairs(query)
29-
end
30-
31-
def from_pairs(array) # :nodoc:
32-
array.to_h
40+
return query if query.is_a?(Hash)
41+
query = URI.encode_www_form(query) if query.is_a?(Array)
42+
query_parser.parse_nested_query(query)
3343
end
3444
end
3545
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
require "action_dispatch/http/param_builder"
4+
5+
module ActiveResource
6+
module Formats
7+
module UrlEncodedFormat
8+
module ActionDispatchQueryParser
9+
extend self
10+
11+
def parse_nested_query(query)
12+
ActionDispatch::ParamBuilder.from_query_string(query)
13+
end
14+
end
15+
end
16+
end
17+
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
module ActiveResource
4+
module Formats
5+
module UrlEncodedFormat
6+
module QueryParser
7+
extend self
8+
9+
def parse_nested_query(query)
10+
query = URI.decode_www_form(query) if query.is_a?(String)
11+
12+
query.to_h
13+
end
14+
end
15+
end
16+
end
17+
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
require "rack/utils"
4+
5+
module ActiveResource
6+
module Formats
7+
module UrlEncodedFormat
8+
module RackQueryParser
9+
extend self
10+
11+
def parse_nested_query(query)
12+
Rack::Utils.parse_nested_query(query)
13+
end
14+
end
15+
end
16+
end
17+
end

lib/active_resource/railtie.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@ class Railtie < Rails::Railtie
3434
ActiveSupport.on_load(:active_resource) { self.logger ||= ::Rails.logger }
3535
end
3636

37-
initializer "active_resource.url_encoded_form_format" do
37+
initializer "active_resource.url_encoded_format" do
3838
ActiveSupport.on_load(:action_controller) do
39-
require "action_dispatch/http/param_builder"
40-
41-
ActiveResource::Formats[:url_encoded_form].param_builder = ActionDispatch::ParamBuilder
39+
if ActionPack::VERSION::MAJOR >= 8
40+
Formats::UrlEncodedFormat.query_parser = :action_dispatch
41+
else
42+
Formats::UrlEncodedFormat.query_parser = :rack
43+
end
4244
end
4345
end
4446

test/cases/finder_test.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
require "fixtures/proxy"
99
require "fixtures/pet"
1010
require "active_support/core_ext/hash/conversions"
11-
require "action_dispatch/http/param_builder"
1211

1312
module CamelcaseUrlEncodedFormat
1413
extend ActiveResource::Formats::UrlEncodedFormat
@@ -189,8 +188,8 @@ def test_where_clause_string
189188
end
190189

191190
def test_where_clause_string_with_multiple_params
192-
previous_param_builder = ActiveResource::Formats::UrlEncodedFormat.param_builder
193-
ActiveResource::Formats::UrlEncodedFormat.param_builder = ActionDispatch::ParamBuilder
191+
previous_query_parser = ActiveResource::Formats::UrlEncodedFormat.query_parser
192+
ActiveResource::Formats::UrlEncodedFormat.query_parser = :rack
194193

195194
query = URI.encode_www_form([ [ "id[]", "1" ], [ "id[]", "2" ] ])
196195
ActiveResource::HttpMock.respond_to { |m| m.get "/people.json?" + query, {}, @people }
@@ -200,7 +199,7 @@ def test_where_clause_string_with_multiple_params
200199
assert_kind_of Person, people.second
201200
assert_equal [ "Matz", "David" ], people.map(&:name)
202201
ensure
203-
ActiveResource::Formats::UrlEncodedFormat.param_builder = previous_param_builder
202+
ActiveResource::Formats::UrlEncodedFormat.query_parser = previous_query_parser
204203
end
205204

206205
def test_where_clause_array
@@ -213,8 +212,8 @@ def test_where_clause_array
213212
end
214213

215214
def test_where_clause_with_multiple_params
216-
previous_param_builder = ActiveResource::Formats::UrlEncodedFormat.param_builder
217-
ActiveResource::Formats::UrlEncodedFormat.param_builder = ActionDispatch::ParamBuilder
215+
previous_query_parser = ActiveResource::Formats::UrlEncodedFormat.query_parser
216+
ActiveResource::Formats::UrlEncodedFormat.query_parser = :rack
218217

219218
ids = [ [ "id[]", "1" ], [ "id[]", "2" ] ]
220219
ActiveResource::HttpMock.respond_to { |m| m.get "/people.json?" + URI.encode_www_form(ids), {}, @people }
@@ -224,7 +223,7 @@ def test_where_clause_with_multiple_params
224223
assert_kind_of Person, people.second
225224
assert_equal [ "Matz", "David" ], people.map(&:name)
226225
ensure
227-
ActiveResource::Formats::UrlEncodedFormat.param_builder = previous_param_builder
226+
ActiveResource::Formats::UrlEncodedFormat.query_parser = previous_query_parser
228227
end
229228

230229
def test_where_with_clause_in

test/cases/formats/url_encoded_format_test.rb

Lines changed: 67 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
# frozen_string_literal: true
22

33
require "abstract_unit"
4-
require "action_dispatch/http/param_builder"
4+
require "action_dispatch"
55

66
class UrlEncodedFormatTest < ActiveSupport::TestCase
7+
test "#mime_type returns application/x-www-form-urlencoded" do
8+
assert_equal "application/x-www-form-urlencoded", ActiveResource::Formats::UrlEncodedFormat.mime_type
9+
end
10+
711
test "#encode transforms a Hash into an application/x-www-form-urlencoded query string" do
812
params = { "a" => 1, "b" => 2, "c" => [ 3, 4 ] }
913

@@ -44,55 +48,93 @@ class UrlEncodedFormatTest < ActiveSupport::TestCase
4448
assert_equal({ "person[name]" => "Matz" }, decoded)
4549
end
4650

47-
test "#decode transforms an application/x-www-form-urlencoded query string with multiple params into a Hash" do
48-
format = ActiveResource::Formats::UrlEncodedFormat
49-
previous_param_builder = format.param_builder
50-
format.param_builder = ActionDispatch::ParamBuilder
51+
test "#decode returns a Hash of query string pairs" do
52+
decoded = ActiveResource::Formats::UrlEncodedFormat.decode("a" => "1")
5153

54+
assert_equal({ "a" => "1" }, decoded)
55+
end
56+
end
57+
58+
class UrlEncodedFormatRackQueryParserTest < ActiveSupport::TestCase
59+
setup do
60+
@previous_query_parser = ActiveResource::Formats::UrlEncodedFormat.query_parser
61+
ActiveResource::Formats::UrlEncodedFormat.query_parser = :rack
62+
end
63+
64+
teardown do
65+
ActiveResource::Formats::UrlEncodedFormat.query_parser = @previous_query_parser
66+
end
67+
68+
test "#decode transforms an application/x-www-form-urlencoded query string with multiple params into a Hash" do
5269
query = URI.encode_www_form([ [ "a[]", "1" ], [ "a[]", "2" ] ])
5370

54-
decoded = format.decode(query)
71+
decoded = ActiveResource::Formats::UrlEncodedFormat.decode(query)
5572

5673
assert_equal({ "a" => [ "1", "2" ] }, decoded)
57-
ensure
58-
format.param_builder = previous_param_builder
5974
end
6075

6176
test "#decode transforms an Array of query string pairs with multiple params into a Hash" do
62-
format = ActiveResource::Formats::UrlEncodedFormat
63-
previous_param_builder = format.param_builder
64-
format.param_builder = ActionDispatch::ParamBuilder
65-
6677
pairs = [ [ "a[]", "1" ], [ "a[]", "2" ] ]
6778

68-
decoded = format.decode(pairs)
79+
decoded = ActiveResource::Formats::UrlEncodedFormat.decode(pairs)
6980

7081
assert_equal({ "a" => [ "1", "2" ] }, decoded)
71-
ensure
72-
format.param_builder = previous_param_builder
7382
end
7483

75-
test "#decode transforms an Array of nested query string pairs into a Hash using ActionDispatch::ParamBuilder" do
76-
format = ActiveResource::Formats::UrlEncodedFormat
77-
previous_param_builder = format.param_builder
78-
format.param_builder = ActionDispatch::ParamBuilder
79-
84+
test "#decode transforms an Array of nested query string pairs into a Hash" do
8085
pairs = [ [ "person[name]", "Matz" ] ]
8186

82-
decoded = format.decode(pairs)
87+
decoded = ActiveResource::Formats::UrlEncodedFormat.decode(pairs)
8388

8489
assert_equal({ "person" => { "name" => "Matz" } }, decoded)
85-
ensure
86-
format.param_builder = previous_param_builder
8790
end
8891

8992
test "#decode returns a Hash of query string pairs" do
9093
decoded = ActiveResource::Formats::UrlEncodedFormat.decode("a" => "1")
9194

9295
assert_equal({ "a" => "1" }, decoded)
9396
end
97+
end
9498

95-
test "#mime_type returns application/x-www-form-urlencoded" do
96-
assert_equal "application/x-www-form-urlencoded", ActiveResource::Formats::UrlEncodedFormat.mime_type
99+
if ActionPack::VERSION::MAJOR >= 8
100+
class UrlEncodedFormatActionDispatchQueryParserTest < ActiveSupport::TestCase
101+
setup do
102+
@previous_query_parser = ActiveResource::Formats::UrlEncodedFormat.query_parser
103+
ActiveResource::Formats::UrlEncodedFormat.query_parser = :action_dispatch
104+
end
105+
106+
teardown do
107+
ActiveResource::Formats::UrlEncodedFormat.query_parser = @previous_query_parser
108+
end
109+
110+
test "#decode transforms an application/x-www-form-urlencoded query string with multiple params into a Hash" do
111+
query = URI.encode_www_form([ [ "a[]", "1" ], [ "a[]", "2" ] ])
112+
113+
decoded = ActiveResource::Formats::UrlEncodedFormat.decode(query)
114+
115+
assert_equal({ "a" => [ "1", "2" ] }, decoded)
116+
end
117+
118+
test "#decode transforms an Array of query string pairs with multiple params into a Hash" do
119+
pairs = [ [ "a[]", "1" ], [ "a[]", "2" ] ]
120+
121+
decoded = ActiveResource::Formats::UrlEncodedFormat.decode(pairs)
122+
123+
assert_equal({ "a" => [ "1", "2" ] }, decoded)
124+
end
125+
126+
test "#decode transforms an Array of nested query string pairs into a Hash" do
127+
pairs = [ [ "person[name]", "Matz" ] ]
128+
129+
decoded = ActiveResource::Formats::UrlEncodedFormat.decode(pairs)
130+
131+
assert_equal({ "person" => { "name" => "Matz" } }, decoded)
132+
end
133+
134+
test "#decode returns a Hash of query string pairs" do
135+
decoded = ActiveResource::Formats::UrlEncodedFormat.decode("a" => "1")
136+
137+
assert_equal({ "a" => "1" }, decoded)
138+
end
97139
end
98140
end

0 commit comments

Comments
 (0)