redis_orm 0.7 → 0.8
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.
- checksums.yaml +7 -0
- data/README.md +1 -1
- data/lib/redis_orm.rb +8 -13
- data/lib/redis_orm/associations/has_many.rb +7 -3
- data/lib/redis_orm/redis_orm.rb +3 -5
- metadata +64 -124
- data/Gemfile +0 -10
- data/Manifest +0 -74
- data/Rakefile +0 -25
- data/benchmarks/sortable_benchmark.rb +0 -45
- data/redis_orm.gemspec +0 -45
- data/spec/generators/model_generator_spec.rb +0 -29
- data/spec/spec_helper.rb +0 -17
- data/test/association_indices_test.rb +0 -168
- data/test/associations_test.rb +0 -294
- data/test/atomicity_test.rb +0 -36
- data/test/basic_functionality_test.rb +0 -204
- data/test/callbacks_test.rb +0 -49
- data/test/changes_array_test.rb +0 -25
- data/test/classes/album.rb +0 -6
- data/test/classes/article.rb +0 -7
- data/test/classes/article_with_comments.rb +0 -8
- data/test/classes/book.rb +0 -6
- data/test/classes/catalog_item.rb +0 -5
- data/test/classes/category.rb +0 -7
- data/test/classes/city.rb +0 -7
- data/test/classes/comment.rb +0 -26
- data/test/classes/country.rb +0 -5
- data/test/classes/custom_user.rb +0 -8
- data/test/classes/cutout.rb +0 -20
- data/test/classes/cutout_aggregator.rb +0 -5
- data/test/classes/default_user.rb +0 -10
- data/test/classes/dynamic_finder_user.rb +0 -8
- data/test/classes/empty_person.rb +0 -2
- data/test/classes/expire_user.rb +0 -8
- data/test/classes/expire_user_with_predicate.rb +0 -13
- data/test/classes/giftcard.rb +0 -6
- data/test/classes/jigsaw.rb +0 -4
- data/test/classes/location.rb +0 -5
- data/test/classes/message.rb +0 -4
- data/test/classes/note.rb +0 -5
- data/test/classes/omni_user.rb +0 -8
- data/test/classes/person.rb +0 -6
- data/test/classes/photo.rb +0 -21
- data/test/classes/profile.rb +0 -9
- data/test/classes/sortable_user.rb +0 -11
- data/test/classes/timestamp.rb +0 -3
- data/test/classes/user.rb +0 -39
- data/test/classes/uuid_default_user.rb +0 -12
- data/test/classes/uuid_timestamp.rb +0 -5
- data/test/classes/uuid_user.rb +0 -13
- data/test/dynamic_finders_test.rb +0 -51
- data/test/exceptions_test.rb +0 -47
- data/test/expire_records_test.rb +0 -64
- data/test/has_one_has_many_test.rb +0 -42
- data/test/indices_test.rb +0 -63
- data/test/modules/belongs_to_model_within_module.rb +0 -6
- data/test/modules/has_many_model_within_module.rb +0 -11
- data/test/options_test.rb +0 -226
- data/test/polymorphic_test.rb +0 -65
- data/test/redis.conf +0 -417
- data/test/sortable_test.rb +0 -116
- data/test/test_helper.rb +0 -37
- data/test/uuid_as_id_test.rb +0 -178
- data/test/validations_test.rb +0 -20
data/Rakefile
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
#require 'rubygems'
|
|
2
|
-
require 'rake'
|
|
3
|
-
require 'rake/testtask'
|
|
4
|
-
|
|
5
|
-
#=begin
|
|
6
|
-
require 'echoe'
|
|
7
|
-
|
|
8
|
-
Echoe.new('redis_orm', '0.7') do |p|
|
|
9
|
-
p.description = "ORM for Redis (advanced key-value storage) with ActiveRecord API"
|
|
10
|
-
p.url = "https://github.com/german/redis_orm"
|
|
11
|
-
p.author = "Dmitrii Samoilov"
|
|
12
|
-
p.email = "germaninthetown@gmail.com"
|
|
13
|
-
p.dependencies = ["activesupport >=3.0.0", "activemodel >=3.0.0", "redis >=2.2.0", "uuid >=2.3.2"]
|
|
14
|
-
p.development_dependencies = ["rspec >=2.5.0"]
|
|
15
|
-
end
|
|
16
|
-
#=end
|
|
17
|
-
|
|
18
|
-
task :default => :test
|
|
19
|
-
|
|
20
|
-
desc 'Test the redis_orm functionality'
|
|
21
|
-
Rake::TestTask.new(:test) do |t|
|
|
22
|
-
t.libs << 'lib'
|
|
23
|
-
t.test_files = FileList['test/**/*_test.rb', 'spec/**/*_spec.rb']
|
|
24
|
-
t.verbose = true
|
|
25
|
-
end
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../lib/redis_orm')
|
|
2
|
-
require 'benchmark'
|
|
3
|
-
|
|
4
|
-
class User < RedisOrm::Base
|
|
5
|
-
property :name, String
|
|
6
|
-
property :age, Integer
|
|
7
|
-
property :wage, Float
|
|
8
|
-
|
|
9
|
-
index :name
|
|
10
|
-
index :age
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
class SortableUser < RedisOrm::Base
|
|
14
|
-
property :name, String, :sortable => true
|
|
15
|
-
property :age, Integer, :sortable => true
|
|
16
|
-
property :wage, Float, :sortable => true
|
|
17
|
-
|
|
18
|
-
index :name
|
|
19
|
-
index :age
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
path_to_conf = File.dirname(File.expand_path(__FILE__)) + "/../test/redis.conf"
|
|
23
|
-
$redis_pid = spawn 'redis-server ' + path_to_conf, :out => "/dev/null"
|
|
24
|
-
sleep(0.3) # must be some delay otherwise "Connection refused - Unable to connect to Redis"
|
|
25
|
-
path_to_socket = File.dirname(File.expand_path(__FILE__)) + "/../redis.sock"
|
|
26
|
-
begin
|
|
27
|
-
$redis = Redis.new(:host => 'localhost', :path => path_to_socket)
|
|
28
|
-
rescue => e
|
|
29
|
-
puts 'Unable to create connection to the redis server: ' + e.message.inspect
|
|
30
|
-
Process.kill 9, $redis_pid.to_i if $redis_pid
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
n = 100
|
|
34
|
-
Benchmark.bmbm do |x|
|
|
35
|
-
x.report("creating regular user:") { for i in 1..n; u = User.create(:name => "user#{i}", :age => i, :wage => 100*i); end}
|
|
36
|
-
x.report("creating user w/ sortable attrs:") { for i in 1..n; u = SortableUser.create(:name => "user#{i}", :age => i, :wage => 100*i); end }
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
Benchmark.bmbm do |x|
|
|
40
|
-
x.report("finding regular users:") { User.find(:all, :limit => 5, :offset => 10) }
|
|
41
|
-
x.report("finding users w/ sortable attrs:") { SortableUser.find(:all, :limit => 5, :offset => 10, :order => [:name, :asc]) }
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
$redis.flushall if $redis
|
|
45
|
-
Process.kill 9, $redis_pid.to_i if $redis_pid
|
data/redis_orm.gemspec
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
|
|
3
|
-
Gem::Specification.new do |s|
|
|
4
|
-
s.name = "redis_orm"
|
|
5
|
-
s.version = "0.7"
|
|
6
|
-
|
|
7
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
|
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
|
-
|
|
22
|
-
if s.respond_to? :specification_version then
|
|
23
|
-
s.specification_version = 3
|
|
24
|
-
|
|
25
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
26
|
-
s.add_runtime_dependency(%q<activesupport>, [">= 3.0.0"])
|
|
27
|
-
s.add_runtime_dependency(%q<activemodel>, [">= 3.0.0"])
|
|
28
|
-
s.add_runtime_dependency(%q<redis>, [">= 2.2.0"])
|
|
29
|
-
s.add_runtime_dependency(%q<uuid>, [">= 2.3.2"])
|
|
30
|
-
s.add_development_dependency(%q<rspec>, [">= 2.5.0"])
|
|
31
|
-
else
|
|
32
|
-
s.add_dependency(%q<activesupport>, [">= 3.0.0"])
|
|
33
|
-
s.add_dependency(%q<activemodel>, [">= 3.0.0"])
|
|
34
|
-
s.add_dependency(%q<redis>, [">= 2.2.0"])
|
|
35
|
-
s.add_dependency(%q<uuid>, [">= 2.3.2"])
|
|
36
|
-
s.add_dependency(%q<rspec>, [">= 2.5.0"])
|
|
37
|
-
end
|
|
38
|
-
else
|
|
39
|
-
s.add_dependency(%q<activesupport>, [">= 3.0.0"])
|
|
40
|
-
s.add_dependency(%q<activemodel>, [">= 3.0.0"])
|
|
41
|
-
s.add_dependency(%q<redis>, [">= 2.2.0"])
|
|
42
|
-
s.add_dependency(%q<uuid>, [">= 2.3.2"])
|
|
43
|
-
s.add_dependency(%q<rspec>, [">= 2.5.0"])
|
|
44
|
-
end
|
|
45
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
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
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
require File.dirname(File.expand_path(__FILE__)) + '/test_helper.rb'
|
|
2
|
-
|
|
3
|
-
describe "check indices for associations" do
|
|
4
|
-
before(:each) do
|
|
5
|
-
@article = Article.new :title => "DHH drops OpenID on 37signals"
|
|
6
|
-
@article.save
|
|
7
|
-
|
|
8
|
-
@article.should be
|
|
9
|
-
@article.title.should == "DHH drops OpenID on 37signals"
|
|
10
|
-
|
|
11
|
-
@comment1 = Comment.new :body => "test"
|
|
12
|
-
@comment1.save
|
|
13
|
-
@comment1.should be
|
|
14
|
-
@comment1.body.should == "test"
|
|
15
|
-
@comment1.moderated.should == false
|
|
16
|
-
|
|
17
|
-
@comment2 = Comment.new :body => "test #2", :moderated => true
|
|
18
|
-
@comment2.save
|
|
19
|
-
@comment2.should be
|
|
20
|
-
@comment2.body.should == "test #2"
|
|
21
|
-
@comment2.moderated.should == true
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
it "should properly find associated records (e.g. with :conditions, :order, etc options) '<<' used for association" do
|
|
25
|
-
@article.comments << [@comment1, @comment2]
|
|
26
|
-
@article.comments.count.should == 2
|
|
27
|
-
|
|
28
|
-
@article.comments.all(:limit => 1).size.should == 1
|
|
29
|
-
@article.comments.find(:first).should be
|
|
30
|
-
@article.comments.find(:first).id.should == @comment1.id
|
|
31
|
-
@article.comments.find(:last).should be
|
|
32
|
-
@article.comments.find(:last).id.should == @comment2.id
|
|
33
|
-
|
|
34
|
-
@article.comments.find(:all, :conditions => {:moderated => true}).size.should == 1
|
|
35
|
-
@article.comments.find(:all, :conditions => {:moderated => false}).size.should == 1
|
|
36
|
-
@article.comments.find(:all, :conditions => {:moderated => true})[0].id.should == @comment2.id
|
|
37
|
-
@article.comments.find(:all, :conditions => {:moderated => false})[0].id.should == @comment1.id
|
|
38
|
-
|
|
39
|
-
@article.comments.find(:all, :conditions => {:moderated => true}, :limit => 1).size.should == 1
|
|
40
|
-
@article.comments.find(:all, :conditions => {:moderated => false}, :limit => 1).size.should == 1
|
|
41
|
-
@article.comments.find(:all, :conditions => {:moderated => true}, :limit => 1)[0].id.should == @comment2.id
|
|
42
|
-
@article.comments.find(:all, :conditions => {:moderated => false}, :limit => 1)[0].id.should == @comment1.id
|
|
43
|
-
|
|
44
|
-
@article.comments.find(:all, :conditions => {:moderated => true}, :limit => 1, :order => :desc).size.should == 1
|
|
45
|
-
@article.comments.find(:all, :conditions => {:moderated => false}, :limit => 1, :order => :asc).size.should == 1
|
|
46
|
-
@article.comments.find(:all, :conditions => {:moderated => true}, :limit => 1, :order => :desc)[0].id.should == @comment2.id
|
|
47
|
-
@article.comments.find(:all, :conditions => {:moderated => false}, :limit => 1, :order => :asc)[0].id.should == @comment1.id
|
|
48
|
-
|
|
49
|
-
@comment1.update_attribute :moderated, true
|
|
50
|
-
@article.comments.find(:all, :conditions => {:moderated => true}).size.should == 2
|
|
51
|
-
@article.comments.find(:all, :conditions => {:moderated => false}).size.should == 0
|
|
52
|
-
|
|
53
|
-
@comment1.destroy
|
|
54
|
-
$redis.zrange("article:#{@article.id}:comments:moderated:true", 0, -1).size.should == 1
|
|
55
|
-
$redis.zrange("article:#{@article.id}:comments:moderated:true", 0, -1)[0].should == @comment2.id.to_s
|
|
56
|
-
$redis.zrange("article:#{@article.id}:comments:moderated:false", 0, -1).size.should == 0
|
|
57
|
-
@article.comments.find(:all, :conditions => {:moderated => true}).size.should == 1
|
|
58
|
-
@article.comments.find(:all, :conditions => {:moderated => false}).size.should == 0
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
it "should properly find associated records (e.g. with :conditions, :order, etc options) '=' used for association" do
|
|
62
|
-
@article.comments = [@comment1, @comment2]
|
|
63
|
-
@article.comments.count.should == 2
|
|
64
|
-
|
|
65
|
-
@article.comments.all(:limit => 1).size.should == 1
|
|
66
|
-
@article.comments.find(:first).should be
|
|
67
|
-
@article.comments.find(:first).id.should == @comment1.id
|
|
68
|
-
@article.comments.find(:last).should be
|
|
69
|
-
@article.comments.find(:last).id.should == @comment2.id
|
|
70
|
-
|
|
71
|
-
@article.comments.find(:all, :conditions => {:moderated => true}).size.should == 1
|
|
72
|
-
@article.comments.find(:all, :conditions => {:moderated => false}).size.should == 1
|
|
73
|
-
@article.comments.find(:all, :conditions => {:moderated => true})[0].id.should == @comment2.id
|
|
74
|
-
@article.comments.find(:all, :conditions => {:moderated => false})[0].id.should == @comment1.id
|
|
75
|
-
|
|
76
|
-
@article.comments.find(:all, :conditions => {:moderated => true}, :limit => 1).size.should == 1
|
|
77
|
-
@article.comments.find(:all, :conditions => {:moderated => false}, :limit => 1).size.should == 1
|
|
78
|
-
@article.comments.find(:all, :conditions => {:moderated => true}, :limit => 1)[0].id.should == @comment2.id
|
|
79
|
-
@article.comments.find(:all, :conditions => {:moderated => false}, :limit => 1)[0].id.should == @comment1.id
|
|
80
|
-
|
|
81
|
-
@article.comments.find(:all, :conditions => {:moderated => true}, :limit => 1, :order => :desc).size.should == 1
|
|
82
|
-
@article.comments.find(:all, :conditions => {:moderated => false}, :limit => 1, :order => :asc).size.should == 1
|
|
83
|
-
@article.comments.find(:all, :conditions => {:moderated => true}, :limit => 1, :order => :desc)[0].id.should == @comment2.id
|
|
84
|
-
@article.comments.find(:all, :conditions => {:moderated => false}, :limit => 1, :order => :asc)[0].id.should == @comment1.id
|
|
85
|
-
|
|
86
|
-
@comment1.update_attribute :moderated, true
|
|
87
|
-
@article.comments.find(:all, :conditions => {:moderated => true}).size.should == 2
|
|
88
|
-
@article.comments.find(:all, :conditions => {:moderated => false}).size.should == 0
|
|
89
|
-
|
|
90
|
-
@comment1.destroy
|
|
91
|
-
@article.comments.find(:all, :conditions => {:moderated => true}).size.should == 1
|
|
92
|
-
@article.comments.find(:all, :conditions => {:moderated => false}).size.should == 0
|
|
93
|
-
$redis.zrange("article:#{@article.id}:comments:moderated:true", 0, -1).size.should == 1
|
|
94
|
-
$redis.zrange("article:#{@article.id}:comments:moderated:true", 0, -1)[0].should == @comment2.id.to_s
|
|
95
|
-
$redis.zrange("article:#{@article.id}:comments:moderated:false", 0, -1).size.should == 0
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
it "should check compound indices for associations" do
|
|
99
|
-
friend1 = User.create :name => "Director", :moderator => true, :moderated_area => "films"
|
|
100
|
-
friend2 = User.create :name => "Admin", :moderator => true, :moderated_area => "all"
|
|
101
|
-
friend3 = User.create :name => "Gena", :moderator => false
|
|
102
|
-
|
|
103
|
-
me = User.create :name => "german"
|
|
104
|
-
|
|
105
|
-
me.friends << [friend1, friend2, friend3]
|
|
106
|
-
|
|
107
|
-
me.friends.count.should == 3
|
|
108
|
-
me.friends.find(:all, :conditions => {:moderator => true}).size.should == 2
|
|
109
|
-
me.friends.find(:all, :conditions => {:moderator => false}).size.should == 1
|
|
110
|
-
|
|
111
|
-
me.friends.find(:all, :conditions => {:moderator => true, :moderated_area => "films"}).size.should == 1
|
|
112
|
-
me.friends.find(:all, :conditions => {:moderator => true, :moderated_area => "films"})[0].id.should == friend1.id
|
|
113
|
-
|
|
114
|
-
# reverse key's order in :conditions hash
|
|
115
|
-
me.friends.find(:all, :conditions => {:moderated_area => "all", :moderator => true}).size.should == 1
|
|
116
|
-
me.friends.find(:all, :conditions => {:moderated_area => "all", :moderator => true})[0].id.should == friend2.id
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# TODO check that index assoc shouldn't be created while no assoc_record is provided
|
|
120
|
-
|
|
121
|
-
it "should return first model if it exists, when conditions contain associated object" do
|
|
122
|
-
user = User.create :name => "Dmitrii Samoilov", :age => 99, :wage => 35_000, :first_name => "Dmitrii", :last_name => "Samoilov"
|
|
123
|
-
note = Note.create :body => "a test to test"
|
|
124
|
-
note2 = Note.create :body => "aero"
|
|
125
|
-
|
|
126
|
-
note.owner = user
|
|
127
|
-
|
|
128
|
-
User.count.should == 1
|
|
129
|
-
Note.count.should == 2
|
|
130
|
-
$redis.zcard("note:owner:1").should == 1
|
|
131
|
-
note.owner.should == user
|
|
132
|
-
Note.find(:all, :conditions => {:owner => user}).should == [note]
|
|
133
|
-
Note.find(:first, :conditions => {:owner => user}).should == note
|
|
134
|
-
|
|
135
|
-
note.owner = nil
|
|
136
|
-
Note.find(:all, :conditions => {:owner => user}).should == []
|
|
137
|
-
Note.find(:first, :conditions => {:owner => user}).should == nil
|
|
138
|
-
$redis.zcard("note:owner:1").should == 0
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
it "should return first model if it exists when conditions contain associated object (belongs_to assoc established when creating object)" do
|
|
142
|
-
user = User.create :name => "Dmitrii Samoilov", :age => 99, :wage => 35_000, :first_name => "Dmitrii", :last_name => "Samoilov"
|
|
143
|
-
note = Note.create :body => "a test to test", :owner => user
|
|
144
|
-
Note.create :body => "aero" # just test what would *find* return if 2 exemplars of Note are created
|
|
145
|
-
|
|
146
|
-
User.count.should == 1
|
|
147
|
-
Note.count.should == 2
|
|
148
|
-
|
|
149
|
-
note.owner.should == user
|
|
150
|
-
|
|
151
|
-
Note.find(:all, :conditions => {:owner => user}).should == [note]
|
|
152
|
-
Note.find(:first, :conditions => {:owner => user}).should == note
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
it "should return first model if it exists when conditions contain associated object (has_one assoc established when creating object)" do
|
|
156
|
-
profile = Profile.create :title => "a test to test", :name => "german"
|
|
157
|
-
user = User.create :name => "Dmitrii Samoilov", :age => 99, :wage => 35_000, :first_name => "Dmitrii", :last_name => "Samoilov", :profile => profile
|
|
158
|
-
User.create :name => "Warren Buffet", :age => 399, :wage => 12_235_000, :first_name => "Warren", :last_name => "Buffet"
|
|
159
|
-
|
|
160
|
-
User.count.should == 2
|
|
161
|
-
Profile.count.should == 1
|
|
162
|
-
|
|
163
|
-
profile.user.should == user
|
|
164
|
-
|
|
165
|
-
User.find(:all, :conditions => {:profile => profile}).should == [user]
|
|
166
|
-
User.find(:first, :conditions => {:profile => profile}).should == user
|
|
167
|
-
end
|
|
168
|
-
end
|
data/test/associations_test.rb
DELETED
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
require File.dirname(File.expand_path(__FILE__)) + '/test_helper.rb'
|
|
2
|
-
|
|
3
|
-
describe "check associations" do
|
|
4
|
-
before(:each) do
|
|
5
|
-
@article = Article.new :title => "DHH drops OpenID on 37signals"
|
|
6
|
-
@article.save
|
|
7
|
-
|
|
8
|
-
@article.should be
|
|
9
|
-
@article.title.should == "DHH drops OpenID on 37signals"
|
|
10
|
-
|
|
11
|
-
@comment1 = Comment.new :body => "test"
|
|
12
|
-
@comment1.save
|
|
13
|
-
@comment1.should be
|
|
14
|
-
@comment1.body.should == "test"
|
|
15
|
-
|
|
16
|
-
@comment2 = Comment.new :body => "test #2"
|
|
17
|
-
@comment2.save
|
|
18
|
-
@comment2.should be
|
|
19
|
-
@comment2.body.should == "test #2"
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it "should assign properly from belongs_to side" do
|
|
23
|
-
@comment1.article.should == nil
|
|
24
|
-
@comment1.article = @article
|
|
25
|
-
@comment1.article.id.should == @article.id
|
|
26
|
-
@article.comments.count.should == 1
|
|
27
|
-
@article.comments[0].id.should == @comment1.id
|
|
28
|
-
|
|
29
|
-
@comment2.article.should == nil
|
|
30
|
-
@comment2.article = @article
|
|
31
|
-
@comment2.article.id.should == @article.id
|
|
32
|
-
@article.comments.count.should == 2
|
|
33
|
-
@article.comments[0].id.should == @comment2.id
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "should correctly resets associations when nil/[] provided" do
|
|
37
|
-
# from has_many proxy side
|
|
38
|
-
@article.comments << [@comment1, @comment2]
|
|
39
|
-
@article.comments.count.should == 2
|
|
40
|
-
@comment1.article.id.should == @article.id
|
|
41
|
-
@comment2.article.id.should == @article.id
|
|
42
|
-
|
|
43
|
-
# clear
|
|
44
|
-
@article.comments = []
|
|
45
|
-
@article.comments.count.should == 0
|
|
46
|
-
@comment1.article.should == nil
|
|
47
|
-
@comment2.article.should == nil
|
|
48
|
-
|
|
49
|
-
# from belongs_to side
|
|
50
|
-
@article.comments << [@comment1, @comment2]
|
|
51
|
-
@article.comments.count.should == 2
|
|
52
|
-
@comment1.article.id.should == @article.id
|
|
53
|
-
|
|
54
|
-
# clear
|
|
55
|
-
@comment1.article = nil
|
|
56
|
-
@article.comments.count.should == 1
|
|
57
|
-
@comment1.article.should == nil
|
|
58
|
-
|
|
59
|
-
# from has_one side
|
|
60
|
-
profile = Profile.create :title => "test"
|
|
61
|
-
chicago = City.create :name => "Chicago"
|
|
62
|
-
|
|
63
|
-
profile.city = chicago
|
|
64
|
-
profile.city.name.should == "Chicago"
|
|
65
|
-
chicago.profiles.count.should == 1
|
|
66
|
-
chicago.profiles[0].id.should == profile.id
|
|
67
|
-
|
|
68
|
-
# clear
|
|
69
|
-
profile.city = nil
|
|
70
|
-
profile.city.should == nil
|
|
71
|
-
chicago.profiles.count.should == 0
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it "should return array of records for has_many association" do
|
|
75
|
-
@article.comments << []
|
|
76
|
-
@article.comments.count.should == 0
|
|
77
|
-
|
|
78
|
-
@article.comments = []
|
|
79
|
-
@article.comments.count.should == 0
|
|
80
|
-
|
|
81
|
-
@article.comments << [@comment1, @comment2]
|
|
82
|
-
#@article.comments.should be_kind_of(Array)
|
|
83
|
-
|
|
84
|
-
@article.comments.count.should == 2
|
|
85
|
-
@article.comments.size.should == 2
|
|
86
|
-
|
|
87
|
-
@comment1.article.should be
|
|
88
|
-
@comment2.article.should be
|
|
89
|
-
|
|
90
|
-
@comment1.article.id.should == @comment2.article.id
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
it "should behave as active_record (proxy couldn't return records w/o #all call) += and << behave differently" do
|
|
94
|
-
@article.comments << @comment1 << @comment2
|
|
95
|
-
@article.comments.count.should == 2
|
|
96
|
-
|
|
97
|
-
comments = @article.comments
|
|
98
|
-
comments.count.should == 2
|
|
99
|
-
|
|
100
|
-
comments = []
|
|
101
|
-
comments += @article.comments
|
|
102
|
-
comments.count.should == 2
|
|
103
|
-
comments.collect{|c| c.id}.should include(@comment1.id)
|
|
104
|
-
comments.collect{|c| c.id}.should include(@comment2.id)
|
|
105
|
-
|
|
106
|
-
comments = []
|
|
107
|
-
comments << @article.comments.all
|
|
108
|
-
comments.flatten.count.should == 2
|
|
109
|
-
|
|
110
|
-
comments = []
|
|
111
|
-
comments << @article.comments
|
|
112
|
-
comments.count.should == 1
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it "should return 1 comment when second was deleted" do
|
|
116
|
-
Comment.count.should == 2
|
|
117
|
-
@article.comments << [@comment1, @comment2]
|
|
118
|
-
#@article.comments.should be_kind_of(Array)
|
|
119
|
-
@article.comments.size.should == 2
|
|
120
|
-
|
|
121
|
-
@comment1.destroy
|
|
122
|
-
|
|
123
|
-
@article.comments.size.should == 1
|
|
124
|
-
@article.comments.count.should == 1
|
|
125
|
-
Comment.count.should == 1
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
it "should leave associations when parent has been deleted (nullify assocs)" do
|
|
129
|
-
Comment.count.should == 2
|
|
130
|
-
@article.comments << [@comment1, @comment2]
|
|
131
|
-
@comment1.article.id.should == @article.id
|
|
132
|
-
@comment2.article.id.should == @article.id
|
|
133
|
-
#@article.comments.should be_kind_of(Array)
|
|
134
|
-
@article.comments.size.should == 2
|
|
135
|
-
@article.comments.count.should == 2
|
|
136
|
-
|
|
137
|
-
@article.destroy
|
|
138
|
-
|
|
139
|
-
Article.count.should == 0
|
|
140
|
-
Comment.count.should == 2
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
it "should replace associations when '=' is used instead of '<<' " do
|
|
144
|
-
Comment.count.should == 2
|
|
145
|
-
@article.comments << [@comment1, @comment2]
|
|
146
|
-
@comment1.article.id.should == @article.id
|
|
147
|
-
@comment2.article.id.should == @article.id
|
|
148
|
-
@article.comments.size.should == 2
|
|
149
|
-
@article.comments.count.should == 2
|
|
150
|
-
|
|
151
|
-
@article.comments = [@comment1]
|
|
152
|
-
@article.comments.count.should == 1
|
|
153
|
-
@article.comments.first.id.should == @comment1.id
|
|
154
|
-
|
|
155
|
-
@comment1.article.id.should == @article.id
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
it "should correctly use many-to-many associations both with '=' and '<<' " do
|
|
159
|
-
@cat1 = Category.create :name => "Nature"
|
|
160
|
-
@cat2 = Category.create :name => "Art"
|
|
161
|
-
@cat3 = Category.create :name => "Web"
|
|
162
|
-
|
|
163
|
-
@cat1.name.should == "Nature"
|
|
164
|
-
@cat2.name.should == "Art"
|
|
165
|
-
@cat3.name.should == "Web"
|
|
166
|
-
|
|
167
|
-
@article.categories << [@cat1, @cat2]
|
|
168
|
-
|
|
169
|
-
@cat1.articles.count.should == 1
|
|
170
|
-
@cat1.articles[0].should == @article
|
|
171
|
-
@cat2.articles.count.should == 1
|
|
172
|
-
@cat2.articles[0].should == @article
|
|
173
|
-
|
|
174
|
-
@article.categories.size.should == 2
|
|
175
|
-
@article.categories.count.should == 2
|
|
176
|
-
|
|
177
|
-
@article.categories = [@cat1, @cat3]
|
|
178
|
-
@article.categories.count.should == 2
|
|
179
|
-
@article.categories.map{|c| c.id}.include?(@cat1.id).should be
|
|
180
|
-
@article.categories.map{|c| c.id}.include?(@cat3.id).should be
|
|
181
|
-
|
|
182
|
-
@cat1.articles.count.should == 1
|
|
183
|
-
@cat1.articles[0].should == @article
|
|
184
|
-
|
|
185
|
-
@cat3.articles.count.should == 1
|
|
186
|
-
@cat3.articles[0].should == @article
|
|
187
|
-
|
|
188
|
-
@cat2.articles.count.should == 0
|
|
189
|
-
|
|
190
|
-
@cat1.destroy
|
|
191
|
-
Category.count.should == 2
|
|
192
|
-
@article.categories.count.should == 1
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
it "should remove old associations and create new ones" do
|
|
196
|
-
profile = Profile.new
|
|
197
|
-
profile.title = "test"
|
|
198
|
-
profile.save
|
|
199
|
-
|
|
200
|
-
chicago = City.new
|
|
201
|
-
chicago.name = "Chicago"
|
|
202
|
-
chicago.save
|
|
203
|
-
|
|
204
|
-
washington = City.new
|
|
205
|
-
washington.name = "Washington"
|
|
206
|
-
washington.save
|
|
207
|
-
|
|
208
|
-
profile.city = chicago
|
|
209
|
-
profile.city.name.should == "Chicago"
|
|
210
|
-
chicago.profiles.count.should == 1
|
|
211
|
-
washington.profiles.count.should == 0
|
|
212
|
-
chicago.profiles[0].id.should == profile.id
|
|
213
|
-
|
|
214
|
-
profile.city = washington
|
|
215
|
-
profile.city.name.should == "Washington"
|
|
216
|
-
chicago.profiles.count.should == 0
|
|
217
|
-
washington.profiles.count.should == 1
|
|
218
|
-
washington.profiles[0].id.should == profile.id
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
it "should maintain correct self referencing link" do
|
|
222
|
-
me = User.create :name => "german"
|
|
223
|
-
friend1 = User.create :name => "friend1"
|
|
224
|
-
friend2 = User.create :name => "friend2"
|
|
225
|
-
|
|
226
|
-
me.friends << [friend1, friend2]
|
|
227
|
-
|
|
228
|
-
me.friends.count.should == 2
|
|
229
|
-
friend1.friends.count.should == 0
|
|
230
|
-
friend2.friends.count.should == 0
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
it "should delete one specific record from an array with associated records" do
|
|
234
|
-
me = User.create :name => "german"
|
|
235
|
-
friend1 = User.create :name => "friend1"
|
|
236
|
-
friend2 = User.create :name => "friend2"
|
|
237
|
-
|
|
238
|
-
me.friends << [friend1, friend2]
|
|
239
|
-
|
|
240
|
-
me = User.find_by_name 'german'
|
|
241
|
-
me.friends.count.should == 2
|
|
242
|
-
friend1 = User.find_by_name 'friend1'
|
|
243
|
-
friend1.friends.count.should == 0
|
|
244
|
-
friend2 = User.find_by_name 'friend2'
|
|
245
|
-
friend2.friends.count.should == 0
|
|
246
|
-
|
|
247
|
-
me.friends.delete(friend1.id)
|
|
248
|
-
me.friends.count.should == 1
|
|
249
|
-
me.friends[0].id == friend2.id
|
|
250
|
-
User.count.should == 3
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
it "should create self-referencing link for has_one association" do
|
|
254
|
-
m = Message.create :text => "it should create self-referencing link for has_one association"
|
|
255
|
-
|
|
256
|
-
r = Message.create :text => "replay"
|
|
257
|
-
|
|
258
|
-
r.replay_to = m
|
|
259
|
-
|
|
260
|
-
Message.count.should == 2
|
|
261
|
-
r.replay_to.should be
|
|
262
|
-
r.replay_to.id.should == m.id
|
|
263
|
-
|
|
264
|
-
rf = Message.last
|
|
265
|
-
rf.replay_to.should be
|
|
266
|
-
rf.replay_to.id.should == Message.first.id
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
it "should find associations within modules" do
|
|
270
|
-
BelongsToModelWithinModule::Reply.count.should == 0
|
|
271
|
-
essay = Article.create :title => "Red is cluster"
|
|
272
|
-
BelongsToModelWithinModule::Reply.create :essay => essay
|
|
273
|
-
BelongsToModelWithinModule::Reply.count.should == 1
|
|
274
|
-
reply = BelongsToModelWithinModule::Reply.last
|
|
275
|
-
reply.essay.should == essay
|
|
276
|
-
|
|
277
|
-
HasManyModelWithinModule::SpecialComment.count.should == 0
|
|
278
|
-
book = HasManyModelWithinModule::Brochure.create :title => "Red is unstable"
|
|
279
|
-
HasManyModelWithinModule::SpecialComment.create :book => book
|
|
280
|
-
HasManyModelWithinModule::Brochure.count.should == 1
|
|
281
|
-
HasManyModelWithinModule::SpecialComment.count.should == 1
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
it "should properly handle self-referencing model both belongs_to and has_many/has_one associations" do
|
|
285
|
-
comment1 = Comment.create :body => "comment1"
|
|
286
|
-
comment11 = Comment.create :body => "comment1.1"
|
|
287
|
-
comment12 = Comment.create :body => "comment1.2"
|
|
288
|
-
|
|
289
|
-
comment1.replies = [comment11, comment12]
|
|
290
|
-
comment1.replies.count.should == 2
|
|
291
|
-
comment11.reply_to.should == comment1
|
|
292
|
-
comment12.reply_to.should == comment1
|
|
293
|
-
end
|
|
294
|
-
end
|