lotusrb 0.1.0 → 0.2.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 +53 -0
- data/README.md +241 -311
- data/bin/lotus +4 -0
- data/lib/lotus/application.rb +111 -15
- data/lib/lotus/cli.rb +85 -0
- data/lib/lotus/commands/console.rb +62 -0
- data/lib/lotus/commands/new.rb +32 -0
- data/lib/lotus/commands/routes.rb +14 -0
- data/lib/lotus/commands/server.rb +65 -0
- data/lib/lotus/config/assets.rb +24 -10
- data/lib/lotus/config/configure.rb +17 -0
- data/lib/lotus/config/framework_configuration.rb +30 -0
- data/lib/lotus/config/load_paths.rb +1 -1
- data/lib/lotus/config/sessions.rb +97 -0
- data/lib/lotus/configuration.rb +698 -40
- data/lib/lotus/container.rb +30 -0
- data/lib/lotus/environment.rb +377 -0
- data/lib/lotus/frameworks.rb +17 -28
- data/lib/lotus/generators/abstract.rb +31 -0
- data/lib/lotus/generators/application/container/.gitkeep +1 -0
- data/lib/lotus/generators/application/container/Gemfile.tt +29 -0
- data/lib/lotus/generators/application/container/Rakefile.minitest.tt +10 -0
- data/lib/lotus/generators/application/container/config/.env.development.tt +2 -0
- data/lib/lotus/generators/application/container/config/.env.test.tt +2 -0
- data/lib/lotus/generators/application/container/config/.env.tt +1 -0
- data/lib/lotus/generators/application/container/config/environment.rb.tt +7 -0
- data/lib/lotus/generators/application/container/config.ru.tt +3 -0
- data/lib/lotus/generators/application/container/db/.gitkeep +1 -0
- data/lib/lotus/generators/application/container/features_helper.rb.tt +11 -0
- data/lib/lotus/generators/application/container/lib/app_name.rb.tt +31 -0
- data/lib/lotus/generators/application/container/lib/chirp/entities/.gitkeep +1 -0
- data/lib/lotus/generators/application/container/lib/chirp/repositories/.gitkeep +1 -0
- data/lib/lotus/generators/application/container/spec_helper.rb.tt +7 -0
- data/lib/lotus/generators/application/container.rb +70 -0
- data/lib/lotus/generators/slice/.gitkeep.tt +1 -0
- data/lib/lotus/generators/slice/action.rb.tt +8 -0
- data/lib/lotus/generators/slice/application.rb.tt +182 -0
- data/lib/lotus/generators/slice/config/mapping.rb.tt +10 -0
- data/lib/lotus/generators/slice/config/routes.rb.tt +8 -0
- data/lib/lotus/generators/slice/templates/application.html.erb +9 -0
- data/lib/lotus/generators/slice/templates/application.html.erb.tt +9 -0
- data/lib/lotus/generators/slice/templates/template.html.erb.tt +2 -0
- data/lib/lotus/generators/slice/view.rb.tt +5 -0
- data/lib/lotus/generators/slice/views/application_layout.rb.tt +7 -0
- data/lib/lotus/generators/slice.rb +103 -0
- data/lib/lotus/loader.rb +99 -19
- data/lib/lotus/middleware.rb +92 -9
- data/lib/lotus/rendering_policy.rb +42 -19
- data/lib/lotus/routing/default.rb +1 -1
- data/lib/lotus/setup.rb +5 -0
- data/lib/lotus/templates/welcome.html +49 -0
- data/lib/lotus/version.rb +1 -1
- data/lib/lotus/views/default.rb +13 -0
- data/lib/lotus/views/default_template_finder.rb +19 -0
- data/lib/lotus/welcome.rb +14 -0
- data/lib/lotus.rb +1 -0
- data/lotusrb.gemspec +9 -5
- metadata +122 -36
@@ -0,0 +1 @@
|
|
1
|
+
#
|
@@ -0,0 +1,182 @@
|
|
1
|
+
module <%= config[:classified_slice_name] %>
|
2
|
+
class Application < Lotus::Application
|
3
|
+
configure do
|
4
|
+
##
|
5
|
+
# BASIC
|
6
|
+
#
|
7
|
+
|
8
|
+
# Define the root path of this application.
|
9
|
+
# All the paths specified in this configuration are relative to this one.
|
10
|
+
#
|
11
|
+
root __dir__
|
12
|
+
|
13
|
+
# Relative load paths where this application will recursively load the code.
|
14
|
+
# Remember to add directories here when you create new.
|
15
|
+
#
|
16
|
+
load_paths << [
|
17
|
+
'controllers',
|
18
|
+
'views'
|
19
|
+
]
|
20
|
+
|
21
|
+
# Handle exceptions with HTTP statuses (true) or don't catch them (false).
|
22
|
+
# Defaults to true.
|
23
|
+
# See: http://www.rubydoc.info/gems/lotus-controller/#Exceptions_management
|
24
|
+
#
|
25
|
+
# handle_exceptions true
|
26
|
+
|
27
|
+
##
|
28
|
+
# HTTP
|
29
|
+
#
|
30
|
+
|
31
|
+
# Routes definitions for this application
|
32
|
+
# See: http://www.rubydoc.info/gems/lotus-router#Usage
|
33
|
+
#
|
34
|
+
routes 'config/routes'
|
35
|
+
|
36
|
+
# URI scheme used by the routing system to generate absolute URLs
|
37
|
+
# Defaults to "http"
|
38
|
+
#
|
39
|
+
# scheme 'https'
|
40
|
+
|
41
|
+
# URI host used by the routing system to generate absolute URLs
|
42
|
+
# Defaults to "localhost"
|
43
|
+
#
|
44
|
+
# host 'example.org'
|
45
|
+
|
46
|
+
# URI port used by the routing system to generate absolute URLs
|
47
|
+
# Argument: An object coercible to integer, default to 80 if the scheme is http and 443 if it's https
|
48
|
+
# This SHOULD be configured only in case the application listens to that non standard ports
|
49
|
+
#
|
50
|
+
# port 443
|
51
|
+
|
52
|
+
# Enable cookies
|
53
|
+
#
|
54
|
+
# cookies true
|
55
|
+
|
56
|
+
# Enable sessions
|
57
|
+
# Argument: Symbol the Rack session adapter
|
58
|
+
# A Hash with options
|
59
|
+
#
|
60
|
+
# See: http://www.rubydoc.info/gems/rack/Rack/Session/Cookie
|
61
|
+
#
|
62
|
+
# sessions :cookie, secret: ENV['<%= config[:upcase_slice_name] %>_SESSIONS_SECRET']
|
63
|
+
|
64
|
+
# Configure Rack middleware for this application
|
65
|
+
#
|
66
|
+
# middleware.use Rack::Protection
|
67
|
+
|
68
|
+
# Default format for the requests that don't specify an HTTP_ACCEPT header
|
69
|
+
# Argument: A symbol representation of a mime type, default to :html
|
70
|
+
#
|
71
|
+
# default_format :html
|
72
|
+
|
73
|
+
# HTTP Body parsers
|
74
|
+
# Parse non GET responses body for a specific mime type
|
75
|
+
# Argument: Symbol, which represent the format of the mime type (only `:json` is supported)
|
76
|
+
# Object, the parser
|
77
|
+
#
|
78
|
+
# body_parsers :json
|
79
|
+
|
80
|
+
##
|
81
|
+
# DATABASE
|
82
|
+
#
|
83
|
+
|
84
|
+
# Configure a database adapter
|
85
|
+
# Argument: A Hash with the settings
|
86
|
+
# type: Symbol, :file_system, :memory and :sql
|
87
|
+
# uri: String, 'file:///db/bookshelf'
|
88
|
+
# 'memory://localhost/bookshelf'
|
89
|
+
# 'sqlite:memory:'
|
90
|
+
# 'sqlite://db/bookshelf.db'
|
91
|
+
# 'postgres://localhost/bookshelf'
|
92
|
+
# 'mysql://localhost/bookshelf'
|
93
|
+
#
|
94
|
+
# adapter type: :file_system, uri: ENV['<%= config[:upcase_slice_name] %>_DATABASE_URL']
|
95
|
+
|
96
|
+
# Configure a database mapping
|
97
|
+
# See: http://www.rubydoc.info/gems/lotus-model#Data_Mapper
|
98
|
+
#
|
99
|
+
# mapping 'config/mapping'
|
100
|
+
|
101
|
+
##
|
102
|
+
# TEMPLATES
|
103
|
+
#
|
104
|
+
|
105
|
+
# The layout to be used by all the views
|
106
|
+
#
|
107
|
+
layout :application # It will load <%= config[:classified_slice_name] %>::Views::ApplicationLayout
|
108
|
+
|
109
|
+
# The relative path where to find the templates
|
110
|
+
#
|
111
|
+
# templates 'templates'
|
112
|
+
|
113
|
+
##
|
114
|
+
# ASSETS
|
115
|
+
#
|
116
|
+
|
117
|
+
# Specify sources for assets
|
118
|
+
# The directory `public/` is added by default
|
119
|
+
#
|
120
|
+
# assets << [
|
121
|
+
# 'vendor/javascripts'
|
122
|
+
# ]
|
123
|
+
|
124
|
+
# Enabling serving assets
|
125
|
+
# Defaults to false
|
126
|
+
#
|
127
|
+
# serve_assets false
|
128
|
+
|
129
|
+
##
|
130
|
+
# FRAMEWORKS
|
131
|
+
#
|
132
|
+
|
133
|
+
# Configure the code to be yielded each time <%= config[:classified_slice_name] %>::Action will be included
|
134
|
+
# This is useful for share common functionalities
|
135
|
+
#
|
136
|
+
# See: http://www.rubydoc.info/gems/lotus-controller#Configuration
|
137
|
+
controller.prepare do
|
138
|
+
# include MyAuthentication # included in all the actions
|
139
|
+
# before :authenticate! # run an authentication before callback
|
140
|
+
end
|
141
|
+
|
142
|
+
# Configure the code to be yielded each time <%= config[:classified_slice_name] %>::View will be included
|
143
|
+
# This is useful for share common functionalities
|
144
|
+
#
|
145
|
+
# See: http://www.rubydoc.info/gems/lotus-view#Configuration
|
146
|
+
view.prepare do
|
147
|
+
# include MyRoutingHelpers # included in all the views
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# DEVELOPMENT
|
153
|
+
#
|
154
|
+
configure :development do
|
155
|
+
# Don't handle exceptions, render the stack trace
|
156
|
+
handle_exceptions false
|
157
|
+
|
158
|
+
# Serve static assets during development
|
159
|
+
serve_assets true
|
160
|
+
end
|
161
|
+
|
162
|
+
##
|
163
|
+
# TEST
|
164
|
+
#
|
165
|
+
configure :test do
|
166
|
+
# Don't handle exceptions, render the stack trace
|
167
|
+
handle_exceptions false
|
168
|
+
|
169
|
+
# Serve static assets during development
|
170
|
+
serve_assets true
|
171
|
+
end
|
172
|
+
|
173
|
+
##
|
174
|
+
# PRODUCTION
|
175
|
+
#
|
176
|
+
configure :production do
|
177
|
+
# scheme 'https'
|
178
|
+
# host 'example.org'
|
179
|
+
# port 443
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# Configure your routes here
|
2
|
+
# See: http://www.rubydoc.info/gems/lotus-router/#Usage
|
3
|
+
#
|
4
|
+
#
|
5
|
+
#
|
6
|
+
# This route will look for `<%= config[:classified_slice_name] %>::Controllers::Home::Index` action in `apps/<%= config[:slice_name] %>/controllers/home/index.rb`.
|
7
|
+
# Please, uncomment the following line to have a working example.
|
8
|
+
# get '/', to: 'home#index'
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'lotus/generators/abstract'
|
3
|
+
require 'lotus/utils/string'
|
4
|
+
|
5
|
+
module Lotus
|
6
|
+
module Generators
|
7
|
+
class Slice < Abstract
|
8
|
+
def initialize(command)
|
9
|
+
super
|
10
|
+
|
11
|
+
@slice_name = options.fetch(:application)
|
12
|
+
@upcase_slice_name = @slice_name.upcase
|
13
|
+
@classified_slice_name = Utils::String.new(@slice_name).classify
|
14
|
+
|
15
|
+
@source = Pathname.new(::File.dirname(__FILE__) + '/../generators/slice')
|
16
|
+
@target = target.join('apps', @slice_name)
|
17
|
+
|
18
|
+
@slice_base_url = options.fetch(:application_base_url)
|
19
|
+
|
20
|
+
cli.class.source_root(@source)
|
21
|
+
end
|
22
|
+
|
23
|
+
def start
|
24
|
+
opts = {
|
25
|
+
slice_name: @slice_name,
|
26
|
+
upcase_slice_name: @upcase_slice_name,
|
27
|
+
classified_slice_name: @classified_slice_name,
|
28
|
+
slice_base_url: @slice_base_url
|
29
|
+
}
|
30
|
+
|
31
|
+
templates = {
|
32
|
+
'application.rb.tt' => 'application.rb',
|
33
|
+
'config/routes.rb.tt' => 'config/routes.rb',
|
34
|
+
'config/mapping.rb.tt' => 'config/mapping.rb',
|
35
|
+
'action.rb.tt' => 'controllers/home/index.rb',
|
36
|
+
'views/application_layout.rb.tt' => 'views/application_layout.rb',
|
37
|
+
'templates/application.html.erb.tt' => 'templates/application.html.erb',
|
38
|
+
'view.rb.tt' => 'views/home/index.rb',
|
39
|
+
'templates/template.html.erb.tt' => 'templates/home/index.html.erb',
|
40
|
+
}
|
41
|
+
|
42
|
+
empty_directories = [
|
43
|
+
"public/javascripts",
|
44
|
+
"public/stylesheets"
|
45
|
+
]
|
46
|
+
|
47
|
+
case options[:test]
|
48
|
+
when 'rspec'
|
49
|
+
else # minitest (default)
|
50
|
+
empty_directories << [
|
51
|
+
"../../spec/#{ opts[:slice_name] }/features",
|
52
|
+
"../../spec/#{ opts[:slice_name] }/controllers",
|
53
|
+
"../../spec/#{ opts[:slice_name] }/views"
|
54
|
+
]
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# config/environment.rb
|
59
|
+
#
|
60
|
+
|
61
|
+
# Add "require_relative '../apps/web/application'"
|
62
|
+
cli.gsub_file target.join('config/environment.rb'), /require_relative (.*)/ do |match|
|
63
|
+
match << "\nrequire_relative '../apps/#{ opts[:slice_name] }/application'"
|
64
|
+
end
|
65
|
+
|
66
|
+
# Mount slice inside "Lotus::Container.configure"
|
67
|
+
cli.gsub_file target.join('config/environment.rb'), /(mount (.*)|Lotus::Container.configure do)/ do |match|
|
68
|
+
match << "\n mount #{ opts[:classified_slice_name] }::Application, at: '#{ opts[:slice_base_url] }'"
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Per environment .env
|
73
|
+
#
|
74
|
+
['development', 'test'].each do |environment|
|
75
|
+
# Add WEB_DATABASE_URL="file:///db/web_development"
|
76
|
+
cli.append_to_file target.join("config/.env.#{ environment }") do
|
77
|
+
%(#{ opts[:upcase_slice_name] }_DATABASE_URL="file:///db/#{ opts[:slice_name] }_#{ environment }"\n)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Add WEB_SESSIONS_SECRET="abc123" (random hex)
|
81
|
+
cli.append_to_file target.join("config/.env.#{ environment }") do
|
82
|
+
%(#{ opts[:upcase_slice_name] }_SESSIONS_SECRET="#{ SecureRandom.hex(32) }"\n)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
##
|
87
|
+
# New files
|
88
|
+
#
|
89
|
+
templates.each do |src, dst|
|
90
|
+
cli.template(@source.join(src), @target.join(dst), opts)
|
91
|
+
end
|
92
|
+
|
93
|
+
##
|
94
|
+
# Empty directories
|
95
|
+
#
|
96
|
+
empty_directories.flatten.each do |dir|
|
97
|
+
gitkeep = '.gitkeep'
|
98
|
+
cli.template(@source.join(gitkeep), @target.join(dir, gitkeep), opts)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/lib/lotus/loader.rb
CHANGED
@@ -3,6 +3,8 @@ require 'lotus/utils/kernel'
|
|
3
3
|
require 'lotus/utils/string'
|
4
4
|
require 'lotus/routes'
|
5
5
|
require 'lotus/routing/default'
|
6
|
+
require 'lotus/action/cookies'
|
7
|
+
require 'lotus/action/session'
|
6
8
|
|
7
9
|
module Lotus
|
8
10
|
# Load an application
|
@@ -20,9 +22,10 @@ module Lotus
|
|
20
22
|
def load!
|
21
23
|
@mutex.synchronize do
|
22
24
|
load_configuration!
|
25
|
+
configure_frameworks!
|
26
|
+
load_configuration_load_paths!
|
27
|
+
load_rack!
|
23
28
|
load_frameworks!
|
24
|
-
load_application!
|
25
|
-
finalize!
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
@@ -33,34 +36,109 @@ module Lotus
|
|
33
36
|
configuration.load!(application_module)
|
34
37
|
end
|
35
38
|
|
36
|
-
def
|
39
|
+
def configure_frameworks!
|
40
|
+
_configure_model_framework! if defined?(Lotus::Model)
|
41
|
+
_configure_controller_framework!
|
42
|
+
_configure_view_framework!
|
43
|
+
end
|
44
|
+
|
45
|
+
def _configure_controller_framework!
|
37
46
|
config = configuration
|
47
|
+
unless namespace.const_defined?('Controller')
|
48
|
+
controller = Lotus::Controller.duplicate(namespace) do
|
49
|
+
handle_exceptions config.handle_exceptions
|
50
|
+
default_format config.default_format
|
38
51
|
|
39
|
-
|
40
|
-
|
41
|
-
|
52
|
+
prepare { include Lotus::Action::Cookies } if config.cookies
|
53
|
+
prepare { include Lotus::Action::Session } if config.sessions.enabled?
|
54
|
+
|
55
|
+
config.controller.__apply(self)
|
42
56
|
end
|
43
57
|
|
44
|
-
|
58
|
+
namespace.const_set('Controller', controller)
|
45
59
|
end
|
60
|
+
end
|
46
61
|
|
47
|
-
|
48
|
-
|
62
|
+
def _configure_view_framework!
|
63
|
+
config = configuration
|
64
|
+
unless namespace.const_defined?('View')
|
65
|
+
view = Lotus::View.duplicate(namespace) do
|
49
66
|
root config.templates
|
50
67
|
layout config.layout
|
68
|
+
|
69
|
+
config.view.__apply(self)
|
51
70
|
end
|
52
71
|
|
53
|
-
|
72
|
+
namespace.const_set('View', view)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def _configure_model_framework!
|
77
|
+
config = configuration
|
78
|
+
if _lotus_model_loaded? && !application_module.const_defined?('Model')
|
79
|
+
model = Lotus::Model.duplicate(application_module) do
|
80
|
+
adapter(config.adapter) if config.adapter
|
81
|
+
mapping(&config.mapping) if config.mapping
|
82
|
+
|
83
|
+
config.model.__apply(self)
|
84
|
+
end
|
85
|
+
|
86
|
+
application_module.const_set('Model', model)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
def load_frameworks!
|
92
|
+
_load_view_framework!
|
93
|
+
_load_model_framework!
|
94
|
+
end
|
95
|
+
|
96
|
+
def _load_view_framework!
|
97
|
+
namespace.module_eval %{
|
98
|
+
#{ namespace }::View.load!
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
def _load_model_framework!
|
103
|
+
return unless _load_model_framework?
|
104
|
+
|
105
|
+
application_module.module_eval %{
|
106
|
+
#{ application_module }::Model.load!
|
107
|
+
}
|
108
|
+
end
|
109
|
+
|
110
|
+
def _load_model_framework?
|
111
|
+
if _lotus_model_loaded? && application_module.const_defined?('Model')
|
112
|
+
model = application_module.const_get('Model')
|
113
|
+
model.configuration.adapter
|
54
114
|
end
|
55
115
|
end
|
56
116
|
|
57
|
-
def
|
117
|
+
def _lotus_model_loaded?
|
118
|
+
defined?(Lotus::Model)
|
119
|
+
end
|
120
|
+
|
121
|
+
def load_configuration_load_paths!
|
58
122
|
configuration.load_paths.load!(configuration.root)
|
59
|
-
|
123
|
+
end
|
60
124
|
|
125
|
+
def load_rack!
|
126
|
+
return if application.is_a?(Class)
|
127
|
+
_assign_rendering_policy!
|
128
|
+
_assign_rack_routes!
|
129
|
+
_load_rack_middleware!
|
130
|
+
_assign_routes_to_application_module!
|
131
|
+
end
|
132
|
+
|
133
|
+
def _assign_rendering_policy!
|
134
|
+
application.renderer = RenderingPolicy.new(configuration)
|
135
|
+
end
|
136
|
+
|
137
|
+
def _assign_rack_routes!
|
61
138
|
resolver = Lotus::Routing::EndpointResolver.new(pattern: configuration.controller_pattern, namespace: namespace)
|
62
139
|
default_app = Lotus::Routing::Default.new
|
63
140
|
application.routes = Lotus::Router.new(
|
141
|
+
parsers: configuration.body_parsers,
|
64
142
|
resolver: resolver,
|
65
143
|
default_app: default_app,
|
66
144
|
scheme: configuration.scheme,
|
@@ -68,25 +146,27 @@ module Lotus
|
|
68
146
|
port: configuration.port,
|
69
147
|
&configuration.routes
|
70
148
|
)
|
149
|
+
end
|
71
150
|
|
72
|
-
|
151
|
+
def _load_rack_middleware!
|
152
|
+
configuration.middleware.load!(application, namespace)
|
73
153
|
end
|
74
154
|
|
75
|
-
def
|
155
|
+
def _assign_routes_to_application_module!
|
76
156
|
unless application_module.const_defined?('Routes')
|
77
157
|
routes = Lotus::Routes.new(application.routes)
|
78
158
|
application_module.const_set('Routes', routes)
|
79
159
|
end
|
80
|
-
|
81
|
-
application_module.module_eval %{
|
82
|
-
#{ application_module }::View.load!
|
83
|
-
}
|
84
160
|
end
|
85
161
|
|
86
162
|
def application_module
|
87
163
|
@application_module ||= Utils::Class.load!(
|
88
|
-
Utils::String.new(application.
|
164
|
+
Utils::String.new(application.name).namespace
|
89
165
|
)
|
90
166
|
end
|
167
|
+
|
168
|
+
def namespace
|
169
|
+
configuration.namespace || application_module
|
170
|
+
end
|
91
171
|
end
|
92
172
|
end
|
data/lib/lotus/middleware.rb
CHANGED
@@ -6,7 +6,7 @@ module Lotus
|
|
6
6
|
class Middleware
|
7
7
|
# Instantiate a middleware stack
|
8
8
|
#
|
9
|
-
# @param
|
9
|
+
# @param configuration [Lotus::Configuration] the application's configuration
|
10
10
|
#
|
11
11
|
# @return [Lotus::Middleware] the new stack
|
12
12
|
#
|
@@ -14,16 +14,29 @@ module Lotus
|
|
14
14
|
# @api private
|
15
15
|
#
|
16
16
|
# @see Lotus::Configuration
|
17
|
-
|
18
|
-
|
19
|
-
configuration =
|
20
|
-
|
17
|
+
def initialize(configuration)
|
18
|
+
@stack = []
|
19
|
+
@configuration = configuration
|
20
|
+
end
|
21
21
|
|
22
|
+
# Load the middleware stack
|
23
|
+
#
|
24
|
+
# @param application [Lotus::Application] the application loading the middleware
|
25
|
+
#
|
26
|
+
# @return [Lotus::Middleware] the loaded middleware stack
|
27
|
+
#
|
28
|
+
# @since 0.2.0
|
29
|
+
# @api private
|
30
|
+
#
|
31
|
+
# @see http://rdoc.info/gems/rack/Rack/Builder
|
32
|
+
def load!(application, namespace)
|
33
|
+
@namespace = namespace
|
22
34
|
@builder = ::Rack::Builder.new
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
35
|
+
load_default_stack(application)
|
36
|
+
@stack.each { |m, args, block| @builder.use load_middleware(m), *args, &block }
|
37
|
+
@builder.run application.routes
|
38
|
+
|
39
|
+
self
|
27
40
|
end
|
28
41
|
|
29
42
|
# Process a request.
|
@@ -38,5 +51,75 @@ module Lotus
|
|
38
51
|
def call(env)
|
39
52
|
@builder.call(env)
|
40
53
|
end
|
54
|
+
|
55
|
+
# Add a middleware to the stack.
|
56
|
+
#
|
57
|
+
# @param middleware [Object] a Rack middleware
|
58
|
+
# @param *args [Array] optional arguments to pass to the Rack middleware
|
59
|
+
# @param &blk [Proc] an optional block to pass to the Rack middleware
|
60
|
+
#
|
61
|
+
# @return [Array] the middleware that was added
|
62
|
+
#
|
63
|
+
# @since 0.2.0
|
64
|
+
def use(middleware, *args, &blk)
|
65
|
+
@stack << [middleware, args, blk]
|
66
|
+
end
|
67
|
+
|
68
|
+
# @api private
|
69
|
+
# @since 0.2.0
|
70
|
+
def load_middleware(middleware)
|
71
|
+
case middleware
|
72
|
+
when String
|
73
|
+
@namespace.const_get(middleware)
|
74
|
+
else
|
75
|
+
middleware
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# @api private
|
80
|
+
# @since 0.2.0
|
81
|
+
def load_default_stack(application)
|
82
|
+
@default_stack_loaded ||= begin
|
83
|
+
_load_session_middleware
|
84
|
+
_load_asset_middlewares
|
85
|
+
_load_default_welcome_page_for(application)
|
86
|
+
use Rack::MethodOverride
|
87
|
+
|
88
|
+
true
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Default welcome page
|
93
|
+
#
|
94
|
+
# @api private
|
95
|
+
# @since 0.2.0
|
96
|
+
def _load_default_welcome_page_for(application)
|
97
|
+
unless application.routes.defined?
|
98
|
+
require 'lotus/welcome'
|
99
|
+
use Lotus::Welcome
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Add session middleware
|
104
|
+
#
|
105
|
+
# @api private
|
106
|
+
# @since 0.2.0
|
107
|
+
def _load_session_middleware
|
108
|
+
if @configuration.sessions.enabled?
|
109
|
+
use(*@configuration.sessions.middleware)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Add asset middlewares
|
114
|
+
#
|
115
|
+
# @api private
|
116
|
+
# #since 0.2.0
|
117
|
+
def _load_asset_middlewares
|
118
|
+
if @configuration.serve_assets
|
119
|
+
@configuration.assets.entries.each do |path, children|
|
120
|
+
use Rack::Static, urls: children, root: path
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
41
124
|
end
|
42
125
|
end
|