Skip to content

Commit

Permalink
Support for ActiveRecord 3.1
Browse files Browse the repository at this point in the history
  • Loading branch information
staugaard committed Dec 9, 2011
1 parent ebae05a commit 519faaf
Show file tree
Hide file tree
Showing 18 changed files with 583 additions and 63 deletions.
9 changes: 9 additions & 0 deletions Appraisals
@@ -0,0 +1,9 @@
appraise "activerecord-2.3" do
gem 'activerecord', '~> 2.3.4'
gem 'temping', '~> 1.3.0'
end

appraise "activerecord-3.1" do
gem 'activerecord', '~> 3.1.1'
gem 'temping', '~> 2.0.4'
end
24 changes: 12 additions & 12 deletions Gemfile
@@ -1,15 +1,15 @@
source "http://rubygems.org"

gem 'activerecord', '~> 2.3.4'
gem 'appraisal'
gem 'rake'
gem 'bundler'
gem 'shoulda'
gem 'mocha'
gem 'sqlite3', :platforms => :ruby
gem 'activerecord-jdbcsqlite3-adapter', :platforms => :jruby
gem 'ruby-debug', :platforms => :mri_18
gem 'ruby-debug19', :platforms => :mri_19

group :development do
gem 'rake'
gem 'bundler'
gem 'shoulda'
gem 'mocha'
gem 'temping', '~> 1.3.0'
gem 'sqlite3', :platforms => :ruby
gem 'activerecord-jdbcsqlite3-adapter', :platforms => :jruby
gem 'ruby-debug', :platforms => :mri_18
gem 'ruby-debug19', :platforms => :mri_19
end
#these are overridden in the Appraisals file
gem 'activerecord', '~> 3.1.1'
gem 'temping', '~> 2.0.4'
4 changes: 3 additions & 1 deletion Rakefile
@@ -1,6 +1,8 @@
require 'bundler'
require 'bundler/setup'
Bundler::GemHelper.install_tasks

require 'appraisal'

require 'rake/testtask'
Rake::TestTask.new(:test) do |test|
test.libs << 'lib' << 'test'
Expand Down
16 changes: 16 additions & 0 deletions gemfiles/activerecord-2.3.gemfile
@@ -0,0 +1,16 @@
# This file was generated by Appraisal

source "http://rubygems.org"

gem "appraisal"
gem "rake"
gem "bundler"
gem "shoulda"
gem "mocha"
gem "sqlite3", :platforms=>:ruby
gem "activerecord-jdbcsqlite3-adapter", :platforms=>:jruby
gem "ruby-debug", :platforms=>:mri_18
gem "ruby-debug19", :platforms=>:mri_19
gem "activerecord", "~> 2.3.4"
gem "temping", "~> 1.3.0"

76 changes: 76 additions & 0 deletions gemfiles/activerecord-2.3.gemfile.lock
@@ -0,0 +1,76 @@
GEM
remote: http://rubygems.org/
specs:
actionmailer (2.3.14)
actionpack (= 2.3.14)
actionpack (2.3.14)
activesupport (= 2.3.14)
rack (~> 1.1.0)
activerecord (2.3.14)
activesupport (= 2.3.14)
activerecord-jdbc-adapter (1.2.1)
activerecord-jdbcsqlite3-adapter (1.2.1)
activerecord-jdbc-adapter (~> 1.2.1)
jdbc-sqlite3 (~> 3.7.2)
activeresource (2.3.14)
activesupport (= 2.3.14)
activesupport (2.3.14)
appraisal (0.4.0)
bundler
rake
archive-tar-minitar (0.5.2)
columnize (0.3.5)
jdbc-sqlite3 (3.7.2)
linecache (0.46)
rbx-require-relative (> 0.0.4)
linecache19 (0.5.12)
ruby_core_source (>= 0.1.4)
metaclass (0.0.1)
mocha (0.10.0)
metaclass (~> 0.0.1)
rack (1.1.2)
rails (2.3.14)
actionmailer (= 2.3.14)
actionpack (= 2.3.14)
activerecord (= 2.3.14)
activeresource (= 2.3.14)
activesupport (= 2.3.14)
rake (>= 0.8.3)
rake (0.9.2.2)
rbx-require-relative (0.0.5)
ruby-debug (0.10.4)
columnize (>= 0.1)
ruby-debug-base (~> 0.10.4.0)
ruby-debug-base (0.10.4)
linecache (>= 0.3)
ruby-debug-base19 (0.11.25)
columnize (>= 0.3.1)
linecache19 (>= 0.5.11)
ruby_core_source (>= 0.1.4)
ruby-debug19 (0.11.6)
columnize (>= 0.3.1)
linecache19 (>= 0.5.11)
ruby-debug-base19 (>= 0.11.19)
ruby_core_source (0.1.5)
archive-tar-minitar (>= 0.5.2)
shoulda (2.11.3)
sqlite3 (1.3.5)
temping (1.3.0)
rails (>= 2.3.3)

PLATFORMS
java
ruby

DEPENDENCIES
activerecord (~> 2.3.4)
activerecord-jdbcsqlite3-adapter
appraisal
bundler
mocha
rake
ruby-debug
ruby-debug19
shoulda
sqlite3
temping (~> 1.3.0)
16 changes: 16 additions & 0 deletions gemfiles/activerecord-3.1.gemfile
@@ -0,0 +1,16 @@
# This file was generated by Appraisal

source "http://rubygems.org"

gem "appraisal"
gem "rake"
gem "bundler"
gem "shoulda"
gem "mocha"
gem "sqlite3", :platforms=>:ruby
gem "activerecord-jdbcsqlite3-adapter", :platforms=>:jruby
gem "ruby-debug", :platforms=>:mri_18
gem "ruby-debug19", :platforms=>:mri_19
gem "activerecord", "~> 3.1.1"
gem "temping", "~> 2.0.4"

76 changes: 76 additions & 0 deletions gemfiles/activerecord-3.1.gemfile.lock
@@ -0,0 +1,76 @@
GEM
remote: http://rubygems.org/
specs:
activemodel (3.1.3)
activesupport (= 3.1.3)
builder (~> 3.0.0)
i18n (~> 0.6)
activerecord (3.1.3)
activemodel (= 3.1.3)
activesupport (= 3.1.3)
arel (~> 2.2.1)
tzinfo (~> 0.3.29)
activerecord-jdbc-adapter (1.2.1)
activerecord-jdbcsqlite3-adapter (1.2.1)
activerecord-jdbc-adapter (~> 1.2.1)
jdbc-sqlite3 (~> 3.7.2)
activesupport (3.1.3)
multi_json (~> 1.0)
appraisal (0.4.0)
bundler
rake
archive-tar-minitar (0.5.2)
arel (2.2.1)
builder (3.0.0)
columnize (0.3.5)
i18n (0.6.0)
jdbc-sqlite3 (3.7.2)
linecache (0.46)
rbx-require-relative (> 0.0.4)
linecache19 (0.5.12)
ruby_core_source (>= 0.1.4)
metaclass (0.0.1)
mocha (0.10.0)
metaclass (~> 0.0.1)
multi_json (1.0.4)
rake (0.9.2.2)
rbx-require-relative (0.0.5)
ruby-debug (0.10.4)
columnize (>= 0.1)
ruby-debug-base (~> 0.10.4.0)
ruby-debug-base (0.10.4)
linecache (>= 0.3)
ruby-debug-base19 (0.11.25)
columnize (>= 0.3.1)
linecache19 (>= 0.5.11)
ruby_core_source (>= 0.1.4)
ruby-debug19 (0.11.6)
columnize (>= 0.3.1)
linecache19 (>= 0.5.11)
ruby-debug-base19 (>= 0.11.19)
ruby_core_source (0.1.5)
archive-tar-minitar (>= 0.5.2)
shoulda (2.11.3)
sqlite3 (1.3.5)
temping (2.0.4)
activerecord (~> 3.1.1)
activesupport (~> 3.1.1)
sqlite3 (~> 1.3.4)
tzinfo (0.3.31)

PLATFORMS
java
ruby

DEPENDENCIES
activerecord (~> 3.1.1)
activerecord-jdbcsqlite3-adapter
appraisal
bundler
mocha
rake
ruby-debug
ruby-debug19
shoulda
sqlite3
temping (~> 2.0.4)
4 changes: 2 additions & 2 deletions kasket.gemspec
@@ -1,7 +1,7 @@
# -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)

require 'kasket'
require 'kasket/version'

Gem::Specification.new do |s|
s.name = "kasket"
Expand All @@ -12,7 +12,7 @@ Gem::Specification.new do |s|
s.summary = "A write back caching layer on active record"
s.description = "puts a cap on your queries"

s.add_runtime_dependency("activerecord", "~> 2.3.4")
s.add_runtime_dependency("activerecord", ">= 2.3.4", "< 3.2")

s.add_development_dependency("rake")
s.add_development_dependency("bundler")
Expand Down
27 changes: 15 additions & 12 deletions lib/kasket.rb
Expand Up @@ -2,33 +2,36 @@
require 'active_record'
require 'active_support'

require 'kasket/active_record_patches'
require 'kasket/version'
#require 'kasket/active_record_patches'

module Kasket
autoload :ConfigurationMixin, 'kasket/configuration_mixin'
autoload :ReloadAssociationMixin, 'kasket/reload_association_mixin'
autoload :Query, 'kasket/query'
autoload :Visitor, 'kasket/visitor'
autoload :SelectManagerMixin, 'kasket/select_manager_mixin'
autoload :RelationMixin, 'kasket/relation_mixin'

CONFIGURATION = {:max_collection_size => 100}

class Version
MAJOR = 1
MINOR = 0
PATCH = 2
STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
end

module_function

def setup(options = {})
return if ActiveRecord::Base.extended_by.member?(Kasket::ConfigurationMixin)
return if ActiveRecord::Base.respond_to?(:has_kasket)

CONFIGURATION[:max_collection_size] = options[:max_collection_size] if options[:max_collection_size]

ActiveRecord::Base.extend(Kasket::ConfigurationMixin)
ActiveRecord::Associations::BelongsToAssociation.send(:include, Kasket::ReloadAssociationMixin)
ActiveRecord::Associations::BelongsToPolymorphicAssociation.send(:include, Kasket::ReloadAssociationMixin)
ActiveRecord::Associations::HasOneThroughAssociation.send(:include, Kasket::ReloadAssociationMixin)

if defined?(ActiveRecord::Relation)
ActiveRecord::Relation.send(:include, Kasket::RelationMixin)
Arel::SelectManager.send(:include, Kasket::SelectManagerMixin)
end

# ActiveRecord::Associations::BelongsToAssociation.send(:include, Kasket::ReloadAssociationMixin)
# ActiveRecord::Associations::BelongsToPolymorphicAssociation.send(:include, Kasket::ReloadAssociationMixin)
# ActiveRecord::Associations::HasOneThroughAssociation.send(:include, Kasket::ReloadAssociationMixin)
end

def self.cache_store=(options)
Expand Down
17 changes: 13 additions & 4 deletions lib/kasket/read_mixin.rb
Expand Up @@ -8,8 +8,17 @@ class << base
end
end

def find_by_sql_with_kasket(sql)
query = kasket_parser.parse(sanitize_sql(sql)) if use_kasket?
def find_by_sql_with_kasket(*args)
sql = args[0]

if use_kasket?
if sql.is_a?(String)
query = kasket_parser.parse(sanitize_sql(sql))
else
query = sql.to_kasket_query(self, args[1])
end
end

if query && has_kasket_index_on?(query[:index])
if query[:key].is_a?(Array)
find_by_sql_with_kasket_on_id_array(query[:key])
Expand All @@ -21,11 +30,11 @@ def find_by_sql_with_kasket(sql)
Array.wrap(value).collect { |record| instantiate(record.dup) }
end
else
store_in_kasket(query[:key], find_by_sql_without_kasket(sql))
store_in_kasket(query[:key], find_by_sql_without_kasket(*args))
end
end
else
find_by_sql_without_kasket(sql)
find_by_sql_without_kasket(*args)
end
end

Expand Down
9 changes: 9 additions & 0 deletions lib/kasket/relation_mixin.rb
@@ -0,0 +1,9 @@
module Kasket
module RelationMixin
def to_kasket_query(binds = [])
if arel.is_a?(Arel::SelectManager)
arel.to_kasket_query(klass, binds)
end
end
end
end
26 changes: 26 additions & 0 deletions lib/kasket/select_manager_mixin.rb
@@ -0,0 +1,26 @@
module Kasket
module SelectManagerMixin
def to_kasket_query(klass, binds = [])
query = Kasket::Visitor.new(klass, binds).accept(ast)

return nil if query.nil? || query == :unsupported
return nil if query[:attributes].blank?

query[:index] = query[:attributes].map(&:first)

if query[:limit]
return nil if query[:limit] > 1
# return nil if !query[:index].include?(:id)
end

if query[:index].size > 1 && query[:attributes].any? { |attribute, value| value.is_a?(Array) }
return nil
end

query[:key] = klass.kasket_key_for(query[:attributes])
query[:key] << '/first' if query[:limit] == 1 && query[:index] != [:id]

query
end
end
end
9 changes: 9 additions & 0 deletions lib/kasket/version.rb
@@ -0,0 +1,9 @@
# -*- encoding: utf-8 -*-
module Kasket
class Version
MAJOR = 2
MINOR = 0
PATCH = 0
STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
end
end

0 comments on commit 519faaf

Please sign in to comment.