mongodb 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/Rakefile +3 -5
  2. data/lib/mongodb/driver.rb +33 -0
  3. data/lib/mongodb/driver/collection.rb +156 -0
  4. data/lib/mongodb/driver/database.rb +6 -0
  5. data/lib/mongodb/driver/dynamic_finders.rb +41 -0
  6. data/lib/{mongo_db → mongodb}/driver/spec.rb +12 -12
  7. data/lib/mongodb/gems.rb +6 -0
  8. data/lib/mongodb/integration/locales.rb +4 -0
  9. data/lib/mongodb/integration/locales/activemodel/ru.yml +27 -0
  10. data/lib/mongodb/migration.rb +8 -0
  11. data/lib/mongodb/migration/definition.rb +19 -0
  12. data/lib/mongodb/migration/migration.rb +68 -0
  13. data/lib/mongodb/migration/tasks.rb +19 -0
  14. data/lib/mongodb/model.rb +26 -0
  15. data/lib/mongodb/model/assignment.rb +65 -0
  16. data/lib/mongodb/model/attribute_convertors.rb +54 -0
  17. data/lib/mongodb/model/callbacks.rb +36 -0
  18. data/lib/mongodb/model/crud.rb +57 -0
  19. data/lib/mongodb/model/db.rb +53 -0
  20. data/lib/mongodb/model/misc.rb +33 -0
  21. data/lib/mongodb/model/model.rb +11 -0
  22. data/lib/mongodb/model/query.rb +36 -0
  23. data/lib/mongodb/model/scope.rb +99 -0
  24. data/lib/mongodb/model/spec.rb +12 -0
  25. data/lib/mongodb/model/support/types.rb +110 -0
  26. data/lib/mongodb/model/validation.rb +5 -0
  27. data/lib/mongodb/object.rb +18 -0
  28. data/lib/mongodb/object/object_helper.rb +62 -0
  29. data/lib/mongodb/object/object_serializer.rb +273 -0
  30. data/readme.md +261 -6
  31. data/spec/driver/collection_spec.rb +83 -0
  32. data/spec/{mongo_model/hash → driver}/crud_spec.rb +30 -29
  33. data/spec/driver/database_spec.rb +9 -0
  34. data/spec/driver/dynamic_finders_spec.rb +50 -0
  35. data/spec/driver/fixes_spec.rb +12 -0
  36. data/spec/driver/hash_helper_spec.rb +24 -0
  37. data/spec/driver/spec_helper.rb +28 -0
  38. data/spec/integration/am_conversion_spec.rb +1 -0
  39. data/spec/integration/am_validation_spec.rb +34 -0
  40. data/spec/integration/validatable2_spec.rb +40 -0
  41. data/spec/migration/migration_spec.rb +60 -0
  42. data/spec/model/assignment_spec.rb +80 -0
  43. data/spec/model/attribute_convertors_spec.rb +73 -0
  44. data/spec/model/callbacks_spec.rb +47 -0
  45. data/spec/model/crud_spec.rb +151 -0
  46. data/spec/model/db_spec.rb +63 -0
  47. data/spec/model/misc_spec.rb +58 -0
  48. data/spec/model/query_spec.rb +47 -0
  49. data/spec/model/scope_spec.rb +149 -0
  50. data/spec/model/spec_helper.rb +4 -0
  51. data/spec/model/validation_spec.rb +37 -0
  52. data/spec/object/callbacks_spec.rb +97 -0
  53. data/spec/object/crud_shared.rb +53 -0
  54. data/spec/object/crud_spec.rb +55 -0
  55. data/spec/object/spec_helper.rb +14 -0
  56. data/spec/{mongo_model/object → object}/validation_spec.rb +38 -36
  57. metadata +92 -25
  58. data/lib/mongo_db.rb +0 -3
  59. data/lib/mongo_db/driver.rb +0 -5
  60. data/lib/mongo_db/driver/connection.rb +0 -0
  61. data/lib/mongo_db/driver/database.rb +0 -5
  62. data/lib/mongo_db/gems.rb +0 -2
  63. data/lib/mongo_db/model.rb +0 -0
  64. data/spec/mongo_ext/migration_spec.rb +0 -0
  65. data/spec/mongo_ext/misc_spec.rb +0 -10
  66. data/spec/mongo_ext/spec_helper.rb +0 -4
  67. data/spec/mongo_model/model/crud_spec.rb +0 -123
  68. data/spec/mongo_model/model/query_spec.rb +0 -0
  69. data/spec/mongo_model/object/callbacks_spec.rb +0 -100
  70. data/spec/mongo_model/object/crud_shared.rb +0 -53
  71. data/spec/mongo_model/object/crud_spec.rb +0 -45
  72. data/spec/mongo_model/spec_helper.rb +0 -1
  73. data/spec/query_spec.rb +0 -0
  74. data/spec/test_spec.rb +0 -5
@@ -0,0 +1,151 @@
1
+ require 'model/spec_helper'
2
+ require 'object/crud_shared'
3
+
4
+ describe "Model CRUD" do
5
+ with_mongo_model
6
+
7
+ describe 'simple' do
8
+ before :all do
9
+ class Unit
10
+ inherit Mongo::Model
11
+ collection :units
12
+
13
+ attr_accessor :name, :info
14
+ def == o; [self.class, name, info] == [o.class, o.respond_to(:name), o.respond_to(:info)] end
15
+ end
16
+ end
17
+ after(:all){remove_constants :Unit}
18
+
19
+ before do
20
+ @zeratul = Unit.build name: 'Zeratul', info: 'Dark Templar'
21
+ end
22
+
23
+ it_should_behave_like "object CRUD"
24
+
25
+ it 'model crud' do
26
+ # read
27
+ Unit.count.should == 0
28
+ Unit.all.should == []
29
+ Unit.first.should == nil
30
+
31
+ # create
32
+ @zeratul.save.should be_true
33
+ @zeratul._id.should_not be_nil
34
+
35
+ # read
36
+ Unit.count.should == 1
37
+ Unit.all.should == [@zeratul]
38
+ Unit.first.should == @zeratul
39
+ Unit.first.object_id.should_not == @zeratul.object_id
40
+
41
+ # update
42
+ @zeratul.info = 'Killer of Cerebrates'
43
+ @zeratul.save.should be_true
44
+ Unit.count.should == 1
45
+ Unit.first(name: 'Zeratul').info.should == 'Killer of Cerebrates'
46
+
47
+ # destroy
48
+ @zeratul.destroy.should be_true
49
+ Unit.count.should == 0
50
+ end
51
+
52
+ it 'should be able to save to another collection' do
53
+ # create
54
+ @zeratul.save(collection: db.heroes).should be_true
55
+ @zeratul._id.should_not be_nil
56
+
57
+ # read
58
+ Unit.count.should == 0
59
+ db.heroes.count.should == 1
60
+ db.heroes.first.should == @zeratul
61
+ db.heroes.first.object_id.should_not == @zeratul.object_id
62
+
63
+ # update
64
+ @zeratul.info = 'Killer of Cerebrates'
65
+ @zeratul.save(collection: db.heroes).should be_true
66
+ Unit.count.should == 0
67
+ db.heroes.count.should == 1
68
+ db.heroes.first(name: 'Zeratul').info.should == 'Killer of Cerebrates'
69
+
70
+ # destroy
71
+ @zeratul.destroy(collection: db.heroes).should be_true
72
+ db.heroes.count.should == 0
73
+ end
74
+
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
87
+
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
96
+ end
97
+
98
+ describe 'embedded' do
99
+ before :all do
100
+ class Player
101
+ inherit Mongo::Model
102
+ collection :players
103
+
104
+ attr_accessor :missions
105
+ def == o; [self.class, self.missions] == [o.class, o.respond_to(:missions)] end
106
+
107
+ class Mission
108
+ inherit Mongo::Model
109
+
110
+ attr_accessor :name, :stats
111
+ def == o; [self.class, self.name, self.stats] == [o.class, o.respond_to(:name), o.respond_to(:stats)] end
112
+ end
113
+ end
114
+ end
115
+ after(:all){remove_constants :Player}
116
+
117
+ before do
118
+ @mission_class = Player::Mission
119
+ @player = Player.new
120
+ @player.missions = [
121
+ Player::Mission.build(name: 'Wasteland', stats: {buildings: 5, units: 10}),
122
+ Player::Mission.build(name: 'Backwater Station', stats: {buildings: 8, units: 25}),
123
+ ]
124
+ end
125
+
126
+ it_should_behave_like 'embedded object CRUD'
127
+
128
+ it 'crud' do
129
+ # create
130
+ @player.save.should be_true
131
+ @player._id.should_not be_nil
132
+
133
+ # read
134
+ Player.count.should == 1
135
+ Player.first.should == @player
136
+ Player.first.object_id.should_not == @players.object_id
137
+
138
+ # update
139
+ @player.missions.first.stats[:units] = 9
140
+ @player.missions << Player::Mission.build(name: 'Desperate Alliance', stats: {buildings: 11, units: 40})
141
+ @player.save.should be_true
142
+ Player.count.should == 1
143
+ Player.first.should == @player
144
+ Player.first.object_id.should_not == @player.object_id
145
+
146
+ # destroy
147
+ @player.destroy.should be_true
148
+ Player.count.should == 0
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,63 @@
1
+ require 'model/spec_helper'
2
+
3
+ describe 'Collection & Database' do
4
+ with_mongo
5
+
6
+ before :all do
7
+ class TheModel
8
+ inherit Mongo::Model
9
+ end
10
+ end
11
+ after(:all){remove_constants :TheModel}
12
+
13
+ after do
14
+ TheModel.db = nil
15
+ TheModel.collection = nil
16
+ Mongo::Model.connection, Mongo::Model.db = nil, nil
17
+ end
18
+
19
+ it "global setting" do
20
+ Mongo::Model.connection = db.connection
21
+ Mongo::Model.db = db
22
+
23
+ Mongo::Model.connection.should == db.connection
24
+ Mongo::Model.db.should == db
25
+ end
26
+
27
+ it "should allow set database per model" do
28
+ Mongo::Model.connection = db.connection
29
+ Mongo::Model.db = db
30
+
31
+ TheModel.db.should == db
32
+
33
+ TheModel.db :test
34
+ TheModel.db.name.should == 'test'
35
+
36
+ TheModel.db = nil
37
+ TheModel.db db
38
+ TheModel.db.should == db
39
+
40
+ TheModel.db = nil
41
+ TheModel.db{db}
42
+ TheModel.db.should == db
43
+ end
44
+
45
+ it "should allow set collection per model" do
46
+ Mongo::Model.db = db
47
+
48
+ # TheModel.default_collection_name.should == :the_model
49
+ # TheModel.collection.name.should == 'the_model'
50
+
51
+ TheModel.collection :units
52
+ TheModel.collection.name.should == 'units'
53
+
54
+ TheModel.collection = nil
55
+ units = db.units
56
+ TheModel.collection units
57
+ TheModel.collection.should == units
58
+
59
+ TheModel.collection = nil
60
+ TheModel.collection{units}
61
+ TheModel.collection.should == units
62
+ end
63
+ end
@@ -0,0 +1,58 @@
1
+ require 'model/spec_helper'
2
+
3
+ describe 'Model Miscellaneous' do
4
+ with_mongo_model
5
+
6
+ before do
7
+ class User
8
+ inherit Mongo::Model
9
+ collection :users
10
+ end
11
+ end
12
+ after{remove_constants :Unit3, :User}
13
+
14
+ it "timestamps" do
15
+ class Unit3
16
+ inherit Mongo::Model
17
+ collection :units
18
+
19
+ attr_accessor :name
20
+
21
+ timestamps!
22
+ end
23
+
24
+ unit = Unit3.build name: 'Zeratul'
25
+ unit.save!
26
+
27
+ unit = Unit3.first
28
+ unit.created_at.should_not be_nil
29
+ unit.updated_at.should_not be_nil
30
+ created_at,updated_at = unit.created_at, unit.updated_at
31
+
32
+ unit.save!
33
+ unit.created_at.should == created_at
34
+ unit.updated_at.should > updated_at
35
+ end
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
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
58
+ end
@@ -0,0 +1,47 @@
1
+ require 'model/spec_helper'
2
+ require 'object/crud_shared'
3
+
4
+ describe "Model Query" do
5
+ with_mongo_model
6
+
7
+ before :all do
8
+ class Unit
9
+ inherit Mongo::Model
10
+ collection :units
11
+
12
+ attr_accessor :name
13
+ end
14
+ end
15
+ after(:all){remove_constants :Unit}
16
+
17
+ before{@zeratul = Unit.build name: 'Zeratul'}
18
+
19
+ it 'exist?' do
20
+ Unit.should_not exist(name: 'Zeratul')
21
+ @zeratul.save!
22
+ Unit.should exist(name: 'Zeratul')
23
+ end
24
+
25
+ it 'first, first!' do
26
+ Unit.first.should be_nil
27
+ -> {Unit.first!}.should raise_error(Mongo::NotFound)
28
+ @zeratul.save
29
+ Unit.first.should_not be_nil
30
+ Unit.first!.should_not be_nil
31
+ end
32
+
33
+ it 'all, each' do
34
+ list = []; Unit.each{|o| list << o}
35
+ list.size.should == 0
36
+
37
+ @zeratul.save
38
+ list = []; Unit.each{|o| list << o}
39
+ list.size.should == 1
40
+ end
41
+
42
+ it 'dynamic finders integration' do
43
+ Unit.first_by_name('Zeratul').should be_nil
44
+ Unit.build(name: 'Zeratul').save!
45
+ Unit.first_by_name('Zeratul').name.should == 'Zeratul'
46
+ end
47
+ end
@@ -0,0 +1,149 @@
1
+ require 'model/spec_helper'
2
+
3
+ describe "Scope" do
4
+ with_mongo_model
5
+
6
+ before do
7
+ class Unit
8
+ inherit Mongo::Model
9
+ collection :units
10
+
11
+ attr_accessor :name, :status, :race
12
+ end
13
+ end
14
+
15
+ after{remove_constants :Unit, :Protoss}
16
+
17
+ describe 'current scope' do
18
+ it "should affect finders" do
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
+
23
+ Unit.count.should == 3
24
+ Unit.all.size.should == 3
25
+ Unit.first(name: 'Tassadar').should_not be_nil
26
+ Unit.first!(name: 'Tassadar').should_not be_nil
27
+
28
+ Unit.stub!(:current_scope).and_return(status: 'alive')
29
+
30
+ Unit.count.should == 2
31
+ Unit.all.size.should == 2
32
+ Unit.first(name: 'Tassadar').should be_nil
33
+ -> {Unit.first!(name: 'Tassadar')}.should raise_error(Mongo::NotFound)
34
+
35
+ # should be merged with finders
36
+ Unit.count(status: 'dead').should == 1
37
+ Unit.all(status: 'dead').size.should == 1
38
+ Unit.first(name: 'Tassadar', status: 'dead').should_not be_nil
39
+ Unit.first!(name: 'Tassadar', status: 'dead').should_not be_nil
40
+ end
41
+ end
42
+
43
+ describe 'default scope' do
44
+ it "should not affect objects without default_scope" do
45
+ Unit.current_scope.should == {}
46
+ end
47
+
48
+ it "definition" do
49
+ Unit.default_scope status: 'alive'
50
+ Unit.current_scope.should == {status: 'alive'}
51
+
52
+ Unit.default_scope do
53
+ {status: 'alive'}
54
+ end
55
+ Unit.current_scope.should == {status: 'alive'}
56
+ end
57
+
58
+ it "should be inherited" do
59
+ Unit.default_scope status: 'alive'
60
+
61
+ class Protoss < Unit; end
62
+ Protoss.current_scope.should == {status: 'alive'}
63
+
64
+ Protoss.default_scope status: 'dead'
65
+ Unit.current_scope.should == {status: 'alive'}
66
+ Protoss.current_scope.should == {status: 'dead'}
67
+ end
68
+ end
69
+
70
+ describe 'scope' do
71
+ it "definition" do
72
+ Unit.scope :alive, status: 'alive'
73
+ Unit.alive.current_scope.should == {status: 'alive'}
74
+
75
+ Unit.scope :alive do
76
+ {status: 'alive'}
77
+ end
78
+ Unit.alive.current_scope.should == {status: 'alive'}
79
+ end
80
+
81
+ it 'scope should affect current scope' do
82
+ Unit.scope :alive, status: 'alive'
83
+
84
+ Unit.current_scope.should == {}
85
+
86
+ Unit.alive.current_scope.should == {status: 'alive'}
87
+ Unit.alive.should == Unit
88
+ end
89
+
90
+ it 'should be merged with default scope' do
91
+ Unit.default_scope race: 'Protoss'
92
+ Unit.scope :alive, status: 'alive'
93
+ Unit.alive.current_scope.should == {race: 'Protoss', status: 'alive'}
94
+ end
95
+
96
+ it 'should allow to chain scopes' do
97
+ Unit.scope :alive, status: 'alive'
98
+ Unit.scope :protosses, race: 'Protoss'
99
+ Unit.alive.protosses.current_scope.should == {race: 'Protoss', status: 'alive'}
100
+ end
101
+ end
102
+
103
+ describe 'with_scope' do
104
+ it "shouldn't allow to nest exclusive scope" do
105
+ -> {
106
+ Unit.with_exclusive_scope do
107
+ Unit.with_exclusive_scope{}
108
+ end
109
+ }.should raise_error(/exclusive scope already applied/)
110
+
111
+ -> {
112
+ Unit.with_exclusive_scope do
113
+ Unit.with_scope{}
114
+ end
115
+ }.should raise_error(/exclusive scope already applied/)
116
+ end
117
+
118
+ it "with_exclusive_scope should clear other scopes" do
119
+ Unit.default_scope status: 'alive'
120
+
121
+ Unit.with_scope race: 'Protoss' do
122
+ Unit.current_scope.should == {status: 'alive', race: 'Protoss'}
123
+
124
+ Unit.with_exclusive_scope do
125
+ Unit.current_scope.should == {}
126
+ end
127
+
128
+ Unit.with_exclusive_scope race: 'Terran' do
129
+ Unit.current_scope.should == {race: 'Terran'}
130
+ end
131
+ end
132
+ end
133
+
134
+ it "usage" do
135
+ Unit.with_scope status: 'alive' do
136
+ Unit.current_scope.should == {status: 'alive'}
137
+ end
138
+ end
139
+
140
+ it "should merge scope" do
141
+ Unit.default_scope status: 'alive'
142
+ Unit.with_scope race: 'Protoss' do
143
+ Unit.with_scope name: 'Zeratul' do
144
+ Unit.current_scope.should == {name: 'Zeratul', race: 'Protoss', status: 'alive'}
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end