flazz-slipcover 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
1
+ require 'rake'
2
+ require 'spec/rake/spectask'
3
+
4
+ Spec::Rake::SpecTask.new do |t|
5
+ t.libs << 'lib'
6
+ t.libs << 'spec'
7
+ end
8
+
9
+ task :default => [:spec]
@@ -0,0 +1,4 @@
1
+ require 'slipcover/database'
2
+ require 'slipcover/document'
3
+ require 'slipcover/model'
4
+ require 'slipcover/server'
@@ -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
@@ -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
+