Skip to content

Commit

Permalink
bring activesupport memoizable into dnz namespace and increment version
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeremy Wells committed Oct 14, 2009
1 parent ffa0d0c commit 976bdfc
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 2 deletions.
8 changes: 8 additions & 0 deletions History.txt
@@ -1,3 +1,11 @@
=== 0.0.4 2009-09-14

* Bring memoizable from ActiveSupport into DNZ namespace.

=== 0.0.3 2009-09-13

* Support for filtering by facet.

=== 0.0.1 2009-07-14

* 1 major enhancement:
Expand Down
1 change: 1 addition & 0 deletions Manifest.txt
Expand Up @@ -11,6 +11,7 @@ lib/dnz/facet.rb
lib/dnz/facet_array.rb
lib/dnz/result.rb
lib/dnz/search.rb
lib/dnz/memoizable.rb
lib/dnz/error/invalid_api_key.rb
script/console
script/destroy
Expand Down
2 changes: 1 addition & 1 deletion lib/dnz.rb
Expand Up @@ -4,5 +4,5 @@
require 'dnz/client'

module Dnz
VERSION = '0.0.3'
VERSION = '0.0.4'
end
100 changes: 100 additions & 0 deletions lib/dnz/memoizable.rb
@@ -0,0 +1,100 @@
module DNZ
module Memoizable
def self.memoized_ivar_for(symbol)
"@_memoized_#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}".to_sym
end

module InstanceMethods
def self.included(base)
base.class_eval do
unless base.method_defined?(:freeze_without_memoizable)
alias_method_chain :freeze, :memoizable
end
end
end

def freeze_with_memoizable
memoize_all unless frozen?
freeze_without_memoizable
end

def memoize_all
prime_cache ".*"
end

def unmemoize_all
flush_cache ".*"
end

def prime_cache(*syms)
syms.each do |sym|
methods.each do |m|
if m.to_s =~ /^_unmemoized_(#{sym})/
if method(m).arity == 0
__send__($1)
else
ivar = ActiveSupport::Memoizable.memoized_ivar_for($1)
instance_variable_set(ivar, {})
end
end
end
end
end

def flush_cache(*syms, &block)
syms.each do |sym|
(methods + private_methods + protected_methods).each do |m|
if m.to_s =~ /^_unmemoized_(#{sym})/
ivar = ActiveSupport::Memoizable.memoized_ivar_for($1)
instance_variable_get(ivar).clear if instance_variable_defined?(ivar)
end
end
end
end
end

def memoize(*symbols)
symbols.each do |symbol|
original_method = :"_unmemoized_#{symbol}"
memoized_ivar = ActiveSupport::Memoizable.memoized_ivar_for(symbol)

class_eval <<-EOS, __FILE__, __LINE__
include InstanceMethods # include InstanceMethods
#
if method_defined?(:#{original_method}) # if method_defined?(:_unmemoized_mime_type)
raise "Already memoized #{symbol}" # raise "Already memoized mime_type"
end # end
alias #{original_method} #{symbol} # alias _unmemoized_mime_type mime_type
#
if instance_method(:#{symbol}).arity == 0 # if instance_method(:mime_type).arity == 0
def #{symbol}(reload = false) # def mime_type(reload = false)
if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty? # if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty?
#{memoized_ivar} = [#{original_method}.freeze] # @_memoized_mime_type = [_unmemoized_mime_type.freeze]
end # end
#{memoized_ivar}[0] # @_memoized_mime_type[0]
end # end
else # else
def #{symbol}(*args) # def mime_type(*args)
#{memoized_ivar} ||= {} unless frozen? # @_memoized_mime_type ||= {} unless frozen?
reload = args.pop if args.last == true || args.last == :reload # reload = args.pop if args.last == true || args.last == :reload
#
if defined?(#{memoized_ivar}) && #{memoized_ivar} # if defined?(@_memoized_mime_type) && @_memoized_mime_type
if !reload && #{memoized_ivar}.has_key?(args) # if !reload && @_memoized_mime_type.has_key?(args)
#{memoized_ivar}[args] # @_memoized_mime_type[args]
elsif #{memoized_ivar} # elsif @_memoized_mime_type
#{memoized_ivar}[args] = #{original_method}(*args).freeze # @_memoized_mime_type[args] = _unmemoized_mime_type(*args).freeze
end # end
else # else
#{original_method}(*args) # _unmemoized_mime_type(*args)
end # end
end # end
end # end
#
if private_method_defined?(#{original_method.inspect}) # if private_method_defined?(:_unmemoized_mime_type)
private #{symbol.inspect} # private :mime_type
end # end
EOS
end
end
end
end
3 changes: 2 additions & 1 deletion lib/dnz/search.rb
Expand Up @@ -2,6 +2,7 @@
require 'dnz/result'
require 'dnz/facet_array'
require 'dnz/facet'
require 'dnz/memoizable'

begin
gem 'mislav-will_paginate' rescue nil
Expand All @@ -19,7 +20,7 @@ module DNZ
class Search
attr_reader :result_count

extend ActiveSupport::Memoizable
extend DNZ::Memoizable

# Constructor for Search class. Do not call this directly, instead use the <tt>Client.search</tt> method.
def initialize(client, search_options)
Expand Down

0 comments on commit 976bdfc

Please sign in to comment.