lotusrb 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +57 -14
- data/FEATURES.md +21 -0
- data/LICENSE.md +1 -1
- data/README.md +8 -7
- data/bin/lotus +1 -0
- data/lib/lotus.rb +6 -0
- data/lib/lotus/action/csrf_protection.rb +1 -1
- data/lib/lotus/application.rb +4 -4
- data/lib/lotus/application_name.rb +8 -6
- data/lib/lotus/cli.rb +75 -66
- data/lib/lotus/cli_sub_commands/assets.rb +29 -0
- data/lib/lotus/{commands → cli_sub_commands}/db.rb +24 -29
- data/lib/lotus/cli_sub_commands/destroy.rb +102 -0
- data/lib/lotus/cli_sub_commands/generate.rb +127 -0
- data/lib/lotus/commands/assets/precompile.rb +35 -0
- data/lib/lotus/commands/console.rb +28 -8
- data/lib/lotus/commands/db/abstract.rb +6 -2
- data/lib/lotus/commands/db/console.rb +5 -5
- data/lib/lotus/commands/generate/abstract.rb +63 -0
- data/lib/lotus/commands/generate/action.rb +262 -0
- data/lib/lotus/commands/generate/app.rb +116 -0
- data/lib/lotus/commands/generate/mailer.rb +118 -0
- data/lib/lotus/commands/generate/migration.rb +63 -0
- data/lib/lotus/commands/generate/model.rb +96 -0
- data/lib/lotus/commands/new/abstract.rb +128 -0
- data/lib/lotus/commands/new/app.rb +116 -0
- data/lib/lotus/commands/new/container.rb +102 -0
- data/lib/lotus/commands/routes.rb +19 -2
- data/lib/lotus/commands/server.rb +16 -2
- data/lib/lotus/config/framework_configuration.rb +13 -1
- data/lib/lotus/configuration.rb +24 -76
- data/lib/lotus/container.rb +15 -2
- data/lib/lotus/environment.rb +43 -4
- data/lib/lotus/frameworks.rb +1 -0
- data/lib/lotus/generators/action/action_spec.minitest.tt +1 -1
- data/lib/lotus/generators/action/action_spec.rspec.tt +1 -1
- data/lib/lotus/generators/action/view_spec.minitest.tt +1 -1
- data/lib/lotus/generators/action/view_spec.rspec.tt +1 -1
- data/lib/lotus/generators/{slice → app}/.gitkeep.tt +0 -0
- data/lib/lotus/generators/{slice → app}/application.rb.tt +61 -23
- data/lib/lotus/generators/app/config/initializers/.gitkeep +0 -0
- data/lib/lotus/generators/{slice → app}/config/routes.rb.tt +0 -0
- data/lib/lotus/generators/app/favicon.ico +0 -0
- data/lib/lotus/generators/{slice → app}/templates/application.html.erb.tt +2 -1
- data/lib/lotus/generators/app/views/application_layout.rb.tt +7 -0
- data/lib/lotus/generators/application/app/.env.development.tt +1 -0
- data/lib/lotus/generators/application/app/.env.test.tt +1 -0
- data/lib/lotus/generators/application/app/Gemfile.tt +1 -0
- data/lib/lotus/generators/application/app/Rakefile.minitest.tt +1 -0
- data/lib/lotus/generators/application/app/Rakefile.rspec.tt +1 -0
- data/lib/lotus/generators/application/app/config/application.rb.tt +56 -18
- data/lib/lotus/generators/application/app/config/initializers/.gitkeep +0 -0
- data/lib/lotus/generators/application/app/favicon.ico +0 -0
- data/lib/lotus/generators/application/app/gitignore.tt +2 -0
- data/lib/lotus/generators/application/app/lotusrc.tt +3 -3
- data/lib/lotus/generators/application/app/spec_helper.rb.rspec.tt +5 -1
- data/lib/lotus/generators/application/app/templates/application.html.erb.tt +1 -0
- data/lib/lotus/generators/application/container/.env.development.tt +1 -0
- data/lib/lotus/generators/application/container/.env.test.tt +1 -0
- data/lib/lotus/generators/application/container/Gemfile.tt +1 -1
- data/lib/lotus/generators/application/container/Rakefile.minitest.tt +1 -0
- data/lib/lotus/generators/application/container/Rakefile.rspec.tt +1 -0
- data/lib/lotus/generators/application/container/config/initializers/.gitkeep +0 -0
- data/lib/lotus/generators/application/container/gitignore.tt +2 -0
- data/lib/lotus/generators/application/container/lib/chirp/mailers/.gitkeep +0 -0
- data/lib/lotus/generators/application/container/lib/chirp/mailers/templates/.gitkeep +0 -0
- data/lib/lotus/generators/application/container/lotusrc.tt +3 -3
- data/lib/lotus/generators/application/container/spec_helper.rb.rspec.tt +5 -1
- data/lib/lotus/generators/database_config.rb +17 -4
- data/lib/lotus/generators/generatable.rb +51 -0
- data/lib/lotus/generators/generator.rb +35 -0
- data/lib/lotus/generators/test_framework.rb +42 -0
- data/lib/lotus/loader.rb +43 -0
- data/lib/lotus/lotusrc.rb +50 -49
- data/lib/lotus/middleware.rb +28 -10
- data/lib/lotus/rake_helper.rb +68 -0
- data/lib/lotus/rake_tasks.rb +2 -0
- data/lib/lotus/rendering_policy.rb +2 -2
- data/lib/lotus/repositories/car_repository.rb +3 -0
- data/lib/lotus/repositories/name_repository.rb +3 -0
- data/lib/lotus/setup.rb +1 -3
- data/lib/lotus/static.rb +77 -0
- data/lib/lotus/templates/welcome.html.erb +7 -4
- data/lib/lotus/version.rb +1 -1
- data/lib/lotus/views/default.rb +2 -1
- data/lib/lotus/views/default_template_finder.rb +4 -3
- data/lotusrb.gemspec +11 -9
- metadata +79 -60
- data/lib/lotus/commands/generate.rb +0 -97
- data/lib/lotus/commands/new.rb +0 -43
- data/lib/lotus/config/assets.rb +0 -81
- data/lib/lotus/generators/abstract.rb +0 -31
- data/lib/lotus/generators/action.rb +0 -235
- data/lib/lotus/generators/app.rb +0 -39
- data/lib/lotus/generators/app/.gitkeep +0 -1
- data/lib/lotus/generators/application/app.rb +0 -129
- data/lib/lotus/generators/application/container.rb +0 -111
- data/lib/lotus/generators/mailer.rb +0 -112
- data/lib/lotus/generators/migration.rb +0 -58
- data/lib/lotus/generators/model.rb +0 -90
- data/lib/lotus/generators/slice.rb +0 -94
- data/lib/lotus/generators/slice/views/application_layout.rb.tt +0 -7
@@ -2,8 +2,12 @@ module Lotus
|
|
2
2
|
module Commands
|
3
3
|
class DB
|
4
4
|
class Abstract
|
5
|
-
|
6
|
-
|
5
|
+
attr_reader :environment
|
6
|
+
|
7
|
+
def initialize(options)
|
8
|
+
@options = options
|
9
|
+
@environment = Lotus::Environment.new(options)
|
10
|
+
@environment.require_application_environment
|
7
11
|
end
|
8
12
|
|
9
13
|
def start
|
@@ -1,16 +1,16 @@
|
|
1
1
|
require 'lotus/utils/class'
|
2
|
+
require 'lotus/commands/db/abstract'
|
2
3
|
|
3
4
|
module Lotus
|
4
5
|
module Commands
|
5
6
|
class DB
|
6
|
-
class Console
|
7
|
-
attr_reader :name, :env_options
|
7
|
+
class Console < Abstract
|
8
|
+
attr_reader :name, :env_options
|
8
9
|
|
9
|
-
def initialize(
|
10
|
+
def initialize(options, name)
|
11
|
+
super(options)
|
10
12
|
@name = name
|
11
|
-
@environment = environment
|
12
13
|
@env_options = environment.to_options
|
13
|
-
@environment.require_application_environment
|
14
14
|
end
|
15
15
|
|
16
16
|
def start
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'lotus/environment'
|
2
|
+
require 'lotus/generators/generatable'
|
3
|
+
require 'lotus/generators/test_framework'
|
4
|
+
require 'lotus/version'
|
5
|
+
require 'lotus/utils/string'
|
6
|
+
|
7
|
+
module Lotus
|
8
|
+
module Commands
|
9
|
+
class Generate
|
10
|
+
class Abstract
|
11
|
+
|
12
|
+
include Lotus::Generators::Generatable
|
13
|
+
|
14
|
+
attr_reader :options, :target_path
|
15
|
+
|
16
|
+
def initialize(options)
|
17
|
+
@options = Lotus::Utils::Hash.new(options).symbolize!
|
18
|
+
assert_options!
|
19
|
+
|
20
|
+
@target_path = Pathname.pwd
|
21
|
+
end
|
22
|
+
|
23
|
+
def template_source_path
|
24
|
+
generator = self.class.name.split('::').last.downcase
|
25
|
+
Pathname.new(::File.dirname(__FILE__) + "/../../generators/#{generator}/").realpath
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def test_framework
|
31
|
+
@test_framework ||= Lotus::Generators::TestFramework.new(lotusrc, options[:test])
|
32
|
+
end
|
33
|
+
|
34
|
+
def lotusrc_options
|
35
|
+
lotusrc.options
|
36
|
+
end
|
37
|
+
|
38
|
+
def lotusrc
|
39
|
+
@lotusrc ||= Lotusrc.new(target_path)
|
40
|
+
end
|
41
|
+
|
42
|
+
def environment
|
43
|
+
@environment ||= Lotus::Environment.new(options)
|
44
|
+
end
|
45
|
+
|
46
|
+
def template_engine
|
47
|
+
options.fetch(:template, default_template_engine)
|
48
|
+
end
|
49
|
+
|
50
|
+
def default_template_engine
|
51
|
+
lotusrc_options.fetch(:template)
|
52
|
+
end
|
53
|
+
|
54
|
+
def assert_options!
|
55
|
+
if options.nil?
|
56
|
+
raise ArgumentError.new('options must not be nil')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,262 @@
|
|
1
|
+
require 'lotus/commands/generate/abstract'
|
2
|
+
require 'lotus/routing/route'
|
3
|
+
|
4
|
+
module Lotus
|
5
|
+
module Commands
|
6
|
+
class Generate
|
7
|
+
class Action < Abstract
|
8
|
+
|
9
|
+
# @since 0.5.0
|
10
|
+
# @api private
|
11
|
+
ACTION_SEPARATOR = /[\/,#]/
|
12
|
+
|
13
|
+
# @since 0.5.0
|
14
|
+
# @api private
|
15
|
+
ROUTE_ENDPOINT_SEPARATOR = '#'.freeze
|
16
|
+
|
17
|
+
# @since 0.5.0
|
18
|
+
# @api private
|
19
|
+
QUOTED_NAME = /(\"|\'|\\)/
|
20
|
+
|
21
|
+
# Default HTTP method used when generating an action.
|
22
|
+
#
|
23
|
+
# @since 0.5.0
|
24
|
+
# @api private
|
25
|
+
DEFAULT_HTTP_METHOD = 'GET'.freeze
|
26
|
+
|
27
|
+
# HTTP methods used when generating resourceful actions.
|
28
|
+
#
|
29
|
+
# @since 0.6.0
|
30
|
+
# @api private
|
31
|
+
RESOURCEFUL_HTTP_METHODS = {
|
32
|
+
'Create' => 'POST',
|
33
|
+
'Update' => 'PATCH',
|
34
|
+
'Destroy' => 'DELETE'
|
35
|
+
}.freeze
|
36
|
+
|
37
|
+
# For resourceful actions, what to add to the end of the base URL
|
38
|
+
#
|
39
|
+
# @since 0.6.0
|
40
|
+
# @api private
|
41
|
+
RESOURCEFUL_ROUTE_URL_SUFFIXES = {
|
42
|
+
'Show' => '/:id',
|
43
|
+
'Update' => '/:id',
|
44
|
+
'Destroy' => '/:id',
|
45
|
+
'New' => '/new',
|
46
|
+
'Edit' => '/:id/edit',
|
47
|
+
}.freeze
|
48
|
+
|
49
|
+
def initialize(options, application_name, controller_and_action_name)
|
50
|
+
super(options)
|
51
|
+
if !environment.container?
|
52
|
+
application_name = File.basename(Dir.pwd)
|
53
|
+
end
|
54
|
+
|
55
|
+
controller_and_action_name = Utils::String.new(controller_and_action_name).underscore.gsub(QUOTED_NAME, '')
|
56
|
+
|
57
|
+
*controller_name, action_name = controller_and_action_name.split(ACTION_SEPARATOR)
|
58
|
+
|
59
|
+
@application_name = Utils::String.new(application_name).classify
|
60
|
+
@controller_name = Utils::String.new(controller_name.join("/")).classify
|
61
|
+
@action_name = Utils::String.new(action_name).classify
|
62
|
+
@controller_pathname = Utils::String.new(@controller_name).underscore
|
63
|
+
|
64
|
+
assert_application_name!
|
65
|
+
assert_controller_name!
|
66
|
+
assert_action_name!
|
67
|
+
assert_http_method!
|
68
|
+
end
|
69
|
+
|
70
|
+
def map_templates
|
71
|
+
add_mapping("action_spec.#{test_framework.framework}.tt", action_spec_path)
|
72
|
+
|
73
|
+
if skip_view?
|
74
|
+
add_mapping('action_without_view.rb.tt', action_path)
|
75
|
+
else
|
76
|
+
add_mapping('action.rb.tt', action_path)
|
77
|
+
add_mapping('view.rb.tt', view_path)
|
78
|
+
add_mapping('template.tt', template_path)
|
79
|
+
add_mapping("view_spec.#{test_framework.framework}.tt", view_spec_path)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def post_process_templates
|
84
|
+
generate_route
|
85
|
+
end
|
86
|
+
|
87
|
+
# @since 0.5.0
|
88
|
+
# @api private
|
89
|
+
def template_options
|
90
|
+
{
|
91
|
+
app: @application_name,
|
92
|
+
controller: @controller_name,
|
93
|
+
action: @action_name,
|
94
|
+
relative_action_path: relative_action_path,
|
95
|
+
relative_view_path: relative_view_path,
|
96
|
+
template_path: template_path,
|
97
|
+
}
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
# @since 0.5.0
|
103
|
+
# @api private
|
104
|
+
def generate_route
|
105
|
+
routes_path.dirname.mkpath
|
106
|
+
FileUtils.touch(routes_path)
|
107
|
+
|
108
|
+
generator.prepend_to_file(routes_path, "#{ http_method } '#{ route_url }', to: '#{ route_endpoint }'\n")
|
109
|
+
end
|
110
|
+
|
111
|
+
def skip_view?
|
112
|
+
options.fetch(:skip_view, false)
|
113
|
+
end
|
114
|
+
|
115
|
+
# @since 0.5.0
|
116
|
+
# @api private
|
117
|
+
def http_method
|
118
|
+
options.fetch(:method, resourceful_http_method).downcase
|
119
|
+
end
|
120
|
+
|
121
|
+
# @since 0.6.0
|
122
|
+
# @api private
|
123
|
+
def resourceful_http_method
|
124
|
+
RESOURCEFUL_HTTP_METHODS.fetch(@action_name, DEFAULT_HTTP_METHOD)
|
125
|
+
end
|
126
|
+
|
127
|
+
# @since 0.5.0
|
128
|
+
# @api private
|
129
|
+
def route_url
|
130
|
+
options.fetch(:url, "/#{ @controller_pathname }#{ resourceful_route_url_suffix }")
|
131
|
+
end
|
132
|
+
|
133
|
+
# @since 0.6.0
|
134
|
+
# @api private
|
135
|
+
def resourceful_route_url_suffix
|
136
|
+
RESOURCEFUL_ROUTE_URL_SUFFIXES.fetch(@action_name, "")
|
137
|
+
end
|
138
|
+
|
139
|
+
# @since 0.5.0
|
140
|
+
# @api private
|
141
|
+
def route_endpoint
|
142
|
+
"#{ @controller_pathname }#{ ROUTE_ENDPOINT_SEPARATOR }#{ @action_name }".downcase
|
143
|
+
end
|
144
|
+
|
145
|
+
# @since 0.5.0
|
146
|
+
# @api private
|
147
|
+
def known_application_names
|
148
|
+
Dir.glob(applications_path.join('/*')).map do |name|
|
149
|
+
File.basename(name)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# @since 0.5.0
|
154
|
+
# @api private
|
155
|
+
def assert_controller_name!
|
156
|
+
if @controller_name.nil? || @controller_name.empty?
|
157
|
+
raise ArgumentError.new("Unknown controller, please add controllers name with this syntax controller_name#action_name")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# @since 0.5.0
|
162
|
+
# @api private
|
163
|
+
def assert_action_name!
|
164
|
+
if @action_name.nil? || @action_name.strip == ''
|
165
|
+
raise ArgumentError.new("Unknown action, please add actions name with this syntax controller_name#action_name")
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# @since 0.5.0
|
170
|
+
# @api private
|
171
|
+
def assert_application_name!
|
172
|
+
return if !environment.container?
|
173
|
+
if @application_name.nil? || @application_name.strip == '' || !application_path.exist?
|
174
|
+
existing_apps = known_application_names.join('/')
|
175
|
+
raise ArgumentError.new("Unknown app: `#{ @application_name.downcase }'. Please specify one of (#{ existing_apps }) as application name")
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
# @since 0.5.0
|
180
|
+
# @api private
|
181
|
+
def assert_http_method!
|
182
|
+
if !Lotus::Routing::Route::VALID_HTTP_VERBS.include?(http_method.upcase)
|
183
|
+
existing_http_methods = Lotus::Routing::Route::VALID_HTTP_VERBS
|
184
|
+
raise ArgumentError.new("Unknown HTTP method '#{http_method}', please use one of #{ existing_http_methods.join('/') }.")
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def routes_path
|
189
|
+
if environment.container?
|
190
|
+
application_path.join('config', 'routes.rb')
|
191
|
+
else
|
192
|
+
application_path.join('..', 'config', 'routes.rb')
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
# The directory of the application
|
197
|
+
# ./app for 'app' architecture
|
198
|
+
# ./apps/APPLICATION_NAME for 'container'
|
199
|
+
def application_path
|
200
|
+
if environment.container?
|
201
|
+
applications_path.join(application_name_as_snake_case)
|
202
|
+
else
|
203
|
+
Pathname.new('app')
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
# The parent dir of the application directory.
|
208
|
+
def applications_path
|
209
|
+
Pathname.new('apps')
|
210
|
+
end
|
211
|
+
|
212
|
+
def view_path
|
213
|
+
application_path.join('views', @controller_pathname, "#{@action_name.downcase}.rb")
|
214
|
+
end
|
215
|
+
|
216
|
+
def view_spec_path
|
217
|
+
spec_root.join('views', @controller_pathname, "#{@action_name.downcase}_spec.rb")
|
218
|
+
end
|
219
|
+
|
220
|
+
def template_path
|
221
|
+
application_path.join('templates', @controller_pathname, "#{@action_name.downcase}.html.#{template_engine}")
|
222
|
+
end
|
223
|
+
|
224
|
+
def action_path
|
225
|
+
application_path.join('controllers', @controller_pathname, "#{@action_name.downcase}.rb")
|
226
|
+
end
|
227
|
+
|
228
|
+
def action_spec_path
|
229
|
+
spec_root.join('controllers', @controller_pathname, "#{ @action_name.downcase}_spec.rb")
|
230
|
+
end
|
231
|
+
|
232
|
+
def spec_root
|
233
|
+
Pathname.new('spec').join(app_base_dir)
|
234
|
+
end
|
235
|
+
|
236
|
+
def relative_action_path
|
237
|
+
path = Pathname.new('.').join('..', '..', '..')
|
238
|
+
path = path.join('..') if environment.container?
|
239
|
+
path.join(application_path, 'controllers', @controller_pathname, @action_name.downcase)
|
240
|
+
end
|
241
|
+
|
242
|
+
def relative_view_path
|
243
|
+
path = Pathname.new('.').join('..', '..', '..')
|
244
|
+
path = path.join('..') if environment.container?
|
245
|
+
path.join(application_path, 'views', @controller_pathname, @action_name.downcase)
|
246
|
+
end
|
247
|
+
|
248
|
+
def app_base_dir
|
249
|
+
if environment.container?
|
250
|
+
application_name_as_snake_case
|
251
|
+
else
|
252
|
+
''
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
def application_name_as_snake_case
|
257
|
+
@application_name.gsub(/(.)([A-Z])/,'\1_\2').downcase
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'lotus/commands/generate/abstract'
|
2
|
+
require 'lotus/application_name'
|
3
|
+
require 'securerandom'
|
4
|
+
|
5
|
+
module Lotus
|
6
|
+
module Commands
|
7
|
+
class Generate
|
8
|
+
class App < Abstract
|
9
|
+
|
10
|
+
attr_reader :base_path
|
11
|
+
|
12
|
+
def initialize(options, application_name)
|
13
|
+
super(options)
|
14
|
+
|
15
|
+
assert_application_name!(application_name)
|
16
|
+
assert_architecture!
|
17
|
+
|
18
|
+
@application_name = ApplicationName.new(application_name)
|
19
|
+
@base_path = Pathname.pwd
|
20
|
+
end
|
21
|
+
|
22
|
+
def map_templates
|
23
|
+
add_mapping('application.rb.tt', 'application.rb')
|
24
|
+
add_mapping('config/routes.rb.tt', 'config/routes.rb')
|
25
|
+
add_mapping('views/application_layout.rb.tt', 'views/application_layout.rb')
|
26
|
+
add_mapping('templates/application.html.erb.tt', 'templates/application.html.erb')
|
27
|
+
add_mapping('favicon.ico', 'assets/favicon.ico')
|
28
|
+
|
29
|
+
add_mapping('.gitkeep', 'controllers/.gitkeep')
|
30
|
+
add_mapping('.gitkeep', 'assets/images/.gitkeep')
|
31
|
+
add_mapping('.gitkeep', 'assets/javascripts/.gitkeep')
|
32
|
+
add_mapping('.gitkeep', 'assets/stylesheets/.gitkeep')
|
33
|
+
add_mapping('.gitkeep', "../../spec/#{ app_name }/features/.gitkeep")
|
34
|
+
add_mapping('.gitkeep', "../../spec/#{ app_name }/controllers/.gitkeep")
|
35
|
+
add_mapping('.gitkeep', "../../spec/#{ app_name }/views/.gitkeep")
|
36
|
+
end
|
37
|
+
|
38
|
+
def template_options
|
39
|
+
{
|
40
|
+
app_name: app_name,
|
41
|
+
upcase_app_name: upcase_app_name,
|
42
|
+
classified_app_name: classified_app_name,
|
43
|
+
app_base_url: application_base_url,
|
44
|
+
app_base_path: application_base_path,
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
def post_process_templates
|
49
|
+
add_require_app
|
50
|
+
add_mount_app
|
51
|
+
add_web_session_secret
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def application_base_url
|
57
|
+
options.fetch(:application_base_url, "/#{app_name}")
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_require_app
|
61
|
+
# Add "require_relative '../apps/web/application'"
|
62
|
+
generator.inject_into_file base_path.join('config/environment.rb'), after: /require_relative '\.\.\/lib\/(.*)'/ do
|
63
|
+
"\nrequire_relative '../apps/#{ app_name }/application'"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_mount_app
|
68
|
+
generator.inject_into_file base_path.join('config/environment.rb'), after: /Lotus::Container.configure do/ do |match|
|
69
|
+
"\n mount #{ classified_app_name }::Application, at: '#{ application_base_url }'"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def add_web_session_secret
|
74
|
+
['development', 'test'].each do |environment|
|
75
|
+
# Add WEB_SESSIONS_SECRET="abc123" (random hex)
|
76
|
+
generator.append_to_file base_path.join(".env.#{ environment }") do
|
77
|
+
%(#{ upcase_app_name }_SESSIONS_SECRET="#{ SecureRandom.hex(32) }"\n)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def target_path
|
83
|
+
base_path.join(application_base_path)
|
84
|
+
end
|
85
|
+
|
86
|
+
def app_name
|
87
|
+
@application_name.to_s
|
88
|
+
end
|
89
|
+
|
90
|
+
def upcase_app_name
|
91
|
+
@application_name.to_env_s
|
92
|
+
end
|
93
|
+
|
94
|
+
def application_base_path
|
95
|
+
["apps", @application_name].join(::File::SEPARATOR)
|
96
|
+
end
|
97
|
+
|
98
|
+
def classified_app_name
|
99
|
+
Utils::String.new(app_name).classify
|
100
|
+
end
|
101
|
+
|
102
|
+
def assert_application_name!(value)
|
103
|
+
if value.nil? || value.strip.empty?
|
104
|
+
raise ArgumentError.new('Application name is nil or empty')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def assert_architecture!
|
109
|
+
if !environment.container?
|
110
|
+
raise ArgumentError.new('App generator is only available for container architecture.')
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|