From db43388366d461c8cb4cda0ccbd32cb641d24c84 Mon Sep 17 00:00:00 2001 From: Rogers Date: Mon, 21 Aug 2023 10:37:05 -0700 Subject: [PATCH 1/2] Refactor side load --- lib/zendesk_api/association.rb | 117 ++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 52 deletions(-) diff --git a/lib/zendesk_api/association.rb b/lib/zendesk_api/association.rb index 9ae5efb3..884da818 100644 --- a/lib/zendesk_api/association.rb +++ b/lib/zendesk_api/association.rb @@ -73,72 +73,85 @@ def generate_path(*args) namespace.join("/") end - # Tries to place side loads onto given resources. - def side_load(resources, side_loads) - key = "#{options.name}_id" - plural_key = "#{Inflection.singular options.name.to_s}_ids" - - resources.each do |resource| - if resource.key?(plural_key) # Grab associations from child_ids field on resource - side_load_from_child_ids(resource, side_loads, plural_key) - elsif resource.key?(key) || options.singular - side_load_from_child_or_parent_id(resource, side_loads, key) - else # Grab associations from parent_id field from multiple child resources - side_load_from_parent_id(resource, side_loads, key) + class SideLoad + class << self + attr_reader :options + + def side_load(resources, side_loads) + key = "#{options.name}_id" + plural_key = "#{Inflection.singular options.name.to_s}_ids" + + resources.each do |resource| + if resource.key?(plural_key) # Grab associations from child_ids field on resource + side_load_from_child_ids(resource, side_loads, plural_key) + elsif resource.key?(key) || options.singular + side_load_from_child_or_parent_id(resource, side_loads, key) + else # Grab associations from parent_id field from multiple child resources + side_load_from_parent_id(resource, side_loads, key) + end + end end - end - end - private + private - # @return [Array] ['ZendeskAPI', 'Voice', etc.. ] - def ignorable_namespace_strings - ZendeskAPI::DataNamespace.descendants.map { |klass| klass.to_s.split('::') }.flatten.uniq - end + def _side_load(resource, side_loads) + side_loads.map! do |side_load| + resource.send(:wrap_resource, side_load, options) + end - def _side_load(resource, side_loads) - side_loads.map! do |side_load| - resource.send(:wrap_resource, side_load, options) - end + ZendeskAPI::Collection.new(resource.client, options[:class]).tap do |collection| + collection.replace(side_loads) + end + end - ZendeskAPI::Collection.new(resource.client, options[:class]).tap do |collection| - collection.replace(side_loads) - end - end + def side_load_from_parent_id(resource, side_loads, key) + key = "#{resource.class.singular_resource_name}_id" - def side_load_from_parent_id(resource, side_loads, key) - key = "#{resource.class.singular_resource_name}_id" + resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load| + side_load[key] == resource.id + })) + end - resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load| - side_load[key] == resource.id - })) - end + def side_load_from_child_ids(resource, side_loads, plural_key) + ids = resource.send(plural_key) - def side_load_from_child_ids(resource, side_loads, plural_key) - ids = resource.send(plural_key) + resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load| + ids.include?(side_load[options.include_key]) + })) + end - resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load| - ids.include?(side_load[options.include_key]) - })) - end + def side_load_from_child_or_parent_id(resource, side_loads, key) + # Either grab association from child_id field on resource or parent_id on child resource + if resource.key?(key) + id = resource.send(key) + include_key = options.include_key + else + id = resource.id + include_key = "#{resource.class.singular_resource_name}_id" + end - def side_load_from_child_or_parent_id(resource, side_loads, key) - # Either grab association from child_id field on resource or parent_id on child resource - if resource.key?(key) - id = resource.send(key) - include_key = options.include_key - else - id = resource.id - include_key = "#{resource.class.singular_resource_name}_id" - end + return unless id - return unless id + side_load = side_loads.detect do |side_load| + id == side_load[include_key] + end - side_load = side_loads.detect do |side_load| - id == side_load[include_key] + resource.send("#{options.name}=", side_load) if side_load + end end + end - resource.send("#{options.name}=", side_load) if side_load + # Tries to place side loads onto given resources. + def side_load(resources, side_loads) + SideLoad.instance_variable_set '@options', options + SideLoad.side_load(resources, side_loads) + end + + private + + # @return [Array] ['ZendeskAPI', 'Voice', etc.. ] + def ignorable_namespace_strings + ZendeskAPI::DataNamespace.descendants.map { |klass| klass.to_s.split('::') }.flatten.uniq end def build_parent_namespace(parent_class, instance, options, original_options) From 6fd2ba68afc68d52fafafdfac95e61415028d34e Mon Sep 17 00:00:00 2001 From: Rogers Date: Mon, 21 Aug 2023 14:46:39 -0700 Subject: [PATCH 2/2] Refactor side_load into a separate class --- lib/zendesk_api/association.rb | 69 +----------------------- lib/zendesk_api/association_side_load.rb | 69 ++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 68 deletions(-) create mode 100644 lib/zendesk_api/association_side_load.rb diff --git a/lib/zendesk_api/association.rb b/lib/zendesk_api/association.rb index 884da818..ee1fe7fa 100644 --- a/lib/zendesk_api/association.rb +++ b/lib/zendesk_api/association.rb @@ -1,3 +1,4 @@ +require 'zendesk_api/association_side_load' require 'zendesk_api/helpers' module ZendeskAPI @@ -73,74 +74,6 @@ def generate_path(*args) namespace.join("/") end - class SideLoad - class << self - attr_reader :options - - def side_load(resources, side_loads) - key = "#{options.name}_id" - plural_key = "#{Inflection.singular options.name.to_s}_ids" - - resources.each do |resource| - if resource.key?(plural_key) # Grab associations from child_ids field on resource - side_load_from_child_ids(resource, side_loads, plural_key) - elsif resource.key?(key) || options.singular - side_load_from_child_or_parent_id(resource, side_loads, key) - else # Grab associations from parent_id field from multiple child resources - side_load_from_parent_id(resource, side_loads, key) - end - end - end - - private - - def _side_load(resource, side_loads) - side_loads.map! do |side_load| - resource.send(:wrap_resource, side_load, options) - end - - ZendeskAPI::Collection.new(resource.client, options[:class]).tap do |collection| - collection.replace(side_loads) - end - end - - def side_load_from_parent_id(resource, side_loads, key) - key = "#{resource.class.singular_resource_name}_id" - - resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load| - side_load[key] == resource.id - })) - end - - def side_load_from_child_ids(resource, side_loads, plural_key) - ids = resource.send(plural_key) - - resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load| - ids.include?(side_load[options.include_key]) - })) - end - - def side_load_from_child_or_parent_id(resource, side_loads, key) - # Either grab association from child_id field on resource or parent_id on child resource - if resource.key?(key) - id = resource.send(key) - include_key = options.include_key - else - id = resource.id - include_key = "#{resource.class.singular_resource_name}_id" - end - - return unless id - - side_load = side_loads.detect do |side_load| - id == side_load[include_key] - end - - resource.send("#{options.name}=", side_load) if side_load - end - end - end - # Tries to place side loads onto given resources. def side_load(resources, side_loads) SideLoad.instance_variable_set '@options', options diff --git a/lib/zendesk_api/association_side_load.rb b/lib/zendesk_api/association_side_load.rb new file mode 100644 index 00000000..c8672d20 --- /dev/null +++ b/lib/zendesk_api/association_side_load.rb @@ -0,0 +1,69 @@ +module ZendeskAPI + class SideLoad + class << self + attr_reader :options + + def side_load(resources, side_loads) + key = "#{options.name}_id" + plural_key = "#{Inflection.singular options.name.to_s}_ids" + + resources.each do |resource| + if resource.key?(plural_key) # Grab associations from child_ids field on resource + side_load_from_child_ids(resource, side_loads, plural_key) + elsif resource.key?(key) || options.singular + side_load_from_child_or_parent_id(resource, side_loads, key) + else # Grab associations from parent_id field from multiple child resources + side_load_from_parent_id(resource, side_loads, key) + end + end + end + + private + + def _side_load(resource, side_loads) + side_loads.map! do |side_load| + resource.send(:wrap_resource, side_load, options) + end + + ZendeskAPI::Collection.new(resource.client, options[:class]).tap do |collection| + collection.replace(side_loads) + end + end + + def side_load_from_parent_id(resource, side_loads, key) + key = "#{resource.class.singular_resource_name}_id" + + resource.send("#{options.name}=", _side_load(resource, side_loads.select { |side_load| + side_load[key] == resource.id + })) + end + + def side_load_from_child_ids(resource, side_loads, plural_key) + ids = resource.send(plural_key) + + resource.send("#{options.name}=", _side_load(resource, side_loads.select { |side_load| + ids.include?(side_load[options.include_key]) + })) + end + + def side_load_from_child_or_parent_id(resource, side_loads, key) + # Either grab association from child_id field on resource or parent_id on child resource + if resource.key?(key) + id = resource.send(key) + include_key = options.include_key + else + id = resource.id + include_key = "#{resource.class.singular_resource_name}_id" + end + + return unless id + + side_load = side_loads.detect do |side_load| + id == side_load[include_key] + end + + resource.send("#{options.name}=", side_load) if side_load + end + end + end +end