Skip to content

Commit 34dc2c6

Browse files
ouabinglgebhardt
authored andcommitted
Support global exclude links configuration
Closes gh-1256
1 parent 0a344a0 commit 34dc2c6

File tree

4 files changed

+105
-11
lines changed

4 files changed

+105
-11
lines changed

lib/jsonapi/configuration.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ class Configuration
3333
:resource_cache,
3434
:default_resource_cache_field,
3535
:resource_cache_digest_function,
36-
:resource_cache_usage_report_function
36+
:resource_cache_usage_report_function,
37+
:default_exclude_links
3738

3839
def initialize
3940
#:underscored_key, :camelized_key, :dasherized_key, or custom
@@ -134,6 +135,12 @@ def initialize
134135
# Optionally provide a callable which JSONAPI will call with information about cache
135136
# performance. Should accept three arguments: resource name, hits count, misses count.
136137
self.resource_cache_usage_report_function = nil
138+
139+
# Global configuration for links exclusion
140+
# Controls whether to generate links like `self`, `related` with all the resources
141+
# and relationships. Accepts either `:default`, `:none`, or array containing the
142+
# specific default links to exclude, which may be `:self` and `:related`.
143+
self.default_exclude_links = :none
137144
end
138145

139146
def cache_formatters=(bool)
@@ -249,6 +256,8 @@ def default_processor_klass=(default_processor_klass)
249256
attr_writer :resource_cache_digest_function
250257

251258
attr_writer :resource_cache_usage_report_function
259+
260+
attr_writer :default_exclude_links
252261
end
253262

254263
class << self

lib/jsonapi/relationship.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@ def initialize(name, options = {})
1616
@polymorphic = options.fetch(:polymorphic, false) == true
1717
@always_include_linkage_data = options.fetch(:always_include_linkage_data, false) == true
1818
@eager_load_on_include = options.fetch(:eager_load_on_include, true) == true
19-
2019
@_routed = false
2120
@_warned_missing_route = false
2221

23-
exclude_links(options.fetch(:exclude_links, :none))
22+
exclude_links(options.fetch(:exclude_links, JSONAPI.configuration.default_exclude_links))
2423
end
2524

2625
alias_method :polymorphic?, :polymorphic

lib/jsonapi/resource.rb

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,18 @@ def mutable?
10691069
end
10701070

10711071
def exclude_links(exclude)
1072+
_resolve_exclude_links(exclude)
1073+
end
1074+
1075+
def _exclude_links
1076+
@_exclude_links ||= _resolve_exclude_links(JSONAPI.configuration.default_exclude_links)
1077+
end
1078+
1079+
def exclude_link?(link)
1080+
_exclude_links.include?(link.to_sym)
1081+
end
1082+
1083+
def _resolve_exclude_links(exclude)
10721084
case exclude
10731085
when :default, "default"
10741086
@_exclude_links = [:self]
@@ -1081,14 +1093,6 @@ def exclude_links(exclude)
10811093
end
10821094
end
10831095

1084-
def _exclude_links
1085-
@_exclude_links ||= []
1086-
end
1087-
1088-
def exclude_link?(link)
1089-
_exclude_links.include?(link.to_sym)
1090-
end
1091-
10921096
def caching(val = true)
10931097
@caching = val
10941098
end

test/unit/resource/relationship_test.rb

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,88 @@ def test_polymorphic_type
99
assert_equal(relationship.polymorphic_type, "imageable_type")
1010
end
1111

12+
def test_global_exclude_links_configuration_on_relationship
13+
JSONAPI.configuration.default_exclude_links = :none
14+
relationship = JSONAPI::Relationship::ToOne.new "foo"
15+
assert_equal [], relationship._exclude_links
16+
refute relationship.exclude_link?(:self)
17+
refute relationship.exclude_link?("self")
18+
19+
JSONAPI.configuration.default_exclude_links = :default
20+
relationship = JSONAPI::Relationship::ToOne.new "foo"
21+
assert_equal [:self, :related], relationship._exclude_links
22+
assert relationship.exclude_link?(:self)
23+
assert relationship.exclude_link?("self")
24+
assert relationship.exclude_link?(:related)
25+
assert relationship.exclude_link?("related")
26+
27+
JSONAPI.configuration.default_exclude_links = "none"
28+
relationship = JSONAPI::Relationship::ToOne.new "foo"
29+
assert_equal [], relationship._exclude_links
30+
refute relationship.exclude_link?(:self)
31+
refute relationship.exclude_link?("self")
32+
33+
JSONAPI.configuration.default_exclude_links = "default"
34+
relationship = JSONAPI::Relationship::ToOne.new "foo"
35+
assert_equal [:self, :related], relationship._exclude_links
36+
assert relationship.exclude_link?(:self)
37+
assert relationship.exclude_link?("self")
38+
39+
JSONAPI.configuration.default_exclude_links = :none
40+
relationship = JSONAPI::Relationship::ToOne.new "foo"
41+
assert_equal [], relationship._exclude_links
42+
refute relationship.exclude_link?(:self)
43+
refute relationship.exclude_link?("self")
44+
45+
JSONAPI.configuration.default_exclude_links = [:self]
46+
relationship = JSONAPI::Relationship::ToOne.new "foo"
47+
assert_equal [:self], relationship._exclude_links
48+
assert relationship.exclude_link?(:self)
49+
assert relationship.exclude_link?("self")
50+
51+
JSONAPI.configuration.default_exclude_links = :none
52+
relationship = JSONAPI::Relationship::ToOne.new "foo"
53+
assert_equal [], relationship._exclude_links
54+
refute relationship.exclude_link?(:self)
55+
refute relationship.exclude_link?("self")
56+
57+
JSONAPI.configuration.default_exclude_links = ["self", :related]
58+
relationship = JSONAPI::Relationship::ToOne.new "foo"
59+
assert_equal [:self, :related], relationship._exclude_links
60+
assert relationship.exclude_link?(:self)
61+
assert relationship.exclude_link?("self")
62+
63+
JSONAPI.configuration.default_exclude_links = []
64+
relationship = JSONAPI::Relationship::ToOne.new "foo"
65+
assert_equal [], relationship._exclude_links
66+
refute relationship.exclude_link?(:self)
67+
refute relationship.exclude_link?("self")
68+
69+
assert_raises do
70+
JSONAPI.configuration.default_exclude_links = :self
71+
JSONAPI::Relationship::ToOne.new "foo"
72+
end
73+
74+
# Test if the relationships will override the the global configuration
75+
JSONAPI.configuration.default_exclude_links = :default
76+
relationship = JSONAPI::Relationship::ToOne.new "foo", exclude_links: :none
77+
assert_equal [], relationship._exclude_links
78+
refute relationship.exclude_link?(:self)
79+
refute relationship.exclude_link?("self")
80+
refute relationship.exclude_link?(:related)
81+
refute relationship.exclude_link?("related")
82+
83+
JSONAPI.configuration.default_exclude_links = :default
84+
relationship = JSONAPI::Relationship::ToOne.new "foo", exclude_links: [:self]
85+
assert_equal [:self], relationship._exclude_links
86+
refute relationship.exclude_link?(:related)
87+
refute relationship.exclude_link?("related")
88+
assert relationship.exclude_link?(:self)
89+
assert relationship.exclude_link?("self")
90+
ensure
91+
JSONAPI.configuration.default_exclude_links = :none
92+
end
93+
1294
def test_exclude_links_on_relationship
1395
relationship = JSONAPI::Relationship::ToOne.new "foo", exclude_links: :none
1496
assert_equal [], relationship._exclude_links

0 commit comments

Comments
 (0)