ShyCouch 0.4.1 → 0.4.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.
@@ -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