cushion 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/Gemfile +4 -0
  2. data/lib/cushion.rb +98 -0
  3. data/test/cushion_test.rb +37 -0
  4. metadata +81 -0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
4
+
@@ -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: []