kuroko2-updater 0.1.2
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 +7 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.rubocop.yml +2 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +88 -0
- data/README.md +88 -0
- data/Rakefile +8 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/kuroko2-updater +9 -0
- data/kuroko2-updater.gemspec +32 -0
- data/lib/kuroko2/updater.rb +137 -0
- data/lib/kuroko2/updater/client/definition.rb +70 -0
- data/lib/kuroko2/updater/version.rb +5 -0
- data/lib/kuroko2/updater/whenever.rb +37 -0
- metadata +199 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cd5411880d8d46b6f01127b10f15c1b7949e4eb4f024d5481cab786c03912d66
|
4
|
+
data.tar.gz: 1689cfe567e18c01524d5b13096a36f26b702d83a1c7cd62b1ac843ab5c046b3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dc67e62689aad9f7c2f6f5d35eca57cb02040967dce1c6e730a6bed5b82db3c123a2cb7d1794024e7b092ffd806744aca8f6e29eaf2e0f772347f4a2a98c3a25
|
7
|
+
data.tar.gz: 4f4508b81ed8637dea3dfc6e37e9662f31840fb3d86fd0a6de2d6a7fa0212664b009b622c5414bfcadf9e0536741d0412b2586e45856abce73cfa36e2ff222c5
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
kuroko2-updater (0.1.2)
|
5
|
+
activesupport
|
6
|
+
faraday (>= 0.15)
|
7
|
+
faraday_middleware (>= 0.13)
|
8
|
+
whenever (~> 0.11)
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
activesupport (6.0.2.2)
|
14
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
15
|
+
i18n (>= 0.7, < 2)
|
16
|
+
minitest (~> 5.1)
|
17
|
+
tzinfo (~> 1.1)
|
18
|
+
zeitwerk (~> 2.2)
|
19
|
+
ast (2.4.0)
|
20
|
+
chronic (0.10.2)
|
21
|
+
concurrent-ruby (1.1.6)
|
22
|
+
diff-lcs (1.3)
|
23
|
+
faraday (1.0.1)
|
24
|
+
multipart-post (>= 1.2, < 3)
|
25
|
+
faraday_middleware (1.0.0)
|
26
|
+
faraday (~> 1.0)
|
27
|
+
i18n (1.8.2)
|
28
|
+
concurrent-ruby (~> 1.0)
|
29
|
+
jaro_winkler (1.5.4)
|
30
|
+
minitest (5.14.0)
|
31
|
+
multipart-post (2.1.1)
|
32
|
+
parallel (1.19.1)
|
33
|
+
parser (2.7.1.2)
|
34
|
+
ast (~> 2.4.0)
|
35
|
+
rack (2.2.2)
|
36
|
+
rainbow (3.0.0)
|
37
|
+
rake (13.0.1)
|
38
|
+
rexml (3.2.4)
|
39
|
+
rspec (3.9.0)
|
40
|
+
rspec-core (~> 3.9.0)
|
41
|
+
rspec-expectations (~> 3.9.0)
|
42
|
+
rspec-mocks (~> 3.9.0)
|
43
|
+
rspec-core (3.9.1)
|
44
|
+
rspec-support (~> 3.9.1)
|
45
|
+
rspec-expectations (3.9.1)
|
46
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
47
|
+
rspec-support (~> 3.9.0)
|
48
|
+
rspec-mocks (3.9.1)
|
49
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
50
|
+
rspec-support (~> 3.9.0)
|
51
|
+
rspec-support (3.9.2)
|
52
|
+
rubocop (0.82.0)
|
53
|
+
jaro_winkler (~> 1.5.1)
|
54
|
+
parallel (~> 1.10)
|
55
|
+
parser (>= 2.7.0.1)
|
56
|
+
rainbow (>= 2.2.2, < 4.0)
|
57
|
+
rexml
|
58
|
+
ruby-progressbar (~> 1.7)
|
59
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
60
|
+
rubocop-performance (1.5.2)
|
61
|
+
rubocop (>= 0.71.0)
|
62
|
+
rubocop-rails (2.5.2)
|
63
|
+
activesupport
|
64
|
+
rack (>= 1.1)
|
65
|
+
rubocop (>= 0.72.0)
|
66
|
+
ruby-progressbar (1.10.1)
|
67
|
+
thread_safe (0.3.6)
|
68
|
+
tzinfo (1.2.7)
|
69
|
+
thread_safe (~> 0.1)
|
70
|
+
unicode-display_width (1.7.0)
|
71
|
+
whenever (0.11.0)
|
72
|
+
chronic (>= 0.6.3)
|
73
|
+
zeitwerk (2.3.0)
|
74
|
+
|
75
|
+
PLATFORMS
|
76
|
+
ruby
|
77
|
+
|
78
|
+
DEPENDENCIES
|
79
|
+
bundler (~> 2.0)
|
80
|
+
kuroko2-updater!
|
81
|
+
rake (~> 13.0)
|
82
|
+
rspec (~> 3.0)
|
83
|
+
rubocop (~> 0.71)
|
84
|
+
rubocop-performance
|
85
|
+
rubocop-rails
|
86
|
+
|
87
|
+
BUNDLED WITH
|
88
|
+
2.1.4
|
data/README.md
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
# Kuroko2 Updater
|
2
|
+
|
3
|
+
## Background
|
4
|
+
|
5
|
+
A tool that uses a [whenever](https://github.com/javan/whenever) style config
|
6
|
+
file to configure [kuroko2](https://github.com/cookpad/kuroko2)
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
gem 'kuroko2-updater'
|
14
|
+
```
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
## Status
|
21
|
+
|
22
|
+
Experimental, not intended for general use, no plans for ongoing maintenance.
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
Some modifications must be made to the schedule.rb file to support using
|
27
|
+
kuroko2, rather than cron, here is an example of the additions required:
|
28
|
+
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
set :job_template, <<~TEMPLATE
|
32
|
+
queue: hako-executor
|
33
|
+
docker_application: hello-world-batch
|
34
|
+
env: :environment_variable=:environment
|
35
|
+
hako_oneshot: :job
|
36
|
+
TEMPLATE
|
37
|
+
|
38
|
+
job_type :rake, "bundle exec rake :task"
|
39
|
+
|
40
|
+
# These tags scope the job definitions that will be managed with this config.
|
41
|
+
set :kuroko2_tags, %w(hello-world production scheduled)
|
42
|
+
|
43
|
+
# These are kuroku2 user ids for the Admin user(s) of the jobs managed
|
44
|
+
# by this tool. See the /users page to find the id of the
|
45
|
+
# user(s) you want to have this responsibility.
|
46
|
+
set :kuroko2_users, [1]
|
47
|
+
|
48
|
+
# This description is added to each job definition created in kuroko2 to
|
49
|
+
# warn people not to manually edit the jobs managed by this file!
|
50
|
+
set :kuroko2_job_description, <<~DESC
|
51
|
+
This job is managed by an automation tool.
|
52
|
+
|
53
|
+
**Warning DO NOT EDIT**
|
54
|
+
|
55
|
+
Please do not edit this job definition directly
|
56
|
+
but instead make a pull request to https://github.com/cookpad/hello-world/blob/master/config/schedule.rb
|
57
|
+
DESC
|
58
|
+
|
59
|
+
set :kuroko2_slack_channel, "#hello-world-alerts"
|
60
|
+
```
|
61
|
+
|
62
|
+
As part of the deployment process run the `kuroko2-updater` command.
|
63
|
+
|
64
|
+
By default this reads `config/schedule.rb` but another file can be passed as an argument.
|
65
|
+
|
66
|
+
## Config
|
67
|
+
|
68
|
+
This config is **required** and must be included in the environment for this
|
69
|
+
tool to run without error!
|
70
|
+
|
71
|
+
| Var | notes | e.g |
|
72
|
+
|-----|-------|-----|
|
73
|
+
| `KUROKO2_API_URL` | The URL of the kuroko2 API | `https://kuroko2.example.com/v1` |
|
74
|
+
| `KUROKO2_API_USER` | The username for kuroku2 API auth | `hello-world` |
|
75
|
+
| `KUROKO2_API_KEY` | The password/key for kuroku2 API auth | `secret-password` |
|
76
|
+
|
77
|
+
## Warning
|
78
|
+
|
79
|
+
This gem is currently only intended to be used internally at Cookpad. And we cannot
|
80
|
+
really recommend it's use as we created it to ease some migration issues in a
|
81
|
+
specific project.
|
82
|
+
|
83
|
+
This tool heavily monkey patches and exposes some internal details of whenever
|
84
|
+
in a way that I am sure is not supported by the author of that tool, so it
|
85
|
+
may well break unexpectedly if you update whenever!
|
86
|
+
|
87
|
+
We intend to improve this tool, or create other tooling to enable this workflow
|
88
|
+
more generically, at some point in the future.
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "kuroko2/updater"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/exe/kuroko2-updater
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "kuroko2/updater/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "kuroko2-updater"
|
7
|
+
spec.version = Kuroko2::Updater::VERSION
|
8
|
+
spec.authors = ["Ed Robinson"]
|
9
|
+
spec.email = ["edward-robinson@cookpad.com"]
|
10
|
+
spec.summary = "A tool to manage kuroko2 job-definitions based on a schedule.rb file"
|
11
|
+
|
12
|
+
# Specify which files should be added to the gem when it is released.
|
13
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
14
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
15
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
16
|
+
end
|
17
|
+
spec.bindir = "exe"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "activesupport"
|
22
|
+
spec.add_dependency "faraday", ">= 0.15"
|
23
|
+
spec.add_dependency "faraday_middleware", ">= 0.13"
|
24
|
+
spec.add_dependency "whenever", "~> 0.11"
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
27
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
+
spec.add_development_dependency "rubocop", "~> 0.71"
|
30
|
+
spec.add_development_dependency "rubocop-performance"
|
31
|
+
spec.add_development_dependency "rubocop-rails"
|
32
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require "kuroko2/updater/version"
|
2
|
+
require "kuroko2/updater/whenever"
|
3
|
+
require "kuroko2/updater/client/definition"
|
4
|
+
require "logger"
|
5
|
+
|
6
|
+
module Kuroko2
|
7
|
+
class Updater
|
8
|
+
class ValidationError < RuntimeError; end
|
9
|
+
|
10
|
+
def initialize(job_list:, client: Kuroko2::Updater::Client::Definition.new)
|
11
|
+
@client = client
|
12
|
+
@job_list = job_list
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
validate_job_list
|
17
|
+
|
18
|
+
to_delete.each { |job| client.delete(job) }
|
19
|
+
to_create.each { |job| client.create(job) }
|
20
|
+
to_update.each { |job| client.update(job) }
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def validate_job_list
|
26
|
+
fail ValidationError, ":kuroko2_tags was not set set in the config file" unless tags.any?
|
27
|
+
fail ValidationError, ":kuroko2_users was not set in the config file" unless users.any?
|
28
|
+
fail ValidationError, "#{duplicated_jobs.join(',')} was specified more than once" if duplicated_jobs.any?
|
29
|
+
end
|
30
|
+
|
31
|
+
def duplicated_jobs
|
32
|
+
names = desired_jobs.map { |job| job[:name] }
|
33
|
+
names.select { |name| names.count(name) > 1 }.uniq
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_delete
|
37
|
+
existing_jobs.reject do |existing_job|
|
38
|
+
desired_jobs.any? do |desired_job|
|
39
|
+
desired_job[:name] == existing_job[:name]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_create
|
45
|
+
desired_jobs.reject do |desired_job|
|
46
|
+
existing_jobs.any? do |existing_job|
|
47
|
+
desired_job[:name] == existing_job[:name]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_update
|
53
|
+
(desired_jobs - to_create).map do |job|
|
54
|
+
job[:id] = id_for(job)
|
55
|
+
job
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def id_for(job)
|
60
|
+
existing_jobs.find { |existing_job| existing_job[:name] == job[:name] }[:id]
|
61
|
+
end
|
62
|
+
|
63
|
+
def existing_jobs
|
64
|
+
@_existing_jobs ||= client.list(tags)
|
65
|
+
end
|
66
|
+
|
67
|
+
def desired_jobs
|
68
|
+
@_desired_jobs ||= job_list.time_and_jobs.flat_map do |time, jobs|
|
69
|
+
jobs.map do |job|
|
70
|
+
{
|
71
|
+
name: job.task,
|
72
|
+
script: job.output,
|
73
|
+
description: job_description,
|
74
|
+
cron: cron(time, job),
|
75
|
+
slack_channel: slack_channel,
|
76
|
+
user_id: users,
|
77
|
+
tags: tags,
|
78
|
+
hipchat_notify_finished: notify_finished,
|
79
|
+
notify_cancellation: notify_cancellation
|
80
|
+
}
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def slack_channel
|
86
|
+
job_list.kuroko2_slack_channel
|
87
|
+
rescue NoMethodError
|
88
|
+
nil
|
89
|
+
end
|
90
|
+
|
91
|
+
def job_description
|
92
|
+
job_list.kuroko2_job_description
|
93
|
+
rescue NoMethodError
|
94
|
+
<<~DESC
|
95
|
+
This job is managed by an automation tool.
|
96
|
+
|
97
|
+
**Warning DO NOT EDIT**
|
98
|
+
|
99
|
+
Please do not edit this job definition directly.
|
100
|
+
DESC
|
101
|
+
end
|
102
|
+
|
103
|
+
def notify_finished
|
104
|
+
job_list.kuroko2_notify_finished
|
105
|
+
rescue NoMethodError
|
106
|
+
false
|
107
|
+
end
|
108
|
+
|
109
|
+
def notify_cancellation
|
110
|
+
job_list.kuroko2_notify_cancellation
|
111
|
+
rescue NoMethodError
|
112
|
+
true
|
113
|
+
end
|
114
|
+
|
115
|
+
def tags
|
116
|
+
job_list.kuroko2_tags
|
117
|
+
rescue NoMethodError
|
118
|
+
[]
|
119
|
+
end
|
120
|
+
|
121
|
+
def users
|
122
|
+
job_list.kuroko2_users
|
123
|
+
rescue NoMethodError
|
124
|
+
[]
|
125
|
+
end
|
126
|
+
|
127
|
+
def cron(times, job)
|
128
|
+
::Whenever::Output::Cron.enumerate(times).flat_map do |time|
|
129
|
+
::Whenever::Output::Cron.enumerate(job.at).map do |at|
|
130
|
+
::Whenever::Output::Cron.new(time, nil, at).time_in_cron_syntax
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
attr_reader :job_list, :client
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require "faraday"
|
2
|
+
require "faraday_middleware"
|
3
|
+
require "active_support/core_ext/hash"
|
4
|
+
|
5
|
+
module Kuroko2
|
6
|
+
class Updater
|
7
|
+
class Client
|
8
|
+
class Error < RuntimeError; end
|
9
|
+
class Definition
|
10
|
+
PATH = "definitions".freeze
|
11
|
+
|
12
|
+
def list(tags = nil)
|
13
|
+
response = client.get(PATH) do |req|
|
14
|
+
req.params[:tags] = tags if tags
|
15
|
+
end
|
16
|
+
handle_errors(response)
|
17
|
+
response.body.map(&:deep_symbolize_keys)
|
18
|
+
end
|
19
|
+
|
20
|
+
def create(params)
|
21
|
+
log.info "creating: #{params[:name]}"
|
22
|
+
response = client.post(PATH) do |req|
|
23
|
+
req.body = params
|
24
|
+
end
|
25
|
+
handle_errors(response)
|
26
|
+
response.body.deep_symbolize_keys
|
27
|
+
end
|
28
|
+
|
29
|
+
def update(params)
|
30
|
+
params = params.dup
|
31
|
+
id = params.delete(:id)
|
32
|
+
log.info "updating: #{id} #{params[:name]}"
|
33
|
+
response = client.put("#{PATH}/#{id}") do |req|
|
34
|
+
req.body = params
|
35
|
+
end
|
36
|
+
handle_errors(response)
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete(params)
|
41
|
+
params = params.dup
|
42
|
+
id = params.delete(:id)
|
43
|
+
log.info "deleting: #{id} #{params[:name]}"
|
44
|
+
response = client.delete("#{PATH}/#{id}")
|
45
|
+
handle_errors(response)
|
46
|
+
true
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def handle_errors(response)
|
52
|
+
fail Kuroko2::Updater::Client::Error, response.body["message"] unless response.success?
|
53
|
+
end
|
54
|
+
|
55
|
+
def log
|
56
|
+
Logger.new(STDERR)
|
57
|
+
end
|
58
|
+
|
59
|
+
def client
|
60
|
+
@_client ||= Faraday.new(url: ENV.fetch("KUROKO2_API_URL")) do |config|
|
61
|
+
config.basic_auth(ENV.fetch("KUROKO2_API_USER"), ENV.fetch("KUROKO2_API_KEY"))
|
62
|
+
config.use FaradayMiddleware::EncodeJson
|
63
|
+
config.use FaradayMiddleware::ParseJson
|
64
|
+
config.adapter Faraday.default_adapter
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "whenever"
|
2
|
+
|
3
|
+
module Kuroko2
|
4
|
+
class Updater
|
5
|
+
module Whenever
|
6
|
+
class ::Whenever::Job
|
7
|
+
def task
|
8
|
+
@options[:task]
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
# patch whenever not to chomp newlines, as kuroko2 scripts need them
|
14
|
+
def process_template(template, options)
|
15
|
+
template.gsub(/:\w+/) do |key|
|
16
|
+
before_and_after = [$`[-1..-1], $'[0..0]]
|
17
|
+
option = options[key.sub(":", "").to_sym] || key
|
18
|
+
|
19
|
+
if before_and_after.all? { |c| c == "'" }
|
20
|
+
escape_single_quotes(option)
|
21
|
+
elsif before_and_after.all? { |c| c == '"' }
|
22
|
+
escape_double_quotes(option)
|
23
|
+
else
|
24
|
+
option
|
25
|
+
end
|
26
|
+
end.strip
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class ::Whenever::JobList
|
31
|
+
def time_and_jobs
|
32
|
+
@jobs.values.reduce({}, :merge)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kuroko2-updater
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ed Robinson
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-05-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.15'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.15'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: faraday_middleware
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.13'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.13'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: whenever
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.11'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.11'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '13.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '13.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.71'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.71'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-performance
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop-rails
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
description:
|
154
|
+
email:
|
155
|
+
- edward-robinson@cookpad.com
|
156
|
+
executables:
|
157
|
+
- kuroko2-updater
|
158
|
+
extensions: []
|
159
|
+
extra_rdoc_files: []
|
160
|
+
files:
|
161
|
+
- ".gitignore"
|
162
|
+
- ".rspec"
|
163
|
+
- ".rubocop.yml"
|
164
|
+
- ".travis.yml"
|
165
|
+
- Gemfile
|
166
|
+
- Gemfile.lock
|
167
|
+
- README.md
|
168
|
+
- Rakefile
|
169
|
+
- bin/console
|
170
|
+
- bin/setup
|
171
|
+
- exe/kuroko2-updater
|
172
|
+
- kuroko2-updater.gemspec
|
173
|
+
- lib/kuroko2/updater.rb
|
174
|
+
- lib/kuroko2/updater/client/definition.rb
|
175
|
+
- lib/kuroko2/updater/version.rb
|
176
|
+
- lib/kuroko2/updater/whenever.rb
|
177
|
+
homepage:
|
178
|
+
licenses: []
|
179
|
+
metadata: {}
|
180
|
+
post_install_message:
|
181
|
+
rdoc_options: []
|
182
|
+
require_paths:
|
183
|
+
- lib
|
184
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
185
|
+
requirements:
|
186
|
+
- - ">="
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: '0'
|
189
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
|
+
requirements:
|
191
|
+
- - ">="
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '0'
|
194
|
+
requirements: []
|
195
|
+
rubygems_version: 3.0.3
|
196
|
+
signing_key:
|
197
|
+
specification_version: 4
|
198
|
+
summary: A tool to manage kuroko2 job-definitions based on a schedule.rb file
|
199
|
+
test_files: []
|