mongodb 0.0.1 → 0.0.2

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.
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,4 @@
1
+ require 'mongodb/model'
2
+
3
+ require 'object/spec_helper'
4
+ require 'mongodb/model/spec'
@@ -0,0 +1,37 @@
1
+ require 'model/spec_helper'
2
+
3
+ describe "Validations" do
4
+ with_mongo_model
5
+
6
+ before do
7
+ class Unit
8
+ inherit Mongo::Model
9
+ collection :units
10
+
11
+ attr_accessor :errors
12
+
13
+ attr_accessor :name
14
+ end
15
+ end
16
+ after{remove_constants :Unit}
17
+
18
+ it "should not save model with errors" do
19
+ unit = Unit.build name: 'Zeratul'
20
+ unit.save.should be_true
21
+
22
+ unit.errors = []
23
+ unit.save.should be_true
24
+
25
+ unit.errors = ['hairy error']
26
+ unit.save.should be_false
27
+
28
+ unit.errors = {name: 'hairy error'}
29
+ unit.save.should be_false
30
+ end
31
+
32
+ it "should check :errors only and ignore valid? method" do
33
+ unit = Unit.build name: 'Zeratul'
34
+ unit.should_not_receive(:valid?)
35
+ unit.save.should be_true
36
+ end
37
+ end
@@ -0,0 +1,97 @@
1
+ require 'object/spec_helper'
2
+
3
+ describe 'Object callbacks' do
4
+ with_mongo
5
+
6
+ before :all do
7
+ class Player
8
+ include RSpec::CallbackHelper
9
+ attr_accessor :missions
10
+
11
+ class Mission
12
+ include RSpec::CallbackHelper
13
+ end
14
+ end
15
+ end
16
+ after(:all){remove_constants :Player}
17
+
18
+ before do
19
+ @mission = Player::Mission.new
20
+ @player = Player.new
21
+ @player.missions = [@mission]
22
+ end
23
+
24
+ it 'create' do
25
+ %w(before_validate before_save before_create after_create after_save after_validate).each do |name|
26
+ @player.should_receive(name).once.ordered
27
+ @mission.should_receive(name).once.ordered
28
+ end
29
+
30
+ db.players.save @player
31
+ end
32
+
33
+ it 'update' do
34
+ db.players.save(@player)
35
+
36
+ %w(before_validate before_save before_update after_update after_save after_validate).each do |name|
37
+ @player.should_receive(name).once.ordered
38
+ @mission.should_receive(name).once.ordered
39
+ end
40
+ db.players.save @player
41
+ end
42
+
43
+ it 'destroy' do
44
+ db.players.save @player
45
+
46
+ %w(before_validate before_destroy after_destroy after_validate).each do |name|
47
+ @player.should_receive(name).once.ordered
48
+ @mission.should_receive(name).once.ordered
49
+ end
50
+ db.players.destroy @player
51
+ end
52
+
53
+ it 'should be able skip callbacks' do
54
+ @player.should_not_receive(:_run_callbacks)
55
+ @mission.should_not_receive(:_run_callbacks)
56
+
57
+ db.players.save @player, callbacks: false
58
+ db.players.count.should == 1
59
+ db.players.save @player, callbacks: false
60
+ db.players.count.should == 1
61
+ db.players.destroy @player, callbacks: false
62
+ db.players.count.should == 0
63
+ end
64
+
65
+ it 'should be able interrupt CRUD' do
66
+ @mission.stub! :_run_callbacks do |type, method_name|
67
+ false if type == :before and method_name == :save
68
+ end
69
+ db.players.save(@player).should be_false
70
+ db.players.count.should == 0
71
+ end
72
+
73
+ describe "embedded" do
74
+ it 'should fire :destroy on detached objects' do
75
+ db.players.save @player
76
+ @player.missions.clear
77
+ @mission.should_receive(:before_destroy).once
78
+ db.players.destroy @player
79
+ end
80
+
81
+ it 'should fire :destroy on deleted objects in update' do
82
+ db.players.save @player
83
+ @player.missions.clear
84
+ @mission.should_receive(:before_destroy).once
85
+ db.players.save @player
86
+ end
87
+
88
+ it 'should fire :create on new objects in update' do
89
+ db.players.save @player
90
+ mission2 = Player::Mission.new
91
+ @player.missions << mission2
92
+ mission2.should_receive(:before_create).once
93
+ mission2.should_not_receive(:before_update)
94
+ db.players.save @player
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,53 @@
1
+ shared_examples_for 'object CRUD' do
2
+ it 'crud' do
3
+ # read
4
+ db.units.count.should == 0
5
+ db.units.all.should == []
6
+ db.units.first.should == nil
7
+
8
+ # create
9
+ db.units.save(@zeratul).should be_true
10
+ @zeratul.instance_variable_get(:@_id).should_not be_nil
11
+
12
+ # read
13
+ db.units.count.should == 1
14
+ db.units.all.should == [@zeratul]
15
+ db.units.first.should == @zeratul
16
+ db.units.first.object_id.should_not == @zeratul.object_id
17
+
18
+ # update
19
+ @zeratul.info = 'Killer of Cerebrates'
20
+ db.units.save(@zeratul).should be_true
21
+ db.units.count.should == 1
22
+ db.units.first(name: 'Zeratul').info.should == 'Killer of Cerebrates'
23
+
24
+ # destroy
25
+ db.units.destroy(@zeratul).should be_true
26
+ db.units.count.should == 0
27
+ end
28
+ end
29
+
30
+ shared_examples_for 'embedded object CRUD' do
31
+ it 'crud' do
32
+ # create
33
+ db.players.save(@player)
34
+ @player.instance_variable_get(:@_id).should_not be_nil
35
+
36
+ # read
37
+ db.players.count.should == 1
38
+ db.players.first.should == @player
39
+ db.players.first.object_id.should_not == @players.object_id
40
+
41
+ # update
42
+ @player.missions.first.stats[:units] = 9
43
+ @player.missions << @mission_class.new('Desperate Alliance', {buildings: 11, units: 40})
44
+ db.players.save @player
45
+ db.players.count.should == 1
46
+ db.players.first.should == @player
47
+ db.players.first.object_id.should_not == @player.object_id
48
+
49
+ # destroy
50
+ db.players.destroy @player
51
+ db.players.count.should == 0
52
+ end
53
+ end
@@ -0,0 +1,55 @@
1
+ require 'object/spec_helper'
2
+ require 'object/crud_shared'
3
+
4
+ describe "Object CRUD" do
5
+ with_mongo
6
+
7
+ describe 'simple' do
8
+ before :all do
9
+ class Unit2
10
+ def initialize name = nil, info = nil; @name, @info = name, info end
11
+ attr_accessor :name, :info
12
+ def == o; [self.class, name, info] == [o.class, o.respond_to(:name), o.respond_to(:info)] end
13
+ end
14
+ end
15
+ after(:all){remove_constants :Unit2}
16
+
17
+ before do
18
+ @zeratul = Unit2.new 'Zeratul', 'Dark Templar'
19
+ end
20
+
21
+ it_should_behave_like "object CRUD"
22
+
23
+ it "should allow to read object as hash" do
24
+ db.units.save! @zeratul
25
+ db.units.first({}, object: false).class.should == Hash
26
+ end
27
+ end
28
+
29
+ describe 'embedded' do
30
+ before :all do
31
+ class Player2
32
+ attr_accessor :missions
33
+ def == o; [self.class, self.missions] == [o.class, o.respond_to(:missions)] end
34
+
35
+ class Mission
36
+ def initialize name = nil, stats = nil; @name, @stats = name, stats end
37
+ attr_accessor :name, :stats
38
+ def == o; [self.class, self.name, self.stats] == [o.class, o.respond_to(:name), o.respond_to(:stats)] end
39
+ end
40
+ end
41
+ end
42
+ after(:all){remove_constants :Player2}
43
+
44
+ before do
45
+ @mission_class = Player2::Mission
46
+ @player = Player2.new
47
+ @player.missions = [
48
+ Player2::Mission.new('Wasteland', {buildings: 5, units: 10}),
49
+ Player2::Mission.new('Backwater Station', {buildings: 8, units: 25}),
50
+ ]
51
+ end
52
+
53
+ it_should_behave_like 'embedded object CRUD'
54
+ end
55
+ end
@@ -0,0 +1,14 @@
1
+ require 'mongodb/object'
2
+ require 'driver/spec_helper'
3
+
4
+ # RSpec adds some instance variables and we need to skip it.
5
+ Mongo::ObjectSerializer.send :const_set, :SKIP_IV_REGEXP, /^@_|^@mock_proxy/
6
+ Mongo::ObjectSerializer::SIMPLE_TYPES << RSpec::Mocks::Proxy
7
+
8
+ # To simplify callback expectations
9
+ module RSpec::CallbackHelper
10
+ def _run_callbacks type, method_name
11
+ callback_method_name = :"#{type}_#{method_name}"
12
+ send callback_method_name if respond_to? callback_method_name
13
+ end
14
+ end
@@ -1,74 +1,76 @@
1
- require 'spec_helper'
1
+ require 'object/spec_helper'
2
2
 
3
3
  describe 'Object validation' do
4
- with_mongo_model
5
-
6
- before do
4
+ with_mongo
5
+
6
+ before :all do
7
7
  class Player
8
8
  attr_accessor :missions
9
-
9
+
10
10
  class Mission
11
- end
11
+ end
12
12
  end
13
-
13
+ end
14
+ after(:all){remove_constants :Player}
15
+
16
+ before do
14
17
  @mission = Player::Mission.new
15
18
  @player = Player.new
16
19
  @player.missions = [@mission]
17
20
  end
18
- after{remove_constants :Player}
19
21
 
20
22
  it 'should not save/update/destroy invalid objects' do
21
23
  # create
22
- @player.stub!(:valid?).and_return(false)
24
+ @player.stub!(:_valid?).and_return(false)
23
25
  db.players.save(@player).should be_false
24
-
25
- @player.stub!(:valid?).and_return(true)
26
+
27
+ @player.stub!(:_valid?).and_return(true)
26
28
  db.players.save(@player).should be_true
27
-
29
+
28
30
  # update
29
- @player.stub!(:valid?).and_return(false)
31
+ @player.stub!(:_valid?).and_return(false)
30
32
  db.players.save(@player).should be_false
31
-
32
- @player.stub!(:valid?).and_return(true)
33
+
34
+ @player.stub!(:_valid?).and_return(true)
33
35
  db.players.save(@player).should be_true
34
-
36
+
35
37
  # destroy
36
- @player.stub!(:valid?).and_return(false)
38
+ @player.stub!(:_valid?).and_return(false)
37
39
  db.players.destroy(@player).should be_false
38
-
39
- @player.stub!(:valid?).and_return(true)
40
+
41
+ @player.stub!(:_valid?).and_return(true)
40
42
  db.players.destroy(@player).should be_true
41
43
  end
42
-
44
+
43
45
  it 'should not save/update/destroy invalid embedded objects' do
44
46
  # create
45
- @mission.stub!(:valid?).and_return(false)
47
+ @mission.stub!(:_valid?).and_return(false)
46
48
  db.players.save(@player).should be_false
47
-
48
- @mission.stub!(:valid?).and_return(true)
49
+
50
+ @mission.stub!(:_valid?).and_return(true)
49
51
  db.players.save(@player).should be_true
50
-
52
+
51
53
  # update
52
- @mission.stub!(:valid?).and_return(false)
54
+ @mission.stub!(:_valid?).and_return(false)
53
55
  db.players.save(@player).should be_false
54
-
55
- @mission.stub!(:valid?).and_return(true)
56
+
57
+ @mission.stub!(:_valid?).and_return(true)
56
58
  db.players.save(@player).should be_true
57
-
59
+
58
60
  # destroy
59
- @mission.stub!(:valid?).and_return(false)
61
+ @mission.stub!(:_valid?).and_return(false)
60
62
  db.players.destroy(@player).should be_false
61
-
62
- @mission.stub!(:valid?).and_return(true)
63
+
64
+ @mission.stub!(:_valid?).and_return(true)
63
65
  db.players.destroy(@player).should be_true
64
66
  end
65
-
67
+
66
68
  it "should be able skip validation" do
67
- @player.stub!(:valid?).and_return(false)
69
+ @player.stub!(:_valid?).and_return(false)
68
70
  db.players.save(@player, validate: false).should be_true
69
-
70
- @player.stub!(:valid?).and_return(true)
71
- @mission.stub!(:valid?).and_return(false)
71
+
72
+ @player.stub!(:_valid?).and_return(true)
73
+ @mission.stub!(:_valid?).and_return(false)
72
74
  db.players.save(@player, validate: false).should be_true
73
75
  end
74
76
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongodb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,41 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-12 00:00:00.000000000Z
13
- dependencies: []
12
+ date: 2011-08-28 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mongo
16
+ requirement: &2783590 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2783590
25
+ - !ruby/object:Gem::Dependency
26
+ name: i18n
27
+ requirement: &2783300 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0.5'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2783300
36
+ - !ruby/object:Gem::Dependency
37
+ name: ruby_ext
38
+ requirement: &2783060 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2783060
14
47
  description:
15
48
  email:
16
49
  executables: []
@@ -19,27 +52,61 @@ extra_rdoc_files: []
19
52
  files:
20
53
  - Rakefile
21
54
  - readme.md
22
- - lib/mongo_db/driver/connection.rb
23
- - lib/mongo_db/driver/database.rb
24
- - lib/mongo_db/driver/spec.rb
25
- - lib/mongo_db/driver.rb
26
- - lib/mongo_db/gems.rb
27
- - lib/mongo_db/model.rb
28
- - lib/mongo_db.rb
29
- - spec/mongo_ext/migration_spec.rb
30
- - spec/mongo_ext/misc_spec.rb
31
- - spec/mongo_ext/spec_helper.rb
32
- - spec/mongo_model/hash/crud_spec.rb
33
- - spec/mongo_model/model/crud_spec.rb
34
- - spec/mongo_model/model/query_spec.rb
35
- - spec/mongo_model/object/callbacks_spec.rb
36
- - spec/mongo_model/object/crud_shared.rb
37
- - spec/mongo_model/object/crud_spec.rb
38
- - spec/mongo_model/object/validation_spec.rb
39
- - spec/mongo_model/spec_helper.rb
40
- - spec/query_spec.rb
41
- - spec/test_spec.rb
42
- homepage: http://github.com/alexeypetrushin/mongo_db
55
+ - lib/mongodb/driver/collection.rb
56
+ - lib/mongodb/driver/database.rb
57
+ - lib/mongodb/driver/dynamic_finders.rb
58
+ - lib/mongodb/driver/spec.rb
59
+ - lib/mongodb/driver.rb
60
+ - lib/mongodb/gems.rb
61
+ - lib/mongodb/integration/locales/activemodel/ru.yml
62
+ - lib/mongodb/integration/locales.rb
63
+ - lib/mongodb/migration/definition.rb
64
+ - lib/mongodb/migration/migration.rb
65
+ - lib/mongodb/migration/tasks.rb
66
+ - lib/mongodb/migration.rb
67
+ - lib/mongodb/model/assignment.rb
68
+ - lib/mongodb/model/attribute_convertors.rb
69
+ - lib/mongodb/model/callbacks.rb
70
+ - lib/mongodb/model/crud.rb
71
+ - lib/mongodb/model/db.rb
72
+ - lib/mongodb/model/misc.rb
73
+ - lib/mongodb/model/model.rb
74
+ - lib/mongodb/model/query.rb
75
+ - lib/mongodb/model/scope.rb
76
+ - lib/mongodb/model/spec.rb
77
+ - lib/mongodb/model/support/types.rb
78
+ - lib/mongodb/model/validation.rb
79
+ - lib/mongodb/model.rb
80
+ - lib/mongodb/object/object_helper.rb
81
+ - lib/mongodb/object/object_serializer.rb
82
+ - lib/mongodb/object.rb
83
+ - spec/driver/collection_spec.rb
84
+ - spec/driver/crud_spec.rb
85
+ - spec/driver/database_spec.rb
86
+ - spec/driver/dynamic_finders_spec.rb
87
+ - spec/driver/fixes_spec.rb
88
+ - spec/driver/hash_helper_spec.rb
89
+ - spec/driver/spec_helper.rb
90
+ - spec/integration/am_conversion_spec.rb
91
+ - spec/integration/am_validation_spec.rb
92
+ - spec/integration/validatable2_spec.rb
93
+ - spec/migration/migration_spec.rb
94
+ - spec/model/assignment_spec.rb
95
+ - spec/model/attribute_convertors_spec.rb
96
+ - spec/model/callbacks_spec.rb
97
+ - spec/model/crud_spec.rb
98
+ - spec/model/db_spec.rb
99
+ - spec/model/misc_spec.rb
100
+ - spec/model/query_spec.rb
101
+ - spec/model/scope_spec.rb
102
+ - spec/model/spec_helper.rb
103
+ - spec/model/validation_spec.rb
104
+ - spec/object/callbacks_spec.rb
105
+ - spec/object/crud_shared.rb
106
+ - spec/object/crud_spec.rb
107
+ - spec/object/spec_helper.rb
108
+ - spec/object/validation_spec.rb
109
+ homepage: http://github.com/alexeypetrushin/mongodb
43
110
  licenses: []
44
111
  post_install_message:
45
112
  rdoc_options: []
@@ -62,5 +129,5 @@ rubyforge_project:
62
129
  rubygems_version: 1.8.6
63
130
  signing_key:
64
131
  specification_version: 3
65
- summary: MongDB ODM. In development, don't use it, come back at 11/8/25
132
+ summary: Object Model & Ruby driver enhancements for MongoDB
66
133
  test_files: []