mobilis 0.0.3 → 0.0.5
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 +4 -4
- data/CHANGELOG.md +15 -0
- data/Gemfile.lock +5 -1
- data/README.md +40 -9
- data/TODO.md +18 -0
- data/exe/mobilis +4 -2
- data/lib/mobilis/command_line.rb +12 -26
- data/lib/mobilis/docker_compose_projector.rb +2 -5
- data/lib/mobilis/interactive_designer.rb +106 -31
- data/lib/mobilis/postgresql_instance.rb +11 -0
- data/lib/mobilis/project.rb +13 -10
- data/lib/mobilis/rack_project.rb +12 -10
- data/lib/mobilis/rails_project.rb +49 -7
- data/lib/mobilis/version.rb +1 -1
- data/lib/mobilis.rb +1 -0
- data/mobilis.gemspec +47 -0
- metadata +22 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6f70c5988047af743d26f24694bdbf9894f7a6b5d05666987617aaf55fccd93
|
4
|
+
data.tar.gz: 185119c7a513b48f0d8ff991f2d79c40b43890b0fcf016624f786f8ba1383b45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6678e0445f6a8d777bc6f6c5280b7abacac3b61cb9b545cd51fc4a5ada43696a4815a2fa1fff553e8b3a2646b36550b12ec157437a78027225de87e63a20b650
|
7
|
+
data.tar.gz: ac072bd7e4bebca33480d3817aba9920869033d142d562f4908c6ca0c1a1a592f005ef834ffab4a025ea2b99e24741f534869e6daac49d2c3c461040bfc59c01
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.0.5] - 2022-12-09
|
4
|
+
- fixed a bug when loading a project that made the rails builder not update
|
5
|
+
- fixed permissions of wait-until, which means rails projects will wait until the database
|
6
|
+
is available to run migrations and start the server
|
7
|
+
- reworked a lot of the screens to be less cluttered and make more sense
|
8
|
+
- fixed unit tests to not hardcode my username in the test
|
9
|
+
- bumped redis version
|
10
|
+
|
11
|
+
## [0.0.4] - 2022-09-11
|
12
|
+
|
13
|
+
- Added command line options load and build
|
14
|
+
- Added wait-until to rails w/postgresql or mysql to wait for the db to be ready before starting rails
|
15
|
+
- Fixed per-state display not working
|
16
|
+
- Use table_print to display some information such as linked projects
|
17
|
+
|
3
18
|
## [0.0.1] - 2022-06-26
|
4
19
|
|
5
20
|
- Initial release
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mobilis (0.
|
4
|
+
mobilis (0.0.4)
|
5
5
|
awesome_print
|
6
|
+
optimist
|
7
|
+
pry
|
6
8
|
state_machine
|
9
|
+
table_print
|
7
10
|
tty-prompt
|
8
11
|
|
9
12
|
GEM
|
@@ -41,6 +44,7 @@ GEM
|
|
41
44
|
attr_extras (>= 6.2.4)
|
42
45
|
diff-lcs
|
43
46
|
patience_diff
|
47
|
+
table_print (1.5.7)
|
44
48
|
tty-color (0.6.0)
|
45
49
|
tty-cursor (0.7.1)
|
46
50
|
tty-prompt (0.23.1)
|
data/README.md
CHANGED
@@ -1,22 +1,44 @@
|
|
1
1
|
# Mobilis
|
2
2
|
|
3
|
-
|
3
|
+
Mobilis is a ruby app for generating linked sets of docker containers, for rapid
|
4
|
+
prototyping of arbitrary project architecture.
|
4
5
|
|
5
|
-
|
6
|
+
It has some smarts built in to make common things simple, and will allow you to
|
7
|
+
further customize the output for more complex needs.
|
6
8
|
|
7
9
|
## Installation
|
8
10
|
|
9
|
-
|
11
|
+
$ gem install mobilis
|
10
12
|
|
11
|
-
|
13
|
+
## Usage
|
12
14
|
|
13
|
-
|
15
|
+
$ mobilis
|
14
16
|
|
15
|
-
|
17
|
+
This will start the console based user interface.
|
16
18
|
|
17
|
-
|
19
|
+
Add projects of the various kinds. The input doesn't save you from mistakes
|
20
|
+
like entering spaces for service names, so don't do it.
|
21
|
+
|
22
|
+
If you need any containers to connect to other containers via the internal
|
23
|
+
names, you will want to add a link from the project that is connecting to the
|
24
|
+
project that is being connected to.
|
25
|
+
|
26
|
+
When configured to your liking, select the generate option to generate the
|
27
|
+
projects. This will *DESTROY* any data in an existing 'generate' directory.
|
18
28
|
|
19
|
-
|
29
|
+
## Special Rails support
|
30
|
+
If a Ruby on Rails project is linked to a postgres or mysql instance, it will
|
31
|
+
be setup with a DATABASE_URL environment variable that has the connection
|
32
|
+
information.
|
33
|
+
|
34
|
+
In addition, the database instance will receive a environment variable with the
|
35
|
+
name of the default production database that is based on the rails project's name
|
36
|
+
|
37
|
+
## Security
|
38
|
+
The generated projects are insecure, because of credential handling details.
|
39
|
+
|
40
|
+
If you want to deploy the projects into a production environment, you are
|
41
|
+
responsible for secrets management.
|
20
42
|
|
21
43
|
## Development
|
22
44
|
|
@@ -26,4 +48,13 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
26
48
|
|
27
49
|
## Contributing
|
28
50
|
|
29
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
51
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/Meleneth/mobilis.
|
52
|
+
|
53
|
+
## Plans
|
54
|
+
|
55
|
+
Adding more project types + smart integrations
|
56
|
+
Instrumenting generated projects with New Relic
|
57
|
+
Smoothing out the flow of the UI
|
58
|
+
Be able to load a previous configured set of projects for further editing
|
59
|
+
~~Make generated rails projects wait at startup until the database is usable~~
|
60
|
+
More details in TODO.md
|
data/TODO.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
make links look better ( table_print )
|
2
|
+
make link flow not redirect back to main menu
|
3
|
+
write down every time a flow feels bad
|
4
|
+
fix NR integration
|
5
|
+
~~fix having to restart several times to go through db create, db migrate, start service loop~~
|
6
|
+
add flask app
|
7
|
+
rails: add interactive service designer (models / controllers)
|
8
|
+
add a rack service wrapper that deploys as a sidecar (*handwave*)
|
9
|
+
use graphviz to show a diagram for current metaproject
|
10
|
+
~~give some documentation for expected usage / security concerns~~
|
11
|
+
rails: add multi-db-at-once support
|
12
|
+
add docker registry support (i.e. the docker container to host a docker registry)
|
13
|
+
no matter if you create a db or a rails project first, the flow should be easy and obvious to add the other, associated with whatever you made first
|
14
|
+
add ability to re-load old configuration
|
15
|
+
if generate/data exists already with data, have an option to keep or wipe the data
|
16
|
+
fix git integration so we have proper commit points between each step
|
17
|
+
add command line builder, so you can generate a tree based on an existing config
|
18
|
+
in a complex config, it feels bad when the config gets big
|
data/exe/mobilis
CHANGED
@@ -5,9 +5,11 @@ require 'pry'
|
|
5
5
|
require "mobilis/command_line"
|
6
6
|
require "mobilis/interactive_designer"
|
7
7
|
|
8
|
-
|
9
|
-
#options = Mobilis::CommandLine.parse_args(ARGV)
|
8
|
+
options = Mobilis::CommandLine.parse_args(ARGV)
|
10
9
|
program = Mobilis::InteractiveDesigner.new
|
10
|
+
if options[:subcommand] == :load
|
11
|
+
program.load_from_file options[:filename]
|
12
|
+
end
|
11
13
|
program.go_main_menu
|
12
14
|
|
13
15
|
loop do
|
data/lib/mobilis/command_line.rb
CHANGED
@@ -5,37 +5,23 @@ module Mobilis
|
|
5
5
|
def self.parse_args(args)
|
6
6
|
options = {}
|
7
7
|
Optimist.options(args) do
|
8
|
-
banner "
|
9
|
-
stop_on ["
|
8
|
+
banner "multi-project codebase generation toolkit"
|
9
|
+
stop_on ["load", "build", "help"]
|
10
10
|
end
|
11
|
-
if args
|
12
|
-
options[:subcommand] = :
|
11
|
+
if args == []
|
12
|
+
options[:subcommand] = :interactive
|
13
13
|
return options
|
14
14
|
end
|
15
15
|
options[:subcommand] = args.shift.to_sym
|
16
16
|
case options[:subcommand]
|
17
|
-
when :
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
when :railsapp
|
26
|
-
args.shift
|
27
|
-
when :railsapi
|
28
|
-
args.shift
|
29
|
-
end
|
30
|
-
when :add
|
31
|
-
Optimist.options(args) do
|
32
|
-
stop_on ["gem", "docker"]
|
33
|
-
end
|
34
|
-
options[:add_type] = args.shift.to_sym
|
35
|
-
case options[:add_type]
|
36
|
-
when :gem
|
37
|
-
options[:name] = args.shift
|
38
|
-
end
|
17
|
+
when :load
|
18
|
+
options[:filename] = args.shift
|
19
|
+
when :build
|
20
|
+
options[:filename] = args.shift
|
21
|
+
when :help
|
22
|
+
puts "I think we'd all like a little help."
|
23
|
+
else
|
24
|
+
Optimist::die "unknown subcommand #{cmd.inspect}"
|
39
25
|
end
|
40
26
|
options
|
41
27
|
end
|
@@ -73,10 +73,7 @@ def postgresql_service service
|
|
73
73
|
{
|
74
74
|
"image" => "postgres:14.1-alpine",
|
75
75
|
"restart" => "always",
|
76
|
-
"environment" =>
|
77
|
-
"POSTGRES_USER=#{ service.name }",
|
78
|
-
"POSTGRES_PASSWORD=#{ service.password }"
|
79
|
-
],
|
76
|
+
"environment" => service.env_vars,
|
80
77
|
"ports" => ["#{ attributes[keyname] }:5432"],
|
81
78
|
"volumes" => [
|
82
79
|
"#{ service.data_dir }:/var/lib/postgresql/data"
|
@@ -102,7 +99,7 @@ def redis_service service
|
|
102
99
|
attributes = @project.attributes
|
103
100
|
port_key = "#{service.name}_internal_port_no".to_sym
|
104
101
|
{
|
105
|
-
"image" => "redis:
|
102
|
+
"image" => "redis:7.0.5-alpine",
|
106
103
|
"restart" => "always",
|
107
104
|
"command" => "redis-server --save 20 1 --loglevel warning --requirepass #{ service.password }",
|
108
105
|
"environment" => [
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'state_machine'
|
4
|
-
require 'tty-prompt'
|
5
3
|
require 'awesome_print'
|
6
4
|
require 'forwardable'
|
5
|
+
require 'state_machine'
|
6
|
+
require 'table_print'
|
7
|
+
require 'tty-prompt'
|
7
8
|
|
8
9
|
require 'mobilis/logger'
|
9
10
|
require 'mobilis/project'
|
@@ -16,7 +17,7 @@ extend Forwardable
|
|
16
17
|
attr_accessor :project
|
17
18
|
attr_reader :prompt
|
18
19
|
|
19
|
-
def_delegators :@project, :projects, :
|
20
|
+
def_delegators :@project, :projects, :load_from_file
|
20
21
|
|
21
22
|
state_machine :state, initial: :intialize do
|
22
23
|
|
@@ -25,23 +26,37 @@ state_machine :state, initial: :intialize do
|
|
25
26
|
end
|
26
27
|
|
27
28
|
event :go_add_omakase_stack_rails_project do
|
28
|
-
transition [:
|
29
|
+
transition [:add_project_menu] => :add_omakase_stack_rails_project
|
29
30
|
end
|
30
31
|
|
31
32
|
event :go_add_prime_stack_rails_project do
|
32
|
-
transition [:
|
33
|
+
transition [:add_project_menu] => :add_prime_stack_rails_project
|
33
34
|
end
|
34
35
|
|
35
36
|
event :go_add_postgresql_instance do
|
36
|
-
transition [:
|
37
|
+
transition [:add_project_menu] => :add_postgresql_instance
|
38
|
+
end
|
39
|
+
|
40
|
+
event :go_add_project_menu do
|
41
|
+
transition [:main_menu] => :add_project_menu
|
42
|
+
end
|
43
|
+
|
44
|
+
event :go_edit_project_menu do
|
45
|
+
transition [:main_menu] => :edit_project_menu
|
37
46
|
end
|
38
47
|
|
39
48
|
event :go_add_mysql_instance do
|
40
|
-
transition [:
|
49
|
+
transition [:add_project_menu] => :add_mysql_instance
|
41
50
|
end
|
42
51
|
|
43
52
|
event :go_add_redis_instance do
|
44
|
-
transition [:
|
53
|
+
transition [:add_project_menu] => :add_redis_instance
|
54
|
+
end
|
55
|
+
|
56
|
+
event :go_back do
|
57
|
+
transition [:edit_rails_project] => :edit_project_menu
|
58
|
+
transition [:edit_generic_project] => :main_menu
|
59
|
+
transition [:add_project_menu] => :main_menu
|
45
60
|
end
|
46
61
|
|
47
62
|
event :go_add_rack_project do
|
@@ -50,12 +65,7 @@ state_machine :state, initial: :intialize do
|
|
50
65
|
|
51
66
|
event :go_edit_rails_project do
|
52
67
|
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
|
68
|
+
:edit_project_menu, :add_omakase_stack_rails_project, :add_prime_stack_rails_project
|
59
69
|
] => :edit_rails_project
|
60
70
|
end
|
61
71
|
|
@@ -93,6 +103,7 @@ state_machine :state, initial: :intialize do
|
|
93
103
|
|
94
104
|
event :go_edit_links_select_project do
|
95
105
|
transition [:main_menu] => :edit_links_select_project
|
106
|
+
transition [:edit_links] => :edit_links_select_project
|
96
107
|
end
|
97
108
|
|
98
109
|
event :go_edit_links do
|
@@ -107,13 +118,61 @@ state_machine :state, initial: :intialize do
|
|
107
118
|
|
108
119
|
state :main_menu do
|
109
120
|
def display
|
110
|
-
|
121
|
+
puts
|
122
|
+
tp.set :max_width, 160
|
123
|
+
tp projects, 'name', 'type', 'options': lambda {|p| p.options.join ", "}
|
124
|
+
puts
|
111
125
|
end
|
112
126
|
def choices
|
113
|
-
|
114
|
-
{ name: "
|
127
|
+
menu_items = [
|
128
|
+
{ name: "reload all code", value: -> { reload! }},
|
129
|
+
{ name: "[m] Add project", value: -> { go_add_project_menu }},
|
130
|
+
{ name: "[m] Edit existing project", value: -> { go_edit_project_menu }}
|
131
|
+
]
|
132
|
+
if projects.length > 1
|
133
|
+
menu_items.concat([
|
134
|
+
{ name: "[m] edit links", value: -> { go_edit_links_select_project }}
|
135
|
+
])
|
115
136
|
end
|
137
|
+
if projects.length > 0
|
138
|
+
menu_items.concat([
|
139
|
+
{ name: "Save mproj.json", value: -> { go_save_project }},
|
140
|
+
{ name: "Generate", value: -> { go_generate }},
|
141
|
+
{ name: "Build", value: -> { go_build }}
|
142
|
+
])
|
143
|
+
end
|
144
|
+
menu_items
|
145
|
+
end
|
146
|
+
def action = false
|
147
|
+
end
|
148
|
+
|
149
|
+
state :edit_project_menu do
|
150
|
+
def display
|
151
|
+
puts
|
152
|
+
tp.set :max_width, 160
|
153
|
+
tp projects, 'name', 'type', 'options': lambda {|p| p.options.join ", "}
|
154
|
+
puts
|
155
|
+
end
|
156
|
+
def choices
|
116
157
|
[
|
158
|
+
{name: "return to Main Menu", value: -> { go_main_menu }},
|
159
|
+
*(projects.map { |project| { name: "Edit '#{ project.name }' project", value: -> { @selected_rails_project = project ; go_edit_rails_project } } })
|
160
|
+
]
|
161
|
+
end
|
162
|
+
def action = false
|
163
|
+
end
|
164
|
+
|
165
|
+
state :add_project_menu do
|
166
|
+
def display
|
167
|
+
puts
|
168
|
+
tp.set :max_width, 160
|
169
|
+
tp projects, 'name', 'type', 'options': lambda {|p| p.options.join ", "}
|
170
|
+
puts
|
171
|
+
end
|
172
|
+
|
173
|
+
def choices
|
174
|
+
[
|
175
|
+
{name: "return to Main Menu", value: -> { go_main_menu }},
|
117
176
|
{name: "Add prime stack rails project", value: -> { go_add_prime_stack_rails_project }},
|
118
177
|
{name: "Add omakase stack rails project", value: -> { go_add_omakase_stack_rails_project }},
|
119
178
|
{name: "Add rack3 project", value: -> { go_add_rack_project }},
|
@@ -129,24 +188,25 @@ state_machine :state, initial: :intialize do
|
|
129
188
|
#{ name: "Add couchdb instance", value: -> { go_add_couchdb_instance }},
|
130
189
|
#{ name: "Add kafka instance", value: -> { go_add_kafka_instance }},
|
131
190
|
#{ 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 }}
|
191
|
+
#{ name: "Add gitlab instance w/workers", value: -> { go_add_gitlab_instance }}
|
138
192
|
]
|
139
193
|
end
|
140
194
|
def action = false
|
141
195
|
end
|
142
196
|
|
143
197
|
state :edit_links_select_project do
|
144
|
-
def display
|
198
|
+
def display
|
199
|
+
puts
|
200
|
+
tp.set :max_width, 160
|
201
|
+
tp projects, 'name', 'type', 'links': lambda {|p| p.links.join ", "}
|
202
|
+
puts
|
203
|
+
end
|
145
204
|
def choices
|
146
205
|
[
|
147
206
|
{name: "return to Main Menu", value: -> { go_main_menu }},
|
148
207
|
*( projects.map do |project|
|
149
|
-
|
208
|
+
links_txt = project.links.join ", "
|
209
|
+
{ name: "Edit '#{ project.name }' links (#{ links_txt })", value: -> { @selected_project = project ; go_edit_links } }
|
150
210
|
end)
|
151
211
|
]
|
152
212
|
end
|
@@ -164,7 +224,7 @@ state_machine :state, initial: :intialize do
|
|
164
224
|
end
|
165
225
|
end
|
166
226
|
@selected_project.set_links selected
|
167
|
-
|
227
|
+
go_edit_links_select_project
|
168
228
|
end
|
169
229
|
end
|
170
230
|
|
@@ -202,7 +262,8 @@ state_machine :state, initial: :intialize do
|
|
202
262
|
|
203
263
|
state :add_prime_stack_rails_project do
|
204
264
|
def display
|
205
|
-
|
265
|
+
puts "Creates a new rails project, using the prime stack"
|
266
|
+
puts "includes rspec haml factory_bot"
|
206
267
|
end
|
207
268
|
def choices = false
|
208
269
|
def action
|
@@ -214,7 +275,7 @@ state_machine :state, initial: :intialize do
|
|
214
275
|
|
215
276
|
state :add_rack_project do
|
216
277
|
def display
|
217
|
-
|
278
|
+
puts "Creates a new rack project, with a minimal script"
|
218
279
|
end
|
219
280
|
def choices = false
|
220
281
|
def action
|
@@ -274,7 +335,7 @@ state_machine :state, initial: :intialize do
|
|
274
335
|
|
275
336
|
state :toggle_rails_api_mode do
|
276
337
|
def display
|
277
|
-
Mobilis.logger.info "Toggled rails API mode for '#{@selected_rails_project.name}'"
|
338
|
+
Mobilis.logger.info "Toggled rails API mode for '#{ @selected_rails_project.name }'"
|
278
339
|
end
|
279
340
|
def choices = false
|
280
341
|
def action
|
@@ -347,10 +408,10 @@ def initialize
|
|
347
408
|
@project = Project.new
|
348
409
|
end
|
349
410
|
|
350
|
-
|
411
|
+
##
|
412
|
+
# display, choices, and action methods all change per-state
|
351
413
|
def choose_destination
|
352
414
|
Mobilis.logger.info "#choose_destination"
|
353
|
-
|
354
415
|
blank_space
|
355
416
|
spacer
|
356
417
|
display
|
@@ -377,5 +438,19 @@ def blank_space
|
|
377
438
|
puts ""
|
378
439
|
end
|
379
440
|
|
441
|
+
def reload!(print = true)
|
442
|
+
puts 'Reloading ...' if print
|
443
|
+
# Main project directory.
|
444
|
+
root_dir = File.expand_path('../..', __dir__)
|
445
|
+
# Directories within the project that should be reloaded.
|
446
|
+
reload_dirs = %w{lib}
|
447
|
+
# Loop through and reload every file in all relevant project directories.
|
448
|
+
reload_dirs.each do |dir|
|
449
|
+
Dir.glob("#{root_dir}/#{dir}/**/*.rb").each { |f| load(f) }
|
450
|
+
end
|
451
|
+
# Return true when complete.
|
452
|
+
true
|
453
|
+
end
|
454
|
+
|
380
455
|
end
|
381
456
|
end
|
@@ -13,6 +13,17 @@ def child_env_vars
|
|
13
13
|
[ ]
|
14
14
|
end
|
15
15
|
|
16
|
+
def env_vars
|
17
|
+
vars = []
|
18
|
+
if linked_to_rails_project
|
19
|
+
vars << "POSTGRES_DB=#{ linked_to_rails_project.name }_production"
|
20
|
+
end
|
21
|
+
vars.concat [
|
22
|
+
"POSTGRES_USER=#{ name }",
|
23
|
+
"POSTGRES_PASSWORD=#{ password }"
|
24
|
+
]
|
25
|
+
end
|
26
|
+
|
16
27
|
def data_dir
|
17
28
|
"./data/#{ name }"
|
18
29
|
end
|
data/lib/mobilis/project.rb
CHANGED
@@ -99,17 +99,15 @@ source "https://rubygems.org"
|
|
99
99
|
# FIXME
|
100
100
|
#git_source(:github) { |repo| "https://github.com/repo.git" }
|
101
101
|
|
102
|
-
|
103
|
-
|
104
|
-
gem "
|
105
|
-
gem "sqlite3", "~> 1.4"
|
106
|
-
gem "puma", "~> 5.0"
|
102
|
+
gem "rails"
|
103
|
+
gem "sqlite3"
|
104
|
+
gem "puma"
|
107
105
|
gem "jbuilder"
|
108
|
-
gem "redis"
|
106
|
+
gem "redis"
|
109
107
|
gem "kredis"
|
110
|
-
gem "bcrypt"
|
108
|
+
gem "bcrypt"
|
111
109
|
gem "bootsnap", require: false
|
112
|
-
gem "image_processing"
|
110
|
+
gem "image_processing"
|
113
111
|
gem "rack-cors"
|
114
112
|
gem "pg"
|
115
113
|
gem "mysql2"
|
@@ -130,7 +128,7 @@ end
|
|
130
128
|
|
131
129
|
def has_rails_project?
|
132
130
|
projects.each do |p|
|
133
|
-
return true if p.type == :rails
|
131
|
+
return true if p.type.to_sym == :rails
|
134
132
|
end
|
135
133
|
return false
|
136
134
|
end
|
@@ -159,6 +157,11 @@ def build_rails_builder
|
|
159
157
|
run_docker "build -t #{ rails_builder_image } ."
|
160
158
|
end
|
161
159
|
|
160
|
+
def load_from_file filename
|
161
|
+
data = File.read filename
|
162
|
+
@data = JSON.parse data, {:symbolize_names => true}
|
163
|
+
end
|
164
|
+
|
162
165
|
def save_project
|
163
166
|
File.open("mproj.json", "w") do |f|
|
164
167
|
f.write(JSON.pretty_generate(@data))
|
@@ -181,7 +184,7 @@ def projects
|
|
181
184
|
redis: RedisInstance,
|
182
185
|
rack: RackProject
|
183
186
|
}
|
184
|
-
@data[:projects].map {|p| mapping[p[:type]].new p, self}
|
187
|
+
@data[:projects].map {|p| mapping[p[:type].to_sym].new p, self}
|
185
188
|
end
|
186
189
|
|
187
190
|
def project_by_name name
|
data/lib/mobilis/rack_project.rb
CHANGED
@@ -21,7 +21,8 @@ def generate
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def generate_config_ru
|
24
|
-
set_file_contents "config.ru",
|
24
|
+
set_file_contents "config.ru", <<CONFIG_RU
|
25
|
+
# config.ru
|
25
26
|
app = Proc.new {
|
26
27
|
[
|
27
28
|
200,
|
@@ -30,11 +31,12 @@ app = Proc.new {
|
|
30
31
|
]
|
31
32
|
}
|
32
33
|
run app
|
33
|
-
|
34
|
+
CONFIG_RU
|
34
35
|
end
|
35
36
|
|
36
37
|
def generate_Gemfile
|
37
|
-
set_file_contents "Gemfile",
|
38
|
+
set_file_contents "Gemfile", <<GEMFILE
|
39
|
+
# frozen_string_literal: true
|
38
40
|
|
39
41
|
source "https://rubygems.org"
|
40
42
|
|
@@ -43,11 +45,12 @@ source "https://rubygems.org"
|
|
43
45
|
gem "rack", "= 3.0.0.beta1"
|
44
46
|
|
45
47
|
gem "rackup", "~> 0.2.2"
|
46
|
-
|
48
|
+
GEMFILE
|
47
49
|
end
|
48
50
|
|
49
51
|
def generate_Gemfile_lock
|
50
|
-
set_file_contents "Gemfile.lock",
|
52
|
+
set_file_contents "Gemfile.lock", <<GEMFILE_LOCK
|
53
|
+
GEM
|
51
54
|
remote: https://rubygems.org/
|
52
55
|
specs:
|
53
56
|
rack (3.0.0.beta1)
|
@@ -65,11 +68,11 @@ DEPENDENCIES
|
|
65
68
|
|
66
69
|
BUNDLED WITH
|
67
70
|
2.3.16
|
68
|
-
|
71
|
+
GEMFILE_LOCK
|
69
72
|
end
|
70
73
|
|
71
74
|
def generate_Dockerfile
|
72
|
-
set_file_contents "Dockerfile",
|
75
|
+
set_file_contents "Dockerfile", <<DOCKER_END
|
73
76
|
FROM ruby:latest
|
74
77
|
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
|
75
78
|
WORKDIR /myapp
|
@@ -79,10 +82,9 @@ RUN bundle install
|
|
79
82
|
COPY . /myapp
|
80
83
|
|
81
84
|
# Add a script to be executed every time the container starts.
|
82
|
-
ENTRYPOINT ["rackup"]
|
85
|
+
ENTRYPOINT ["rackup", "-o", "#{ name }"]
|
83
86
|
EXPOSE 9292
|
84
|
-
|
85
|
-
'
|
87
|
+
DOCKER_END
|
86
88
|
end
|
87
89
|
|
88
90
|
end
|
@@ -81,6 +81,7 @@ def generate
|
|
81
81
|
install_rspec if options.include? :rspec
|
82
82
|
install_factory_bot if options.include? :factory_bot
|
83
83
|
git_commit_all "add Gems"
|
84
|
+
generate_wait_until
|
84
85
|
generate_Dockerfile
|
85
86
|
generate_entrypoint_sh
|
86
87
|
generate_build_sh
|
@@ -96,10 +97,36 @@ def rails_master_key
|
|
96
97
|
@data[:attributes][:rails_master_key]
|
97
98
|
end
|
98
99
|
|
100
|
+
def generate_wait_until
|
101
|
+
set_file_contents 'wait-until', <<WAITUNTIL
|
102
|
+
#!/usr/bin/env bash
|
103
|
+
# https://github.com/nickjj/wait-until under MIT license
|
104
|
+
|
105
|
+
command="${1}"
|
106
|
+
timeout="${2:-30}"
|
107
|
+
|
108
|
+
i=1
|
109
|
+
until eval "${command}"
|
110
|
+
do
|
111
|
+
((i++))
|
112
|
+
|
113
|
+
if [ "${i}" -gt "${timeout}" ]; then
|
114
|
+
echo "command was never successful, aborting due to ${timeout}s timeout!"
|
115
|
+
exit 1
|
116
|
+
fi
|
117
|
+
|
118
|
+
sleep 1
|
119
|
+
done
|
120
|
+
WAITUNTIL
|
121
|
+
end
|
122
|
+
|
123
|
+
|
99
124
|
def generate_Dockerfile
|
100
|
-
set_file_contents "Dockerfile",
|
101
|
-
|
125
|
+
set_file_contents "Dockerfile", <<DOCKER_END
|
126
|
+
FROM ruby:latest
|
127
|
+
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client default-mysql-client dos2unix
|
102
128
|
WORKDIR /myapp
|
129
|
+
COPY --chmod=0755 wait-until /myapp/wait-until
|
103
130
|
COPY Gemfile /myapp/Gemfile
|
104
131
|
COPY Gemfile.lock /myapp/Gemfile.lock
|
105
132
|
RUN bundle install
|
@@ -113,11 +140,12 @@ RUN dos2unix /myapp/entrypoint.sh
|
|
113
140
|
|
114
141
|
# Configure the main process to run when running the image
|
115
142
|
CMD ["rails", "server", "-b", "0.0.0.0"]
|
116
|
-
|
143
|
+
DOCKER_END
|
117
144
|
end
|
118
145
|
|
119
146
|
def generate_entrypoint_sh
|
120
|
-
set_file_contents "entrypoint.sh",
|
147
|
+
set_file_contents "entrypoint.sh", <<ENTRYPOINT_SH
|
148
|
+
#!/bin/sh
|
121
149
|
|
122
150
|
# https://stackoverflow.com/a/38732187/1935918
|
123
151
|
set -e
|
@@ -125,11 +153,25 @@ set -e
|
|
125
153
|
if [ -f /app/tmp/pids/server.pid ]; then
|
126
154
|
rm /app/tmp/pids/server.pid
|
127
155
|
fi
|
128
|
-
|
156
|
+
#{ wait_until_line }
|
129
157
|
bundle exec rake db:migrate 2>/dev/null || bundle exec rake db:setup
|
130
158
|
|
131
|
-
exec bundle exec
|
132
|
-
|
159
|
+
exec bundle exec "$@"
|
160
|
+
ENTRYPOINT_SH
|
161
|
+
end
|
162
|
+
|
163
|
+
def wait_until_line
|
164
|
+
if database.instance_of? Mobilis::PostgresqlInstance
|
165
|
+
return <<POSTGRES_LINE
|
166
|
+
/myapp/wait-until "psql postgres://#{ database.username }:#{ database.password }@#{ database.name }/#{ name }_production -c 'select 1'"
|
167
|
+
POSTGRES_LINE
|
168
|
+
end
|
169
|
+
# instance_of? is a code smell - maybe this should be database.wait_until_line ?
|
170
|
+
if database.instance_of? Mobilis::MysqlInstance
|
171
|
+
return <<MYSQL_LINE
|
172
|
+
/myapp/wait-until "mysql -D #{ name }_production -h #{ database.name } -u #{ database.username } -p#{ database.password } -e 'select 1'"
|
173
|
+
MYSQL_LINE
|
174
|
+
end
|
133
175
|
end
|
134
176
|
|
135
177
|
def install_rspec
|
data/lib/mobilis/version.rb
CHANGED
data/lib/mobilis.rb
CHANGED
data/mobilis.gemspec
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/mobilis/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "mobilis"
|
7
|
+
spec.version = Mobilis::VERSION
|
8
|
+
spec.authors = ["Meleneth"]
|
9
|
+
spec.email = ["meleneth@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = "Generate and scaffold multiple projects and a docker compose file"
|
12
|
+
spec.homepage = "https://github.com/meleneth/mobilis"
|
13
|
+
spec.required_ruby_version = ">= 2.6.0"
|
14
|
+
spec.licenses = ['MIT']
|
15
|
+
#spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
|
16
|
+
|
17
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
18
|
+
spec.metadata["source_code_uri"] = "https://github.com/meleneth/mobilis"
|
19
|
+
spec.metadata["changelog_uri"] = "https://github.com/meleneth/mobilis/CHANGELOG.md"
|
20
|
+
|
21
|
+
# Specify which files should be added to the gem when it is released.
|
22
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
23
|
+
spec.files = Dir.chdir(__dir__) do
|
24
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
25
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
26
|
+
end
|
27
|
+
end
|
28
|
+
spec.bindir = "exe"
|
29
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
30
|
+
spec.require_paths = ["lib"]
|
31
|
+
spec.executables << 'mobilis'
|
32
|
+
|
33
|
+
# Uncomment to register a new dependency of your gem
|
34
|
+
spec.add_dependency "awesome_print"
|
35
|
+
spec.add_dependency "optimist"
|
36
|
+
spec.add_dependency "pry"
|
37
|
+
spec.add_dependency "state_machine"
|
38
|
+
spec.add_dependency "table_print"
|
39
|
+
spec.add_dependency "tty-prompt"
|
40
|
+
|
41
|
+
spec.add_development_dependency "super_diff"
|
42
|
+
|
43
|
+
# spec.add_dependency "example-gem", "~> 1.0"
|
44
|
+
|
45
|
+
# For more information and examples about making a new gem, check out our
|
46
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
47
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mobilis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Meleneth
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: optimist
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: state_machine
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,7 +67,21 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: table_print
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: tty-prompt
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - ">="
|
@@ -109,6 +123,7 @@ files:
|
|
109
123
|
- Gemfile.lock
|
110
124
|
- README.md
|
111
125
|
- Rakefile
|
126
|
+
- TODO.md
|
112
127
|
- exe/mobilis
|
113
128
|
- lib/mobilis.rb
|
114
129
|
- lib/mobilis/actions_projects_take.rb
|
@@ -126,6 +141,7 @@ files:
|
|
126
141
|
- lib/mobilis/rails_project.rb
|
127
142
|
- lib/mobilis/redis_instance.rb
|
128
143
|
- lib/mobilis/version.rb
|
144
|
+
- mobilis.gemspec
|
129
145
|
- sig/mobilis.rbs
|
130
146
|
homepage: https://github.com/meleneth/mobilis
|
131
147
|
licenses:
|