cushion 0.0.1
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/Gemfile +4 -0
- data/lib/cushion.rb +98 -0
- data/test/cushion_test.rb +37 -0
- metadata +81 -0
data/Gemfile
ADDED
data/lib/cushion.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler/setup'
|
5
|
+
Bundler.require
|
6
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
7
|
+
require 'active_support/core_ext/string/inflections'
|
8
|
+
require 'active_support/core_ext/object'
|
9
|
+
require 'cushion/version'
|
10
|
+
|
11
|
+
class Cushion < HashWithIndifferentAccess
|
12
|
+
def initialize(*args, &block)
|
13
|
+
if args[0].is_a?(String)
|
14
|
+
uri = args.shift
|
15
|
+
end
|
16
|
+
if uri.nil?
|
17
|
+
if self.class.ancestors.include?(Cushion)
|
18
|
+
uri = '/' << self.class.name.underscore.pluralize
|
19
|
+
else
|
20
|
+
raise "No database URI given"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
document_uri uri
|
24
|
+
data = args.shift
|
25
|
+
super(data, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def document_uri uri = nil
|
29
|
+
return @document_uri unless uri
|
30
|
+
uri =~ /(http:\/\/)?(\w+)?:?([0-9]+)?\/(\w+)(\/(\w+))?/
|
31
|
+
|
32
|
+
@document_uri = { host: $2 || 'localhost',
|
33
|
+
port: $3 || 5984 }
|
34
|
+
|
35
|
+
@document_uri[:database] = $4
|
36
|
+
@id = $6
|
37
|
+
@document_uri[:uri] = "/#{@document_uri[:database]}/#{@id}" if @id
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_database
|
41
|
+
database_uri = "/#{document_uri[:database]}"
|
42
|
+
put(database_uri) unless get(database_uri)['db_name']
|
43
|
+
@database_created = true
|
44
|
+
end
|
45
|
+
|
46
|
+
def revision
|
47
|
+
@revision
|
48
|
+
end
|
49
|
+
|
50
|
+
def id
|
51
|
+
@id
|
52
|
+
end
|
53
|
+
|
54
|
+
def load
|
55
|
+
replace(get)
|
56
|
+
end
|
57
|
+
|
58
|
+
def save
|
59
|
+
create_database unless @database_created
|
60
|
+
if @id.present?
|
61
|
+
response = put(document_uri[:uri], self)
|
62
|
+
@revision = response['rev']
|
63
|
+
else
|
64
|
+
response = post('/' << document_uri[:database], self)
|
65
|
+
puts response.inspect
|
66
|
+
@id = response['id']
|
67
|
+
@revision = response['rev']
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def get uri = document_uri[:uri]
|
72
|
+
JSON.parse(request(Net::HTTP::Get.new(uri)).body)
|
73
|
+
end
|
74
|
+
|
75
|
+
def put uri = document_uri[:uri], data = nil
|
76
|
+
req = Net::HTTP::Put.new(uri)
|
77
|
+
req["content-type"] = "application/json"
|
78
|
+
req.body = data.to_json if data.present?
|
79
|
+
JSON.parse(request(req).body)
|
80
|
+
end
|
81
|
+
|
82
|
+
def post uri = document_uri[:uri], data = nil
|
83
|
+
req = Net::HTTP::Post.new(uri)
|
84
|
+
req["content-type"] = "application/json"
|
85
|
+
req.body = data.to_json if data.present?
|
86
|
+
JSON.parse(request(req).body)
|
87
|
+
end
|
88
|
+
|
89
|
+
def delete uri = document_uri[:uri]
|
90
|
+
JSON.parse(request(Net::HTTP::Delete.new(uri)).body)
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def request(req)
|
96
|
+
Net::HTTP.start(document_uri[:host], document_uri[:port]) { |http| http.request(req) }
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.require(:default, :test)
|
4
|
+
require_relative '../lib/cushion'
|
5
|
+
|
6
|
+
class CushionTest < Test::Unit::TestCase
|
7
|
+
context "Cushion" do
|
8
|
+
setup do
|
9
|
+
Net::HTTP.new("localhost", 5984).delete "/test_db"
|
10
|
+
@doc_uri = "/test_db/test_doc"
|
11
|
+
@doc = Cushion.new(@doc_uri, { foo: "bar", test: "data" })
|
12
|
+
end
|
13
|
+
|
14
|
+
should "create a document" do
|
15
|
+
@doc.save
|
16
|
+
doc = Cushion.new(@doc_uri)
|
17
|
+
doc.load
|
18
|
+
assert_equal "bar", doc[:foo]
|
19
|
+
end
|
20
|
+
|
21
|
+
should "convert to JSON like a hash" do
|
22
|
+
assert_equal '{"foo":"bar","test":"data"}', @doc.to_json
|
23
|
+
end
|
24
|
+
|
25
|
+
should "find the important parts in the given uri" do
|
26
|
+
@doc.document_uri "/foo"
|
27
|
+
assert_equal "foo", @doc.document_uri[:database]
|
28
|
+
end
|
29
|
+
|
30
|
+
should "take the database name from the class name when inherited" do
|
31
|
+
foo = FooCushion.new
|
32
|
+
assert_equal "foo_cushions", foo.document_uri[:database]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class FooCushion < Cushion; end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cushion
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Helge Rausch
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-09-29 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: test-unit
|
16
|
+
requirement: &11686520 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *11686520
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: shoulda
|
27
|
+
requirement: &11686060 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *11686060
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: active_support
|
38
|
+
requirement: &11685600 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *11685600
|
47
|
+
description: A Hash with indifferent access and CouchDB persistence layer
|
48
|
+
email:
|
49
|
+
- helge@rausch.io
|
50
|
+
executables: []
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- Gemfile
|
55
|
+
- lib/cushion.rb
|
56
|
+
- test/cushion_test.rb
|
57
|
+
homepage: https://github.com/tsujigiri/cushion
|
58
|
+
licenses: []
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
requirements: []
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.8.6
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: A Hash with CouchDB persistence
|
81
|
+
test_files: []
|