redis_storage 0.2.9 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rbenv-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3-p125
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - ree
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - rbx-18mode
7
+ - rbx-19mode
8
+ notifications:
9
+ email:
10
+ - dev@eger.lc
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
- # irb stuff
8
- gem 'wirble'
9
- gem 'hirb'
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
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :version => 2 do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
@@ -1,6 +1,3 @@
1
1
  class <%= class_name %> < RedisStorage::Model
2
- def self.attrs
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
@@ -1,3 +1,3 @@
1
1
  module RedisStorage
2
- VERSION = "0.2.9"
2
+ VERSION = "0.3.0"
3
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
- def self.index_for
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.build(params)
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(params)
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 index_for.include? key
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
- self.class.attrs.inject({:id => @id}) do |a,key|
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
- for key in self.class.index_for do
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
- for key in self.class.index_for do
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
@@ -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
+ [![Build Status](https://secure.travis-ci.org/sch1zo/redis_storage.png)](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
- def self.attrs
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
- def self.attrs
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
- def self.index_for
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 and testunit for the generator for
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
- * some ideas from the redis backend in [scanty-redis](https://github.com/adamwiggins/scanty-redis)
127
- * various small sinatra projects from myself which use a pre version of this gem
114
+ * ree
115
+ * MRI 1.9.{2,3}
116
+ * rbx-{18,19}mode
128
117
 
129
118
  sch1zo
@@ -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.0.0'
20
- s.add_development_dependency 'mocha', '>= 0.9.10'
21
- s.add_development_dependency 'rails', '>= 3.0.0'
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
- def self.attrs
4
- [:body, :title]
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
- Redis.any_instance.stubs(:smembers => [])
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/setup'
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 'redis'
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 = Redis.new({})
13
+ $db = MockRedis.new
11
14
  end
12
15
  config.before(:each) do
13
- $db.select 12
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.2.9
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: 2011-07-03 00:00:00.000000000 +02:00
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: &11725760 !ruby/object:Gem::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: *11725760
24
+ version_requirements: *108020580
26
25
  - !ruby/object:Gem::Dependency
27
26
  name: json
28
- requirement: &11725340 !ruby/object:Gem::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: *11725340
35
+ version_requirements: *108036480
37
36
  - !ruby/object:Gem::Dependency
38
37
  name: activemodel
39
- requirement: &11724800 !ruby/object:Gem::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: *11724800
46
+ version_requirements: *108032540
48
47
  - !ruby/object:Gem::Dependency
49
48
  name: rspec
50
- requirement: &11724300 !ruby/object:Gem::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.0.0
54
+ version: 2.8.0
56
55
  type: :development
57
56
  prerelease: false
58
- version_requirements: *11724300
57
+ version_requirements: *108088580
59
58
  - !ruby/object:Gem::Dependency
60
59
  name: mocha
61
- requirement: &11723840 !ruby/object:Gem::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.9.10
65
+ version: 0.10.4
67
66
  type: :development
68
67
  prerelease: false
69
- version_requirements: *11723840
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: &11723380 !ruby/object:Gem::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.0.0
98
+ version: 3.2.0
78
99
  type: :development
79
100
  prerelease: false
80
- version_requirements: *11723380
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
- - .rvmrc
113
+ - .travis.yml
92
114
  - Gemfile
93
- - README
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.6.2
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'
@@ -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