class ActiveFedora::ModelClassifier

Translate model names to classes

Attributes

class_names[R]
default[R]

Public Class Methods

class_from_string(full_class_name, container_class = Kernel) click to toggle source

Convenience method for getting class constant based on a string @example

ActiveFedora::Model.class_from_string("Om")
=> Om
ActiveFedora::Model.class_from_string("ActiveFedora::RdfNode::TermProxy")
=> ActiveFedora::RdfNode::TermProxy

@example Search within ActiveFedora::RdfNode for a class called “TermProxy”

ActiveFedora::Model.class_from_string("TermProxy", ActiveFedora::RdfNode)
=> ActiveFedora::RdfNode::TermProxy
# File lib/active_fedora/model_classifier.rb, line 13
def self.class_from_string(full_class_name, container_class = Kernel)
  container_class = container_class.name if container_class.is_a? Module
  container_parts = container_class.split('::')
  (container_parts + full_class_name.split('::')).flatten.inject(Kernel) do |mod, class_name|
    if mod == Kernel
      Object.const_get(class_name)
    elsif mod.const_defined? class_name.to_sym
      mod.const_get(class_name)
    else
      container_parts.pop
      class_from_string(class_name, container_parts.join('::'))
    end
  end
end
new(class_names, default: ActiveFedora::Base) click to toggle source
# File lib/active_fedora/model_classifier.rb, line 30
def initialize(class_names, default: ActiveFedora::Base)
  @class_names = Array(class_names)
  @default = default
end

Public Instance Methods

best_model(opts = {}) click to toggle source

Select the “best” class from the list of class names. We define

the "best" class as:
 - a subclass of the given default, base class
 - preferring subclasses over the parent class
# File lib/active_fedora/model_classifier.rb, line 48
def best_model(opts = {})
  best_model_match = opts.fetch(:default, default)

  models.each do |model_value|
    # If there is an inheritance structure, use the most specific case.
    best_model_match = model_value if best_model_match.nil? || best_model_match > model_value
  end

  best_model_match
end
models() click to toggle source

Convert all the provided class names to class instances

# File lib/active_fedora/model_classifier.rb, line 37
def models
  class_names.map do |uri|
    classify(uri)
  end.compact
end

Private Instance Methods

class_exists?(class_name) click to toggle source
# File lib/active_fedora/model_classifier.rb, line 69
def class_exists?(class_name)
  return false if class_name.empty?
  klass = class_name.constantize
  klass.is_a?(Class)
rescue NameError
  false
end
classify(model_value) click to toggle source
# File lib/active_fedora/model_classifier.rb, line 61
def classify(model_value)
  unless class_exists?(model_value)
    ActiveFedora::Base.logger.warn "'#{model_value}' is not a real class"
    return nil
  end
  ActiveFedora::ModelClassifier.class_from_string(model_value)
end