mongo_db 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,27 @@
1
+ ru:
2
+ errors:
3
+ # The default format to use in full error messages.
4
+ format: "%{attribute} %{message}"
5
+
6
+ # The values :model, :attribute and :value are always available for interpolation
7
+ # The value :count is available when applicable. Can be used for pluralization.
8
+ messages:
9
+ inclusion: "недопустимое значение"
10
+ exclusion: "недопустимо"
11
+ invalid: "неверно"
12
+ confirmation: "не совпадает с подтверждением"
13
+ accepted: "долно быть принято"
14
+ empty: "не может быть пустым"
15
+ blank: "не может быть пустым"
16
+ too_long: "слишком длинно (максимально допустимо %{count})"
17
+ too_short: "слищком коротко (минимально допустимо %{count})"
18
+ wrong_length: "неверная длинна (должно быть %{count})"
19
+ not_a_number: "не номер"
20
+ not_an_integer: "долно быть целочисленно"
21
+ greater_than: "должно быть больше чем %{count}"
22
+ greater_than_or_equal_to: "должно быть больше чем или равно %{count}"
23
+ equal_to: "должно быть равно %{count}"
24
+ less_than: "должно быть меньше чем %{count}"
25
+ less_than_or_equal_to: "должно быть меньше чем или равно %{count}"
26
+ odd: "должно быть не четно"
27
+ even: "должно быть четно"
@@ -0,0 +1,4 @@
1
+ en:
2
+ errors:
3
+ messages:
4
+ taken: "has already been taken"
@@ -0,0 +1,4 @@
1
+ ru:
2
+ errors:
3
+ messages:
4
+ taken: "уже занято"
@@ -0,0 +1,4 @@
1
+ require 'i18n'
2
+
3
+ dir = File.dirname __FILE__
4
+ I18n.load_path += Dir["#{dir}/locales/**/*.{rb,yml}"]
@@ -14,22 +14,33 @@ module Mongo::Model::Assignment
14
14
  protected
15
15
  attr_reader :attributes
16
16
 
17
- def method_missing attribute_name, type, mass_assignment = false
17
+ def method_missing attribute_name, *args
18
18
  attribute_name.must_be.a Symbol
19
- type.must.respond_to :cast
19
+
20
+ args.size.must_be.in 1..2
21
+ if args.first.is_a? Class
22
+ type, mass_assignment = args
23
+ mass_assignment ||= false
24
+ type.must.respond_to :cast
25
+ else
26
+ type, mass_assignment = nil, args.first
27
+ end
28
+
20
29
  attributes[attribute_name] = [type, mass_assignment]
21
30
  end
22
31
  end
23
32
 
24
33
  def set attributes, options = {}
25
- if rules = self.class._assignment
34
+ if rules = self.class._assign
26
35
  force = options[:force]
27
36
  attributes.each do |n, v|
28
37
  n = n.to_sym
29
- type, mass_assignment = rules[n]
30
- if type and (mass_assignment or force)
31
- v = type.cast(v)
32
- send "#{n}=", v
38
+ if rule = rules[n]
39
+ type, mass_assignment = rule
40
+ if mass_assignment or force
41
+ v = type.cast(v) if type
42
+ send "#{n}=", v
43
+ end
33
44
  end
34
45
  end
35
46
  else
@@ -43,12 +54,12 @@ module Mongo::Model::Assignment
43
54
  end
44
55
 
45
56
  module ClassMethods
46
- inheritable_accessor :_assignment, nil
57
+ inheritable_accessor :_assign, nil
47
58
 
48
- def assignment &block
59
+ def assign &block
49
60
  dsl = ::Mongo::Model::Assignment::Dsl.new
50
61
  dsl.instance_eval &block
51
- self._assignment = (_assignment || {}).merge dsl.to_h
62
+ self._assign = (_assign || {}).merge dsl.to_h
52
63
  end
53
64
  end
54
65
  end
@@ -0,0 +1,54 @@
1
+ require 'json'
2
+ require 'yaml'
3
+
4
+ module Mongo::Model::AttributeConvertors
5
+ CONVERTORS = {
6
+ line: {
7
+ from_string: -> s {(s || "").split(',').collect{|s| s.strip}},
8
+ to_string: -> v {v.join(', ')}
9
+ },
10
+ column: {
11
+ from_string: -> s {(s || "").split("\n").collect{|s| s.strip}},
12
+ to_string: -> v {v.join("\n")}
13
+ },
14
+ yaml: {
15
+ from_string: -> s {YAML.load s rescue {}},
16
+ to_string: -> v {v.to_yaml.strip}
17
+ },
18
+ json: {
19
+ from_string: -> s {JSON.parse s rescue {}},
20
+ to_string: -> v {v.to_json.strip}
21
+ }
22
+ }
23
+
24
+ module ClassMethods
25
+ def available_as_string name, converter_name
26
+ converter = CONVERTORS[converter_name]
27
+ raise "unknown converter name :#{converter_name} for :#{name} field!" unless converter
28
+
29
+ from_string, to_string = converter[:from_string], converter[:to_string]
30
+ name_as_string = "#{name}_as_string".to_sym
31
+ define_method name_as_string do
32
+ _cache[name_as_string] ||= to_string.call(send(name))
33
+ end
34
+
35
+ define_method "#{name_as_string}=" do |value|
36
+ _cache.delete name_as_string
37
+ self.send "#{name}=", from_string.call(value)
38
+ end
39
+ end
40
+
41
+ def available_as_yaml name
42
+ raise "delimiter not specified for :#{name} field!" unless delimiter
43
+ method = "#{name}_as_string"
44
+ define_method method do
45
+ self.send(name).join(delimiter)
46
+ end
47
+ define_method "#{method}=" do |value|
48
+ value = (value || "").split(delimiter.strip).collect{|s| s.strip}
49
+ self.send "#{name}=", value
50
+ end
51
+ end
52
+ end
53
+
54
+ end
@@ -16,7 +16,36 @@ module Mongo::Model::Crud
16
16
  end
17
17
 
18
18
  def destroy! *args
19
- destroy(*args)|| raise(Mongo::Error, "can't destroy #{self.inspect}!")
19
+ destroy(*args) || raise(Mongo::Error, "can't destroy #{self.inspect}!")
20
+ end
21
+
22
+ module ClassMethods
23
+ def build attributes, opts = {}
24
+ self.new.set attributes, opts
25
+ end
26
+
27
+ def create attributes, opts = {}
28
+ o = build attributes, opts
29
+ o.save
30
+ o
31
+ end
32
+
33
+ def create! attributes, opts = {}
34
+ o = create attributes
35
+ raise(Mongo::Error, "can't create #{attributes.inspect}!") if o.new_record?
36
+ o
37
+ end
38
+
39
+ def destroy_all selector = {}, opts = {}
40
+ success = true
41
+ collection = opts[:collection] || self.collection
42
+ each(selector){|o| success = false unless o.destroy}
43
+ success
44
+ end
45
+
46
+ def destroy_all! selector = {}, opts = {}
47
+ destroy_all(selector, opts) || raise(Mongo::Error, "can't destroy #{selector.inspect}!")
48
+ end
20
49
  end
21
50
 
22
51
  protected
@@ -5,6 +5,25 @@ module Mongo::Model::Misc
5
5
  self.updated_at = now
6
6
  end
7
7
 
8
+
9
+ def _cache
10
+ @_cache ||= {}
11
+ end
12
+ def _clear_cache
13
+ @_cache = {}
14
+ end
15
+
16
+
17
+ def dom_id
18
+ # new_record? ? "new_#{self.class.name.underscore}" : to_param
19
+ to_param
20
+ end
21
+
22
+ def to_param
23
+ (_id || '').to_s
24
+ end
25
+
26
+
8
27
  module ClassMethods
9
28
  def timestamps!
10
29
  attr_accessor :created_at, :updated_at
@@ -1,7 +1,8 @@
1
1
  module Mongo::Model
2
2
  attr_accessor :_id, :_class
3
3
 
4
- def new_record?; !!_id end
4
+ def _id?; !!_id end
5
+ def new_record?; !_id end
5
6
 
6
7
  class << self
7
8
  attr_accessor :db, :connection
@@ -19,12 +19,13 @@ module Mongo::Model; end
19
19
  crud
20
20
  query
21
21
  scope
22
+ attribute_convertors
22
23
  misc
23
24
  model
24
25
  ).each{|f| require "mongo_db/model/#{f}"}
25
26
 
26
27
  module Mongo
27
28
  module Model
28
- inherit Db, Assignment, Callbacks, Validation, Crud, Query, Scope, Misc
29
+ inherit Db, Assignment, Callbacks, Validation, Crud, Query, Scope, AttributeConvertors, Misc
29
30
  end
30
31
  end
data/readme.md CHANGED
@@ -2,7 +2,7 @@ Object Model & Ruby driver enhancements for MongoDB.
2
2
 
3
3
  1. Driver enchancements & Migrations.
4
4
  2. Persistence for any Ruby object.
5
- 3. Object Model (callbacks, validations, mass-assignment, finders, ...) (work in progress).
5
+ 3. Object Model (callbacks, validations, mass-assignment, finders, ...).
6
6
 
7
7
  Lower layers are independent from upper, use only what You need.
8
8
 
@@ -124,11 +124,8 @@ db.units.all name: {_gt: 'Z'} # => [zeratul]
124
124
 
125
125
  Source: examples/object.rb
126
126
 
127
- # Object Model (work in progress)
127
+ # Object Model
128
128
 
129
- Model designed after the excellent "Domain-Driven Design" book by Eric Evans.
130
-
131
- - Very small, see [code stats][:code_stats].
132
129
  - The same API for pure driver and Models.
133
130
  - Minimum extra abstractions, trying to keep things as close to the MongoDB semantic as possible.
134
131
  - Schema-less, dynamic (with ability to specify types for mass-assignment).
@@ -136,9 +133,9 @@ Model designed after the excellent "Domain-Driven Design" book by Eric Evans.
136
133
  - Full support for embedded objects (validations, callbacks, ...).
137
134
  - Scope, default_scope
138
135
  - Doesn't try to mimic ActiveRecord, MongoDB is differrent and this tool designed to get most of it.
136
+ - Very small, see [code stats][code_stats].
139
137
 
140
- Existing ODM like MongoMapper and Mongoid are trying to hide simple but non-standard API of MongoDB by covering it with complicated but familiar API.
141
- This ODM exposes simplicity of MongoDB and leverages it's differences.
138
+ Other ODM usually try to cover simple but non-standard API of MongoDB behind complex ORM-like abstractions. This tool **exposes simplicity and power of MongoDB and leverages it's differences**.
142
139
 
143
140
  ``` ruby
144
141
  # Connecting to MongoDB.
@@ -153,11 +150,11 @@ Mongo::Model.db = db
153
150
  class Unit
154
151
  inherit Mongo::Model
155
152
  collection :units
156
-
153
+
157
154
  attr_accessor :name, :status, :stats
158
-
155
+
159
156
  scope :alive, status: 'alive'
160
-
157
+
161
158
  class Stats
162
159
  inherit Mongo::Model
163
160
  attr_accessor :attack, :life, :shield
@@ -165,8 +162,8 @@ class Unit
165
162
  end
166
163
 
167
164
  # Create.
168
- zeratul = Unit.new.set(name: 'Zeratul', status: 'alive', stats: Unit::Stats.new.set(attack: 85, life: 300, shield: 100))
169
- tassadar = Unit.new.set(name: 'Tassadar', status: 'dead', stats: Unit::Stats.new.set(attack: 0, life: 80, shield: 300))
165
+ zeratul = Unit.build(name: 'Zeratul', status: 'alive', stats: Unit::Stats.build(attack: 85, life: 300, shield: 100))
166
+ tassadar = Unit.build(name: 'Tassadar', status: 'dead', stats: Unit::Stats.build(attack: 0, life: 80, shield: 300))
170
167
 
171
168
  zeratul.save
172
169
  tassadar.save
@@ -264,4 +261,4 @@ Copyright (c) Alexey Petrushin, http://petrush.in, released under the MIT licens
264
261
 
265
262
  [mongo_mapper_ext]: https://github.com/alexeypetrushin/mongo_mapper_ext
266
263
  [mongoid_misc]: https://github.com/alexeypetrushin/mongoid_misc
267
- [code_stats]: https://raw.github.com/alexeypetrushin/mongo_db/master/doc/code_stats.png
264
+ [code_stats]: https://github.com/alexeypetrushin/mongo_db/raw/master/docs/code_stats.png
@@ -0,0 +1 @@
1
+ # to_json, to_xml
@@ -1,40 +1,34 @@
1
1
  require 'model/spec_helper'
2
+ require 'active_model'
2
3
 
3
- begin
4
- require 'active_model'
4
+ describe "Validations" do
5
+ with_mongo_model
5
6
 
6
- describe "Validations" do
7
- with_mongo_model
7
+ before do
8
+ class Unit
9
+ inherit Mongo::Model
10
+ collection :units
8
11
 
9
- before do
10
- class Unit
11
- inherit Mongo::Model
12
- collection :units
12
+ include ActiveModel::Validations
13
13
 
14
- include ActiveModel::Validations
14
+ attr_accessor :name, :status
15
15
 
16
- attr_accessor :name, :status
17
-
18
- validates_presence_of :name
19
- end
16
+ validates_presence_of :name
20
17
  end
18
+ end
21
19
 
22
- after{remove_constants :Unit}
20
+ after{remove_constants :Unit}
23
21
 
24
- it "ActiveModel integration smoke test" do
25
- unit = Unit.new
26
- unit.should be_invalid
27
- unit.errors.size.should == 1
28
- unit.errors.first.first.should == :name
29
- unit.save.should be_false
22
+ it "ActiveModel integration smoke test" do
23
+ unit = Unit.new
24
+ unit.should be_invalid
25
+ unit.errors.size.should == 1
26
+ unit.errors.first.first.should == :name
27
+ unit.save.should be_false
30
28
 
31
- unit.name = 'Zeratul'
32
- unit.should be_valid
33
- unit.errors.should be_empty
34
- unit.save.should be_true
35
- end
29
+ unit.name = 'Zeratul'
30
+ unit.should be_valid
31
+ unit.errors.should be_empty
32
+ unit.save.should be_true
36
33
  end
37
-
38
- rescue LoadError => e
39
- warn 'No ActiveModel, integration with ActiveModel::Validations spec will be skipped.'
40
34
  end
@@ -9,31 +9,32 @@ describe 'Model callbacks' do
9
9
  class User
10
10
  inherit Mongo::Model
11
11
 
12
- attr_accessor :name, :active, :age, :banned
12
+ attr_accessor :name, :has_mail, :age, :banned
13
13
  end
14
14
 
15
15
  u = User.new
16
- u.set name: 'Alex', active: '1', age: '31', banned: '0'
17
- [u.name, u.active, u.age, u.banned].should == ['Alex', '1', '31', '0']
16
+ u.set name: 'Alex', has_mail: '1', age: '31', banned: '0'
17
+ [u.name, u.has_mail, u.age, u.banned].should == ['Alex', '1', '31', '0']
18
18
  end
19
19
 
20
20
  it "should update only specified attributes" do
21
21
  class User
22
22
  inherit Mongo::Model
23
23
 
24
- attr_accessor :name, :active, :age, :banned
24
+ attr_accessor :name, :has_mail, :age, :position, :banned
25
25
 
26
- assignment do
26
+ assign do
27
27
  name String, true
28
- active Boolean, true
28
+ has_mail Boolean, true
29
29
  age Integer, true
30
+ position true
30
31
  banned Boolean
31
32
  end
32
33
  end
33
34
 
34
35
  u = User.new
35
- u.set name: 'Alex', active: '1', age: '31', password: 'fake'
36
- [u.name, u.active, u.age, u.banned].should == ['Alex', true, 31, nil]
36
+ u.set name: 'Alex', has_mail: '1', age: '31', position: [11, 34] ,banned: '0'
37
+ [u.name, u.has_mail, u.age, u.position, u.banned].should == ['Alex', true, 31, [11, 34], nil]
37
38
 
38
39
  # should allow to forcefully cast and update any attribute
39
40
  u.set! banned: '0'
@@ -46,7 +47,7 @@ describe 'Model callbacks' do
46
47
 
47
48
  attr_accessor :age
48
49
 
49
- assignment do
50
+ assign do
50
51
  age Integer, true
51
52
  end
52
53
  end
@@ -54,7 +55,7 @@ describe 'Model callbacks' do
54
55
  class Writer < User
55
56
  attr_accessor :posts
56
57
 
57
- assignment do
58
+ assign do
58
59
  posts Integer, true
59
60
  end
60
61
  end
@@ -0,0 +1,73 @@
1
+ require 'model/spec_helper'
2
+
3
+ describe "Attribute Convertors" do
4
+ with_mongo_model
5
+
6
+ after(:all){remove_constants :TheSample}
7
+
8
+ convertors = Mongo::Model::AttributeConvertors::CONVERTORS
9
+
10
+ it ":line convertor" do
11
+ v = ['a', 'b']
12
+ str_v = 'a, b'
13
+ convertors[:line][:from_string].call(str_v).should == v
14
+ convertors[:line][:to_string].call(v).should == str_v
15
+ end
16
+
17
+ it ":yaml convertor" do
18
+ v = {'a' => 'b'}
19
+ str_v = v.to_yaml.strip
20
+
21
+ convertors[:yaml][:from_string].call(str_v).should == v
22
+ convertors[:yaml][:to_string].call(v).should == str_v
23
+ end
24
+
25
+ it ":json convertor" do
26
+ v = {'a' => 'b'}
27
+ str_v = v.to_json.strip
28
+ convertors[:json][:from_string].call(str_v).should == v
29
+ convertors[:json][:to_string].call(v).should == str_v
30
+ end
31
+
32
+ it ":field should generate helper methods if :as_string option provided" do
33
+ class ::TheSample
34
+ inherit Mongo::Model
35
+
36
+ attr_accessor :tags, :protected_tags
37
+ available_as_string :tags, :line
38
+ available_as_string :protected_tags, :line
39
+
40
+ def initialize
41
+ @tags, @protected_tags = [], []
42
+ end
43
+
44
+ assign do
45
+ tags_as_string true
46
+ end
47
+ end
48
+
49
+ o = TheSample.new
50
+
51
+ # get
52
+ o.tags_as_string.should == ''
53
+ o.tags = %w(Java Ruby)
54
+ o._clear_cache
55
+ o.tags_as_string.should == 'Java, Ruby'
56
+
57
+ # set
58
+ o.tags_as_string = ''
59
+ o.tags.should == []
60
+ o.tags_as_string = 'Java, Ruby'
61
+ o.tags.should == %w(Java Ruby)
62
+
63
+ # mass assignment
64
+ o.tags = []
65
+ o.set tags_as_string: 'Java, Ruby'
66
+ o.tags.should == %w(Java Ruby)
67
+
68
+ # # protection
69
+ o.protected_tags = []
70
+ o.set protected_tags_as_string: 'Java, Ruby'
71
+ o.protected_tags.should == []
72
+ end
73
+ end
@@ -17,7 +17,7 @@ describe "Model CRUD" do
17
17
  after(:all){remove_constants :Unit}
18
18
 
19
19
  before do
20
- @zeratul = Unit.new.set name: 'Zeratul', info: 'Dark Templar'
20
+ @zeratul = Unit.build name: 'Zeratul', info: 'Dark Templar'
21
21
  end
22
22
 
23
23
  it_should_behave_like "object CRUD"
@@ -72,9 +72,27 @@ describe "Model CRUD" do
72
72
  db.heroes.count.should == 0
73
73
  end
74
74
 
75
- it 'create'
75
+ it 'build' do
76
+ u = Unit.build name: 'Zeratul'
77
+ u.name.should == 'Zeratul'
78
+ end
79
+
80
+ it 'create' do
81
+ u = Unit.create(name: 'Zeratul')
82
+ u.new_record?.should be_false
83
+
84
+ u = Unit.create!(name: 'Zeratul')
85
+ u.new_record?.should be_false
86
+ end
76
87
 
77
- it 'destroy_all'
88
+ it 'destroy_all' do
89
+ Unit.create(name: 'Zeratul')
90
+ Unit.count.should == 1
91
+ Unit.destroy_all
92
+ Unit.count.should == 0
93
+
94
+ Unit.destroy_all!
95
+ end
78
96
  end
79
97
 
80
98
  describe 'embedded' do
@@ -100,8 +118,8 @@ describe "Model CRUD" do
100
118
  @mission_class = Player::Mission
101
119
  @player = Player.new
102
120
  @player.missions = [
103
- Player::Mission.new.set(name: 'Wasteland', stats: {buildings: 5, units: 10}),
104
- Player::Mission.new.set(name: 'Backwater Station', stats: {buildings: 8, units: 25}),
121
+ Player::Mission.build(name: 'Wasteland', stats: {buildings: 5, units: 10}),
122
+ Player::Mission.build(name: 'Backwater Station', stats: {buildings: 8, units: 25}),
105
123
  ]
106
124
  end
107
125
 
@@ -119,7 +137,7 @@ describe "Model CRUD" do
119
137
 
120
138
  # update
121
139
  @player.missions.first.stats[:units] = 9
122
- @player.missions << Player::Mission.new.set(name: 'Desperate Alliance', stats: {buildings: 11, units: 40})
140
+ @player.missions << Player::Mission.build(name: 'Desperate Alliance', stats: {buildings: 11, units: 40})
123
141
  @player.save.should be_true
124
142
  Player.count.should == 1
125
143
  Player.first.should == @player
@@ -3,7 +3,13 @@ require 'model/spec_helper'
3
3
  describe 'Model Miscellaneous' do
4
4
  with_mongo_model
5
5
 
6
- after{remove_constants :Unit}
6
+ before do
7
+ class User
8
+ inherit Mongo::Model
9
+ collection :users
10
+ end
11
+ end
12
+ after{remove_constants :Unit3, :User}
7
13
 
8
14
  it "timestamps" do
9
15
  class Unit3
@@ -15,7 +21,7 @@ describe 'Model Miscellaneous' do
15
21
  timestamps!
16
22
  end
17
23
 
18
- unit = Unit3.new.set name: 'Zeratul'
24
+ unit = Unit3.build name: 'Zeratul'
19
25
  unit.save!
20
26
 
21
27
  unit = Unit3.first
@@ -28,5 +34,25 @@ describe 'Model Miscellaneous' do
28
34
  unit.updated_at.should > updated_at
29
35
  end
30
36
 
37
+ it 'cache' do
38
+ class Unit3
39
+ inherit Mongo::Model
40
+ end
41
+ u = Unit3.new
42
+ u._cache.should == {}
43
+ end
44
+
45
+ it "to_param" do
46
+ u = User.new
47
+ u.to_param.should == ''
48
+ u.save!
49
+ u.to_param.should_not be_empty
50
+ end
31
51
 
52
+ it "dom_id" do
53
+ u = User.new
54
+ u.dom_id.should == ''
55
+ u.save!
56
+ u.dom_id.should_not be_empty
57
+ end
32
58
  end
@@ -14,7 +14,7 @@ describe "Model Query" do
14
14
  end
15
15
  after(:all){remove_constants :Unit}
16
16
 
17
- before{@zeratul = Unit.new.set name: 'Zeratul'}
17
+ before{@zeratul = Unit.build name: 'Zeratul'}
18
18
 
19
19
  it 'exist?' do
20
20
  Unit.should_not exist(name: 'Zeratul')
@@ -41,7 +41,7 @@ describe "Model Query" do
41
41
 
42
42
  it 'dynamic finders integration' do
43
43
  Unit.first_by_name('Zeratul').should be_nil
44
- Unit.new.set(name: 'Zeratul').save!
44
+ Unit.build(name: 'Zeratul').save!
45
45
  Unit.first_by_name('Zeratul').name.should == 'Zeratul'
46
46
  end
47
47
  end
@@ -16,9 +16,9 @@ describe "Scope" do
16
16
 
17
17
  describe 'current scope' do
18
18
  it "should affect finders" do
19
- Unit.new.set(name: 'Zeratul', status: 'alive').save!
20
- Unit.new.set(name: 'Jim', status: 'alive').save!
21
- Unit.new.set(name: 'Tassadar', status: 'dead').save!
19
+ Unit.build(name: 'Zeratul', status: 'alive').save!
20
+ Unit.build(name: 'Jim', status: 'alive').save!
21
+ Unit.build(name: 'Tassadar', status: 'dead').save!
22
22
 
23
23
  Unit.count.should == 3
24
24
  Unit.all.size.should == 3
@@ -16,7 +16,7 @@ describe "Validations" do
16
16
  after{remove_constants :Unit}
17
17
 
18
18
  it "should not save model with errors" do
19
- unit = Unit.new.set name: 'Zeratul'
19
+ unit = Unit.build name: 'Zeratul'
20
20
  unit.save.should be_true
21
21
 
22
22
  unit.errors = []
@@ -30,7 +30,7 @@ describe "Validations" do
30
30
  end
31
31
 
32
32
  it "should check :errors only and ignore valid? method" do
33
- unit = Unit.new.set name: 'Zeratul'
33
+ unit = Unit.build name: 'Zeratul'
34
34
  unit.should_not_receive(:valid?)
35
35
  unit.save.should be_true
36
36
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_db
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 0.1.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -36,11 +36,16 @@ files:
36
36
  - lib/mongo_db/driver/spec.rb
37
37
  - lib/mongo_db/driver.rb
38
38
  - lib/mongo_db/gems.rb
39
+ - lib/mongo_db/integration/locales/activemodel/ru.yml
40
+ - lib/mongo_db/integration/locales/mongo_mapper/en.yml
41
+ - lib/mongo_db/integration/locales/mongo_mapper/ru.yml
42
+ - lib/mongo_db/integration/locales.rb
39
43
  - lib/mongo_db/migration/definition.rb
40
44
  - lib/mongo_db/migration/migration.rb
41
45
  - lib/mongo_db/migration/tasks.rb
42
46
  - lib/mongo_db/migration.rb
43
47
  - lib/mongo_db/model/assignment.rb
48
+ - lib/mongo_db/model/attribute_convertors.rb
44
49
  - lib/mongo_db/model/callbacks.rb
45
50
  - lib/mongo_db/model/crud.rb
46
51
  - lib/mongo_db/model/db.rb
@@ -66,6 +71,7 @@ files:
66
71
  - spec/integration/am_validation_spec.rb
67
72
  - spec/migration/migration_spec.rb
68
73
  - spec/model/assignment_spec.rb
74
+ - spec/model/attribute_convertors_spec.rb
69
75
  - spec/model/callbacks_spec.rb
70
76
  - spec/model/crud_spec.rb
71
77
  - spec/model/db_spec.rb