gouda 0.1.2 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/CHANGELOG.md +12 -0
- data/gouda.gemspec +1 -1
- data/lib/gouda/railtie.rb +9 -1
- data/lib/gouda/version.rb +1 -1
- data/test/gouda/concurrency_extension_test.rb +160 -0
- data/test/gouda/gouda_test.rb +686 -0
- data/test/gouda/scheduler_test.rb +187 -0
- data/test/gouda/seconds_to_start_distribution.csv +280 -0
- data/test/gouda/test_helper.rb +70 -0
- data/test/gouda/worker_test.rb +116 -0
- data/test/gouda/workload_test.rb +67 -0
- data/test/support/assert_helper.rb +51 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbebec9ae881152e66d8a8e763d74e2314c6694cc46a1b547323bb4fe01fd505
|
4
|
+
data.tar.gz: f9836ba9594cf2473485efbe6be8dd6b001e0e514315cb84170a62d525adbaf3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2bf05ef7dcfe8cc682f54da18f8ad8a415f5db3f103928188ad04ab714f4a2799b4998b25c5d53432776d4f913e22fe0a761bd1fe11ea2eb17763f89201cb809
|
7
|
+
data.tar.gz: 636a2aa356b4fed48dece844dec2f26d46a430d6e4a0d956c56d5c5121d30f8d3fb8f87174b82e4d7ab6a58f3e0bcd99d3e07c18c631390cc6233b8cac2d48ba
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.3.
|
1
|
+
3.3.3
|
data/CHANGELOG.md
CHANGED
@@ -11,3 +11,15 @@
|
|
11
11
|
## [0.1.2] - 2023-06-11
|
12
12
|
|
13
13
|
- Updated readme and method renaming in Scheduler
|
14
|
+
|
15
|
+
## [0.1.3] - 2023-06-11
|
16
|
+
|
17
|
+
- Allow the Rails app to boot even if there is no database yet
|
18
|
+
|
19
|
+
## [0.1.4] - 2023-06-14
|
20
|
+
|
21
|
+
- Rescue NoDatabaseError at scheduler update.
|
22
|
+
- Include tests in gem, for sake of easier debugging.
|
23
|
+
- Reduce logging in local test runs.
|
24
|
+
- Bump local ruby version to 3.3.3
|
25
|
+
|
data/gouda.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.metadata["changelog_uri"] = "https://github.com/cheddar-me/gouda/CHANGELOG.md"
|
18
18
|
|
19
19
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
20
|
-
`git ls-files -z`.split("\x0")
|
20
|
+
`git ls-files -z`.split("\x0")
|
21
21
|
end
|
22
22
|
|
23
23
|
spec.add_dependency "activerecord", "~> 7"
|
data/lib/gouda/railtie.rb
CHANGED
@@ -52,7 +52,15 @@ module Gouda
|
|
52
52
|
end
|
53
53
|
|
54
54
|
Gouda::Scheduler.build_scheduler_entries_list!
|
55
|
-
|
55
|
+
begin
|
56
|
+
Gouda::Scheduler.upsert_workloads_from_entries_list!
|
57
|
+
rescue ActiveRecord::NoDatabaseError
|
58
|
+
# Do nothing. On a freshly checked-out Rails app, running even unrelated Rails tasks
|
59
|
+
# (such as asset compilation) - or, more importantly, initial db:create -
|
60
|
+
# will cause a NoDatabaseError, as this is a chicken-and-egg problem. That error
|
61
|
+
# is safe to ignore in this instance - we should let the outer task proceed,
|
62
|
+
# because if there is no database we should allow it to get created.
|
63
|
+
end
|
56
64
|
end
|
57
65
|
end
|
58
66
|
end
|
data/lib/gouda/version.rb
CHANGED
@@ -0,0 +1,160 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "gouda/test_helper"
|
4
|
+
|
5
|
+
class GoudaConcurrencyExtensionTest < ActiveSupport::TestCase
|
6
|
+
include AssertHelper
|
7
|
+
class TestJobWithoutConcurrency < ActiveJob::Base
|
8
|
+
self.queue_adapter = Gouda::Adapter.new
|
9
|
+
end
|
10
|
+
|
11
|
+
class TestJobWithPerformConcurrency < ActiveJob::Base
|
12
|
+
self.queue_adapter = Gouda::Adapter.new
|
13
|
+
include Gouda::ActiveJobExtensions::Concurrency
|
14
|
+
gouda_control_concurrency_with(perform_limit: 1)
|
15
|
+
|
16
|
+
def perform(*args)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
setup do
|
21
|
+
@adapter ||= Gouda::Adapter.new
|
22
|
+
Gouda::Railtie.initializers.each(&:run)
|
23
|
+
end
|
24
|
+
|
25
|
+
test "gouda_control_concurrency_with with just perform_limit sets a perform concurrency key and no enqueue concurrency key" do
|
26
|
+
job = TestJobWithPerformConcurrency.new
|
27
|
+
assert_nil job.enqueue_concurrency_key
|
28
|
+
assert job.execution_concurrency_key
|
29
|
+
end
|
30
|
+
|
31
|
+
test "gouda_control_concurrency_with with just perform_limit makes the perform concurrency key dependent on job params" do
|
32
|
+
job1 = TestJobWithPerformConcurrency.new(1, 2, :something)
|
33
|
+
assert job1.execution_concurrency_key
|
34
|
+
|
35
|
+
job2 = TestJobWithPerformConcurrency.new(1, 2, :something)
|
36
|
+
assert_equal job2.execution_concurrency_key, job1.execution_concurrency_key
|
37
|
+
|
38
|
+
job3 = TestJobWithPerformConcurrency.new(1, 2, :something_else)
|
39
|
+
refute_equal job3.execution_concurrency_key, job1.execution_concurrency_key
|
40
|
+
end
|
41
|
+
|
42
|
+
class TestJobWithCommonConcurrency < ActiveJob::Base
|
43
|
+
self.queue_adapter = Gouda::Adapter.new
|
44
|
+
include Gouda::ActiveJobExtensions::Concurrency
|
45
|
+
gouda_control_concurrency_with(total_limit: 1)
|
46
|
+
|
47
|
+
def perform(*args)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
test "gouda_control_concurrency_with with total_limit sets a perform concurrency key and an enqueue concurrency key" do
|
52
|
+
job = TestJobWithCommonConcurrency.new
|
53
|
+
assert job.enqueue_concurrency_key
|
54
|
+
assert job.execution_concurrency_key
|
55
|
+
end
|
56
|
+
|
57
|
+
test "gouda_control_concurrency_with with total_limit makes the perform concurrency key dependent on job params" do
|
58
|
+
job1 = TestJobWithCommonConcurrency.new(1, 2, :something)
|
59
|
+
assert job1.execution_concurrency_key
|
60
|
+
|
61
|
+
job2 = TestJobWithCommonConcurrency.new(1, 2, :something)
|
62
|
+
assert_equal job2.execution_concurrency_key, job1.execution_concurrency_key
|
63
|
+
|
64
|
+
job3 = TestJobWithCommonConcurrency.new(1, 2, :something_else)
|
65
|
+
refute_equal job3.execution_concurrency_key, job1.execution_concurrency_key
|
66
|
+
end
|
67
|
+
|
68
|
+
test "gouda_control_concurrency_with with total_limit makes the enqueue concurrency key dependent on job params" do
|
69
|
+
job1 = TestJobWithCommonConcurrency.new(1, 2, :something)
|
70
|
+
assert job1.enqueue_concurrency_key
|
71
|
+
|
72
|
+
job2 = TestJobWithCommonConcurrency.new(1, 2, :something)
|
73
|
+
assert_equal job2.enqueue_concurrency_key, job1.enqueue_concurrency_key
|
74
|
+
|
75
|
+
job3 = TestJobWithCommonConcurrency.new(1, 2, :something_else)
|
76
|
+
refute_equal job3.enqueue_concurrency_key, job1.enqueue_concurrency_key
|
77
|
+
end
|
78
|
+
|
79
|
+
class TestJobWithEnqueueConcurrency < ActiveJob::Base
|
80
|
+
self.queue_adapter = Gouda::Adapter.new
|
81
|
+
include Gouda::ActiveJobExtensions::Concurrency
|
82
|
+
gouda_control_concurrency_with(enqueue_limit: 1)
|
83
|
+
|
84
|
+
def perform(*args)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
test "gouda_control_concurrency_with with enqueue_limit sets a perform concurrency key and an enqueue concurrency key" do
|
89
|
+
job = TestJobWithEnqueueConcurrency.new
|
90
|
+
assert job.enqueue_concurrency_key
|
91
|
+
assert_nil job.execution_concurrency_key
|
92
|
+
end
|
93
|
+
|
94
|
+
test "gouda_control_concurrency_with with enqueue_limit makes the enqueue concurrency key dependent on job params" do
|
95
|
+
job1 = TestJobWithEnqueueConcurrency.new(1, 2, :something)
|
96
|
+
assert job1.enqueue_concurrency_key
|
97
|
+
|
98
|
+
job2 = TestJobWithEnqueueConcurrency.new(1, 2, :something)
|
99
|
+
assert_equal job2.enqueue_concurrency_key, job1.enqueue_concurrency_key
|
100
|
+
|
101
|
+
job3 = TestJobWithEnqueueConcurrency.new(1, 2, :something_else)
|
102
|
+
refute_equal job3.enqueue_concurrency_key, job1.enqueue_concurrency_key
|
103
|
+
end
|
104
|
+
|
105
|
+
class TestJobWithCustomKey < ActiveJob::Base
|
106
|
+
self.queue_adapter = Gouda::Adapter.new
|
107
|
+
include Gouda::ActiveJobExtensions::Concurrency
|
108
|
+
gouda_control_concurrency_with total_limit: 1, key: "42"
|
109
|
+
end
|
110
|
+
|
111
|
+
test "can use an arbitrary string as the custom key" do
|
112
|
+
job = TestJobWithCustomKey.new
|
113
|
+
assert_equal "42", job.enqueue_concurrency_key
|
114
|
+
assert_equal "42", job.execution_concurrency_key
|
115
|
+
end
|
116
|
+
|
117
|
+
class TestJobWithCustomKeyProc < ActiveJob::Base
|
118
|
+
self.queue_adapter = Gouda::Adapter.new
|
119
|
+
include Gouda::ActiveJobExtensions::Concurrency
|
120
|
+
gouda_control_concurrency_with total_limit: 1, key: -> { @ivar }
|
121
|
+
|
122
|
+
def initialize(...)
|
123
|
+
super
|
124
|
+
@ivar = "123"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
test "can use a proc that gets instance_exec'd as the custom key" do
|
129
|
+
job = TestJobWithCustomKeyProc.new
|
130
|
+
assert_equal "123", job.enqueue_concurrency_key
|
131
|
+
assert_equal "123", job.execution_concurrency_key
|
132
|
+
end
|
133
|
+
|
134
|
+
class TestJobWithWithUnconfiguredConcurrency < ActiveJob::Base
|
135
|
+
self.queue_adapter = Gouda::Adapter.new
|
136
|
+
include Gouda::ActiveJobExtensions::Concurrency
|
137
|
+
end
|
138
|
+
|
139
|
+
test "validates arguments" do
|
140
|
+
assert_raises ArgumentError do
|
141
|
+
TestJobWithWithUnconfiguredConcurrency.gouda_control_concurrency_with
|
142
|
+
end
|
143
|
+
|
144
|
+
assert_raises ArgumentError do
|
145
|
+
TestJobWithWithUnconfiguredConcurrency.gouda_control_concurrency_with total_limit: 2
|
146
|
+
end
|
147
|
+
|
148
|
+
assert_raises ArgumentError do
|
149
|
+
TestJobWithWithUnconfiguredConcurrency.gouda_control_concurrency_with perform_limit: 2
|
150
|
+
end
|
151
|
+
|
152
|
+
assert_raises ArgumentError do
|
153
|
+
TestJobWithWithUnconfiguredConcurrency.gouda_control_concurrency_with enqueue_limit: 2
|
154
|
+
end
|
155
|
+
|
156
|
+
assert_raises ArgumentError do
|
157
|
+
TestJobWithWithUnconfiguredConcurrency.gouda_control_concurrency_with total_limit: 2, bollocks: 4
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|