From 3eb6ad089e6ab13b439b3f355dfcd46b9bb34bac Mon Sep 17 00:00:00 2001 From: fatkodima Date: Wed, 23 Dec 2020 03:37:22 +0200 Subject: [PATCH] Preserve match_data in rules --- lib/rake/task.rb | 4 ++++ lib/rake/task_manager.rb | 10 +++++++--- test/test_rake_rules.rb | 9 +++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/rake/task.rb b/lib/rake/task.rb index ec2c756e0..a5f2eee8b 100644 --- a/lib/rake/task.rb +++ b/lib/rake/task.rb @@ -38,6 +38,10 @@ class Task # will be skipped unless you reenable them. attr_reader :already_invoked + # MatchData object returned when matching the task name + # against the rule pattern. + attr_accessor :match_data + # Return task name def to_s name diff --git a/lib/rake/task_manager.rb b/lib/rake/task_manager.rb index 97e3b9459..b998d0546 100644 --- a/lib/rake/task_manager.rb +++ b/lib/rake/task_manager.rb @@ -152,10 +152,14 @@ def enhance_with_matching_rule(task_name, level=0) fail Rake::RuleRecursionOverflowError, "Rule Recursion Too Deep" if level >= 16 @rules.each do |pattern, args, extensions, order_only, block| - if pattern && pattern.match(task_name) + if pattern && (m = pattern.match(task_name)) task = attempt_rule(task_name, pattern, args, extensions, block, level) - task | order_only unless order_only.nil? - return task if task + + if task + task | order_only unless order_only.nil? + task.match_data = m + return task + end end end nil diff --git a/test/test_rake_rules.rb b/test/test_rake_rules.rb index bfb8e775f..b7775dd68 100644 --- a/test/test_rake_rules.rb +++ b/test/test_rake_rules.rb @@ -409,4 +409,13 @@ def test_works_with_chained_extensions_in_rules assert_equal [MINFILE], @runs end + def test_rule_match_data + rule(/^(?\d{14})_(?[a-z_]+)\.rb$/) do |t| + @runs << t.match_data[:timestamp] + @runs << t.match_data[:migration_name] + end + Task["20191015182958_create_users.rb"].invoke + assert_equal ["20191015182958", "create_users"], @runs + end + end