cloudtasker 0.8.0 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +5 -0
- data/.travis.yml +3 -3
- data/CHANGELOG.md +44 -0
- data/README.md +22 -18
- data/_config.yml +1 -0
- data/app/controllers/cloudtasker/worker_controller.rb +21 -5
- data/cloudtasker.gemspec +2 -2
- data/docs/BATCH_JOBS.md +3 -3
- data/docs/CRON_JOBS.md +1 -3
- data/gemfiles/google_cloud_tasks_1.0.gemfile.lock +106 -88
- data/gemfiles/google_cloud_tasks_1.1.gemfile.lock +106 -88
- data/gemfiles/google_cloud_tasks_1.2.gemfile.lock +106 -88
- data/gemfiles/google_cloud_tasks_1.3.gemfile.lock +106 -88
- data/gemfiles/rails_5.2.gemfile.lock +55 -37
- data/gemfiles/rails_6.0.gemfile.lock +56 -38
- data/lib/cloudtasker.rb +1 -0
- data/lib/cloudtasker/backend/google_cloud_task.rb +25 -5
- data/lib/cloudtasker/backend/redis_task.rb +8 -5
- data/lib/cloudtasker/cloud_task.rb +2 -0
- data/lib/cloudtasker/config.rb +19 -1
- data/lib/cloudtasker/max_task_size_exceeded_error.rb +14 -0
- data/lib/cloudtasker/redis_client.rb +5 -1
- data/lib/cloudtasker/version.rb +1 -1
- data/lib/cloudtasker/worker.rb +1 -1
- data/lib/cloudtasker/worker_handler.rb +2 -2
- metadata +12 -11
- data/Gemfile.lock +0 -280
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f86bcf36c7219610dea98de24a9c19ac055a1d205637c94e8a80c8f4c8e7e32b
|
4
|
+
data.tar.gz: f0d86b959b129cb9e4f8c9620b52b5e4a54c190b3cf6be63b70bd1f50f5345c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebbb141e2929c1dae0e501230b349a6eddfc69ece423c161011489641aeac2ba9f1a48f69abc28ca9a6261ca8da23b90c7fca25f13cd1513777013e961d5c9c4
|
7
|
+
data.tar.gz: 2b1254f1dd38d9fef70d68af840976e0720698e9ea49470c24e73f069da110b3f284db51f6e5823c2a1df5ae17c1f0d32c7d0dd8ac5e5e82420faa0f47e8f462
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
language: ruby
|
3
3
|
cache: bundler
|
4
4
|
rvm:
|
5
|
-
- 2.3
|
6
|
-
- 2.4
|
7
5
|
- 2.5.5
|
6
|
+
services:
|
7
|
+
- redis-server
|
8
8
|
before_install: gem install bundler -v 2.0.2
|
9
|
-
before_script: rubocop
|
9
|
+
before_script: bundle exec rubocop
|
10
10
|
gemfile:
|
11
11
|
- gemfiles/google_cloud_tasks_1.0.gemfile
|
12
12
|
- gemfiles/google_cloud_tasks_1.1.gemfile
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,49 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v0.9.2](https://github.com/keypup-io/cloudtasker/tree/v0.9.2) (2020-03-04)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/keypup-io/cloudtasker/compare/v0.9.1...v0.9.2)
|
6
|
+
|
7
|
+
**Fixed bugs:**
|
8
|
+
- Cloud Task: ignore "not found" errors when trying to delete an already deleted task.
|
9
|
+
|
10
|
+
## [v0.9.1](https://github.com/keypup-io/cloudtasker/tree/v0.9.1) (2020-02-11)
|
11
|
+
|
12
|
+
[Full Changelog](https://github.com/keypup-io/cloudtasker/compare/v0.9.0...v0.9.1)
|
13
|
+
|
14
|
+
**Fixed bugs:**
|
15
|
+
- Cloud Task: raise `Cloudtasker::MaxTaskSizeExceededError` if job payload exceeds 100 KB. This is mainly to have production parity in development when running the local processing server.
|
16
|
+
|
17
|
+
## [v0.9.0](https://github.com/keypup-io/cloudtasker/tree/v0.9.0) (2020-01-23)
|
18
|
+
|
19
|
+
[Full Changelog](https://github.com/keypup-io/cloudtasker/compare/v0.8.2...v0.9.0)
|
20
|
+
|
21
|
+
**Fixed bugs:**
|
22
|
+
- Cloud Task: Base64 encode task body to support UTF-8 characters (e.g. emojis).
|
23
|
+
- Redis: Restrict to one connection (class level) to avoid too many DNS lookups
|
24
|
+
|
25
|
+
**Migration**
|
26
|
+
For Sinatra applications please update your Cloudtasker controller according to [this diff](https://github.com/keypup-io/cloudtasker/commit/311fa8f9beec91fbae012164a25b2ee6e261a2e4#diff-c2a0ea6c6e6c31c749d2e1acdc574f0f).
|
27
|
+
|
28
|
+
## [v0.8.2](https://github.com/keypup-io/cloudtasker/tree/v0.8.2) (2019-12-05)
|
29
|
+
|
30
|
+
[Full Changelog](https://github.com/keypup-io/cloudtasker/compare/v0.8.1...v0.8.2)
|
31
|
+
|
32
|
+
**Fixed bugs:**
|
33
|
+
- Config: do not add processor host to `Rails.application.config.hosts` if originally empty.
|
34
|
+
|
35
|
+
## [v0.8.1](https://github.com/keypup-io/cloudtasker/tree/v0.8.1) (2019-12-03)
|
36
|
+
|
37
|
+
[Full Changelog](https://github.com/keypup-io/cloudtasker/compare/v0.8.0...v0.8.1)
|
38
|
+
|
39
|
+
**Fixed bugs:**
|
40
|
+
- Local dev server: ensure job queue name is kept when taks is retried
|
41
|
+
- Rails/Controller: bypass Rails munge logic to preserve nil values inside job arguments.
|
42
|
+
|
43
|
+
## [v0.8.0](https://github.com/keypup-io/cloudtasker/tree/v0.8.0) (2019-11-27)
|
44
|
+
|
45
|
+
[Full Changelog](https://github.com/keypup-io/cloudtasker/compare/v0.7.0...v0.8.0)
|
46
|
+
|
3
47
|
## [v0.7.0](https://github.com/keypup-io/cloudtasker/tree/v0.7.0) (2019-11-25)
|
4
48
|
|
5
49
|
[Full Changelog](https://github.com/keypup-io/cloudtasker/compare/v0.6.0...v0.7.0)
|
data/README.md
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
+
[![Build Status](https://travis-ci.org/keypup-io/cloudtasker.svg?branch=master)](https://travis-ci.org/keypup-io/cloudtasker) [![Gem Version](https://badge.fury.io/rb/cloudtasker.svg)](https://badge.fury.io/rb/cloudtasker)
|
2
|
+
|
1
3
|
# Cloudtasker
|
2
4
|
|
3
5
|
Background jobs for Ruby using Google Cloud Tasks.
|
4
6
|
|
5
7
|
Cloudtasker provides an easy to manage interface to Google Cloud Tasks for background job processing. Workers can be defined programmatically using the Cloudtasker DSL and enqueued for processing using a simple to use API.
|
6
8
|
|
7
|
-
Cloudtasker is particularly suited for serverless applications only responding to HTTP requests and where running a dedicated job processing is not an option (e.g. deploy via [Cloud Run](https://cloud.google.com/run)). All jobs enqueued in Cloud Tasks via Cloudtasker eventually
|
9
|
+
Cloudtasker is particularly suited for serverless applications only responding to HTTP requests and where running a dedicated job processing is not an option (e.g. deploy via [Cloud Run](https://cloud.google.com/run)). All jobs enqueued in Cloud Tasks via Cloudtasker eventually get processed by your application via HTTP requests.
|
8
10
|
|
9
11
|
Cloudtasker also provides optional modules for running [cron jobs](docs/CRON_JOBS.md), [batch jobs](docs/BATCH_JOBS.md) and [unique jobs](docs/UNIQUE_JOBS.md).
|
10
12
|
|
11
|
-
A local processing server is also available in development. This local server processes jobs in lieu of Cloud Tasks and
|
13
|
+
A local processing server is also available in development. This local server processes jobs in lieu of Cloud Tasks and allows you to work offline.
|
12
14
|
|
13
15
|
## Summary
|
14
16
|
|
@@ -107,7 +109,7 @@ Open a Rails console and enqueue some jobs
|
|
107
109
|
DummyWorker.perform_async('foo')
|
108
110
|
|
109
111
|
# Process job in 60 seconds
|
110
|
-
DummyWorker.perform_in(
|
112
|
+
DummyWorker.perform_in(60, 'foo')
|
111
113
|
```
|
112
114
|
|
113
115
|
Your Rails logs should display the following:
|
@@ -349,7 +351,7 @@ When working locally on your application it is usually not possible to have a pu
|
|
349
351
|
### Option 1: Cloudtasker local server
|
350
352
|
The Cloudtasker local server is a ruby daemon that looks for jobs pushed to Redis and sends them to your application via HTTP POST requests. The server mimics the way Google Cloud Tasks works, but locally!
|
351
353
|
|
352
|
-
You can configure your
|
354
|
+
You can configure your application to use the Cloudtasker local server using the following initializer:
|
353
355
|
```ruby
|
354
356
|
# config/initializers/cloudtasker.rb
|
355
357
|
|
@@ -371,20 +373,20 @@ bundle exec cloudtasker
|
|
371
373
|
You can as well define a Procfile to manage the cloudtasker process via foreman. Then use `foreman start` to launch both your Rails server and the Cloudtasker local server.
|
372
374
|
```yaml
|
373
375
|
# Procfile
|
374
|
-
web: rails s
|
375
|
-
worker: cloudtasker
|
376
|
+
web: bundle exec rails s
|
377
|
+
worker: bundle exec cloudtasker
|
376
378
|
```
|
377
379
|
|
378
380
|
Note that the local development server runs with `5` concurrent threads by default. You can tune the number of threads per queue by running `cloudtasker` the following options:
|
379
381
|
```bash
|
380
|
-
cloudtasker -q critical,5 -q important,4 -q default,3
|
382
|
+
bundle exec cloudtasker -q critical,5 -q important,4 -q default,3
|
381
383
|
```
|
382
384
|
|
383
385
|
### Option 2: Using ngrok
|
384
386
|
|
385
387
|
Want to test your application end to end with Google Cloud Task? Then [ngrok](https://ngrok.io) is the way to go.
|
386
388
|
|
387
|
-
First start your ngrok tunnel
|
389
|
+
First start your ngrok tunnel:
|
388
390
|
```bash
|
389
391
|
ngrok http 3000
|
390
392
|
```
|
@@ -409,7 +411,7 @@ end
|
|
409
411
|
|
410
412
|
Finally start Rails to accept jobs from Google Cloud Tasks
|
411
413
|
```bash
|
412
|
-
rails s
|
414
|
+
bundle exec rails s
|
413
415
|
```
|
414
416
|
|
415
417
|
## Logging
|
@@ -418,7 +420,7 @@ There are several options available to configure logging and logging context.
|
|
418
420
|
### Configuring a logger
|
419
421
|
Cloudtasker uses `Rails.logger` if Rails is available and falls back on a plain ruby logger `Logger.new(STDOUT)` if not.
|
420
422
|
|
421
|
-
It is also possible to configure your own logger. For example you can setup Cloudtasker with [semantic_logger](http://rocketjob.github.io/semantic_logger) by doing the following your initializer:
|
423
|
+
It is also possible to configure your own logger. For example you can setup Cloudtasker with [semantic_logger](http://rocketjob.github.io/semantic_logger) by doing the following in your initializer:
|
422
424
|
```ruby
|
423
425
|
# config/initializers/cloudtasker.rb
|
424
426
|
|
@@ -464,7 +466,7 @@ Cloudtasker::WorkerLogger.log_context_processor = lambda { |worker|
|
|
464
466
|
}
|
465
467
|
```
|
466
468
|
|
467
|
-
You could also decide to log all available context
|
469
|
+
You could also decide to log all available context - including arguments passed to `perform` - for specific workers only:
|
468
470
|
```ruby
|
469
471
|
# app/workers/full_context_worker.rb
|
470
472
|
|
@@ -479,7 +481,7 @@ class FullContextWorker
|
|
479
481
|
end
|
480
482
|
```
|
481
483
|
|
482
|
-
See the [Cloudtasker::Worker class](
|
484
|
+
See the [Cloudtasker::Worker class](lib/cloudtasker/worker.rb) for more information on attributes available to be logged in your `log_context_processor` proc.
|
483
485
|
|
484
486
|
## Error Handling
|
485
487
|
|
@@ -611,7 +613,7 @@ MyWorker.new.perform({ 'foo' => 'bar', 'baz' => { 'key' => 'value' } })
|
|
611
613
|
```
|
612
614
|
|
613
615
|
### Be careful with default arguments
|
614
|
-
Default arguments passed to the `perform` method are not actually considered as job arguments. Default arguments will therefore be ignored in contextual logging and by extensions relying on arguments such as the
|
616
|
+
Default arguments passed to the `perform` method are not actually considered as job arguments. Default arguments will therefore be ignored in contextual logging and by extensions relying on arguments such as the [unique job](docs/UNIQUE_JOBS.md) extension.
|
615
617
|
|
616
618
|
Consider the following worker:
|
617
619
|
```ruby
|
@@ -633,7 +635,9 @@ If you enqueue this worker by omitting the second argument `MyWorker.perform_asy
|
|
633
635
|
- The `time_at` argument will be ignored by the `unique-job` extension, meaning that job uniqueness will be only based on the `user_id` argument.
|
634
636
|
|
635
637
|
### Handling big job payloads
|
636
|
-
|
638
|
+
Google Cloud Tasks enforces a limit of 100 KB for job payloads. Taking into accounts Cloudtasker authentication headers and meta information this leave ~85 KB of free space for JSONified job arguments.
|
639
|
+
|
640
|
+
Any excessive job payload (> 100 KB) will raise a `Cloudtasker::MaxTaskSizeExceededError`, both in production and development mode.
|
637
641
|
|
638
642
|
If you feel that a job payload is going to get big, prefer to store the payload using a datastore (e.g. Redis) and pass a reference to the job to retrieve the payload inside your job `perform` method.
|
639
643
|
|
@@ -664,13 +668,13 @@ BigPayloadWorker.perform_async(payload_id)
|
|
664
668
|
|
665
669
|
### Sizing the concurrency of your queues
|
666
670
|
|
667
|
-
When defining the max concurrency
|
671
|
+
When defining the max concurrency of your queues (`max_concurrent_dispatches` in Cloud Tasks) you must keep in mind the maximum number of threads that your application provides. Otherwise your application threads may eventually get exhausted and your users will experience outages if all your web threads are busy running jobs.
|
668
672
|
|
669
673
|
#### With server based applications
|
670
674
|
|
671
675
|
Let's consider an application deployed in production with 3 instances, each having `RAILS_MAX_THREADS` set to `20`. This gives us a total of `60` threads available.
|
672
676
|
|
673
|
-
Now let's say that we distribute jobs across two queues: `default` and `critical`. We can set the concurrency of each
|
677
|
+
Now let's say that we distribute jobs across two queues: `default` and `critical`. We can set the concurrency of each queue depending on the profile of the application:
|
674
678
|
|
675
679
|
E.g. 1: The application serves requests from web users and runs backgrounds jobs in a balanced way
|
676
680
|
```
|
@@ -687,7 +691,7 @@ concurrency for default queue: 35
|
|
687
691
|
concurrency for critical queue: 15
|
688
692
|
|
689
693
|
Total threads consumed by jobs at most: 50
|
690
|
-
Total threads always available to
|
694
|
+
Total threads always available to API clients at worst: 10
|
691
695
|
```
|
692
696
|
|
693
697
|
Also always ensure that your total number of threads does not exceed the available number of database connections (if you use any).
|
@@ -698,7 +702,7 @@ In a serverless context your application will be scaled up/down based on traffic
|
|
698
702
|
|
699
703
|
Because your application is auto-scaled - and assuming you haven't set a maximum - your job processing capacity if theoretically unlimited. The main limiting factor in a serverless context becomes external constraints such as the number of database connections available.
|
700
704
|
|
701
|
-
To size the concurrency of your queues you should therefore take the most limiting factor - which is often the database connection pool size
|
705
|
+
To size the concurrency of your queues you should therefore take the most limiting factor - which is often the database connection pool size of relational databases - and use the calculations of the previous section with this limiting factor as the capping parameter instead of threads.
|
702
706
|
|
703
707
|
|
704
708
|
## Development
|
data/_config.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
theme: jekyll-theme-slate
|
@@ -16,11 +16,6 @@ module Cloudtasker
|
|
16
16
|
# Run a worker from a Cloud Task payload
|
17
17
|
#
|
18
18
|
def run
|
19
|
-
# Build payload
|
20
|
-
payload = request.params
|
21
|
-
.slice(:worker, :job_id, :job_args, :job_meta, :job_queue)
|
22
|
-
.merge(job_retries: job_retries)
|
23
|
-
|
24
19
|
# Process payload
|
25
20
|
WorkerHandler.execute_from_payload!(payload)
|
26
21
|
head :no_content
|
@@ -39,6 +34,27 @@ module Cloudtasker
|
|
39
34
|
|
40
35
|
private
|
41
36
|
|
37
|
+
#
|
38
|
+
# Parse the request body and return the actual job
|
39
|
+
# payload.
|
40
|
+
#
|
41
|
+
# @return [Hash] The job payload
|
42
|
+
#
|
43
|
+
def payload
|
44
|
+
@payload ||= begin
|
45
|
+
# Get raw body
|
46
|
+
content = request.body.read
|
47
|
+
|
48
|
+
# Decode content if the body is Base64 encoded
|
49
|
+
if request.headers[Cloudtasker::Config::ENCODING_HEADER].to_s.downcase == 'base64'
|
50
|
+
content = Base64.decode64(content)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Return content parsed as JSON and add job retries count
|
54
|
+
JSON.parse(content).merge(job_retries: job_retries)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
42
58
|
#
|
43
59
|
# Extract the number of times this task failed at runtime.
|
44
60
|
#
|
data/cloudtasker.gemspec
CHANGED
@@ -39,10 +39,10 @@ Gem::Specification.new do |spec|
|
|
39
39
|
spec.add_development_dependency 'appraisal'
|
40
40
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
41
41
|
spec.add_development_dependency 'github_changelog_generator'
|
42
|
-
spec.add_development_dependency 'rake', '
|
42
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
43
43
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
44
44
|
spec.add_development_dependency 'rubocop', '0.76.0'
|
45
|
-
spec.add_development_dependency 'rubocop-rspec'
|
45
|
+
spec.add_development_dependency 'rubocop-rspec', '1.37.0'
|
46
46
|
spec.add_development_dependency 'timecop'
|
47
47
|
spec.add_development_dependency 'webmock'
|
48
48
|
|
data/docs/BATCH_JOBS.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
**Note**: this extension requires redis
|
4
4
|
|
5
|
-
The Cloudtasker batch job extension allows to add sub-jobs to regular jobs. This adds the ability to enqueue a list of jobs and track their overall progression as a
|
5
|
+
The Cloudtasker batch job extension allows to add sub-jobs to regular jobs. This adds the ability to enqueue a list of jobs and track their overall progression as a group of jobs (a "batch"). This extension allows jobs to define callbacks in their worker to track completion of the batch and take actions based on that.
|
6
6
|
|
7
7
|
## Configuration
|
8
8
|
|
@@ -53,7 +53,7 @@ The following callbacks are available on your workers to track the progress of t
|
|
53
53
|
|
54
54
|
| Callback | Argument | Description |
|
55
55
|
|------|-------------|-----------|
|
56
|
-
| `on_batch_node_complete` | `The child job` | Invoked when any descendant (e.g. sub-sub job) successfully
|
56
|
+
| `on_batch_node_complete` | `The child job` | Invoked when any descendant (e.g. sub-sub job) successfully completes |
|
57
57
|
| `on_child_complete` | `The child job` | Invoked when a direct descendant successfully completes |
|
58
58
|
| `on_child_error` | `The child job` | Invoked when a child fails |
|
59
59
|
| `on_child_dead` | `The child job` | Invoked when a child has exhausted all of its retries |s
|
@@ -88,4 +88,4 @@ def on_batch_node_complete(_child_job)
|
|
88
88
|
logger.info("Completed: #{batch.progress.completed}")
|
89
89
|
logger.info("Progress: #{batch.progress.percent.to_i}%")
|
90
90
|
end
|
91
|
-
```
|
91
|
+
```
|
data/docs/CRON_JOBS.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
cloudtasker (0.2
|
4
|
+
cloudtasker (0.9.2)
|
5
5
|
activesupport
|
6
6
|
fugit
|
7
7
|
google-cloud-tasks
|
@@ -11,56 +11,56 @@ PATH
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
actioncable (6.0.1)
|
15
|
-
actionpack (= 6.0.1)
|
14
|
+
actioncable (6.0.2.1)
|
15
|
+
actionpack (= 6.0.2.1)
|
16
16
|
nio4r (~> 2.0)
|
17
17
|
websocket-driver (>= 0.6.1)
|
18
|
-
actionmailbox (6.0.1)
|
19
|
-
actionpack (= 6.0.1)
|
20
|
-
activejob (= 6.0.1)
|
21
|
-
activerecord (= 6.0.1)
|
22
|
-
activestorage (= 6.0.1)
|
23
|
-
activesupport (= 6.0.1)
|
18
|
+
actionmailbox (6.0.2.1)
|
19
|
+
actionpack (= 6.0.2.1)
|
20
|
+
activejob (= 6.0.2.1)
|
21
|
+
activerecord (= 6.0.2.1)
|
22
|
+
activestorage (= 6.0.2.1)
|
23
|
+
activesupport (= 6.0.2.1)
|
24
24
|
mail (>= 2.7.1)
|
25
|
-
actionmailer (6.0.1)
|
26
|
-
actionpack (= 6.0.1)
|
27
|
-
actionview (= 6.0.1)
|
28
|
-
activejob (= 6.0.1)
|
25
|
+
actionmailer (6.0.2.1)
|
26
|
+
actionpack (= 6.0.2.1)
|
27
|
+
actionview (= 6.0.2.1)
|
28
|
+
activejob (= 6.0.2.1)
|
29
29
|
mail (~> 2.5, >= 2.5.4)
|
30
30
|
rails-dom-testing (~> 2.0)
|
31
|
-
actionpack (6.0.1)
|
32
|
-
actionview (= 6.0.1)
|
33
|
-
activesupport (= 6.0.1)
|
34
|
-
rack (~> 2.0)
|
31
|
+
actionpack (6.0.2.1)
|
32
|
+
actionview (= 6.0.2.1)
|
33
|
+
activesupport (= 6.0.2.1)
|
34
|
+
rack (~> 2.0, >= 2.0.8)
|
35
35
|
rack-test (>= 0.6.3)
|
36
36
|
rails-dom-testing (~> 2.0)
|
37
37
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
38
|
-
actiontext (6.0.1)
|
39
|
-
actionpack (= 6.0.1)
|
40
|
-
activerecord (= 6.0.1)
|
41
|
-
activestorage (= 6.0.1)
|
42
|
-
activesupport (= 6.0.1)
|
38
|
+
actiontext (6.0.2.1)
|
39
|
+
actionpack (= 6.0.2.1)
|
40
|
+
activerecord (= 6.0.2.1)
|
41
|
+
activestorage (= 6.0.2.1)
|
42
|
+
activesupport (= 6.0.2.1)
|
43
43
|
nokogiri (>= 1.8.5)
|
44
|
-
actionview (6.0.1)
|
45
|
-
activesupport (= 6.0.1)
|
44
|
+
actionview (6.0.2.1)
|
45
|
+
activesupport (= 6.0.2.1)
|
46
46
|
builder (~> 3.1)
|
47
47
|
erubi (~> 1.4)
|
48
48
|
rails-dom-testing (~> 2.0)
|
49
49
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
50
|
-
activejob (6.0.1)
|
51
|
-
activesupport (= 6.0.1)
|
50
|
+
activejob (6.0.2.1)
|
51
|
+
activesupport (= 6.0.2.1)
|
52
52
|
globalid (>= 0.3.6)
|
53
|
-
activemodel (6.0.1)
|
54
|
-
activesupport (= 6.0.1)
|
55
|
-
activerecord (6.0.1)
|
56
|
-
activemodel (= 6.0.1)
|
57
|
-
activesupport (= 6.0.1)
|
58
|
-
activestorage (6.0.1)
|
59
|
-
actionpack (= 6.0.1)
|
60
|
-
activejob (= 6.0.1)
|
61
|
-
activerecord (= 6.0.1)
|
53
|
+
activemodel (6.0.2.1)
|
54
|
+
activesupport (= 6.0.2.1)
|
55
|
+
activerecord (6.0.2.1)
|
56
|
+
activemodel (= 6.0.2.1)
|
57
|
+
activesupport (= 6.0.2.1)
|
58
|
+
activestorage (6.0.2.1)
|
59
|
+
actionpack (= 6.0.2.1)
|
60
|
+
activejob (= 6.0.2.1)
|
61
|
+
activerecord (= 6.0.2.1)
|
62
62
|
marcel (~> 0.3.1)
|
63
|
-
activesupport (6.0.1)
|
63
|
+
activesupport (6.0.2.1)
|
64
64
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
65
65
|
i18n (>= 0.7, < 2)
|
66
66
|
minitest (~> 5.1)
|
@@ -73,20 +73,30 @@ GEM
|
|
73
73
|
rake
|
74
74
|
thor (>= 0.14.0)
|
75
75
|
ast (2.4.0)
|
76
|
-
builder (3.2.
|
77
|
-
concurrent-ruby (1.1.
|
76
|
+
builder (3.2.4)
|
77
|
+
concurrent-ruby (1.1.6)
|
78
78
|
crack (0.4.3)
|
79
79
|
safe_yaml (~> 1.0.0)
|
80
|
-
crass (1.0.
|
80
|
+
crass (1.0.6)
|
81
81
|
diff-lcs (1.3)
|
82
82
|
erubi (1.9.0)
|
83
83
|
et-orbi (1.2.2)
|
84
84
|
tzinfo
|
85
|
-
faraday (0.17.
|
85
|
+
faraday (0.17.3)
|
86
86
|
multipart-post (>= 1.2, < 3)
|
87
|
+
faraday-http-cache (2.0.0)
|
88
|
+
faraday (~> 0.8)
|
87
89
|
fugit (1.3.3)
|
88
90
|
et-orbi (~> 1.1, >= 1.1.8)
|
89
91
|
raabro (~> 1.1)
|
92
|
+
github_changelog_generator (1.15.0)
|
93
|
+
activesupport
|
94
|
+
faraday-http-cache
|
95
|
+
multi_json
|
96
|
+
octokit (~> 4.6)
|
97
|
+
rainbow (>= 2.2.1)
|
98
|
+
rake (>= 10.0)
|
99
|
+
retriable (~> 3.0)
|
90
100
|
globalid (0.4.2)
|
91
101
|
activesupport (>= 4.2.0)
|
92
102
|
google-cloud-tasks (1.0.0)
|
@@ -99,98 +109,102 @@ GEM
|
|
99
109
|
googleauth (~> 0.9)
|
100
110
|
grpc (~> 1.24)
|
101
111
|
rly (~> 0.2.3)
|
102
|
-
google-protobuf (3.
|
112
|
+
google-protobuf (3.11.4)
|
103
113
|
googleapis-common-protos (1.3.9)
|
104
114
|
google-protobuf (~> 3.0)
|
105
115
|
googleapis-common-protos-types (~> 1.0)
|
106
116
|
grpc (~> 1.0)
|
107
117
|
googleapis-common-protos-types (1.0.4)
|
108
118
|
google-protobuf (~> 3.0)
|
109
|
-
googleauth (0.
|
110
|
-
faraday (
|
119
|
+
googleauth (0.11.0)
|
120
|
+
faraday (>= 0.17.3, < 2.0)
|
111
121
|
jwt (>= 1.4, < 3.0)
|
112
122
|
memoist (~> 0.16)
|
113
123
|
multi_json (~> 1.11)
|
114
124
|
os (>= 0.9, < 2.0)
|
115
125
|
signet (~> 0.12)
|
116
|
-
grpc (1.
|
117
|
-
google-protobuf (~> 3.
|
126
|
+
grpc (1.27.0)
|
127
|
+
google-protobuf (~> 3.11)
|
118
128
|
googleapis-common-protos-types (~> 1.0)
|
119
129
|
grpc-google-iam-v1 (0.6.9)
|
120
130
|
googleapis-common-protos (>= 1.3.1, < 2.0)
|
121
131
|
grpc (~> 1.0)
|
122
|
-
hashdiff (1.0.
|
123
|
-
i18n (1.
|
132
|
+
hashdiff (1.0.1)
|
133
|
+
i18n (1.8.2)
|
124
134
|
concurrent-ruby (~> 1.0)
|
125
135
|
jaro_winkler (1.5.4)
|
126
136
|
jwt (2.2.1)
|
127
|
-
loofah (2.
|
137
|
+
loofah (2.4.0)
|
128
138
|
crass (~> 1.0.2)
|
129
139
|
nokogiri (>= 1.5.9)
|
130
140
|
mail (2.7.1)
|
131
141
|
mini_mime (>= 0.1.1)
|
132
142
|
marcel (0.3.3)
|
133
143
|
mimemagic (~> 0.3.2)
|
134
|
-
memoist (0.16.
|
144
|
+
memoist (0.16.2)
|
135
145
|
method_source (0.9.2)
|
136
|
-
mimemagic (0.3.
|
146
|
+
mimemagic (0.3.4)
|
137
147
|
mini_mime (1.0.2)
|
138
148
|
mini_portile2 (2.4.0)
|
139
|
-
minitest (5.
|
149
|
+
minitest (5.14.0)
|
140
150
|
multi_json (1.14.1)
|
141
151
|
multipart-post (2.1.1)
|
142
152
|
nio4r (2.5.2)
|
143
|
-
nokogiri (1.10.
|
153
|
+
nokogiri (1.10.9)
|
144
154
|
mini_portile2 (~> 2.4.0)
|
155
|
+
octokit (4.16.0)
|
156
|
+
faraday (>= 0.9)
|
157
|
+
sawyer (~> 0.8.0, >= 0.5.3)
|
145
158
|
os (1.0.1)
|
146
|
-
parallel (1.19.
|
147
|
-
parser (2.
|
159
|
+
parallel (1.19.1)
|
160
|
+
parser (2.7.0.4)
|
148
161
|
ast (~> 2.4.0)
|
149
|
-
public_suffix (4.0.
|
162
|
+
public_suffix (4.0.3)
|
150
163
|
raabro (1.1.6)
|
151
|
-
rack (2.
|
164
|
+
rack (2.2.2)
|
152
165
|
rack-test (1.1.0)
|
153
166
|
rack (>= 1.0, < 3)
|
154
|
-
rails (6.0.1)
|
155
|
-
actioncable (= 6.0.1)
|
156
|
-
actionmailbox (= 6.0.1)
|
157
|
-
actionmailer (= 6.0.1)
|
158
|
-
actionpack (= 6.0.1)
|
159
|
-
actiontext (= 6.0.1)
|
160
|
-
actionview (= 6.0.1)
|
161
|
-
activejob (= 6.0.1)
|
162
|
-
activemodel (= 6.0.1)
|
163
|
-
activerecord (= 6.0.1)
|
164
|
-
activestorage (= 6.0.1)
|
165
|
-
activesupport (= 6.0.1)
|
167
|
+
rails (6.0.2.1)
|
168
|
+
actioncable (= 6.0.2.1)
|
169
|
+
actionmailbox (= 6.0.2.1)
|
170
|
+
actionmailer (= 6.0.2.1)
|
171
|
+
actionpack (= 6.0.2.1)
|
172
|
+
actiontext (= 6.0.2.1)
|
173
|
+
actionview (= 6.0.2.1)
|
174
|
+
activejob (= 6.0.2.1)
|
175
|
+
activemodel (= 6.0.2.1)
|
176
|
+
activerecord (= 6.0.2.1)
|
177
|
+
activestorage (= 6.0.2.1)
|
178
|
+
activesupport (= 6.0.2.1)
|
166
179
|
bundler (>= 1.3.0)
|
167
|
-
railties (= 6.0.1)
|
180
|
+
railties (= 6.0.2.1)
|
168
181
|
sprockets-rails (>= 2.0.0)
|
169
182
|
rails-dom-testing (2.0.3)
|
170
183
|
activesupport (>= 4.2.0)
|
171
184
|
nokogiri (>= 1.6)
|
172
185
|
rails-html-sanitizer (1.3.0)
|
173
186
|
loofah (~> 2.3)
|
174
|
-
railties (6.0.1)
|
175
|
-
actionpack (= 6.0.1)
|
176
|
-
activesupport (= 6.0.1)
|
187
|
+
railties (6.0.2.1)
|
188
|
+
actionpack (= 6.0.2.1)
|
189
|
+
activesupport (= 6.0.2.1)
|
177
190
|
method_source
|
178
191
|
rake (>= 0.8.7)
|
179
192
|
thor (>= 0.20.3, < 2.0)
|
180
193
|
rainbow (3.0.0)
|
181
|
-
rake (
|
194
|
+
rake (13.0.1)
|
182
195
|
redis (4.1.3)
|
196
|
+
retriable (3.1.2)
|
183
197
|
rly (0.2.3)
|
184
198
|
rspec (3.9.0)
|
185
199
|
rspec-core (~> 3.9.0)
|
186
200
|
rspec-expectations (~> 3.9.0)
|
187
201
|
rspec-mocks (~> 3.9.0)
|
188
|
-
rspec-core (3.9.
|
189
|
-
rspec-support (~> 3.9.
|
202
|
+
rspec-core (3.9.1)
|
203
|
+
rspec-support (~> 3.9.1)
|
190
204
|
rspec-expectations (3.9.0)
|
191
205
|
diff-lcs (>= 1.2.0, < 2.0)
|
192
206
|
rspec-support (~> 3.9.0)
|
193
|
-
rspec-mocks (3.9.
|
207
|
+
rspec-mocks (3.9.1)
|
194
208
|
diff-lcs (>= 1.2.0, < 2.0)
|
195
209
|
rspec-support (~> 3.9.0)
|
196
210
|
rspec-rails (3.9.0)
|
@@ -201,7 +215,7 @@ GEM
|
|
201
215
|
rspec-expectations (~> 3.9.0)
|
202
216
|
rspec-mocks (~> 3.9.0)
|
203
217
|
rspec-support (~> 3.9.0)
|
204
|
-
rspec-support (3.9.
|
218
|
+
rspec-support (3.9.2)
|
205
219
|
rubocop (0.76.0)
|
206
220
|
jaro_winkler (~> 1.5.1)
|
207
221
|
parallel (~> 1.10)
|
@@ -209,13 +223,16 @@ GEM
|
|
209
223
|
rainbow (>= 2.2.2, < 4.0)
|
210
224
|
ruby-progressbar (~> 1.7)
|
211
225
|
unicode-display_width (>= 1.4.0, < 1.7)
|
212
|
-
rubocop-rspec (1.
|
226
|
+
rubocop-rspec (1.37.0)
|
213
227
|
rubocop (>= 0.68.1)
|
214
228
|
ruby-progressbar (1.10.1)
|
215
229
|
safe_yaml (1.0.5)
|
216
|
-
|
230
|
+
sawyer (0.8.2)
|
231
|
+
addressable (>= 2.3.5)
|
232
|
+
faraday (> 0.8, < 2.0)
|
233
|
+
signet (0.13.0)
|
217
234
|
addressable (~> 2.3)
|
218
|
-
faraday (
|
235
|
+
faraday (>= 0.17.3, < 2.0)
|
219
236
|
jwt (>= 1.5, < 3.0)
|
220
237
|
multi_json (~> 1.10)
|
221
238
|
sprockets (4.0.0)
|
@@ -225,21 +242,21 @@ GEM
|
|
225
242
|
actionpack (>= 4.0)
|
226
243
|
activesupport (>= 4.0)
|
227
244
|
sprockets (>= 3.0.0)
|
228
|
-
sqlite3 (1.4.
|
229
|
-
thor (0.
|
245
|
+
sqlite3 (1.4.2)
|
246
|
+
thor (1.0.1)
|
230
247
|
thread_safe (0.3.6)
|
231
248
|
timecop (0.9.1)
|
232
|
-
tzinfo (1.2.
|
249
|
+
tzinfo (1.2.6)
|
233
250
|
thread_safe (~> 0.1)
|
234
|
-
unicode-display_width (1.6.
|
235
|
-
webmock (3.
|
251
|
+
unicode-display_width (1.6.1)
|
252
|
+
webmock (3.8.2)
|
236
253
|
addressable (>= 2.3.6)
|
237
254
|
crack (>= 0.3.2)
|
238
255
|
hashdiff (>= 0.4.0, < 2.0.0)
|
239
256
|
websocket-driver (0.7.1)
|
240
257
|
websocket-extensions (>= 0.1.0)
|
241
258
|
websocket-extensions (0.1.4)
|
242
|
-
zeitwerk (2.
|
259
|
+
zeitwerk (2.3.0)
|
243
260
|
|
244
261
|
PLATFORMS
|
245
262
|
ruby
|
@@ -248,13 +265,14 @@ DEPENDENCIES
|
|
248
265
|
appraisal
|
249
266
|
bundler (~> 2.0)
|
250
267
|
cloudtasker!
|
268
|
+
github_changelog_generator
|
251
269
|
google-cloud-tasks (= 1.0)
|
252
270
|
rails
|
253
|
-
rake (
|
271
|
+
rake (>= 12.3.3)
|
254
272
|
rspec (~> 3.0)
|
255
273
|
rspec-rails
|
256
274
|
rubocop (= 0.76.0)
|
257
|
-
rubocop-rspec
|
275
|
+
rubocop-rspec (= 1.37.0)
|
258
276
|
sqlite3
|
259
277
|
timecop
|
260
278
|
webmock
|