diary

I like Hatena Star with a text selection.

2024-09-02

moneyforward-dev.jp

会社のブログに記事を書いた。

Twitter(現X)にも書いたけれど、最初はファイルアクセスを監視する手段をどうするか結構悩んでいた。パッと思いついたのはstraceだけど、あんまり慣れてないし、Docker上で使うにはDockerの設定が必要で、CIでそれが設定できるか怪しくてうーんとなっていた。

しばらく悩んだ後にinotifyのことを思い出し、読み込みに対するフックって提供されているのかなと調べてみたら提供されていたので、これを使った。

結果としてかなりシンプルなコードを使って多くの不要なファイルを消せたので良かった。こういう「ちょっとしたコード」がしっかり役に立つのは好き


bugs.ruby-lang.org

最近の仕事で困っているネタを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!にすることでダサさが軽減された気がする。