module Mongous::Document

Public Class Methods

included( klass ) click to toggle source
# File lib/mongous/document.rb, line 5
def included( klass )
  klass.extend  Extention
end
new( **doc ) click to toggle source
# File lib/mongous/document.rb, line 10
def initialize( **doc )
  @doc  =  {}
  doc.each do |label, value|
    label  =  label.to_s
    @doc[label]  =  value
  end
end

Public Instance Methods

[]( label ) click to toggle source
# File lib/mongous/document.rb, line 114
def []( label )
  label  =  label.to_s

  if  self.class.symbols[:strict]
    labels  =  ["_id"] + self.class.fields.keys
    if  !labels.include?( label )
      raise  Mongous::Error, "undefined field. : #{ label }"
    end
  end

  return  @doc[label]    if @doc.has_key?(label)

  field  =  self.class.fields[label]
  return  nil    if field.nil?

  case  default  =  field[:default]
  when  Proc
    self.instance_eval( &default )
  else
    default
  end
end
[]=( label, value ) click to toggle source
# File lib/mongous/document.rb, line 137
def []=( label, value )
  label  =  label.to_s
  if  self.class.symbols[:strict]
    labels  =  ["_id"] + self.class.fields.keys
    if  !labels.include?( label )
      raise  Mongous::Error, "undefined field. : #{ label }"
    end
  end

  field  =  self.class.fields[label]
  if field.nil?
    @doc[label]  =  value
    return
  end

  types  =  []
  if ( attrs  =  field[:_attrs]  ||  [] )
    attrs.each do |attr|
      if  attr.class == Class
        types  <<  attr
        attrs  -=  [attr]
        break
      end
    end
  end

  if  !types.empty?
    if  !(attrs & [:must, :not_null]).empty?
      if  !types.include?( value.class )
        raise  Mongous::Error, "invalid type. : #{ label } : #{ value.class }"
      end
    else
      if  !(types + [NilClass] ).include?( value.class )
        raise  Mongous::Error, "invalid type. : #{ label } : #{ value.class }"
      end
    end
  else
    if  !(attrs & [:must, :not_null]).empty?
      if  [NilClass].include?( value.class )
        raise  Mongous::Error, "invalid type. : #{ label } : #{ value.class }"
      end
    end
  end

  @doc[label]  =  value

  attrs.each do |attr|
    case  attr
    when  Proc
      if  !self.instance_eval( &attr )
        raise  Mongous::Error, "violation detected. : #{ label } : #{ value }"
      end
    when  Array
      if  !attr.include?( value )
        raise  Mongous::Error, "not include. : #{ label } : #{ value }"
      end
    when  Range
      if  !attr.cover?( value )
        raise  Mongous::Error, "out of range. : #{ label } : #{ value }"
      end
    when  Regexp
      if  !attr.match( value )
        raise  Mongous::Error, "unmatch regexp. : #{ label } : #{ value }"
      end
    end
  end
end
getvalue_or_callproc( value_or_proc ) click to toggle source
# File lib/mongous/document.rb, line 40
def getvalue_or_callproc( value_or_proc )
  case  value_or_proc
  when  Proc
    value_or_proc.call
  else
    value_or_proc
  end
end
having?( label ) click to toggle source
# File lib/mongous/document.rb, line 29
def having?( label )
  case  label
  when  NilClass
    false
  when  String
    !label.strip.empty?
  else
    true
  end
end
method_missing( sym, *args, **_opts, &_block ) click to toggle source
# File lib/mongous/document.rb, line 18
def method_missing( sym, *args, **_opts, &_block )
  m  =  /\A(\w+)([=])?\Z/.match( sym.to_s )
  if  args.size == 0 && m[2].nil?
    self[ m[1] ]
  elsif  args.size == 1 && !m[2].nil?
    self[ m[1] ]  =  args.shift
  else
    raise  Mongous::Error, "invalid parameter. #{sym} #{args.join(', ')}"
  end
end
save() click to toggle source
# File lib/mongous/document.rb, line 49
def save
  if  @doc["_id"].nil? || self.class.collection.find( { "_id"=> @doc["_id"] } ).count == 0
    savemode  =  :create
  else
    savemode  =  :update
  end

  self.class.fields.each do |label, field|
    default_value  =  getvalue_or_callproc( field[:default] )
    must  =  field[:_attrs].include?(:must)
    if  @doc.has_key?(label)
      if  !having?( @doc[label] )
        if  default_value
          self[label]  =  default_value
        elsif  must
          raise  Mongous::Error, "must but unassigned field. : #{ label }"
        elsif  self.class.symbols[:strict]
          self[label]  =  nil
        end
      end
    else
      if  default_value
        self[label]  =  default_value
      elsif  must
        raise  Mongous::Error, "must but unassigned field. : #{ label }"
      elsif  self.class.symbols[:strict]
        self[label]  =  nil
      end
    end

    case  savemode
    when  :create
      if ( create_value  =  getvalue_or_callproc( field[:create] ) )
        self[label]  =  create_value
      end
    when  :update
      if ( update_value  =  getvalue_or_callproc( field[:update] ) )
        self[label]  =  update_value
      end
    end
  end

  self.class.blocks.each do |call_from, block|
    if  !self.instance_eval( &block )
      raise  Mongous::Error, "violation detected on save. : #{ call_from }"
    end
  end

  case  savemode
  when  :create
    self.class.collection.insert_one( @doc )
  when  :update
    self.class.collection.update_one( { "_id"=> @doc["_id"] }, { '$set' => @doc } )
  end
  self
end
to_hash() click to toggle source
# File lib/mongous/document.rb, line 106
def to_hash
  @doc.dup
end
to_json( **opts ) click to toggle source
# File lib/mongous/document.rb, line 110
def to_json( **opts )
  ::JSON.generate( @doc, **opts )
end