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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e2a110c5354118a009e8620c887eb0c8bb9ff5c7aa63fefcf242ac9a649bd0e1
4
- data.tar.gz: 58772d851865727f326bc30dfa3b94f170fe602eff264ce8661f2abd175033e9
3
+ metadata.gz: f86bcf36c7219610dea98de24a9c19ac055a1d205637c94e8a80c8f4c8e7e32b
4
+ data.tar.gz: f0d86b959b129cb9e4f8c9620b52b5e4a54c190b3cf6be63b70bd1f50f5345c9
5
5
  SHA512:
6
- metadata.gz: af8b0e59a08d7e65bcc46f03135c17932b69816c2282bc651b1ae60887bde3ea0e52af051accb5606f1c2d042dd15dc224313a6aa7b8e6222aeef01806147464
7
- data.tar.gz: 8b9d7e921aca496913a36357a43e8e3c0f77e059ac31439b3ccbe749afde946117a9faca70de11ee50ed6a9ff97b3439889b90bdb30db534ba4ac7690a0e3bfb
6
+ metadata.gz: ebbb141e2929c1dae0e501230b349a6eddfc69ece423c161011489641aeac2ba9f1a48f69abc28ca9a6261ca8da23b90c7fca25f13cd1513777013e961d5c9c4
7
+ data.tar.gz: 2b1254f1dd38d9fef70d68af840976e0720698e9ea49470c24e73f069da110b3f284db51f6e5823c2a1df5ae17c1f0d32c7d0dd8ac5e5e82420faa0f47e8f462
data/.gitignore CHANGED
@@ -12,5 +12,8 @@
12
12
  /spec/dummy/tmp/
13
13
  /tmp/
14
14
 
15
+ # Ignore lock files (e.g. Gemfile.lock)
16
+ *.lock
17
+
15
18
  # rspec failure tracking
16
19
  .rspec_status
data/.rubocop.yml CHANGED
@@ -1,5 +1,10 @@
1
1
  require: rubocop-rspec
2
2
 
3
+ AllCops:
4
+ Exclude:
5
+ - 'gemfiles/vendor/**/*'
6
+ - 'vendor/**/*'
7
+
3
8
  Metrics/ClassLength:
4
9
  Max: 150
5
10
 
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 gets processed by your application via HTTP requests.
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 allow you to work offline.
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(10, 'foo')
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 applicatiion to use the Cloudtasker local server using the following initializer:
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 and take note of the :
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 (including arguments passed to perform) for specific workers only:
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](blob/master/lib/cloudtasker/worker.rb) for more information on attributes available to be logged in your `log_context_processor` proc.
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 `unique-job` extension.
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
- Keep in mind that jobs are pushed to Google Cloud Tasks via API and then delivered to your application via API as well. Therefore any excessive job payload will slow down the enqueuing of jobs and create additional processing when receiving the job.
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 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.
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 each queue depending on the profile of the application:
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 web users at worst: 10
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 for RDBMS databases - and use the calculations of the previous section with this limiting factor as the capping parameter instead of the threads.
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', '~> 10.0'
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 groupd of jobs (the batch). This extension allows jobs to define callbacks in their worker to track completion of the batch and take action based on that.
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 completess |
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
@@ -30,9 +30,7 @@ unless Rails.env.test?
30
30
  worker: 'OtherCronWorker',
31
31
  cron: '15 * * * *',
32
32
  queue: 'critical'
33
- args:
34
- - 'foo'
35
- - 'bar
33
+ args: ['foo', 'bar']
36
34
  }
37
35
  )
38
36
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- cloudtasker (0.2.0)
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.3)
77
- concurrent-ruby (1.1.5)
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.5)
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.0)
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.10.1)
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.10.0)
110
- faraday (~> 0.12)
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.25.0)
117
- google-protobuf (~> 3.8)
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.0)
123
- i18n (1.7.0)
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.3.1)
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.1)
144
+ memoist (0.16.2)
135
145
  method_source (0.9.2)
136
- mimemagic (0.3.3)
146
+ mimemagic (0.3.4)
137
147
  mini_mime (1.0.2)
138
148
  mini_portile2 (2.4.0)
139
- minitest (5.13.0)
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.5)
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.0)
147
- parser (2.6.5.0)
159
+ parallel (1.19.1)
160
+ parser (2.7.0.4)
148
161
  ast (~> 2.4.0)
149
- public_suffix (4.0.1)
162
+ public_suffix (4.0.3)
150
163
  raabro (1.1.6)
151
- rack (2.0.7)
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 (10.5.0)
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.0)
189
- rspec-support (~> 3.9.0)
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.0)
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.0)
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.36.0)
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
- signet (0.12.0)
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 (~> 0.9)
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.1)
229
- thor (0.20.3)
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.5)
249
+ tzinfo (1.2.6)
233
250
  thread_safe (~> 0.1)
234
- unicode-display_width (1.6.0)
235
- webmock (3.7.6)
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.2.1)
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 (~> 10.0)
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