fake_arel 0.9.9 → 1.0.0.a

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,13 +1,16 @@
1
- # A sample Gemfile
2
1
  source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+ gem 'activerecord', '~> 2.3.11'
3
6
 
4
- gem "activerecord", "2.3.11"
5
-
7
+ # Add dependencies to develop your gem here.
8
+ # Include everything needed to run rake, tests, features, etc.
6
9
  group :development do
10
+ gem "bundler", "~> 1.0.0"
11
+ gem "jeweler", "~> 1.6.4"
12
+ gem "rcov", ">= 0"
13
+
7
14
  gem 'rspec', '1.3.1'
8
15
  gem "sqlite3-ruby"
9
- gem 'newgem'
10
- gem 'rake'
11
- gem 'hoe'
12
- gem 'ruby-debug'
13
16
  end
data/Gemfile.lock CHANGED
@@ -1,44 +1,28 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- RedCloth (4.2.7)
5
4
  activerecord (2.3.11)
6
5
  activesupport (= 2.3.11)
7
6
  activesupport (2.3.11)
8
- columnize (0.3.2)
9
- hoe (2.9.4)
10
- rake (>= 0.8.7)
11
- i18n (0.5.0)
12
- linecache (0.43)
13
- newgem (1.5.3)
14
- RedCloth (>= 4.1.1)
15
- activesupport (~> 2.3.4)
16
- hoe (>= 2.4.0)
17
- rubigen (>= 1.5.3)
18
- syntax (>= 1.0.0)
19
- rake (0.8.7)
7
+ git (1.2.5)
8
+ jeweler (1.6.4)
9
+ bundler (~> 1.0)
10
+ git (>= 1.2.5)
11
+ rake
12
+ rake (0.9.2)
13
+ rcov (0.9.9)
20
14
  rspec (1.3.1)
21
- rubigen (1.5.6)
22
- activesupport (>= 2.3.5)
23
- i18n
24
- ruby-debug (0.10.4)
25
- columnize (>= 0.1)
26
- ruby-debug-base (~> 0.10.4.0)
27
- ruby-debug-base (0.10.4)
28
- linecache (>= 0.3)
29
15
  sqlite3 (1.3.3)
30
16
  sqlite3-ruby (1.3.3)
31
17
  sqlite3 (>= 1.3.3)
32
- syntax (1.0.0)
33
18
 
34
19
  PLATFORMS
35
20
  ruby
36
21
 
37
22
  DEPENDENCIES
38
- activerecord (= 2.3.11)
39
- hoe
40
- newgem
41
- rake
23
+ activerecord (~> 2.3.11)
24
+ bundler (~> 1.0.0)
25
+ jeweler (~> 1.6.4)
26
+ rcov
42
27
  rspec (= 1.3.1)
43
- ruby-debug
44
28
  sqlite3-ruby
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Grant Ammons
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,121 @@
1
+ ## Fake_arel: Rails 3 Query Interface for Rails 2
2
+
3
+ http://github.com/gammons/fake_arel
4
+
5
+ ## DESCRIPTION:
6
+
7
+ * Tired of waiting for Rails 3 and its new super-sweet query interface? Try fake_arel!
8
+
9
+ * Fake_arel is a gem that will simulate the new Rails 3 query interface, using named_scopes and a couple small patches to ActiveRecord.
10
+
11
+ * This should serve as a nice bridge between Rails 2 and Rails 3 apps, and can be removed once upgrading your app to rails 3, and everything (hopefully) should still work.
12
+
13
+ ## SYNOPSIS:
14
+
15
+ * All the finders described on [Pratiks blog](http://m.onkey.org/2010/1/22/active-record-query-interface) have been implemented.
16
+
17
+ ```ruby
18
+ Reply.where(:id => 1)
19
+ Reply.select("content,id").where("id > 1").order("id desc").limit(1)
20
+ Topic.joins(:replies).limit(1)
21
+ ```
22
+
23
+ * Additionally, named_scopes are very similar to Rails 3 relations, in that they are lazily loaded.
24
+
25
+ ```ruby
26
+ Reply.where(:name => "John").class
27
+ ActiveRecord::NamedScope::Scope
28
+ ```
29
+ * Also implemented was `to_sql`. `to_sql` will work on any chained query.
30
+
31
+ ```ruby
32
+ Topic.joins(:replies).limit(1).to_sql
33
+ "SELECT \"topics\".* FROM \"topics\" INNER JOIN \"replies\" ON replies.topic_id = topics.id LIMIT 1"
34
+ ```
35
+
36
+ * `named_scope` was modified to include other `named_scope`s, so you can chain them together.
37
+
38
+ ```ruby
39
+ class Reply < ActiveRecord::Base
40
+ named_scope :by_john, where(:name => "John")
41
+ named_scope :recent, lambda {|t| where("created_at > ? ", t.minutes.ago) }
42
+ named_scope :recent_by_john, recent(15).by_john
43
+ end
44
+ ```
45
+
46
+ ## Fakearel-specific items
47
+ The following items are not necessarily implemented in Rails 3 arel, but they are pretty awesome.
48
+
49
+ ### OR syntax
50
+ Because named scopes load lazily, we are able to pass the scope to another scope, in this case, `or`.
51
+
52
+ ```ruby
53
+ q1 = Reply.where(:id => 1)
54
+ q2 = Reply.where(:id => 2)
55
+ q3 = Reply.where(:id => 3)
56
+ q4 = Reply.where(:id => 4)
57
+
58
+ Reply.or(q1,q2).all.map(&:id) # equals [1,2]
59
+ Reply.or(q1,q2,q3).all.map(&:id) # equals [1,2,3]
60
+
61
+ or1 = Reply.or(q1,q2)
62
+ or2 = Reply.or(q3,q4)
63
+ Reply.or(or1,or2).all.map(&:id) # equals [1,2,3,4]
64
+ ```
65
+
66
+ ### fakearel_find_each
67
+
68
+ The `find_each` that ships with ActiveRecord 2.x isn't very scope-friendly, thus using fakearel_find_each makes sense. However I did not want to replace the original find_each functionality, just in case you were using it.
69
+
70
+ ```ruby
71
+ Reply.where(:user_id => 1).fakearel_find_each do |reply|
72
+ ...
73
+ end
74
+ ```
75
+
76
+ ### fakearel_destroy
77
+
78
+ Call destroy on a scoped call. This will run any callbacks on the models to be destroyed.
79
+
80
+ ```ruby
81
+ Reply.where(:user_id => 1).fakearel_destroy #will run before_destroy and after_destroy callbacks for affected Replys
82
+ ```
83
+
84
+ ## REQUIREMENTS:
85
+
86
+ * >= ActiveRecord 2.3.5
87
+
88
+ ## INSTALL:
89
+
90
+ `gem install fake_arel`
91
+
92
+ ## AUTHORS:
93
+
94
+ * Grant Ammons
95
+ * Sokolov Yura
96
+
97
+ ## LICENSE:
98
+
99
+ (The MIT License)
100
+
101
+ Copyright (c) 2010 Grant Ammons (grant@pipelinedealsco.com)
102
+
103
+ Permission is hereby granted, free of charge, to any person obtaining
104
+ a copy of this software and associated documentation files (the
105
+ 'Software'), to deal in the Software without restriction, including
106
+ without limitation the rights to use, copy, modify, merge, publish,
107
+ distribute, sublicense, and/or sell copies of the Software, and to
108
+ permit persons to whom the Software is furnished to do so, subject to
109
+ the following conditions:
110
+
111
+ The above copyright notice and this permission notice shall be
112
+ included in all copies or substantial portions of the Software.
113
+
114
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
115
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
116
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
117
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
118
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
119
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
120
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
121
+
data/Rakefile CHANGED
@@ -1,24 +1,54 @@
1
- require 'rubygems'
2
- gem 'hoe', '>= 2.1.0'
3
- require 'hoe'
4
- require 'fileutils'
5
- require './lib/fake_arel'
6
-
7
- Hoe.plugin :newgem
8
- # Hoe.plugin :website
9
- # Hoe.plugin :cucumberfeatures
10
-
11
- # Generate all the Rake tasks
12
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
- $hoe = Hoe.spec 'fake_arel' do
14
- self.developer 'Grant Ammons', 'grant@pipelinedealsco.com'
15
- self.rubyforge_name = self.name # TODO this is default value
16
- self.extra_deps = [['activerecord','>= 2.3.5']]
17
- end
18
-
19
- require 'newgem/tasks'
20
- Dir['tasks/**/*.rake'].each { |t| load t }
21
-
22
- # TODO - want other tests/tasks run by default? Add them to the list
23
- remove_task :default
24
- task :default => :spec
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "fake_arel"
18
+ gem.homepage = "http://github.com/gammons/fake_arel"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{fake_arel: a Rails 3 query interface to Rails 2}
21
+ gem.description = %Q{fake_arel will simulate rails 3 arel syntax for Rails 2.}
22
+ gem.email = "grant@pipelinedealsco.com"
23
+ gem.authors = ["Grant Ammons"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ require 'rcov/rcovtask'
36
+ Rcov::RcovTask.new do |test|
37
+ test.libs << 'test'
38
+ test.pattern = 'test/**/test_*.rb'
39
+ test.verbose = true
40
+ test.rcov_opts << '--exclude "gems/*"'
41
+ end
42
+
43
+ Dir['tasks/**/*.rake'].each { |t| load t }
44
+ task :default => :spec
45
+
46
+ require 'rake/rdoctask'
47
+ Rake::RDocTask.new do |rdoc|
48
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
49
+
50
+ rdoc.rdoc_dir = 'rdoc'
51
+ rdoc.title = "fake_arel_2 #{version}"
52
+ rdoc.rdoc_files.include('README*')
53
+ rdoc.rdoc_files.include('lib/**/*.rb')
54
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0.a
data/fake_arel.gemspec CHANGED
@@ -1,21 +1,84 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
1
4
  # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib/', __FILE__)
3
- $:.unshift lib unless $:.include?(lib)
4
-
5
- require 'bundler/version'
6
-
5
+
7
6
  Gem::Specification.new do |s|
8
- s.name = "fake_arel"
9
- s.version = "0.9.9"
10
- s.platform = Gem::Platform::RUBY
11
- s.author = "Grant Ammons"
12
- s.email = ["grant@pipelinedealsco.com"]
13
- s.homepage = "http://github.com/gammons/fake_arel"
14
- s.summary = "A library that simulates Rails 3 ActiveRecord Arel calls using extensions to named_scope."
15
-
16
- s.add_dependency('activerecord', '~>2.3.5')
17
- s.rubyforge_project = 'fake_arel'
18
-
19
- s.files = Dir.glob("{bin,lib}/**/*")
20
- s.require_path = 'lib'
7
+ s.name = %q{fake_arel}
8
+ s.version = "1.0.0.a"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Grant Ammons"]
12
+ s.date = %q{2011-10-27}
13
+ s.description = %q{fake_arel will simulate rails 3 arel syntax for Rails 2.}
14
+ s.email = %q{grant@pipelinedealsco.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ "Gemfile",
21
+ "Gemfile.lock",
22
+ "History.txt",
23
+ "LICENSE.txt",
24
+ "Manifest.txt",
25
+ "README.md",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "fake_arel.gemspec",
29
+ "lib/fake_arel.rb",
30
+ "lib/fake_arel/calculations.rb",
31
+ "lib/fake_arel/extensions.rb",
32
+ "lib/fake_arel/rails_3_finders.rb",
33
+ "lib/fake_arel/selectable_includes.rb",
34
+ "lib/fake_arel/singleton_class.rb",
35
+ "lib/fake_arel/with_scope_replacement.rb",
36
+ "script/console",
37
+ "script/destroy",
38
+ "script/generate",
39
+ "spec/fake_arel_spec.rb",
40
+ "spec/fixtures/author.rb",
41
+ "spec/fixtures/authors.yml",
42
+ "spec/fixtures/replies.yml",
43
+ "spec/fixtures/reply.rb",
44
+ "spec/fixtures/schema.rb",
45
+ "spec/fixtures/topic.rb",
46
+ "spec/fixtures/topics.yml",
47
+ "spec/spec.opts",
48
+ "spec/spec_helper.rb",
49
+ "tasks/rspec.rake"
50
+ ]
51
+ s.homepage = %q{http://github.com/gammons/fake_arel}
52
+ s.licenses = ["MIT"]
53
+ s.require_paths = ["lib"]
54
+ s.rubygems_version = %q{1.4.2}
55
+ s.summary = %q{fake_arel: a Rails 3 query interface to Rails 2}
56
+
57
+ if s.respond_to? :specification_version then
58
+ s.specification_version = 3
59
+
60
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
61
+ s.add_runtime_dependency(%q<activerecord>, ["~> 2.3.11"])
62
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
63
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
64
+ s.add_development_dependency(%q<rcov>, [">= 0"])
65
+ s.add_development_dependency(%q<rspec>, ["= 1.3.1"])
66
+ s.add_development_dependency(%q<sqlite3-ruby>, [">= 0"])
67
+ else
68
+ s.add_dependency(%q<activerecord>, ["~> 2.3.11"])
69
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
70
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
71
+ s.add_dependency(%q<rcov>, [">= 0"])
72
+ s.add_dependency(%q<rspec>, ["= 1.3.1"])
73
+ s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
74
+ end
75
+ else
76
+ s.add_dependency(%q<activerecord>, ["~> 2.3.11"])
77
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
78
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
79
+ s.add_dependency(%q<rcov>, [">= 0"])
80
+ s.add_dependency(%q<rspec>, ["= 1.3.1"])
81
+ s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
82
+ end
21
83
  end
84
+
@@ -33,6 +33,7 @@ module ActiveRecord
33
33
  local_scope = proxy_scope
34
34
  ret = proxy_options
35
35
  while local_scope.class == ActiveRecord::NamedScope::Scope
36
+ ret[:select] = local_scope.proxy_options[:select] unless local_scope.proxy_options[:select].nil?
36
37
  local_conditions = merge_conditions(local_scope.proxy_options[:conditions])
37
38
  if local_conditions && ret[:conditions]
38
39
  if !ret[:conditions].index(local_conditions)
@@ -42,7 +43,14 @@ module ActiveRecord
42
43
  ret[:conditions] = local_conditions
43
44
  end
44
45
  ret[:include] = merge_includes(ret[:include], local_scope.proxy_options[:include])
45
- ret[:joins] = merge_joins(ret[:joins], local_scope.proxy_options[:joins]) if ret[:joins] || local_scope.proxy_options[:joins]
46
+ if ret[:joins] || local_scope.proxy_options[:joins]
47
+ # this is a bit ugly, but I was getting error with using OR.
48
+ begin
49
+ ret[:joins] = merge_joins(ret[:joins], local_scope.proxy_options[:joins])
50
+ rescue ActiveRecord::ConfigurationError
51
+ ret[:joins] = merge_joins((ret[:joins] || []), (local_scope.proxy_options[:joins] || []))
52
+ end
53
+ end
46
54
  ret[:order] = [local_scope.proxy_options[:order], ret[:order]].select{|o| !o.blank?}.join(',') if ret[:order] || local_scope.proxy_options[:order]
47
55
  local_scope = local_scope.proxy_scope
48
56
  end
@@ -0,0 +1,40 @@
1
+ # Politely lifted from fcheung's selectable_includes plugin for ActiveRecord
2
+ # https://github.com/fcheung/selectable_includes/blob/master/lib/selectable_includes.rb
3
+ class ActiveRecord::Base
4
+ class << self
5
+ def construct_finder_sql_with_included_associations_with_selectable_includes(options, join_dependency)
6
+ scope = scope(:find)
7
+ select_options = options[:select] || (scope && scope[:select])
8
+ sql = construct_finder_sql_with_included_associations_without_selectable_includes(options, join_dependency)
9
+ unless select_options.blank?
10
+ sql.sub!(/\ASELECT /, "SELECT #{select_options}, ")
11
+ end
12
+ sql
13
+ end
14
+ alias_method_chain :construct_finder_sql_with_included_associations, :selectable_includes
15
+ end
16
+ end
17
+
18
+ class ActiveRecord::Associations::ClassMethods::JoinDependency
19
+ def instantiate_with_selectable_includes(rows)
20
+ unless rows.empty?
21
+ keys_from_select = rows.first.keys.reject {|k| k =~ /\At\d+_r\d+/}
22
+ join_base.extra_columns = keys_from_select
23
+ end
24
+ instantiate_without_selectable_includes(rows)
25
+ end
26
+ alias_method_chain :instantiate, :selectable_includes
27
+ end
28
+
29
+ class ActiveRecord::Associations::ClassMethods::JoinDependency::JoinBase
30
+ attr_accessor :extra_columns
31
+
32
+ def extract_record_with_selectable_includes(row)
33
+ record = extract_record_without_selectable_includes(row)
34
+ extra_columns.inject(record){|record, an| record[an] = row[an]; record} if extra_columns
35
+ record
36
+ end
37
+
38
+ alias_method_chain :extract_record, :selectable_includes
39
+ end
40
+
data/lib/fake_arel.rb CHANGED
@@ -7,9 +7,9 @@ require 'fake_arel/extensions'
7
7
  require 'fake_arel/with_scope_replacement'
8
8
  require 'fake_arel/rails_3_finders'
9
9
  require 'fake_arel/calculations'
10
+ require 'fake_arel/selectable_includes'
10
11
 
11
12
  module FakeArel
12
- VERSION = '0.9.9'
13
13
  ActiveRecord::Base.send :include, Rails3Finders
14
14
  ActiveRecord::Base.send :include, WithScopeReplacement
15
15
  end
@@ -79,7 +79,7 @@ describe "Fake Arel" do
79
79
  it "should properly chain scope in definitions by lambda" do
80
80
  Reply.recent_topic_id(4).all.should == Reply.find_all_by_id(5)
81
81
  end
82
-
82
+
83
83
  it "should properly chain order scope in definitions by lambda" do
84
84
  Reply.topic__id_asc(4).all.should == Reply.find(:all, :conditions => {:topic_id => 4}, :order=>'id asc')
85
85
  Reply.order('id desc').topic_id(4).all.should == Reply.find(:all, :conditions => {:topic_id => 4}, :order=>'id desc')
@@ -89,7 +89,7 @@ describe "Fake Arel" do
89
89
  Reply.topic__id_desc2(4).all.should == topic_4_id_desc
90
90
  Reply.topic__id_desc3(4).all.should == topic_4_id_desc
91
91
  end
92
-
92
+
93
93
  it "should chain order scopes" do
94
94
  # see https://rails.lighthouseapp.com/projects/8994/tickets/2810-with_scope-should-accept-and-use-order-option
95
95
  # it works now in reverse order to comply with ActiveRecord 3
@@ -104,14 +104,14 @@ describe "Fake Arel" do
104
104
  end
105
105
  end.should == Reply.find(:all, :order=>'created_at desc, topic_id asc')
106
106
  end
107
-
107
+
108
108
  it "should chain string join scope" do
109
109
  lambda {
110
110
  Topic.join_replies_by_string_and_author.all
111
111
  Topic.join_replies_by_string_and_author_lambda.all
112
112
  }.should_not raise_error
113
113
  end
114
-
114
+
115
115
  it "should properly chain with includes" do
116
116
  topics = nil
117
117
  lambda {
@@ -174,7 +174,7 @@ describe "Fake Arel" do
174
174
  # an example using joins, as well as a query that returns nothing
175
175
  Reply.or(Reply.recent_joins_topic, Reply.topic_title_is("Nothin")).all.map(&:id).should == [5]
176
176
  end
177
-
177
+
178
178
  it 'should be able to combine with "or", an empty named scope with another non-empty one' do
179
179
  q1 = Reply.where(:id => 0)
180
180
  q2 = Reply.where(:id => 2)
@@ -249,3 +249,15 @@ describe "NameScope bug" do
249
249
  end
250
250
  end
251
251
 
252
+ describe "using select with include" do
253
+ it "should be able to use select with include" do
254
+ Reply.create(:content => 'yeah', :topic_id => Topic.first)
255
+ Topic.includes(:replies).select("topics.id as super_topic_id").where("replies.content = 'yeah'").first.super_topic_id.should_not be_nil
256
+ end
257
+
258
+ it "should allow named scopes to use select and include together" do
259
+ Topic.select_only_id.all.map(&:super_duper_id).each {|t| t.should_not be_nil }
260
+ Topic.send(:select_only_id).all.map(&:super_duper_id).each {|t| t.should_not be_nil }
261
+ end
262
+ end
263
+
@@ -32,7 +32,7 @@ class Reply < ActiveRecord::Base
32
32
  named_scope :topic_id_asc, order('topic_id asc')
33
33
  named_scope :topic_id_asc_id_desc, order('topic_id asc').id_desc
34
34
  named_scope :lam_topic_id_asc_id_desc, lambda{ topic_id_asc.id_desc }
35
-
35
+
36
36
  validates_presence_of :content
37
37
 
38
38
  def self.find_all_but_first
@@ -3,15 +3,16 @@ class Topic < ActiveRecord::Base
3
3
  belongs_to :author
4
4
 
5
5
  named_scope :mentions_activerecord, :conditions => ['topics.title LIKE ?', '%ActiveRecord%']
6
-
6
+
7
7
  named_scope :with_replies_starting_with, lambda { |text|
8
8
  { :conditions => "replies.content LIKE '#{text}%' ", :include => :replies }
9
9
  }
10
-
10
+
11
11
  named_scope :mentions_activerecord_with_replies, includes(:replies).mentions_activerecord
12
12
  named_scope :by_title_with_replies, lambda {|title| includes(:replies).where('topics.title like ?', title) }
13
-
13
+
14
14
  named_scope :join_replies_by_string, joins('inner join replies on topics.id = replies.topic_id')
15
15
  named_scope :join_replies_by_string_and_author, join_replies_by_string.joins(:author)
16
16
  named_scope :join_replies_by_string_and_author_lambda, join_replies_by_string.joins(:author)
17
+ named_scope :select_only_id, select('id as super_duper_id').includes(:replies)
17
18
  end
data/spec/spec_helper.rb CHANGED
@@ -11,9 +11,6 @@ require 'active_record/fixtures'
11
11
  require 'fake_arel'
12
12
  gem 'sqlite3-ruby'
13
13
 
14
- require 'ruby-debug'
15
- Debugger.start
16
-
17
14
  ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => 'spec/test.db')
18
15
  ActiveRecord::Base.logger = Logger.new(STDOUT) if $0 == 'irb'
19
16
 
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fake_arel
3
3
  version: !ruby/object:Gem::Version
4
- hash: 41
5
- prerelease:
4
+ hash: 58
5
+ prerelease: 6
6
6
  segments:
7
+ - 1
7
8
  - 0
8
- - 9
9
- - 9
10
- version: 0.9.9
9
+ - 0
10
+ - a
11
+ version: 1.0.0.a
11
12
  platform: ruby
12
13
  authors:
13
14
  - Grant Ammons
@@ -15,68 +16,125 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2011-05-13 00:00:00 -07:00
19
+ date: 2011-10-27 00:00:00 -04:00
19
20
  default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency
23
+ prerelease: false
24
+ name: activerecord
25
+ type: :runtime
22
26
  version_requirements: &id001 !ruby/object:Gem::Requirement
23
27
  none: false
24
28
  requirements:
25
- - - ">="
29
+ - - ~>
26
30
  - !ruby/object:Gem::Version
27
- hash: 9
31
+ hash: 21
28
32
  segments:
29
33
  - 2
30
34
  - 3
31
- - 5
32
- version: 2.3.5
33
- type: :runtime
35
+ - 11
36
+ version: 2.3.11
34
37
  requirement: *id001
35
- name: activerecord
36
- prerelease: false
37
38
  - !ruby/object:Gem::Dependency
39
+ prerelease: false
40
+ name: bundler
41
+ type: :development
38
42
  version_requirements: &id002 !ruby/object:Gem::Requirement
39
43
  none: false
40
44
  requirements:
41
- - - ">="
45
+ - - ~>
42
46
  - !ruby/object:Gem::Version
43
- hash: 35
47
+ hash: 23
44
48
  segments:
45
- - 2
46
- - 9
49
+ - 1
50
+ - 0
51
+ - 0
52
+ version: 1.0.0
53
+ requirement: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ prerelease: false
56
+ name: jeweler
57
+ type: :development
58
+ version_requirements: &id003 !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ hash: 7
64
+ segments:
65
+ - 1
66
+ - 6
47
67
  - 4
48
- version: 2.9.4
68
+ version: 1.6.4
69
+ requirement: *id003
70
+ - !ruby/object:Gem::Dependency
71
+ prerelease: false
72
+ name: rcov
49
73
  type: :development
50
- requirement: *id002
51
- name: hoe
74
+ version_requirements: &id004 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ hash: 3
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ requirement: *id004
84
+ - !ruby/object:Gem::Dependency
52
85
  prerelease: false
53
- description: |-
54
- * Tired of waiting for Rails 3 and its new super-sweet query interface? Try fake_arel!
55
-
56
- * Fake_arel is a gem that will simulate the new Rails 3 query interface, using named_scopes and a couple small patches to ActiveRecord.
57
-
58
- * This should serve as a nice bridge between Rails 2 and Rails 3 apps, and can be removed once upgrading your app to rails 3, and everything (hopefully) should still work.
59
- email:
60
- - grant@pipelinedealsco.com
86
+ name: rspec
87
+ type: :development
88
+ version_requirements: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - "="
92
+ - !ruby/object:Gem::Version
93
+ hash: 25
94
+ segments:
95
+ - 1
96
+ - 3
97
+ - 1
98
+ version: 1.3.1
99
+ requirement: *id005
100
+ - !ruby/object:Gem::Dependency
101
+ prerelease: false
102
+ name: sqlite3-ruby
103
+ type: :development
104
+ version_requirements: &id006 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ hash: 3
110
+ segments:
111
+ - 0
112
+ version: "0"
113
+ requirement: *id006
114
+ description: fake_arel will simulate rails 3 arel syntax for Rails 2.
115
+ email: grant@pipelinedealsco.com
61
116
  executables: []
62
117
 
63
118
  extensions: []
64
119
 
65
120
  extra_rdoc_files:
66
- - History.txt
67
- - Manifest.txt
121
+ - LICENSE.txt
122
+ - README.md
68
123
  files:
69
124
  - Gemfile
70
125
  - Gemfile.lock
71
126
  - History.txt
127
+ - LICENSE.txt
72
128
  - Manifest.txt
73
- - README.rdoc
129
+ - README.md
74
130
  - Rakefile
131
+ - VERSION
75
132
  - fake_arel.gemspec
76
133
  - lib/fake_arel.rb
77
134
  - lib/fake_arel/calculations.rb
78
135
  - lib/fake_arel/extensions.rb
79
136
  - lib/fake_arel/rails_3_finders.rb
137
+ - lib/fake_arel/selectable_includes.rb
80
138
  - lib/fake_arel/singleton_class.rb
81
139
  - lib/fake_arel/with_scope_replacement.rb
82
140
  - script/console
@@ -92,17 +150,14 @@ files:
92
150
  - spec/fixtures/topics.yml
93
151
  - spec/spec.opts
94
152
  - spec/spec_helper.rb
95
- - spec/test.db
96
153
  - tasks/rspec.rake
97
- - .gemtest
98
154
  has_rdoc: true
99
155
  homepage: http://github.com/gammons/fake_arel
100
- licenses: []
101
-
156
+ licenses:
157
+ - MIT
102
158
  post_install_message:
103
- rdoc_options:
104
- - --main
105
- - README.rdoc
159
+ rdoc_options: []
160
+
106
161
  require_paths:
107
162
  - lib
108
163
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -117,18 +172,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
117
172
  required_rubygems_version: !ruby/object:Gem::Requirement
118
173
  none: false
119
174
  requirements:
120
- - - ">="
175
+ - - ">"
121
176
  - !ruby/object:Gem::Version
122
- hash: 3
177
+ hash: 25
123
178
  segments:
124
- - 0
125
- version: "0"
179
+ - 1
180
+ - 3
181
+ - 1
182
+ version: 1.3.1
126
183
  requirements: []
127
184
 
128
- rubyforge_project: fake_arel
185
+ rubyforge_project:
129
186
  rubygems_version: 1.4.2
130
187
  signing_key:
131
188
  specification_version: 3
132
- summary: "* Tired of waiting for Rails 3 and its new super-sweet query interface? Try fake_arel! * Fake_arel is a gem that will simulate the new Rails 3 query interface, using named_scopes and a couple small patches to ActiveRecord"
189
+ summary: "fake_arel: a Rails 3 query interface to Rails 2"
133
190
  test_files: []
134
191
 
data/.gemtest DELETED
File without changes
data/README.rdoc DELETED
@@ -1,91 +0,0 @@
1
- == Fake_arel: Rails 3 Query Interface for Rails 2
2
-
3
- http://github.com/gammons/fake_arel
4
-
5
- == DESCRIPTION:
6
-
7
- * Tired of waiting for Rails 3 and its new super-sweet query interface? Try fake_arel!
8
-
9
- * Fake_arel is a gem that will simulate the new Rails 3 query interface, using named_scopes and a couple small patches to ActiveRecord.
10
-
11
- * This should serve as a nice bridge between Rails 2 and Rails 3 apps, and can be removed once upgrading your app to rails 3, and everything (hopefully) should still work.
12
-
13
- == SYNOPSIS:
14
-
15
- * All the finders described on Pratik's blog have been implemented. (http://m.onkey.org/2010/1/22/active-record-query-interface)
16
-
17
- Reply.where(:id => 1)
18
- Reply.select("content,id").where("id > 1").order("id desc").limit(1)
19
- Topic.joins(:replies).limit(1)
20
-
21
- * Additionally, named_scopes are very similar to Rails 3 relations, in that they are lazily loaded.
22
-
23
- >> Reply.where(:name => "John").class
24
- ActiveRecord::NamedScope::Scope
25
-
26
- * Also implemented was <tt>to_sql</tt>. <tt>to_sql</tt> will work on any chained query.
27
- >> Topic.joins(:replies).limit(1).to_sql
28
- "SELECT \"topics\".* FROM \"topics\" INNER JOIN \"replies\" ON replies.topic_id = topics.id LIMIT 1"
29
-
30
- * <tt>named_scope</tt> was modified to include other <tt>named_scope</tt>s, so you can chain them together.
31
-
32
- class Reply < ActiveRecord::Base
33
- named_scope :by_john, where(:name => "John")
34
- named_scope :recent, lambda {|t| where("created_at > ? ", t.minutes.ago) }
35
- named_scope :recent_by_john, recent(15).by_john
36
- end
37
-
38
- === Recently Added!
39
-
40
- * <tt>or</tt> syntax. Because named scopes load lazily, we're able to pass the scope to another scope, in this case, <tr>or</tr>.
41
-
42
- q1 = Reply.where(:id => 1)
43
- q2 = Reply.where(:id => 2)
44
- q3 = Reply.where(:id => 3)
45
- q4 = Reply.where(:id => 4)
46
-
47
- Reply.or(q1,q2).all.map(&:id) # equals [1,2]
48
- Reply.or(q1,q2,q3).all.map(&:id) # equals [1,2,3]
49
-
50
- or1 = Reply.or(q1,q2)
51
- or2 = Reply.or(q3,q4)
52
- Reply.or(or1,or2).all.map(&:id) # equals [1,2,3,4]
53
-
54
-
55
- == REQUIREMENTS:
56
-
57
- * >= ActiveRecord 2.3.5
58
-
59
- == INSTALL:
60
-
61
- * gem install fake_arel
62
-
63
- == AUTHORS:
64
-
65
- * Grant Ammons
66
- * Sokolov Yura
67
-
68
- == LICENSE:
69
-
70
- (The MIT License)
71
-
72
- Copyright (c) 2010 Grant Ammons (grant@pipelinedealsco.com)
73
-
74
- Permission is hereby granted, free of charge, to any person obtaining
75
- a copy of this software and associated documentation files (the
76
- 'Software'), to deal in the Software without restriction, including
77
- without limitation the rights to use, copy, modify, merge, publish,
78
- distribute, sublicense, and/or sell copies of the Software, and to
79
- permit persons to whom the Software is furnished to do so, subject to
80
- the following conditions:
81
-
82
- The above copyright notice and this permission notice shall be
83
- included in all copies or substantial portions of the Software.
84
-
85
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
86
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
87
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
88
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
89
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
90
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
91
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/spec/test.db DELETED
Binary file