proxy_wrappers.rb 4.0 KB
Newer Older
1
require 'active_support/inflector/methods'
2

3
module ActiveSupport
4
  class Deprecation
5
    class DeprecationProxy #:nodoc:
6 7
      def self.new(*args, &block)
        object = args.first
A
Aaron Patterson 已提交
8

9 10 11
        return object unless object
        super
      end
A
Aaron Patterson 已提交
12

J
Jeremy Kemper 已提交
13
      instance_methods.each { |m| undef_method m unless m =~ /^__|^object_id$/ }
14 15 16 17 18 19 20 21 22 23 24 25 26 27

      # Don't give a deprecation warning on inspect since test/unit and error
      # logs rely on it for diagnostics.
      def inspect
        target.inspect
      end

      private
        def method_missing(called, *args, &block)
          warn caller, called, args
          target.__send__(called, *args, &block)
        end
    end

28 29 30 31 32 33 34 35 36 37 38 39
    # This DeprecatedObjectProxy transforms object to depracated object.
    #
    # Example
    #   @old_object = DeprecatedObjectProxy.new(Object.new, "Don't use this object anymore!")
    # Example with custom deprecator
    #   @old_object = DeprecatedObjectProxy.new(Object.new, "Don't use this object anymore!", deprecator_instance)
    #
    # When someone execute any method expect +inspect+ on proxy object this will trigger +warn+ method on +deprecator_instance+
    #
    # Default deprecator is ActiveSupport::Deprecation
    class DeprecatedObjectProxy < DeprecationProxy
      def initialize(object, message, deprecator = ActiveSupport::Deprecation.instance)
40 41
        @object = object
        @message = message
42
        @deprecator = deprecator
43 44 45 46 47 48 49 50
      end

      private
        def target
          @object
        end

        def warn(callstack, called, args)
51
          @deprecator.warn(@message, callstack)
52 53 54
        end
    end

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
    # This DeprecatedInstanceVariableProxy transforms instance variable to depracated instance variable.
    #
    # Example
    #  class Example
    #    def initialize(deprecator)
    #      @request = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(self, :request, :@request, deprecator)
    #      @_request = :a_request
    #    end
    #
    #    def request
    #       @_request
    #     end
    #
    #    def old_request
    #       @request
    #    end
    #  end
    #
    # When someone execute any method on @request variable this will trigger +warn+ method on +deprecator_instance+
    # and will fetch @_request variable via +request+ method and execute the same method on non-proxy instance variable.
    #
    # Default deprecator is ActiveSupport::Deprecation
    class DeprecatedInstanceVariableProxy < DeprecationProxy
      def initialize(instance, method, var = "@#{method}", deprecator = ActiveSupport::Deprecation.instance)
79 80 81
        @instance = instance
        @method = method
        @var = var
82
        @deprecator = deprecator
83 84 85 86 87 88 89 90
      end

      private
        def target
          @instance.__send__(@method)
        end

        def warn(callstack, called, args)
91
          @deprecator.warn("#{@var} is deprecated! Call #{@method}.#{called} instead of #{@var}.#{called}. Args: #{args.inspect}", callstack)
92 93 94
        end
    end

95 96 97 98 99 100 101 102 103 104 105
    # This DeprecatedConstantProxy transforms constant to depracated constant.
    #
    # Example
    #   OLD_CONST = ActiveSupport::Deprecation::DeprecatedConstantProxy.new('OLD_CONST', 'NEW_CONST')
    # Example with custom deprecator
    #   OLD_CONST = ActiveSupport::Deprecation::DeprecatedConstantProxy.new('OLD_CONST', 'NEW_CONST', deprecator_instance)
    # When someone use old constant this will trigger +warn+ method on +deprecator_instance+
    #
    # Default deprecator is ActiveSupport::Deprecation
    class DeprecatedConstantProxy < DeprecationProxy
      def initialize(old_const, new_const, deprecator = ActiveSupport::Deprecation.instance)
106 107
        @old_const = old_const
        @new_const = new_const
108
        @deprecator = deprecator
109 110 111 112 113 114 115 116
      end

      def class
        target.class
      end

      private
        def target
117
          ActiveSupport::Inflector.constantize(@new_const.to_s)
118 119 120
        end

        def warn(callstack, called, args)
121
          @deprecator.warn("#{@old_const} is deprecated! Use #{@new_const} instead.", callstack)
122 123 124 125
        end
    end
  end
end