redis_storage 0.2.9 → 0.3.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.
- data/.rbenv-version +1 -0
- data/.travis.yml +10 -0
- data/Gemfile +4 -7
- data/Guardfile +9 -0
- data/lib/generators/templates/model.rb +1 -4
- data/lib/redis_storage/version.rb +1 -1
- data/lib/redis_storage.rb +40 -15
- data/{README → readme.md} +9 -20
- data/redis_storage.gemspec +5 -3
- data/spec/generator_spec.rb +26 -0
- data/spec/model_spec.rb +3 -8
- data/spec/spec_helper.rb +7 -5
- metadata +55 -24
- data/.rvmrc +0 -10
- data/test/generator_test.rb +0 -35
data/.rbenv-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3-p125
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -3,11 +3,8 @@ source "http://rubygems.org"
|
|
3
3
|
# Specify your gem's dependencies in redis_record.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
group :development do
|
7
|
-
|
8
|
-
gem '
|
9
|
-
gem '
|
10
|
-
gem 'awesome_print'
|
11
|
-
gem 'bond'
|
12
|
-
gem 'sketches'
|
6
|
+
group :development, :test do
|
7
|
+
gem 'guard-rspec'
|
8
|
+
gem 'pry'
|
9
|
+
gem 'pry-nav'
|
13
10
|
end
|
data/Guardfile
ADDED
@@ -1,6 +1,3 @@
|
|
1
1
|
class <%= class_name %> < RedisStorage::Model
|
2
|
-
|
3
|
-
[ :id<%=", :" unless attrs.empty?%><%= attrs.map{|e| e.split(':')[0]}.join(', :') %> ]
|
4
|
-
end
|
5
|
-
attr_accessor *attrs
|
2
|
+
attribute <%= ':' unless attrs.empty? %><%= attrs.map{|e| e.split(':')[0]}.join(', :') %>
|
6
3
|
end
|
data/lib/redis_storage.rb
CHANGED
@@ -8,25 +8,35 @@ module RedisStorage
|
|
8
8
|
include ActiveModel::Validations
|
9
9
|
include ActiveModel::Conversion
|
10
10
|
extend ActiveModel::Naming
|
11
|
-
|
12
11
|
validates_presence_of :id
|
13
|
-
|
14
|
-
def self.attrs
|
15
|
-
[]
|
16
|
-
end
|
17
|
-
|
18
|
-
attr_accessor *attrs
|
19
12
|
attr_accessor :id
|
20
13
|
attr_reader :errors
|
21
14
|
|
22
|
-
|
23
|
-
|
15
|
+
@@_attributes = Hash.new { |hash, key| hash[key] = [] }
|
16
|
+
@@_indizies = Hash.new { |hash, key| hash[key] = [] }
|
17
|
+
|
18
|
+
def self.attribute *attr
|
19
|
+
attr.each do |name|
|
20
|
+
define_method(name) do
|
21
|
+
@_attributes[name]
|
22
|
+
end
|
23
|
+
define_method(:"#{name}=") do |v|
|
24
|
+
@_attributes[name] = v
|
25
|
+
end
|
26
|
+
attributes << name unless attributes.include? name
|
27
|
+
end
|
24
28
|
end
|
25
|
-
def self.
|
29
|
+
def self.index *attr
|
30
|
+
attr.each do |name|
|
31
|
+
indizies << name unless indizies.include? name
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.build params
|
26
36
|
new params
|
27
37
|
end
|
28
38
|
|
29
|
-
def self.create
|
39
|
+
def self.create params
|
30
40
|
obj = build params
|
31
41
|
obj.save
|
32
42
|
obj
|
@@ -46,7 +56,7 @@ module RedisStorage
|
|
46
56
|
def self.find_by(key, value)
|
47
57
|
if key == :id
|
48
58
|
load "#{db_key}:#{value}"
|
49
|
-
elsif
|
59
|
+
elsif indizies.include? key
|
50
60
|
load($db.get("#{db_key}:#{key}:#{value.hash}"))
|
51
61
|
else
|
52
62
|
nil
|
@@ -75,7 +85,7 @@ module RedisStorage
|
|
75
85
|
load $db.smembers(persisted_key).sort_by{|s| s.split(':')[1].to_i}.last
|
76
86
|
end
|
77
87
|
def serializable_hash
|
78
|
-
|
88
|
+
attributes.inject({:id => @id}) do |a,key|
|
79
89
|
a[key] = send(key)
|
80
90
|
a
|
81
91
|
end
|
@@ -99,7 +109,7 @@ module RedisStorage
|
|
99
109
|
$db.multi do
|
100
110
|
$db.set db_key, to_json
|
101
111
|
$db.sadd self.class.persisted_key, db_key
|
102
|
-
|
112
|
+
indizies.each do |key|
|
103
113
|
$db.set "#{self.class.db_key}:#{key}:#{send(key).hash}", db_key
|
104
114
|
end
|
105
115
|
end
|
@@ -117,7 +127,7 @@ module RedisStorage
|
|
117
127
|
$db.multi do
|
118
128
|
$db.del db_key
|
119
129
|
$db.srem self.class.persisted_key, db_key
|
120
|
-
|
130
|
+
indizies.each do |key|
|
121
131
|
$db.del "#{self.class.db_key}:#{key}:#{send(key).hash}"
|
122
132
|
end
|
123
133
|
end
|
@@ -146,6 +156,8 @@ module RedisStorage
|
|
146
156
|
end
|
147
157
|
|
148
158
|
def initialize(params={})
|
159
|
+
@_attributes = {}
|
160
|
+
@_indizies = {}
|
149
161
|
@id = nil
|
150
162
|
@errors = ActiveModel::Errors.new(self)
|
151
163
|
params.each do |key, value|
|
@@ -161,5 +173,18 @@ module RedisStorage
|
|
161
173
|
def self.next_id_key
|
162
174
|
"#{db_key}:next_id"
|
163
175
|
end
|
176
|
+
def self.attributes
|
177
|
+
@@_attributes[self]
|
178
|
+
end
|
179
|
+
def self.indizies
|
180
|
+
@@_indizies[self]
|
181
|
+
end
|
182
|
+
def attributes
|
183
|
+
self.class.attributes
|
184
|
+
end
|
185
|
+
def indizies
|
186
|
+
self.class.indizies
|
187
|
+
end
|
188
|
+
|
164
189
|
end
|
165
190
|
end
|
data/{README → readme.md}
RENAMED
@@ -6,6 +6,8 @@ This is a little gem which provides a redis interface for models. It works out o
|
|
6
6
|
Basically I just got sick rewriting the same logic over and over again for each model of my little sinatra apps so this evolved. Then I wanted to write a new rails app an thought having this in a gem would be really nice, and a generator would be awesome.
|
7
7
|
Now I will add new Feature as I need them. You also can let me know what to add.
|
8
8
|
|
9
|
+
[](http://travis-ci.org/sch1zo/redis_storage)
|
10
|
+
|
9
11
|
Features
|
10
12
|
---
|
11
13
|
|
@@ -63,20 +65,14 @@ create a model which inherit from RedisStorage::Model
|
|
63
65
|
|
64
66
|
and define the models attributes via self.attrs, additional to the defined attributes there will always be an attribute id
|
65
67
|
|
66
|
-
|
67
|
-
[:body, :title]
|
68
|
-
end
|
69
|
-
attr_accessor *attrs
|
68
|
+
attribute :body, :title
|
70
69
|
|
71
70
|
Minimal Example
|
72
71
|
---
|
73
72
|
|
74
73
|
require 'redis_storage'
|
75
74
|
class MyModel < RedisStorage::Model
|
76
|
-
|
77
|
-
[:body, :title]
|
78
|
-
end
|
79
|
-
attr_accessor *attrs
|
75
|
+
attribute :body, :title
|
80
76
|
end
|
81
77
|
|
82
78
|
Indexing and find_by
|
@@ -84,9 +80,7 @@ Indexing and find_by
|
|
84
80
|
|
85
81
|
If you want or need to find records based on a attribute you have to add it to the index_for array like this.
|
86
82
|
|
87
|
-
|
88
|
-
[:some, :attributes, :to, :index]
|
89
|
-
end
|
83
|
+
index :some, :attributes, :to, :index
|
90
84
|
|
91
85
|
The elements should be symbols and have to also be element of attrs.
|
92
86
|
After that you can use the following to get the the instance.
|
@@ -115,15 +109,10 @@ or
|
|
115
109
|
meta
|
116
110
|
---
|
117
111
|
|
118
|
-
Tested with RSpec
|
119
|
-
* ree-1.8.7-2011.03
|
120
|
-
* MRI 1.9.2
|
121
|
-
* rbx
|
122
|
-
* rbx-2.0.0pre
|
123
|
-
|
124
|
-
Inspired by
|
112
|
+
Tested with RSpec via [travis-ci](http://travis-ci.org/sch1zo/redis_storage) for
|
125
113
|
|
126
|
-
*
|
127
|
-
*
|
114
|
+
* ree
|
115
|
+
* MRI 1.9.{2,3}
|
116
|
+
* rbx-{18,19}mode
|
128
117
|
|
129
118
|
sch1zo
|
data/redis_storage.gemspec
CHANGED
@@ -16,9 +16,11 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.add_dependency 'json'
|
17
17
|
s.add_dependency 'activemodel', '>= 3.0.0'
|
18
18
|
|
19
|
-
s.add_development_dependency 'rspec', '>= 2.
|
20
|
-
s.add_development_dependency 'mocha', '>= 0.
|
21
|
-
s.add_development_dependency '
|
19
|
+
s.add_development_dependency 'rspec', '>= 2.8.0'
|
20
|
+
s.add_development_dependency 'mocha', '>= 0.10.4'
|
21
|
+
s.add_development_dependency 'mock_redis', '>= 0.3.0'
|
22
|
+
s.add_development_dependency 'generator_spec', '>= 0.8.5'
|
23
|
+
s.add_development_dependency 'rails', '>= 3.2.0'
|
22
24
|
|
23
25
|
s.rubyforge_project = "redis_storage"
|
24
26
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rails/all'
|
3
|
+
require './lib/generators/rails/redis_generator'
|
4
|
+
require "generator_spec/test_case"
|
5
|
+
|
6
|
+
describe ::Rails::Generators::RedisGenerator do
|
7
|
+
include GeneratorSpec::TestCase
|
8
|
+
destination File.expand_path "../../tmp", __FILE__
|
9
|
+
arguments %w(Schedule title body created_at)
|
10
|
+
before(:all) do
|
11
|
+
prepare_destination
|
12
|
+
run_generator
|
13
|
+
end
|
14
|
+
specify "model" do
|
15
|
+
destination_root.should have_structure {
|
16
|
+
directory 'app' do
|
17
|
+
directory 'models' do
|
18
|
+
file 'schedule.rb' do
|
19
|
+
contains "class Schedule < RedisStorage::Model"
|
20
|
+
contains "attribute :title, :body, :created_at"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
data/spec/model_spec.rb
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
class MockModel < RedisStorage::Model
|
3
|
-
|
4
|
-
|
5
|
-
end
|
6
|
-
attr_accessor *attrs
|
7
|
-
def self.index_for
|
8
|
-
[:title]
|
9
|
-
end
|
3
|
+
attribute :body, :title
|
4
|
+
index :title
|
10
5
|
end
|
11
6
|
|
12
7
|
describe RedisStorage::Model do
|
@@ -99,7 +94,7 @@ describe RedisStorage::Model do
|
|
99
94
|
end
|
100
95
|
context '#all' do
|
101
96
|
it 'should return an empty array if there are no entries' do
|
102
|
-
|
97
|
+
MockRedis.any_instance.stubs(:smembers => [])
|
103
98
|
records = MockModel.all
|
104
99
|
records.should eq([])
|
105
100
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'bundler
|
2
|
+
require 'bundler'
|
3
|
+
|
4
|
+
Bundler.setup
|
5
|
+
Bundler.require(:default, :test)
|
3
6
|
|
4
7
|
require './lib/redis_storage' # and any other gems you need
|
5
|
-
require '
|
8
|
+
require 'mock_redis'
|
6
9
|
|
7
10
|
RSpec.configure do |config|
|
8
11
|
config.mock_with :mocha
|
9
12
|
config.before(:all) do
|
10
|
-
$db =
|
13
|
+
$db = MockRedis.new
|
11
14
|
end
|
12
15
|
config.before(:each) do
|
13
|
-
$db.
|
14
|
-
$db.flushdb
|
16
|
+
$db.flushall
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_storage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
default_executable:
|
12
|
+
date: 2012-02-21 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: redis
|
17
|
-
requirement: &
|
16
|
+
requirement: &108020580 !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
18
|
requirements:
|
20
19
|
- - ! '>='
|
@@ -22,10 +21,10 @@ dependencies:
|
|
22
21
|
version: 2.2.0
|
23
22
|
type: :runtime
|
24
23
|
prerelease: false
|
25
|
-
version_requirements: *
|
24
|
+
version_requirements: *108020580
|
26
25
|
- !ruby/object:Gem::Dependency
|
27
26
|
name: json
|
28
|
-
requirement: &
|
27
|
+
requirement: &108036480 !ruby/object:Gem::Requirement
|
29
28
|
none: false
|
30
29
|
requirements:
|
31
30
|
- - ! '>='
|
@@ -33,10 +32,10 @@ dependencies:
|
|
33
32
|
version: '0'
|
34
33
|
type: :runtime
|
35
34
|
prerelease: false
|
36
|
-
version_requirements: *
|
35
|
+
version_requirements: *108036480
|
37
36
|
- !ruby/object:Gem::Dependency
|
38
37
|
name: activemodel
|
39
|
-
requirement: &
|
38
|
+
requirement: &108032540 !ruby/object:Gem::Requirement
|
40
39
|
none: false
|
41
40
|
requirements:
|
42
41
|
- - ! '>='
|
@@ -44,40 +43,62 @@ dependencies:
|
|
44
43
|
version: 3.0.0
|
45
44
|
type: :runtime
|
46
45
|
prerelease: false
|
47
|
-
version_requirements: *
|
46
|
+
version_requirements: *108032540
|
48
47
|
- !ruby/object:Gem::Dependency
|
49
48
|
name: rspec
|
50
|
-
requirement: &
|
49
|
+
requirement: &108088580 !ruby/object:Gem::Requirement
|
51
50
|
none: false
|
52
51
|
requirements:
|
53
52
|
- - ! '>='
|
54
53
|
- !ruby/object:Gem::Version
|
55
|
-
version: 2.
|
54
|
+
version: 2.8.0
|
56
55
|
type: :development
|
57
56
|
prerelease: false
|
58
|
-
version_requirements: *
|
57
|
+
version_requirements: *108088580
|
59
58
|
- !ruby/object:Gem::Dependency
|
60
59
|
name: mocha
|
61
|
-
requirement: &
|
60
|
+
requirement: &108087020 !ruby/object:Gem::Requirement
|
62
61
|
none: false
|
63
62
|
requirements:
|
64
63
|
- - ! '>='
|
65
64
|
- !ruby/object:Gem::Version
|
66
|
-
version: 0.
|
65
|
+
version: 0.10.4
|
67
66
|
type: :development
|
68
67
|
prerelease: false
|
69
|
-
version_requirements: *
|
68
|
+
version_requirements: *108087020
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mock_redis
|
71
|
+
requirement: &108086340 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.3.0
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *108086340
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: generator_spec
|
82
|
+
requirement: &108085660 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 0.8.5
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *108085660
|
70
91
|
- !ruby/object:Gem::Dependency
|
71
92
|
name: rails
|
72
|
-
requirement: &
|
93
|
+
requirement: &108084680 !ruby/object:Gem::Requirement
|
73
94
|
none: false
|
74
95
|
requirements:
|
75
96
|
- - ! '>='
|
76
97
|
- !ruby/object:Gem::Version
|
77
|
-
version: 3.
|
98
|
+
version: 3.2.0
|
78
99
|
type: :development
|
79
100
|
prerelease: false
|
80
|
-
version_requirements: *
|
101
|
+
version_requirements: *108084680
|
81
102
|
description: Provides a data backend for a Redis in Rails, will also provide a Rails
|
82
103
|
3 Generator
|
83
104
|
email:
|
@@ -87,10 +108,11 @@ extensions: []
|
|
87
108
|
extra_rdoc_files: []
|
88
109
|
files:
|
89
110
|
- .gitignore
|
111
|
+
- .rbenv-version
|
90
112
|
- .rspec
|
91
|
-
- .
|
113
|
+
- .travis.yml
|
92
114
|
- Gemfile
|
93
|
-
-
|
115
|
+
- Guardfile
|
94
116
|
- Rakefile
|
95
117
|
- lib/generators/rails/redis_generator.rb
|
96
118
|
- lib/generators/templates/model.rb
|
@@ -98,11 +120,11 @@ files:
|
|
98
120
|
- lib/redis_storage/railtie.rb
|
99
121
|
- lib/redis_storage/version.rb
|
100
122
|
- lib/tasks/redis_storage.rake
|
123
|
+
- readme.md
|
101
124
|
- redis_storage.gemspec
|
125
|
+
- spec/generator_spec.rb
|
102
126
|
- spec/model_spec.rb
|
103
127
|
- spec/spec_helper.rb
|
104
|
-
- test/generator_test.rb
|
105
|
-
has_rdoc: true
|
106
128
|
homepage: https://github.com/sch1zo/redis_storage
|
107
129
|
licenses: []
|
108
130
|
post_install_message:
|
@@ -115,16 +137,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
137
|
- - ! '>='
|
116
138
|
- !ruby/object:Gem::Version
|
117
139
|
version: '0'
|
140
|
+
segments:
|
141
|
+
- 0
|
142
|
+
hash: 3658108810072488555
|
118
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
144
|
none: false
|
120
145
|
requirements:
|
121
146
|
- - ! '>='
|
122
147
|
- !ruby/object:Gem::Version
|
123
148
|
version: '0'
|
149
|
+
segments:
|
150
|
+
- 0
|
151
|
+
hash: 3658108810072488555
|
124
152
|
requirements: []
|
125
153
|
rubyforge_project: redis_storage
|
126
|
-
rubygems_version: 1.
|
154
|
+
rubygems_version: 1.8.11
|
127
155
|
signing_key:
|
128
156
|
specification_version: 3
|
129
157
|
summary: A simple Redis ORM for Rails
|
130
|
-
test_files:
|
158
|
+
test_files:
|
159
|
+
- spec/generator_spec.rb
|
160
|
+
- spec/model_spec.rb
|
161
|
+
- spec/spec_helper.rb
|
data/.rvmrc
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
#rvm use rbx-2.0.0pre@redisrecord --create
|
2
|
-
#export RBXOPT=-Xrbc.db=$HOME/.rbx
|
3
|
-
rvm use 1.9.2@redisrecord --create
|
4
|
-
|
5
|
-
#install bundler if its not already
|
6
|
-
if ! command -v bundle ; then
|
7
|
-
gem install bundler
|
8
|
-
fi
|
9
|
-
# Bundle while reducing excess noise.
|
10
|
-
bundle | grep -v 'Using' | grep -v 'complete' | sed '/^$/d'
|
data/test/generator_test.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'test/unit'
|
3
|
-
|
4
|
-
require 'bundler'
|
5
|
-
Bundler.setup
|
6
|
-
|
7
|
-
require './lib/generators/rails/redis_generator'
|
8
|
-
|
9
|
-
class RedisGeneratorTest < Rails::Generators::TestCase
|
10
|
-
destination File.expand_path("../tmp", File.dirname(__FILE__))
|
11
|
-
setup :prepare_destination
|
12
|
-
tests ::Rails::Generators::RedisGenerator
|
13
|
-
|
14
|
-
test 'should create a model file with a few basic lines' do
|
15
|
-
run_generator %w(Schedule title body created_at)
|
16
|
-
assert_file 'app/models/schedule.rb', /class Schedule < RedisStorage::Model/
|
17
|
-
assert_file 'app/models/schedule.rb', /attr_accessor \*attrs/
|
18
|
-
end
|
19
|
-
test 'should set the classes attrs' do
|
20
|
-
run_generator %w(Schedule title body created_at)
|
21
|
-
assert_file 'app/models/schedule.rb' do |model|
|
22
|
-
assert_class_method :attrs, model do |attrs|
|
23
|
-
assert_match /[ :id, :title, :body, :created_at ]/, attrs
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
test 'should set id as only class attribute if none given' do
|
28
|
-
run_generator %w(Schedule title body)
|
29
|
-
assert_file 'app/models/schedule.rb' do |model|
|
30
|
-
assert_class_method :attrs, model do |attrs|
|
31
|
-
assert_match /[ :title, :body ]/, attrs
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|