maintenance_tasks 2.7.1 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dac65eae0e9b5f8066a994408059eb42689792fed29f36321632ff42a804a7cd
4
- data.tar.gz: a8df371985f28c8d97a2e8363f263e93fa40c2291370c63da8bfa115bad0e21a
3
+ metadata.gz: b984293788834b153823e857dad5020b8cca1902037c97fd158401c1da3cfee3
4
+ data.tar.gz: 0c079b820fbfd3d7e26e7c19585ac8b41199de92f7a71e671a63c7db46b60d06
5
5
  SHA512:
6
- metadata.gz: 5144b9f8ab67ae9ea05b16c74178a96239cf22611627822e6ca00205c145e1767bc51015f796fd95dd40b973f3e5b6b1e1e67a950c72c628995602c631e0e49a
7
- data.tar.gz: caeefe52b00431e3ba41297cc10f3dfb17c184b57237e74e6825f50b683be58431c079bf4921ac2529286a0b926fdbbe2ee6e61dc4350e3457d477ce18dc1ba1
6
+ metadata.gz: f43e5c6535246bf7259bb21cfd1eb3f48f356a9f1f2e83fea19096cdff8610a601d4ea96b623d63bbecbaa593d1022a34fd16210896f83852f64c3e3bf003b41
7
+ data.tar.gz: a506d5e89ec233e60a59c428801d8e2e79a57f6604f8ab9cf97882b71bf69f4304f7d1fa53ac33ecd4ab5bb76f9de3774cbf9d1bfdd7cdff52af1849379b7e6d
data/README.md CHANGED
@@ -156,6 +156,32 @@ module Maintenance
156
156
  end
157
157
  ```
158
158
 
159
+ #### Customizing the Batch Size
160
+
161
+ When processing records from an Active Record Relation, records are fetched in
162
+ batches internally, and then each record is passed to the `#process` method.
163
+ Maintenance Tasks will query the database to fetch records in batches of 100 by
164
+ default, but the batch size can be modified using the `collection_batch_size` macro:
165
+
166
+ ```ruby
167
+ # app/tasks/maintenance/update_posts_task.rb
168
+
169
+ module Maintenance
170
+ class UpdatePostsTask < MaintenanceTasks::Task
171
+ # Fetch records in batches of 1000
172
+ collection_batch_size(1000)
173
+
174
+ def collection
175
+ Post.all
176
+ end
177
+
178
+ def process(post)
179
+ post.update!(content: "New content!")
180
+ end
181
+ end
182
+ end
183
+ ```
184
+
159
185
  ### Creating a CSV Task
160
186
 
161
187
  You can also write a Task that iterates on a CSV file. Note that writing CSV
@@ -727,9 +753,9 @@ end
727
753
  ### Writing tests for a Task that uses a custom enumerator
728
754
 
729
755
  Tests for tasks that use custom enumerators need to instantiate the task class
730
- in order to call `#build_enumerator`. Once the task instance is set up, validate
731
- that `#build_enumerator` returns an enumerator yielding pairs of [item, cursor]
732
- as expected.
756
+ in order to call `#enumerator_builder`. Once the task instance is set up,
757
+ validate that `#enumerator_builder` returns an enumerator yielding pairs of
758
+ `[item, cursor]` as expected.
733
759
 
734
760
  ```ruby
735
761
  # test/tasks/maintenance/custom_enumerating_task.rb
@@ -742,8 +768,8 @@ module Maintenance
742
768
  @task = CustomEnumeratingTask.new
743
769
  end
744
770
 
745
- test "#build_enumerator returns enumerator yielding pairs of [item, cursor]" do
746
- enum = @task.build_enumerator(cursor: 0)
771
+ test "#enumerator_builder returns enumerator yielding pairs of [item, cursor]" do
772
+ enum = @task.enumerator_builder(cursor: 0)
747
773
  expected_items = [:b, :c]
748
774
 
749
775
  assert_equal 2, enum.size
@@ -39,7 +39,9 @@ module MaintenanceTasks
39
39
  when :no_collection
40
40
  enumerator_builder.build_once_enumerator(cursor: nil)
41
41
  when ActiveRecord::Relation
42
- enumerator_builder.active_record_on_records(collection, cursor: cursor, columns: @task.cursor_columns)
42
+ options = { cursor: cursor, columns: @task.cursor_columns }
43
+ options[:batch_size] = @task.active_record_enumerator_batch_size if @task.active_record_enumerator_batch_size
44
+ enumerator_builder.active_record_on_records(collection, **options)
43
45
  when ActiveRecord::Batches::BatchEnumerator
44
46
  if collection.start || collection.finish
45
47
  raise ArgumentError, <<~MSG.squish
@@ -164,6 +166,7 @@ module MaintenanceTasks
164
166
  end
165
167
 
166
168
  def on_error(error)
169
+ task_context = {}
167
170
  @ticker.persist if defined?(@ticker)
168
171
 
169
172
  if defined?(@run)
@@ -175,8 +178,6 @@ module MaintenanceTasks
175
178
  started_at: @run.started_at,
176
179
  ended_at: @run.ended_at,
177
180
  }
178
- else
179
- task_context = {}
180
181
  end
181
182
  errored_element = @errored_element if defined?(@errored_element)
182
183
  ensure
@@ -18,6 +18,12 @@ module MaintenanceTasks
18
18
  # @api private
19
19
  class_attribute :throttle_conditions, default: []
20
20
 
21
+ # The number of active records to fetch in a single query when iterating
22
+ # over an Active Record collection task.
23
+ #
24
+ # @api private
25
+ class_attribute :active_record_enumerator_batch_size
26
+
21
27
  # @api private
22
28
  class_attribute :collection_builder_strategy, default: NullCollectionBuilder.new
23
29
 
@@ -138,6 +144,14 @@ module MaintenanceTasks
138
144
  self.throttle_conditions += [{ throttle_on: condition, backoff: backoff_as_proc }]
139
145
  end
140
146
 
147
+ # Limit the number of records that will be fetched in a single query when
148
+ # iterating over an Active Record collection task.
149
+ #
150
+ # @param size [Integer] the number of records to fetch in a single query.
151
+ def collection_batch_size(size)
152
+ self.active_record_enumerator_batch_size = size
153
+ end
154
+
141
155
  # Initialize a callback to run after the task starts.
142
156
  #
143
157
  # @param filter_list apply filters to the callback
@@ -44,7 +44,7 @@
44
44
 
45
45
  <h4 class="title is-4">Active Runs</h4>
46
46
 
47
- <%= render @task.active_runs %>
47
+ <%= render partial: "maintenance_tasks/runs/run", collection: @task.active_runs %>
48
48
  <% end %>
49
49
 
50
50
  <% if @runs_page.records.present? %>
@@ -52,7 +52,7 @@
52
52
 
53
53
  <h4 class="title is-4">Previous Runs</h4>
54
54
 
55
- <%= render @runs_page.records %>
55
+ <%= render partial: "maintenance_tasks/runs/run", collection: @runs_page.records %>
56
56
 
57
57
  <%= link_to "Next page", task_path(@task, cursor: @runs_page.next_cursor) unless @runs_page.last? %>
58
58
  <% end %>
@@ -10,7 +10,7 @@ module MaintenanceTasks
10
10
 
11
11
  # Mounts the engine in the host application's config/routes.rb
12
12
  def mount_engine
13
- route("mount MaintenanceTasks::Engine => \"/maintenance_tasks\"")
13
+ route("mount MaintenanceTasks::Engine, at: \"/maintenance_tasks\"")
14
14
  end
15
15
 
16
16
  # Copies engine migrations to host application and migrates the database
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maintenance_tasks
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.1
4
+ version: 2.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify Engineering
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-12 00:00:00.000000000 Z
11
+ date: 2024-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -108,7 +108,7 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: 2.6.2
111
- description:
111
+ description:
112
112
  email: gems@shopify.com
113
113
  executables:
114
114
  - maintenance_tasks
@@ -185,9 +185,9 @@ homepage: https://github.com/Shopify/maintenance_tasks
185
185
  licenses:
186
186
  - MIT
187
187
  metadata:
188
- source_code_uri: https://github.com/Shopify/maintenance_tasks/tree/v2.7.1
188
+ source_code_uri: https://github.com/Shopify/maintenance_tasks/tree/v2.8.0
189
189
  allowed_push_host: https://rubygems.org
190
- post_install_message:
190
+ post_install_message:
191
191
  rdoc_options: []
192
192
  require_paths:
193
193
  - lib
@@ -202,8 +202,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
202
  - !ruby/object:Gem::Version
203
203
  version: '0'
204
204
  requirements: []
205
- rubygems_version: 3.5.11
206
- signing_key:
205
+ rubygems_version: 3.5.17
206
+ signing_key:
207
207
  specification_version: 4
208
208
  summary: A Rails engine for queuing and managing maintenance tasks
209
209
  test_files: []