redis_orm 0.6.2 → 0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +15 -7
- data/Gemfile +7 -5
- data/Manifest +8 -0
- data/README.md +33 -1
- data/Rakefile +3 -3
- data/lib/rails/generators/redis_orm/model/model_generator.rb +21 -0
- data/lib/rails/generators/redis_orm/model/templates/model.rb.erb +5 -0
- data/lib/redis_orm/associations/has_many.rb +10 -5
- data/lib/redis_orm/associations/has_many_helper.rb +1 -1
- data/lib/redis_orm/associations/has_many_proxy.rb +18 -7
- data/lib/redis_orm/associations/has_one.rb +4 -2
- data/lib/redis_orm/redis_orm.rb +266 -208
- data/redis_orm.gemspec +15 -15
- data/spec/generators/model_generator_spec.rb +29 -0
- data/spec/spec_helper.rb +17 -0
- data/test/basic_functionality_test.rb +39 -8
- data/test/classes/article_with_comments.rb +8 -0
- data/test/classes/expire_user.rb +8 -0
- data/test/classes/expire_user_with_predicate.rb +13 -0
- data/test/classes/profile.rb +1 -0
- data/test/exceptions_test.rb +12 -0
- data/test/expire_records_test.rb +64 -0
- data/test/options_test.rb +2 -2
- data/test/redis.conf +8 -8
- data/test/test_helper.rb +3 -0
- data/test/uuid_as_id_test.rb +4 -4
- metadata +60 -24
data/redis_orm.gemspec
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
|
-
s.name =
|
5
|
-
s.version = "0.
|
4
|
+
s.name = "redis_orm"
|
5
|
+
s.version = "0.7"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = [
|
9
|
-
s.date =
|
10
|
-
s.description =
|
11
|
-
s.email =
|
12
|
-
s.extra_rdoc_files = [
|
13
|
-
s.files = [
|
14
|
-
s.homepage =
|
15
|
-
s.rdoc_options = [
|
16
|
-
s.require_paths = [
|
17
|
-
s.rubyforge_project =
|
18
|
-
s.rubygems_version =
|
19
|
-
s.summary =
|
20
|
-
s.test_files = [
|
8
|
+
s.authors = ["Dmitrii Samoilov"]
|
9
|
+
s.date = "2013-05-03"
|
10
|
+
s.description = "ORM for Redis (advanced key-value storage) with ActiveRecord API"
|
11
|
+
s.email = "germaninthetown@gmail.com"
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.md", "TODO", "lib/rails/generators/redis_orm/model/model_generator.rb", "lib/rails/generators/redis_orm/model/templates/model.rb.erb", "lib/redis_orm.rb", "lib/redis_orm/active_model_behavior.rb", "lib/redis_orm/associations/belongs_to.rb", "lib/redis_orm/associations/has_many.rb", "lib/redis_orm/associations/has_many_helper.rb", "lib/redis_orm/associations/has_many_proxy.rb", "lib/redis_orm/associations/has_one.rb", "lib/redis_orm/redis_orm.rb", "lib/redis_orm/utils.rb"]
|
13
|
+
s.files = ["CHANGELOG", "Gemfile", "LICENSE", "Manifest", "README.md", "Rakefile", "TODO", "benchmarks/sortable_benchmark.rb", "lib/rails/generators/redis_orm/model/model_generator.rb", "lib/rails/generators/redis_orm/model/templates/model.rb.erb", "lib/redis_orm.rb", "lib/redis_orm/active_model_behavior.rb", "lib/redis_orm/associations/belongs_to.rb", "lib/redis_orm/associations/has_many.rb", "lib/redis_orm/associations/has_many_helper.rb", "lib/redis_orm/associations/has_many_proxy.rb", "lib/redis_orm/associations/has_one.rb", "lib/redis_orm/redis_orm.rb", "lib/redis_orm/utils.rb", "redis_orm.gemspec", "spec/generators/model_generator_spec.rb", "spec/spec_helper.rb", "test/association_indices_test.rb", "test/associations_test.rb", "test/atomicity_test.rb", "test/basic_functionality_test.rb", "test/callbacks_test.rb", "test/changes_array_test.rb", "test/classes/album.rb", "test/classes/article.rb", "test/classes/article_with_comments.rb", "test/classes/book.rb", "test/classes/catalog_item.rb", "test/classes/category.rb", "test/classes/city.rb", "test/classes/comment.rb", "test/classes/country.rb", "test/classes/custom_user.rb", "test/classes/cutout.rb", "test/classes/cutout_aggregator.rb", "test/classes/default_user.rb", "test/classes/dynamic_finder_user.rb", "test/classes/empty_person.rb", "test/classes/expire_user.rb", "test/classes/expire_user_with_predicate.rb", "test/classes/giftcard.rb", "test/classes/jigsaw.rb", "test/classes/location.rb", "test/classes/message.rb", "test/classes/note.rb", "test/classes/omni_user.rb", "test/classes/person.rb", "test/classes/photo.rb", "test/classes/profile.rb", "test/classes/sortable_user.rb", "test/classes/timestamp.rb", "test/classes/user.rb", "test/classes/uuid_default_user.rb", "test/classes/uuid_timestamp.rb", "test/classes/uuid_user.rb", "test/dynamic_finders_test.rb", "test/exceptions_test.rb", "test/expire_records_test.rb", "test/has_one_has_many_test.rb", "test/indices_test.rb", "test/modules/belongs_to_model_within_module.rb", "test/modules/has_many_model_within_module.rb", "test/options_test.rb", "test/polymorphic_test.rb", "test/redis.conf", "test/sortable_test.rb", "test/test_helper.rb", "test/uuid_as_id_test.rb", "test/validations_test.rb"]
|
14
|
+
s.homepage = "https://github.com/german/redis_orm"
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Redis_orm", "--main", "README.md"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = "redis_orm"
|
18
|
+
s.rubygems_version = "1.8.25"
|
19
|
+
s.summary = "ORM for Redis (advanced key-value storage) with ActiveRecord API"
|
20
|
+
s.test_files = ["test/association_indices_test.rb", "test/associations_test.rb", "test/atomicity_test.rb", "test/basic_functionality_test.rb", "test/callbacks_test.rb", "test/changes_array_test.rb", "test/dynamic_finders_test.rb", "test/exceptions_test.rb", "test/expire_records_test.rb", "test/has_one_has_many_test.rb", "test/indices_test.rb", "test/options_test.rb", "test/polymorphic_test.rb", "test/sortable_test.rb", "test/test_helper.rb", "test/uuid_as_id_test.rb", "test/validations_test.rb"]
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
23
23
|
s.specification_version = 3
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'rails/generators/redis_orm/model/model_generator'
|
4
|
+
|
5
|
+
describe RedisOrm::Generators::ModelGenerator do
|
6
|
+
destination File.expand_path(File.join(File.dirname(__FILE__),
|
7
|
+
'..', '..', 'tmp'))
|
8
|
+
|
9
|
+
before do
|
10
|
+
prepare_destination
|
11
|
+
run_generator args
|
12
|
+
end
|
13
|
+
subject { file('app/models/post.rb') }
|
14
|
+
|
15
|
+
context "Given only model's name" do
|
16
|
+
let(:args) { %w[post] }
|
17
|
+
|
18
|
+
it { should exist }
|
19
|
+
end
|
20
|
+
context "Given model's name and attributes" do
|
21
|
+
let(:args) { %w[post title:string created_at:time] }
|
22
|
+
|
23
|
+
it { should exist }
|
24
|
+
it "should define properties" do
|
25
|
+
should contain /property\s+\:title,\sString/
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rails/all'
|
2
|
+
require 'rspec'
|
3
|
+
require 'rspec/autorun'
|
4
|
+
|
5
|
+
$: << File.dirname(File.expand_path(__FILE__)) + '/../lib/'
|
6
|
+
|
7
|
+
module RedisOrmRails
|
8
|
+
class Application < ::Rails::Application
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'rspec/rails'
|
13
|
+
require 'ammeter/init'
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.mock_with :rspec
|
17
|
+
end
|
@@ -14,16 +14,18 @@ describe "check basic functionality" do
|
|
14
14
|
user.name = "Anderson"
|
15
15
|
User.first.should_not == user
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it "test_simple_creation" do
|
19
19
|
User.count.should == 0
|
20
20
|
|
21
21
|
user = User.new :name => "german"
|
22
|
+
|
22
23
|
user.save
|
23
24
|
|
24
25
|
user.should be
|
25
26
|
|
26
27
|
user.name.should == "german"
|
28
|
+
user.__redis_record_key.should == "user:1"
|
27
29
|
|
28
30
|
User.count.should == 1
|
29
31
|
User.first.name.should == "german"
|
@@ -109,8 +111,8 @@ describe "check basic functionality" do
|
|
109
111
|
|
110
112
|
u = User.first
|
111
113
|
|
112
|
-
u.created_at.class.should ==
|
113
|
-
u.modified_at.class.should ==
|
114
|
+
u.created_at.class.should == DateTime
|
115
|
+
u.modified_at.class.should == DateTime
|
114
116
|
u.wage.class.should == Float
|
115
117
|
u.male.class.to_s.should match(/TrueClass|FalseClass/)
|
116
118
|
u.age.class.to_s.should match(/Integer|Fixnum/)
|
@@ -128,8 +130,8 @@ describe "check basic functionality" do
|
|
128
130
|
|
129
131
|
u = DefaultUser.first
|
130
132
|
|
131
|
-
u.created_at.class.should ==
|
132
|
-
u.modified_at.class.should ==
|
133
|
+
u.created_at.class.should == DateTime
|
134
|
+
u.modified_at.class.should == DateTime
|
133
135
|
u.wage.class.should == Float
|
134
136
|
u.male.class.to_s.should match(/TrueClass|FalseClass/)
|
135
137
|
u.admin.class.to_s.should match(/TrueClass|FalseClass/)
|
@@ -149,17 +151,46 @@ describe "check basic functionality" do
|
|
149
151
|
du_saved.name.should == "germaninthetown"
|
150
152
|
du_saved.admin.should == false
|
151
153
|
end
|
152
|
-
|
154
|
+
|
153
155
|
it "should expand timestamps declaration properly" do
|
154
156
|
t = TimeStamp.new
|
155
157
|
t.save
|
156
|
-
|
157
158
|
t.created_at.should be
|
158
159
|
t.modified_at.should be
|
159
160
|
t.created_at.day.should == Time.now.day
|
160
161
|
t.modified_at.day.should == Time.now.day
|
161
162
|
end
|
162
163
|
|
164
|
+
it "should store arrays in the property correctly" do
|
165
|
+
a = ArticleWithComments.new :title => "Article #1", :comments => ["Hello", "there are comments"]
|
166
|
+
expect {
|
167
|
+
a.save
|
168
|
+
}.to change(ArticleWithComments, :count).by(1)
|
169
|
+
|
170
|
+
saved_article = ArticleWithComments.last
|
171
|
+
saved_article.comments.should == ["Hello", "there are comments"]
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should store default hash in the property if it's not provided" do
|
175
|
+
a = ArticleWithComments.new :title => "Article #1"
|
176
|
+
expect {
|
177
|
+
a.save
|
178
|
+
}.to change(ArticleWithComments, :count).by(1)
|
179
|
+
|
180
|
+
saved_article = ArticleWithComments.last
|
181
|
+
saved_article.rates.should == {1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0}
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should store hash in the property correctly" do
|
185
|
+
a = ArticleWithComments.new :title => "Article #1", :rates => {4 => 134}
|
186
|
+
expect {
|
187
|
+
a.save
|
188
|
+
}.to change(ArticleWithComments, :count).by(1)
|
189
|
+
|
190
|
+
saved_article = ArticleWithComments.last
|
191
|
+
saved_article.rates.should == {4 => 134}
|
192
|
+
end
|
193
|
+
|
163
194
|
it "should properly transform :default values to right classes (if :default values are wrong) so when comparing them to other/stored instances they'll be the same" do
|
164
195
|
# SortableUser class has 3 properties with wrong classes of :default value
|
165
196
|
u = SortableUser.new :name => "Alan"
|
@@ -170,4 +201,4 @@ describe "check basic functionality" do
|
|
170
201
|
su.wage.should == 20_000.0
|
171
202
|
su.age.should == 26
|
172
203
|
end
|
173
|
-
end
|
204
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class ExpireUserWithPredicate < RedisOrm::Base
|
2
|
+
property :name, String
|
3
|
+
property :persist, RedisOrm::Boolean, :default => false
|
4
|
+
|
5
|
+
expire 10.minutes.from_now, :if => Proc.new {|r| !r.persist?}
|
6
|
+
|
7
|
+
has_many :articles
|
8
|
+
has_one :profile
|
9
|
+
|
10
|
+
def persist?
|
11
|
+
!!self.persist
|
12
|
+
end
|
13
|
+
end
|
data/test/classes/profile.rb
CHANGED
data/test/exceptions_test.rb
CHANGED
@@ -32,4 +32,16 @@ describe "exceptions test" do
|
|
32
32
|
jigsaw = Jigsaw.create :title => "jigsaw"
|
33
33
|
lambda { User.create!(:name => "John", :age => 44, :profile => jigsaw) }.should raise_error(RedisOrm::TypeMismatchError)
|
34
34
|
end
|
35
|
+
|
36
|
+
it "should throw an exception if wrong format of the default value is specified for Array/Hash property" do
|
37
|
+
a = ArticleWithComments.new :title => "Article #1", :rates => [1,2,3,4,5]
|
38
|
+
lambda {
|
39
|
+
a.save
|
40
|
+
}.should raise_error(RedisOrm::TypeMismatchError)
|
41
|
+
|
42
|
+
a = ArticleWithComments.new :title => "Article #1", :comments => 12
|
43
|
+
lambda {
|
44
|
+
a.save
|
45
|
+
}.should raise_error(RedisOrm::TypeMismatchError)
|
46
|
+
end
|
35
47
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.dirname(File.expand_path(__FILE__)) + '/test_helper.rb'
|
2
|
+
|
3
|
+
describe "expire record after specified time" do
|
4
|
+
it "should create a record and then delete if *expire* method is specified in appropriate class" do
|
5
|
+
euser = ExpireUser.create :name => "Ghost rider"
|
6
|
+
$redis.ttl(euser.__redis_record_key).should be > 9.minutes.from_now.to_i
|
7
|
+
$redis.ttl(euser.__redis_record_key).should be < (10.minutes.from_now.to_i + 1)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should create a record and then delete if *expire* method is specified in appropriate class" do
|
11
|
+
euser = ExpireUserWithPredicate.create :name => "Ghost rider"
|
12
|
+
$redis.ttl(euser.__redis_record_key).should be > 9.minutes.from_now.to_i
|
13
|
+
$redis.ttl(euser.__redis_record_key).should be < (10.minutes.from_now.to_i + 1)
|
14
|
+
|
15
|
+
euser2 = ExpireUserWithPredicate.create :name => "Ghost rider", :persist => true
|
16
|
+
$redis.ttl(euser2.__redis_record_key).should == -1
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should create a record with an inline *expire* option (which overrides default *expire* value)" do
|
20
|
+
euser = ExpireUser.create :name => "Ghost rider", :expire_in => 50.minutes.from_now
|
21
|
+
$redis.ttl(euser.__redis_record_key).should be < (50.minutes.from_now.to_i + 1)
|
22
|
+
$redis.ttl(euser.__redis_record_key).should be > 49.minutes.from_now.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should also create expirable key when record has associated records" do
|
26
|
+
euser = ExpireUser.create :name => "Ghost rider"
|
27
|
+
$redis.ttl(euser.__redis_record_key).should be > 9.minutes.from_now.to_i
|
28
|
+
$redis.ttl(euser.__redis_record_key).should be < (10.minutes.from_now.to_i + 1)
|
29
|
+
|
30
|
+
profile = Profile.create :title => "Profile for ghost rider", :name => "Ghost Rider"
|
31
|
+
articles = [Article.create(:title => "article1", :karma => 1), Article.create(:title => "article2", :karma => 2)]
|
32
|
+
|
33
|
+
euser.profile = profile
|
34
|
+
euser.profile.should == profile
|
35
|
+
$redis.get("expire_user:1:profile").to_i.should == profile.id
|
36
|
+
$redis.ttl("expire_user:1:profile").should be > 9.minutes.from_now.to_i
|
37
|
+
$redis.ttl("expire_user:1:profile").should be < (10.minutes.from_now.to_i + 1)
|
38
|
+
|
39
|
+
euser.articles = articles
|
40
|
+
$redis.zrange("expire_user:1:articles", 0, -1).should =~ articles.map{|a| a.id.to_s}
|
41
|
+
$redis.ttl("expire_user:1:articles").should be > 9.minutes.from_now.to_i
|
42
|
+
$redis.ttl("expire_user:1:articles").should be < (10.minutes.from_now.to_i + 1)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should also create expirable key when record has associated records (class with predicate expiry)" do
|
46
|
+
euser2 = ExpireUserWithPredicate.create :name => "Ghost rider", :persist => false
|
47
|
+
$redis.ttl(euser2.__redis_record_key).should be > 9.minutes.from_now.to_i
|
48
|
+
$redis.ttl(euser2.__redis_record_key).should be < (10.minutes.from_now.to_i + 1)
|
49
|
+
|
50
|
+
profile = Profile.create :title => "Profile for ghost rider", :name => "Ghost Rider"
|
51
|
+
articles = [Article.create(:title => "article1", :karma => 1), Article.create(:title => "article2", :karma => 2)]
|
52
|
+
|
53
|
+
euser2.profile = profile
|
54
|
+
euser2.profile.should == profile
|
55
|
+
$redis.get("expire_user_with_predicate:1:profile").to_i.should == profile.id
|
56
|
+
$redis.ttl("expire_user_with_predicate:1:profile").should be > 9.minutes.from_now.to_i
|
57
|
+
$redis.ttl("expire_user_with_predicate:1:profile").should be < (10.minutes.from_now.to_i + 1)
|
58
|
+
|
59
|
+
euser2.articles << articles
|
60
|
+
$redis.zrange("expire_user_with_predicate:1:articles", 0, -1).should =~ articles.map{|a| a.id.to_s}
|
61
|
+
$redis.ttl("expire_user_with_predicate:1:articles").should be > 9.minutes.from_now.to_i
|
62
|
+
$redis.ttl("expire_user_with_predicate:1:articles").should be < (10.minutes.from_now.to_i + 1)
|
63
|
+
end
|
64
|
+
end
|
data/test/options_test.rb
CHANGED
@@ -81,7 +81,7 @@ describe "test options" do
|
|
81
81
|
Photo.last(:conditions => {:image => "facepalm.jpg", :image_type => "jpg"}).should == @photo1
|
82
82
|
Photo.last(:conditions => {:image => "boobs.png", :image_type => "png"}).should == @photo2
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
it "should correctly save boolean values" do
|
86
86
|
$redis.hgetall("photo:#{@photo1.id}")["inverted"].should == "true"
|
87
87
|
$redis.hgetall("photo:#{@photo2.id}")["inverted"].should == "false"
|
@@ -223,4 +223,4 @@ describe "test options" do
|
|
223
223
|
@album.photos.count.should == 1
|
224
224
|
@album.photos.size.should == 1
|
225
225
|
end
|
226
|
-
end
|
226
|
+
end
|
data/test/redis.conf
CHANGED
@@ -303,7 +303,7 @@ no-appendfsync-on-rewrite no
|
|
303
303
|
# To enable VM just set 'vm-enabled' to yes, and set the following three
|
304
304
|
# VM parameters accordingly to your needs.
|
305
305
|
|
306
|
-
vm-enabled no
|
306
|
+
#vm-enabled no
|
307
307
|
# vm-enabled yes
|
308
308
|
|
309
309
|
# This is the path of the Redis swap file. As you can guess, swap files
|
@@ -317,7 +317,7 @@ vm-enabled no
|
|
317
317
|
# *** WARNING *** if you are using a shared hosting the default of putting
|
318
318
|
# the swap file under /tmp is not secure. Create a dir with access granted
|
319
319
|
# only to Redis user and configure Redis to create the swap file there.
|
320
|
-
vm-swap-file /tmp/redis.swap
|
320
|
+
#vm-swap-file /tmp/redis.swap
|
321
321
|
|
322
322
|
# vm-max-memory configures the VM to use at max the specified amount of
|
323
323
|
# RAM. Everything that deos not fit will be swapped on disk *if* possible, that
|
@@ -327,7 +327,7 @@ vm-swap-file /tmp/redis.swap
|
|
327
327
|
# default, just specify the max amount of RAM you can in bytes, but it's
|
328
328
|
# better to leave some margin. For instance specify an amount of RAM
|
329
329
|
# that's more or less between 60 and 80% of your free RAM.
|
330
|
-
vm-max-memory 0
|
330
|
+
#vm-max-memory 0
|
331
331
|
|
332
332
|
# Redis swap files is split into pages. An object can be saved using multiple
|
333
333
|
# contiguous pages, but pages can't be shared between different objects.
|
@@ -338,7 +338,7 @@ vm-max-memory 0
|
|
338
338
|
# If you use a lot of small objects, use a page size of 64 or 32 bytes.
|
339
339
|
# If you use a lot of big objects, use a bigger page size.
|
340
340
|
# If unsure, use the default :)
|
341
|
-
vm-page-size 32
|
341
|
+
#vm-page-size 32
|
342
342
|
|
343
343
|
# Number of total memory pages in the swap file.
|
344
344
|
# Given that the page table (a bitmap of free/used pages) is taken in memory,
|
@@ -351,7 +351,7 @@ vm-page-size 32
|
|
351
351
|
#
|
352
352
|
# It's better to use the smallest acceptable value for your application,
|
353
353
|
# but the default is large in order to work in most conditions.
|
354
|
-
vm-pages 134217728
|
354
|
+
#vm-pages 134217728
|
355
355
|
|
356
356
|
# Max number of VM I/O threads running at the same time.
|
357
357
|
# This threads are used to read/write data from/to swap file, since they
|
@@ -362,7 +362,7 @@ vm-pages 134217728
|
|
362
362
|
#
|
363
363
|
# The special value of 0 turn off threaded I/O and enables the blocking
|
364
364
|
# Virtual Memory implementation.
|
365
|
-
vm-max-threads 4
|
365
|
+
#vm-max-threads 4
|
366
366
|
|
367
367
|
############################### ADVANCED CONFIG ###############################
|
368
368
|
|
@@ -370,8 +370,8 @@ vm-max-threads 4
|
|
370
370
|
# have at max a given numer of elements, and the biggest element does not
|
371
371
|
# exceed a given threshold. You can configure this limits with the following
|
372
372
|
# configuration directives.
|
373
|
-
hash-max-zipmap-entries 512
|
374
|
-
hash-max-zipmap-value 64
|
373
|
+
#hash-max-zipmap-entries 512
|
374
|
+
#hash-max-zipmap-value 64
|
375
375
|
|
376
376
|
# Similarly to hashes, small lists are also encoded in a special way in order
|
377
377
|
# to save a lot of space. The special representation is only used when
|
data/test/test_helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'rspec'
|
2
4
|
require 'rspec/autorun'
|
3
5
|
require File.dirname(File.expand_path(__FILE__)) + '/../lib/redis_orm.rb'
|
@@ -6,6 +8,7 @@ Dir.glob(['test/classes/*.rb', 'test/modules/*.rb']).each do |klassfile|
|
|
6
8
|
require File.dirname(File.expand_path(__FILE__)) + '/../' + klassfile
|
7
9
|
end
|
8
10
|
|
11
|
+
|
9
12
|
RSpec.configure do |config|
|
10
13
|
config.before(:all) do
|
11
14
|
path_to_conf = File.dirname(File.expand_path(__FILE__)) + "/redis.conf"
|
data/test/uuid_as_id_test.rb
CHANGED
@@ -105,8 +105,8 @@ describe "check basic functionality" do
|
|
105
105
|
|
106
106
|
u = UuidUser.first
|
107
107
|
|
108
|
-
u.created_at.class.should ==
|
109
|
-
u.modified_at.class.should ==
|
108
|
+
u.created_at.class.should == DateTime
|
109
|
+
u.modified_at.class.should == DateTime
|
110
110
|
u.wage.class.should == Float
|
111
111
|
u.male.class.to_s.should match(/TrueClass|FalseClass/)
|
112
112
|
u.age.class.to_s.should match(/Integer|Fixnum/)
|
@@ -126,8 +126,8 @@ describe "check basic functionality" do
|
|
126
126
|
|
127
127
|
u = UuidDefaultUser.first
|
128
128
|
|
129
|
-
u.created_at.class.should ==
|
130
|
-
u.modified_at.class.should ==
|
129
|
+
u.created_at.class.should == DateTime
|
130
|
+
u.modified_at.class.should == DateTime
|
131
131
|
u.wage.class.should == Float
|
132
132
|
u.male.class.to_s.should match(/TrueClass|FalseClass/)
|
133
133
|
u.admin.class.to_s.should match(/TrueClass|FalseClass/)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_orm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.7'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-05-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: 3.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.0.0
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: activemodel
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: 3.0.0
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.0.0
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: redis
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: 2.2.0
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.2.0
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: uuid
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: 2.3.2
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.3.2
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: rspec
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ! '>='
|
@@ -65,7 +85,12 @@ dependencies:
|
|
65
85
|
version: 2.5.0
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.5.0
|
69
94
|
description: ORM for Redis (advanced key-value storage) with ActiveRecord API
|
70
95
|
email: germaninthetown@gmail.com
|
71
96
|
executables: []
|
@@ -75,6 +100,8 @@ extra_rdoc_files:
|
|
75
100
|
- LICENSE
|
76
101
|
- README.md
|
77
102
|
- TODO
|
103
|
+
- lib/rails/generators/redis_orm/model/model_generator.rb
|
104
|
+
- lib/rails/generators/redis_orm/model/templates/model.rb.erb
|
78
105
|
- lib/redis_orm.rb
|
79
106
|
- lib/redis_orm/active_model_behavior.rb
|
80
107
|
- lib/redis_orm/associations/belongs_to.rb
|
@@ -93,6 +120,8 @@ files:
|
|
93
120
|
- Rakefile
|
94
121
|
- TODO
|
95
122
|
- benchmarks/sortable_benchmark.rb
|
123
|
+
- lib/rails/generators/redis_orm/model/model_generator.rb
|
124
|
+
- lib/rails/generators/redis_orm/model/templates/model.rb.erb
|
96
125
|
- lib/redis_orm.rb
|
97
126
|
- lib/redis_orm/active_model_behavior.rb
|
98
127
|
- lib/redis_orm/associations/belongs_to.rb
|
@@ -103,6 +132,8 @@ files:
|
|
103
132
|
- lib/redis_orm/redis_orm.rb
|
104
133
|
- lib/redis_orm/utils.rb
|
105
134
|
- redis_orm.gemspec
|
135
|
+
- spec/generators/model_generator_spec.rb
|
136
|
+
- spec/spec_helper.rb
|
106
137
|
- test/association_indices_test.rb
|
107
138
|
- test/associations_test.rb
|
108
139
|
- test/atomicity_test.rb
|
@@ -111,6 +142,7 @@ files:
|
|
111
142
|
- test/changes_array_test.rb
|
112
143
|
- test/classes/album.rb
|
113
144
|
- test/classes/article.rb
|
145
|
+
- test/classes/article_with_comments.rb
|
114
146
|
- test/classes/book.rb
|
115
147
|
- test/classes/catalog_item.rb
|
116
148
|
- test/classes/category.rb
|
@@ -123,6 +155,8 @@ files:
|
|
123
155
|
- test/classes/default_user.rb
|
124
156
|
- test/classes/dynamic_finder_user.rb
|
125
157
|
- test/classes/empty_person.rb
|
158
|
+
- test/classes/expire_user.rb
|
159
|
+
- test/classes/expire_user_with_predicate.rb
|
126
160
|
- test/classes/giftcard.rb
|
127
161
|
- test/classes/jigsaw.rb
|
128
162
|
- test/classes/location.rb
|
@@ -140,6 +174,7 @@ files:
|
|
140
174
|
- test/classes/uuid_user.rb
|
141
175
|
- test/dynamic_finders_test.rb
|
142
176
|
- test/exceptions_test.rb
|
177
|
+
- test/expire_records_test.rb
|
143
178
|
- test/has_one_has_many_test.rb
|
144
179
|
- test/indices_test.rb
|
145
180
|
- test/modules/belongs_to_model_within_module.rb
|
@@ -177,24 +212,25 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
212
|
version: '1.2'
|
178
213
|
requirements: []
|
179
214
|
rubyforge_project: redis_orm
|
180
|
-
rubygems_version: 1.8.
|
215
|
+
rubygems_version: 1.8.25
|
181
216
|
signing_key:
|
182
217
|
specification_version: 3
|
183
218
|
summary: ORM for Redis (advanced key-value storage) with ActiveRecord API
|
184
219
|
test_files:
|
220
|
+
- test/association_indices_test.rb
|
221
|
+
- test/associations_test.rb
|
185
222
|
- test/atomicity_test.rb
|
223
|
+
- test/basic_functionality_test.rb
|
224
|
+
- test/callbacks_test.rb
|
225
|
+
- test/changes_array_test.rb
|
226
|
+
- test/dynamic_finders_test.rb
|
227
|
+
- test/exceptions_test.rb
|
228
|
+
- test/expire_records_test.rb
|
229
|
+
- test/has_one_has_many_test.rb
|
186
230
|
- test/indices_test.rb
|
231
|
+
- test/options_test.rb
|
232
|
+
- test/polymorphic_test.rb
|
187
233
|
- test/sortable_test.rb
|
188
|
-
- test/uuid_as_id_test.rb
|
189
234
|
- test/test_helper.rb
|
190
|
-
- test/
|
191
|
-
- test/callbacks_test.rb
|
192
|
-
- test/exceptions_test.rb
|
193
|
-
- test/associations_test.rb
|
235
|
+
- test/uuid_as_id_test.rb
|
194
236
|
- test/validations_test.rb
|
195
|
-
- test/basic_functionality_test.rb
|
196
|
-
- test/dynamic_finders_test.rb
|
197
|
-
- test/changes_array_test.rb
|
198
|
-
- test/polymorphic_test.rb
|
199
|
-
- test/association_indices_test.rb
|
200
|
-
- test/has_one_has_many_test.rb
|