rails-cloud-tasks 0.0.1 → 0.0.4

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: 2b46bc62d822e6eb44925df67eb91ce37e862c48b3c2e7a7543f9ae14a7e6caa
4
- data.tar.gz: 26455a3286ab916efca56b6947bf867a877976fa0215229927454b166fdf90bc
3
+ metadata.gz: 4ab8eda2821b2bba5e155d3444c4cdf5fca633dd468753f4d177354e6ec1207b
4
+ data.tar.gz: 71a5080bcc0693ea95b68b416246da57e671d7fb24d3bc46a95a895e96c521a5
5
5
  SHA512:
6
- metadata.gz: 3eef0b2920d83f6fea101e10eb1386cfab2300fc06f9c89f85ba3279496d7897d223c69227dd10d770ce42ec5f726443e7e785de6567cea353c0657f8400e4f8
7
- data.tar.gz: ca08441f14690818fa2203f73de2c22c6cd5ab98f25b264c67291cad76094d8a378bb69aa91246fba293cc08f3d609d13a0451a8b21ec4fd9366b1a9d781ff65
6
+ metadata.gz: f4ed01e0744ec482ad3d3015f92b35eee118601b1d95b7e7d5e3d030a1ff5f243224f35c527574aa8f3a6e8470fab3f2981fd39607e3f4456601501dfeb636b3
7
+ data.tar.gz: 33b16e211328e0123c85381640087b2d4e1cfca7c0a0fdab0e7777cd20fb3dc148892762eebbf4ec269751b2bf0edb6c1b1f7f2e978962e8ba0d92012e05205c
@@ -1,13 +1,60 @@
1
- name: Release CI
1
+ name: Tag & Release Package
2
2
 
3
3
  on:
4
4
  push:
5
- tags:
6
- - v*
5
+ branches:
6
+ - main
7
7
 
8
8
  jobs:
9
+ checks:
10
+ runs-on: ubuntu-latest
11
+ outputs:
12
+ pre_release: ${{ steps.versioning.outputs.pre_release }}
13
+ upgraded: ${{ steps.versioning.outputs.upgraded }}
14
+ package_version: ${{ steps.versioning.outputs.package_version }}
15
+ release_message: ${{ steps.versioning.outputs.release_message }}
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+
19
+ - name: Set up Ruby 2.7
20
+ uses: actions/setup-ruby@v1
21
+ with:
22
+ ruby-version: 2.7
23
+
24
+ - name: Install bundler
25
+ run: gem install bundler
26
+
27
+ - name: Cache dependencies
28
+ uses: actions/cache@v1
29
+ with:
30
+ path: vendor/bundle
31
+ key: ${{ runner.os }}-gem-${{ hashFiles('**/rails-cloud-tasks.gemspec') }}-2.7
32
+
33
+ - name: Install dependencies
34
+ run: |
35
+ bundle config set without 'development test'
36
+ bundle install
37
+
38
+ - name: Fetching Tags
39
+ run: git fetch -t
40
+
41
+ - name: Detect version upgrade
42
+ id: versioning
43
+ run: |
44
+ pkg='rails-cloud-tasks'
45
+ package_version=$(bundle info $pkg | grep -o "$pkg \(.*\)" | sed "s/$pkg (\(.*\))/\1/")
46
+ echo "::set-output name=package_version::"$package_version
47
+ upgraded=$(git tag --list | grep -q "${package_version}$" && echo "false" || echo "true")
48
+ echo "::set-output name=upgraded::"$upgraded
49
+ pre_release=$([[ $package_version =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && echo "false" || echo "true")
50
+ echo "::set-output name=pre_release::"$pre_release
51
+ release_message=$(git log HEAD ^$(git describe --tags `git rev-list --tags --max-count=1`) --pretty=format:'* %C(green)%h%C(reset) %s')
52
+ echo "::set-output name=release_message::"$release_message
53
+
9
54
  release:
10
55
  runs-on: ubuntu-latest
56
+ needs: checks
57
+ if: needs.checks.outputs.upgraded == 'true'
11
58
  steps:
12
59
  - uses: actions/checkout@v2
13
60
 
@@ -26,7 +73,21 @@ jobs:
26
73
  key: ${{ runner.os }}-gem-${{ hashFiles('**/rails-cloud-tasks.gemspec') }}-2.7
27
74
 
28
75
  - name: Install dependencies
29
- run: bundle install
76
+ run: |
77
+ bundle config set without 'development test'
78
+ bundle install
79
+
80
+ - name: Create Release
81
+ uses: actions/create-release@v1
82
+ env:
83
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
84
+ with:
85
+ tag_name: ${{ needs.checks.outputs.package_version }}
86
+ release_name: Release ${{ needs.checks.outputs.package_version }}
87
+ body: |
88
+ ${{ needs.checks.outputs.release_message }}
89
+ draft: false
90
+ prerelease: ${{ needs.checks.outputs.pre_release }}
30
91
 
31
92
  - name: Build package
32
93
  run: bundle exec gem build -o rails-cloud-tasks.gem
data/README.md CHANGED
@@ -36,8 +36,11 @@ gem 'rails-cloud-tasks'
36
36
  require 'rails-cloud-tasks'
37
37
 
38
38
  RailsCloudTasks.configure do |config|
39
+ config.service_account_email = 'test-account@test-project.iam.gserviceaccount.com'
39
40
  config.project_id = 'my-gcp-project' # This is not needed if running on GCE
40
41
  config.location_id = 'us-central1'
42
+ config.scheduler_file_path = './custom_path/scheduler_jobs.yml'
43
+ config.scheduler_prefix_name = 'my-app-name'
41
44
 
42
45
  # Base url used by Cloud Tasks to reach your application and run the tasks
43
46
  config.host = 'https://myapplication.host.com'
@@ -48,6 +51,27 @@ RailsCloudTasks.configure do |config|
48
51
  end
49
52
  ```
50
53
 
54
+ Check out the available configs and its usage description:
55
+
56
+ | attribute | description | env support | app engine fallback | default value |
57
+ |----------------------- |------------------------------------------------------------------------------------------------------------- |--------------------- |-------------------- |-------------------------- |
58
+ | service_account_email | The app service account email. It''s used to impersonate an user on schedule job | GCP_SERVICE_ACCOUNT | ✓ | |
59
+ | project_id | The Project ID | GCP_PROJECT | ✓ | |
60
+ | location_id | The region where you app is running (eg: us-central1, us-east1...) | GCP_LOCATION | ✓ | |
61
+ | host | The app endpoint which the app is running. *Do not use custom domain* Use the generated domain by Cloud Run | GCP_APP_ENDPOINT | | |
62
+ | scheduler_file_path | Path which the scheduler file is located | 𐄂 | | './config/scheduler.yml' |
63
+ | scheduler_prefix_name | The prefix to be set into scheduler job name | 𐄂 | | 'rails-cloud' |
64
+ | tasks_path | The path to run tasks | 𐄂 | | '/tasks' |
65
+
66
+
67
+ - Configure ActiveJob queue_adapter
68
+
69
+ ```ruby
70
+ # ./config/application.rb
71
+
72
+ config.active_job.queue_adapter = RailsCloudTasks.queue_adapter
73
+ ```
74
+
51
75
  - Add a Job class:
52
76
  ```ruby
53
77
  # ./app/jobs/application_job.rb
@@ -73,6 +97,40 @@ end
73
97
  ```ruby
74
98
  MyJob.perform_later(attrs)
75
99
  ```
100
+
101
+ ### Scheduled Jobs
102
+
103
+ We have support to Google Cloud Schedule. It's based on Cloud tasks, the jobs are scheduled with HTTP Target. We do not support Pub/Sub or App Engine HTTP for now.
104
+
105
+ Check out the follow sample of config file:
106
+ ```yaml
107
+ # config/scheduler.yml
108
+ - name: UsersSyncJob
109
+ schedule: 0 8 * * *
110
+ description: Sync user data
111
+ time_zone: "America/Los_Angeles"
112
+ class_name: Users::SyncJob
113
+ args:
114
+ - this_first: argument
115
+ is_a: hash
116
+ - - this second argument
117
+ - is an array
118
+ - this third argument is a string
119
+ ```
120
+
121
+ | attribute | description | required |
122
+ |------------- |---------------------------------------------------------------------------------- |---------- |
123
+ | name | Any descriptive name, following [Tasks naming restrictions][1] | ✓ |
124
+ | schedule | The frequency to run your job. It should be a unix-cron format | ✓ |
125
+ | description | What this job does | ✓ |
126
+ | time_zone | Choose which one timezone your job must run | ✓ |
127
+ | args | Arguments to the job execution. Important: if present, this must be an array of items. Check out the example above | 𐄂 |
128
+ | class_name | The Job class name (including namespace) | ✓ |
129
+
130
+ [1]: https://cloud.google.com/tasks/docs/reference/rpc/google.cloud.tasks.v2
131
+
132
+
133
+
76
134
  ## Tests
77
135
 
78
136
  To run tests:
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'rails-cloud-tasks'
2
+
3
+ path = File.expand_path(__dir__)
4
+ Dir.glob("#{path}/lib/tasks/*.rake").each { |f| load f }
@@ -1,13 +1,18 @@
1
+ require_relative './railtie'
2
+
1
3
  require 'active_support'
2
4
  require 'rails_cloud_tasks/rack/errors'
3
5
 
4
6
  module RailsCloudTasks
5
7
  extend ActiveSupport::Autoload
6
8
 
9
+ autoload :Scheduler
10
+ autoload :Credentials
7
11
  autoload :Adapter
8
12
  autoload :AppEngine
9
13
  autoload :Configuration
10
14
  autoload :Version
15
+ autoload :Instrumentation
11
16
 
12
17
  module Rack
13
18
  extend ActiveSupport::Autoload
@@ -25,4 +30,31 @@ module RailsCloudTasks
25
30
  def self.config
26
31
  @config ||= Configuration.new
27
32
  end
33
+
34
+ def self.logger
35
+ return @logger if @logger
36
+
37
+ @logger ||= (Rails.logger || Logger.new($stdout)).tap do |logger|
38
+ logger.formatter = proc do |severity, datetime, _progname, msg|
39
+ "[#{datetime}] #{severity} [rails-cloud-tasks]: #{msg}\n"
40
+ end
41
+ end
42
+ end
43
+
44
+ @queue_adapter = nil
45
+
46
+ def queue_adapter
47
+ @@queue_adapter
48
+ end
49
+
50
+ def self.queue_adapter
51
+ @queue_adapter ||= Adapter.new
52
+ rescue Errno::EHOSTDOWN => e
53
+ raise e unless Rails.env.development?
54
+
55
+ logger.warn('unable to setup adapter, falling back to :inline')
56
+ logger.warn(e)
57
+
58
+ :inline
59
+ end
28
60
  end
@@ -39,7 +39,7 @@ module RailsCloudTasks
39
39
  http_request: {
40
40
  http_method: :POST,
41
41
  url: url,
42
- body: { job: job.serialize }.to_json
42
+ body: { job: job.serialize }.to_json.force_encoding('ASCII-8BIT')
43
43
  }.merge(auth),
44
44
  schedule_time: timestamp && Google::Protobuf::Timestamp.new.tap do |ts|
45
45
  ts.seconds = timestamp
@@ -1,12 +1,22 @@
1
1
  module RailsCloudTasks
2
2
  class Configuration
3
- attr_accessor :project_id, :location_id, :host, :tasks_path, :jobs, :auth
3
+ attr_accessor :location_id, :host, :tasks_path, :service_account_email, :scheduler_file_path,
4
+ :scheduler_prefix_name
4
5
 
5
- def initialize
6
- @jobs = Set.new
7
- @project_id = AppEngine.project_id
6
+ attr_writer :project_id
7
+ attr_reader :app_engine, :google_auth
8
+
9
+ def initialize(app_engine = AppEngine, google_auth = Google::Auth)
10
+ @service_account_email = ENV['GCP_SERVICE_ACCOUNT']
11
+ @location_id = ENV['GCP_LOCATION']
12
+ @project_id = ENV['GCP_PROJECT']
13
+ @host = ENV['GCP_APP_ENDPOINT']
8
14
  @tasks_path = '/tasks'
9
- @auth = authenticate
15
+ @scheduler_file_path = './config/scheduler.yml'
16
+ @scheduler_prefix_name = 'rails-cloud'
17
+
18
+ @app_engine = app_engine
19
+ @google_auth = google_auth
10
20
  end
11
21
 
12
22
  def inject_routes
@@ -18,20 +28,26 @@ module RailsCloudTasks
18
28
  end
19
29
  end
20
30
 
31
+ def project_id
32
+ @project_id ||= app_engine.project_id
33
+ end
34
+
35
+ def auth
36
+ @auth ||= authenticate
37
+ end
38
+
21
39
  private
22
40
 
23
41
  def authenticate
24
- email = AppEngine.service_account_email || Google::Auth.get_application_default.issuer
42
+ email = service_account_email ||
43
+ app_engine.service_account_email ||
44
+ google_auth.get_application_default.issuer
25
45
 
26
46
  {
27
47
  oidc_token: {
28
48
  service_account_email: email
29
49
  }
30
50
  }
31
- rescue RuntimeError, Errno::EHOSTDOWN
32
- # EHOSTDOWN occurs sporadically when trying to resolve the metadata endpoint
33
- # locally. It is unlikely to occur when running on GCE.
34
- {}
35
51
  end
36
52
  end
37
53
  end
@@ -0,0 +1,38 @@
1
+ module RailsCloudTasks
2
+ class Credentials
3
+ require 'googleauth'
4
+ require 'google/apis/cloudscheduler_v1'
5
+ require 'google/apis/iamcredentials_v1'
6
+
7
+ DEFAULT_SCOPES = ['https://www.googleapis.com/auth/cloud-platform'].freeze
8
+ attr_reader :request_options, :iam_credential, :token_request, :auth
9
+
10
+ def initialize(
11
+ request_options: Google::Apis::RequestOptions.new,
12
+ iam_credential: Google::Apis::IamcredentialsV1::IAMCredentialsService.new,
13
+ token_request: Google::Apis::IamcredentialsV1::GenerateAccessTokenRequest,
14
+ auth: Google::Auth
15
+ )
16
+ @auth = auth
17
+ @request_options = request_options
18
+ @iam_credential = iam_credential
19
+ @token_request = token_request
20
+ end
21
+
22
+ def generate(impersonate_account = nil, scopes = [])
23
+ current_scopes = DEFAULT_SCOPES + scopes
24
+ authorization = auth.get_application_default(current_scopes).dup
25
+ request_options.authorization = authorization
26
+
27
+ if impersonate_account
28
+ iam_credential.generate_service_account_access_token(
29
+ "projects/-/serviceAccounts/#{impersonate_account}",
30
+ token_request.new(scope: current_scopes, lifetime: '3600s'),
31
+ options: request_options
32
+ )
33
+ end
34
+
35
+ request_options.authorization
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,19 @@
1
+ module RailsCloudTasks
2
+ module Instrumentation
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :Default
6
+ autoload :Factory
7
+ autoload :NewRelic
8
+
9
+ module_function
10
+
11
+ def agent
12
+ @agent ||= RailsCloudTasks::Instrumentation::Factory.agent_class.new
13
+ end
14
+
15
+ def transaction_name!(*opts)
16
+ agent.transaction_name!(opts)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ module RailsCloudTasks
2
+ module Instrumentation
3
+ class Default
4
+ def transaction_name!(*opts); end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ module RailsCloudTasks
2
+ module Instrumentation
3
+ class Factory
4
+ def self.agent_class
5
+ return NewRelic if defined?(::NewRelic)
6
+
7
+ Default
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module RailsCloudTasks
2
+ module Instrumentation
3
+ class NewRelic
4
+ def transaction_name!(opts)
5
+ agent.set_transaction_name(*opts)
6
+ end
7
+
8
+ def agent
9
+ @agent ||= ::NewRelic::Agent
10
+ end
11
+ end
12
+ end
13
+ end
@@ -8,11 +8,16 @@ module RailsCloudTasks
8
8
  def call(env)
9
9
  job_class = extract_job_class(env)
10
10
 
11
+ RailsCloudTasks::Instrumentation.transaction_name!(
12
+ "RailsCloudTasks/#{job_class}/perform_now"
13
+ )
14
+
11
15
  request = ::Rack::Request.new(env)
12
16
  job_args = extract_args(request)
13
- job_class.perform_now(job_args)
14
17
 
15
- response(200, { error: nil })
18
+ job_class.perform_now(*job_args)
19
+
20
+ response(200, {})
16
21
  rescue Rack::InvalidPayloadError => e
17
22
  response(422, { error: e.message })
18
23
  rescue StandardError => e
@@ -28,7 +33,7 @@ module RailsCloudTasks
28
33
 
29
34
  def extract_args(request)
30
35
  body = request.body.read
31
- JSON.parse(body)
36
+ JSON.parse(body) || []
32
37
  rescue JSON::ParserError, KeyError
33
38
  raise Rack::InvalidPayloadError
34
39
  end
@@ -9,9 +9,12 @@ module RailsCloudTasks
9
9
  request = ::Rack::Request.new(env)
10
10
  job = extract_job(request)
11
11
 
12
- ActiveJob::Base.execute(job)
12
+ RailsCloudTasks::Instrumentation.transaction_name!(
13
+ "RailsCloudTasks/#{job['job_class']}/perform_now"
14
+ )
13
15
 
14
- response(200, { error: nil })
16
+ ActiveJob::Base.execute(job)
17
+ response(200, {})
15
18
  rescue Rack::InvalidPayloadError => e
16
19
  response(400, { error: e.cause.message })
17
20
  rescue StandardError => e
@@ -0,0 +1,95 @@
1
+ module RailsCloudTasks
2
+ class Scheduler
3
+ delegate :project_id, :location_id, :host, :auth, :tasks_path,
4
+ :scheduler_file_path, :scheduler_prefix_name,
5
+ :service_account_email, to: 'RailsCloudTasks.config'
6
+
7
+ attr_reader :client, :credentials, :logger
8
+
9
+ def initialize(
10
+ client: Google::Cloud::Scheduler.cloud_scheduler,
11
+ credentials: RailsCloudTasks::Credentials.new,
12
+ logger: RailsCloudTasks.logger
13
+ )
14
+ client.configure do |config|
15
+ config.credentials = credentials.generate(service_account_email)
16
+ end
17
+ @client = client
18
+ @logger = logger
19
+ end
20
+
21
+ # Create & Update scheduler job on Google Cloud
22
+ # TODO: Support to delete scheduled jobs
23
+ def upsert
24
+ result = { success: [], failure: [] }
25
+ scheduler_jobs.each do |job|
26
+ upsert_job(job) ? (result[:success] << job[:name]) : (result[:failure] << job[:name])
27
+ end
28
+ log_output(result)
29
+ end
30
+
31
+ protected
32
+
33
+ def location_path
34
+ @location_path ||= client.location_path project: project_id, location: location_id
35
+ end
36
+
37
+ def scheduler_jobs
38
+ parse_jobs_from_file.map(&method(:build_job))
39
+ end
40
+
41
+ def build_job(job)
42
+ {
43
+ name: "#{location_path}/jobs/#{scheduler_prefix_name}--#{job[:name]}",
44
+ schedule: job[:schedule],
45
+ description: job[:description],
46
+ time_zone: job[:time_zone],
47
+ http_target: {
48
+ uri: "#{host}#{tasks_path}/#{job[:class_name]}",
49
+ http_method: 'POST',
50
+ body: job[:args].to_json
51
+ }.merge(auth)
52
+ }
53
+ end
54
+
55
+ def parse_jobs_from_file
56
+ settings = File.read(File.expand_path(scheduler_file_path))
57
+ YAML.safe_load(ERB.new(settings).result).map(&:deep_symbolize_keys)
58
+ rescue Errno::ENOENT
59
+ []
60
+ end
61
+
62
+ def log_output(result)
63
+ parse_task_name = ->(task) { task.split("#{scheduler_prefix_name}--")[1] }
64
+ success = result[:success].map(&parse_task_name)
65
+ failure = result[:failure].map(&parse_task_name)
66
+
67
+ if success.count.positive?
68
+ log("Successfuly scheduled #{success.count} tasks", '- [✓] ',
69
+ success)
70
+ end
71
+
72
+ log("Failed to schedule #{failure.count} tasks", '- [𐄂] ', failure) if failure.count.positive?
73
+ end
74
+
75
+ def log(desc, prefix, tasks)
76
+ logger.info(desc)
77
+ logger.info(prefix + tasks.join("\n #{prefix}"))
78
+ end
79
+
80
+ private
81
+
82
+ def upsert_job(job)
83
+ success = true
84
+ begin
85
+ client.create_job parent: location_path, job: job
86
+ rescue Google::Cloud::AlreadyExistsError
87
+ client.update_job job: job
88
+ rescue StandardError => e
89
+ logger.error(e)
90
+ success = false
91
+ end
92
+ success
93
+ end
94
+ end
95
+ end
@@ -1,3 +1,3 @@
1
1
  module RailsCloudTasks
2
- VERSION = '0.0.1'.freeze
2
+ VERSION = '0.0.4'.freeze
3
3
  end
data/lib/railtie.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'rails-cloud-tasks'
2
+ require 'rails'
3
+
4
+ module RailsCloudTasks
5
+ class Railtie < Rails::Railtie
6
+ railtie_name :rails_cloud_tasks
7
+
8
+ rake_tasks do
9
+ namespace :rails_cloud_tasks do
10
+ path = File.expand_path(__dir__)
11
+ Dir.glob("#{path}/tasks/**/*.rake").each { |f| load f }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ namespace :scheduler do
2
+ desc 'Sync all scheduled jobs to Google Cloud'
3
+ task sync: :environment do
4
+ RailsCloudTasks::Scheduler.new.upsert
5
+ end
6
+ end
@@ -23,8 +23,11 @@ Gem::Specification.new do |spec|
23
23
  end
24
24
 
25
25
  spec.add_dependency 'activesupport', '>= 4'
26
+ spec.add_dependency 'google-apis-cloudscheduler_v1'
27
+ spec.add_dependency 'google-apis-iamcredentials_v1'
28
+ spec.add_dependency 'google-cloud-scheduler', '>= 2'
26
29
  spec.add_dependency 'google-cloud-tasks', '>= 2'
27
- spec.add_development_dependency 'rails', '>= 4'
30
+ spec.add_dependency 'rails', '>= 4'
28
31
 
29
32
  spec.add_development_dependency 'bundler'
30
33
  spec.add_development_dependency 'pry'
data/renovate.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": [
3
+ "config:base"
4
+ ]
5
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-cloud-tasks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guilherme Araújo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-29 00:00:00.000000000 Z
11
+ date: 2021-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,6 +24,48 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: google-apis-cloudscheduler_v1
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: google-apis-iamcredentials_v1
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: google-cloud-scheduler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '2'
27
69
  - !ruby/object:Gem::Dependency
28
70
  name: google-cloud-tasks
29
71
  requirement: !ruby/object:Gem::Requirement
@@ -45,7 +87,7 @@ dependencies:
45
87
  - - ">="
46
88
  - !ruby/object:Gem::Version
47
89
  version: '4'
48
- type: :development
90
+ type: :runtime
49
91
  prerelease: false
50
92
  version_requirements: !ruby/object:Gem::Requirement
51
93
  requirements:
@@ -236,15 +278,25 @@ files:
236
278
  - Gemfile
237
279
  - LICENSE
238
280
  - README.md
281
+ - Rakefile
239
282
  - lib/rails-cloud-tasks.rb
240
283
  - lib/rails_cloud_tasks/adapter.rb
241
284
  - lib/rails_cloud_tasks/app_engine.rb
242
285
  - lib/rails_cloud_tasks/configuration.rb
286
+ - lib/rails_cloud_tasks/credentials.rb
287
+ - lib/rails_cloud_tasks/instrumentation.rb
288
+ - lib/rails_cloud_tasks/instrumentation/default.rb
289
+ - lib/rails_cloud_tasks/instrumentation/factory.rb
290
+ - lib/rails_cloud_tasks/instrumentation/new_relic.rb
243
291
  - lib/rails_cloud_tasks/rack/errors.rb
244
292
  - lib/rails_cloud_tasks/rack/jobs.rb
245
293
  - lib/rails_cloud_tasks/rack/tasks.rb
294
+ - lib/rails_cloud_tasks/scheduler.rb
246
295
  - lib/rails_cloud_tasks/version.rb
296
+ - lib/railtie.rb
297
+ - lib/tasks/scheduler.rake
247
298
  - rails-cloud-tasks.gemspec
299
+ - renovate.json
248
300
  homepage: http://github.com/flamingo-run/rails-cloud-tasks
249
301
  licenses:
250
302
  - Apache License 2.0