module DiasporaFederation::PropertiesDSL

Provides a simple DSL for specifying {Entity} properties during class definition.

@example

property :prop
property :optional, default: false
property :dynamic_default, default: -> { Time.now }
property :original_prop, alias: :alias_prop
entity :nested, NestedEntity
entity :multiple, [OtherEntity]

Public Instance Methods

class_props() click to toggle source

@return [Hash] hash of declared entity properties

# File lib/diaspora_federation/properties_dsl.rb, line 16
def class_props
  @class_props ||= {}
end
default_values() click to toggle source

Return a new hash of default values, with dynamic values resolved on each call @return [Hash] default values

# File lib/diaspora_federation/properties_dsl.rb, line 59
def default_values
  optional_props.to_h {|name| [name, nil] }.merge(default_props).transform_values {|prop|
    prop.respond_to?(:call) ? prop.call : prop
  }
end
entity(name, type, opts={}) click to toggle source

Define a property that should contain another Entity or an array of other Entities @param [Symbol] name property name @param [Entity, Array<Entity>] type Entity subclass or

Array with exactly one Entity subclass constant inside

@param [Hash] opts further options @option opts [Object, call] :default a default value, making the

property optional
# File lib/diaspora_federation/properties_dsl.rb, line 40
def entity(name, type, opts={})
  raise InvalidType unless entity_type_valid?(type)

  define_property name, type, opts
end
missing_props(args) click to toggle source

Return array of missing required property names @return [Array<Symbol>] missing required property names

# File lib/diaspora_federation/properties_dsl.rb, line 48
def missing_props(args)
  class_props.keys - default_props.keys - optional_props - args.keys
end
optional_props() click to toggle source
# File lib/diaspora_federation/properties_dsl.rb, line 52
def optional_props
  @optional_props ||= []
end
property(name, type, opts={}) click to toggle source

Define a generic (string-type) property @param [Symbol] name property name @param [Symbol] type property type @param [Hash] opts further options @option opts [Object, call] :default a default value, making the

property optional
# File lib/diaspora_federation/properties_dsl.rb, line 26
def property(name, type, opts={})
  raise InvalidType unless property_type_valid?(type)

  define_property name, type, opts
end
resolv_aliases(data) click to toggle source

@param [Hash] data entity data @return [Hash] hash with resolved aliases

# File lib/diaspora_federation/properties_dsl.rb, line 67
def resolv_aliases(data)
  data.to_h {|name, value|
    if class_prop_aliases.has_key? name
      prop_name = class_prop_aliases[name]
      raise InvalidData, "only use '#{name}' OR '#{prop_name}'" if data.has_key? prop_name

      [prop_name, value]
    else
      [name, value]
    end
  }
end

Private Instance Methods

class_prop_aliases() click to toggle source

Returns all alias mappings @return [Hash] alias properties

# File lib/diaspora_federation/properties_dsl.rb, line 120
def class_prop_aliases
  @class_prop_aliases ||= {}
end
default_props() click to toggle source
# File lib/diaspora_federation/properties_dsl.rb, line 114
def default_props
  @default_props ||= {}
end
define_alias(name, alias_name) click to toggle source

@param [Symbol] name property name @param [Symbol] alias_name alias name

# File lib/diaspora_federation/properties_dsl.rb, line 126
def define_alias(name, alias_name)
  class_prop_aliases[alias_name] = name
  instance_eval { alias_method alias_name, name }
end
define_property(name, type, opts={}) click to toggle source
# File lib/diaspora_federation/properties_dsl.rb, line 82
def define_property(name, type, opts={})
  raise InvalidName unless name_valid?(name)

  class_props[name] = type
  optional_props << name if opts[:optional]
  default_props[name] = opts[:default] if opts.has_key? :default

  instance_eval { attr_reader name }

  define_alias(name, opts[:alias]) if opts.has_key? :alias
end
entity_type_valid?(type) click to toggle source

Checks if the type extends {Entity} @param [Class] type the type to check @return [Boolean]

# File lib/diaspora_federation/properties_dsl.rb, line 108
def entity_type_valid?(type)
  [type].flatten.all? {|type|
    type.respond_to?(:ancestors) && type.ancestors.include?(Entity)
  }
end
name_valid?(name) click to toggle source

Checks if the name is a Symbol or a String @param [String, Symbol] name the name to check @return [Boolean]

# File lib/diaspora_federation/properties_dsl.rb, line 97
def name_valid?(name)
  name.instance_of?(Symbol)
end
property_type_valid?(type) click to toggle source
# File lib/diaspora_federation/properties_dsl.rb, line 101
def property_type_valid?(type)
  %i[string integer boolean timestamp].include?(type)
end