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.
@@ -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
+