Runtime assertions for Ruby literal.fun
ruby
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add the `_Pattern` type

+43
+12
lib/literal/types.rb
··· 318 318 end 319 319 end 320 320 321 + def _Pattern(regex, &block) 322 + raise ArgumentError "Block required for Pattern" unless block 323 + 324 + -> (value) { 325 + if (data = regex.match(value)) 326 + !!block.call(*data.captures, **data.named_captures&.transform_keys(&:to_sym)) 327 + else 328 + false 329 + end 330 + } 331 + end 332 + 321 333 def _Predicate(message, &block) 322 334 PredicateType.new(message:, block:) 323 335 end
+31
test/types/_pattern.test.rb
··· 1 + # frozen_string_literal: true 2 + 3 + include Literal::Types 4 + 5 + test "with named params" do 6 + pattern = _Pattern(/\A(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})\z/) do |year:, month:, day:| 7 + year.to_i >= 2000 && month.to_i.between?(1, 12) && day.to_i.between?(1, 31) 8 + end 9 + 10 + assert pattern === "2023-04-15" 11 + assert pattern === "2050-01-01" 12 + 13 + refute pattern === "1999-12-31" 14 + refute pattern === "2023-13-01" 15 + refute pattern === "2023-01-32" 16 + refute pattern === "abc-12-31" 17 + end 18 + 19 + test "with positional params" do 20 + pattern = _Pattern(/\A(\d+)-(\d+)-(\d+)\z/) do |year, month, day| 21 + year.to_i >= 2000 && month.to_i.between?(1, 12) && day.to_i.between?(1, 31) 22 + end 23 + 24 + assert pattern === "2023-04-15" 25 + assert pattern === "2050-01-01" 26 + 27 + refute pattern === "1999-12-31" 28 + refute pattern === "2023-13-01" 29 + refute pattern === "2023-01-32" 30 + refute pattern === "abc-12-31" 31 + end