Rubyでオープンクラスに警告を出す

More than 1 year has passed since last update.

ピピー!✋👮 こちらオープンクラス警察です。


open_class_alarm.rb

module OpenClassAlarm

@status = :disable
@modules = ObjectSpace.each_object(Module).to_a

def self.enable
@status = :enable

if block_given?
yield
disable
end
end

def self.disable
@status = :disable
end

TracePoint.trace(:class) do |tp|
if @modules.include?(tp.self)
if @status == :enable && tp.self.instance_of?(Class)
warn "#{tp.path}:#{tp.lineno} found open class `#{tp.self}'"
end
else
@modules << tp.self
end
end
end

OpenClassAlarm.enable

class String
end


出力

open_class_alarm.rb:31 found open class `String'

検知する範囲をブロックで囲むことも出来ます。

OpenClassAlarm.enable do

class String
end
end

class Hash
end

出力

open_class_alarm.rb:30 found open class `String'

https://github.com/jeremyevans/ruby-refrigerator を見て

:thought_balloon: 「TracePointを使って似たようなことが出来そうだな」

と思い作ってみました。

ついでにgemも作りました。

https://github.com/siman-man/open_class_alarm