lotusrb 0.3.2 → 0.4.0
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 +20 -0
- data/FEATURES.md +17 -0
- data/README.md +16 -355
- data/lib/lotus.rb +0 -1
- data/lib/lotus/action/csrf_protection.rb +167 -0
- data/lib/lotus/application.rb +3 -1
- data/lib/lotus/cli.rb +14 -13
- data/lib/lotus/commands/console.rb +1 -1
- data/lib/lotus/commands/db.rb +102 -0
- data/lib/lotus/commands/db/abstract.rb +15 -0
- data/lib/lotus/commands/db/apply.rb +14 -0
- data/lib/lotus/commands/db/console.rb +1 -5
- data/lib/lotus/commands/db/create.rb +14 -0
- data/lib/lotus/commands/db/drop.rb +14 -0
- data/lib/lotus/commands/db/migrate.rb +19 -0
- data/lib/lotus/commands/db/prepare.rb +14 -0
- data/lib/lotus/commands/db/version.rb +14 -0
- data/lib/lotus/commands/generate.rb +20 -20
- data/lib/lotus/commands/new.rb +1 -0
- data/lib/lotus/commands/routes.rb +1 -2
- data/lib/lotus/configuration.rb +29 -0
- data/lib/lotus/container.rb +19 -3
- data/lib/lotus/environment.rb +62 -9
- data/lib/lotus/frameworks.rb +1 -0
- data/lib/lotus/generators/action.rb +46 -10
- 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 +2 -1
- data/lib/lotus/generators/action/view_spec.rspec.tt +2 -1
- data/lib/lotus/generators/app.rb +39 -0
- data/lib/lotus/generators/app/.gitkeep +1 -0
- data/lib/lotus/generators/application/app.rb +184 -0
- data/lib/lotus/generators/application/app/.env.development.tt +3 -0
- data/lib/lotus/generators/application/app/.env.test.tt +3 -0
- data/lib/lotus/generators/application/{container/config → app}/.env.tt +0 -0
- data/lib/lotus/generators/application/app/.gitkeep +1 -0
- data/lib/lotus/generators/application/app/Gemfile.tt +35 -0
- data/lib/lotus/generators/application/app/Rakefile.minitest.tt +10 -0
- data/lib/lotus/generators/application/app/Rakefile.rspec.tt +5 -0
- data/lib/lotus/generators/application/app/apps/.gitkeep.tt +1 -0
- data/lib/lotus/generators/application/app/capybara.rb.rspec.tt +8 -0
- data/lib/lotus/generators/application/app/config.ru.tt +3 -0
- data/lib/lotus/generators/application/app/config/application.rb.tt +227 -0
- data/lib/lotus/generators/application/app/config/environment.rb.tt +5 -0
- data/lib/lotus/generators/application/app/config/routes.rb.tt +2 -0
- data/lib/lotus/generators/application/app/db/.gitkeep +1 -0
- data/lib/lotus/generators/application/app/features_helper.rb.minitest.tt +11 -0
- data/lib/lotus/generators/application/app/features_helper.rb.rspec.tt +12 -0
- data/lib/lotus/generators/application/app/gitignore.tt +2 -0
- data/lib/lotus/generators/application/app/lib/app_name.rb.tt +47 -0
- data/lib/lotus/generators/application/app/lib/chirp/entities/.gitkeep +1 -0
- data/lib/lotus/generators/application/app/lib/chirp/repositories/.gitkeep +1 -0
- data/lib/lotus/generators/application/app/lib/config/mapping.rb.tt +7 -0
- data/lib/lotus/generators/application/app/lotusrc.tt +3 -0
- data/lib/lotus/generators/application/app/rspec.rspec.tt +2 -0
- data/lib/lotus/generators/application/app/schema.sql.tt +0 -0
- data/lib/lotus/generators/application/app/spec_helper.rb.minitest.tt +7 -0
- data/lib/lotus/generators/application/app/spec_helper.rb.rspec.tt +100 -0
- data/lib/lotus/generators/application/app/templates/application.html.erb.tt +9 -0
- data/lib/lotus/generators/application/app/views/application_layout.rb.tt +7 -0
- data/lib/lotus/generators/application/container.rb +37 -13
- data/lib/lotus/generators/application/container/{config/.env.development.tt → .env.development.tt} +0 -0
- data/lib/lotus/generators/application/container/{config/.env.test.tt → .env.test.tt} +0 -0
- data/lib/lotus/generators/application/container/.env.tt +1 -0
- data/lib/lotus/generators/application/container/lib/app_name.rb.tt +9 -0
- data/lib/lotus/generators/application/container/schema.sql.tt +0 -0
- data/lib/lotus/generators/migration.rb +58 -0
- data/lib/lotus/generators/migration/migration.rb.tt +4 -0
- data/lib/lotus/generators/model.rb +10 -7
- data/lib/lotus/generators/slice.rb +4 -12
- data/lib/lotus/generators/slice/application.rb.tt +3 -19
- data/lib/lotus/generators/slice/config/routes.rb.tt +1 -7
- data/lib/lotus/loader.rb +15 -1
- data/lib/lotus/lotusrc.rb +8 -3
- data/lib/lotus/templates/{welcome.html → welcome.html.erb} +4 -3
- data/lib/lotus/version.rb +1 -1
- data/lib/lotus/welcome.rb +20 -1
- data/lotusrb.gemspec +5 -5
- metadata +67 -18
- data/lib/lotus/generators/slice/action.rb.tt +0 -8
- data/lib/lotus/generators/slice/config/mapping.rb.tt +0 -13
- data/lib/lotus/generators/slice/templates/template.html.erb.tt +0 -2
- data/lib/lotus/generators/slice/view.rb.tt +0 -5
- data/lib/lotus/logger.rb +0 -141
@@ -10,8 +10,7 @@ module Lotus
|
|
10
10
|
# @since 0.3.0
|
11
11
|
# @api private
|
12
12
|
GENERATORS_NAMESPACE = "Lotus::Generators::%s".freeze
|
13
|
-
|
14
|
-
SLICE_TYPE = 'slice'.freeze
|
13
|
+
APP_ARCHITECTURE = 'app'.freeze
|
15
14
|
|
16
15
|
# @since 0.3.0
|
17
16
|
# @api private
|
@@ -20,21 +19,23 @@ module Lotus
|
|
20
19
|
|
21
20
|
# @since 0.3.0
|
22
21
|
# @api private
|
23
|
-
attr_reader :cli, :source, :target, :app, :app_name, :name, :options
|
22
|
+
attr_reader :cli, :source, :target, :app, :app_name, :name, :options, :env
|
24
23
|
|
25
24
|
# @since 0.3.0
|
26
25
|
# @api private
|
27
26
|
def initialize(type, app_name, name, env, cli)
|
28
27
|
@cli = cli
|
28
|
+
@env = env
|
29
29
|
@name = name
|
30
|
+
@options = env.to_options.merge(cli.options)
|
31
|
+
|
32
|
+
sanitize_input(app_name, name)
|
33
|
+
@type = type
|
30
34
|
|
31
|
-
@type = sanitize_type(type)
|
32
|
-
@app_name = app_name
|
33
35
|
@source = Pathname.new(::File.dirname(__FILE__) + "/../generators/#{ @type }/").realpath
|
34
36
|
@target = Pathname.pwd.realpath
|
35
37
|
|
36
38
|
@app = Utils::String.new(@app_name).classify
|
37
|
-
@options = sanitize_app_name_options(app_name).merge(env.to_options.merge(cli.options))
|
38
39
|
end
|
39
40
|
|
40
41
|
# @since 0.3.0
|
@@ -49,7 +50,11 @@ module Lotus
|
|
49
50
|
# @since 0.3.0
|
50
51
|
# @api private
|
51
52
|
def app_root
|
52
|
-
@app_root ||=
|
53
|
+
@app_root ||= begin
|
54
|
+
result = Pathname.new(@options[:apps_path])
|
55
|
+
result = result.join(@app_name) if @env.container?
|
56
|
+
result
|
57
|
+
end
|
53
58
|
end
|
54
59
|
|
55
60
|
# @since 0.3.0
|
@@ -74,19 +79,14 @@ module Lotus
|
|
74
79
|
Utils::Class.load!(GENERATORS_NAMESPACE % class_name).new(self)
|
75
80
|
end
|
76
81
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
# @since 0.3.1
|
87
|
-
# @api private
|
88
|
-
def sanitize_type(type)
|
89
|
-
type == APP ? SLICE_TYPE : type
|
82
|
+
def sanitize_input(app_name, name)
|
83
|
+
if options[:architecture] == APP_ARCHITECTURE
|
84
|
+
@app_name = nil
|
85
|
+
@name = app_name
|
86
|
+
else
|
87
|
+
@app_name = app_name
|
88
|
+
@name = name
|
89
|
+
end
|
90
90
|
end
|
91
91
|
end
|
92
92
|
end
|
data/lib/lotus/commands/new.rb
CHANGED
@@ -2,11 +2,10 @@ module Lotus
|
|
2
2
|
module Commands
|
3
3
|
class Routes
|
4
4
|
def initialize(environment)
|
5
|
-
|
5
|
+
environment.require_application_environment
|
6
6
|
end
|
7
7
|
|
8
8
|
def start
|
9
|
-
require @environment.env_config
|
10
9
|
puts Lotus::Container.new.routes.inspector.to_s
|
11
10
|
end
|
12
11
|
end
|
data/lib/lotus/configuration.rb
CHANGED
@@ -108,6 +108,21 @@ module Lotus
|
|
108
108
|
@security ||= Config::Security.new
|
109
109
|
end
|
110
110
|
|
111
|
+
# Force ssl redirection if http scheme is set
|
112
|
+
#
|
113
|
+
# @return [Boolean]
|
114
|
+
#
|
115
|
+
# @since 0.4.0
|
116
|
+
#
|
117
|
+
# @see Lotus::Routing::ForceSsl
|
118
|
+
def force_ssl(value = nil)
|
119
|
+
if value
|
120
|
+
@force_ssl = value
|
121
|
+
else
|
122
|
+
@force_ssl || false
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
111
126
|
# The root of the application
|
112
127
|
#
|
113
128
|
# By default it returns the current directory, for this reason, **all the
|
@@ -1627,6 +1642,20 @@ module Lotus
|
|
1627
1642
|
@view ||= Config::FrameworkConfiguration.new
|
1628
1643
|
end
|
1629
1644
|
|
1645
|
+
# This options is used as a bridge between container and router application.
|
1646
|
+
#
|
1647
|
+
# @return [String, NilClass] path prefix for routes
|
1648
|
+
#
|
1649
|
+
# @since 0.4.0
|
1650
|
+
# @api private
|
1651
|
+
def path_prefix(value = nil)
|
1652
|
+
if value.nil?
|
1653
|
+
@path_prefix
|
1654
|
+
else
|
1655
|
+
@path_prefix = value
|
1656
|
+
end
|
1657
|
+
end
|
1658
|
+
|
1630
1659
|
private
|
1631
1660
|
# @since 0.2.0
|
1632
1661
|
# @api private
|
data/lib/lotus/container.rb
CHANGED
@@ -3,16 +3,32 @@ require 'lotus/router'
|
|
3
3
|
|
4
4
|
module Lotus
|
5
5
|
class Container
|
6
|
+
class Router < ::Lotus::Router
|
7
|
+
def mount(app, options)
|
8
|
+
app = app.new(path_prefix: options.fetch(:at)) if lotus_app?(app)
|
9
|
+
super(app, options)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def lotus_app?(app)
|
15
|
+
app.ancestors.include? Lotus::Application
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
6
19
|
attr_reader :routes
|
7
20
|
|
8
|
-
def self.configure(&blk)
|
9
|
-
Mutex.new.synchronize
|
21
|
+
def self.configure(options = {}, &blk)
|
22
|
+
Mutex.new.synchronize do
|
23
|
+
@@options = options
|
24
|
+
@@configuration = blk
|
25
|
+
end
|
10
26
|
end
|
11
27
|
|
12
28
|
def initialize
|
13
29
|
Mutex.new.synchronize do
|
14
30
|
assert_configuration_presence!
|
15
|
-
@routes =
|
31
|
+
@routes = Router.new(&@@configuration)
|
16
32
|
end
|
17
33
|
end
|
18
34
|
|
data/lib/lotus/environment.rb
CHANGED
@@ -94,6 +94,22 @@ module Lotus
|
|
94
94
|
# @api private
|
95
95
|
CODE_RELOADING = { 'development' => true }.freeze
|
96
96
|
|
97
|
+
# @since 0.4.0
|
98
|
+
# @api private
|
99
|
+
CONTAINER = 'container'.freeze
|
100
|
+
|
101
|
+
# @since 0.4.0
|
102
|
+
# @api private
|
103
|
+
CONTAINER_PATH = 'apps'.freeze
|
104
|
+
|
105
|
+
# @since 0.4.0
|
106
|
+
# @api private
|
107
|
+
APPLICATION = 'app'.freeze
|
108
|
+
|
109
|
+
# @since 0.4.0
|
110
|
+
# @api private
|
111
|
+
APPLICATION_PATH = 'app'.freeze
|
112
|
+
|
97
113
|
# Initialize a Lotus environment
|
98
114
|
#
|
99
115
|
# It accepts an optional set of configurations from the CLI commands.
|
@@ -121,17 +137,17 @@ module Lotus
|
|
121
137
|
#
|
122
138
|
# @example Define ENV variables from .env
|
123
139
|
#
|
124
|
-
# # % tree
|
125
|
-
# #
|
140
|
+
# # % tree .
|
141
|
+
# # .
|
142
|
+
# # # ...
|
126
143
|
# # ├── .env
|
127
|
-
# #
|
128
|
-
# # └── environment.rb
|
144
|
+
# # └── .env.development
|
129
145
|
#
|
130
|
-
# # % cat
|
146
|
+
# # % cat .env
|
131
147
|
# # FOO="bar"
|
132
148
|
# # XYZ="yes"
|
133
149
|
#
|
134
|
-
# # % cat
|
150
|
+
# # % cat .env.development
|
135
151
|
# # FOO="ok"
|
136
152
|
#
|
137
153
|
# require 'lotus/environment'
|
@@ -156,7 +172,7 @@ module Lotus
|
|
156
172
|
# # the one defined in the parent (eg `FOO` is overwritten). All the
|
157
173
|
# # other settings (eg `XYZ`) will be left untouched.
|
158
174
|
def initialize(options = {})
|
159
|
-
@options = Lotus::Lotusrc.new(root).read
|
175
|
+
@options = Lotus::Lotusrc.new(root, options).read
|
160
176
|
@options.merge! Utils::Hash.new(options).symbolize!
|
161
177
|
@mutex = Mutex.new
|
162
178
|
@mutex.synchronize { set_env_vars! }
|
@@ -315,6 +331,16 @@ module Lotus
|
|
315
331
|
root.join(@options.fetch(:environment) { config.join(DEFAULT_ENVIRONMENT_CONFIG) })
|
316
332
|
end
|
317
333
|
|
334
|
+
# Require application environment
|
335
|
+
#
|
336
|
+
# Eg <tt>require "config/environment"</tt>.
|
337
|
+
#
|
338
|
+
# @since 0.4.0
|
339
|
+
# @api private
|
340
|
+
def require_application_environment
|
341
|
+
require env_config.to_s
|
342
|
+
end
|
343
|
+
|
318
344
|
# Determine if activate code reloading for the current environment while
|
319
345
|
# running the server.
|
320
346
|
#
|
@@ -337,6 +363,32 @@ module Lotus
|
|
337
363
|
@options.fetch(:code_reloading) { !!CODE_RELOADING[environment] }
|
338
364
|
end
|
339
365
|
|
366
|
+
# @since 0.4.0
|
367
|
+
# @api private
|
368
|
+
def architecture
|
369
|
+
@options.fetch(:architecture) {
|
370
|
+
puts "Cannot recognize Lotus architecture, please check `.lotusrc'"
|
371
|
+
exit 1
|
372
|
+
}
|
373
|
+
end
|
374
|
+
|
375
|
+
# @since 0.4.0
|
376
|
+
# @api private
|
377
|
+
def container?
|
378
|
+
architecture == CONTAINER
|
379
|
+
end
|
380
|
+
|
381
|
+
# @since 0.4.0
|
382
|
+
# @api private
|
383
|
+
def apps_path
|
384
|
+
@options.fetch(:path) {
|
385
|
+
case architecture
|
386
|
+
when CONTAINER then CONTAINER_PATH
|
387
|
+
when APPLICATION then APPLICATION_PATH
|
388
|
+
end
|
389
|
+
}
|
390
|
+
end
|
391
|
+
|
340
392
|
# Serialize the most relevant settings into a Hash
|
341
393
|
#
|
342
394
|
# @return [Lotus::Utils::Hash]
|
@@ -347,6 +399,7 @@ module Lotus
|
|
347
399
|
@options.merge(
|
348
400
|
environment: environment,
|
349
401
|
env_config: env_config,
|
402
|
+
apps_path: apps_path,
|
350
403
|
rackup: rackup,
|
351
404
|
host: host,
|
352
405
|
port: port
|
@@ -373,8 +426,8 @@ module Lotus
|
|
373
426
|
# @since 0.2.0
|
374
427
|
# @api private
|
375
428
|
def set_application_env_vars!
|
376
|
-
Dotenv.load
|
377
|
-
Dotenv.overload
|
429
|
+
Dotenv.load root.join(DEFAULT_DOTENV)
|
430
|
+
Dotenv.overload root.join(DEFAULT_DOTENV_ENV % environment)
|
378
431
|
end
|
379
432
|
|
380
433
|
# @since 0.1.0
|
data/lib/lotus/frameworks.rb
CHANGED
@@ -42,12 +42,14 @@ module Lotus
|
|
42
42
|
assert_action!
|
43
43
|
|
44
44
|
opts = {
|
45
|
-
app:
|
46
|
-
controller:
|
47
|
-
action:
|
48
|
-
action_path:
|
49
|
-
|
50
|
-
|
45
|
+
app: app,
|
46
|
+
controller: @controller_name,
|
47
|
+
action: @action_name,
|
48
|
+
action_path: _action_path_without_suffix,
|
49
|
+
relative_action_path: _relative_action_path,
|
50
|
+
relative_view_path: _relative_view_path,
|
51
|
+
view_path: _view_path_without_suffix,
|
52
|
+
template_path: _template_path,
|
51
53
|
}
|
52
54
|
|
53
55
|
test_type = case options[:test]
|
@@ -98,6 +100,15 @@ module Lotus
|
|
98
100
|
end
|
99
101
|
end
|
100
102
|
|
103
|
+
def app
|
104
|
+
if env.container?
|
105
|
+
super
|
106
|
+
else
|
107
|
+
env.require_application_environment
|
108
|
+
Utils::String.new(Lotus::Application.applications.first).namespace
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
101
112
|
# @since 0.3.0
|
102
113
|
# @api private
|
103
114
|
def generate_route
|
@@ -108,14 +119,21 @@ module Lotus
|
|
108
119
|
|
109
120
|
# Insert at the top of the file
|
110
121
|
cli.insert_into_file _routes_path, before: /\A(.*)/ do
|
111
|
-
"get '
|
122
|
+
"get '#{ _route_url }', to: '#{ @name }'\n"
|
112
123
|
end
|
113
124
|
end
|
114
125
|
|
126
|
+
# @since 0.4.0
|
127
|
+
# @api private
|
128
|
+
def _route_url
|
129
|
+
options.fetch(:url, "/#{ @controller }")
|
130
|
+
end
|
131
|
+
|
115
132
|
# @since 0.3.0
|
116
133
|
# @api private
|
117
134
|
def _routes_path
|
118
|
-
|
135
|
+
routes_root = env.container? ? app_root : env.root
|
136
|
+
routes_root.join("config", "routes#{ SUFFIX }")
|
119
137
|
end
|
120
138
|
|
121
139
|
# @since 0.3.0
|
@@ -151,13 +169,31 @@ module Lotus
|
|
151
169
|
# @since 0.3.0
|
152
170
|
# @api private
|
153
171
|
def _action_spec_path
|
154
|
-
spec_root.join(app_name, 'controllers', @controller, "#{ @action }_spec#{ SUFFIX }")
|
172
|
+
spec_root.join(app_name.to_s, 'controllers', @controller, "#{ @action }_spec#{ SUFFIX }")
|
155
173
|
end
|
156
174
|
|
157
175
|
# @since 0.3.0
|
158
176
|
# @api private
|
159
177
|
def _view_spec_path
|
160
|
-
spec_root.join(app_name, 'views', @controller, "#{ @action }_spec#{ SUFFIX }")
|
178
|
+
spec_root.join(app_name.to_s, 'views', @controller, "#{ @action }_spec#{ SUFFIX }")
|
179
|
+
end
|
180
|
+
|
181
|
+
# @since 0.4.0
|
182
|
+
# @api private
|
183
|
+
def _relative_action_path
|
184
|
+
result = '../../../'
|
185
|
+
result << '../' if env.container?
|
186
|
+
result << _action_path_without_suffix.to_s
|
187
|
+
result
|
188
|
+
end
|
189
|
+
|
190
|
+
# @since 0.4.0
|
191
|
+
# @api private
|
192
|
+
def _relative_view_path
|
193
|
+
result = '../../../'
|
194
|
+
result << '../' if env.container?
|
195
|
+
result << _view_path_without_suffix.to_s
|
196
|
+
result
|
161
197
|
end
|
162
198
|
end
|
163
199
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require_relative '
|
2
|
+
require_relative '<%= config[:relative_action_path] %>'
|
3
3
|
|
4
4
|
describe <%= config[:app] %>::Controllers::<%= config[:controller] %>::<%= config[:action] %> do
|
5
5
|
let(:action) { <%= config[:app] %>::Controllers::<%= config[:controller] %>::<%= config[:action] %>.new }
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require_relative '
|
2
|
+
require_relative '<%= config[:relative_action_path] %>'
|
3
3
|
|
4
4
|
describe <%= config[:app] %>::Controllers::<%= config[:controller] %>::<%= config[:action] %> do
|
5
5
|
let(:action) { <%= config[:app] %>::Controllers::<%= config[:controller] %>::<%= config[:action] %>.new }
|