lydia 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +61 -0
- data/.travis.yml +3 -8
- data/README.md +93 -22
- data/Rakefile +3 -3
- data/bin/console +3 -3
- data/examples/{example2.rb → config.ru} +2 -0
- data/examples/hello_world.rb +1 -1
- data/lib/lydia.rb +2 -2
- data/lib/lydia/application.rb +8 -11
- data/lib/lydia/delegator.rb +2 -2
- data/lib/lydia/filters.rb +11 -12
- data/lib/lydia/halted.rb +1 -1
- data/lib/lydia/helpers.rb +5 -5
- data/lib/lydia/not_found.rb +1 -1
- data/lib/lydia/request.rb +2 -2
- data/lib/lydia/response.rb +37 -25
- data/lib/lydia/route.rb +30 -22
- data/lib/lydia/router.rb +29 -30
- data/lib/lydia/standard_pages.rb +10 -7
- data/lib/lydia/version.rb +1 -1
- data/lydia.gemspec +9 -5
- data/spec/application_spec.rb +16 -16
- data/spec/delegator_spec.rb +5 -9
- data/spec/filters_spec.rb +16 -18
- data/spec/helpers_spec.rb +14 -14
- data/spec/middleware_spec.rb +9 -9
- data/spec/response_spec.rb +36 -38
- data/spec/router_spec.rb +18 -19
- data/spec/spec_helper.rb +1 -1
- data/spec/templates_spec.rb +5 -5
- metadata +35 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 674c9480a5fc9134caefdc5cdd657a325b774f3c
|
4
|
+
data.tar.gz: b4fac7a13bf1724d54d47dd205cb08fd8b72061c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e0623433d619e658d3b2d7a6e13d029e4661771ad747977b7ce43e24f4904d619dead18d1c48374bcbe2d6e65fb46f8d7050418b71d7893d8ff5e845bce2f8e
|
7
|
+
data.tar.gz: dfddf8e23a78e7ec479f9acc1264d767ade0c22092205994556ac76d578179f40fd8d82ca189cf86145660b69bf149225f0751806f828578581cf8235f35a0a9
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require: rubocop-rspec
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
DisplayCopNames: true
|
5
|
+
Exclude:
|
6
|
+
- 'db/migrate/*'
|
7
|
+
- 'db/schema.rb'
|
8
|
+
- 'config/**/*'
|
9
|
+
- 'bin/*'
|
10
|
+
- lydia.gemspec
|
11
|
+
# Other common or autogenerated ignores
|
12
|
+
- 'lib/tasks/cucumber.rake'
|
13
|
+
# Project specific ignores goes here
|
14
|
+
|
15
|
+
Style/BarePercentLiterals:
|
16
|
+
EnforcedStyle: percent_q
|
17
|
+
|
18
|
+
Style/EmptyLineBetweenDefs:
|
19
|
+
AllowAdjacentOneLineDefs: true
|
20
|
+
|
21
|
+
Style/MultilineOperationIndentation:
|
22
|
+
EnforcedStyle: indented
|
23
|
+
|
24
|
+
Metrics/LineLength:
|
25
|
+
Max: 100
|
26
|
+
|
27
|
+
Lint/EndAlignment:
|
28
|
+
AlignWith: variable
|
29
|
+
|
30
|
+
Style/TrailingCommaInLiteral:
|
31
|
+
EnforcedStyleForMultiline: comma
|
32
|
+
|
33
|
+
Lint/AssignmentInCondition:
|
34
|
+
Enabled: false
|
35
|
+
|
36
|
+
Style/DoubleNegation:
|
37
|
+
Enabled: false
|
38
|
+
|
39
|
+
Style/SingleLineBlockParams:
|
40
|
+
Enabled: false
|
41
|
+
|
42
|
+
Documentation:
|
43
|
+
Enabled: false
|
44
|
+
|
45
|
+
Rails:
|
46
|
+
Enabled: true
|
47
|
+
|
48
|
+
RSpec/DescribeClass:
|
49
|
+
Enabled: false
|
50
|
+
|
51
|
+
RSpec/InstanceVariable:
|
52
|
+
Enabled: false
|
53
|
+
|
54
|
+
RSpec/MultipleExpectations:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
RSpec/ExampleLength:
|
58
|
+
Max: 10
|
59
|
+
|
60
|
+
Rails/HttpPositionalArguments:
|
61
|
+
Enabled: false
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -13,9 +13,7 @@ Lightweight, fast and easy to use small ruby web framework.
|
|
13
13
|
|
14
14
|
Add this line to your application's Gemfile:
|
15
15
|
|
16
|
-
|
17
|
-
gem 'lydia'
|
18
|
-
```
|
16
|
+
gem 'lydia'
|
19
17
|
|
20
18
|
And then execute:
|
21
19
|
|
@@ -27,7 +25,7 @@ Or install it yourself as:
|
|
27
25
|
|
28
26
|
## Another ruby web framework? WTF?
|
29
27
|
|
30
|
-
This project is not intended to become a top notch framework or the new rails, it's just an experiment.
|
28
|
+
This project is not intended to become a top notch framework or the new rails, it's just an experiment.
|
31
29
|
The goals of this project are:
|
32
30
|
|
33
31
|
* [Rack](https://github.com/rack/rack/) based.
|
@@ -44,35 +42,35 @@ The goals of this project are:
|
|
44
42
|
## Usage
|
45
43
|
|
46
44
|
### First example
|
47
|
-
Create a ruby file,
|
45
|
+
Create a ruby file, for example hello_world.rb, require 'lydia' and using the routing functions without creating an application object.
|
48
46
|
|
49
47
|
require 'lydia'
|
50
|
-
|
48
|
+
|
51
49
|
get '/' do
|
52
50
|
'Hello world!'
|
53
51
|
end
|
54
52
|
|
55
53
|
Just run it to start a webrick server that responds hello world to root.
|
56
|
-
|
57
|
-
$ ruby hello_world.rb
|
54
|
+
|
55
|
+
$ ruby hello_world.rb
|
58
56
|
|
59
57
|
### Application
|
60
58
|
If preferred it's possible to create an application object and run using rackup command, in this case don't require lydia but lydia/application to avoid the server auto start. For example a minimal config.ru file can be:
|
61
59
|
|
62
60
|
require 'lydia/application'
|
63
|
-
|
61
|
+
|
64
62
|
class App < Lydia::Application
|
65
63
|
get '/' do
|
66
64
|
'Hello world!'
|
67
65
|
end
|
68
66
|
end
|
69
|
-
|
67
|
+
|
70
68
|
run App.new
|
71
|
-
|
69
|
+
|
72
70
|
Start the server using rackup command:
|
73
71
|
|
74
72
|
$ rackup
|
75
|
-
|
73
|
+
|
76
74
|
### Router
|
77
75
|
|
78
76
|
#### Stand alone router
|
@@ -80,10 +78,10 @@ If needed the router can be used stand alone, for example if best performances a
|
|
80
78
|
Stand alone example, note that the return type must be in rack standard format, an array of three that is status, header, body (as array):
|
81
79
|
|
82
80
|
require 'lydia/router'
|
83
|
-
|
81
|
+
|
84
82
|
class App < Lydia::Router
|
85
83
|
get '/' do
|
86
|
-
body = '
|
84
|
+
body = 'Hello world!'
|
87
85
|
[200, { 'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s }, [body]]
|
88
86
|
end
|
89
87
|
end
|
@@ -91,26 +89,101 @@ Stand alone example, note that the return type must be in rack standard format,
|
|
91
89
|
#### HTTP verbs
|
92
90
|
Supports standard HTTP verbs: HEAD GET PATCH PUT POST DELETE OPTIONS.
|
93
91
|
|
94
|
-
|
92
|
+
#### Query parameters
|
95
93
|
|
96
|
-
|
94
|
+
# matches /querystring&name=mirko
|
95
|
+
get '/querystring' do
|
96
|
+
# do something
|
97
|
+
# request.params[:name] contains 'mirko'
|
98
|
+
end
|
97
99
|
|
98
|
-
####
|
100
|
+
#### Wildcard
|
101
|
+
|
102
|
+
# matches /wildcard/everything
|
103
|
+
get '/wildcard/* ' do
|
104
|
+
# do something
|
105
|
+
end
|
99
106
|
|
100
107
|
#### Named route parameters
|
101
108
|
|
109
|
+
# matches /users/1/comments/3/edit
|
110
|
+
get '/users/:id/comments/:comment_id' do
|
111
|
+
# do something
|
112
|
+
# request.params[:id] contains 1
|
113
|
+
# request.params[:comment_id] contains 3
|
114
|
+
end
|
115
|
+
|
116
|
+
Automatically add to response.params every route params.
|
117
|
+
|
102
118
|
#### Regular expressions
|
103
119
|
|
104
|
-
|
120
|
+
# matches /regexp
|
121
|
+
get %r{/regexp$}i do
|
122
|
+
# do something
|
123
|
+
end
|
105
124
|
|
106
125
|
#### Skip to next route
|
126
|
+
To skip to the next matching route use next_route method.
|
127
|
+
|
128
|
+
get '/next_route' do
|
129
|
+
next_route
|
130
|
+
end
|
131
|
+
|
132
|
+
get '/next_route' do
|
133
|
+
'Hello this is the next route'
|
134
|
+
end
|
107
135
|
|
108
136
|
#### Halting
|
137
|
+
To halt the execution raising an Halt error use halt method, by default the standard halt page is displayed but it's possible to pass a custom response as halt parameter.
|
138
|
+
|
139
|
+
get '/halt' do
|
140
|
+
halt
|
141
|
+
end
|
142
|
+
|
143
|
+
get '/custom_halt' do
|
144
|
+
halt 'Custom halt'
|
145
|
+
end
|
109
146
|
|
110
147
|
### Return types
|
148
|
+
Lydia supports various returns types other that the standard rack response object. The supported type are:
|
149
|
+
|
150
|
+
#### Rack::Response or Lydia::Response
|
151
|
+
Using the standard rack response the framework does nothing other than pass the response to rack. If response finish method was not called the framework will.
|
152
|
+
|
153
|
+
#### String
|
154
|
+
Returning a string is intended as the response body, the headers and a 200 status are automatically added.
|
155
|
+
|
156
|
+
#### Array of 2 or 3 elements
|
157
|
+
Returning an array of 2 elements means that the first is the status and the second the body.
|
158
|
+
Returning an array of 3 elements means that the first is the status, the second the headers, and the third the body.
|
159
|
+
|
160
|
+
#### Fixnum
|
161
|
+
Returning a fixnum is intended as the response code. Useful to return a response code without a body.
|
162
|
+
|
163
|
+
#### Hash
|
164
|
+
An hash is intended as a json, json content type is automatically added.
|
165
|
+
|
166
|
+
#### Object that responds to :each
|
167
|
+
Returning a generic object is admitted accorind rack specifications if responds to :each method.
|
111
168
|
|
112
169
|
### Filters
|
113
170
|
|
171
|
+
#### Before and after Filters
|
172
|
+
Before and after filters are available as in the following example:
|
173
|
+
|
174
|
+
before do
|
175
|
+
# do something
|
176
|
+
end
|
177
|
+
|
178
|
+
after do
|
179
|
+
# do something
|
180
|
+
end
|
181
|
+
|
182
|
+
#### Redirects
|
183
|
+
To define a redirect use the following syntax:
|
184
|
+
|
185
|
+
redirect '/from_route', to: '/to_route'
|
186
|
+
|
114
187
|
### Templates
|
115
188
|
|
116
189
|
Extensive templates support using [tilt](https://github.com/rtomayko/tilt/)
|
@@ -118,8 +191,7 @@ To render a template simply use the render function:
|
|
118
191
|
|
119
192
|
get '/render_erb' do
|
120
193
|
render 'template.erb', nil, message: 'template'
|
121
|
-
end
|
122
|
-
|
194
|
+
end
|
123
195
|
|
124
196
|
### Helpers
|
125
197
|
|
@@ -135,7 +207,7 @@ It's possible to read request parameters using params helper:
|
|
135
207
|
|
136
208
|
get '/test' do
|
137
209
|
params['my_param']
|
138
|
-
end
|
210
|
+
end
|
139
211
|
|
140
212
|
#### Content type
|
141
213
|
It's possible to force the response return type using content_type helper:
|
@@ -157,4 +229,3 @@ It's possible to force the response return type using content_type helper:
|
|
157
229
|
## License
|
158
230
|
|
159
231
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
160
|
-
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'lydia/application'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "lydia/application"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/examples/hello_world.rb
CHANGED
data/lib/lydia.rb
CHANGED
data/lib/lydia/application.rb
CHANGED
@@ -12,7 +12,7 @@ module Lydia
|
|
12
12
|
include Templates
|
13
13
|
include Filters
|
14
14
|
include Helpers
|
15
|
-
|
15
|
+
|
16
16
|
def process
|
17
17
|
result = super
|
18
18
|
if result.nil?
|
@@ -23,31 +23,28 @@ module Lydia
|
|
23
23
|
@response.build(result)
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def new_request(env)
|
28
28
|
Lydia::Request.new(env)
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def new_response(body = [], status = 200, header = {})
|
32
32
|
Lydia::Response.new(body, status, header)
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
class << self
|
36
36
|
extend Forwardable
|
37
|
-
|
37
|
+
|
38
38
|
def_delegators :builder, :map, :use, :run
|
39
|
-
|
39
|
+
|
40
40
|
def builder
|
41
41
|
@builder ||= Rack::Builder.new
|
42
42
|
end
|
43
43
|
|
44
|
-
alias new! new
|
45
|
-
|
46
44
|
def new(*args, &bk)
|
47
|
-
|
48
|
-
builder.run(app)
|
45
|
+
builder.run(super(*args, &bk))
|
49
46
|
builder.to_app
|
50
47
|
end
|
51
48
|
end
|
52
|
-
end
|
49
|
+
end
|
53
50
|
end
|
data/lib/lydia/delegator.rb
CHANGED
@@ -4,9 +4,9 @@ require 'forwardable'
|
|
4
4
|
module Lydia
|
5
5
|
module Delegator
|
6
6
|
extend Forwardable
|
7
|
-
def_delegators Lydia::Application,
|
7
|
+
def_delegators Lydia::Application,
|
8
8
|
:head, :get, :patch, :put, :post, :delete, :options,
|
9
9
|
:namespace, :before, :after,
|
10
10
|
:map, :use, :run
|
11
11
|
end
|
12
|
-
end
|
12
|
+
end
|
data/lib/lydia/filters.rb
CHANGED
@@ -5,24 +5,24 @@ module Lydia
|
|
5
5
|
def self.included(base)
|
6
6
|
base.extend(ClassMethods)
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
module ClassMethods
|
10
10
|
def filters
|
11
11
|
@filters ||= Hash.new { |h, k| h[k] = [] }
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
%w(before after).each do |filter|
|
15
15
|
define_method(filter) do |pattern = '/*', options = {}, &block|
|
16
16
|
filters[filter.to_sym] << Route.new(filter, @namespace || '', pattern, options, &block)
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def redirect(pattern, options = {})
|
21
21
|
return ArgumentError.new('Options must contains :to') unless options.include?(:to)
|
22
22
|
filters[:redirect] << Route.new('redirect', @namespace || '', pattern, options)
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def dispatch(env)
|
27
27
|
process_redirects(env)
|
28
28
|
process_before_filters(env)
|
@@ -30,7 +30,7 @@ module Lydia
|
|
30
30
|
process_after_filters(env)
|
31
31
|
result
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
%w(before after).each do |filter_type|
|
35
35
|
define_method("process_#{filter_type}_filters") do |env|
|
36
36
|
self.class.filters[filter_type.to_sym].each do |filter|
|
@@ -38,15 +38,14 @@ module Lydia
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
def process_redirects(env)
|
43
43
|
self.class.filters[:redirect].each do |redirect|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
end
|
44
|
+
next unless redirect.match?(env)
|
45
|
+
env['PATH_INFO'] = redirect.namespace + redirect.options[:to]
|
46
|
+
@request = new_request(env)
|
47
|
+
break
|
49
48
|
end
|
50
49
|
end
|
51
50
|
end
|
52
|
-
end
|
51
|
+
end
|