ruby deprecated

¿La mejor práctica para marcar el código obsoleto en Ruby?



deprecated (10)

Al usar rieles, tiene el método de anulación de módulo #.

Me gustaría marcar un método como obsoleto, para que las personas que lo usan puedan verificar fácilmente su código y ponerse al día. En Java establece @Deprecated y todos saben lo que esto significa.

Entonces, ¿hay una forma preferida (o incluso herramientas) para marcar y verificar depreciaciones en Ruby?


Puede usar el patrón Class Macros y escribir algo como esto:

class Module def deprecate(old_method, new_method) define_method(old_method) do |*args, &block| warn "Method #{old_method}() depricated. Use #{new_method}() instead" send(new_method, *args, &block) end end end class Test def my_new_method p "My method" end deprecate :my_old_method, :my_method end


Ruby Standard Library tiene un módulo con la lógica de advertencia: http://ruby-doc.org/stdlib-1.9.3/libdoc/rubygems/rdoc/Gem/Deprecate.html . Tiendo a preferir mantener mis mensajes de desaprobación de una manera "estándar":

# my_file.rb class MyFile extend Gem::Deprecate def no_more close end deprecate :no_more, :close, 2015, 5 def close # new logic here end end MyFile.new.no_more # => NOTE: MyFile#no_more is deprecated; use close instead. It will be removed on or after 2015-05-01. # => MyFile#no_more called from my_file.rb:16.

Tenga en cuenta que con este enfoque obtendrá información gratuita sobre dónde se realizó la llamada.


Si quiere ser malo (bajo la astucia de ser útil) puede imprimir la primera línea de la pila de llamadas durante una advertencia para que los desarrolladores sepan dónde están utilizando una llamada obsoleta.

Esto es malo porque estoy bastante seguro de que es un éxito de rendimiento.

warn Kernel.caller.first + " whatever deprecation message here"

Cuando se usa correctamente, esto incluirá la ruta absoluta al archivo y la línea donde se utilizó la llamada obsoleta. Más información sobre Kernel :: llamador está disponible here


También puede usar ActiveSupport::Deprecation (disponible en la versión 4.0+), como tal:

require ''active_support/deprecation'' require ''active_support/core_ext/module/deprecation'' class MyGem def self.deprecator ActiveSupport::Deprecation.new(''2.0'', ''MyGem'') end def old_method end def new_method end deprecate old_method: :new_method, deprecator: deprecator end MyGem.new.old_method # => DEPRECATION WARNING: old_method is deprecated and will be removed from MyGem 2.0 (use new_method instead). (called from <main> at file.rb:18)


Terminé arrojando juntos un método ligero:

def deprecate(msg) method = caller_locations(1, 1).first.label source = caller(2, 1).first warn "#{method} is deprecated: #{msg}/ncalled at #{source}" end

Luego, para desaprobar un método, inserte una llamada en el cuerpo del método (o un constructor para una clase)

def foo deprecate ''prefer bar, will be removed in version 3'' ... end

Es bastante declarativo y proporciona el registro con información relevante. No soy muy Rubyista así que puede necesitar algunos ajustes / YMMV.


Tienes libdeprecated-ruby (2010-2012, ya no está disponible en rubygem en 2015)

Una pequeña biblioteca destinada a ayudar a los desarrolladores que trabajan con código obsoleto.
La idea proviene del lenguaje de programación '' D '', donde los desarrolladores pueden marcar cierto código como obsoleto, y luego permitir / no permitir la capacidad de ejecutar código obsoleto.

require ''lib/deprecated.rb'' require ''test/unit'' # this class is used to test the deprecate functionality class DummyClass def monkey return true end deprecate :monkey end # we want exceptions for testing here. Deprecate.set_action(:throw) class DeprecateTest < Test::Unit::TestCase def test_set_action assert_raise(DeprecatedError) { raise StandardError.new unless DummyClass.new.monkey } Deprecate.set_action(proc { |msg| raise DeprecatedError.new("#{msg} is deprecated.") }) assert_raise(DeprecatedError) { raise StandardError.new unless DummyClass.new.monkey } # set to warn and make sure our return values are getting through. Deprecate.set_action(:warn) assert_nothing_raised(DeprecatedError) { raise StandardError.new unless DummyClass.new.monkey } end end


Usando ActiveSupport:

class Player < ActiveRecord::Base def to_s ActiveSupport::Deprecation.warn(''Use presenter instead'') partner_uid end end

Las advertencias se desactivan en el entorno de producción de manera predeterminada


Canivete es una joya que le permite despreciar sus métodos de una manera simple y elegante. Un poco más sobre esto here .


Para casi todos los casos, dependiendo de una biblioteca o la metaprogramación de una depreciación es excesiva. Simplemente agregue un comentario al rdoc y llame al método Kernel#warn . Por ejemplo:

class Foo # <b>DEPRECATED:</b> Please use <tt>useful</tt> instead. def useless warn "[DEPRECATION] `useless` is deprecated. Please use `useful` instead." useful end def useful # ... end end

Si está utilizando Yard lugar de rdoc , su comentario del documento debería verse así:

# @deprecated Please use {#useful} instead

Por último, si se adhiere a tomdoc , haga que su comentario se vea así:

# Deprecated: Please use `useful` instead

Obsoleto: indica que el método está en desuso y se eliminará en una versión futura. DEBE usar esto para documentar los métodos que eran públicos, pero se eliminarán en la siguiente versión principal.

Además, no se olvide de eliminar el método en desuso en alguna semver futura (y semver ''d'') . No cometa los mismos errores que las bibliotecas de Java.