From 1dfa04238bb4d8659702770858c14355223dd9ef Mon Sep 17 00:00:00 2001 From: Stefan Magnuson Date: Wed, 19 Apr 2023 16:37:35 +0100 Subject: [PATCH] Allow tasks to be loaded from nested task directories (#809) Co-authored-by: Masa (Aileron inc) --- README.md | 20 +++++++++++++++++++ app/models/maintenance_tasks/task.rb | 8 +++++++- .../nested/nested_more/nested_more_task.rb | 15 ++++++++++++++ .../tasks/maintenance/nested/nested_task.rb | 13 ++++++++++++ .../maintenance_tasks/task_data_index_test.rb | 2 ++ test/models/maintenance_tasks/task_test.rb | 2 ++ test/system/maintenance_tasks/tasks_test.rb | 2 ++ 7 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 test/dummy/app/tasks/maintenance/nested/nested_more/nested_more_task.rb create mode 100644 test/dummy/app/tasks/maintenance/nested/nested_task.rb diff --git a/README.md b/README.md index 2e350c58..a3661564 100644 --- a/README.md +++ b/README.md @@ -696,6 +696,26 @@ MaintenanceTasks.tasks_module = "TaskModule" If no value is specified, it will default to `Maintenance`. +#### Organizing tasks using namespaces + +Tasks may be nested arbitrarily deeply under `app/tasks/maintenance`, for example given a +task file `app/tasks/maintenance/team_name/service_name/update_posts_task.rb` we +can define the task as: + +```ruby +module Maintenance + module TeamName + module ServiceName + class UpdatePostsTask < MaintenanceTasks::Task + def process(rows) + # ... + end + end + end + end +end +``` + #### Customizing the underlying job class `MaintenanceTasks.job` can be configured to define a Job class for your tasks to diff --git a/app/models/maintenance_tasks/task.rb b/app/models/maintenance_tasks/task.rb index 3784dc52..049db9ed 100644 --- a/app/models/maintenance_tasks/task.rb +++ b/app/models/maintenance_tasks/task.rb @@ -175,7 +175,13 @@ def load_constants namespace = MaintenanceTasks.tasks_module.safe_constantize return unless namespace - namespace.constants.map { |constant| namespace.const_get(constant) } + load_const = lambda do |root| + root.constants.each do |name| + object = root.const_get(name) + load_const.call(object) if object.instance_of?(Module) + end + end + load_const.call(namespace) end end diff --git a/test/dummy/app/tasks/maintenance/nested/nested_more/nested_more_task.rb b/test/dummy/app/tasks/maintenance/nested/nested_more/nested_more_task.rb new file mode 100644 index 00000000..e56ce6ed --- /dev/null +++ b/test/dummy/app/tasks/maintenance/nested/nested_more/nested_more_task.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Maintenance + module Nested + module NestedMore + class NestedMoreTask < MaintenanceTasks::Task + no_collection + + def process + # Task only exists to verify correct loading of tasks within subfolders + end + end + end + end +end diff --git a/test/dummy/app/tasks/maintenance/nested/nested_task.rb b/test/dummy/app/tasks/maintenance/nested/nested_task.rb new file mode 100644 index 00000000..3b27f8a3 --- /dev/null +++ b/test/dummy/app/tasks/maintenance/nested/nested_task.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Maintenance + module Nested + class NestedTask < MaintenanceTasks::Task + no_collection + + def process + # Task only exists to verify correct loading of tasks within subfolders + end + end + end +end diff --git a/test/models/maintenance_tasks/task_data_index_test.rb b/test/models/maintenance_tasks/task_data_index_test.rb index c600ac7c..c51357dc 100644 --- a/test/models/maintenance_tasks/task_data_index_test.rb +++ b/test/models/maintenance_tasks/task_data_index_test.rb @@ -12,6 +12,8 @@ class TaskDataIndexTest < ActiveSupport::TestCase "Maintenance::EnqueueErrorTask", "Maintenance::ErrorTask", "Maintenance::ImportPostsTask", + "Maintenance::Nested::NestedMore::NestedMoreTask", + "Maintenance::Nested::NestedTask", "Maintenance::NoCollectionTask", # duplicate due to fixtures containing two active runs of this task "Maintenance::NoCollectionTask", diff --git a/test/models/maintenance_tasks/task_test.rb b/test/models/maintenance_tasks/task_test.rb index 27cfac9e..f36b2333 100644 --- a/test/models/maintenance_tasks/task_test.rb +++ b/test/models/maintenance_tasks/task_test.rb @@ -12,6 +12,8 @@ class TaskTest < ActiveSupport::TestCase "Maintenance::EnqueueErrorTask", "Maintenance::ErrorTask", "Maintenance::ImportPostsTask", + "Maintenance::Nested::NestedMore::NestedMoreTask", + "Maintenance::Nested::NestedTask", "Maintenance::NoCollectionTask", "Maintenance::ParamsTask", "Maintenance::TestTask", diff --git a/test/system/maintenance_tasks/tasks_test.rb b/test/system/maintenance_tasks/tasks_test.rb index 6a9f7f82..d392b4b2 100644 --- a/test/system/maintenance_tasks/tasks_test.rb +++ b/test/system/maintenance_tasks/tasks_test.rb @@ -27,6 +27,8 @@ class TasksTest < ApplicationSystemTestCase "Maintenance::CancelledEnqueueTask\nNew", "Maintenance::EnqueueErrorTask\nNew", "Maintenance::ErrorTask\nNew", + "Maintenance::Nested::NestedMore::NestedMoreTask\nNew", + "Maintenance::Nested::NestedTask\nNew", "Maintenance::ParamsTask\nNew", "Maintenance::TestTask\nNew", "Maintenance::UpdatePostsInBatchesTask\nNew",