kaiser 0.0.0 → 0.6.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +129 -0
- data/exe/kaiser +87 -0
- data/lib/kaiser/after_dotter.rb +23 -0
- data/lib/kaiser/cli.rb +624 -0
- data/lib/kaiser/cli_options.rb +14 -0
- data/lib/kaiser/cmds/attach.rb +23 -0
- data/lib/kaiser/cmds/db_load.rb +29 -0
- data/lib/kaiser/cmds/db_reset.rb +22 -0
- data/lib/kaiser/cmds/db_reset_hard.rb +21 -0
- data/lib/kaiser/cmds/db_save.rb +26 -0
- data/lib/kaiser/cmds/deinit.rb +22 -0
- data/lib/kaiser/cmds/down.rb +21 -0
- data/lib/kaiser/cmds/init.rb +39 -0
- data/lib/kaiser/cmds/login.rb +21 -0
- data/lib/kaiser/cmds/logs.rb +19 -0
- data/lib/kaiser/cmds/root.rb +21 -0
- data/lib/kaiser/cmds/set.rb +73 -0
- data/lib/kaiser/cmds/show.rb +40 -0
- data/lib/kaiser/cmds/shutdown.rb +26 -0
- data/lib/kaiser/cmds/up.rb +43 -0
- data/lib/kaiser/command_runner.rb +50 -0
- data/lib/kaiser/config.rb +81 -0
- data/lib/kaiser/databases/mysql.rb +45 -0
- data/lib/kaiser/databases/postgres.rb +46 -0
- data/lib/kaiser/docker_control.rb +10 -0
- data/lib/kaiser/dotter.rb +21 -0
- data/lib/kaiser/error.rb +14 -0
- data/lib/kaiser/kaiserfile.rb +107 -0
- data/lib/kaiser/plugin.rb +68 -0
- data/lib/kaiser/plugins/database.rb +30 -0
- data/lib/kaiser/plugins/git_submodule.rb +23 -0
- data/lib/kaiser/service.rb +22 -0
- data/lib/kaiser/version.rb +5 -0
- data/lib/kaiser.rb +52 -5
- metadata +178 -17
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kaiser
|
4
|
+
# This class is responsible for parsing the Kaiserfile
|
5
|
+
class Kaiserfile
|
6
|
+
attr_accessor :docker_file_contents,
|
7
|
+
:docker_build_args,
|
8
|
+
:database,
|
9
|
+
:platform,
|
10
|
+
:port,
|
11
|
+
:database_reset_command,
|
12
|
+
:attach_mounts,
|
13
|
+
:server_type,
|
14
|
+
:services
|
15
|
+
|
16
|
+
def initialize(filename)
|
17
|
+
Optimist.die 'No Kaiserfile in current directory' unless File.exist? filename
|
18
|
+
|
19
|
+
@database = {
|
20
|
+
image: 'none',
|
21
|
+
platform: '',
|
22
|
+
port: 1234,
|
23
|
+
data_dir: '/tmp/data',
|
24
|
+
params: '',
|
25
|
+
commands: 'echo "no db"',
|
26
|
+
waitscript: 'echo "no dbwait"',
|
27
|
+
waitscript_params: ''
|
28
|
+
}
|
29
|
+
@attach_mounts = []
|
30
|
+
@params_array = []
|
31
|
+
@server_type = :unknown
|
32
|
+
@database_reset_command = 'echo "no db to reset"'
|
33
|
+
@port = 1234
|
34
|
+
@services = {}
|
35
|
+
|
36
|
+
instance_eval File.read(filename), filename
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate!
|
40
|
+
raise 'No dockerfile specified.' if @docker_file_contents.nil?
|
41
|
+
end
|
42
|
+
|
43
|
+
def plugin(name)
|
44
|
+
require "kaiser/plugins/#{name}"
|
45
|
+
raise "Plugin #{name} is not loaded." unless Plugin.loaded?(name)
|
46
|
+
|
47
|
+
Plugin.all_plugins[name].new(self).on_init
|
48
|
+
end
|
49
|
+
|
50
|
+
def dockerfile(name, options = {})
|
51
|
+
@docker_file_contents = File.read(name)
|
52
|
+
@docker_build_args = options[:args] || {}
|
53
|
+
end
|
54
|
+
|
55
|
+
def attach_mount(from, to)
|
56
|
+
attach_mounts << [from, to]
|
57
|
+
end
|
58
|
+
|
59
|
+
def db(image,
|
60
|
+
data_dir:,
|
61
|
+
port:,
|
62
|
+
platform: '',
|
63
|
+
params: '',
|
64
|
+
commands: '',
|
65
|
+
waitscript: nil,
|
66
|
+
waitscript_params: '')
|
67
|
+
@database = {
|
68
|
+
image: image,
|
69
|
+
platform: platform,
|
70
|
+
port: port,
|
71
|
+
data_dir: data_dir,
|
72
|
+
params: params,
|
73
|
+
commands: commands,
|
74
|
+
waitscript: waitscript,
|
75
|
+
waitscript_params: waitscript_params
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
def expose(port)
|
80
|
+
@port = port
|
81
|
+
end
|
82
|
+
|
83
|
+
def app_params(value)
|
84
|
+
@params_array << value
|
85
|
+
end
|
86
|
+
|
87
|
+
def params
|
88
|
+
@params_array.join(' ')
|
89
|
+
end
|
90
|
+
|
91
|
+
def db_reset_command(value)
|
92
|
+
@database_reset_command = value
|
93
|
+
end
|
94
|
+
|
95
|
+
def type(value)
|
96
|
+
raise 'Valid server types are: [:http]' if value != :http
|
97
|
+
|
98
|
+
@server_type = value
|
99
|
+
end
|
100
|
+
|
101
|
+
def service(name, image: name)
|
102
|
+
raise "duplicate service #{name.inspect}" if @services.key?(name)
|
103
|
+
|
104
|
+
@services[name] = { image: image }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kaiser
|
4
|
+
# To implement a Kaiser plugin you must inherit from this class.
|
5
|
+
# For example,
|
6
|
+
#
|
7
|
+
# class MyPlugin < Plugin
|
8
|
+
# def on_init
|
9
|
+
# puts 'My plugin is loaded!'
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# Then in your Kasierfile
|
14
|
+
#
|
15
|
+
# plugin :my_plugin
|
16
|
+
#
|
17
|
+
# Plugins has access the Kaiserfile DSL. For example,
|
18
|
+
#
|
19
|
+
# class Ruby < Plugin
|
20
|
+
# def on_init
|
21
|
+
# attach_mount 'Gemfile', '/usr/app/Gemfile'
|
22
|
+
# attach_mount 'Gemfile.lock', '/usr/app/Gemfile.lock'
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
class Plugin
|
27
|
+
def initialize(kaiserfile)
|
28
|
+
@kaiserfile = kaiserfile
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.loaded?(name)
|
32
|
+
Plugin.all_plugins.key?(name)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.inherited(plugin)
|
36
|
+
super
|
37
|
+
|
38
|
+
puts "INHERITED #{plugin}"
|
39
|
+
|
40
|
+
# underscore class name
|
41
|
+
name = plugin.to_s.split('::').last
|
42
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
43
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
44
|
+
.gsub(/([a-z])(\d)/, '\1_\2')
|
45
|
+
.tr('-', '_').downcase
|
46
|
+
|
47
|
+
Plugin.all_plugins[name.to_sym] = plugin
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.all_plugins
|
51
|
+
@all_plugins ||= {}
|
52
|
+
end
|
53
|
+
|
54
|
+
def on_init
|
55
|
+
raise 'Please implement #on_init'
|
56
|
+
end
|
57
|
+
|
58
|
+
def method_missing(method_sym, *arguments, &block) # rubocop:disable all
|
59
|
+
@kaiserfile.send(method_sym, *arguments, &block)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Little stub to initialize the namespace
|
65
|
+
module Kaiser
|
66
|
+
module Plugins
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/inflector'
|
4
|
+
|
5
|
+
module Kaiser
|
6
|
+
module Plugins
|
7
|
+
class Database < Plugin
|
8
|
+
def on_init
|
9
|
+
@kaiserfile.define_singleton_method :def_db do |*args|
|
10
|
+
args[0] = { args.first => {} } unless args.first.is_a? Hash
|
11
|
+
|
12
|
+
option = args.first
|
13
|
+
|
14
|
+
driver_name = option.keys.first.to_s
|
15
|
+
|
16
|
+
begin
|
17
|
+
require "kaiser/databases/#{driver_name}"
|
18
|
+
rescue LoadError
|
19
|
+
raise "Unknown database '#{driver_name}'"
|
20
|
+
end
|
21
|
+
|
22
|
+
driver_class = Kaiser::Databases.const_get(driver_name.camelize)
|
23
|
+
db_driver = driver_class.new(option.values.first)
|
24
|
+
|
25
|
+
db(db_driver.image_name, **db_driver.options_hash)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kaiser
|
4
|
+
module Plugins
|
5
|
+
class GitSubmodule < Plugin
|
6
|
+
def on_init
|
7
|
+
`git submodule status`.lines.each do |line|
|
8
|
+
# The git-submodule man page says uninitialized submodules are prefixed with a -
|
9
|
+
# but I found this unreliable. While testing I pressed Control-C in the middle of
|
10
|
+
# the update command so some submodule would be initialized and others wouldn't.
|
11
|
+
# After that, the status command had removed the - for every submodule.
|
12
|
+
# Therefore we just check if there's files in the directory instead.
|
13
|
+
dir = line.strip.split(' ')[1]
|
14
|
+
if !Dir.exist?(dir) || Dir.empty?(dir) # rubocop:disable Style/Next
|
15
|
+
puts "Found uninitialized git submodule '#{dir}'"
|
16
|
+
puts "please run 'git submodule update --init --recursive'"
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kaiser
|
4
|
+
# This class describes an app-specific service
|
5
|
+
class Service
|
6
|
+
attr_reader :name
|
7
|
+
|
8
|
+
def initialize(envname, name, service_info)
|
9
|
+
@envname = envname
|
10
|
+
@name = name
|
11
|
+
@service_info = service_info
|
12
|
+
end
|
13
|
+
|
14
|
+
def shared_name
|
15
|
+
"#{@envname}-#{name}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def image
|
19
|
+
@service_info[:image]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/kaiser.rb
CHANGED
@@ -1,5 +1,52 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kaiser/error'
|
4
|
+
require 'kaiser/version'
|
5
|
+
require 'kaiser/kaiserfile'
|
6
|
+
require 'kaiser/cli_options'
|
7
|
+
require 'kaiser/cli'
|
8
|
+
require 'kaiser/after_dotter'
|
9
|
+
require 'kaiser/dotter'
|
10
|
+
|
11
|
+
require 'kaiser/config'
|
12
|
+
|
13
|
+
require 'kaiser/cmds/init'
|
14
|
+
require 'kaiser/cmds/deinit'
|
15
|
+
require 'kaiser/cmds/up'
|
16
|
+
require 'kaiser/cmds/down'
|
17
|
+
require 'kaiser/cmds/shutdown'
|
18
|
+
require 'kaiser/cmds/db_save'
|
19
|
+
require 'kaiser/cmds/db_load'
|
20
|
+
require 'kaiser/cmds/db_reset'
|
21
|
+
require 'kaiser/cmds/db_reset_hard'
|
22
|
+
require 'kaiser/cmds/logs'
|
23
|
+
require 'kaiser/cmds/attach'
|
24
|
+
require 'kaiser/cmds/login'
|
25
|
+
require 'kaiser/cmds/show'
|
26
|
+
require 'kaiser/cmds/set'
|
27
|
+
require 'kaiser/cmds/root'
|
28
|
+
|
29
|
+
require 'kaiser/plugin'
|
30
|
+
|
31
|
+
require 'kaiser/service'
|
32
|
+
|
33
|
+
# Kaiser
|
34
|
+
module Kaiser
|
35
|
+
SUB_COMMANDS = {
|
36
|
+
init: Kaiser::Cmds::Init,
|
37
|
+
deinit: Kaiser::Cmds::Deinit,
|
38
|
+
up: Kaiser::Cmds::Up,
|
39
|
+
down: Kaiser::Cmds::Down,
|
40
|
+
shutdown: Kaiser::Cmds::Shutdown,
|
41
|
+
db_save: Kaiser::Cmds::DbSave,
|
42
|
+
db_load: Kaiser::Cmds::DbLoad,
|
43
|
+
db_reset: Kaiser::Cmds::DbReset,
|
44
|
+
db_reset_hard: Kaiser::Cmds::DbResetHard,
|
45
|
+
logs: Kaiser::Cmds::Logs,
|
46
|
+
attach: Kaiser::Cmds::Attach,
|
47
|
+
login: Kaiser::Cmds::Login,
|
48
|
+
show: Kaiser::Cmds::Show,
|
49
|
+
set: Kaiser::Cmds::Set,
|
50
|
+
root: Kaiser::Cmds::Root
|
51
|
+
}.freeze
|
52
|
+
end
|
metadata
CHANGED
@@ -1,27 +1,189 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kaiser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
autorequire:
|
9
|
-
bindir:
|
7
|
+
- David Siaw
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
date: 2022-11-18 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: optimist
|
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: aruba
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.14.6
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.14.6
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: aruba-rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: factory_bot
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '4.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '4.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry-byebug
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '13.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '13.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '3.0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '3.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop
|
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
|
+
description: Monster management system
|
140
|
+
email:
|
141
|
+
- dsiaw@degica.com
|
142
|
+
executables:
|
143
|
+
- kaiser
|
16
144
|
extensions: []
|
17
145
|
extra_rdoc_files: []
|
18
146
|
files:
|
147
|
+
- README.md
|
148
|
+
- exe/kaiser
|
19
149
|
- lib/kaiser.rb
|
20
|
-
|
150
|
+
- lib/kaiser/after_dotter.rb
|
151
|
+
- lib/kaiser/cli.rb
|
152
|
+
- lib/kaiser/cli_options.rb
|
153
|
+
- lib/kaiser/cmds/attach.rb
|
154
|
+
- lib/kaiser/cmds/db_load.rb
|
155
|
+
- lib/kaiser/cmds/db_reset.rb
|
156
|
+
- lib/kaiser/cmds/db_reset_hard.rb
|
157
|
+
- lib/kaiser/cmds/db_save.rb
|
158
|
+
- lib/kaiser/cmds/deinit.rb
|
159
|
+
- lib/kaiser/cmds/down.rb
|
160
|
+
- lib/kaiser/cmds/init.rb
|
161
|
+
- lib/kaiser/cmds/login.rb
|
162
|
+
- lib/kaiser/cmds/logs.rb
|
163
|
+
- lib/kaiser/cmds/root.rb
|
164
|
+
- lib/kaiser/cmds/set.rb
|
165
|
+
- lib/kaiser/cmds/show.rb
|
166
|
+
- lib/kaiser/cmds/shutdown.rb
|
167
|
+
- lib/kaiser/cmds/up.rb
|
168
|
+
- lib/kaiser/command_runner.rb
|
169
|
+
- lib/kaiser/config.rb
|
170
|
+
- lib/kaiser/databases/mysql.rb
|
171
|
+
- lib/kaiser/databases/postgres.rb
|
172
|
+
- lib/kaiser/docker_control.rb
|
173
|
+
- lib/kaiser/dotter.rb
|
174
|
+
- lib/kaiser/error.rb
|
175
|
+
- lib/kaiser/kaiserfile.rb
|
176
|
+
- lib/kaiser/plugin.rb
|
177
|
+
- lib/kaiser/plugins/database.rb
|
178
|
+
- lib/kaiser/plugins/git_submodule.rb
|
179
|
+
- lib/kaiser/service.rb
|
180
|
+
- lib/kaiser/version.rb
|
181
|
+
homepage: https://github.com/kaiser
|
21
182
|
licenses:
|
22
183
|
- MIT
|
23
|
-
metadata:
|
24
|
-
|
184
|
+
metadata:
|
185
|
+
allowed_push_host: https://rubygems.org
|
186
|
+
post_install_message:
|
25
187
|
rdoc_options: []
|
26
188
|
require_paths:
|
27
189
|
- lib
|
@@ -29,16 +191,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
29
191
|
requirements:
|
30
192
|
- - ">="
|
31
193
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
194
|
+
version: 2.5.8
|
33
195
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
196
|
requirements:
|
35
197
|
- - ">="
|
36
198
|
- !ruby/object:Gem::Version
|
37
199
|
version: '0'
|
38
200
|
requirements: []
|
39
|
-
|
40
|
-
|
41
|
-
signing_key:
|
201
|
+
rubygems_version: 3.1.2
|
202
|
+
signing_key:
|
42
203
|
specification_version: 4
|
43
|
-
summary:
|
204
|
+
summary: Manage your monsters
|
44
205
|
test_files: []
|