Permalink
Browse files

Inline code comments for class_eval/module_eval [#1657 state:resolved]

Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
  • Loading branch information...
fxn authored and lifo committed Dec 28, 2008
1 parent 1fb2755 commit a2270ef2594b97891994848138614657363f2806
Showing with 373 additions and 296 deletions.
  1. +3 −3 actionpack/lib/action_controller/helpers.rb
  2. +3 −3 actionpack/lib/action_controller/mime_responds.rb
  3. +11 −7 actionpack/lib/action_controller/polymorphic_routes.rb
  4. +31 −30 actionpack/lib/action_controller/routing/route_set.rb
  5. +7 −3 actionpack/lib/action_view/helpers/form_helper.rb
  6. +18 −18 activerecord/lib/active_record/associations.rb
  7. +47 −1 activerecord/lib/active_record/base.rb
  8. +6 −6 activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb
  9. +24 −24 activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
  10. +13 −11 activerecord/lib/active_record/connection_adapters/mysql_adapter.rb
  11. +7 −7 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
  12. +1 −1 activerecord/lib/active_record/dirty.rb
  13. +8 −0 activeresource/lib/active_resource/http_mock.rb
  14. +7 −7 activesupport/lib/active_support/buffered_logger.rb
  15. +18 −14 activesupport/lib/active_support/callbacks.rb
  16. +24 −24 activesupport/lib/active_support/core_ext/class/attribute_accessors.rb
  17. +20 −19 activesupport/lib/active_support/core_ext/class/delegating_attributes.rb
  18. +34 −34 activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb
  19. +6 −6 activesupport/lib/active_support/core_ext/logger.rb
  20. +3 −3 activesupport/lib/active_support/core_ext/module/aliasing.rb
  21. +4 −4 activesupport/lib/active_support/core_ext/module/attr_accessor_with_default.rb
  22. +24 −24 activesupport/lib/active_support/core_ext/module/attribute_accessors.rb
  23. +3 −3 activesupport/lib/active_support/core_ext/module/delegation.rb
  24. +5 −5 activesupport/lib/active_support/core_ext/module/synchronization.rb
  25. +9 −4 activesupport/lib/active_support/deprecation.rb
  26. +30 −28 activesupport/lib/active_support/memoizable.rb
  27. +4 −4 activesupport/lib/active_support/multibyte/unicode_database.rb
  28. +3 −3 activesupport/lib/active_support/time_with_zone.rb
@@ -163,9 +163,9 @@ def helper(*args, &block)
def helper_method(*methods)
methods.flatten.each do |method|
master_helper_module.module_eval <<-end_eval
def #{method}(*args, &block)
controller.send(%(#{method}), *args, &block)
end
def #{method}(*args, &block) # def current_user(*args, &block)
controller.send(%(#{method}), *args, &block) # controller.send(%(current_user), *args, &block)
end # end
end_eval
end
end
@@ -148,9 +148,9 @@ def self.generate_method_for_mime(mime)
sym = mime.is_a?(Symbol) ? mime : mime.to_sym
const = sym.to_s.upcase
class_eval <<-RUBY, __FILE__, __LINE__ + 1
def #{sym}(&block) # def html(&block)
custom(Mime::#{const}, &block) # custom(Mime::HTML, &block)
end # end
def #{sym}(&block) # def html(&block)
custom(Mime::#{const}, &block) # custom(Mime::HTML, &block)
end # end
RUBY
end
@@ -118,13 +118,17 @@ def polymorphic_path(record_or_hash_or_array, options = {})
%w(edit new).each do |action|
module_eval <<-EOT, __FILE__, __LINE__
def #{action}_polymorphic_url(record_or_hash, options = {})
polymorphic_url(record_or_hash, options.merge(:action => "#{action}"))
end
def #{action}_polymorphic_path(record_or_hash, options = {})
polymorphic_url(record_or_hash, options.merge(:action => "#{action}", :routing_type => :path))
end
def #{action}_polymorphic_url(record_or_hash, options = {}) # def edit_polymorphic_url(record_or_hash, options = {})
polymorphic_url( # polymorphic_url(
record_or_hash, # record_or_hash,
options.merge(:action => "#{action}")) # options.merge(:action => "edit"))
end # end
#
def #{action}_polymorphic_path(record_or_hash, options = {}) # def edit_polymorphic_path(record_or_hash, options = {})
polymorphic_url( # polymorphic_url(
record_or_hash, # record_or_hash,
options.merge(:action => "#{action}", :routing_type => :path)) # options.merge(:action => "edit", :routing_type => :path))
end # end
EOT
end
@@ -145,10 +145,10 @@ def named_helper_module_eval(code, *args)
def define_hash_access(route, name, kind, options)
selector = hash_access_name(name, kind)
named_helper_module_eval <<-end_eval # We use module_eval to avoid leaks
def #{selector}(options = nil)
options ? #{options.inspect}.merge(options) : #{options.inspect}
end
protected :#{selector}
def #{selector}(options = nil) # def hash_for_users_url(options = nil)
options ? #{options.inspect}.merge(options) : #{options.inspect} # options ? {:only_path=>false}.merge(options) : {:only_path=>false}
end # end
protected :#{selector} # protected :hash_for_users_url
end_eval
helpers << selector
end
@@ -173,32 +173,33 @@ def define_url_helper(route, name, kind, options)
# foo_url(bar, baz, bang, :sort_by => 'baz')
#
named_helper_module_eval <<-end_eval # We use module_eval to avoid leaks
def #{selector}(*args)
#{generate_optimisation_block(route, kind)}
opts = if args.empty? || Hash === args.first
args.first || {}
else
options = args.extract_options!
args = args.zip(#{route.segment_keys.inspect}).inject({}) do |h, (v, k)|
h[k] = v
h
end
options.merge(args)
end
url_for(#{hash_access_method}(opts))
end
#Add an alias to support the now deprecated formatted_* URL.
def formatted_#{selector}(*args)
ActiveSupport::Deprecation.warn(
"formatted_#{selector}() has been deprecated. please pass format to the standard" +
"#{selector}() method instead.", caller)
#{selector}(*args)
end
protected :#{selector}
def #{selector}(*args) # def users_url(*args)
#
#{generate_optimisation_block(route, kind)} # #{generate_optimisation_block(route, kind)}
#
opts = if args.empty? || Hash === args.first # opts = if args.empty? || Hash === args.first
args.first || {} # args.first || {}
else # else
options = args.extract_options! # options = args.extract_options!
args = args.zip(#{route.segment_keys.inspect}).inject({}) do |h, (v, k)| # args = args.zip([]).inject({}) do |h, (v, k)|
h[k] = v # h[k] = v
h # h
end # end
options.merge(args) # options.merge(args)
end # end
#
url_for(#{hash_access_method}(opts)) # url_for(hash_for_users_url(opts))
#
end # end
#Add an alias to support the now deprecated formatted_* URL. # #Add an alias to support the now deprecated formatted_* URL.
def formatted_#{selector}(*args) # def formatted_users_url(*args)
ActiveSupport::Deprecation.warn( # ActiveSupport::Deprecation.warn(
"formatted_#{selector}() has been deprecated. " + # "formatted_users_url() has been deprecated. " +
"please pass format to the standard" + # "please pass format to the standard" +
"#{selector}() method instead.", caller) # "users_url() method instead.", caller)
#{selector}(*args) # users_url(*args)
end # end
protected :#{selector} # protected :users_url
end_eval
helpers << selector
end
@@ -737,9 +737,13 @@ def initialize(object_name, object, template, options, proc)
(field_helpers - %w(label check_box radio_button fields_for)).each do |selector|
src = <<-end_src
def #{selector}(method, options = {})
@template.send(#{selector.inspect}, @object_name, method, objectify_options(options))
end
def #{selector}(method, options = {}) # def text_field(method, options = {})
@template.send( # @template.send(
#{selector.inspect}, # "text_field",
@object_name, # @object_name,
method, # method,
objectify_options(options)) # objectify_options(options))
end # end
end_src
class_eval src, __FILE__, __LINE__
end
@@ -1216,11 +1216,11 @@ def has_and_belongs_to_many(association_id, options = {}, &extension)
# callbacks will be executed after the association is wiped out.
old_method = "destroy_without_habtm_shim_for_#{reflection.name}"
class_eval <<-end_eval unless method_defined?(old_method)
alias_method :#{old_method}, :destroy_without_callbacks
def destroy_without_callbacks
#{reflection.name}.clear
#{old_method}
end
alias_method :#{old_method}, :destroy_without_callbacks # alias_method :destroy_without_habtm_shim_for_posts, :destroy_without_callbacks
def destroy_without_callbacks # def destroy_without_callbacks
#{reflection.name}.clear # posts.clear
#{old_method} # destroy_without_habtm_shim_for_posts
end # end
end_eval
add_association_callbacks(reflection.name, options)
@@ -1463,22 +1463,22 @@ def configure_dependency_for_has_many(reflection, extra_conditions = nil)
before_destroy method_name
when :delete_all
module_eval %Q{
before_destroy do |record|
delete_all_has_many_dependencies(record,
"#{reflection.name}",
#{reflection.class_name},
%@#{dependent_conditions}@)
end
before_destroy do |record| # before_destroy do |record|
delete_all_has_many_dependencies(record, # delete_all_has_many_dependencies(record,
"#{reflection.name}", # "posts",
#{reflection.class_name}, # Post,
%@#{dependent_conditions}@) # %@...@) # this is a string literal like %(...)
end # end
}
when :nullify
module_eval %Q{
before_destroy do |record|
nullify_has_many_dependencies(record,
"#{reflection.name}",
#{reflection.class_name},
"#{reflection.primary_key_name}",
%@#{dependent_conditions}@)
end
before_destroy do |record| # before_destroy do |record|
nullify_has_many_dependencies(record, # nullify_has_many_dependencies(record,
"#{reflection.name}", # "posts",
#{reflection.class_name}, # Post,
"#{reflection.primary_key_name}", # "user_id",
%@#{dependent_conditions}@) # %@...@) # this is a string literal like %(...)
end # end
}
else
raise ArgumentError, "The :dependent option expects either :destroy, :delete_all, or :nullify (#{reflection.options[:dependent].inspect})"
@@ -1818,10 +1818,31 @@ def method_missing(method_id, *arguments, &block)
if match.finder?
finder = match.finder
bang = match.bang?
# def self.find_by_login_and_activated(*args)
# options = args.extract_options!
# attributes = construct_attributes_from_arguments(
# [:login,:activated],
# args
# )
# finder_options = { :conditions => attributes }
# validate_find_options(options)
# set_readonly_option!(options)
#
# if options[:conditions]
# with_scope(:find => finder_options) do
# find(:first, options)
# end
# else
# find(:first, options.merge(finder_options))
# end
# end
self.class_eval %{
def self.#{method_id}(*args)
options = args.extract_options!
attributes = construct_attributes_from_arguments([:#{attribute_names.join(',:')}], args)
attributes = construct_attributes_from_arguments(
[:#{attribute_names.join(',:')}],
args
)
finder_options = { :conditions => attributes }
validate_find_options(options)
set_readonly_option!(options)
@@ -1839,6 +1860,31 @@ def self.#{method_id}(*args)
send(method_id, *arguments)
elsif match.instantiator?
instantiator = match.instantiator
# def self.find_or_create_by_user_id(*args)
# guard_protected_attributes = false
#
# if args[0].is_a?(Hash)
# guard_protected_attributes = true
# attributes = args[0].with_indifferent_access
# find_attributes = attributes.slice(*[:user_id])
# else
# find_attributes = attributes = construct_attributes_from_arguments([:user_id], args)
# end
#
# options = { :conditions => find_attributes }
# set_readonly_option!(options)
#
# record = find(:first, options)
#
# if record.nil?
# record = self.new { |r| r.send(:attributes=, attributes, guard_protected_attributes) }
# yield(record) if block_given?
# record.save
# record
# else
# record
# end
# end
self.class_eval %{
def self.#{method_id}(*args)
guard_protected_attributes = false
@@ -14,12 +14,12 @@ def included(base)
def dirties_query_cache(base, *method_names)
method_names.each do |method_name|
base.class_eval <<-end_code, __FILE__, __LINE__
def #{method_name}_with_query_dirty(*args)
clear_query_cache if @query_cache_enabled
#{method_name}_without_query_dirty(*args)
end
alias_method_chain :#{method_name}, :query_dirty
def #{method_name}_with_query_dirty(*args) # def update_with_query_dirty(*args)
clear_query_cache if @query_cache_enabled # clear_query_cache if @query_cache_enabled
#{method_name}_without_query_dirty(*args) # update_without_query_dirty(*args)
end # end
#
alias_method_chain :#{method_name}, :query_dirty # alias_method_chain :update, :query_dirty
end_code
end
end
Oops, something went wrong.

5 comments on commit a2270ef

@jherdman

This comment has been minimized.

Show comment
Hide comment
@jherdman

jherdman Dec 29, 2008

Beautiful. I like this.

jherdman replied Dec 29, 2008

Beautiful. I like this.

@anildigital

This comment has been minimized.

Show comment
Hide comment
@anildigital

anildigital Dec 29, 2008

Contributor

nice

Contributor

anildigital replied Dec 29, 2008

nice

@rsanheim

This comment has been minimized.

Show comment
Hide comment
@rsanheim

rsanheim Dec 30, 2008

Contributor

Feels like this should be a language feature, or at least a post processing tool.

Contributor

rsanheim replied Dec 30, 2008

Feels like this should be a language feature, or at least a post processing tool.

@NathanZook

This comment has been minimized.

Show comment
Hide comment
@NathanZook

NathanZook Jan 15, 2009

Contributor

There are a couple of places where there are comments above the code, rather than beside. The end result can appear to be code which has been disabled, rather than an explanation. In particular, I think that the annotation in activerecord/lib/active_record/base.rb needs to be annotated.

Contributor

NathanZook replied Jan 15, 2009

There are a couple of places where there are comments above the code, rather than beside. The end result can appear to be code which has been disabled, rather than an explanation. In particular, I think that the annotation in activerecord/lib/active_record/base.rb needs to be annotated.

@fxn

This comment has been minimized.

Show comment
Hide comment
@fxn

fxn Feb 22, 2009

Member

Yes, we discussed the trade-offs in the IRC.

Those examples are there exceptionally because the lines would be really too wide. Check the section “Dinamically Generated Method” of the API conventions (http://wiki.github.com/lifo/docrails/rails-api-documentation-conventions)

Member

fxn replied Feb 22, 2009

Yes, we discussed the trade-offs in the IRC.

Those examples are there exceptionally because the lines would be really too wide. Check the section “Dinamically Generated Method” of the API conventions (http://wiki.github.com/lifo/docrails/rails-api-documentation-conventions)

Please sign in to comment.