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.
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: []