Поддерживаю небольшой скрипт синхронизации остатков для магазина тканей. Он читает события и ведёт текущие суммы по каждому 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 туда попадает...