couchobject 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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