mobilis 0.0.1
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/.rspec +3 -0
- data/.rubocop.yml +13 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +68 -0
- data/README.md +29 -0
- data/Rakefile +13 -0
- data/lib/mobilis/actions_projects_take.rb +62 -0
- data/lib/mobilis/command_line.rb +43 -0
- data/lib/mobilis/docker_compose_projector.rb +132 -0
- data/lib/mobilis/generic_project.rb +101 -0
- data/lib/mobilis/interactive_designer.rb +381 -0
- data/lib/mobilis/logger.rb +14 -0
- data/lib/mobilis/mysql_instance.rb +49 -0
- data/lib/mobilis/new_relic.rb +18 -0
- data/lib/mobilis/os.rb +26 -0
- data/lib/mobilis/postgresql_instance.rb +38 -0
- data/lib/mobilis/project.rb +261 -0
- data/lib/mobilis/rack_project.rb +89 -0
- data/lib/mobilis/rails_project.rb +179 -0
- data/lib/mobilis/redis_instance.rb +37 -0
- data/lib/mobilis/version.rb +5 -0
- data/lib/mobilis.rb +9 -0
- data/sig/mobilis.rbs +4 -0
- metadata +125 -0
@@ -0,0 +1,381 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'state_machine'
|
4
|
+
require 'tty-prompt'
|
5
|
+
require 'awesome_print'
|
6
|
+
require 'forwardable'
|
7
|
+
|
8
|
+
require 'mobilis/logger'
|
9
|
+
require 'mobilis/project'
|
10
|
+
|
11
|
+
module Mobilis
|
12
|
+
|
13
|
+
class InteractiveDesigner
|
14
|
+
extend Forwardable
|
15
|
+
|
16
|
+
attr_accessor :project
|
17
|
+
attr_reader :prompt
|
18
|
+
|
19
|
+
def_delegators :@project, :projects, :display
|
20
|
+
|
21
|
+
state_machine :state, initial: :intialize do
|
22
|
+
|
23
|
+
event :go_build do
|
24
|
+
transition [:main_menu] => :build
|
25
|
+
end
|
26
|
+
|
27
|
+
event :go_add_omakase_stack_rails_project do
|
28
|
+
transition [:main_menu] => :add_omakase_stack_rails_project
|
29
|
+
end
|
30
|
+
|
31
|
+
event :go_add_prime_stack_rails_project do
|
32
|
+
transition [:main_menu] => :add_prime_stack_rails_project
|
33
|
+
end
|
34
|
+
|
35
|
+
event :go_add_postgresql_instance do
|
36
|
+
transition [:main_menu] => :add_postgresql_instance
|
37
|
+
end
|
38
|
+
|
39
|
+
event :go_add_mysql_instance do
|
40
|
+
transition [:main_menu] => :add_mysql_instance
|
41
|
+
end
|
42
|
+
|
43
|
+
event :go_add_redis_instance do
|
44
|
+
transition [:main_menu] => :add_redis_instance
|
45
|
+
end
|
46
|
+
|
47
|
+
event :go_add_rack_project do
|
48
|
+
transition [:main_menu] => :add_rack_project
|
49
|
+
end
|
50
|
+
|
51
|
+
event :go_edit_rails_project do
|
52
|
+
transition [
|
53
|
+
:add_omakase_stack_rails_project,
|
54
|
+
:add_prime_stack_rails_project,
|
55
|
+
:edit_rails_controller,
|
56
|
+
:edit_rails_model,
|
57
|
+
:toggle_rails_api_mode,
|
58
|
+
:main_menu
|
59
|
+
] => :edit_rails_project
|
60
|
+
end
|
61
|
+
|
62
|
+
event :go_generate do
|
63
|
+
transition [:main_menu] => :generate
|
64
|
+
end
|
65
|
+
|
66
|
+
event :go_main_menu do
|
67
|
+
transition to: :main_menu
|
68
|
+
end
|
69
|
+
|
70
|
+
event :go_rails_add_model do
|
71
|
+
transition [:edit_rails_project] => :rails_add_model
|
72
|
+
end
|
73
|
+
|
74
|
+
event :go_rails_add_controller do
|
75
|
+
transition [:edit_rails_project] => :rails_add_controller
|
76
|
+
end
|
77
|
+
|
78
|
+
event :go_rails_edit_controller do
|
79
|
+
transition [:rails_add_controller] => :edit_rails_controller
|
80
|
+
end
|
81
|
+
|
82
|
+
event :go_rails_edit_model do
|
83
|
+
transition [:rails_add_model] => :edit_rails_model
|
84
|
+
end
|
85
|
+
|
86
|
+
event :go_save_project do
|
87
|
+
transition [:main_menu] => :save_project
|
88
|
+
end
|
89
|
+
|
90
|
+
event :go_toggle_rails_api_mode do
|
91
|
+
transition [:edit_rails_project] => :toggle_rails_api_mode
|
92
|
+
end
|
93
|
+
|
94
|
+
event :go_edit_links_select_project do
|
95
|
+
transition [:main_menu] => :edit_links_select_project
|
96
|
+
end
|
97
|
+
|
98
|
+
event :go_edit_links do
|
99
|
+
transition [:edit_links_select_project] => :edit_links
|
100
|
+
end
|
101
|
+
|
102
|
+
after_transition any => any do |designer|
|
103
|
+
puts "o0o VVVV ---- VVVV o0o"
|
104
|
+
puts "-- Switched state to #{ designer.state_name } --"
|
105
|
+
puts "o0o ^^^^ ---- ^^^^ o0o"
|
106
|
+
end
|
107
|
+
|
108
|
+
state :main_menu do
|
109
|
+
def display
|
110
|
+
project.display
|
111
|
+
end
|
112
|
+
def choices
|
113
|
+
project_choices = projects.map do |project|
|
114
|
+
{ name: "Edit '#{ project.name }' project", value: -> { @selected_rails_project = project ; go_edit_rails_project } }
|
115
|
+
end
|
116
|
+
[
|
117
|
+
{name: "Add prime stack rails project", value: -> { go_add_prime_stack_rails_project }},
|
118
|
+
{name: "Add omakase stack rails project", value: -> { go_add_omakase_stack_rails_project }},
|
119
|
+
{name: "Add rack3 project", value: -> { go_add_rack_project }},
|
120
|
+
#{ name: "Add airflow server project", value: -> { go_add_airflow_server }},
|
121
|
+
#{ name: "Add airflow job project", value: -> { go_add_airflow_job_project }},
|
122
|
+
#{ name: "Add Docker registry", value: -> { go_add_docker_registry }},
|
123
|
+
#{ name: "Add Vue.js project", value: -> { go_add_vue_project }},
|
124
|
+
#{ name: "Add flask project", value: -> { go_add_flask_project }},
|
125
|
+
#{ name: "Add existing git project", value: -> { go_add_existing_git_project }},
|
126
|
+
{ name: "Add redis instance", value: -> { go_add_redis_instance }},
|
127
|
+
{ name: "Add postgresql instance", value: -> { go_add_postgresql_instance }},
|
128
|
+
{ name: "Add mysql instance", value: -> { go_add_mysql_instance }},
|
129
|
+
#{ name: "Add couchdb instance", value: -> { go_add_couchdb_instance }},
|
130
|
+
#{ name: "Add kafka instance", value: -> { go_add_kafka_instance }},
|
131
|
+
#{ name: "Add graphql instance", value: -> { go_add_grapql_instance }},
|
132
|
+
#{ name: "Add gitlab instance w/workers", value: -> { go_add_gitlab_instance }},
|
133
|
+
*project_choices,
|
134
|
+
{ name: "edit links", value: -> { go_edit_links_select_project }},
|
135
|
+
{ name: "Save mproj.json", value: -> { go_save_project }},
|
136
|
+
{ name: "Generate", value: -> { go_generate }},
|
137
|
+
{ name: "Build", value: -> { go_build }}
|
138
|
+
]
|
139
|
+
end
|
140
|
+
def action = false
|
141
|
+
end
|
142
|
+
|
143
|
+
state :edit_links_select_project do
|
144
|
+
def display = false
|
145
|
+
def choices
|
146
|
+
[
|
147
|
+
{name: "return to Main Menu", value: -> { go_main_menu }},
|
148
|
+
*( projects.map do |project|
|
149
|
+
{ name: "Edit '#{ project.name }' links", value: -> { @selected_project = project ; go_edit_links } }
|
150
|
+
end)
|
151
|
+
]
|
152
|
+
end
|
153
|
+
def action = false
|
154
|
+
end
|
155
|
+
|
156
|
+
state :edit_links do
|
157
|
+
def display = false
|
158
|
+
def choices = false
|
159
|
+
def action
|
160
|
+
selected = prompt.multi_select("Select links") do |menu|
|
161
|
+
menu.default *@selected_project.links
|
162
|
+
projects.each do |project|
|
163
|
+
menu.choice project.name unless project.name == @selected_project.name
|
164
|
+
end
|
165
|
+
end
|
166
|
+
@selected_project.set_links selected
|
167
|
+
go_main_menu
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
state :edit_rails_model do
|
172
|
+
def display
|
173
|
+
ap @selected_rails_project.models.collect {|x| x[:name]}
|
174
|
+
end
|
175
|
+
def choices
|
176
|
+
[
|
177
|
+
{name: "return to Main Menu", value: -> { go_main_menu }},
|
178
|
+
{name: "return to rails project edit", value: -> { go_edit_rails_project }},
|
179
|
+
{name: "Toggle timestamps", value: -> { go_toggle_rails_model_timestamps }},
|
180
|
+
*( @selected_rails_project.models.map do |model|
|
181
|
+
{ name: "Edit '#{ model.name }' model", value: -> { @selected_rails_model = model ; go_edit_rails_model } }
|
182
|
+
end)
|
183
|
+
]
|
184
|
+
end
|
185
|
+
def action = false
|
186
|
+
end
|
187
|
+
|
188
|
+
state :edit_rails_project do
|
189
|
+
def display
|
190
|
+
@selected_rails_project.display
|
191
|
+
end
|
192
|
+
def choices
|
193
|
+
[
|
194
|
+
{name: "return to Main Menu", value: -> { go_main_menu }},
|
195
|
+
{name: "Toggle API mode", value: -> { go_toggle_rails_api_mode }},
|
196
|
+
{name: "Add Model", value: -> { go_rails_add_model }},
|
197
|
+
{name: "Add Controller", value: -> { go_rails_add_controller }}
|
198
|
+
]
|
199
|
+
end
|
200
|
+
def action = false
|
201
|
+
end
|
202
|
+
|
203
|
+
state :add_prime_stack_rails_project do
|
204
|
+
def display
|
205
|
+
spacer
|
206
|
+
end
|
207
|
+
def choices = false
|
208
|
+
def action
|
209
|
+
project_name = prompt.ask("new Prime Stack Rails project name:")
|
210
|
+
@selected_rails_project = project.add_prime_stack_rails_project project_name
|
211
|
+
go_edit_rails_project
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
state :add_rack_project do
|
216
|
+
def display
|
217
|
+
spacer
|
218
|
+
end
|
219
|
+
def choices = false
|
220
|
+
def action
|
221
|
+
project_name = prompt.ask("new Rack project name:")
|
222
|
+
project.add_rack_project project_name
|
223
|
+
go_main_menu
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
state :add_omakase_stack_rails_project do
|
228
|
+
def display
|
229
|
+
spacer
|
230
|
+
end
|
231
|
+
def choices = false
|
232
|
+
def action
|
233
|
+
project_name = prompt.ask("new Omakase Stack Rails project name:")
|
234
|
+
@selected_rails_project = project.add_omakase_stack_rails_project project_name
|
235
|
+
go_edit_rails_project
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
state :add_postgresql_instance do
|
240
|
+
def display
|
241
|
+
spacer
|
242
|
+
end
|
243
|
+
def choices = false
|
244
|
+
def action
|
245
|
+
project_name = prompt.ask("new postgresql instance name:")
|
246
|
+
project.add_postgresql_instance project_name
|
247
|
+
go_main_menu
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
state :add_mysql_instance do
|
252
|
+
def display
|
253
|
+
spacer
|
254
|
+
end
|
255
|
+
def choices = false
|
256
|
+
def action
|
257
|
+
project_name = prompt.ask("new mysql instance name:")
|
258
|
+
project.add_mysql_instance project_name
|
259
|
+
go_main_menu
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
state :add_redis_instance do
|
264
|
+
def display
|
265
|
+
spacer
|
266
|
+
end
|
267
|
+
def choices = false
|
268
|
+
def action
|
269
|
+
project_name = prompt.ask("new redis instance name:")
|
270
|
+
project.add_redis_instance project_name
|
271
|
+
go_main_menu
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
state :toggle_rails_api_mode do
|
276
|
+
def display
|
277
|
+
Mobilis.logger.info "Toggled rails API mode for '#{@selected_rails_project.name}'"
|
278
|
+
end
|
279
|
+
def choices = false
|
280
|
+
def action
|
281
|
+
@selected_rails_project.toggle_rails_api_mode
|
282
|
+
go_edit_rails_project
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
state :rails_add_model do
|
287
|
+
def display
|
288
|
+
ap @selected_rails_project.models.collect {|x| x[:name]}
|
289
|
+
end
|
290
|
+
def choices = false
|
291
|
+
def action
|
292
|
+
name = prompt.ask("new model name")
|
293
|
+
@selected_rails_model = add_model name
|
294
|
+
go_edit_rails_model
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
state :rails_add_controller do
|
299
|
+
def display
|
300
|
+
ap @selected_rails_project.controllers.collect {|x| x[:name]}
|
301
|
+
end
|
302
|
+
def choices = false
|
303
|
+
def action
|
304
|
+
name = prompt.ask("new controller name:")
|
305
|
+
@selected_rails_controller = answer.add_controller name
|
306
|
+
go_edit_rails_controller
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
state :generate do
|
311
|
+
def display
|
312
|
+
spacer
|
313
|
+
end
|
314
|
+
def choices = false
|
315
|
+
def action
|
316
|
+
project.generate_files
|
317
|
+
go_main_menu
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
state :build do
|
322
|
+
def display
|
323
|
+
spacer
|
324
|
+
end
|
325
|
+
def choices = false
|
326
|
+
def action
|
327
|
+
project.build
|
328
|
+
go_main_menu
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
state :save_project do
|
333
|
+
def display
|
334
|
+
spacer
|
335
|
+
end
|
336
|
+
def choices = false
|
337
|
+
def action
|
338
|
+
project.save_project
|
339
|
+
go_main_menu
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
def initialize
|
345
|
+
super()
|
346
|
+
@prompt = TTY::Prompt.new
|
347
|
+
@project = Project.new
|
348
|
+
end
|
349
|
+
|
350
|
+
|
351
|
+
def choose_destination
|
352
|
+
Mobilis.logger.info "#choose_destination"
|
353
|
+
|
354
|
+
blank_space
|
355
|
+
spacer
|
356
|
+
display
|
357
|
+
spacer
|
358
|
+
blank_space
|
359
|
+
|
360
|
+
if some_choices = choices then
|
361
|
+
prompt.select("Choose your Path", some_choices, per_page: 20)
|
362
|
+
else
|
363
|
+
Mobilis.logger.info "No choices found, running action instead"
|
364
|
+
action
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
def new_relic_license_key
|
369
|
+
ENV.fetch "NEW_RELIC_LICENSE_KEY", false
|
370
|
+
end
|
371
|
+
|
372
|
+
def spacer
|
373
|
+
puts "|+--------------------------------------------------------+|"
|
374
|
+
end
|
375
|
+
|
376
|
+
def blank_space
|
377
|
+
puts ""
|
378
|
+
end
|
379
|
+
|
380
|
+
end
|
381
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mobilis/generic_project"
|
4
|
+
|
5
|
+
module Mobilis
|
6
|
+
class MysqlInstance < GenericProject
|
7
|
+
|
8
|
+
def generate
|
9
|
+
FileUtils.mkdir_p data_dir
|
10
|
+
end
|
11
|
+
|
12
|
+
def child_env_vars
|
13
|
+
[ ]
|
14
|
+
end
|
15
|
+
|
16
|
+
def env_vars
|
17
|
+
vars = []
|
18
|
+
if linked_to_rails_project
|
19
|
+
vars << "MYSQL_DATABASE=#{ linked_to_rails_project.name }_production"
|
20
|
+
end
|
21
|
+
vars.concat [
|
22
|
+
"MYSQL_USER=#{ name }",
|
23
|
+
"MYSQL_PASSWORD=#{ name }_password",
|
24
|
+
"MYSQL_RANDOM_ROOT_PASSWORD=true"
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
def data_dir
|
29
|
+
"./data/#{ name }"
|
30
|
+
end
|
31
|
+
|
32
|
+
def has_local_build
|
33
|
+
false
|
34
|
+
end
|
35
|
+
|
36
|
+
def url
|
37
|
+
"mysql2://#{ username }:#{ password }@#{ name }:3306/?pool=5"
|
38
|
+
end
|
39
|
+
|
40
|
+
def username
|
41
|
+
name
|
42
|
+
end
|
43
|
+
|
44
|
+
def password
|
45
|
+
"#{name}_password"
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Mobilis
|
2
|
+
|
3
|
+
module NewRelic
|
4
|
+
|
5
|
+
def new_relic &block
|
6
|
+
instance_eval &block
|
7
|
+
end
|
8
|
+
|
9
|
+
def set_license_key license_key
|
10
|
+
@new_relic_license_key = license_key
|
11
|
+
end
|
12
|
+
|
13
|
+
def enable_distributed_tracing
|
14
|
+
@new_relic_destributed_tracing = true
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
data/lib/mobilis/os.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Mobilis
|
2
|
+
module OS
|
3
|
+
# https://stackoverflow.com/questions/170956/how-can-i-find-which-operating-system-my-ruby-program-is-running-on
|
4
|
+
|
5
|
+
def OS.windows?
|
6
|
+
(/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def OS.mac?
|
10
|
+
(/darwin/ =~ RUBY_PLATFORM) != nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def OS.unix?
|
14
|
+
!OS.windows?
|
15
|
+
end
|
16
|
+
|
17
|
+
def OS.linux?
|
18
|
+
OS.unix? and not OS.mac?
|
19
|
+
end
|
20
|
+
|
21
|
+
def OS.jruby?
|
22
|
+
RUBY_ENGINE == 'jruby'
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mobilis/generic_project"
|
4
|
+
|
5
|
+
module Mobilis
|
6
|
+
class PostgresqlInstance < GenericProject
|
7
|
+
|
8
|
+
def generate
|
9
|
+
FileUtils.mkdir_p data_dir
|
10
|
+
end
|
11
|
+
|
12
|
+
def child_env_vars
|
13
|
+
[ ]
|
14
|
+
end
|
15
|
+
|
16
|
+
def data_dir
|
17
|
+
"./data/#{ name }"
|
18
|
+
end
|
19
|
+
|
20
|
+
def has_local_build
|
21
|
+
false
|
22
|
+
end
|
23
|
+
|
24
|
+
def url
|
25
|
+
"postgres://#{ username }:#{ password }@#{ name }:5432/"
|
26
|
+
end
|
27
|
+
|
28
|
+
def username
|
29
|
+
name
|
30
|
+
end
|
31
|
+
|
32
|
+
def password
|
33
|
+
"#{name}_password"
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|