squeel 0.8.5 → 0.8.6
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/.travis.yml +0 -1
- data/Gemfile +27 -5
- data/lib/squeel/adapters/active_record/3.0/association_preload.rb +0 -2
- data/lib/squeel/adapters/active_record/3.0/relation.rb +5 -1
- data/lib/squeel/version.rb +1 -1
- data/spec/console.rb +7 -6
- data/spec/spec_helper.rb +2 -1
- data/spec/squeel/adapters/active_record/relation_spec.rb +12 -0
- data/spec/support/schema.rb +13 -0
- metadata +73 -110
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -3,13 +3,35 @@ gemspec
|
|
3
3
|
|
4
4
|
gem 'rake'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
rails = ENV['RAILS'] || 'master'
|
7
|
+
arel = ENV['AREL'] || 'master'
|
8
|
+
|
9
|
+
arel_opts = case arel
|
10
|
+
when /\// # A path
|
11
|
+
{:path => arel}
|
12
|
+
when /^v/ # A tagged version
|
13
|
+
{:git => 'git://github.com/rails/arel.git', :tag => arel}
|
14
|
+
else
|
15
|
+
{:git => 'git://github.com/rails/arel.git', :branch => arel}
|
16
|
+
end
|
17
|
+
|
18
|
+
gem 'arel', arel_opts
|
19
|
+
|
20
|
+
case rails
|
21
|
+
when /\// # A path
|
22
|
+
gem 'activesupport', :path => "#{rails}/activesupport"
|
23
|
+
gem 'activemodel', :path => "#{rails}/activemodel"
|
24
|
+
gem 'activerecord', :path => "#{rails}/activerecord"
|
25
|
+
when /^v/ # A tagged version
|
26
|
+
git 'git://github.com/rails/rails.git', :tag => rails do
|
27
|
+
gem 'activesupport'
|
28
|
+
gem 'activemodel'
|
29
|
+
gem 'activerecord'
|
30
|
+
end
|
9
31
|
else
|
10
|
-
|
11
|
-
git 'git://github.com/rails/rails.git' do
|
32
|
+
git 'git://github.com/rails/rails.git', :branch => rails do
|
12
33
|
gem 'activesupport'
|
34
|
+
gem 'activemodel'
|
13
35
|
gem 'activerecord'
|
14
36
|
end
|
15
37
|
end
|
@@ -4,8 +4,6 @@ module Squeel
|
|
4
4
|
module AssociationPreload
|
5
5
|
|
6
6
|
def preload_associations(records, associations, preload_options={})
|
7
|
-
records = Array.wrap(records).compact.uniq
|
8
|
-
return if records.empty?
|
9
7
|
super(records, Visitors::SymbolVisitor.new.accept(associations), preload_options)
|
10
8
|
end
|
11
9
|
|
@@ -64,7 +64,11 @@ module Squeel
|
|
64
64
|
def prepare_relation_for_association_merge!(r, association_name)
|
65
65
|
r.where_values.map! {|w| Squeel::Visitors::PredicateVisitor.can_visit?(w) ? {association_name => w} : w}
|
66
66
|
r.having_values.map! {|h| Squeel::Visitors::PredicateVisitor.can_visit?(h) ? {association_name => h} : h}
|
67
|
-
r.
|
67
|
+
r.group_values.map! {|g| Squeel::Visitors::AttributeVisitor.can_visit?(g) ? {association_name => g} : g}
|
68
|
+
r.order_values.map! {|o| Squeel::Visitors::AttributeVisitor.can_visit?(o) ? {association_name => o} : o}
|
69
|
+
r.select_values.map! {|s| Squeel::Visitors::AttributeVisitor.can_visit?(s) ? {association_name => s} : s}
|
70
|
+
r.joins_values.map! {|j| [Symbol, Hash, Nodes::Stub, Nodes::Join, Nodes::KeyPath].include?(j.class) ? {association_name => j} : j}
|
71
|
+
r.includes_values.map! {|i| [Symbol, Hash, Nodes::Stub, Nodes::Join, Nodes::KeyPath].include?(i.class) ? {association_name => i} : i}
|
68
72
|
end
|
69
73
|
|
70
74
|
def build_arel
|
data/lib/squeel/version.rb
CHANGED
data/spec/console.rb
CHANGED
@@ -8,12 +8,13 @@ Dir[File.expand_path('../../spec/{helpers,support,blueprints}/*.rb', __FILE__)].
|
|
8
8
|
end
|
9
9
|
|
10
10
|
Sham.define do
|
11
|
-
name
|
12
|
-
title
|
13
|
-
body
|
14
|
-
salary
|
15
|
-
tag_name
|
16
|
-
note
|
11
|
+
name { Faker::Name.name }
|
12
|
+
title { Faker::Lorem.sentence }
|
13
|
+
body { Faker::Lorem.paragraph }
|
14
|
+
salary {|index| 30000 + (index * 1000)}
|
15
|
+
tag_name { Faker::Lorem.words(3).join(' ') }
|
16
|
+
note { Faker::Lorem.words(7).join(' ') }
|
17
|
+
object_name { Faker::Lorem.words(1).first }
|
17
18
|
end
|
18
19
|
|
19
20
|
Schema.create
|
data/spec/spec_helper.rb
CHANGED
@@ -4,7 +4,7 @@ require 'faker'
|
|
4
4
|
|
5
5
|
module ActiveRecord
|
6
6
|
class SQLCounter
|
7
|
-
IGNORED_SQL = [/^PRAGMA
|
7
|
+
IGNORED_SQL = [/^PRAGMA /, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/,
|
8
8
|
/SELECT name\s+FROM sqlite_master\s+WHERE type = 'table' AND NOT name = 'sqlite_sequence'/]
|
9
9
|
|
10
10
|
# FIXME: this needs to be refactored so specific database can add their own
|
@@ -37,6 +37,7 @@ Sham.define do
|
|
37
37
|
salary {|index| 30000 + (index * 1000)}
|
38
38
|
tag_name { Faker::Lorem.words(3).join(' ') }
|
39
39
|
note { Faker::Lorem.words(7).join(' ') }
|
40
|
+
object_name { Faker::Lorem.words(1).first }
|
40
41
|
end
|
41
42
|
|
42
43
|
RSpec.configure do |config|
|
@@ -642,6 +642,18 @@ module Squeel
|
|
642
642
|
person.comments.loaded?.should be true
|
643
643
|
end
|
644
644
|
|
645
|
+
it 'includes a belongs_to association even if the child model has no primary key' do
|
646
|
+
relation = UnidentifiedObject.where{person_id < 120}.includes(:person)
|
647
|
+
queries = queries_for do
|
648
|
+
vals = relation.to_a
|
649
|
+
vals.should have(8).items
|
650
|
+
end
|
651
|
+
|
652
|
+
queries.should have(2).queries
|
653
|
+
|
654
|
+
queries.last.should match /IN \(1, ?34, ?67, ?100\)/
|
655
|
+
end
|
656
|
+
|
645
657
|
end
|
646
658
|
|
647
659
|
end
|
data/spec/support/schema.rb
CHANGED
@@ -15,6 +15,11 @@ class Person < ActiveRecord::Base
|
|
15
15
|
has_many :authored_article_comments, :through => :articles,
|
16
16
|
:source => :comments
|
17
17
|
has_many :notes, :as => :notable
|
18
|
+
has_many :unidentified_objects
|
19
|
+
end
|
20
|
+
|
21
|
+
class UnidentifiedObject < ActiveRecord::Base
|
22
|
+
belongs_to :person
|
18
23
|
end
|
19
24
|
|
20
25
|
class Article < ActiveRecord::Base
|
@@ -50,6 +55,11 @@ module Schema
|
|
50
55
|
t.integer :salary
|
51
56
|
end
|
52
57
|
|
58
|
+
create_table :unidentified_objects, :id => false, :force => true do |t|
|
59
|
+
t.integer :person_id
|
60
|
+
t.string :name
|
61
|
+
end
|
62
|
+
|
53
63
|
create_table :articles, :force => true do |t|
|
54
64
|
t.integer :person_id
|
55
65
|
t.string :title
|
@@ -82,6 +92,9 @@ module Schema
|
|
82
92
|
|
83
93
|
10.times do
|
84
94
|
person = Person.make
|
95
|
+
2.times do
|
96
|
+
UnidentifiedObject.create(:person => person, :name => Sham.object_name)
|
97
|
+
end
|
85
98
|
Note.make(:notable => person)
|
86
99
|
3.times do
|
87
100
|
article = Article.make(:person => person)
|
metadata
CHANGED
@@ -1,127 +1,93 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: squeel
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.6
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 8
|
9
|
-
- 5
|
10
|
-
version: 0.8.5
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Ernie Miller
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2011-07-02 00:00:00 -04:00
|
12
|
+
date: 2011-08-01 00:00:00.000000000 -04:00
|
19
13
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
22
16
|
name: activerecord
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &70148779727860 !ruby/object:Gem::Requirement
|
25
18
|
none: false
|
26
|
-
requirements:
|
19
|
+
requirements:
|
27
20
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 3
|
32
|
-
- 0
|
33
|
-
version: "3.0"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.0'
|
34
23
|
type: :runtime
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: activesupport
|
38
24
|
prerelease: false
|
39
|
-
|
25
|
+
version_requirements: *70148779727860
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: activesupport
|
28
|
+
requirement: &70148779727360 !ruby/object:Gem::Requirement
|
40
29
|
none: false
|
41
|
-
requirements:
|
30
|
+
requirements:
|
42
31
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
segments:
|
46
|
-
- 3
|
47
|
-
- 0
|
48
|
-
version: "3.0"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
49
34
|
type: :runtime
|
50
|
-
version_requirements: *id002
|
51
|
-
- !ruby/object:Gem::Dependency
|
52
|
-
name: rspec
|
53
35
|
prerelease: false
|
54
|
-
|
36
|
+
version_requirements: *70148779727360
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
requirement: &70148779726900 !ruby/object:Gem::Requirement
|
55
40
|
none: false
|
56
|
-
requirements:
|
41
|
+
requirements:
|
57
42
|
- - ~>
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
hash: 23
|
60
|
-
segments:
|
61
|
-
- 2
|
62
|
-
- 6
|
63
|
-
- 0
|
43
|
+
- !ruby/object:Gem::Version
|
64
44
|
version: 2.6.0
|
65
45
|
type: :development
|
66
|
-
version_requirements: *id003
|
67
|
-
- !ruby/object:Gem::Dependency
|
68
|
-
name: machinist
|
69
46
|
prerelease: false
|
70
|
-
|
47
|
+
version_requirements: *70148779726900
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: machinist
|
50
|
+
requirement: &70148779726440 !ruby/object:Gem::Requirement
|
71
51
|
none: false
|
72
|
-
requirements:
|
52
|
+
requirements:
|
73
53
|
- - ~>
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
hash: 27
|
76
|
-
segments:
|
77
|
-
- 1
|
78
|
-
- 0
|
79
|
-
- 6
|
54
|
+
- !ruby/object:Gem::Version
|
80
55
|
version: 1.0.6
|
81
56
|
type: :development
|
82
|
-
version_requirements: *id004
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: faker
|
85
57
|
prerelease: false
|
86
|
-
|
58
|
+
version_requirements: *70148779726440
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: faker
|
61
|
+
requirement: &70148779725980 !ruby/object:Gem::Requirement
|
87
62
|
none: false
|
88
|
-
requirements:
|
63
|
+
requirements:
|
89
64
|
- - ~>
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
hash: 49
|
92
|
-
segments:
|
93
|
-
- 0
|
94
|
-
- 9
|
95
|
-
- 5
|
65
|
+
- !ruby/object:Gem::Version
|
96
66
|
version: 0.9.5
|
97
67
|
type: :development
|
98
|
-
version_requirements: *id005
|
99
|
-
- !ruby/object:Gem::Dependency
|
100
|
-
name: sqlite3
|
101
68
|
prerelease: false
|
102
|
-
|
69
|
+
version_requirements: *70148779725980
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: sqlite3
|
72
|
+
requirement: &70148779725520 !ruby/object:Gem::Requirement
|
103
73
|
none: false
|
104
|
-
requirements:
|
74
|
+
requirements:
|
105
75
|
- - ~>
|
106
|
-
- !ruby/object:Gem::Version
|
107
|
-
hash: 29
|
108
|
-
segments:
|
109
|
-
- 1
|
110
|
-
- 3
|
111
|
-
- 3
|
76
|
+
- !ruby/object:Gem::Version
|
112
77
|
version: 1.3.3
|
113
78
|
type: :development
|
114
|
-
|
115
|
-
|
116
|
-
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *70148779725520
|
81
|
+
description: ! "\n Squeel unlocks the power of ARel in your Rails 3 application
|
82
|
+
with\n a handy block-based syntax. You can write subqueries, access named\n
|
83
|
+
\ functions provided by your RDBMS, and more, all without writing\n SQL
|
84
|
+
strings.\n "
|
85
|
+
email:
|
117
86
|
- ernie@metautonomo.us
|
118
87
|
executables: []
|
119
|
-
|
120
88
|
extensions: []
|
121
|
-
|
122
89
|
extra_rdoc_files: []
|
123
|
-
|
124
|
-
files:
|
90
|
+
files:
|
125
91
|
- .gitignore
|
126
92
|
- .travis.yml
|
127
93
|
- .yardopts
|
@@ -207,45 +173,42 @@ files:
|
|
207
173
|
has_rdoc: true
|
208
174
|
homepage: http://metautonomo.us/projects/squeel
|
209
175
|
licenses: []
|
176
|
+
post_install_message: ! '
|
210
177
|
|
211
|
-
post_install_message: |+
|
212
|
-
|
213
178
|
*** Thanks for installing Squeel! ***
|
179
|
+
|
214
180
|
Be sure to check out http://metautonomo.us/projects/squeel/ for a
|
215
|
-
|
216
|
-
|
181
|
+
|
182
|
+
walkthrough of Squeel''s features, and click the donate link if
|
183
|
+
|
184
|
+
you''re feeling especially appreciative. It''d help me justify this
|
185
|
+
|
217
186
|
"open source" stuff to my lovely wife. :)
|
218
|
-
|
219
|
-
rdoc_options: []
|
220
187
|
|
221
|
-
|
188
|
+
|
189
|
+
'
|
190
|
+
rdoc_options: []
|
191
|
+
require_paths:
|
222
192
|
- lib
|
223
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
193
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
224
194
|
none: false
|
225
|
-
requirements:
|
226
|
-
- -
|
227
|
-
- !ruby/object:Gem::Version
|
228
|
-
|
229
|
-
|
230
|
-
- 0
|
231
|
-
version: "0"
|
232
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
195
|
+
requirements:
|
196
|
+
- - ! '>='
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: '0'
|
199
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
233
200
|
none: false
|
234
|
-
requirements:
|
235
|
-
- -
|
236
|
-
- !ruby/object:Gem::Version
|
237
|
-
|
238
|
-
segments:
|
239
|
-
- 0
|
240
|
-
version: "0"
|
201
|
+
requirements:
|
202
|
+
- - ! '>='
|
203
|
+
- !ruby/object:Gem::Version
|
204
|
+
version: '0'
|
241
205
|
requirements: []
|
242
|
-
|
243
206
|
rubyforge_project: squeel
|
244
|
-
rubygems_version: 1.
|
207
|
+
rubygems_version: 1.6.2
|
245
208
|
signing_key:
|
246
209
|
specification_version: 3
|
247
210
|
summary: ActiveRecord 3, improved.
|
248
|
-
test_files:
|
211
|
+
test_files:
|
249
212
|
- spec/blueprints/articles.rb
|
250
213
|
- spec/blueprints/comments.rb
|
251
214
|
- spec/blueprints/notes.rb
|