kaiser 0.0.0 → 0.6.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.
@@ -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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kaiser
4
+ VERSION = '0.6.4'
5
+ end
data/lib/kaiser.rb CHANGED
@@ -1,5 +1,52 @@
1
- class Kaiser
2
- def self.hi
3
- puts "Hello Gemmy!"
4
- end
5
- end
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.0.0
4
+ version: 0.6.4
5
5
  platform: ruby
6
6
  authors:
7
- - Guga katsiashvili
8
- autorequire:
9
- bindir: bin
7
+ - David Siaw
8
+ autorequire:
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-20 00:00:00.000000000 Z
12
- dependencies: []
13
- description: A simple hello world gem
14
- email: guga.katsiashvili@gmail.com
15
- executables: []
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
- homepage: http://rubygems.org/gems/kaiser
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
- post_install_message:
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: '0'
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
- rubyforge_project:
40
- rubygems_version: 2.4.8
41
- signing_key:
201
+ rubygems_version: 3.1.2
202
+ signing_key:
42
203
  specification_version: 4
43
- summary: Kaiser!
204
+ summary: Manage your monsters
44
205
  test_files: []