maintenance_tasks 1.4.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +229 -41
  3. data/app/controllers/maintenance_tasks/tasks_controller.rb +2 -1
  4. data/app/helpers/maintenance_tasks/application_helper.rb +1 -0
  5. data/app/helpers/maintenance_tasks/tasks_helper.rb +19 -0
  6. data/app/jobs/concerns/maintenance_tasks/task_job_concern.rb +28 -21
  7. data/app/models/maintenance_tasks/application_record.rb +1 -0
  8. data/app/models/maintenance_tasks/csv_collection_builder.rb +38 -0
  9. data/app/models/maintenance_tasks/no_collection_builder.rb +29 -0
  10. data/app/models/maintenance_tasks/null_collection_builder.rb +38 -0
  11. data/app/models/maintenance_tasks/progress.rb +8 -3
  12. data/app/models/maintenance_tasks/run.rb +157 -13
  13. data/app/models/maintenance_tasks/runner.rb +22 -9
  14. data/app/models/maintenance_tasks/runs_page.rb +1 -0
  15. data/app/models/maintenance_tasks/task.rb +236 -0
  16. data/app/models/maintenance_tasks/task_data.rb +15 -3
  17. data/app/validators/maintenance_tasks/run_status_validator.rb +2 -2
  18. data/app/views/maintenance_tasks/runs/_arguments.html.erb +22 -0
  19. data/app/views/maintenance_tasks/runs/_csv.html.erb +5 -0
  20. data/app/views/maintenance_tasks/runs/_run.html.erb +18 -1
  21. data/app/views/maintenance_tasks/runs/info/_custom.html.erb +0 -0
  22. data/app/views/maintenance_tasks/runs/info/_errored.html.erb +0 -2
  23. data/app/views/maintenance_tasks/runs/info/_running.html.erb +3 -5
  24. data/app/views/maintenance_tasks/tasks/_custom.html.erb +0 -0
  25. data/app/views/maintenance_tasks/tasks/_task.html.erb +19 -1
  26. data/app/views/maintenance_tasks/tasks/show.html.erb +32 -7
  27. data/config/routes.rb +1 -0
  28. data/db/migrate/20201211151756_create_maintenance_tasks_runs.rb +1 -0
  29. data/db/migrate/20210225152418_remove_index_on_task_name.rb +1 -0
  30. data/db/migrate/20210517131953_add_arguments_to_maintenance_tasks_runs.rb +1 -0
  31. data/db/migrate/20211210152329_add_lock_version_to_maintenance_tasks_runs.rb +8 -0
  32. data/lib/generators/maintenance_tasks/install_generator.rb +1 -0
  33. data/lib/generators/maintenance_tasks/task_generator.rb +13 -0
  34. data/lib/generators/maintenance_tasks/templates/no_collection_task.rb.tt +13 -0
  35. data/lib/generators/maintenance_tasks/templates/no_collection_task_test.rb.tt +12 -0
  36. data/lib/generators/maintenance_tasks/templates/task.rb.tt +3 -1
  37. data/lib/generators/maintenance_tasks/templates/task_test.rb.tt +4 -0
  38. data/lib/maintenance_tasks/cli.rb +6 -5
  39. data/lib/maintenance_tasks/engine.rb +15 -1
  40. data/lib/maintenance_tasks.rb +12 -1
  41. metadata +15 -7
  42. data/app/models/maintenance_tasks/csv_collection.rb +0 -33
  43. data/app/tasks/maintenance_tasks/task.rb +0 -137
  44. data/app/views/maintenance_tasks/runs/_info.html.erb +0 -16
@@ -1,137 +0,0 @@
1
- # frozen_string_literal: true
2
- module MaintenanceTasks
3
- # Base class that is inherited by the host application's task classes.
4
- class Task
5
- extend ActiveSupport::DescendantsTracker
6
- include ActiveModel::Attributes
7
- include ActiveModel::AttributeAssignment
8
- include ActiveModel::Validations
9
-
10
- class NotFoundError < NameError; end
11
-
12
- # The throttle conditions for a given Task. This is provided as an array of
13
- # hashes, with each hash specifying two keys: throttle_condition and
14
- # backoff. Note that Tasks inherit conditions from their superclasses.
15
- #
16
- # @api private
17
- class_attribute :throttle_conditions, default: []
18
-
19
- class << self
20
- # Finds a Task with the given name.
21
- #
22
- # @param name [String] the name of the Task to be found.
23
- #
24
- # @return [Task] the Task with the given name.
25
- #
26
- # @raise [NotFoundError] if a Task with the given name does not exist.
27
- def named(name)
28
- task = name.safe_constantize
29
- raise NotFoundError.new("Task #{name} not found.", name) unless task
30
- unless task.is_a?(Class) && task < Task
31
- raise NotFoundError.new("#{name} is not a Task.", name)
32
- end
33
- task
34
- end
35
-
36
- # Returns a list of concrete classes that inherit from the Task
37
- # superclass.
38
- #
39
- # @return [Array<Class>] the list of classes.
40
- def available_tasks
41
- load_constants
42
- descendants
43
- end
44
-
45
- # Make this Task a task that handles CSV.
46
- #
47
- # An input to upload a CSV will be added in the form to start a Run. The
48
- # collection and count method are implemented.
49
- def csv_collection
50
- if !defined?(ActiveStorage) || !ActiveStorage::Attachment.table_exists?
51
- raise NotImplementedError, "Active Storage needs to be installed\n"\
52
- "To resolve this issue run: bin/rails active_storage:install"
53
- end
54
- include(CsvCollection)
55
- end
56
-
57
- # Processes one item.
58
- #
59
- # Especially useful for tests.
60
- #
61
- # @param item the item to process.
62
- def process(item)
63
- new.process(item)
64
- end
65
-
66
- # Returns the collection for this Task.
67
- #
68
- # Especially useful for tests.
69
- #
70
- # @return the collection.
71
- def collection
72
- new.collection
73
- end
74
-
75
- # Returns the count of items for this Task.
76
- #
77
- # Especially useful for tests.
78
- #
79
- # @return the count of items.
80
- def count
81
- new.count
82
- end
83
-
84
- # Add a condition under which this Task will be throttled.
85
- #
86
- # @param backoff [ActiveSupport::Duration] optionally, a custom backoff
87
- # can be specified. This is the time to wait before retrying the Task.
88
- # If no value is specified, it defaults to 30 seconds.
89
- # @yieldreturn [Boolean] where the throttle condition is being met,
90
- # indicating that the Task should throttle.
91
- def throttle_on(backoff: 30.seconds, &condition)
92
- self.throttle_conditions += [
93
- { throttle_on: condition, backoff: backoff },
94
- ]
95
- end
96
-
97
- private
98
-
99
- def load_constants
100
- namespace = MaintenanceTasks.tasks_module.safe_constantize
101
- return unless namespace
102
- namespace.constants.map { |constant| namespace.const_get(constant) }
103
- end
104
- end
105
-
106
- # Placeholder method to raise in case a subclass fails to implement the
107
- # expected instance method.
108
- #
109
- # @raise [NotImplementedError] with a message advising subclasses to
110
- # implement an override for this method.
111
- def collection
112
- raise NoMethodError, "#{self.class.name} must implement `collection`."
113
- end
114
-
115
- # Placeholder method to raise in case a subclass fails to implement the
116
- # expected instance method.
117
- #
118
- # @param _item [Object] the current item from the enumerator being iterated.
119
- #
120
- # @raise [NotImplementedError] with a message advising subclasses to
121
- # implement an override for this method.
122
- def process(_item)
123
- raise NoMethodError, "#{self.class.name} must implement `process`."
124
- end
125
-
126
- # Total count of iterations to be performed.
127
- #
128
- # Tasks override this method to define the total amount of iterations
129
- # expected at the start of the run. Return +nil+ if the amount is
130
- # undefined, or counting would be prohibitive for your database.
131
- #
132
- # @return [Integer, nil]
133
- def count
134
- :no_count
135
- end
136
- end
137
- end
@@ -1,16 +0,0 @@
1
- <h5 class="title is-5">
2
- <%= time_tag run.created_at, title: run.created_at %>
3
- <%= status_tag run.status if with_status %>
4
- </h5>
5
-
6
- <%= progress run %>
7
-
8
- <div class="content">
9
- <%= render "maintenance_tasks/runs/info/#{run.status}", run: run %>
10
- </div>
11
-
12
- <% if run.csv_file.present? %>
13
- <div class="block">
14
- <%= link_to('Download CSV', csv_file_download_path(run)) %>
15
- </div>
16
- <% end %>