Skip to content

Commit f2302ab

Browse files
authored
Merge pull request #1137 from labfellows/feature/add-optional-route-formatting
added optional route formatting feature
2 parents 5797c73 + 1089a45 commit f2302ab

4 files changed

Lines changed: 62 additions & 1 deletion

File tree

lib/jsonapi/link_builder.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def formatted_module_path_from_class(klass)
115115
scopes = module_scopes_from_class(klass)
116116

117117
unless scopes.empty?
118-
"/#{ scopes.map{ |scope| format_route(scope.to_s.underscore) }.join('/') }/"
118+
"/#{ scopes.map{ |scope| format_route(scope.to_s.underscore) }.compact.join('/') }/"
119119
else
120120
"/"
121121
end

test/fixtures/active_record.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1977,6 +1977,13 @@ class PersonResource < JSONAPI::Resource
19771977
end
19781978
end
19791979

1980+
module OptionalNamespace
1981+
module V1
1982+
class PersonResource < JSONAPI::Resource
1983+
end
1984+
end
1985+
end
1986+
19801987
module MyEngine
19811988
module Api
19821989
module V1
@@ -1998,6 +2005,13 @@ class PersonResource < JSONAPI::Resource
19982005
end
19992006
end
20002007
end
2008+
2009+
module OptionalNamespace
2010+
module V1
2011+
class PersonResource < JSONAPI::Resource
2012+
end
2013+
end
2014+
end
20012015
end
20022016

20032017
module ApiV2Engine

test/test_helper.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,12 @@ class CatResource < JSONAPI::Resource
424424
jsonapi_resources :people
425425
end
426426
end
427+
428+
namespace :optional_namespace, path: 'optional_namespace' do
429+
namespace :v1, path: '' do
430+
jsonapi_resources :people
431+
end
432+
end
427433
end
428434

429435
ApiV2Engine::Engine.routes.draw do
@@ -674,3 +680,16 @@ def unformat(value)
674680
end
675681
end
676682
end
683+
684+
class OptionalRouteFormatter < JSONAPI::RouteFormatter
685+
class << self
686+
def format(route)
687+
return if route == 'v1'
688+
super
689+
end
690+
691+
def unformat(formatted_route)
692+
super
693+
end
694+
end
695+
end

test/unit/serializer/link_builder_test.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,20 @@ def test_query_link_for_regular_app_with_dasherized_scope
302302
assert_equal expected_link, builder.query_link(query)
303303
end
304304

305+
def test_query_link_for_regular_app_with_optional_scope
306+
config = {
307+
base_url: @base_url,
308+
route_formatter: OptionalRouteFormatter,
309+
primary_resource_klass: OptionalNamespace::V1::PersonResource
310+
}
311+
312+
query = { page: { offset: 0, limit: 12 } }
313+
builder = JSONAPI::LinkBuilder.new(config)
314+
expected_link = "#{ @base_url }/optional_namespace/people?page%5Blimit%5D=12&page%5Boffset%5D=0"
315+
316+
assert_equal expected_link, builder.query_link(query)
317+
end
318+
305319
def test_query_link_for_engine
306320
config = {
307321
base_url: @base_url,
@@ -344,6 +358,20 @@ def test_query_link_for_engine_with_dasherized_scope
344358
assert_equal expected_link, builder.query_link(query)
345359
end
346360

361+
def test_query_link_for_engine_with_optional_scope
362+
config = {
363+
base_url: @base_url,
364+
route_formatter: OptionalRouteFormatter,
365+
primary_resource_klass: MyEngine::OptionalNamespace::V1::PersonResource
366+
}
367+
368+
query = { page: { offset: 0, limit: 12 } }
369+
builder = JSONAPI::LinkBuilder.new(config)
370+
expected_link = "#{ @base_url }/boomshaka/optional_namespace/people?page%5Blimit%5D=12&page%5Boffset%5D=0"
371+
372+
assert_equal expected_link, builder.query_link(query)
373+
end
374+
347375
def test_query_link_for_engine_with_camel_case_scope
348376
config = {
349377
base_url: @base_url,

0 commit comments

Comments
 (0)