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