lotusrb 0.1.0 → 0.2.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 +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
data/README.md
CHANGED
@@ -2,6 +2,20 @@
|
|
2
2
|
|
3
3
|
A complete web framework for Ruby
|
4
4
|
|
5
|
+
## Frameworks
|
6
|
+
|
7
|
+
Lotus combines together small but yet powerful frameworks:
|
8
|
+
|
9
|
+
* [**Lotus::Utils**](https://github.com/lotus/utils) - Ruby core extentions and class utilities
|
10
|
+
* [**Lotus::Router**](https://github.com/lotus/router) - Rack compatible HTTP router for Ruby
|
11
|
+
* [**Lotus::Validations**](https://github.com/lotus/validations) - Validation mixin for Ruby objects
|
12
|
+
* [**Lotus::Model**](https://github.com/lotus/model) - Persistence with entities, repositories and data mapper
|
13
|
+
* [**Lotus::View**](https://github.com/lotus/view) - Presentation with a separation between views and templates
|
14
|
+
* [**Lotus::Controller**](https://github.com/lotus/controller) - Full featured, fast and testable actions for Rack
|
15
|
+
|
16
|
+
All those components are designed to be used independently from each other or to work together in a Lotus application.
|
17
|
+
If your aren't familiar with them, please take time to go through their READMEs.
|
18
|
+
|
5
19
|
## Status
|
6
20
|
|
7
21
|
[![Gem Version](https://badge.fury.io/rb/lotusrb.png)](http://badge.fury.io/rb/lotusrb)
|
@@ -26,324 +40,101 @@ __Lotus__ supports Ruby (MRI) 2+
|
|
26
40
|
|
27
41
|
## Installation
|
28
42
|
|
29
|
-
Add this line to your application's Gemfile:
|
30
|
-
|
31
|
-
```ruby
|
32
|
-
gem 'lotusrb'
|
33
|
-
```
|
34
|
-
|
35
|
-
And then execute:
|
36
|
-
|
37
43
|
```shell
|
38
|
-
|
44
|
+
% gem install lotusrb
|
39
45
|
```
|
40
46
|
|
41
|
-
|
47
|
+
## Usage
|
42
48
|
|
43
49
|
```shell
|
44
|
-
|
50
|
+
% lotus new bookshelf
|
51
|
+
% cd bookshelf && bundle
|
52
|
+
% bundle exec lotus server # visit http://localhost:2300
|
45
53
|
```
|
46
54
|
|
47
|
-
##
|
48
|
-
|
49
|
-
Lotus combines the power and the flexibility of all its [frameworks](https://github.com/lotus).
|
50
|
-
It uses [Lotus::Router](https://github.com/lotus/router) and [Lotus::Controller](https://github.com/lotus/controller) for routing and controller layer, respectively.
|
51
|
-
While [Lotus::View](https://github.com/lotus/view) it's used for the presentational logic.
|
52
|
-
|
53
|
-
**If you're not familiar with those libraries, please read their READMEs first.**
|
55
|
+
## Architectures
|
54
56
|
|
55
|
-
|
57
|
+
Lotus is a modular web framework.
|
58
|
+
It scales from **single file HTTP endpoints** to **multiple applications in the same Ruby process**.
|
56
59
|
|
57
|
-
Unlike
|
60
|
+
Unlike other Ruby web frameworks, Lotus has **flexible conventions for code structure**.
|
58
61
|
Developers can arrange the layout of their projects as they prefer.
|
59
62
|
There is a suggested architecture that can be easily changed with a few settings.
|
60
63
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
Lotus has a smart **mechanism of duplication of its frameworks**, that allows multiple copy of a framework and multiple applications to run in the **same Ruby process**.
|
65
|
-
In other words, even small Lotus applications are ready to be split in separated deliverables, but they can safely coexist in the same heap space.
|
64
|
+
Lotus encourages the use of Ruby namespaces. This is based on the experience of working on dozens of projects.
|
65
|
+
By using Ruby namespaces, as your code grows it can be split with less effort. In other words, Lotus is providing gentle guidance for **avoid monolithic applications**.
|
66
66
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
#### One file application
|
71
|
-
|
72
|
-
```ruby
|
73
|
-
# config.ru
|
74
|
-
require 'lotus'
|
75
|
-
|
76
|
-
module OneFile
|
77
|
-
class Application < Lotus::Application
|
78
|
-
configure do
|
79
|
-
routes do
|
80
|
-
get '/', to: 'home#index'
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
67
|
+
Lotus has a smart **mechanism of duplication of its frameworks**.
|
68
|
+
It allows multiple copies of the framework and multiple applications to run in the **same Ruby process**.
|
69
|
+
In other words, Lotus applications are ready to be split into smaller parts but these parts can coexist in the same heap space.
|
84
70
|
|
85
|
-
|
86
|
-
|
71
|
+
All this adaptability can be helpful to bend the framework for your advanced needs, but we recognize the need of a guidance in standard architectures.
|
72
|
+
For this reason Lotus is shipped with code generators.
|
87
73
|
|
88
|
-
action 'Index' do
|
89
|
-
def call(params)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
74
|
|
94
|
-
|
95
|
-
class Index
|
96
|
-
include OneFile::View
|
75
|
+
### _Container_ architecture
|
97
76
|
|
98
|
-
|
99
|
-
'Hello'
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
77
|
+
**TL;DR: Develop your application like a gem. Implement use cases in `lib/`. Use one or more Lotus applications in `apps/`.**
|
104
78
|
|
105
|
-
|
106
|
-
|
79
|
+
This is the default architecture.
|
80
|
+
When your are about to start a new project use it.
|
107
81
|
|
108
|
-
|
109
|
-
Also, note how similar are the names of the action and of the view: `OneFile::Controllers::Home::Index` and `OneFile::Views::Home::Index`.
|
110
|
-
**This naming system is a Lotus convention and MUST be followed, or otherwise configured**.
|
82
|
+
The core of this architecture lives in `lib/`, where developers should build features **independently from the delivery mechanism**.
|
111
83
|
|
112
|
-
|
84
|
+
Imagine you are building a personal finance application, and you have a feature called _"register expense"_. This functionality involves `Money` and `Expense` Ruby objects and the need of persisting data into a database. You can have those classes living in `lib/pocket/money.rb` and `lib/pocket/expense.rb` and use [Lotus::Model](https://github.com/lotus/model) to persist them.
|
113
85
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
│ ├── backend
|
118
|
-
│ │ ├── application.rb Backend::Application
|
119
|
-
│ │ ├── controllers
|
120
|
-
│ │ │ └── sessions.rb Backend::Controllers::Sessions::New, Create & Destroy
|
121
|
-
│ │ ├── public
|
122
|
-
│ │ │ ├── favicon.ico
|
123
|
-
│ │ │ ├── fonts
|
124
|
-
│ │ │ │ └── cabin-medium.woff
|
125
|
-
│ │ │ ├── images
|
126
|
-
│ │ │ │ └── application.jpg
|
127
|
-
│ │ │ ├── javascripts
|
128
|
-
│ │ │ │ └── application.js
|
129
|
-
│ │ │ └── stylesheets
|
130
|
-
│ │ │ └── application.css
|
131
|
-
│ │ ├── templates
|
132
|
-
│ │ │ ├── backend.html.erb
|
133
|
-
│ │ │ └── sessions
|
134
|
-
│ │ │ └── new.html.erb
|
135
|
-
│ │ └── views
|
136
|
-
│ │ ├── backend_layout.rb Backend::Views::BackendLayout
|
137
|
-
│ │ └── sessions
|
138
|
-
│ │ ├── create.rb Backend::Views::Sessions::Create
|
139
|
-
│ │ ├── destroy.rb Backend::Views::Sessions::Destroy
|
140
|
-
│ │ └── new.rb Backend::Views::Sessions::New
|
141
|
-
│ └── frontend
|
142
|
-
│ ├── application.rb Frontend::Application
|
143
|
-
│ ├── assets
|
144
|
-
│ │ ├── favicon.ico
|
145
|
-
│ │ ├── fonts
|
146
|
-
│ │ │ └── cabin-medium.woff
|
147
|
-
│ │ ├── images
|
148
|
-
│ │ │ └── application.jpg
|
149
|
-
│ │ ├── javascripts
|
150
|
-
│ │ │ └── application.js
|
151
|
-
│ │ └── stylesheets
|
152
|
-
│ │ └── application.css
|
153
|
-
│ ├── controllers
|
154
|
-
│ │ └── sessions
|
155
|
-
│ │ ├── create.rb Frontend::Controllers::Sessions::Create
|
156
|
-
│ │ ├── destroy.rb Frontend::Controllers::Sessions::Destroy
|
157
|
-
│ │ └── new.rb Frontend::Controllers::Sessions::New
|
158
|
-
│ ├── templates
|
159
|
-
│ │ ├── frontend.html.erb
|
160
|
-
│ │ └── sessions
|
161
|
-
│ │ └── new.html.erb
|
162
|
-
│ └── views
|
163
|
-
│ ├── application_layout.rb Frontend::Views::ApplicationLayout
|
164
|
-
│ └── sessions
|
165
|
-
│ ├── create.rb Frontend::Views::Sessions::Create
|
166
|
-
│ ├── destroy.rb Frontend::Views::Sessions::Destroy
|
167
|
-
│ └── new.rb Frontend::Views::Sessions::New
|
168
|
-
└── config.ru
|
169
|
-
```
|
86
|
+
It's based on a few simple concepts: **use cases** and **applications**.
|
87
|
+
Use cases (features) should be implemented in `lib/` with a combination of pure objects and the needed Ruby gems.
|
88
|
+
One or more Lotus applications live in `apps/`. They are isolated each other, and depend only on the code in `lib/`.
|
170
89
|
|
171
|
-
|
172
|
-
while they're split in the case of the frontend app.
|
90
|
+
Each of them should serve for only one purpose: user facing web application, administrative backend, JSON API, metrics dashboard, etc.
|
173
91
|
|
174
|
-
|
175
|
-
During the boot time it **recursively preloads all the classes from the specified directories.**
|
92
|
+
This architecture has important advantages:
|
176
93
|
|
177
|
-
|
178
|
-
|
179
|
-
|
94
|
+
* **Code reusability.** You can consume a feature from the Web UI or from a HTTP API. Each one can be different Lotus application or simple Rack based endpoints.
|
95
|
+
* **Decoupled components.** The core of your application depends only on a few gems and it doesn't need to worry about the Web/HTTP/Console/Background jobs.
|
96
|
+
* **Applications are built like a gem**, this ease the process of package them and share between projects, without the need of carry a lot of dependencies.
|
97
|
+
* **Avoid monoliths**. Each Lotus application under `apps/` is a candidate for later on extraction into a separated [_microservice_](http://martinfowler.com/articles/microservices.html).
|
180
98
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
load_paths << [
|
185
|
-
'controllers',
|
186
|
-
'views'
|
187
|
-
]
|
99
|
+
The last point is crucial. In the early days of a new project is really convenient to build and deploy all the code together.
|
100
|
+
But as the time passes, it can become nearly impossible to extract sets of cohesive functionalities into separated deliverables.
|
101
|
+
Lotus helps to plan those things ahead of time, but without the burden that is required by those choices, because it support multiple applications natively.
|
188
102
|
|
189
|
-
|
103
|
+
Here's the name _**container**_: a Lotus _"shell"_ that can run multiple micro applications in the same process.
|
190
104
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
# All code under apps/backend/{controllers,views} will be loaded
|
199
|
-
```
|
200
|
-
|
201
|
-
```ruby
|
202
|
-
# config.ru
|
203
|
-
require_relative 'apps/frontend/application'
|
204
|
-
require_relative 'apps/backend/application'
|
205
|
-
|
206
|
-
run Lotus::Router.new {
|
207
|
-
mount Backend::Application, at: '/backend'
|
208
|
-
mount Frontend::Application, at: '/'
|
209
|
-
}
|
210
|
-
|
211
|
-
# We use an instance of Lotus::Router to mount two Lotus applications
|
212
|
-
```
|
213
|
-
|
214
|
-
#### Modulized application
|
215
|
-
|
216
|
-
```
|
217
|
-
test/fixtures/furnitures
|
218
|
-
├── app
|
219
|
-
│ ├── controllers
|
220
|
-
│ │ └── furnitures
|
221
|
-
│ │ └── catalog_controller.rb Furnitures::CatalogController::Index
|
222
|
-
│ ├── templates
|
223
|
-
│ │ ├── application.html.erb
|
224
|
-
│ │ └── furnitures
|
225
|
-
│ │ └── catalog
|
226
|
-
│ │ └── index.html.erb
|
227
|
-
│ └── views
|
228
|
-
│ ├── application_layout.rb Furnitures::Views::ApplicationLayout
|
229
|
-
│ └── furnitures
|
230
|
-
│ └── catalog
|
231
|
-
│ └── index.rb Furnitures::Catalog::Index
|
232
|
-
├── application.rb Furnitures::Application
|
233
|
-
└── public
|
234
|
-
├── favicon.ico
|
235
|
-
├── fonts
|
236
|
-
│ └── cabin-medium.woff
|
237
|
-
├── images
|
238
|
-
│ └── application.jpg
|
239
|
-
├── javascripts
|
240
|
-
│ └── application.js
|
241
|
-
└── stylesheets
|
242
|
-
└── application.css
|
243
|
-
```
|
244
|
-
|
245
|
-
You may have noticed a different naming structure here, it's easily achieved with a few settings.
|
246
|
-
|
247
|
-
```ruby
|
248
|
-
# application.rb
|
249
|
-
require 'lotus'
|
250
|
-
|
251
|
-
module Furnitures
|
252
|
-
class Application < Lotus::Application
|
253
|
-
configure do
|
254
|
-
layout :application
|
255
|
-
routes do
|
256
|
-
get '/', to: 'catalog#index'
|
257
|
-
end
|
258
|
-
|
259
|
-
load_paths << 'app'
|
260
|
-
|
261
|
-
controller_pattern "%{controller}Controller::%{action}"
|
262
|
-
view_pattern "%{controller}::%{action}"
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
266
|
-
```
|
267
|
-
|
268
|
-
The patterns above, are indicating to Lotus the name structure that we want to use for our application.
|
269
|
-
The main actor of the HTTP layer is an action. Actions are classes grouped logically in the same module called controller.
|
270
|
-
|
271
|
-
For an incoming `GET` request to `/`, the router will look for a `CatalogController` with an `Index` action.
|
272
|
-
Once the action will be called, the control will pass to the view. Here the application will look for a `Catalog` module with an `Index` view.
|
273
|
-
|
274
|
-
**That two patters are interpolated at the runtime, with the controller/action informations passed by the router.**
|
275
|
-
|
276
|
-
#### Top level architecture
|
277
|
-
|
278
|
-
```
|
279
|
-
test/fixtures/information_tech
|
280
|
-
├── app
|
281
|
-
│ ├── controllers
|
282
|
-
│ │ └── hardware_controller.rb HardwareController::Index
|
283
|
-
│ ├── templates
|
284
|
-
│ │ ├── app.html.erb
|
285
|
-
│ │ └── hardware
|
286
|
-
│ │ └── index.html.erb
|
287
|
-
│ └── views
|
288
|
-
│ ├── app_layout.rb AppLayout
|
289
|
-
│ └── hardware
|
290
|
-
│ └── index.rb Hardware::Index
|
291
|
-
├── application.rb InformationTech::Application
|
292
|
-
├── config
|
293
|
-
│ └── routes.rb
|
294
|
-
└── public
|
295
|
-
├── favicon.ico
|
296
|
-
├── fonts
|
297
|
-
│ └── cabin-medium.woff
|
298
|
-
├── images
|
299
|
-
│ └── application.jpg
|
300
|
-
├── javascripts
|
301
|
-
│ └── application.js
|
302
|
-
└── stylesheets
|
303
|
-
└── application.css
|
105
|
+
```shell
|
106
|
+
% lotus new pocket --arch=container
|
107
|
+
% lotus new pocket # --arch=container is the default
|
304
108
|
```
|
305
109
|
|
306
|
-
|
307
|
-
|
308
|
-
```ruby
|
309
|
-
# application.rb
|
310
|
-
require 'lotus'
|
311
|
-
|
312
|
-
module InformationTech
|
313
|
-
class Application < Lotus::Application
|
314
|
-
configure do
|
315
|
-
namespace Object
|
110
|
+
Read more about this [architecture](https://github.com/lotus/lotus/wiki/Container-architecture).
|
316
111
|
|
317
|
-
|
318
|
-
view_pattern '%{controller}::%{action}'
|
112
|
+
### _Application_ architecture
|
319
113
|
|
320
|
-
|
114
|
+
_upcoming_
|
321
115
|
|
322
|
-
|
323
|
-
routes 'config/routes'
|
324
|
-
end
|
325
|
-
end
|
326
|
-
end
|
116
|
+
### _Micro_ architecture
|
327
117
|
|
328
|
-
|
329
|
-
```
|
118
|
+
_upcoming_
|
330
119
|
|
331
|
-
|
120
|
+
## Conventions
|
332
121
|
|
333
|
-
* Lotus expects
|
122
|
+
* Lotus expects controllers, actions and views to have a specific pattern (see [Configuration](#configuration) for customizations)
|
334
123
|
* All the commands must be run from the root of the project. If this requirement cannot be satisfied, please hardcode the path with `Configuration#root`.
|
335
124
|
* The template name must reflect the name of the corresponding view: `Bookshelf::Views::Dashboard::Index` for `dashboard/index.html.erb`.
|
336
125
|
* All the static files are served by the internal Rack middleware stack.
|
337
126
|
* The application expects to find static files under `public/` (see `Configuration#assets`)
|
338
127
|
* If the public folder doesn't exist, it doesn't serve static files.
|
339
128
|
|
340
|
-
|
129
|
+
## Non-Conventions
|
341
130
|
|
342
131
|
* The application structure can be organized according to developer needs.
|
343
132
|
* No file-to-name convention: modules and classes can live in one or multiple files.
|
344
|
-
* No autoloading paths. They must be
|
133
|
+
* No autoloading paths. They must be explicitly configured.
|
345
134
|
|
346
|
-
|
135
|
+
## Configuration
|
136
|
+
|
137
|
+
<a name="configuration"></a>
|
347
138
|
|
348
139
|
A Lotus application can be configured with a DSL that determines its behavior.
|
349
140
|
|
@@ -353,24 +144,32 @@ require 'lotus'
|
|
353
144
|
module Bookshelf
|
354
145
|
class Application < Lotus::Application
|
355
146
|
configure do
|
147
|
+
########################
|
148
|
+
# BASIC CONFIGURATIONS #
|
149
|
+
########################
|
150
|
+
|
356
151
|
# Determines the root of the application (optional)
|
357
152
|
# Argument: String, Pathname, defaults to Dir.pwd
|
358
153
|
#
|
359
|
-
root 'path/to/root'
|
360
|
-
|
361
|
-
# The Ruby namespace where to lookup for actions and views (optional)
|
362
|
-
# Argument: Module, Class, defaults to the application module (eg. Bookshelf)
|
363
|
-
#
|
364
|
-
namespace Object
|
154
|
+
root 'path/to/root' # or __root__
|
365
155
|
|
366
156
|
# The relative load paths where the application will recursively load the code (mandatory)
|
367
157
|
# Argument: String, Array<String>, defaults to empty set
|
368
158
|
#
|
369
159
|
load_paths << [
|
370
|
-
'
|
371
|
-
'
|
160
|
+
'controllers',
|
161
|
+
'views'
|
372
162
|
]
|
373
163
|
|
164
|
+
# Handle exceptions with HTTP statuses (true) or don't catch them (false)
|
165
|
+
# Argument: boolean, defaults to true
|
166
|
+
#
|
167
|
+
handle_exceptions true
|
168
|
+
|
169
|
+
#######################
|
170
|
+
# HTTP CONFIGURATIONS #
|
171
|
+
#######################
|
172
|
+
|
374
173
|
# The route set (mandatory)
|
375
174
|
# Argument: Proc with the routes definition
|
376
175
|
#
|
@@ -383,62 +182,193 @@ module Bookshelf
|
|
383
182
|
#
|
384
183
|
routes 'config/routes'
|
385
184
|
|
386
|
-
#
|
387
|
-
# Argument: A
|
185
|
+
# URI scheme used by the routing system to generate absolute URLs (optional)
|
186
|
+
# Argument: A string, default to "http"
|
388
187
|
#
|
389
|
-
|
188
|
+
scheme 'https'
|
390
189
|
|
391
|
-
#
|
392
|
-
# Argument: A string
|
190
|
+
# URI host used by the routing system to generate absolute URLs (optional)
|
191
|
+
# Argument: A string, default to "localhost"
|
192
|
+
#
|
193
|
+
host 'bookshelf.org'
|
194
|
+
|
195
|
+
# URI port used by the routing system to generate absolute URLs (optional)
|
196
|
+
# Argument: An object coercible to integer, default to 80 if the scheme is http and 443 if it's https
|
197
|
+
# This SHOULD be configured only in case the application listens to that non standard ports
|
198
|
+
#
|
199
|
+
port 2323
|
200
|
+
|
201
|
+
# Toggle cookies (optional)
|
202
|
+
# Argument: A [`TrueClass`, `FalseClass`], default to `FalseClass`.
|
203
|
+
#
|
204
|
+
cookies true
|
205
|
+
|
206
|
+
# Toggle sessions (optional)
|
207
|
+
# Argument: Symbol the Rack session adapter
|
208
|
+
# A Hash with options
|
393
209
|
#
|
394
|
-
|
210
|
+
sessions :cookie, secret: ENV['SESSIONS_SECRET']
|
395
211
|
|
396
212
|
# Default format for the requests that don't specify an HTTP_ACCEPT header (optional)
|
397
213
|
# Argument: A symbol representation of a mime type, default to :html
|
398
214
|
#
|
399
215
|
default_format :json
|
400
216
|
|
401
|
-
#
|
402
|
-
# Argument: A string, default to "http"
|
217
|
+
# Rack middleware configuration (optional)
|
403
218
|
#
|
404
|
-
|
219
|
+
middleware.use Rack::Protection
|
405
220
|
|
406
|
-
#
|
407
|
-
#
|
221
|
+
# HTTP Body parsers (optional)
|
222
|
+
# Parse non GET responses body for a specific mime type
|
223
|
+
# Argument: Symbol, which represent the format of the mime type (only `:json` is supported)
|
224
|
+
# Object, the parser
|
408
225
|
#
|
409
|
-
|
226
|
+
body_parsers :json, MyXMLParser.new
|
227
|
+
|
228
|
+
###########################
|
229
|
+
# DATABASE CONFIGURATIONS #
|
230
|
+
###########################
|
231
|
+
|
232
|
+
# Configure a database adapter (optional)
|
233
|
+
# Argument: A Hash with the settings
|
234
|
+
# type: Symbol, :file_system, :memory and :sql
|
235
|
+
# uri: String, 'file:///db/bookshelf'
|
236
|
+
# 'memory://localhost/bookshelf'
|
237
|
+
# 'sqlite:memory:'
|
238
|
+
# 'sqlite://db/bookshelf.db'
|
239
|
+
# 'postgres://localhost/bookshelf'
|
240
|
+
# 'mysql://localhost/bookshelf'
|
241
|
+
#
|
242
|
+
adapter type: :file_system, uri: ENV['DATABASE_URL']
|
410
243
|
|
411
|
-
#
|
412
|
-
# Argument:
|
413
|
-
# This SHOULD be configured only in case the application listens to that non standard ports
|
244
|
+
# Configure a database mapping (optional)
|
245
|
+
# Argument: Proc
|
414
246
|
#
|
415
|
-
|
247
|
+
mapping do
|
248
|
+
collection :users do
|
249
|
+
entity User
|
250
|
+
repository UserRepository
|
251
|
+
|
252
|
+
attribute :id, Integer
|
253
|
+
attribute :name, String
|
254
|
+
end
|
255
|
+
end
|
416
256
|
|
417
|
-
#
|
418
|
-
# Argument: A
|
419
|
-
# Default to "Controllers::%{controller}::%{action}"
|
257
|
+
# Configure a database mapping (optional, alternative usage)
|
258
|
+
# Argument: A relative path where to find the mapping definitions
|
420
259
|
#
|
421
|
-
|
260
|
+
mapping 'config/mapping'
|
422
261
|
|
423
|
-
|
424
|
-
#
|
425
|
-
|
262
|
+
############################
|
263
|
+
# TEMPLATES CONFIGURATIONS #
|
264
|
+
############################
|
265
|
+
|
266
|
+
# The layout to be used by all the views (optional)
|
267
|
+
# Argument: A Symbol that indicates the name, default to nil
|
268
|
+
#
|
269
|
+
layout :application # Will look for Bookshelf::Views::ApplicationLayout
|
270
|
+
|
271
|
+
# The relative path where to find the templates (optional)
|
272
|
+
# Argument: A string with the relative path, default to the root of the app
|
273
|
+
#
|
274
|
+
templates 'templates'
|
275
|
+
|
276
|
+
#########################
|
277
|
+
# ASSETS CONFIGURATIONS #
|
278
|
+
#########################
|
279
|
+
|
280
|
+
# Specify sources for assets (optional)
|
281
|
+
# Argument: String, Array<String>, defaults to 'public'
|
282
|
+
#
|
283
|
+
assets << [
|
284
|
+
'public',
|
285
|
+
'vendor/assets'
|
286
|
+
]
|
287
|
+
|
288
|
+
# Enabling serving assets (optional)
|
289
|
+
# Argument: boolean, defaults to false
|
290
|
+
#
|
291
|
+
serve_assets true
|
292
|
+
|
293
|
+
#############################
|
294
|
+
# FRAMEWORKS CONFIGURATIONS #
|
295
|
+
#############################
|
296
|
+
|
297
|
+
# Low level configuration for Lotus::View (optional)
|
298
|
+
# The given block will be yielded every time `Lotus::View` is included.
|
299
|
+
# This is helpful to share logic between views
|
300
|
+
# See the related documentation
|
301
|
+
# Argument: Proc
|
426
302
|
#
|
427
|
-
|
303
|
+
view.prepare do
|
304
|
+
include MyCustomRoutingHelpers # included by all the views
|
305
|
+
end
|
306
|
+
|
307
|
+
# Low level configuration for Lotus::Controller (optional)
|
308
|
+
# Argument: Proc
|
309
|
+
controller.prepare do
|
310
|
+
include Authentication # included by all the actions
|
311
|
+
before :authenticate! # run auth logic before each action
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
###############################
|
316
|
+
# ENVIRONMENTS CONFIGURATIONS #
|
317
|
+
###############################
|
318
|
+
|
319
|
+
configure :development do
|
320
|
+
# override the general configuration only for the development environment
|
321
|
+
handle_exceptions false
|
322
|
+
serve_assets true
|
323
|
+
end
|
324
|
+
|
325
|
+
configure :test do
|
326
|
+
# override the general configuration only for the test environment
|
327
|
+
host 'test.host'
|
428
328
|
end
|
429
329
|
end
|
430
330
|
end
|
431
331
|
```
|
432
332
|
|
433
|
-
##
|
333
|
+
## Command line
|
334
|
+
|
335
|
+
Lotus provides a few command line utilities:
|
336
|
+
|
337
|
+
### Server
|
434
338
|
|
435
|
-
|
436
|
-
It will improved by collecting the feedback of real world applications.
|
339
|
+
It looks at the `config.ru` file in the root of the application, and starts the Rack server defined in your `Gemfile` (eg. puma, thin, unicorn). It defaults to WEBRick.
|
437
340
|
|
438
|
-
|
439
|
-
|
341
|
+
It supports **code reloading** feature by default, useful for development purposes.
|
342
|
+
|
343
|
+
```shell
|
344
|
+
% bundle exec lotus server
|
345
|
+
```
|
346
|
+
|
347
|
+
### Console
|
348
|
+
|
349
|
+
It starts a REPL, by using the engine defined in your `Gemfile`. It defaults to IRb. **Run it from the root of the application**.
|
350
|
+
|
351
|
+
```shell
|
352
|
+
% bundle exec lotus console
|
353
|
+
```
|
440
354
|
|
441
|
-
|
355
|
+
It supports **code reloading** via the `reload!` command.
|
356
|
+
|
357
|
+
### Routes
|
358
|
+
|
359
|
+
It prints the routes defined by the Lotus application(s).
|
360
|
+
|
361
|
+
```shell
|
362
|
+
% bundle exec lotus routes
|
363
|
+
```
|
364
|
+
|
365
|
+
### Version
|
366
|
+
|
367
|
+
It prints the current Lotus version.
|
368
|
+
|
369
|
+
```shell
|
370
|
+
% bundle exec lotus version
|
371
|
+
```
|
442
372
|
|
443
373
|
## Contributing
|
444
374
|
|
data/bin/lotus
ADDED