couchobject 0.5.0 → 0.6.0

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 (63) hide show
  1. data/History.txt +10 -0
  2. data/Manifest.txt +30 -6
  3. data/README.txt +580 -42
  4. data/TODO +2 -2
  5. data/config/hoe.rb +1 -1
  6. data/lib/couch_object.rb +7 -2
  7. data/lib/couch_object/database.rb +19 -34
  8. data/lib/couch_object/document.rb +13 -6
  9. data/lib/couch_object/error_classes.rb +110 -0
  10. data/lib/couch_object/persistable.rb +954 -36
  11. data/lib/couch_object/persistable/has_many_relations_array.rb +91 -0
  12. data/lib/couch_object/persistable/meta_classes.rb +568 -0
  13. data/lib/couch_object/persistable/overloaded_methods.rb +209 -0
  14. data/lib/couch_object/server.rb +1 -1
  15. data/lib/couch_object/utils.rb +44 -0
  16. data/lib/couch_object/version.rb +1 -1
  17. data/lib/couch_object/view.rb +129 -6
  18. data/script/console +0 -0
  19. data/script/destroy +0 -0
  20. data/script/generate +0 -0
  21. data/script/txt2html +0 -0
  22. data/spec/database_spec.rb +23 -31
  23. data/spec/database_spec.rb.orig +173 -0
  24. data/spec/document_spec.rb +21 -3
  25. data/spec/integration/database_integration_spec.rb +46 -15
  26. data/spec/integration/integration_helper.rb +3 -3
  27. data/spec/persistable/callback.rb +44 -0
  28. data/spec/persistable/callback_spec.rb +44 -0
  29. data/spec/persistable/cloning.rb +77 -0
  30. data/spec/persistable/cloning_spec.rb +77 -0
  31. data/spec/persistable/comparing_objects.rb +350 -0
  32. data/spec/persistable/comparing_objects_spec.rb +350 -0
  33. data/spec/persistable/deleting.rb +113 -0
  34. data/spec/persistable/deleting_spec.rb +113 -0
  35. data/spec/persistable/error_messages.rb +32 -0
  36. data/spec/persistable/error_messages_spec.rb +32 -0
  37. data/spec/persistable/loading.rb +339 -0
  38. data/spec/persistable/loading_spec.rb +339 -0
  39. data/spec/persistable/new_methods.rb +70 -0
  40. data/spec/persistable/new_methods_spec.rb +70 -0
  41. data/spec/persistable/persistable_helper.rb +194 -0
  42. data/spec/persistable/relations.rb +470 -0
  43. data/spec/persistable/relations_spec.rb +470 -0
  44. data/spec/persistable/saving.rb +137 -0
  45. data/spec/persistable/saving_spec.rb +137 -0
  46. data/spec/persistable/setting_storage_location.rb +65 -0
  47. data/spec/persistable/setting_storage_location_spec.rb +65 -0
  48. data/spec/persistable/timestamps.rb +76 -0
  49. data/spec/persistable/timestamps_spec.rb +76 -0
  50. data/spec/persistable/unsaved_changes.rb +211 -0
  51. data/spec/persistable/unsaved_changes_spec.rb +211 -0
  52. data/spec/server_spec.rb +5 -5
  53. data/spec/utils_spec.rb +60 -0
  54. data/spec/view_spec.rb +40 -7
  55. data/website/index.html +22 -7
  56. data/website/index.txt +13 -5
  57. metadata +93 -61
  58. data/bin/couch_ruby_view_requestor +0 -81
  59. data/lib/couch_object/model.rb +0 -5
  60. data/lib/couch_object/proc_condition.rb +0 -14
  61. data/spec/model_spec.rb +0 -5
  62. data/spec/persistable_spec.rb +0 -91
  63. data/spec/proc_condition_spec.rb +0 -26
@@ -1,81 +0,0 @@
1
- #!/usr/bin/env ruby -wKU
2
-
3
- require 'rubygems'
4
- require 'json'
5
-
6
- # Highly experimental view requestor for CouchDb
7
- #
8
- # >> pp db.post("_temp_view", "proc{|doc| if doc['foo'] =~ /ba/; return doc;end }")
9
- # #<CouchObject::Response:0x616944
10
- # @parsed_body=
11
- # {"rows"=>
12
- # [{"_rev"=>928806717,
13
- # "_id"=>"28D568C5992CBD2B4711F57225A19517",
14
- # "value"=>
15
- # {"_id"=>"28D568C5992CBD2B4711F57225A19517",
16
- # "_rev"=>928806717,
17
- # "foo"=>"baz"}},
18
- # {"_rev"=>-1696868121,
19
- # "_id"=>"601D858DB2E298EFC4BBA92A11760D1E",
20
- # "value"=>
21
- # {"_id"=>"601D858DB2E298EFC4BBA92A11760D1E",
22
- # "_rev"=>-1696868121,
23
- # "foo"=>"bar"}},
24
- # {"_rev"=>-2093091288,
25
- # "_id"=>"CABCEB3F2C8B70B3FE24A03FF6AB7A1E",
26
- # "value"=>
27
- # {"_id"=>"CABCEB3F2C8B70B3FE24A03FF6AB7A1E",
28
- # "_rev"=>-2093091288,
29
- # "foo"=>"bar"}}],
30
- # "offset"=>0,
31
- # "total_rows"=>3,
32
- # "view"=>"_temp_view:proc{|doc| if doc['foo'] =~ /ba/; return doc;end }"},
33
- # @response=#<Net::HTTPOK 200 OK readbody=true>>
34
-
35
- $callables = []
36
-
37
- while cmd = ARGF.gets
38
- #$stderr.puts "@@@==> got: #{cmd.inspect}"
39
- cmd = JSON.parse(cmd)
40
- case cmd[0]
41
- when "reset"
42
- $callables = []
43
- puts "true"
44
- STDOUT.flush
45
- when "add_map_fun"
46
- # second arg is a string that will compile to a function
47
- callable = eval(cmd[1])
48
- if callable.respond_to?(:call)
49
- $callables << callable
50
- puts "true"
51
- else
52
- puts JSON.unparse(["error", "String must respond_to #call, eg proc{|doc| doc.title == 'foo' }"])
53
- end
54
- STDOUT.flush
55
- when "map_doc"
56
- results = []
57
- doc = cmd[1]
58
- doc.freeze
59
- $callables.each do |callable|
60
- begin
61
- result = callable.call(doc)
62
- if result.nil?
63
- results << 0 # indicate no match
64
- elsif result == 0 # not sure if this one is correct
65
- results << {"value"=>0}
66
- else
67
- results << result
68
- end
69
- rescue => e
70
- # An error mapping the document. Indicate no match.
71
- results << 0
72
- end
73
- end
74
- puts JSON.unparse(results)
75
- STDOUT.flush
76
- else
77
- puts "error"
78
- STDOUT.flush
79
- exit(1)
80
- end
81
- end
@@ -1,5 +0,0 @@
1
- module CouchObject
2
- class Model
3
-
4
- end
5
- end
@@ -1,14 +0,0 @@
1
- module CouchObject
2
- class ProcCondition
3
- def initialize(&block)
4
- unless block.arity == 1
5
- raise ArgumentError, "wrong number of arguments (#{block.arity+1} for 1)"
6
- end
7
- @block = block
8
- end
9
-
10
- def to_ruby
11
- @block.to_ruby.squeeze(" ")
12
- end
13
- end
14
- end
@@ -1,5 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- describe CouchObject::Model do
4
-
5
- end
@@ -1,91 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- class Bike
4
- include CouchObject::Persistable
5
-
6
- def initialize
7
- @wheels = 2
8
- end
9
- attr_accessor :wheels
10
-
11
- def to_couch
12
- {:wheels => @wheels}
13
- end
14
-
15
- def self.from_couch(attributes)
16
- bike = new
17
- bike.wheels = attributes["wheels"]
18
- bike
19
- end
20
- end
21
-
22
- describe CouchObject::Persistable, "when mixed into a Class" do
23
- before(:each) do
24
- @bike = Bike.new
25
- @db = mock("mock db")
26
-
27
- @empty_response = {}
28
- @ok_response = {"ok" => true}
29
- @document_response = {
30
- "_id" => "123BAC",
31
- "_rev" => "946B7D1C",
32
- "attributes" => {
33
- "wheels" => 3
34
- }
35
- }
36
- end
37
-
38
- it "should give the class a save method that saves the object" do
39
- CouchObject::Database.should_receive(:open).and_return(@db)
40
- @db.should_receive(:post).with("", @bike.to_json).and_return(@empty_response)
41
- @bike.save("foo")
42
- end
43
-
44
- it "should raise if no to_couch on class" do
45
- klass = Class.new{ include CouchObject::Persistable }
46
- proc{ klass.new.to_json }.should raise_error(CouchObject::Persistable::NoToCouchMethodError)
47
- end
48
-
49
- it "should raise if no to_couch on class" do
50
- klass = Class.new{
51
- include CouchObject::Persistable
52
- def to_couch() end
53
- }
54
- proc{ klass.get_by_id("foo", "bar") }.should raise_error(CouchObject::Persistable::NoFromCouchMethodError)
55
- end
56
-
57
- it "should return the doc id on successfull save" do
58
- CouchObject::Database.should_receive(:open).and_return(@db)
59
- @db.should_receive(:post).with("", @bike.to_json).and_return(@document_response)
60
- @bike.save("foo")["_id"].should == "123BAC"
61
- end
62
-
63
- it "should assign the returned id to itself on successful save" do
64
- CouchObject::Database.should_receive(:open).and_return(@db)
65
- @db.should_receive(:post).with("", @bike.to_json).and_return(@document_response)
66
- @bike.save("foo")
67
- @bike.id.should == "123BAC"
68
- end
69
-
70
- it "should know if itself is a new object" do
71
- CouchObject::Database.should_receive(:open).and_return(@db)
72
- @db.should_receive(:post).with("", @bike.to_json).and_return(@document_response)
73
- @bike.new?.should == true
74
- @bike.save("foo")
75
- @bike.new?.should == false
76
- end
77
-
78
- it "should get document by id" do
79
- CouchObject::Database.should_receive(:open).and_return(@db)
80
- @db.should_receive(:get).with("123BAC").and_return(@document_response)
81
- Bike.get_by_id("foo", "123BAC")
82
- end
83
-
84
- it "should instantiate a new object based on their #to_couch" do
85
- CouchObject::Database.should_receive(:open).and_return(@db)
86
- @db.should_receive(:get).with("123BAC").and_return(@document_response)
87
- bike = Bike.get_by_id("foo", "123BAC")
88
- bike.class.should == Bike
89
- bike.wheels.should == 3
90
- end
91
- end
@@ -1,26 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- describe CouchObject::ProcCondition do
4
-
5
- it "should accept a block only" do
6
- proc{
7
- CouchObject::ProcCondition.new do |x|
8
- x
9
- end
10
- }.should_not raise_error
11
- end
12
-
13
- it "should require a block argument" do
14
- proc{
15
- CouchObject::ProcCondition.new do
16
- "bar"
17
- end
18
- }.should raise_error(ArgumentError)
19
- end
20
-
21
- it "should convert itself to ruby" do
22
- CouchObject::ProcCondition.new do |x|
23
- x
24
- end.to_ruby.should == "proc { |x|\n x\n}"
25
- end
26
- end