会社のブログに記事を書いた。
Twitter(現X)にも書いたけれど、最初はファイルアクセスを監視する手段をどうするか結構悩んでいた。パッと思いついたのはstraceだけど、あんまり慣れてないし、Docker上で使うにはDockerの設定が必要で、CIでそれが設定できるか怪しくてうーんとなっていた。
しばらく悩んだ後にinotifyのことを思い出し、読み込みに対するフックって提供されているのかなと調べてみたら提供されていたので、これを使った。
結果としてかなりシンプルなコードを使って多くの不要なファイルを消せたので良かった。こういう「ちょっとしたコード」がしっかり役に立つのは好き
最近の仕事で困っているネタをbugsに投げた。この内容は詳しくは会社のブログに記事を書くつもり(今週出せるといいな)
ruby-jpのSlackで、「stub_constに渡す定数名が定数として存在していることを保証したい」という話があった。
例:
# Foo 定数がない時には例外を投げてほしい stub_const('Foo, 2)
これをなんかかっこいいsyntaxで書けないかなと思って、const_missingを使う方法を考えていた。
class ConstExistanceHelper class << self attr_reader :const_name def const_missing(name) Class.new(self).assign_name(name) end def validate! Object.const_get(const_name) const_name end def const_name superclass == Object ? '' : [superclass.const_name, @const_name].join('::') end def assign_name(name) @const_name = [name] self end end end class Foo class Bar end end x = ConstExistanceHelper p x::Foo::Bar.validate! # => "::Foo::Bar" p x::Foo::Baz.validate! # => NameError
validate!ってわざわざ呼ばなきゃいけないのがダサいなと思っている。stub_constが内部でString === const_nameしてStringかどうかを検査しているのが邪魔で、最後にオブジェクトをStringに変換しないといけないという制約がある。これがなければto_strとかでごまかせたかもしれない。
最初はvalidate!ではなくto_sというメソッド名で考えていて、あまりにダサいなと思っていたのだけれど、メソッド名をvalidate!にすることでダサさが軽減された気がする。