flazz-slipcover 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +9 -0
- data/lib/slipcover.rb +4 -0
- data/lib/slipcover/database.rb +33 -0
- data/lib/slipcover/document.rb +46 -0
- data/lib/slipcover/model.rb +92 -0
- data/lib/slipcover/rest.rb +51 -0
- data/lib/slipcover/server.rb +23 -0
- data/slipcover.gemspec +13 -0
- metadata +68 -0
data/Rakefile
ADDED
data/lib/slipcover.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module CouchDB
|
2
|
+
|
3
|
+
# Database resource
|
4
|
+
class Database
|
5
|
+
|
6
|
+
attr_reader :server, :name
|
7
|
+
|
8
|
+
def initialize(server, name)
|
9
|
+
@server = server
|
10
|
+
@name = name
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
@server.put "/#{@name}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete
|
18
|
+
@server.delete "/#{@name}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def documents
|
22
|
+
response = @server.get "/#{@name}/_all_docs"
|
23
|
+
JSON.parse(response.body).map { |id| Document.new self, id }
|
24
|
+
end
|
25
|
+
|
26
|
+
def info
|
27
|
+
response = @server.get "/#{@name}"
|
28
|
+
JSON.parse(response.body)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module CouchDB
|
2
|
+
|
3
|
+
class Document
|
4
|
+
attr_reader :id, :rev, :data
|
5
|
+
attr_writer :id, :rev, :data
|
6
|
+
|
7
|
+
def initialize(database, id=nil, rev=nil)
|
8
|
+
@database = database
|
9
|
+
@id = id
|
10
|
+
@rev = rev
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def get
|
15
|
+
response = @database.server.get "/#{@database.name}/#{@id}"
|
16
|
+
rson = JSON.parse(response.body)
|
17
|
+
@id = rson["_id"]
|
18
|
+
@rev = rson["_rev"]
|
19
|
+
response
|
20
|
+
end
|
21
|
+
|
22
|
+
def post(json)
|
23
|
+
response = @database.server.post "/#{@database.name}", json
|
24
|
+
rson = JSON.parse(response.body)
|
25
|
+
@id = rson["id"]
|
26
|
+
@rev = rson["rev"]
|
27
|
+
response
|
28
|
+
end
|
29
|
+
|
30
|
+
def put(json)
|
31
|
+
rson = JSON.parse json
|
32
|
+
rson["_rev"] = @rev
|
33
|
+
json = JSON.generate rson
|
34
|
+
response = @database.server.put "/#{@database.name}/#{@id}", json
|
35
|
+
rson = JSON.parse(response.body)
|
36
|
+
@rev = rson["rev"]
|
37
|
+
response
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete
|
41
|
+
@database.server.delete "/#{@database.name}/#{@id}?rev=#{@rev}"
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module CouchDB
|
4
|
+
|
5
|
+
# CRUD-like model for MVC
|
6
|
+
class Model
|
7
|
+
attr_reader :id, :rev
|
8
|
+
attr_writer :id
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@document = Document.new @@database
|
12
|
+
end
|
13
|
+
|
14
|
+
# Create a document
|
15
|
+
def create
|
16
|
+
|
17
|
+
# post data to the server
|
18
|
+
response = @document.post compile_json
|
19
|
+
|
20
|
+
# parse the output & store the rev
|
21
|
+
data = JSON.parse response.body
|
22
|
+
@rev = data["rev"]
|
23
|
+
|
24
|
+
# store the id and rev
|
25
|
+
@id = data["id"]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Read a document
|
29
|
+
def read
|
30
|
+
|
31
|
+
# require @id
|
32
|
+
raise "id is required" unless @id
|
33
|
+
@document.id = @id
|
34
|
+
|
35
|
+
# get the data
|
36
|
+
response = @document.get
|
37
|
+
|
38
|
+
# parse the output & store the rev
|
39
|
+
data = JSON.parse response.body
|
40
|
+
@rev = data["_rev"]
|
41
|
+
|
42
|
+
# store only property values
|
43
|
+
@@properties.each do |name|
|
44
|
+
instance_variable_set "@#{name}".intern, data[name.id2name]
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
# Update a document
|
50
|
+
def update
|
51
|
+
# put the properties
|
52
|
+
response = @document.put compile_json
|
53
|
+
|
54
|
+
# parse the output & store the rev
|
55
|
+
data = JSON.parse response.body
|
56
|
+
@rev = data["rev"]
|
57
|
+
end
|
58
|
+
|
59
|
+
# Destroy a document
|
60
|
+
def destroy
|
61
|
+
|
62
|
+
# require @id
|
63
|
+
raise "id is required" unless @id
|
64
|
+
@document.id = @id
|
65
|
+
|
66
|
+
# require the revision
|
67
|
+
raise 'rev is required to delete' unless @rev
|
68
|
+
@document.rev = @rev
|
69
|
+
|
70
|
+
# delete it
|
71
|
+
response = @document.delete
|
72
|
+
|
73
|
+
# parse the output & store the rev
|
74
|
+
data = JSON.parse response.body
|
75
|
+
@rev = data["rev"]
|
76
|
+
end
|
77
|
+
|
78
|
+
protected
|
79
|
+
|
80
|
+
# make a document based on the properties
|
81
|
+
def compile_json
|
82
|
+
data = @@properties.inject({}) do |acc, p|
|
83
|
+
h = { p.id2name => instance_variable_get("@#{p.id2name}".intern) }
|
84
|
+
acc.merge h
|
85
|
+
end
|
86
|
+
|
87
|
+
JSON.generate data
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
module CouchDB
|
4
|
+
|
5
|
+
# requires the existence of @host and @port
|
6
|
+
module RESTfulResource
|
7
|
+
|
8
|
+
# Delete a resource
|
9
|
+
def delete(uri)
|
10
|
+
request Net::HTTP::Delete.new(uri)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Get a resource
|
14
|
+
def get(uri)
|
15
|
+
request Net::HTTP::Get.new(uri)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Put a document
|
19
|
+
def put(uri, body=nil, content_type="application/json")
|
20
|
+
req = Net::HTTP::Put.new uri
|
21
|
+
req["content-type"] = content_type
|
22
|
+
req.body = body
|
23
|
+
request req
|
24
|
+
end
|
25
|
+
|
26
|
+
# Post a document to a uri
|
27
|
+
def post(uri, body, content_type="application/json")
|
28
|
+
req = Net::HTTP::Post.new uri
|
29
|
+
req["content-type"] = content_type
|
30
|
+
req.body = body
|
31
|
+
request req
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
def request(req)
|
37
|
+
|
38
|
+
res = Net::HTTP.start(@host, @port) do |http|
|
39
|
+
http.request req
|
40
|
+
end
|
41
|
+
|
42
|
+
unless res.kind_of? Net::HTTPSuccess
|
43
|
+
raise "#{res.code}:#{res.message}\nMETHOD:#{req.method}\nURI:#{req.path}\n#{res.body}"
|
44
|
+
end
|
45
|
+
|
46
|
+
res
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'slipcover/rest'
|
3
|
+
|
4
|
+
module CouchDB
|
5
|
+
|
6
|
+
# Server resource
|
7
|
+
class Server
|
8
|
+
|
9
|
+
include CouchDB::RESTfulResource
|
10
|
+
|
11
|
+
def initialize(host="localhost", port=5984)
|
12
|
+
@host = host
|
13
|
+
@port = port
|
14
|
+
end
|
15
|
+
|
16
|
+
def databases
|
17
|
+
response = get "/_all_dbs"
|
18
|
+
JSON.parse(response.body).map { |name| Database.new self, name }
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/slipcover.gemspec
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = "slipcover"
|
3
|
+
spec.version = '0.0.0'
|
4
|
+
spec.summary = "Simple Layer over CouchDB"
|
5
|
+
spec.email = "flazzarino@gmail.com"
|
6
|
+
spec.homepage = "http://github.com/flazz/couchdb"
|
7
|
+
spec.authors = ["Francesco (franco) Lazzarino"]
|
8
|
+
spec.files = ["Rakefile", "slipcover.gemspec",
|
9
|
+
"lib/slipcover/database.rb", "lib/slipcover/document.rb",
|
10
|
+
"lib/slipcover/model.rb", "lib/slipcover/rest.rb",
|
11
|
+
"lib/slipcover/server.rb", "lib/slipcover.rb"]
|
12
|
+
spec.add_dependency("json", ">= 1.1.3")
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: flazz-slipcover
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Francesco (franco) Lazzarino
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-12-22 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: json
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.1.3
|
23
|
+
version:
|
24
|
+
description:
|
25
|
+
email: flazzarino@gmail.com
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files: []
|
31
|
+
|
32
|
+
files:
|
33
|
+
- Rakefile
|
34
|
+
- slipcover.gemspec
|
35
|
+
- lib/slipcover/database.rb
|
36
|
+
- lib/slipcover/document.rb
|
37
|
+
- lib/slipcover/model.rb
|
38
|
+
- lib/slipcover/rest.rb
|
39
|
+
- lib/slipcover/server.rb
|
40
|
+
- lib/slipcover.rb
|
41
|
+
has_rdoc: false
|
42
|
+
homepage: http://github.com/flazz/couchdb
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: "0"
|
53
|
+
version:
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: "0"
|
59
|
+
version:
|
60
|
+
requirements: []
|
61
|
+
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 1.2.0
|
64
|
+
signing_key:
|
65
|
+
specification_version: 2
|
66
|
+
summary: Simple Layer over CouchDB
|
67
|
+
test_files: []
|
68
|
+
|