flazz-slipcover 0.0.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.
- 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
|
+
|