Поддерживаю небольшой скрипт синхронизации остатков для магазина тканей. Он читает события и ведёт текущие суммы по каждому SKU. Магазину важен только его собственный регион, us-east, который берётся из config/shop.yml. Поэтому в ветке restock я добавил region в hash-паттерн, думая, что он будет матчить только наши события:

def handle(event)
  region = @region
  @log.debug("handling #{event[:type]} for #{region}")

  case event
  in { type: "restock", region: region, sku:, qty: }
    @totals[sku] += qty
    @log.info("restock #{sku} +#{qty} (#{region})")
  in { type: "sale", sku:, qty: }
    ...

А @region строится в main.rb через config["region"].strip.

Но в логе есть restock bolt-cotton-12 +40 (eu-west), и итог по этому SKU завышен. Эти 40 посчитались. То, что в строке лога регион печатается из события, мне показалось странным, но сначала я не придал этому значения.

Первой догадкой было, что строка из YAML отличается от строки в событии. Frozen, кодировка, перевод строки в конце, что-то в этом духе. Я вывел обе через inspect, и для us-east они выглядят одинаково. Добавил .strip, без изменений. Работает под rbenv на 3.1.4, а не под старым системным ruby, который давится на in.

Так это что-то с YAML или так работают hash-паттерны? Я не понимаю, как вообще eu-west туда попадает...