Skip to content

Commit 8f326cd

Browse files
committed
Support global exclude links configuration
Port of gh-1256 to master branch
1 parent 9848b59 commit 8f326cd

File tree

4 files changed

+104
-7
lines changed

4 files changed

+104
-7
lines changed

lib/jsonapi/basic_resource.rb

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -963,21 +963,25 @@ def mutable?
963963
!@immutable
964964
end
965965

966-
def exclude_links(exclude)
966+
def parse_exclude_links(exclude)
967967
case exclude
968968
when :default, "default"
969-
@_exclude_links = [:self]
969+
[:self]
970970
when :none, "none"
971-
@_exclude_links = []
971+
[]
972972
when Array
973-
@_exclude_links = exclude.collect {|link| link.to_sym}
973+
exclude.collect {|link| link.to_sym}
974974
else
975975
fail "Invalid exclude_links"
976976
end
977977
end
978978

979+
def exclude_links(exclude)
980+
@_exclude_links = parse_exclude_links(exclude)
981+
end
982+
979983
def _exclude_links
980-
@_exclude_links ||= []
984+
@_exclude_links ||= parse_exclude_links(JSONAPI.configuration.default_exclude_links)
981985
end
982986

983987
def exclude_link?(link)

lib/jsonapi/configuration.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ class Configuration
3737
:default_caching,
3838
:default_resource_cache_field,
3939
:resource_cache_digest_function,
40-
:resource_cache_usage_report_function
40+
:resource_cache_usage_report_function,
41+
:default_exclude_links
4142

4243
def initialize
4344
#:underscored_key, :camelized_key, :dasherized_key, or custom
@@ -149,6 +150,12 @@ def initialize
149150
# Optionally provide a callable which JSONAPI will call with information about cache
150151
# performance. Should accept three arguments: resource name, hits count, misses count.
151152
self.resource_cache_usage_report_function = nil
153+
154+
# Global configuration for links exclusion
155+
# Controls whether to generate links like `self`, `related` with all the resources
156+
# and relationships. Accepts either `:default`, `:none`, or array containing the
157+
# specific default links to exclude, which may be `:self` and `:related`.
158+
self.default_exclude_links = :none
152159
end
153160

154161
def cache_formatters=(bool)
@@ -276,6 +283,8 @@ def allow_include=(allow_include)
276283
attr_writer :resource_cache_digest_function
277284

278285
attr_writer :resource_cache_usage_report_function
286+
287+
attr_writer :default_exclude_links
279288
end
280289

281290
class << self

lib/jsonapi/relationship.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def initialize(name, options = {})
3232
@_routed = false
3333
@_warned_missing_route = false
3434

35-
exclude_links(options.fetch(:exclude_links, :none))
35+
exclude_links(options.fetch(:exclude_links, JSONAPI.configuration.default_exclude_links))
3636

3737
# Custom methods are reserved for future use
3838
@custom_methods = options.fetch(:custom_methods, {})

test/unit/resource/relationship_test.rb

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,88 @@ def test_exclude_links_on_relationship
159159
JSONAPI::Relationship::ToOne.new "foo", :self
160160
end
161161
end
162+
163+
def test_global_exclude_links_configuration_on_relationship
164+
JSONAPI.configuration.default_exclude_links = :none
165+
relationship = JSONAPI::Relationship::ToOne.new "foo"
166+
assert_equal [], relationship._exclude_links
167+
refute relationship.exclude_link?(:self)
168+
refute relationship.exclude_link?("self")
169+
170+
JSONAPI.configuration.default_exclude_links = :default
171+
relationship = JSONAPI::Relationship::ToOne.new "foo"
172+
assert_equal [:self, :related], relationship._exclude_links
173+
assert relationship.exclude_link?(:self)
174+
assert relationship.exclude_link?("self")
175+
assert relationship.exclude_link?(:related)
176+
assert relationship.exclude_link?("related")
177+
178+
JSONAPI.configuration.default_exclude_links = "none"
179+
relationship = JSONAPI::Relationship::ToOne.new "foo"
180+
assert_equal [], relationship._exclude_links
181+
refute relationship.exclude_link?(:self)
182+
refute relationship.exclude_link?("self")
183+
184+
JSONAPI.configuration.default_exclude_links = "default"
185+
relationship = JSONAPI::Relationship::ToOne.new "foo"
186+
assert_equal [:self, :related], relationship._exclude_links
187+
assert relationship.exclude_link?(:self)
188+
assert relationship.exclude_link?("self")
189+
190+
JSONAPI.configuration.default_exclude_links = :none
191+
relationship = JSONAPI::Relationship::ToOne.new "foo"
192+
assert_equal [], relationship._exclude_links
193+
refute relationship.exclude_link?(:self)
194+
refute relationship.exclude_link?("self")
195+
196+
JSONAPI.configuration.default_exclude_links = [:self]
197+
relationship = JSONAPI::Relationship::ToOne.new "foo"
198+
assert_equal [:self], relationship._exclude_links
199+
assert relationship.exclude_link?(:self)
200+
assert relationship.exclude_link?("self")
201+
202+
JSONAPI.configuration.default_exclude_links = :none
203+
relationship = JSONAPI::Relationship::ToOne.new "foo"
204+
assert_equal [], relationship._exclude_links
205+
refute relationship.exclude_link?(:self)
206+
refute relationship.exclude_link?("self")
207+
208+
JSONAPI.configuration.default_exclude_links = ["self", :related]
209+
relationship = JSONAPI::Relationship::ToOne.new "foo"
210+
assert_equal [:self, :related], relationship._exclude_links
211+
assert relationship.exclude_link?(:self)
212+
assert relationship.exclude_link?("self")
213+
214+
JSONAPI.configuration.default_exclude_links = []
215+
relationship = JSONAPI::Relationship::ToOne.new "foo"
216+
assert_equal [], relationship._exclude_links
217+
refute relationship.exclude_link?(:self)
218+
refute relationship.exclude_link?("self")
219+
220+
assert_raises do
221+
JSONAPI.configuration.default_exclude_links = :self
222+
JSONAPI::Relationship::ToOne.new "foo"
223+
end
224+
225+
# Test if the relationships will override the the global configuration
226+
JSONAPI.configuration.default_exclude_links = :default
227+
relationship = JSONAPI::Relationship::ToOne.new "foo", exclude_links: :none
228+
assert_equal [], relationship._exclude_links
229+
refute relationship.exclude_link?(:self)
230+
refute relationship.exclude_link?("self")
231+
refute relationship.exclude_link?(:related)
232+
refute relationship.exclude_link?("related")
233+
234+
JSONAPI.configuration.default_exclude_links = :default
235+
relationship = JSONAPI::Relationship::ToOne.new "foo", exclude_links: [:self]
236+
assert_equal [:self], relationship._exclude_links
237+
refute relationship.exclude_link?(:related)
238+
refute relationship.exclude_link?("related")
239+
assert relationship.exclude_link?(:self)
240+
assert relationship.exclude_link?("self")
241+
ensure
242+
JSONAPI.configuration.default_exclude_links = :none
243+
end
244+
245+
162246
end

0 commit comments

Comments
 (0)