From 0f889bc6af6f6c87d7f605eb28f67c62abc23a45 Mon Sep 17 00:00:00 2001 From: Tommy Russoniello Date: Mon, 24 Feb 2020 17:43:08 -0500 Subject: [PATCH] Simplify Include Directives Hash --- lib/jsonapi/active_relation_resource.rb | 6 +- lib/jsonapi/include_directives.rb | 16 ++-- lib/jsonapi/processor.rb | 8 +- test/controllers/controller_test.rb | 3 +- test/unit/processor/default_processor_test.rb | 4 +- .../serializer/include_directives_test.rb | 78 ++++--------------- test/unit/serializer/serializer_test.rb | 16 ++-- 7 files changed, 40 insertions(+), 91 deletions(-) diff --git a/lib/jsonapi/active_relation_resource.rb b/lib/jsonapi/active_relation_resource.rb index d9272339d..2c3ffd103 100644 --- a/lib/jsonapi/active_relation_resource.rb +++ b/lib/jsonapi/active_relation_resource.rb @@ -92,7 +92,7 @@ def find_to_populate_by_keys(keys, options = {}) def find_fragments(filters, options = {}) include_directives = options[:include_directives] ? options[:include_directives].include_directives : {} resource_klass = self - linkage_relationships = to_one_relationships_for_linkage(include_directives[:include_related]) + linkage_relationships = to_one_relationships_for_linkage(include_directives) sort_criteria = options.fetch(:sort_criteria) { [] } @@ -381,7 +381,7 @@ def find_related_monomorphic_fragments(source_rids, relationship, options, conne include_directives = options[:include_directives] ? options[:include_directives].include_directives : {} resource_klass = relationship.resource_klass - linkage_relationships = resource_klass.to_one_relationships_for_linkage(include_directives[:include_related]) + linkage_relationships = resource_klass.to_one_relationships_for_linkage(include_directives) sort_criteria = [] options[:sort_criteria].try(:each) do |sort| @@ -514,7 +514,7 @@ def find_related_polymorphic_fragments(source_rids, relationship, options, conne resource_types.each do |resource_type| related_resource_klass = resource_klass_for(resource_type) - relationships = related_resource_klass.to_one_relationships_for_linkage(include_directives[:include_related]) + relationships = related_resource_klass.to_one_relationships_for_linkage(include_directives) relationships.each do |r| linkage_relationships << "##{resource_type}.#{r}" end diff --git a/lib/jsonapi/include_directives.rb b/lib/jsonapi/include_directives.rb index c1a1d7b3b..c09a700a1 100644 --- a/lib/jsonapi/include_directives.rb +++ b/lib/jsonapi/include_directives.rb @@ -5,21 +5,15 @@ class IncludeDirectives # will transform into => # { # posts: { - # include_related: { - # comments:{ - # include_related: { - # tags: { - # include_related: {} - # } - # } - # } + # comments: { + # tags: {} # } # } # } def initialize(resource_klass, includes_array) @resource_klass = resource_klass - @include_directives_hash = { include_related: {} } + @include_directives_hash = {} includes_array.each do |include| parse_include(include) end @@ -42,8 +36,8 @@ def parse_include(include) path.segments.each do |segment| relationship_name = segment.relationship.name.to_sym - current[:include_related][relationship_name] ||= { include_related: {} } - current = current[:include_related][relationship_name] + current[relationship_name] ||= {} + current = current[relationship_name] end rescue JSONAPI::Exceptions::InvalidRelationship => _e diff --git a/lib/jsonapi/processor.rb b/lib/jsonapi/processor.rb index cad9f9b8d..8ff8383a2 100644 --- a/lib/jsonapi/processor.rb +++ b/lib/jsonapi/processor.rb @@ -367,7 +367,7 @@ def result_options end def find_resource_set(resource_klass, include_directives, options) - include_related = include_directives.include_directives[:include_related] if include_directives + include_related = include_directives.include_directives if include_directives resource_id_tree = find_resource_id_tree(resource_klass, options, include_related) @@ -375,7 +375,7 @@ def find_resource_set(resource_klass, include_directives, options) end def find_related_resource_set(resource, relationship_name, include_directives, options) - include_related = include_directives.include_directives[:include_related] if include_directives + include_related = include_directives.include_directives if include_directives resource_id_tree = find_resource_id_tree_from_resource_relationship(resource, relationship_name, options, include_related) @@ -443,12 +443,12 @@ def load_included(resource_klass, source_resource_id_tree, include_related, opti ) related_resource_id_tree = source_resource_id_tree.fetch_related_resource_id_tree(relationship) - related_resource_id_tree.add_resource_fragments(related_fragments, include_related[key][include_related]) + related_resource_id_tree.add_resource_fragments(related_fragments, include_related[key]) # Now recursively get the related resources for the currently found resources load_included(relationship.resource_klass, related_resource_id_tree, - include_related[relationship_name][:include_related], + include_related[relationship_name], options) end end diff --git a/test/controllers/controller_test.rb b/test/controllers/controller_test.rb index adcac5a94..3791ac146 100644 --- a/test/controllers/controller_test.rb +++ b/test/controllers/controller_test.rb @@ -4329,7 +4329,8 @@ def test_complex_includes_things_nested_things "links" => { "self" => "http://test.host/api/things/40/relationships/things", "related" => "http://test.host/api/things/40/things" - } + }, + "data" => [] } } }, diff --git a/test/unit/processor/default_processor_test.rb b/test/unit/processor/default_processor_test.rb index 1158f23d0..9c61af05f 100644 --- a/test/unit/processor/default_processor_test.rb +++ b/test/unit/processor/default_processor_test.rb @@ -45,7 +45,7 @@ def setup } p = JSONAPI::Processor.new(PostResource, :find, params) - $id_tree_has_one_includes = p.send(:find_resource_id_tree, PostResource, find_options, directives[:include_related]) + $id_tree_has_one_includes = p.send(:find_resource_id_tree, PostResource, find_options, directives) $resource_set_has_one_includes = JSONAPI::ResourceSet.new($id_tree_has_one_includes) $populated_resource_set_has_one_includes = JSONAPI::ResourceSet.new($id_tree_has_one_includes).populate!($serializer, nil,{}) end @@ -111,4 +111,4 @@ def test_populated_resource_set_has_one_includes_relationships_are_resolved assert_equal 12, $populated_resource_set_has_one_includes.resource_klasses[PersonResource][1004][:relationships][:posts].first.id end -end \ No newline at end of file +end diff --git a/test/unit/serializer/include_directives_test.rb b/test/unit/serializer/include_directives_test.rb index ad6e6710d..7a16a78cb 100644 --- a/test/unit/serializer/include_directives_test.rb +++ b/test/unit/serializer/include_directives_test.rb @@ -6,15 +6,7 @@ class IncludeDirectivesTest < ActiveSupport::TestCase def test_one_level_one_include directives = JSONAPI::IncludeDirectives.new(PersonResource, ['posts']).include_directives - assert_hash_equals( - { - include_related: { - posts: { - include_related: {} - } - } - }, - directives) + assert_hash_equals({ posts: {} }, directives) end def test_one_level_multiple_includes @@ -22,17 +14,9 @@ def test_one_level_multiple_includes assert_hash_equals( { - include_related: { - posts: { - include_related: {} - }, - comments: { - include_related: {} - }, - expense_entries: { - include_related: {} - } - } + posts: {}, + comments: {}, + expense_entries: {} }, directives) end @@ -42,21 +26,11 @@ def test_multiple_level_multiple_includes assert_hash_equals( { - include_related: { - posts: { - include_related: { - comments: { - include_related: {} - } - } - }, - comments: { - include_related: {} - }, - expense_entries: { - include_related: {} - } - } + posts: { + comments: {} + }, + comments: {}, + expense_entries: {} }, directives) end @@ -67,14 +41,8 @@ def test_two_levels_include_full_path assert_hash_equals( { - include_related: { - posts: { - include_related: { - comments: { - include_related: {} - } - } - } + posts: { + comments: {} } }, directives) @@ -85,14 +53,8 @@ def test_two_levels_include_full_path_redundant assert_hash_equals( { - include_related: { - posts: { - include_related: { - comments: { - include_related: {} - } - } - } + posts: { + comments: {} } }, directives) @@ -103,17 +65,9 @@ def test_three_levels_include_full assert_hash_equals( { - include_related: { - posts: { - include_related: { - comments: { - include_related: { - tags: { - include_related: {} - } - } - } - } + posts: { + comments: { + tags: {} } } }, diff --git a/test/unit/serializer/serializer_test.rb b/test/unit/serializer/serializer_test.rb index b3cda28e8..ad7a7f46a 100644 --- a/test/unit/serializer/serializer_test.rb +++ b/test/unit/serializer/serializer_test.rb @@ -25,7 +25,7 @@ def test_serializer directives = JSONAPI::IncludeDirectives.new(PersonResource, ['']).include_directives - id_tree.add_resource_fragment(JSONAPI::ResourceFragment.new(post_1_identity), directives[:include_related]) + id_tree.add_resource_fragment(JSONAPI::ResourceFragment.new(post_1_identity), directives) resource_set = JSONAPI::ResourceSet.new(id_tree) serializer = JSONAPI::ResourceSerializer.new( @@ -108,7 +108,7 @@ def test_serializer_namespaced_resource_with_custom_resource_links directives = JSONAPI::IncludeDirectives.new(PersonResource, ['']).include_directives - id_tree.add_resource_fragment(JSONAPI::ResourceFragment.new(post_1_identity), directives[:include_related]) + id_tree.add_resource_fragment(JSONAPI::ResourceFragment.new(post_1_identity), directives) resource_set = JSONAPI::ResourceSet.new(id_tree) serializer = JSONAPI::ResourceSerializer.new( @@ -165,7 +165,7 @@ def test_serializer_limited_fieldset directives = JSONAPI::IncludeDirectives.new(PersonResource, []).include_directives - id_tree.add_resource_fragment(JSONAPI::ResourceFragment.new(post_1_identity), directives[:include_related]) + id_tree.add_resource_fragment(JSONAPI::ResourceFragment.new(post_1_identity), directives) resource_set = JSONAPI::ResourceSet.new(id_tree) serializer = JSONAPI::ResourceSerializer.new( @@ -208,14 +208,14 @@ def test_serializer_include directives = JSONAPI::IncludeDirectives.new(PostResource, ['author']).include_directives - id_tree.add_resource_fragment(JSONAPI::ResourceFragment.new(post_1_identity), directives[:include_related]) + id_tree.add_resource_fragment(JSONAPI::ResourceFragment.new(post_1_identity), directives) rel_id_tree = id_tree.fetch_related_resource_id_tree(PostResource._relationships[:author]) author_fragment = JSONAPI::ResourceFragment.new(person_1001_identity) author_fragment.add_related_from(post_1_identity) author_fragment.add_related_identity(:posts, post_1_identity) - rel_id_tree.add_resource_fragment(author_fragment, directives[:include_related][:author][:include_related]) + rel_id_tree.add_resource_fragment(author_fragment, directives[:author]) resource_set = JSONAPI::ResourceSet.new(id_tree) @@ -339,14 +339,14 @@ def test_serializer_key_format directives = JSONAPI::IncludeDirectives.new(PostResource, ['author']).include_directives - id_tree.add_resource_fragment(JSONAPI::ResourceFragment.new(post_1_identity), directives[:include_related]) + id_tree.add_resource_fragment(JSONAPI::ResourceFragment.new(post_1_identity), directives) rel_id_tree = id_tree.fetch_related_resource_id_tree(PostResource._relationships[:author]) author_fragment = JSONAPI::ResourceFragment.new(person_1001_identity) author_fragment.add_related_from(post_1_identity) author_fragment.add_related_identity(:posts, post_1_identity) - rel_id_tree.add_resource_fragment(author_fragment, directives[:include_related][:author][:include_related]) + rel_id_tree.add_resource_fragment(author_fragment, directives[:author]) resource_set = JSONAPI::ResourceSet.new(id_tree) @@ -479,7 +479,7 @@ def test_serializers_linkage_even_without_included_resource fragment.initialize_related(:section) fragment.initialize_related(:tags) - id_tree.add_resource_fragment(fragment, directives[:include_related]) + id_tree.add_resource_fragment(fragment, directives) resource_set = JSONAPI::ResourceSet.new(id_tree) serializer = JSONAPI::ResourceSerializer.new(PostResource,