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,9 @@
1
+ require 'driver/spec_helper'
2
+
3
+ describe "Database" do
4
+ with_mongo
5
+
6
+ it "should provide handy access to collections" do
7
+ db.some_collection.name.should == 'some_collection'
8
+ end
9
+ end
@@ -0,0 +1,50 @@
1
+ require 'driver/spec_helper'
2
+
3
+ describe "Dynamic Finders" do
4
+ with_mongo
5
+
6
+ before :all do
7
+ class FindersStub
8
+ include Mongo::DynamicFinders
9
+ end
10
+ end
11
+
12
+ after(:all){remove_constants :FindersStub}
13
+
14
+ it "parse_finder" do
15
+ [
16
+ [:first_by_name, 'Jim'], [:first, {name: 'Jim'}],
17
+ [:first_by_name!, 'Jim'], [:first!, {name: 'Jim'}],
18
+
19
+ [:all_by_name, 'Jim'], [:all, {name: 'Jim'}],
20
+
21
+ [:each_by_name, 'Jim'], [:each, {name: 'Jim'}],
22
+
23
+ [:by_name, 'Jim'], [:first, {name: 'Jim'}],
24
+ [:by_name!, 'Jim'], [:first!, {name: 'Jim'}],
25
+
26
+ [:first_by_id, 'id'], [:first, {_id: 'id'}],
27
+ [:first_by_id!, 'id'], [:first!, {_id: 'id'}],
28
+ [:by_id, 'id'], [:first, {_id: 'id'}],
29
+ [:by_id!, 'id'], [:first!, {_id: 'id'}],
30
+ ].each_slice 2 do |check, expectation|
31
+ stub = FindersStub.new
32
+ stub.should_receive(expectation.first).with(expectation.last)
33
+ stub.send check.first, check.last
34
+ end
35
+
36
+ stub = FindersStub.new
37
+ -> {stub.invalid_finder 'a', 'b'}.should raise_error(NoMethodError)
38
+ end
39
+
40
+ it "should allow to use bang version only with :first" do
41
+ stub = FindersStub.new
42
+ -> {stub.all_by_name!('Jim')}.should raise_error(/can't use bang/)
43
+ end
44
+
45
+ it 'integration with collection' do
46
+ db.units.first_by_name('Jim').should be_nil
47
+ db.units.save name: 'Jim'
48
+ db.units.first_by_name('Jim')[:name].should == 'Jim'
49
+ end
50
+ end
@@ -0,0 +1,12 @@
1
+ require 'driver/spec_helper'
2
+
3
+ describe "Driver fixes" do
4
+ with_mongo
5
+
6
+ it "should always return array if input is array" do
7
+ db.units.insert([{name: 'Zeratul'}]).class.should == Array
8
+
9
+ db.units.insert(name: 'Zeratul').class.should == BSON::ObjectId
10
+ db.units.insert([{name: 'Zeratul'}, {name: 'Tassadar'}]).class.should == Array
11
+ end
12
+ end
@@ -0,0 +1,24 @@
1
+ require 'driver/spec_helper'
2
+
3
+ describe "Collection" do
4
+ before do
5
+ @helper = Object.new
6
+ @helper.send :extend, Mongo::CollectionExt
7
+ end
8
+
9
+ it "symbolize" do
10
+ @helper.send(:symbolize_doc, {
11
+ 'a' => 1,
12
+ 'b' => {
13
+ 'c' => 2,
14
+ 'd' => [{'e' => 3}]
15
+ }
16
+ }).should == {
17
+ a: 1,
18
+ b: {
19
+ c: 2,
20
+ d: [{e: 3}]
21
+ }
22
+ }
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ require 'mongodb/driver'
2
+
3
+ Mongo.defaults.merge! \
4
+ symbolize: true,
5
+ convert_underscore_to_dollar: true,
6
+ batch_size: 50,
7
+ multi: true,
8
+ safe: true
9
+
10
+ require 'ruby_ext'
11
+ require 'rspec_ext'
12
+ require 'mongodb/driver/spec'
13
+
14
+ #
15
+ # Handy spec helpers
16
+ #
17
+ rspec do
18
+ def db
19
+ mongo.db
20
+ end
21
+ end
22
+
23
+ Object.class_eval do
24
+ def mongo_id?; false end
25
+ end
26
+ BSON::ObjectId.class_eval do
27
+ def mongo_id?; true end
28
+ end
@@ -0,0 +1 @@
1
+ # to_json, to_xml
@@ -0,0 +1,34 @@
1
+ # require 'model/spec_helper'
2
+ # require 'active_model'
3
+ #
4
+ # describe "Validations" do
5
+ # with_mongo_model
6
+ #
7
+ # before do
8
+ # class Unit
9
+ # inherit Mongo::Model
10
+ # collection :units
11
+ #
12
+ # include ActiveModel::Validations
13
+ #
14
+ # attr_accessor :name, :status
15
+ #
16
+ # validates_presence_of :name
17
+ # end
18
+ # end
19
+ #
20
+ # after{remove_constants :Unit}
21
+ #
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
28
+ #
29
+ # unit.name = 'Zeratul'
30
+ # unit.should be_valid
31
+ # unit.errors.should be_empty
32
+ # unit.save.should be_true
33
+ # end
34
+ # end
@@ -0,0 +1,40 @@
1
+ require 'model/spec_helper'
2
+ require 'validatable'
3
+
4
+ describe "Integration with validatable2" do
5
+ with_mongo_model
6
+
7
+ before do
8
+ class Unit
9
+ inherit Mongo::Model
10
+ collection :units
11
+
12
+ include Validatable
13
+
14
+ attr_accessor :name, :status
15
+
16
+ validates_presence_of :name
17
+ end
18
+ end
19
+
20
+ after{remove_constants :Unit}
21
+
22
+ it "ActiveModel integration smoke test" do
23
+ unit = Unit.new
24
+ unit.should_not be_valid
25
+ unit.errors.size.should == 1
26
+ unit.errors.first.first.should == :name
27
+ unit.save.should be_false
28
+
29
+ unit.name = 'Zeratul'
30
+ unit.should be_valid
31
+ unit.errors.should be_empty
32
+ unit.save.should be_true
33
+ end
34
+
35
+ it "should not save errors as instance variables" do
36
+ unit = Unit.new
37
+ unit.valid?
38
+ unit.instance_variables.select{|iv_name| iv_name !~ /^@_/}.should be_empty
39
+ end
40
+ end
@@ -0,0 +1,60 @@
1
+ require 'driver/spec_helper'
2
+ require 'mongodb/migration'
3
+
4
+ describe "Migration" do
5
+ with_mongo
6
+ before{@migration = Mongo::Migration.new mongo.db}
7
+
8
+ it "shouldn't update if versions are the same" do
9
+ @migration.update(0).should be_false
10
+ end
11
+
12
+ it "migration should provide access to database" do
13
+ @migration.add 1 do |m|
14
+ m.up do |db|
15
+ db.users.save name: 'Bob'
16
+ end
17
+ end
18
+ @migration.update(1).should be_true
19
+ db.users.count.should == 1
20
+ end
21
+
22
+ it "increase_db_version" do
23
+ @migration.current_version.should == 0
24
+
25
+ check = mock
26
+ @migration.add 1 do |m|
27
+ m.up{check.up}
28
+ end
29
+
30
+ check.should_receive :up
31
+ @migration.update(1).should be_true
32
+ @migration.current_version.should == 1
33
+ end
34
+
35
+ it "decrease_db_version" do
36
+ check = mock
37
+ @migration.add 1 do |m|
38
+ m.up{check.up}
39
+ m.down{check.down}
40
+ end
41
+
42
+ check.should_receive :up
43
+ @migration.update(1).should be_true
44
+
45
+ check.should_receive :down
46
+ @migration.update(0).should be_true
47
+ @migration.current_version.should == 0
48
+ end
49
+
50
+ it "should automigrate to highest version" do
51
+ @migration.add 1 do |m|
52
+ m.up{}
53
+ end
54
+ @migration.add 2 do |m|
55
+ m.up{}
56
+ end
57
+ @migration.update.should be_true
58
+ @migration.current_version.should == 2
59
+ end
60
+ end
@@ -0,0 +1,80 @@
1
+ require 'model/spec_helper'
2
+
3
+ describe 'Model callbacks' do
4
+ with_mongo
5
+
6
+ after{remove_constants :User, :Writer}
7
+
8
+ it "should update attributes" do
9
+ class User
10
+ inherit Mongo::Model
11
+
12
+ attr_accessor :name, :has_mail, :age, :banned
13
+ end
14
+
15
+ u = User.new
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
+ end
19
+
20
+ it "should update only specified attributes" do
21
+ class User
22
+ inherit Mongo::Model
23
+
24
+ attr_accessor :name, :has_mail, :age, :position, :banned
25
+
26
+ assign do
27
+ name String, true
28
+ has_mail Boolean, true
29
+ age Integer, true
30
+ position true
31
+ banned Boolean
32
+ end
33
+ end
34
+
35
+ u = User.new
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]
38
+
39
+ # should allow to forcefully cast and update any attribute
40
+ u.set! banned: '0'
41
+ u.banned.should == false
42
+ end
43
+
44
+ it "should inherit assignment rules" do
45
+ class User
46
+ inherit Mongo::Model
47
+
48
+ attr_accessor :age
49
+
50
+ assign do
51
+ age Integer, true
52
+ end
53
+ end
54
+
55
+ class Writer < User
56
+ attr_accessor :posts
57
+
58
+ assign do
59
+ posts Integer, true
60
+ end
61
+ end
62
+
63
+ u = Writer.new
64
+ u.set age: '20', posts: '12'
65
+ [u.age, u.posts].should == [20, 12]
66
+ end
67
+
68
+ it 'casting smoke test' do
69
+ [
70
+ Boolean, '1', true,
71
+ Date, '2011-08-23', Date.parse('2011-08-23'),
72
+ Float, '1.2', 1.2,
73
+ Integer, '10', 10,
74
+ String, 'Hi', 'Hi',
75
+ Time, '2011-08-23', Date.parse('2011-08-23').to_time
76
+ ].each_slice 3 do |type, raw, expected|
77
+ type.cast(raw).should == expected
78
+ end
79
+ end
80
+ 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
@@ -0,0 +1,47 @@
1
+ require 'model/spec_helper'
2
+
3
+ describe 'Model callbacks' do
4
+ with_mongo
5
+
6
+ after(:all){remove_constants :TheModel, :Player}
7
+
8
+ it "callback integration" do
9
+ class TheModel
10
+ inherit Mongo::Model
11
+ end
12
+
13
+ model = TheModel.new
14
+
15
+ model.should_receive(:run_before_callbacks).with(:save, {method: :save})
16
+ model._run_callbacks :before, :save
17
+ end
18
+
19
+ it "integration smoke test" do
20
+ class Player
21
+ inherit Mongo::Model
22
+
23
+ before_validate :before_validate_check
24
+ after_save :after_save_check
25
+
26
+ attr_accessor :missions
27
+
28
+ class Mission
29
+ inherit Mongo::Model
30
+
31
+ before_validate :before_validate_check
32
+ after_save :after_save_check
33
+ end
34
+ end
35
+
36
+ mission = Player::Mission.new
37
+ player = Player.new
38
+ player.missions = [mission]
39
+
40
+ player.should_receive(:before_validate_check).once.ordered.and_return(nil)
41
+ mission.should_receive(:before_validate_check).once.ordered.and_return(nil)
42
+ player.should_receive(:after_save_check).once.ordered.and_return(nil)
43
+ mission.should_receive(:after_save_check).once.ordered.and_return(nil)
44
+
45
+ db.units.save(player).should be_true
46
+ end
47
+ end