ShyCouch 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ShyCouch}
8
- s.version = "0.4.1"
8
+ s.version = "0.4.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{Shy Inc.}, %q{Daniel Bryan}, %q{Cerales}]
12
- s.date = %q{2011-08-28}
12
+ s.date = %q{2011-09-01}
13
13
  s.description = %q{Ruby API for CouchDB, designed to work with the Camping micro-framework.}
14
14
  s.email = %q{danbryan@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -32,7 +32,6 @@ Gem::Specification.new do |s|
32
32
  "test/old-test.rb",
33
33
  "test/old-tests.rb",
34
34
  "test/test_ShyCouch.rb",
35
- "test/test_camping_integration.rb",
36
35
  "test/test_couch_document.rb",
37
36
  "test/test_couchdb_api.rb",
38
37
  "test/test_couchdb_factory.rb",
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.4.2
@@ -43,7 +43,7 @@ module ShyCouch
43
43
  init(settings)
44
44
  end
45
45
 
46
- attr_accessor :server, :name, :host, :port, :views
46
+ attr_accessor :server, :name, :host, :port, :design_documents
47
47
 
48
48
  def connect
49
49
  @server = CouchServerConnection.new({"host"=>@host, "port"=>@port, "user"=>@user, "password"=>@password})
@@ -65,12 +65,16 @@ module ShyCouch
65
65
  def create
66
66
  @server.create_db(@name)
67
67
  end
68
- def get_document(id)
69
- @server.get_document(@name, id)
68
+ def get_document_by_id(id)
69
+ @server.get_document_by_id(@name, id)
70
+ end
71
+ def get_design_document_by_id(id)
72
+ doc = @server.get_document_by_id(@name, id)
73
+ ShyCouch::Data::Design.new(id).merge! doc
70
74
  end
71
75
  def all_docs
72
- get_document('_all_docs').rows.map { |doc|
73
- get_document(doc["id"])
76
+ get_document_by_id('_all_docs').rows.map { |doc|
77
+ get_document_by_id(doc["id"])
74
78
  }
75
79
  end
76
80
  def all_docs_with(attribute, value=nil)
@@ -92,27 +96,41 @@ module ShyCouch
92
96
  end
93
97
 
94
98
  def pull_document(document)
95
- @server.push_document(self.name, document)
99
+ @server.pull_document(self.name, document)
96
100
  end
97
101
 
98
102
  def push_document(document)
99
103
  @server.push_document(self.name, document)
100
104
  end
101
105
 
102
- def designs
103
- @server.pull_all_design_docs(self.name)
106
+ def add_design_document(design)
107
+ @design_documents << design
108
+ end
109
+
110
+ def add_design_documents_and_push(*docs)
111
+ docs.each do |doc|
112
+ @design_documents << doc
113
+ end
114
+ push_design_documents
115
+ end
116
+
117
+ def push_design_documents
118
+ @design_documents.each do |design|
119
+ design.push(self)
120
+ end
104
121
  end
105
122
 
106
- def views
107
- designs.map{ |d| d["views"] }
123
+ def view(design, view_obj)
124
+ url = "#{design._id}/_view/#{view_obj.name}"
125
+ get_document_by_id(url)
108
126
  end
109
127
 
110
128
  private
111
129
 
112
- def init(settings)
130
+ def init(settings, design_documents = [])
113
131
  db_settings = settings["db"]
114
132
  @host, @port, @name, @user, @password = db_settings["host"],db_settings["port"], db_settings["name"],db_settings["user"], db_settings["password"]
115
- @views = []
133
+ @design_documents = design_documents
116
134
  @server = CouchServerConnection.allocate
117
135
  end
118
136
 
@@ -155,7 +173,7 @@ module ShyCouch
155
173
  end
156
174
 
157
175
  def pull_all_design_docs(db_name)
158
- pull_all_doc_ids(db_name).map { get_document(db_name, id) if id[0,7] == "_design" }
176
+ pull_all_doc_ids(db_name).map { get_document_by_id(db_name, id) if id[0,7] == "_design" }
159
177
  end
160
178
 
161
179
  def pull_all_doc_ids(db_name)
@@ -166,9 +184,12 @@ module ShyCouch
166
184
  pull_all_doc_ids(db_name).map { |id| Data::CouchDocument.new(get("/#{db_name}/#{id}")) }
167
185
  end
168
186
 
169
- def get_document(db_name, id)
187
+ def get_document_by_id(db_name, id)
170
188
  document = Data::CouchDocument.new(get("/#{db_name}/#{id}"))
171
189
  end
190
+ def pull_document(db_name, document)
191
+ document = Data::CouchDocument.new(get("/#{db_name}/#{document._id}"))
192
+ end
172
193
 
173
194
  def delete_document(db_name, id)
174
195
  delete("/#{db_name}/#{id}")
@@ -192,12 +213,10 @@ module ShyCouch
192
213
  #TODO - return success more meaningfully maybe?
193
214
  end
194
215
 
195
- def pull_document(db_name, document)
196
- document = Data::CouchDocument.new(get("/#{db_name}/#{id}"))
197
- end
216
+
198
217
 
199
218
  def push_document(db_name, document)
200
- raise TypeError unless document.class == Data::CouchDocument
219
+ raise TypeError unless document.kind_of?(Data::CouchDocument)
201
220
  raise JSON::GeneratorError unless document.valid?
202
221
  if document["_rev"]
203
222
  put("/#{db_name}/#{document._id}?rev=#{document._rev}/", document.to_json)
@@ -11,13 +11,14 @@ module ShyCouch
11
11
  def initialize(hash={})
12
12
  # Assumes that the "kind" is the class name unless explicitly stated otherwise
13
13
  # TODO - maybe just force it to be the class name no matter what tbh
14
- hash["kind"] = self.class.to_s unless hash["kind"]
14
+ hash["kind"] = self.class.to_s.split("::").last unless hash["kind"]
15
15
  merge!(hash)
16
16
  raise TypeError unless valid?
17
17
  # super(hash)
18
18
  end
19
19
 
20
20
  def self.all
21
+
21
22
  end
22
23
 
23
24
  def self.needs(*requirements)
@@ -56,7 +57,7 @@ module ShyCouch
56
57
  end
57
58
 
58
59
  def pull(database=nil)
59
- database = $database unless database
60
+ database ||= $couchdb
60
61
  new_doc = database.pull_document(self)
61
62
  if new_doc
62
63
  self.clear
@@ -65,10 +66,9 @@ module ShyCouch
65
66
  end
66
67
 
67
68
  def push(database = nil)
68
- # assumes $database unless it receives a database argument
69
- database = $couchdb unless database
69
+ database ||= $couchdb
70
70
  res = database.push_document(self)
71
- self["_id"] = res["id"]
71
+ self["_id"] = res["id"] unless self["_id"]
72
72
  self["_rev"] = res["rev"]
73
73
  return res
74
74
  end
@@ -96,8 +96,12 @@ module ShyCouch
96
96
 
97
97
  class View
98
98
  attr_accessor :map, :reduce, :name
99
+ JS_MAP_FUNCTION_HEADER = "function ( doc ) { \n "
100
+ JS_REDUCE_FUNCTION_HEADER = "function(key, values, rereduce) { \n "
101
+ JS_FUNCTION_FOOTER = "}"
99
102
 
100
103
  def initialize(view_name, &block)
104
+ #O TODO - oh dear this is a nightmare
101
105
  @parser = ShyRubyJS::ShySexpParser.new
102
106
  sexp_check = block.to_sexp
103
107
  sexp = block.to_sexp(:strip_enclosure=>true)
@@ -112,11 +116,11 @@ module ShyCouch
112
116
  [1,2].each { |num|
113
117
  2.times { sexp[num].delete_at(1) }
114
118
  }
115
- @map = @parser.parse(sexp[1])[0]
116
- @reduce = @parser.parse(sexp[2]) if sexp[2].length > 1
119
+ @map = JS_MAP_FUNCTION_HEADER + @parser.parse(sexp[1])[0] + JS_FUNCTION_FOOTER
120
+ @reduce = JS_REDUCE_FUNCTION_HEADER + @parser.parse(sexp[2])[0] + JS_FUNCTION_FOOTER
117
121
  elsif sexp[0] == :iter
118
122
  raise ShyCouchError, "view must be called with map block and optional reduce block" unless sexp[1][2] == :map
119
- @map = @parser.parse(sexp[3])
123
+ @map = JS_MAP_FUNCTION_HEADER + @parser.parse(sexp[3]) + JS_FUNCTION_FOOTER
120
124
  end
121
125
  end
122
126
 
@@ -126,22 +130,25 @@ module ShyCouch
126
130
  h.merge!({"reduce" => @reduce}) if @reduce
127
131
  return h
128
132
  end
133
+
134
+ def functions
135
+ return {"map" => @map, "reduce" => @reduce}
136
+ end
129
137
  end
130
138
 
131
139
  class Design < CouchDocument
132
140
  # this is used to manage design documents
133
141
  # In practise, the Controllers should be a list of classes corresponding to design documents
134
142
 
135
- def initialize(name)
143
+ def initialize(name, views=[])
136
144
  merge! "_id" => "_design/#{name.to_s}"
137
145
  @parser = ShyRubyJS::ShySexpParser.new
146
+ h = {"views" => {}}
147
+ views.each do |view|
148
+ h["views"][view.name] = view.functions
149
+ end
150
+ merge! h
138
151
  end
139
-
140
- def self.setup
141
- # setup_all_view
142
- end
143
-
144
- def push;end #must override push in order to set the ID
145
152
  end
146
153
 
147
154
  end
@@ -7,8 +7,8 @@ require_relative '../lib/ShyCouch'
7
7
  # Settings for a database that is set up and working, with an admin user
8
8
  $settings = {
9
9
  "db"=> {
10
- "host" => "ramponeau.local",
11
- # "host" => "localhost",
10
+ # "host" => "ramponeau.local",
11
+ "host" => "localhost",
12
12
  "port" => 5984,
13
13
  "name" => "test",
14
14
  "user" => "cerales",
@@ -26,8 +26,6 @@ require_relative 'test_fields'
26
26
  # test ShyCouch::Data::CouchDocument
27
27
  require_relative 'test_couch_document'
28
28
 
29
- require_relative 'test_camping_integration'
30
-
31
29
  require_relative 'test_couchdb_factory'
32
30
 
33
31
  require_relative 'test_design_documents'
@@ -98,7 +98,7 @@ class CouchDocumentTests# < Test::Unit::TestCase
98
98
  assert(doc["_id"])
99
99
  assert(doc["_rev"])
100
100
  # get the new doc
101
- newDoc = $couchdb.get_document(doc._id)
101
+ newDoc = $couchdb.pull_document(doc)
102
102
  # test equality of all the attributes aside from id and rev on the new document
103
103
  doc.attr_keys.each { |k|
104
104
  assert_equal(doc["k"], newDoc["k"])
@@ -120,7 +120,7 @@ class CouchDocumentTests# < Test::Unit::TestCase
120
120
  assert(res["ok"])
121
121
 
122
122
  # pull it from the database again
123
- checkDoc = $couchdb.get_document(doc._id)
123
+ checkDoc = $couchdb.pull_document(doc)
124
124
 
125
125
  # check that the one from the database has all the new attributes
126
126
  assert_equal(doc.owner, checkDoc.owner)
@@ -10,6 +10,6 @@ class TestCouchDBFactory < Test::Unit::TestCase
10
10
  end
11
11
 
12
12
  def test_create_database
13
- assert_kind_of(ShyCouch::CouchDBAPI, ShyCouch.create(@valid_settings))
13
+ assert_kind_of(ShyCouch::CouchDatabase, ShyCouch.create(@valid_settings))
14
14
  end
15
15
  end
@@ -2,24 +2,72 @@ require 'test/unit'
2
2
  require_relative '../lib/ShyCouch.rb'
3
3
 
4
4
  class DesignDocumentTests
5
- class TestDesignDocumentCreation < Test::Unit::TestCase
5
+ class TestDesignDocument < Test::Unit::TestCase
6
6
  Design = ShyCouch::Data::Design
7
- def setup; end
8
- def teardown; end
7
+ CouchDocument = ShyCouch::Data::CouchDocument
9
8
 
10
- class TestDesign < Design
11
- def view_cigars
12
- map do
13
-
14
- end
15
- reduce do
16
-
17
- end
9
+ class Recipe < CouchDocument
10
+
11
+ end
12
+
13
+ def setup
14
+ valid_settings = $settings
15
+ @couchdb = ShyCouch.getDB(valid_settings)
16
+ @views = setup_views
17
+ @design = nil
18
+ end
19
+ def teardown
20
+ @couchdb.delete_database
21
+ @couchdb = nil
22
+ end
23
+
24
+
25
+
26
+ def test_create_design
27
+ assert_nothing_raised {
28
+ @design = setup_design_document
29
+ }
30
+ end
31
+
32
+ def test_push_to_db
33
+ design = setup_design_document
34
+ @couchdb.add_design_documents_and_push(design)
35
+ new_doc = @couchdb.get_design_document_by_id(design._id)
36
+ assert_equal(design.as_hash, new_doc.as_hash)
37
+ end
38
+
39
+ def test_call_views
40
+ design = setup_design_document
41
+ @couchdb.add_design_documents_and_push(design)
42
+ add_some_documents
43
+ puts design.views["count_recipes"]
44
+ require 'irb'
45
+ IRB.start
46
+ end
47
+
48
+ def setup_views
49
+ view1 = ShyCouch::Data::View.new :recipes do
50
+ map do
51
+ emit(doc._id, doc.name) if doc.kind == 'Recipe'
18
52
  end
19
53
  end
20
- def test_define_design_document
21
- #todo
22
-
54
+ view2 = ShyCouch::Data::View.new :count_recipes do
55
+ map do
56
+ emit(doc._id) if doc.kind == 'Recipe'
57
+ end
58
+ reduce do
59
+ return sum(values)
60
+ end
61
+ end
62
+ return [view1, view2]
63
+ end
64
+ def setup_design_document
65
+ return ShyCouch::Data::Design.new :test_design, @views
66
+ end
67
+ def add_some_documents
68
+ 4.times do
69
+ Recipe.new.push(@couchdb)
70
+ end
23
71
  end
24
72
  end
25
73
  end
@@ -3,49 +3,51 @@ require_relative '../lib/ShyCouch.rb'
3
3
 
4
4
  class CouchViewTests < Test::Unit::TestCase
5
5
  JS_MAP_FUNCTION_HEADER = "function ( doc ) { \n "
6
- JS_REDUCE_FUNCTION_HEADER = "function(key, values, rereduce)"
6
+ JS_REDUCE_FUNCTION_HEADER = "function(key, values, rereduce) { \n "
7
7
  JS_FUNCTION_FOOTER = "}"
8
8
  def setup
9
9
  @couch_views = []
10
10
  end
11
11
 
12
12
  def view(view_name, &block)
13
+ #for convenience, and to imitate how it would be used in Camping
13
14
  @couch_views << ShyCouch::Data::View.new(view_name, &block)
14
15
  end
15
16
  def teardown; end
16
17
 
18
+ class Leg < ShyCouch::Data::CouchDocument
19
+
20
+ end
21
+
22
+ def test_query_all
23
+
24
+ end
25
+
17
26
  def test_define_map_view
18
27
  view :five_star_butts do
19
28
  map do
20
- def function(doc)
29
+ # def function(doc)
21
30
  emit(doc) if doc.kind == "butt" and doc.star_rating == 5
22
- end
31
+ # end
23
32
  end
24
33
  end
25
- expected_js = JS_MAP_FUNCTION_HEADER + %{if( doc.kind == "butt" && doc.star_rating == 5 ) {\n emit(doc)\n} \n } + JS_FUNCTION_FOOTER
34
+ expected_js = JS_MAP_FUNCTION_HEADER + %{if( doc.kind == 'butt' && doc.star_rating == 5 ) {\n emit(doc)\n}} + JS_FUNCTION_FOOTER
26
35
  assert_equal(expected_js, @couch_views[0].map)
27
- # puts @couch_views[0].map
28
36
  end
29
37
 
30
38
  def test_define_map_and_reduce_view
31
39
  view :beggar_count do
32
40
  map do
33
- def function(doc)
34
- emit(doc) if doc.kind == "beggar"
35
- end
41
+ emit(doc) if doc.kind == "beggar"
36
42
  end
37
43
  reduce do
38
- def function(key, values, rereduce)
39
- return sum(values)
40
- end
44
+ return sum(values)
41
45
  end
42
46
  end
43
- puts @couch_views[0].map
44
- puts @couch_views[0].reduce
45
- expected_map = JS_MAP_FUNCTION_HEADER + %{if( doc.kind == "beggar" ) {\n emit(doc)\n} \n } + JS_FUNCTION_FOOTER
46
- expected_rejuce = JS_REDUCE_FUNCTION_HEADER
47
+ expected_map = JS_MAP_FUNCTION_HEADER + %{if( doc.kind == 'beggar' ) {\n emit(doc)\n}} + JS_FUNCTION_FOOTER
48
+ expected_reduce = JS_REDUCE_FUNCTION_HEADER + %{return sum(values);} + JS_FUNCTION_FOOTER
47
49
  assert_equal(expected_map, @couch_views[0].map)
48
-
50
+ assert_equal(expected_reduce, @couch_views[0].reduce)
49
51
  end
50
52
 
51
53
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ShyCouch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-08-28 00:00:00.000000000Z
14
+ date: 2011-09-01 00:00:00.000000000Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: ShyRubyJS
18
- requirement: &70307013502640 !ruby/object:Gem::Requirement
18
+ requirement: &70241067513520 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: '0'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *70307013502640
26
+ version_requirements: *70241067513520
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
- requirement: &70307013500880 !ruby/object:Gem::Requirement
29
+ requirement: &70241067513040 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ~>
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: 1.0.0
35
35
  type: :development
36
36
  prerelease: false
37
- version_requirements: *70307013500880
37
+ version_requirements: *70241067513040
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: jeweler
40
- requirement: &70307013499500 !ruby/object:Gem::Requirement
40
+ requirement: &70241067512560 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ~>
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: 1.6.4
46
46
  type: :development
47
47
  prerelease: false
48
- version_requirements: *70307013499500
48
+ version_requirements: *70241067512560
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: rcov
51
- requirement: &70307013498580 !ruby/object:Gem::Requirement
51
+ requirement: &70241067512080 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ! '>='
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: '0'
57
57
  type: :development
58
58
  prerelease: false
59
- version_requirements: *70307013498580
59
+ version_requirements: *70241067512080
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: sourcify
62
- requirement: &70307013497400 !ruby/object:Gem::Requirement
62
+ requirement: &70241067511600 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ~>
@@ -67,10 +67,10 @@ dependencies:
67
67
  version: 0.5.0
68
68
  type: :development
69
69
  prerelease: false
70
- version_requirements: *70307013497400
70
+ version_requirements: *70241067511600
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: ShyRubyJS
73
- requirement: &70307013496100 !ruby/object:Gem::Requirement
73
+ requirement: &70241067511120 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ! '>='
@@ -78,10 +78,10 @@ dependencies:
78
78
  version: '0'
79
79
  type: :development
80
80
  prerelease: false
81
- version_requirements: *70307013496100
81
+ version_requirements: *70241067511120
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: ShyRubyJS
84
- requirement: &70307013494400 !ruby/object:Gem::Requirement
84
+ requirement: &70241067510640 !ruby/object:Gem::Requirement
85
85
  none: false
86
86
  requirements:
87
87
  - - ! '>='
@@ -89,10 +89,10 @@ dependencies:
89
89
  version: '0'
90
90
  type: :runtime
91
91
  prerelease: false
92
- version_requirements: *70307013494400
92
+ version_requirements: *70241067510640
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: sourcify
95
- requirement: &70307013493540 !ruby/object:Gem::Requirement
95
+ requirement: &70241067510160 !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements:
98
98
  - - ! '>='
@@ -100,7 +100,7 @@ dependencies:
100
100
  version: '0'
101
101
  type: :runtime
102
102
  prerelease: false
103
- version_requirements: *70307013493540
103
+ version_requirements: *70241067510160
104
104
  description: Ruby API for CouchDB, designed to work with the Camping micro-framework.
105
105
  email: danbryan@gmail.com
106
106
  executables: []
@@ -124,7 +124,6 @@ files:
124
124
  - test/old-test.rb
125
125
  - test/old-tests.rb
126
126
  - test/test_ShyCouch.rb
127
- - test/test_camping_integration.rb
128
127
  - test/test_couch_document.rb
129
128
  - test/test_couchdb_api.rb
130
129
  - test/test_couchdb_factory.rb
@@ -146,7 +145,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
145
  version: '0'
147
146
  segments:
148
147
  - 0
149
- hash: 2881104089150882121
148
+ hash: 4020979240365981983
150
149
  required_rubygems_version: !ruby/object:Gem::Requirement
151
150
  none: false
152
151
  requirements:
@@ -1,15 +0,0 @@
1
- require 'test/unit'
2
- require_relative '../lib/ShyCouch.rb'
3
-
4
- class CampingIntegrationTests
5
-
6
- class TestModelInheritence < Test::Unit::TestCase
7
-
8
- class InheritanceTest < ShyCouch::Data::CouchDocument; end
9
- def test_document_kind_assignment
10
- m = InheritanceTest.new
11
- assert_equal(InheritanceTest.to_s, m.kind)
12
- end
13
-
14
- end
15
- end