rails-cloud-tasks 0.0.1 → 0.0.4

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 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