activejob 6.0.6.1 → 6.1.7.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +108 -140
- data/MIT-LICENSE +1 -2
- data/README.md +1 -3
- data/lib/active_job/base.rb +3 -0
- data/lib/active_job/callbacks.rb +44 -4
- data/lib/active_job/core.rb +2 -2
- data/lib/active_job/enqueuing.rb +3 -13
- data/lib/active_job/exceptions.rb +29 -20
- data/lib/active_job/execution.rb +9 -1
- data/lib/active_job/gem_version.rb +3 -3
- data/lib/active_job/instrumentation.rb +40 -0
- data/lib/active_job/log_subscriber.rb +140 -0
- data/lib/active_job/logging.rb +3 -132
- data/lib/active_job/queue_adapter.rb +4 -1
- data/lib/active_job/queue_adapters/sucker_punch_adapter.rb +1 -1
- data/lib/active_job/queue_adapters/test_adapter.rb +6 -2
- data/lib/active_job/queue_adapters.rb +5 -1
- data/lib/active_job/queue_name.rb +2 -2
- data/lib/active_job/railtie.rb +4 -0
- data/lib/active_job/serializers/date_time_serializer.rb +1 -5
- data/lib/active_job/serializers/module_serializer.rb +20 -0
- data/lib/active_job/serializers/object_serializer.rb +1 -1
- data/lib/active_job/serializers/time_object_serializer.rb +13 -0
- data/lib/active_job/serializers/time_serializer.rb +1 -5
- data/lib/active_job/serializers/time_with_zone_serializer.rb +1 -5
- data/lib/active_job/serializers.rb +4 -1
- data/lib/active_job/test_helper.rb +82 -80
- data/lib/active_job.rb +1 -1
- metadata +12 -8
@@ -9,12 +9,14 @@ module ActiveJob
|
|
9
9
|
extend ActiveSupport::Autoload
|
10
10
|
|
11
11
|
autoload :ObjectSerializer
|
12
|
+
autoload :TimeObjectSerializer
|
12
13
|
autoload :SymbolSerializer
|
13
14
|
autoload :DurationSerializer
|
14
15
|
autoload :DateTimeSerializer
|
15
16
|
autoload :DateSerializer
|
16
17
|
autoload :TimeWithZoneSerializer
|
17
18
|
autoload :TimeSerializer
|
19
|
+
autoload :ModuleSerializer
|
18
20
|
|
19
21
|
mattr_accessor :_additional_serializers
|
20
22
|
self._additional_serializers = Set.new
|
@@ -58,6 +60,7 @@ module ActiveJob
|
|
58
60
|
DateTimeSerializer,
|
59
61
|
DateSerializer,
|
60
62
|
TimeWithZoneSerializer,
|
61
|
-
TimeSerializer
|
63
|
+
TimeSerializer,
|
64
|
+
ModuleSerializer
|
62
65
|
end
|
63
66
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "active_support/core_ext/class/subclasses"
|
4
|
+
require "active_support/testing/assertions"
|
4
5
|
|
5
6
|
module ActiveJob
|
6
7
|
# Provides helper methods for testing Active Job
|
@@ -9,6 +10,8 @@ module ActiveJob
|
|
9
10
|
:performed_jobs, :performed_jobs=,
|
10
11
|
to: :queue_adapter
|
11
12
|
|
13
|
+
include ActiveSupport::Testing::Assertions
|
14
|
+
|
12
15
|
module TestQueueAdapter
|
13
16
|
extend ActiveSupport::Concern
|
14
17
|
|
@@ -117,17 +120,17 @@ module ActiveJob
|
|
117
120
|
# HelloJob.perform_later('elfassy')
|
118
121
|
# end
|
119
122
|
# end
|
120
|
-
def assert_enqueued_jobs(number, only: nil, except: nil, queue: nil)
|
123
|
+
def assert_enqueued_jobs(number, only: nil, except: nil, queue: nil, &block)
|
121
124
|
if block_given?
|
122
|
-
|
125
|
+
original_jobs = enqueued_jobs_with(only: only, except: except, queue: queue)
|
123
126
|
|
124
|
-
|
127
|
+
assert_nothing_raised(&block)
|
125
128
|
|
126
|
-
|
129
|
+
new_jobs = enqueued_jobs_with(only: only, except: except, queue: queue)
|
127
130
|
|
128
|
-
actual_count =
|
131
|
+
actual_count = (new_jobs - original_jobs).count
|
129
132
|
else
|
130
|
-
actual_count = enqueued_jobs_with(only: only, except: except, queue: queue)
|
133
|
+
actual_count = enqueued_jobs_with(only: only, except: except, queue: queue).count
|
131
134
|
end
|
132
135
|
|
133
136
|
assert_equal number, actual_count, "#{number} jobs expected, but #{actual_count} were enqueued"
|
@@ -279,7 +282,7 @@ module ActiveJob
|
|
279
282
|
|
280
283
|
performed_jobs_size = new_count - original_count
|
281
284
|
else
|
282
|
-
performed_jobs_size = performed_jobs_with(only: only, except: except, queue: queue)
|
285
|
+
performed_jobs_size = performed_jobs_with(only: only, except: except, queue: queue).count
|
283
286
|
end
|
284
287
|
|
285
288
|
assert_equal number, performed_jobs_size, "#{number} jobs expected, but #{performed_jobs_size} were performed"
|
@@ -345,44 +348,40 @@ module ActiveJob
|
|
345
348
|
#
|
346
349
|
# def test_assert_enqueued_with
|
347
350
|
# MyJob.perform_later(1,2,3)
|
348
|
-
# assert_enqueued_with(job: MyJob, args: [1,2,3]
|
351
|
+
# assert_enqueued_with(job: MyJob, args: [1,2,3])
|
349
352
|
#
|
350
|
-
# MyJob.set(wait_until: Date.tomorrow.noon).perform_later
|
351
|
-
# assert_enqueued_with(
|
353
|
+
# MyJob.set(wait_until: Date.tomorrow.noon, queue: "my_queue").perform_later
|
354
|
+
# assert_enqueued_with(at: Date.tomorrow.noon, queue: "my_queue")
|
352
355
|
# end
|
353
356
|
#
|
354
|
-
# The
|
357
|
+
# The given arguments may also be specified as matcher procs that return a
|
358
|
+
# boolean value indicating whether a job's attribute meets certain criteria.
|
355
359
|
#
|
356
|
-
#
|
360
|
+
# For example, a proc can be used to match a range of times:
|
357
361
|
#
|
358
362
|
# def test_assert_enqueued_with
|
359
|
-
#
|
360
|
-
#
|
361
|
-
#
|
363
|
+
# at_matcher = ->(job_at) { (Date.yesterday..Date.tomorrow).cover?(job_at) }
|
364
|
+
#
|
365
|
+
# MyJob.set(wait_until: Date.today.noon).perform_later
|
362
366
|
#
|
363
|
-
# MyJob
|
364
|
-
# assert_enqueued_with(job: MyJob, at: expected_time)
|
367
|
+
# assert_enqueued_with(job: MyJob, at: at_matcher)
|
365
368
|
# end
|
366
369
|
#
|
367
|
-
#
|
368
|
-
# Your proc needs to return a boolean value determining if
|
369
|
-
# the job's arguments matches your expectation. This is useful to check only
|
370
|
-
# for a subset of arguments.
|
370
|
+
# A proc can also be used to match a subset of a job's args:
|
371
371
|
#
|
372
372
|
# def test_assert_enqueued_with
|
373
|
-
#
|
374
|
-
#
|
375
|
-
#
|
373
|
+
# args_matcher = ->(job_args) { job_args[0].key?(:foo) }
|
374
|
+
#
|
375
|
+
# MyJob.perform_later(foo: "bar", other_arg: "No need to check in the test")
|
376
376
|
#
|
377
|
-
#
|
378
|
-
# assert_enqueued_with(job: MyJob, args: expected_args, queue: 'low')
|
377
|
+
# assert_enqueued_with(job: MyJob, args: args_matcher)
|
379
378
|
# end
|
380
379
|
#
|
381
380
|
# If a block is passed, asserts that the block will cause the job to be
|
382
381
|
# enqueued with the given arguments.
|
383
382
|
#
|
384
383
|
# def test_assert_enqueued_with
|
385
|
-
# assert_enqueued_with(job: MyJob, args: [1,2,3]
|
384
|
+
# assert_enqueued_with(job: MyJob, args: [1,2,3]) do
|
386
385
|
# MyJob.perform_later(1,2,3)
|
387
386
|
# end
|
388
387
|
#
|
@@ -390,22 +389,24 @@ module ActiveJob
|
|
390
389
|
# MyJob.set(wait_until: Date.tomorrow.noon).perform_later
|
391
390
|
# end
|
392
391
|
# end
|
393
|
-
def assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil)
|
392
|
+
def assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, &block)
|
394
393
|
expected = { job: job, args: args, at: at, queue: queue }.compact
|
395
394
|
expected_args = prepare_args_for_assertion(expected)
|
395
|
+
potential_matches = []
|
396
396
|
|
397
397
|
if block_given?
|
398
|
-
|
398
|
+
original_enqueued_jobs = enqueued_jobs.dup
|
399
399
|
|
400
|
-
|
400
|
+
assert_nothing_raised(&block)
|
401
401
|
|
402
|
-
jobs = enqueued_jobs
|
402
|
+
jobs = enqueued_jobs - original_enqueued_jobs
|
403
403
|
else
|
404
404
|
jobs = enqueued_jobs
|
405
405
|
end
|
406
406
|
|
407
407
|
matching_job = jobs.find do |enqueued_job|
|
408
408
|
deserialized_job = deserialize_args_for_assertion(enqueued_job)
|
409
|
+
potential_matches << deserialized_job
|
409
410
|
|
410
411
|
expected_args.all? do |key, value|
|
411
412
|
if value.respond_to?(:call)
|
@@ -416,7 +417,9 @@ module ActiveJob
|
|
416
417
|
end
|
417
418
|
end
|
418
419
|
|
419
|
-
|
420
|
+
message = +"No enqueued job found with #{expected}"
|
421
|
+
message << "\n\nPotential matches: #{potential_matches.join("\n")}" if potential_matches.present?
|
422
|
+
assert matching_job, message
|
420
423
|
instantiate_job(matching_job)
|
421
424
|
end
|
422
425
|
|
@@ -427,42 +430,40 @@ module ActiveJob
|
|
427
430
|
#
|
428
431
|
# perform_enqueued_jobs
|
429
432
|
#
|
430
|
-
# assert_performed_with(job: MyJob, args: [1,2,3]
|
433
|
+
# assert_performed_with(job: MyJob, args: [1,2,3])
|
431
434
|
#
|
432
|
-
# MyJob.set(wait_until: Date.tomorrow.noon).perform_later
|
435
|
+
# MyJob.set(wait_until: Date.tomorrow.noon, queue: "my_queue").perform_later
|
433
436
|
#
|
434
437
|
# perform_enqueued_jobs
|
435
438
|
#
|
436
|
-
# assert_performed_with(
|
439
|
+
# assert_performed_with(at: Date.tomorrow.noon, queue: "my_queue")
|
437
440
|
# end
|
438
441
|
#
|
439
|
-
# The
|
442
|
+
# The given arguments may also be specified as matcher procs that return a
|
443
|
+
# boolean value indicating whether a job's attribute meets certain criteria.
|
440
444
|
#
|
441
|
-
#
|
445
|
+
# For example, a proc can be used to match a range of times:
|
442
446
|
#
|
443
|
-
# def
|
444
|
-
#
|
445
|
-
#
|
446
|
-
#
|
447
|
+
# def test_assert_performed_with
|
448
|
+
# at_matcher = ->(job_at) { (Date.yesterday..Date.tomorrow).cover?(job_at) }
|
449
|
+
#
|
450
|
+
# MyJob.set(wait_until: Date.today.noon).perform_later
|
451
|
+
#
|
452
|
+
# perform_enqueued_jobs
|
447
453
|
#
|
448
|
-
# MyJob
|
449
|
-
# assert_enqueued_with(job: MyJob, at: expected_time)
|
454
|
+
# assert_performed_with(job: MyJob, at: at_matcher)
|
450
455
|
# end
|
451
456
|
#
|
452
|
-
#
|
453
|
-
# Your proc needs to return a boolean value determining if
|
454
|
-
# the job's arguments matches your expectation. This is useful to check only
|
455
|
-
# for a subset of arguments.
|
457
|
+
# A proc can also be used to match a subset of a job's args:
|
456
458
|
#
|
457
459
|
# def test_assert_performed_with
|
458
|
-
#
|
459
|
-
#
|
460
|
-
#
|
461
|
-
# MyJob.perform_later(foo: 'bar', other_arg: 'No need to check in the test')
|
460
|
+
# args_matcher = ->(job_args) { job_args[0].key?(:foo) }
|
461
|
+
#
|
462
|
+
# MyJob.perform_later(foo: "bar", other_arg: "No need to check in the test")
|
462
463
|
#
|
463
464
|
# perform_enqueued_jobs
|
464
465
|
#
|
465
|
-
# assert_performed_with(job: MyJob, args:
|
466
|
+
# assert_performed_with(job: MyJob, args: args_matcher)
|
466
467
|
# end
|
467
468
|
#
|
468
469
|
# If a block is passed, that block performs all of the jobs that were
|
@@ -470,7 +471,7 @@ module ActiveJob
|
|
470
471
|
# the job has been performed with the given arguments in the block.
|
471
472
|
#
|
472
473
|
# def test_assert_performed_with
|
473
|
-
# assert_performed_with(job: MyJob, args: [1,2,3]
|
474
|
+
# assert_performed_with(job: MyJob, args: [1,2,3]) do
|
474
475
|
# MyJob.perform_later(1,2,3)
|
475
476
|
# end
|
476
477
|
#
|
@@ -481,6 +482,7 @@ module ActiveJob
|
|
481
482
|
def assert_performed_with(job: nil, args: nil, at: nil, queue: nil, &block)
|
482
483
|
expected = { job: job, args: args, at: at, queue: queue }.compact
|
483
484
|
expected_args = prepare_args_for_assertion(expected)
|
485
|
+
potential_matches = []
|
484
486
|
|
485
487
|
if block_given?
|
486
488
|
original_performed_jobs_count = performed_jobs.count
|
@@ -494,6 +496,7 @@ module ActiveJob
|
|
494
496
|
|
495
497
|
matching_job = jobs.find do |enqueued_job|
|
496
498
|
deserialized_job = deserialize_args_for_assertion(enqueued_job)
|
499
|
+
potential_matches << deserialized_job
|
497
500
|
|
498
501
|
expected_args.all? do |key, value|
|
499
502
|
if value.respond_to?(:call)
|
@@ -504,7 +507,10 @@ module ActiveJob
|
|
504
507
|
end
|
505
508
|
end
|
506
509
|
|
507
|
-
|
510
|
+
message = +"No performed job found with #{expected}"
|
511
|
+
message << "\n\nPotential matches: #{potential_matches.join("\n")}" if potential_matches.present?
|
512
|
+
assert matching_job, message
|
513
|
+
|
508
514
|
instantiate_job(matching_job)
|
509
515
|
end
|
510
516
|
|
@@ -563,8 +569,10 @@ module ActiveJob
|
|
563
569
|
# assert_performed_jobs 1
|
564
570
|
# end
|
565
571
|
#
|
566
|
-
|
567
|
-
|
572
|
+
# If the +:at+ option is specified, then only run jobs enqueued to run
|
573
|
+
# immediately or before the given time
|
574
|
+
def perform_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil, &block)
|
575
|
+
return flush_enqueued_jobs(only: only, except: except, queue: queue, at: at) unless block_given?
|
568
576
|
|
569
577
|
validate_option(only: only, except: except)
|
570
578
|
|
@@ -573,6 +581,7 @@ module ActiveJob
|
|
573
581
|
old_filter = queue_adapter.filter
|
574
582
|
old_reject = queue_adapter.reject
|
575
583
|
old_queue = queue_adapter.queue
|
584
|
+
old_at = queue_adapter.at
|
576
585
|
|
577
586
|
begin
|
578
587
|
queue_adapter.perform_enqueued_jobs = true
|
@@ -580,14 +589,16 @@ module ActiveJob
|
|
580
589
|
queue_adapter.filter = only
|
581
590
|
queue_adapter.reject = except
|
582
591
|
queue_adapter.queue = queue
|
592
|
+
queue_adapter.at = at
|
583
593
|
|
584
|
-
|
594
|
+
assert_nothing_raised(&block)
|
585
595
|
ensure
|
586
596
|
queue_adapter.perform_enqueued_jobs = old_perform_enqueued_jobs
|
587
597
|
queue_adapter.perform_enqueued_at_jobs = old_perform_enqueued_at_jobs
|
588
598
|
queue_adapter.filter = old_filter
|
589
599
|
queue_adapter.reject = old_reject
|
590
600
|
queue_adapter.queue = old_queue
|
601
|
+
queue_adapter.at = old_at
|
591
602
|
end
|
592
603
|
end
|
593
604
|
|
@@ -609,10 +620,10 @@ module ActiveJob
|
|
609
620
|
performed_jobs.clear
|
610
621
|
end
|
611
622
|
|
612
|
-
def jobs_with(jobs, only: nil, except: nil, queue: nil)
|
623
|
+
def jobs_with(jobs, only: nil, except: nil, queue: nil, at: nil)
|
613
624
|
validate_option(only: only, except: except)
|
614
625
|
|
615
|
-
jobs.
|
626
|
+
jobs.dup.select do |job|
|
616
627
|
job_class = job.fetch(:job)
|
617
628
|
|
618
629
|
if only
|
@@ -625,6 +636,10 @@ module ActiveJob
|
|
625
636
|
next false unless queue.to_s == job.fetch(:queue, job_class.queue_name)
|
626
637
|
end
|
627
638
|
|
639
|
+
if at && job[:at]
|
640
|
+
next false if job[:at] > at.to_f
|
641
|
+
end
|
642
|
+
|
628
643
|
yield job if block_given?
|
629
644
|
|
630
645
|
true
|
@@ -637,41 +652,28 @@ module ActiveJob
|
|
637
652
|
->(job) { Array(filter).include?(job.fetch(:job)) }
|
638
653
|
end
|
639
654
|
|
640
|
-
def enqueued_jobs_with(only: nil, except: nil, queue: nil, &block)
|
641
|
-
jobs_with(enqueued_jobs, only: only, except: except, queue: queue, &block)
|
655
|
+
def enqueued_jobs_with(only: nil, except: nil, queue: nil, at: nil, &block)
|
656
|
+
jobs_with(enqueued_jobs, only: only, except: except, queue: queue, at: at, &block)
|
642
657
|
end
|
643
658
|
|
644
659
|
def performed_jobs_with(only: nil, except: nil, queue: nil, &block)
|
645
660
|
jobs_with(performed_jobs, only: only, except: except, queue: queue, &block)
|
646
661
|
end
|
647
662
|
|
648
|
-
def flush_enqueued_jobs(only: nil, except: nil, queue: nil)
|
649
|
-
enqueued_jobs_with(only: only, except: except, queue: queue) do |payload|
|
650
|
-
|
663
|
+
def flush_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil)
|
664
|
+
enqueued_jobs_with(only: only, except: except, queue: queue, at: at) do |payload|
|
665
|
+
queue_adapter.enqueued_jobs.delete(payload)
|
651
666
|
queue_adapter.performed_jobs << payload
|
652
|
-
|
667
|
+
instantiate_job(payload).perform_now
|
668
|
+
end.count
|
653
669
|
end
|
654
670
|
|
655
671
|
def prepare_args_for_assertion(args)
|
656
672
|
args.dup.tap do |arguments|
|
657
|
-
if arguments[:at]
|
673
|
+
if arguments[:at].acts_like?(:time)
|
658
674
|
at_range = arguments[:at] - 1..arguments[:at] + 1
|
659
675
|
arguments[:at] = ->(at) { at_range.cover?(at) }
|
660
676
|
end
|
661
|
-
arguments[:args] = round_time_arguments(arguments[:args]) if arguments[:args]
|
662
|
-
end
|
663
|
-
end
|
664
|
-
|
665
|
-
def round_time_arguments(argument)
|
666
|
-
case argument
|
667
|
-
when Time, ActiveSupport::TimeWithZone, DateTime
|
668
|
-
argument.change(usec: 0)
|
669
|
-
when Hash
|
670
|
-
argument.transform_values { |value| round_time_arguments(value) }
|
671
|
-
when Array
|
672
|
-
argument.map { |element| round_time_arguments(element) }
|
673
|
-
else
|
674
|
-
argument
|
675
677
|
end
|
676
678
|
end
|
677
679
|
|
data/lib/active_job.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright (c) 2014-
|
4
|
+
# Copyright (c) 2014-2022 David Heinemeier Hansson
|
5
5
|
#
|
6
6
|
# Permission is hereby granted, free of charge, to any person obtaining
|
7
7
|
# a copy of this software and associated documentation files (the
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activejob
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.1.7.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 6.
|
19
|
+
version: 6.1.7.6
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 6.
|
26
|
+
version: 6.1.7.6
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: globalid
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -57,6 +57,8 @@ files:
|
|
57
57
|
- lib/active_job/exceptions.rb
|
58
58
|
- lib/active_job/execution.rb
|
59
59
|
- lib/active_job/gem_version.rb
|
60
|
+
- lib/active_job/instrumentation.rb
|
61
|
+
- lib/active_job/log_subscriber.rb
|
60
62
|
- lib/active_job/logging.rb
|
61
63
|
- lib/active_job/queue_adapter.rb
|
62
64
|
- lib/active_job/queue_adapters.rb
|
@@ -78,8 +80,10 @@ files:
|
|
78
80
|
- lib/active_job/serializers/date_serializer.rb
|
79
81
|
- lib/active_job/serializers/date_time_serializer.rb
|
80
82
|
- lib/active_job/serializers/duration_serializer.rb
|
83
|
+
- lib/active_job/serializers/module_serializer.rb
|
81
84
|
- lib/active_job/serializers/object_serializer.rb
|
82
85
|
- lib/active_job/serializers/symbol_serializer.rb
|
86
|
+
- lib/active_job/serializers/time_object_serializer.rb
|
83
87
|
- lib/active_job/serializers/time_serializer.rb
|
84
88
|
- lib/active_job/serializers/time_with_zone_serializer.rb
|
85
89
|
- lib/active_job/test_case.rb
|
@@ -95,10 +99,10 @@ licenses:
|
|
95
99
|
- MIT
|
96
100
|
metadata:
|
97
101
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
98
|
-
changelog_uri: https://github.com/rails/rails/blob/v6.
|
99
|
-
documentation_uri: https://api.rubyonrails.org/v6.
|
102
|
+
changelog_uri: https://github.com/rails/rails/blob/v6.1.7.6/activejob/CHANGELOG.md
|
103
|
+
documentation_uri: https://api.rubyonrails.org/v6.1.7.6/
|
100
104
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
101
|
-
source_code_uri: https://github.com/rails/rails/tree/v6.
|
105
|
+
source_code_uri: https://github.com/rails/rails/tree/v6.1.7.6/activejob
|
102
106
|
rubygems_mfa_required: 'true'
|
103
107
|
post_install_message:
|
104
108
|
rdoc_options: []
|
@@ -115,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
119
|
- !ruby/object:Gem::Version
|
116
120
|
version: '0'
|
117
121
|
requirements: []
|
118
|
-
rubygems_version: 3.
|
122
|
+
rubygems_version: 3.3.3
|
119
123
|
signing_key:
|
120
124
|
specification_version: 4
|
121
125
|
summary: Job framework with pluggable queues.
|