squeel 1.0.8 → 1.0.9
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/CHANGELOG.md +4 -0
- data/lib/squeel/adapters/active_record/3.0/compat.rb +30 -0
- data/lib/squeel/version.rb +1 -1
- data/spec/console.rb +4 -2
- data/spec/spec_helper.rb +5 -3
- data/spec/squeel/adapters/active_record/relation_extensions_spec.rb +14 -1
- data/spec/support/models.rb +99 -0
- data/spec/support/schema.rb +38 -132
- metadata +6 -4
data/CHANGELOG.md
CHANGED
@@ -16,6 +16,36 @@ module Arel
|
|
16
16
|
::Arel::Attribute.new self, name.to_sym
|
17
17
|
end
|
18
18
|
end
|
19
|
+
|
20
|
+
def hash
|
21
|
+
[name, engine].hash
|
22
|
+
end
|
23
|
+
|
24
|
+
def eql?(other)
|
25
|
+
self.class == other.class &&
|
26
|
+
self.name == other.name &&
|
27
|
+
self.engine == other.engine
|
28
|
+
end
|
29
|
+
alias :== :eql?
|
30
|
+
end
|
31
|
+
|
32
|
+
module Attributes
|
33
|
+
|
34
|
+
class Attribute < Attribute.superclass
|
35
|
+
|
36
|
+
def hash
|
37
|
+
[relation, name].hash
|
38
|
+
end
|
39
|
+
|
40
|
+
def eql?(other)
|
41
|
+
self.class == other.class &&
|
42
|
+
self.relation == other.relation &&
|
43
|
+
self.name == other.name
|
44
|
+
end
|
45
|
+
alias :== :eql?
|
46
|
+
|
47
|
+
end
|
48
|
+
|
19
49
|
end
|
20
50
|
|
21
51
|
module Nodes
|
data/lib/squeel/version.rb
CHANGED
data/spec/console.rb
CHANGED
@@ -3,9 +3,11 @@ require 'machinist/active_record'
|
|
3
3
|
require 'sham'
|
4
4
|
require 'faker'
|
5
5
|
|
6
|
-
Dir[File.expand_path('
|
6
|
+
Dir[File.expand_path('../helpers/*.rb', __FILE__)].each do |f|
|
7
7
|
require f
|
8
8
|
end
|
9
|
+
require File.expand_path('../support/schema.rb', __FILE__)
|
10
|
+
require File.expand_path('../support/models.rb', __FILE__)
|
9
11
|
|
10
12
|
Sham.define do
|
11
13
|
name { Faker::Name.name }
|
@@ -17,7 +19,7 @@ Sham.define do
|
|
17
19
|
object_name { Faker::Lorem.words(1).first }
|
18
20
|
end
|
19
21
|
|
20
|
-
|
22
|
+
Models.make
|
21
23
|
|
22
24
|
require 'squeel'
|
23
25
|
|
data/spec/spec_helper.rb
CHANGED
@@ -26,9 +26,11 @@ module ActiveRecord
|
|
26
26
|
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
|
27
27
|
end
|
28
28
|
|
29
|
-
Dir[File.expand_path('../
|
29
|
+
Dir[File.expand_path('../helpers/*.rb', __FILE__)].each do |f|
|
30
30
|
require f
|
31
31
|
end
|
32
|
+
require File.expand_path('../support/schema.rb', __FILE__)
|
33
|
+
require File.expand_path('../support/models.rb', __FILE__)
|
32
34
|
|
33
35
|
Sham.define do
|
34
36
|
name { Faker::Name.name }
|
@@ -45,7 +47,7 @@ RSpec.configure do |config|
|
|
45
47
|
puts '=' * 80
|
46
48
|
puts "Running specs against ActiveRecord #{ActiveRecord::VERSION::STRING} and ARel #{Arel::VERSION}..."
|
47
49
|
puts '=' * 80
|
48
|
-
|
50
|
+
Models.make
|
49
51
|
end
|
50
52
|
config.before(:all) { Sham.reset(:before_all) }
|
51
53
|
config.before(:each) { Sham.reset(:before_each) }
|
@@ -64,4 +66,4 @@ require 'squeel'
|
|
64
66
|
|
65
67
|
Squeel.configure do |config|
|
66
68
|
config.load_core_extensions :hash, :symbol
|
67
|
-
end
|
69
|
+
end
|
@@ -754,7 +754,20 @@ module Squeel
|
|
754
754
|
|
755
755
|
it "doesn't ruin everything when a group exists" do
|
756
756
|
relation = Person.scoped.merge(Person.group{name})
|
757
|
-
count_hash =
|
757
|
+
count_hash = {}
|
758
|
+
expect { count_hash = relation.count }.should_not raise_error
|
759
|
+
count_hash.size.should eq Person.scoped.size
|
760
|
+
count_hash.values.all? {|v| v == 1}.should be_true
|
761
|
+
count_hash.keys.should =~ Person.select{name}.map(&:name)
|
762
|
+
end
|
763
|
+
|
764
|
+
it "doesn't merge the default scope more than once" do
|
765
|
+
relation = PersonNamedBill.scoped.highly_compensated.ending_with_ill
|
766
|
+
sql = relation.to_sql
|
767
|
+
sql.scan(/"people"."name" = 'Bill'/).should have(1).item
|
768
|
+
sql.scan(/"people"."name" LIKE '%ill'/).should have(1).item
|
769
|
+
sql.scan(/"people"."salary" > 200000/).should have(1).item
|
770
|
+
sql.scan(/"people"."id"/).should have(1).item
|
758
771
|
end
|
759
772
|
|
760
773
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
class Person < ActiveRecord::Base
|
2
|
+
belongs_to :parent, :class_name => 'Person', :foreign_key => :parent_id
|
3
|
+
has_many :children, :class_name => 'Person', :foreign_key => :parent_id
|
4
|
+
has_many :articles
|
5
|
+
has_many :articles_with_condition, :class_name => 'Article', :conditions => {:title => 'Condition'}
|
6
|
+
has_many :comments
|
7
|
+
has_many :condition_article_comments, :through => :articles_with_condition, :source => :comments
|
8
|
+
has_many :authored_article_comments, :through => :articles,
|
9
|
+
:source => :comments
|
10
|
+
has_many :notes, :as => :notable
|
11
|
+
has_many :unidentified_objects
|
12
|
+
|
13
|
+
has_many :outgoing_messages, :class_name => 'Message', :foreign_key => :author_id
|
14
|
+
has_many :incoming_messages, :class_name => 'Message', :foreign_key => :recipient_id
|
15
|
+
|
16
|
+
scope :nil_scope, lambda { nil }
|
17
|
+
|
18
|
+
sifter :name_starts_or_ends_with do |value|
|
19
|
+
(name =~ "#{value}%") | (name =~ "%#{value}")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class PersonWithNamePrimaryKey < ActiveRecord::Base
|
24
|
+
set_primary_key 'name'
|
25
|
+
# Set this second, because I'm lazy and don't want to populate another table,
|
26
|
+
# and also don't want to clobber the AR connection's primary_key cache.
|
27
|
+
set_table_name 'people'
|
28
|
+
end
|
29
|
+
|
30
|
+
class PersonNamedBill < ActiveRecord::Base
|
31
|
+
self.table_name = 'people'
|
32
|
+
belongs_to :parent, :class_name => 'Person', :foreign_key => :parent_id
|
33
|
+
default_scope where{name == 'Bill'}.order{id}
|
34
|
+
scope :highly_compensated, where{salary > 200000}
|
35
|
+
scope :ending_with_ill, where{name =~ '%ill'}
|
36
|
+
end
|
37
|
+
|
38
|
+
class Message < ActiveRecord::Base
|
39
|
+
belongs_to :author, :class_name => 'Person'
|
40
|
+
belongs_to :recipient, :class_name => 'Person'
|
41
|
+
end
|
42
|
+
|
43
|
+
class UnidentifiedObject < ActiveRecord::Base
|
44
|
+
belongs_to :person
|
45
|
+
end
|
46
|
+
|
47
|
+
class Article < ActiveRecord::Base
|
48
|
+
belongs_to :person
|
49
|
+
has_many :comments
|
50
|
+
has_and_belongs_to_many :tags
|
51
|
+
has_many :notes, :as => :notable
|
52
|
+
has_many :commenters, :through => :comments, :source => :person
|
53
|
+
has_many :uniq_commenters, :through => :comments, :source => :person, :uniq => true
|
54
|
+
end
|
55
|
+
|
56
|
+
class Comment < ActiveRecord::Base
|
57
|
+
belongs_to :article
|
58
|
+
belongs_to :person
|
59
|
+
end
|
60
|
+
|
61
|
+
class Tag < ActiveRecord::Base
|
62
|
+
has_and_belongs_to_many :articles
|
63
|
+
end
|
64
|
+
|
65
|
+
class Note < ActiveRecord::Base
|
66
|
+
belongs_to :notable, :polymorphic => true
|
67
|
+
end
|
68
|
+
|
69
|
+
Dir[File.expand_path('../../blueprints/*.rb', __FILE__)].each do |f|
|
70
|
+
require f
|
71
|
+
end
|
72
|
+
|
73
|
+
class Models
|
74
|
+
def self.make
|
75
|
+
10.times do
|
76
|
+
person = Person.make
|
77
|
+
2.times do
|
78
|
+
UnidentifiedObject.create(:person => person, :name => Sham.object_name)
|
79
|
+
end
|
80
|
+
Note.make(:notable => person)
|
81
|
+
3.times do
|
82
|
+
article = Article.make(:person => person)
|
83
|
+
3.times do
|
84
|
+
article.tags = [Tag.make, Tag.make, Tag.make]
|
85
|
+
end
|
86
|
+
Note.make(:notable => article)
|
87
|
+
10.times do
|
88
|
+
Comment.make(:article => article)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
2.times do
|
92
|
+
Comment.make(:person => person)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
Comment.make(:body => 'First post!', :article => Article.make(:title => 'Hello, world!'))
|
97
|
+
Comment.make(:body => 'Last post!', :article => Article.first, :person => Article.first.commenters.first)
|
98
|
+
end
|
99
|
+
end
|
data/spec/support/schema.rb
CHANGED
@@ -6,147 +6,53 @@ ActiveRecord::Base.establish_connection(
|
|
6
6
|
:database => ':memory:'
|
7
7
|
)
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
has_many :notes, :as => :notable
|
19
|
-
has_many :unidentified_objects
|
20
|
-
|
21
|
-
has_many :outgoing_messages, :class_name => 'Message', :foreign_key => :author_id
|
22
|
-
has_many :incoming_messages, :class_name => 'Message', :foreign_key => :recipient_id
|
23
|
-
|
24
|
-
scope :nil_scope, lambda { nil }
|
25
|
-
|
26
|
-
sifter :name_starts_or_ends_with do |value|
|
27
|
-
(name =~ "#{value}%") | (name =~ "%#{value}")
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
class PersonWithNamePrimaryKey < ActiveRecord::Base
|
32
|
-
set_primary_key 'name'
|
33
|
-
# Set this second, because I'm lazy and don't want to populate another table,
|
34
|
-
# and also don't want to clobber the AR connection's primary_key cache.
|
35
|
-
set_table_name 'people'
|
36
|
-
end
|
37
|
-
|
38
|
-
class PersonNamedBill < ActiveRecord::Base
|
39
|
-
self.table_name = 'people'
|
40
|
-
belongs_to :parent, :class_name => 'Person', :foreign_key => :parent_id
|
41
|
-
default_scope where{name == 'Bill'}
|
42
|
-
end
|
43
|
-
|
44
|
-
class Message < ActiveRecord::Base
|
45
|
-
belongs_to :author, :class_name => 'Person'
|
46
|
-
belongs_to :recipient, :class_name => 'Person'
|
47
|
-
end
|
48
|
-
|
49
|
-
class UnidentifiedObject < ActiveRecord::Base
|
50
|
-
belongs_to :person
|
51
|
-
end
|
52
|
-
|
53
|
-
class Article < ActiveRecord::Base
|
54
|
-
belongs_to :person
|
55
|
-
has_many :comments
|
56
|
-
has_and_belongs_to_many :tags
|
57
|
-
has_many :notes, :as => :notable
|
58
|
-
has_many :commenters, :through => :comments, :source => :person
|
59
|
-
has_many :uniq_commenters, :through => :comments, :source => :person, :uniq => true
|
60
|
-
end
|
61
|
-
|
62
|
-
class Comment < ActiveRecord::Base
|
63
|
-
belongs_to :article
|
64
|
-
belongs_to :person
|
65
|
-
end
|
66
|
-
|
67
|
-
class Tag < ActiveRecord::Base
|
68
|
-
has_and_belongs_to_many :articles
|
69
|
-
end
|
70
|
-
|
71
|
-
class Note < ActiveRecord::Base
|
72
|
-
belongs_to :notable, :polymorphic => true
|
73
|
-
end
|
74
|
-
|
75
|
-
module Schema
|
76
|
-
def self.create
|
77
|
-
ActiveRecord::Base.silence do
|
78
|
-
ActiveRecord::Migration.verbose = false
|
79
|
-
|
80
|
-
ActiveRecord::Schema.define do
|
81
|
-
create_table :people, :force => true do |t|
|
82
|
-
t.integer :parent_id
|
83
|
-
t.string :name
|
84
|
-
t.integer :salary
|
85
|
-
end
|
86
|
-
|
87
|
-
create_table :messages, :force => true do |t|
|
88
|
-
t.integer :author_id
|
89
|
-
t.integer :recipient_id
|
90
|
-
end
|
91
|
-
|
92
|
-
create_table :unidentified_objects, :id => false, :force => true do |t|
|
93
|
-
t.integer :person_id
|
94
|
-
t.string :name
|
95
|
-
end
|
96
|
-
|
97
|
-
create_table :articles, :force => true do |t|
|
98
|
-
t.integer :person_id
|
99
|
-
t.string :title
|
100
|
-
t.text :body
|
101
|
-
end
|
9
|
+
ActiveRecord::Base.silence do
|
10
|
+
ActiveRecord::Migration.verbose = false
|
11
|
+
|
12
|
+
ActiveRecord::Schema.define do
|
13
|
+
create_table :people, :force => true do |t|
|
14
|
+
t.integer :parent_id
|
15
|
+
t.string :name
|
16
|
+
t.integer :salary
|
17
|
+
end
|
102
18
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
end
|
19
|
+
create_table :messages, :force => true do |t|
|
20
|
+
t.integer :author_id
|
21
|
+
t.integer :recipient_id
|
22
|
+
end
|
108
23
|
|
109
|
-
|
110
|
-
|
111
|
-
|
24
|
+
create_table :unidentified_objects, :id => false, :force => true do |t|
|
25
|
+
t.integer :person_id
|
26
|
+
t.string :name
|
27
|
+
end
|
112
28
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
29
|
+
create_table :articles, :force => true do |t|
|
30
|
+
t.integer :person_id
|
31
|
+
t.string :title
|
32
|
+
t.text :body
|
33
|
+
end
|
117
34
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
35
|
+
create_table :comments, :force => true do |t|
|
36
|
+
t.integer :article_id
|
37
|
+
t.integer :person_id
|
38
|
+
t.text :body
|
39
|
+
end
|
123
40
|
|
124
|
-
|
41
|
+
create_table :tags, :force => true do |t|
|
42
|
+
t.string :name
|
125
43
|
end
|
126
44
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
UnidentifiedObject.create(:person => person, :name => Sham.object_name)
|
131
|
-
end
|
132
|
-
Note.make(:notable => person)
|
133
|
-
3.times do
|
134
|
-
article = Article.make(:person => person)
|
135
|
-
3.times do
|
136
|
-
article.tags = [Tag.make, Tag.make, Tag.make]
|
137
|
-
end
|
138
|
-
Note.make(:notable => article)
|
139
|
-
10.times do
|
140
|
-
Comment.make(:article => article)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
2.times do
|
144
|
-
Comment.make(:person => person)
|
145
|
-
end
|
45
|
+
create_table :articles_tags, :force => true, :id => false do |t|
|
46
|
+
t.integer :article_id
|
47
|
+
t.integer :tag_id
|
146
48
|
end
|
147
49
|
|
148
|
-
|
149
|
-
|
50
|
+
create_table :notes, :force => true do |t|
|
51
|
+
t.integer :notable_id
|
52
|
+
t.string :notable_type
|
53
|
+
t.string :note
|
54
|
+
end
|
150
55
|
|
151
56
|
end
|
152
57
|
end
|
58
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: squeel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -224,6 +224,7 @@ files:
|
|
224
224
|
- spec/squeel/visitors/attribute_visitor_spec.rb
|
225
225
|
- spec/squeel/visitors/predicate_visitor_spec.rb
|
226
226
|
- spec/squeel/visitors/symbol_visitor_spec.rb
|
227
|
+
- spec/support/models.rb
|
227
228
|
- spec/support/schema.rb
|
228
229
|
- squeel.gemspec
|
229
230
|
homepage: http://erniemiller.org/projects/squeel
|
@@ -240,7 +241,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
240
241
|
version: '0'
|
241
242
|
segments:
|
242
243
|
- 0
|
243
|
-
hash:
|
244
|
+
hash: -377980682331781514
|
244
245
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
245
246
|
none: false
|
246
247
|
requirements:
|
@@ -249,7 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
250
|
version: '0'
|
250
251
|
segments:
|
251
252
|
- 0
|
252
|
-
hash:
|
253
|
+
hash: -377980682331781514
|
253
254
|
requirements: []
|
254
255
|
rubyforge_project: squeel
|
255
256
|
rubygems_version: 1.8.24
|
@@ -287,4 +288,5 @@ test_files:
|
|
287
288
|
- spec/squeel/visitors/attribute_visitor_spec.rb
|
288
289
|
- spec/squeel/visitors/predicate_visitor_spec.rb
|
289
290
|
- spec/squeel/visitors/symbol_visitor_spec.rb
|
291
|
+
- spec/support/models.rb
|
290
292
|
- spec/support/schema.rb
|