Sha256: d2dbd76619731dd6c97b0ca46a2ac6e5f61ae3a259e4e2b4246967cae774f4a2

Contents?: true

Size: 1.84 KB

Versions: 3

Compression:

Stored size: 1.84 KB

Contents

module Neo4j::Shared
  # Contains methods related to the management
  class DeclaredProperty
    class IllegalPropertyError < StandardError; end

    ILLEGAL_PROPS = %w(from_node to_node start_node end_node)
    attr_reader :name, :name_string, :name_sym, :options, :magic_typecaster

    def initialize(name, options = {})
      fail IllegalPropertyError, "#{name} is an illegal property" if ILLEGAL_PROPS.include?(name.to_s)
      @name = @name_sym = name
      @name_string = name.to_s
      @options = options
    end

    def register
      register_magic_properties
    end

    def type
      options[:type]
    end

    def typecaster
      options[:typecaster]
    end

    def default_value
      options[:default]
    end

    private

    # Tweaks properties
    def register_magic_properties
      options[:type] ||= DateTime if name.to_sym == :created_at || name.to_sym == :updated_at
      # TODO: Custom typecaster to fix the stuff below
      # ActiveAttr does not handle "Time", Rails and Neo4j.rb 2.3 did
      # Convert it to DateTime in the interest of consistency
      options[:type] = DateTime if options[:type] == Time

      register_magic_typecaster
      register_type_converter
    end

    def register_magic_typecaster
      found_typecaster = Neo4j::Shared::TypeConverters.typecaster_for(options[:type])
      return unless found_typecaster && found_typecaster.respond_to?(:primitive_type)
      options[:typecaster] = found_typecaster
      @magic_typecaster = options[:type]
      options[:type] = found_typecaster.primitive_type
    end

    def register_type_converter
      converter = options[:serializer]
      return unless converter
      options[:type]        = converter.convert_type
      options[:typecaster]  = ActiveAttr::Typecasting::ObjectTypecaster.new
      Neo4j::Shared::TypeConverters.register_converter(converter)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
neo4j-5.0.0.rc.3 lib/neo4j/shared/declared_property.rb
neo4j-5.0.0.rc.2 lib/neo4j/shared/declared_property.rb
neo4j-5.0.0.rc.1 lib/neo4j/shared/declared_property.rb