couch_potato 0.2.12

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 (52) hide show
  1. data/CHANGES.md +15 -0
  2. data/MIT-LICENSE.txt +19 -0
  3. data/README.md +295 -0
  4. data/VERSION.yml +4 -0
  5. data/init.rb +3 -0
  6. data/lib/core_ext/date.rb +10 -0
  7. data/lib/core_ext/object.rb +5 -0
  8. data/lib/core_ext/string.rb +19 -0
  9. data/lib/core_ext/symbol.rb +15 -0
  10. data/lib/core_ext/time.rb +11 -0
  11. data/lib/couch_potato.rb +40 -0
  12. data/lib/couch_potato/database.rb +106 -0
  13. data/lib/couch_potato/persistence.rb +98 -0
  14. data/lib/couch_potato/persistence/attachments.rb +31 -0
  15. data/lib/couch_potato/persistence/callbacks.rb +60 -0
  16. data/lib/couch_potato/persistence/dirty_attributes.rb +49 -0
  17. data/lib/couch_potato/persistence/ghost_attributes.rb +22 -0
  18. data/lib/couch_potato/persistence/json.rb +46 -0
  19. data/lib/couch_potato/persistence/magic_timestamps.rb +13 -0
  20. data/lib/couch_potato/persistence/properties.rb +52 -0
  21. data/lib/couch_potato/persistence/simple_property.rb +83 -0
  22. data/lib/couch_potato/persistence/validation.rb +18 -0
  23. data/lib/couch_potato/view/base_view_spec.rb +24 -0
  24. data/lib/couch_potato/view/custom_view_spec.rb +27 -0
  25. data/lib/couch_potato/view/custom_views.rb +44 -0
  26. data/lib/couch_potato/view/model_view_spec.rb +63 -0
  27. data/lib/couch_potato/view/properties_view_spec.rb +39 -0
  28. data/lib/couch_potato/view/raw_view_spec.rb +25 -0
  29. data/lib/couch_potato/view/view_query.rb +44 -0
  30. data/rails/init.rb +7 -0
  31. data/spec/attachments_spec.rb +23 -0
  32. data/spec/callbacks_spec.rb +271 -0
  33. data/spec/create_spec.rb +22 -0
  34. data/spec/custom_view_spec.rb +149 -0
  35. data/spec/default_property_spec.rb +34 -0
  36. data/spec/destroy_spec.rb +29 -0
  37. data/spec/fixtures/address.rb +9 -0
  38. data/spec/fixtures/person.rb +6 -0
  39. data/spec/property_spec.rb +101 -0
  40. data/spec/spec.opts +4 -0
  41. data/spec/spec_helper.rb +29 -0
  42. data/spec/unit/attributes_spec.rb +48 -0
  43. data/spec/unit/callbacks_spec.rb +33 -0
  44. data/spec/unit/couch_potato_spec.rb +20 -0
  45. data/spec/unit/create_spec.rb +58 -0
  46. data/spec/unit/customs_views_spec.rb +15 -0
  47. data/spec/unit/database_spec.rb +50 -0
  48. data/spec/unit/dirty_attributes_spec.rb +131 -0
  49. data/spec/unit/string_spec.rb +13 -0
  50. data/spec/unit/view_query_spec.rb +9 -0
  51. data/spec/update_spec.rb +40 -0
  52. metadata +153 -0
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ class Tree
4
+ include CouchPotato::Persistence
5
+ before_validation :water!
6
+ before_validation lambda {|tree| tree.root_count += 1 }
7
+
8
+ property :leaf_count
9
+ property :root_count
10
+
11
+ def water!
12
+ self.leaf_count += 1
13
+ end
14
+ end
15
+
16
+
17
+ describe 'before_validation callback' do
18
+ before :each do
19
+ @tree = Tree.new(:leaf_count => 1, :root_count => 1)
20
+ end
21
+
22
+ it "should call water! when validated" do
23
+ @tree.leaf_count.should == 1
24
+ @tree.should be_valid
25
+ @tree.leaf_count.should == 2
26
+ end
27
+
28
+ it "should call lambda when validated" do
29
+ @tree.root_count.should == 1
30
+ @tree.should be_valid
31
+ @tree.root_count.should == 2
32
+ end
33
+ end
@@ -0,0 +1,20 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe CouchPotato, 'full_url_to_database' do
4
+ before(:each) do
5
+ @original_database_name = CouchPotato::Config.database_name
6
+ end
7
+ after(:each) do
8
+ CouchPotato::Config.database_name = @original_database_name
9
+ end
10
+
11
+ it "should add the default localhost and port if only a name is set" do
12
+ CouchPotato::Config.database_name = 'test'
13
+ CouchPotato.full_url_to_database.should == 'http://127.0.0.1:5984/test'
14
+ end
15
+
16
+ it "should return the set url" do
17
+ CouchPotato::Config.database_name = 'http://db.local/test'
18
+ CouchPotato.full_url_to_database.should == 'http://db.local/test'
19
+ end
20
+ end
@@ -0,0 +1,58 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "create" do
4
+
5
+ describe "succeeds" do
6
+ before(:each) do
7
+ @comment = Comment.new :title => 'my_title'
8
+ CouchPotato::Database.new(stub('database', :save_doc => {'rev' => '123', 'id' => '456'}, :info => nil)).save_document!(@comment)
9
+ end
10
+
11
+ it "should assign the id" do
12
+ @comment._id.should == '456'
13
+ end
14
+
15
+ it "should assign the revision" do
16
+ @comment._rev.should == '123'
17
+ end
18
+
19
+ it "should set created at" do
20
+ @comment.created_at.should >= Time.now - 10
21
+ end
22
+
23
+ it "should set updated at" do
24
+ @comment.updated_at.should >= Time.now - 10
25
+ end
26
+ end
27
+
28
+ describe "fails" do
29
+ before(:each) do
30
+ @comment = Comment.new
31
+ CouchPotato::Database.new(stub('database', :info => nil)).save_document(@comment)
32
+ end
33
+
34
+ it "should not assign an id" do
35
+ @comment._id.should be_nil
36
+ end
37
+
38
+ it "should not assign a revision" do
39
+ @comment._rev.should be_nil
40
+ end
41
+
42
+ it "should not set created at" do
43
+ @comment.created_at.should be_nil
44
+ end
45
+
46
+ it "should set updated at" do
47
+ @comment.updated_at.should be_nil
48
+ end
49
+
50
+ describe "with bank" do
51
+ it "should raise an exception" do
52
+ lambda {
53
+ @comment.save!
54
+ }.should raise_error
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe CouchPotato::View::CustomViews do
4
+
5
+ class MyViewSpec; end
6
+ class ModelWithView
7
+ include CouchPotato::Persistence
8
+ view :all, :type => MyViewSpec
9
+ end
10
+
11
+ it "should use a custom viewspec class" do
12
+ MyViewSpec.should_receive(:new)
13
+ ModelWithView.all
14
+ end
15
+ end
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ class DbTestUser
4
+ end
5
+
6
+ # namespaced model
7
+ module Parent
8
+ class Child
9
+ include CouchPotato::Persistence
10
+ end
11
+ end
12
+
13
+ describe CouchPotato::Database, 'new' do
14
+ it "should raise an exception if the database doesn't exist" do
15
+ lambda {
16
+ CouchPotato::Database.new CouchRest.database('couch_potato_invalid')
17
+ }.should raise_error('Database \'couch_potato_invalid\' does not exist.')
18
+ end
19
+ end
20
+
21
+ describe CouchPotato::Database, 'load' do
22
+ it "should raise an exception if nil given" do
23
+ db = CouchPotato::Database.new(stub('couchrest db', :info => nil))
24
+ lambda {
25
+ db.load nil
26
+ }.should raise_error("Can't load a document without an id (got nil)")
27
+ end
28
+
29
+ it "should set itself on the model" do
30
+ user = mock 'user'
31
+ DbTestUser.stub!(:new).and_return(user)
32
+ db = CouchPotato::Database.new(stub('couchrest db', :info => nil, :get => {'ruby_class' => 'DbTestUser'}))
33
+ user.should_receive(:database=).with(db)
34
+ db.load '1'
35
+ end
36
+
37
+ it "should load namespaced models" do
38
+ db = CouchPotato::Database.new(stub('couchrest db', :info => nil, :get => {'ruby_class' => 'Parent::Child'}))
39
+ db.load('1').class.should == Parent::Child
40
+ end
41
+ end
42
+
43
+ describe CouchPotato::Database, 'save_document' do
44
+ it "should set itself on the model for a new object before doing anything else" do
45
+ db = CouchPotato::Database.new(stub('couchrest db', :info => nil))
46
+ user = stub('user', :new? => true, :valid? => false).as_null_object
47
+ user.should_receive(:database=).with(db)
48
+ db.save_document user
49
+ end
50
+ end
@@ -0,0 +1,131 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ class Plate
4
+ include CouchPotato::Persistence
5
+
6
+ property :food
7
+ end
8
+
9
+ describe 'dirty attribute tracking' do
10
+ before(:each) do
11
+ @couchrest_db = stub('database', :save_doc => {'id' => '1', 'rev' => '2'}, :info => nil)
12
+ @db = CouchPotato::Database.new(@couchrest_db)
13
+ end
14
+
15
+ describe "save" do
16
+ it "should not save when nothing dirty" do
17
+ plate = Plate.new :food => 'sushi'
18
+ @db.save_document!(plate)
19
+ @couchrest_db.should_not_receive(:save_doc)
20
+ @db.save_document(plate)
21
+ end
22
+
23
+ it "should return true when not dirty" do
24
+ plate = Plate.new :food => 'sushi'
25
+ @db.save_document!(plate)
26
+ @db.save_document(plate).should be_true
27
+ end
28
+
29
+ it "should save when there are dirty attributes" do
30
+ plate = Plate.new :food => 'sushi'
31
+ @db.save_document!(plate)
32
+ plate.food = 'burger'
33
+ @couchrest_db.should_receive(:save_doc)
34
+ @db.save_document(plate)
35
+ end
36
+
37
+ it "should correctly track dirty hashes (deep clone)" do
38
+ plate = Plate.new :food => {:veggies => ['carrots', 'peas']}
39
+ @db.save_document(plate)
40
+ plate.food[:veggies] << 'beans'
41
+ @couchrest_db.should_receive(:save_doc)
42
+ @db.save_document(plate)
43
+ end
44
+
45
+ it "should correctly track dirty hashes (deep clone) after a save" do
46
+ plate = Plate.new :food => {:veggies => ['carrots', 'peas']}
47
+ @db.save_document(plate)
48
+ plate.food[:veggies] << 'beans'
49
+ @db.save_document(plate)
50
+ plate.food[:veggies] << 'cauliflower'
51
+ @couchrest_db.should_receive(:save_doc)
52
+ @db.save_document(plate)
53
+ end
54
+ end
55
+
56
+ describe "newly created object" do
57
+
58
+ before(:each) do
59
+ @plate = Plate.new :food => 'sushi'
60
+ end
61
+
62
+ describe "access old values" do
63
+ it "should return the old value" do
64
+ @plate.food = 'burger'
65
+ @plate.food_was.should == 'sushi'
66
+ end
67
+ end
68
+
69
+ describe "check for dirty" do
70
+ it "should return true if attribute changed" do
71
+ @plate.food = 'burger'
72
+ @plate.should be_food_changed
73
+ end
74
+
75
+ it "should return false if attribute not changed" do
76
+ @plate.should_not be_food_changed
77
+ end
78
+
79
+ it "should return false if attribute forced not changed" do
80
+ @plate.food = 'burger'
81
+ @plate.food_not_changed
82
+ @plate.should_not be_food_changed
83
+ end
84
+ end
85
+ end
86
+
87
+ describe "object loaded from database" do
88
+ before(:each) do
89
+ couchrest_db = stub('database', :get => {'_id' => '1', '_rev' => '2', 'food' => 'sushi', 'ruby_class' => 'Plate'}, :info => nil)
90
+ @plate = CouchPotato::Database.new(couchrest_db).load_document '1'
91
+ end
92
+
93
+ describe "access old values" do
94
+ it "should return the old value" do
95
+ @plate.food = 'burger'
96
+ @plate.food_was.should == 'sushi'
97
+ end
98
+ end
99
+
100
+ describe "check for dirty" do
101
+ it "should return true if attribute changed" do
102
+ @plate.food = 'burger'
103
+ @plate.should be_food_changed
104
+ end
105
+
106
+ it "should return true if array attribute changed" do
107
+ couchrest_db = stub('database', :get => {'_id' => '1', '_rev' => '2', 'food' => ['sushi'], 'ruby_class' => 'Plate'}, :info => nil)
108
+ plate = CouchPotato::Database.new(couchrest_db).load_document '1'
109
+ plate.food << 'burger'
110
+ plate.should be_food_changed
111
+ end
112
+
113
+ it "should return false if attribute not changed" do
114
+ @plate.should_not be_food_changed
115
+ end
116
+ end
117
+ end
118
+
119
+
120
+ describe "after save" do
121
+ it "should reset all attributes to not dirty" do
122
+ couchrest_db = stub('database', :get => {'_id' => '1', '_rev' => '2', 'food' => 'sushi', 'ruby_class' => 'Plate'}, :info => nil, :save_doc => {})
123
+ db = CouchPotato::Database.new(couchrest_db)
124
+ @plate = db.load_document '1'
125
+ @plate.food = 'burger'
126
+ db.save! @plate
127
+ @plate.should_not be_food_changed
128
+ end
129
+ end
130
+
131
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe String, 'camelize' do
4
+ it "should camelize a string" do
5
+ 'my_string'.camelize.should == 'MyString'
6
+ end
7
+ end
8
+
9
+ describe String, 'underscore' do
10
+ it "should underscore a string" do
11
+ 'MyString'.underscore.should == 'my_string'
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe CouchPotato::View::ViewQuery, 'query_view' do
4
+ it "should not pass a key if conditions are empty" do
5
+ db = mock 'db'
6
+ db.should_receive(:view).with(anything, {})
7
+ CouchPotato::View::ViewQuery.new(db, '', '', '', '').query_view!
8
+ end
9
+ end
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "create" do
4
+ before(:all) do
5
+ recreate_db
6
+ end
7
+
8
+ before(:each) do
9
+ @comment = Comment.new :title => 'my_title'
10
+ CouchPotato.database.save_document! @comment
11
+ end
12
+
13
+ it "should update the revision" do
14
+ old_rev = @comment._rev
15
+ @comment.title = 'xyz'
16
+ CouchPotato.database.save_document! @comment
17
+ @comment._rev.should_not == old_rev
18
+ @comment._rev.should_not be_nil
19
+ end
20
+
21
+ it "should not update created at" do
22
+ old_created_at = @comment.created_at
23
+ @comment.title = 'xyz'
24
+ CouchPotato.database.save_document! @comment
25
+ @comment.created_at.should == old_created_at
26
+ end
27
+
28
+ it "should update updated at" do
29
+ old_updated_at = @comment.updated_at
30
+ @comment.title = 'xyz'
31
+ CouchPotato.database.save_document! @comment
32
+ @comment.updated_at.should > old_updated_at
33
+ end
34
+
35
+ it "should update the attributes" do
36
+ @comment.title = 'new title'
37
+ CouchPotato.database.save_document! @comment
38
+ CouchPotato.couchrest_database.get("#{@comment.id}")['title'].should == 'new title'
39
+ end
40
+ end
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: couch_potato
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.12
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Lang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-09-20 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: validatable
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: couchrest
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0.24"
44
+ version:
45
+ description: Ruby persistence layer for CouchDB
46
+ email: alex@upstream-berlin.com
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - README.md
53
+ files:
54
+ - CHANGES.md
55
+ - MIT-LICENSE.txt
56
+ - README.md
57
+ - VERSION.yml
58
+ - init.rb
59
+ - lib/core_ext/date.rb
60
+ - lib/core_ext/object.rb
61
+ - lib/core_ext/string.rb
62
+ - lib/core_ext/symbol.rb
63
+ - lib/core_ext/time.rb
64
+ - lib/couch_potato.rb
65
+ - lib/couch_potato/database.rb
66
+ - lib/couch_potato/persistence.rb
67
+ - lib/couch_potato/persistence/attachments.rb
68
+ - lib/couch_potato/persistence/callbacks.rb
69
+ - lib/couch_potato/persistence/dirty_attributes.rb
70
+ - lib/couch_potato/persistence/ghost_attributes.rb
71
+ - lib/couch_potato/persistence/json.rb
72
+ - lib/couch_potato/persistence/magic_timestamps.rb
73
+ - lib/couch_potato/persistence/properties.rb
74
+ - lib/couch_potato/persistence/simple_property.rb
75
+ - lib/couch_potato/persistence/validation.rb
76
+ - lib/couch_potato/view/base_view_spec.rb
77
+ - lib/couch_potato/view/custom_view_spec.rb
78
+ - lib/couch_potato/view/custom_views.rb
79
+ - lib/couch_potato/view/model_view_spec.rb
80
+ - lib/couch_potato/view/properties_view_spec.rb
81
+ - lib/couch_potato/view/raw_view_spec.rb
82
+ - lib/couch_potato/view/view_query.rb
83
+ - rails/init.rb
84
+ - spec/attachments_spec.rb
85
+ - spec/callbacks_spec.rb
86
+ - spec/create_spec.rb
87
+ - spec/custom_view_spec.rb
88
+ - spec/default_property_spec.rb
89
+ - spec/destroy_spec.rb
90
+ - spec/fixtures/address.rb
91
+ - spec/fixtures/person.rb
92
+ - spec/property_spec.rb
93
+ - spec/spec.opts
94
+ - spec/spec_helper.rb
95
+ - spec/unit/attributes_spec.rb
96
+ - spec/unit/callbacks_spec.rb
97
+ - spec/unit/couch_potato_spec.rb
98
+ - spec/unit/create_spec.rb
99
+ - spec/unit/customs_views_spec.rb
100
+ - spec/unit/database_spec.rb
101
+ - spec/unit/dirty_attributes_spec.rb
102
+ - spec/unit/string_spec.rb
103
+ - spec/unit/view_query_spec.rb
104
+ - spec/update_spec.rb
105
+ has_rdoc: true
106
+ homepage: http://github.com/langalex/couch_potato
107
+ licenses: []
108
+
109
+ post_install_message:
110
+ rdoc_options:
111
+ - --charset=UTF-8
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: "0"
119
+ version:
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: "0"
125
+ version:
126
+ requirements: []
127
+
128
+ rubyforge_project:
129
+ rubygems_version: 1.3.5
130
+ signing_key:
131
+ specification_version: 3
132
+ summary: Ruby persistence layer for CouchDB
133
+ test_files:
134
+ - spec/attachments_spec.rb
135
+ - spec/callbacks_spec.rb
136
+ - spec/create_spec.rb
137
+ - spec/custom_view_spec.rb
138
+ - spec/default_property_spec.rb
139
+ - spec/destroy_spec.rb
140
+ - spec/fixtures/address.rb
141
+ - spec/fixtures/person.rb
142
+ - spec/property_spec.rb
143
+ - spec/spec_helper.rb
144
+ - spec/unit/attributes_spec.rb
145
+ - spec/unit/callbacks_spec.rb
146
+ - spec/unit/couch_potato_spec.rb
147
+ - spec/unit/create_spec.rb
148
+ - spec/unit/customs_views_spec.rb
149
+ - spec/unit/database_spec.rb
150
+ - spec/unit/dirty_attributes_spec.rb
151
+ - spec/unit/string_spec.rb
152
+ - spec/unit/view_query_spec.rb
153
+ - spec/update_spec.rb