lydia 0.1.3 → 0.1.4
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/.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
|