mobilis 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ module Mobilis
6
+ class << self
7
+ def logger
8
+ @logger ||= Logger.new($stdout).tap do |log|
9
+ log.progname = 'mobilis'
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -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