Skip to content

Commit df614a9

Browse files
committed
Add warnings for duplicate attributes and relationship names
1 parent 86138a7 commit df614a9

3 files changed

Lines changed: 32 additions & 2 deletions

File tree

lib/jsonapi/resource.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,8 @@ def attribute(attr, options = {})
404404
ActiveSupport::Deprecation.warn('Id without format is no longer supported. Please remove ids from attributes, or specify a format.')
405405
end
406406

407+
check_duplicate_attribute_name(attr) if options[:format].nil?
408+
407409
@_attributes ||= {}
408410
@_attributes[attr] = options
409411
define_method attr do
@@ -879,6 +881,8 @@ def _add_relationship(klass, *attrs)
879881

880882
check_reserved_relationship_name(relationship_name)
881883

884+
check_duplicate_relationship_name(relationship_name)
885+
882886
# Initialize from an ActiveRecord model's properties
883887
if _model_class && _model_class.ancestors.collect{|ancestor| ancestor.name}.include?('ActiveRecord::Base')
884888
model_association = _model_class.reflect_on_association(relationship_name)
@@ -1009,6 +1013,18 @@ def check_reserved_relationship_name(name)
10091013
warn "[NAME COLLISION] `#{name}` is a reserved relationship name in #{_resource_name_from_type(_type)}."
10101014
end
10111015
end
1016+
1017+
def check_duplicate_relationship_name(name)
1018+
if _relationships.include?(name.to_sym)
1019+
warn "[DUPLICATE RELATIONSHIP] `#{name}` has already been defined in #{_resource_name_from_type(_type)}."
1020+
end
1021+
end
1022+
1023+
def check_duplicate_attribute_name(name)
1024+
if _attributes.include?(name.to_sym)
1025+
warn "[DUPLICATE ATTRIBUTE] `#{name}` has already been defined in #{_resource_name_from_type(_type)}."
1026+
end
1027+
end
10121028
end
10131029
end
10141030
end

test/fixtures/active_record.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,8 +1501,6 @@ class LineItemResource < V6::LineItemResource; end
15011501

15021502
class CustomerResource < V6::CustomerResource
15031503
model_name 'Api::V7::Customer'
1504-
attribute :name
1505-
has_many :purchase_orders
15061504
end
15071505

15081506
class ClientResource < JSONAPI::Resource

test/unit/resource/resource_test.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,22 @@ def test_class_relationships
202202
assert_equal(relationships.size, 2)
203203
end
204204

205+
def test_duplicate_relationship_name
206+
assert_output nil, "[DUPLICATE RELATIONSHIP] `mother` has already been defined in CatResource.\n" do
207+
CatResource.instance_eval do
208+
has_one :mother, class_name: 'Cat'
209+
end
210+
end
211+
end
212+
213+
def test_duplicate_attribute_name
214+
assert_output nil, "[DUPLICATE ATTRIBUTE] `name` has already been defined in CatResource.\n" do
215+
CatResource.instance_eval do
216+
attribute :name
217+
end
218+
end
219+
end
220+
205221
def test_find_with_customized_base_records
206222
author = Person.find(1)
207223
posts = ArticleResource.find([], context: author).map(&:_model)

0 commit comments

Comments
 (0)