class GlobalRegistry::Bindings::Options::RelationshipOptionsParser

Public Class Methods

new(model_class) click to toggle source
# File lib/global_registry_bindings/options/relationship_options_parser.rb, line 7
def initialize(model_class)
  @model_class = model_class
end

Public Instance Methods

defaults() click to toggle source
# File lib/global_registry_bindings/options/relationship_options_parser.rb, line 11
def defaults
  {
    binding: :relationship, id_column: :global_registry_id,
    type: @model_class.name.demodulize.underscore.to_sym,
    client_integration_id: :id,
    primary_binding: :entity, primary: nil, primary_class: nil, primary_name: nil, primary_foreign_key: nil,
    related: nil, related_class: nil, related_type: nil, related_name: nil, related_foreign_key: nil,
    related_global_registry_id: nil, related_binding: :entity,
    exclude: %i[id created_at updated_at], include_all_columns: false,
    fields: {}, ensure_type: true, rename_entity_type: true, if: nil, unless: nil
  }.freeze
end
parse(options_hash = {}) click to toggle source
# File lib/global_registry_bindings/options/relationship_options_parser.rb, line 24
def parse(options_hash = {})
  validate_options! options_hash
  merge_defaults(options_hash)
  update_association_classes
  update_foreign_keys
  update_excludes
  @options
end

Private Instance Methods

association_class(name) click to toggle source
# File lib/global_registry_bindings/options/relationship_options_parser.rb, line 94
def association_class(name)
  @model_class.reflect_on_association(name)&.klass
end
association_foreign_key(name) click to toggle source
# File lib/global_registry_bindings/options/relationship_options_parser.rb, line 90
def association_foreign_key(name)
  @model_class.reflect_on_association(name)&.foreign_key&.to_sym
end
merge_defaults(options_hash = {}) click to toggle source
# File lib/global_registry_bindings/options/relationship_options_parser.rb, line 40
def merge_defaults(options_hash = {})
  @options = defaults.merge(options_hash) do |key, oldval, newval|
    if key == :exclude
      case newval
      when Proc, Symbol
        newval
      else
        oldval.concat Array.wrap(newval)
      end
    else
      newval
    end
  end
end
update_association_classes() click to toggle source
# File lib/global_registry_bindings/options/relationship_options_parser.rb, line 55
def update_association_classes
  unless @options[:primary_class]
    @options[:primary_class] = if @options[:primary]
                                 association_class @options[:primary]
                               else
                                 @model_class
                               end
  end
  unless @options[:related_class] # rubocop:disable Style/GuardClause
    @options[:related_class] = association_class @options[:related]
  end
end
update_excludes() click to toggle source
# File lib/global_registry_bindings/options/relationship_options_parser.rb, line 77
def update_excludes
  return unless @options[:exclude].is_a? Array
  @options[:exclude] << @options[:id_column]
  @options[:exclude] << @options[:mdm_id_column] if @options[:mdm_id_column].present?

  if @options[:primary_foreign_key]
    @options[:exclude] << @options[:primary_foreign_key]
  end
  if @options[:related_foreign_key] # rubocop:disable Style/GuardClause
    @options[:exclude] << @options[:related_foreign_key]
  end
end
update_foreign_keys() click to toggle source
# File lib/global_registry_bindings/options/relationship_options_parser.rb, line 68
def update_foreign_keys
  unless @options[:primary_foreign_key]
    @options[:primary_foreign_key] = association_foreign_key @options[:primary]
  end
  unless @options[:related_foreign_key] # rubocop:disable Style/GuardClause
    @options[:related_foreign_key] = association_foreign_key @options[:related]
  end
end
validate_options!(options = {}) click to toggle source
# File lib/global_registry_bindings/options/relationship_options_parser.rb, line 35
def validate_options!(options = {})
  unknown = options.keys - defaults.keys
  raise ArgumentError, "global-registry-bindings: Unknown options (#{unknown.join ', '})" unless unknown.empty?
end