cooler 0.0.2 → 0.0.3
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.lock +1 -1
- data/README.md +68 -3
- data/lib/cooler/adapter.rb +18 -0
- data/lib/cooler/errors.rb +2 -2
- data/lib/cooler/model.rb +7 -5
- data/lib/cooler/version.rb +1 -1
- data/spec/cooler/model_spec.rb +9 -2
- metadata +4 -4
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -4,8 +4,73 @@
|
|
4
4
|
|
5
5
|
_The Good-Hearted Leader_
|
6
6
|
|
7
|
-
> Cooler Howard Smith has an outgoing and mellow personality and always keeps
|
8
|
-
> head up even in the most daring situations. He is smart, laid-back,
|
9
|
-
> witty, and usually optimistic even when things get serious.
|
7
|
+
> Cooler Howard Smith has an outgoing and mellow personality and always keeps
|
8
|
+
> his head up even in the most daring situations. He is smart, laid-back,
|
9
|
+
> friendly, witty, and usually optimistic even when things get serious.
|
10
10
|
|
11
11
|
A mini ORM, agnostic to key value store databases.
|
12
|
+
|
13
|
+
If you're in a hurry, and need to define some models that should be persisted,
|
14
|
+
in any Key-Value Store Database, this is the right gem.
|
15
|
+
|
16
|
+
## Installation
|
17
|
+
|
18
|
+
Add `gem 'cooler'` to your Gemfile.
|
19
|
+
|
20
|
+
## Define Adapter's set, get and delete
|
21
|
+
|
22
|
+
In an initializer, you'll need to specify how to set, get and delete a key.
|
23
|
+
Let's say that you use Redis, then you want to do something similar to:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
redis = Redis.new
|
27
|
+
|
28
|
+
Cooler::Adapater.set = ->(key, value) { redis.set(key, value.to_json) }
|
29
|
+
Cooler::Adapater.get = ->(key) do
|
30
|
+
result = Bloodhound.redis.get(key) and JSON.parse(result)
|
31
|
+
end
|
32
|
+
Cooler::Adapater.delete = ->(key) { redis.del(key) }
|
33
|
+
```
|
34
|
+
|
35
|
+
That's it.
|
36
|
+
|
37
|
+
## Define your models
|
38
|
+
|
39
|
+
Defining a model is as easy as 1, 2, 3.
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
# A model should inherit from Struct, attributes defined there are PERSISTED
|
43
|
+
# in the database.
|
44
|
+
class User < Struct.new(:login, :age, :encrypted_password, :created_at)
|
45
|
+
# You must include Cooler::Model
|
46
|
+
include Cooler::Model
|
47
|
+
|
48
|
+
# Any attribute accessor, or instance variables, are NOT STORED in the
|
49
|
+
# database, however you can initialize an object with these attributes.
|
50
|
+
attr_accessor :password
|
51
|
+
|
52
|
+
# You can set defaults for any of the attributes.
|
53
|
+
default :age, 18
|
54
|
+
default :encrypted_password,
|
55
|
+
->(user) { Digest::MD5.hexdigest(user.password) }
|
56
|
+
default :created_at, -> { Time.now.utc }
|
57
|
+
|
58
|
+
# To define the key for a Model, you need to pass a block, and return an
|
59
|
+
# String that will be the key to store the object.
|
60
|
+
key { |user| "user_#{user.login}" }
|
61
|
+
end
|
62
|
+
|
63
|
+
# You can create a new instance, passing its atributes:
|
64
|
+
user = User.new(login: 'cooler', age: 20, password: 'im_cooler')
|
65
|
+
user.save
|
66
|
+
|
67
|
+
# You can also get any stored object, passing a Hash as argument, or
|
68
|
+
# specifying the exact key.
|
69
|
+
user = User.get(login: 'cooler') # or User.get('user_cooler')
|
70
|
+
user.age = 10
|
71
|
+
user.save
|
72
|
+
```
|
73
|
+
|
74
|
+
## License
|
75
|
+
|
76
|
+
MIT
|
data/lib/cooler/adapter.rb
CHANGED
@@ -7,6 +7,9 @@ module Cooler
|
|
7
7
|
|
8
8
|
# Gets the set block.
|
9
9
|
attr_reader :set
|
10
|
+
|
11
|
+
# Gets the delete block.
|
12
|
+
attr_reader :delete
|
10
13
|
end
|
11
14
|
|
12
15
|
# Sets the block that handles getting a key.
|
@@ -48,5 +51,20 @@ module Cooler
|
|
48
51
|
raise 'Argument must be a block' unless Proc === block
|
49
52
|
@set = block
|
50
53
|
end
|
54
|
+
|
55
|
+
# Sets the block that handles deleting a key.
|
56
|
+
#
|
57
|
+
# block - The block that receives as argument the String with the key to
|
58
|
+
# delete.
|
59
|
+
#
|
60
|
+
# Examples
|
61
|
+
#
|
62
|
+
# Cooler::Adapter.delete = ->(key) { redis.del(key) }
|
63
|
+
#
|
64
|
+
# Returns nothing.
|
65
|
+
def self.delete=(block)
|
66
|
+
raise 'Argument must be a block' unless Proc === block
|
67
|
+
@delete = block
|
68
|
+
end
|
51
69
|
end
|
52
70
|
end
|
data/lib/cooler/errors.rb
CHANGED
data/lib/cooler/model.rb
CHANGED
@@ -106,11 +106,11 @@ module Cooler
|
|
106
106
|
# key - The String that contains the key to query the object.
|
107
107
|
#
|
108
108
|
# Return a Model instance.
|
109
|
-
# Raises Cooler::
|
109
|
+
# Raises Cooler::KeyNotFound if not found. Compatible with
|
110
110
|
# Sinatra::NotFound;
|
111
111
|
# http://www.sinatrarb.com/intro.html#Not%20Found
|
112
112
|
def get!(key)
|
113
|
-
get(key) || raise(Cooler::
|
113
|
+
get(key) || raise(Cooler::KeyNotFound)
|
114
114
|
end
|
115
115
|
|
116
116
|
# Initializes a new instance, and saves it at the same time.
|
@@ -162,7 +162,9 @@ module Cooler
|
|
162
162
|
#
|
163
163
|
# Returns the serialized Hash.
|
164
164
|
def serializable_hash
|
165
|
-
|
165
|
+
hash = {}
|
166
|
+
each_pair { |key, value| hash[key] = value }
|
167
|
+
hash
|
166
168
|
end
|
167
169
|
|
168
170
|
# Saves persisted attributes to the database.
|
@@ -177,9 +179,9 @@ module Cooler
|
|
177
179
|
# not able to save it.
|
178
180
|
#
|
179
181
|
# Returns nothing.
|
180
|
-
# Raises Cooler::
|
182
|
+
# Raises Cooler::InvalidObject if not able to save it.
|
181
183
|
def save!
|
182
|
-
raise Cooler::
|
184
|
+
raise Cooler::InvalidObject unless save
|
183
185
|
end
|
184
186
|
|
185
187
|
private
|
data/lib/cooler/version.rb
CHANGED
data/spec/cooler/model_spec.rb
CHANGED
@@ -102,7 +102,8 @@ describe Cooler::Model do
|
|
102
102
|
|
103
103
|
it 'should raise an exception if no results' do
|
104
104
|
mock(Cooler::Adapter).get { ->(k) { nil } }
|
105
|
-
expect { TestModel.get!('test_bacon') }.
|
105
|
+
expect { TestModel.get!('test_bacon') }.
|
106
|
+
to raise_error(Cooler::KeyNotFound)
|
106
107
|
end
|
107
108
|
end
|
108
109
|
|
@@ -140,6 +141,12 @@ describe Cooler::Model do
|
|
140
141
|
instance.serializable_hash.keys.should include(:foo)
|
141
142
|
instance.serializable_hash[:foo].should == 'bar'
|
142
143
|
end
|
144
|
+
|
145
|
+
it 'should allow an Array as a value' do
|
146
|
+
instance = TestModelUsingAttrAccessors.new(foo: [1, 2, 3, 4])
|
147
|
+
expect { instance.serializable_hash }.to_not raise_error
|
148
|
+
instance.serializable_hash[:foo].should == [1, 2, 3, 4]
|
149
|
+
end
|
143
150
|
end
|
144
151
|
|
145
152
|
context 'using attribute accessors' do
|
@@ -193,7 +200,7 @@ describe Cooler::Model do
|
|
193
200
|
describe '.save!' do
|
194
201
|
it 'should raise an exception if not saved' do
|
195
202
|
mock(instance = TestModelForSave.new).save { false }
|
196
|
-
expect { instance.save! }.to raise_error(Cooler::
|
203
|
+
expect { instance.save! }.to raise_error(Cooler::InvalidObject)
|
197
204
|
end
|
198
205
|
end
|
199
206
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cooler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -111,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
111
|
version: '0'
|
112
112
|
segments:
|
113
113
|
- 0
|
114
|
-
hash:
|
114
|
+
hash: 3227870062238590793
|
115
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
120
|
version: '0'
|
121
121
|
segments:
|
122
122
|
- 0
|
123
|
-
hash:
|
123
|
+
hash: 3227870062238590793
|
124
124
|
requirements: []
|
125
125
|
rubyforge_project:
|
126
126
|
rubygems_version: 1.8.23
|