eldr 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +2 -2
- data/Gemfile.lock +3 -3
- data/README.md +10 -10
- data/TODOS +1 -0
- data/eldr.gemspec +1 -1
- data/examples/app.ru +1 -1
- data/lib/eldr/app.rb +4 -5
- data/lib/eldr/cascade.rb +47 -0
- data/lib/eldr/matcher.rb +1 -13
- data/lib/eldr/recognizer.rb +1 -0
- data/lib/eldr/route.rb +33 -51
- data/lib/eldr/version.rb +1 -1
- data/spec/route_spec.rb +9 -17
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db52c192c7a12914d17592bb4915c1d51751aeb3
|
4
|
+
data.tar.gz: b8c4d24f5e8511218adc5e00b5052a98c2fde831
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee15590d689faecf60a29fc03e1536181f0c73f10ec05c4ced43490af7a0500230cf85cabb066ae00071024952e824bf2852c918e5ad4935d8b99b9978d955ca
|
7
|
+
data.tar.gz: 5abe4a5ab8be77188c966642704b531da0aae69b989d50f47ccda6e17aa5989539c646141497fab31917558fcf207efcdc2bb049d774fa758d5fa37b564d3621
|
data/.rubocop_todo.yml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
-
# on 2015-
|
2
|
+
# on 2015-02-16 13:42:01 -0800 using RuboCop version 0.28.0.
|
3
3
|
# The point is for the user to remove these configuration records
|
4
4
|
# one by one as the offenses are removed from the code base.
|
5
5
|
# Note that changes in the inspected code, or installation of new
|
@@ -10,6 +10,6 @@
|
|
10
10
|
Metrics/ParameterLists:
|
11
11
|
Max: 6
|
12
12
|
|
13
|
-
# Offense count:
|
13
|
+
# Offense count: 7
|
14
14
|
Style/Documentation:
|
15
15
|
Enabled: false
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
eldr (0.0.
|
4
|
+
eldr (0.0.4)
|
5
5
|
fast_blank (= 0.0.2)
|
6
6
|
mustermann (= 0.4.0)
|
7
7
|
rack (~> 1.5)
|
@@ -31,7 +31,7 @@ GEM
|
|
31
31
|
slop (~> 3.4, >= 3.4.5)
|
32
32
|
powerpack (0.0.9)
|
33
33
|
rack (1.6.0)
|
34
|
-
rack-test (0.6.
|
34
|
+
rack-test (0.6.3)
|
35
35
|
rack (>= 1.0)
|
36
36
|
rainbow (2.0.0)
|
37
37
|
rake (10.4.2)
|
@@ -81,7 +81,7 @@ DEPENDENCIES
|
|
81
81
|
bundler (~> 1.7)
|
82
82
|
coveralls (~> 0.7)
|
83
83
|
eldr!
|
84
|
-
rack-test (
|
84
|
+
rack-test (~> 0.6)
|
85
85
|
rake (= 10.4.2)
|
86
86
|
rspec (= 3.1.0)
|
87
87
|
rubocop (= 0.28.0)
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ Eldr apps are rack apps like this:
|
|
6
6
|
|
7
7
|
```ruby
|
8
8
|
class App < Eldr::App
|
9
|
-
get '/posts' do
|
9
|
+
get '/posts' do
|
10
10
|
Rack::Response.new "posts", 200
|
11
11
|
end
|
12
12
|
end
|
@@ -22,13 +22,13 @@ And when you want to combine them you can do this:
|
|
22
22
|
|
23
23
|
```ruby
|
24
24
|
class Posts < Eldr::App
|
25
|
-
get '/'
|
25
|
+
get '/'
|
26
26
|
Rack::Response.new "posts", 200
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
class Tasks < Eldr::App
|
31
|
-
get '/'
|
31
|
+
get '/'
|
32
32
|
Rack::Response.new "tasks", 200
|
33
33
|
end
|
34
34
|
end
|
@@ -131,8 +131,6 @@ I have already built and released extensions for many common tasks:
|
|
131
131
|
- [eldr-assets](https://github.com/eldr-rb/eldr-assets): asset tag helpers like `js('jquery', 'app')`, `css('app')` etc
|
132
132
|
- [eldr-responders](https://github.com/eldr-rb/eldr-responders): rails-responder like helpers
|
133
133
|
- [eldr-action](https://github.com/eldr-rb/eldr-action): Action Objects
|
134
|
-
- [eldr-service](https://github.com/eldr-rb/eldr-service): Action Objects for external services.
|
135
|
-
- [eldr-cascade](https://github.com/eldr-rb/eldr-cascade): A fork of Rack::Cascade that plays well with Rack::Response and eldr-action.
|
136
134
|
|
137
135
|
## Quickstart Guides
|
138
136
|
|
@@ -154,7 +152,7 @@ Now create a new file called app.rb with the following contents:
|
|
154
152
|
|
155
153
|
```ruby
|
156
154
|
class App < Eldr::App
|
157
|
-
get '/' do
|
155
|
+
get '/' do
|
158
156
|
Rack::Response.new "Hello World!", 200
|
159
157
|
end
|
160
158
|
end
|
@@ -177,7 +175,7 @@ When you visit http:///localhost:9292 in your browser you should see "Hello Worl
|
|
177
175
|
|
178
176
|
### Rendering a Template
|
179
177
|
|
180
|
-
Eldr provides no render helper in
|
178
|
+
Eldr provides no render helper in its core but it is easy to define your own.
|
181
179
|
One can use Tilt as the templating library (with your engine of choice) and then create some helper methods to handle finding the template and rendering it.
|
182
180
|
|
183
181
|
Create a module with the following:
|
@@ -497,7 +495,7 @@ access_control do
|
|
497
495
|
end
|
498
496
|
```
|
499
497
|
|
500
|
-
The DSL pulled a route's name and
|
498
|
+
The DSL pulled a route's name and its roles into a before filter, then checked them against the current_user's roles. The filter itself was five lines.
|
501
499
|
|
502
500
|
I soon realized that this was redundant abstraction. The DSL didn't save me any coding, it merely gave the code pretty words. I was sacrificing clarity for poetry.
|
503
501
|
|
@@ -525,7 +523,7 @@ This allows you to define a base app and allow all your controllers to share the
|
|
525
523
|
For example:
|
526
524
|
|
527
525
|
```ruby
|
528
|
-
class
|
526
|
+
class SimpleCounterMiddleware
|
529
527
|
def initialize(app)
|
530
528
|
@app = app
|
531
529
|
end
|
@@ -664,9 +662,11 @@ map '/users' do
|
|
664
662
|
end
|
665
663
|
```
|
666
664
|
|
667
|
-
If we wan to define all our controllers on the root we can use
|
665
|
+
If we wan to define all our controllers on the root we can use Eldr::Cascade. We define the routes we want to override, Cascade will get a 404 on the ones we didn't, then call the next app until it gets a response:
|
668
666
|
|
669
667
|
```ruby
|
668
|
+
require 'eldr'
|
669
|
+
require 'eldr/cascade'
|
670
670
|
class App
|
671
671
|
# override the users post route but nothing else
|
672
672
|
post '/users' do
|
data/TODOS
CHANGED
data/eldr.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency 'rake', '10.4.2'
|
26
26
|
s.add_development_dependency 'rspec', '3.1.0'
|
27
27
|
s.add_development_dependency 'rubocop', '0.28.0'
|
28
|
-
s.add_development_dependency 'rack-test', '0.6
|
28
|
+
s.add_development_dependency 'rack-test', '~> 0.6'
|
29
29
|
s.add_development_dependency 'tilt', '2.0.1'
|
30
30
|
s.add_development_dependency 'slim', '3.0.1'
|
31
31
|
s.add_development_dependency 'coveralls', '~> 0.7'
|
data/examples/app.ru
CHANGED
data/lib/eldr/app.rb
CHANGED
@@ -89,16 +89,15 @@ module Eldr
|
|
89
89
|
handler ||= args.pop if args.last.respond_to?(:call)
|
90
90
|
options ||= args.pop if args.last.is_a?(Hash)
|
91
91
|
options ||= {}
|
92
|
-
add(verb: verb.downcase.to_sym, path: path, handler: handler
|
92
|
+
add({ verb: verb.downcase.to_sym, path: path, handler: handler }.merge!(options))
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
def add(verb: :get,
|
97
|
-
|
98
|
-
route = Route.new(verb: verb, path: path, options: options, handler: handler)
|
96
|
+
def add(verb: :get, **route_attributes)
|
97
|
+
route = Route.new(route_attributes)
|
99
98
|
|
100
99
|
route.before_filters.push(*before_filters[route.name]) if before_filters.include? route.name
|
101
|
-
route.after_filters.push(*after_filters[route.name])
|
100
|
+
route.after_filters.push(*after_filters[route.name]) if after_filters.include? route.name
|
102
101
|
|
103
102
|
routes[verb] << route
|
104
103
|
route
|
data/lib/eldr/cascade.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# A version of Rack::Cascade that works with Rack::Response.
|
2
|
+
# Seriously? WTF Rack::Cascade
|
3
|
+
# TODO: Get fixes into rack and remove this entirely
|
4
|
+
module Eldr
|
5
|
+
class Cascade
|
6
|
+
NOTFOUND = [404, { 'CONTENT-TYPE' => 'text/plain' }, []]
|
7
|
+
|
8
|
+
attr_reader :apps
|
9
|
+
|
10
|
+
def initialize(apps, catch = [404, 405])
|
11
|
+
@apps = []
|
12
|
+
@has_app = {}
|
13
|
+
|
14
|
+
apps.each { |app| add app }
|
15
|
+
|
16
|
+
@catch = {}
|
17
|
+
[*catch].each { |status| @catch[status] = true }
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(env)
|
21
|
+
result = NOTFOUND
|
22
|
+
|
23
|
+
last_body = nil
|
24
|
+
|
25
|
+
@apps.each do |app|
|
26
|
+
last_body.close if last_body.respond_to? :close
|
27
|
+
|
28
|
+
result = app.call(env).to_a
|
29
|
+
last_body = result[2]
|
30
|
+
break unless @catch.include?(result[0].to_i)
|
31
|
+
end
|
32
|
+
|
33
|
+
result
|
34
|
+
end
|
35
|
+
|
36
|
+
def add(app)
|
37
|
+
@has_app[app] = true
|
38
|
+
@apps << app
|
39
|
+
end
|
40
|
+
|
41
|
+
def include?(app)
|
42
|
+
@has_app.include? app
|
43
|
+
end
|
44
|
+
|
45
|
+
alias_method :<<, :add
|
46
|
+
end
|
47
|
+
end
|
data/lib/eldr/matcher.rb
CHANGED
@@ -2,27 +2,15 @@ require 'mustermann'
|
|
2
2
|
|
3
3
|
module Eldr
|
4
4
|
class Matcher
|
5
|
-
PATH_DELIMITER = '/'.freeze
|
6
|
-
QUERY_PREFIX = '?'.freeze
|
7
|
-
QUERY_DELIMITER = '&'.freeze
|
8
|
-
|
9
5
|
def initialize(path, options = {})
|
10
|
-
@path
|
6
|
+
@path = path
|
11
7
|
@capture = options.delete(:capture)
|
12
|
-
@default_values = options.delete(:default_values)
|
13
8
|
end
|
14
9
|
|
15
10
|
def match(pattern)
|
16
|
-
match_data = handler.match(pattern)
|
17
|
-
return match_data if match_data
|
18
|
-
pattern = pattern[0..-2] if mustermann? && pattern != PATH_DELIMITER && pattern.end_with?(PATH_DELIMITER)
|
19
11
|
handler.match(pattern)
|
20
12
|
end
|
21
13
|
|
22
|
-
def mustermann?
|
23
|
-
handler.instance_of?(Mustermann)
|
24
|
-
end
|
25
|
-
|
26
14
|
def handler
|
27
15
|
@handler ||=
|
28
16
|
case @path
|
data/lib/eldr/recognizer.rb
CHANGED
data/lib/eldr/route.rb
CHANGED
@@ -1,73 +1,63 @@
|
|
1
1
|
module Eldr
|
2
2
|
class Route
|
3
|
-
attr_accessor :
|
4
|
-
attr_accessor :before_filters, :after_filters, :to
|
3
|
+
attr_accessor :app, :verb, :path, :name, :order, :handler, :before_filters, :after_filters
|
5
4
|
|
6
|
-
def initialize(verb: :get, path: '/', name: nil,
|
7
|
-
@path, @
|
5
|
+
def initialize(verb: :get, path: '/', name: nil, order: 0, handler: nil, to: nil)
|
6
|
+
@verb, @path, @name, @order = verb.to_s.upcase, path, name, order
|
7
|
+
@before_filters, @after_filters = [], []
|
8
|
+
handler ||= to
|
9
|
+
@handler = create_handler(handler)
|
10
|
+
end
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
@before_filters = []
|
12
|
-
@after_filters = []
|
13
|
-
@name = name
|
12
|
+
def create_handler(handler)
|
13
|
+
return handler unless handler.is_a? String
|
14
14
|
|
15
|
-
|
15
|
+
controller, method = handler.split('#')
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
proc do |env|
|
18
|
+
obj = Object.const_get(controller).new
|
19
|
+
obj.send(method.to_sym, env)
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
21
23
|
def call(env, app: nil)
|
22
|
-
# TODO: Investigate
|
23
|
-
# maybe if we passed this around between methods it would be more perfomant
|
24
|
-
# than setting the accessor?
|
25
24
|
@app = app
|
26
25
|
|
27
|
-
|
28
|
-
@before_filters.each { |filter| app.instance_exec(env, &filter) }
|
26
|
+
call_before_filters(env)
|
29
27
|
|
30
|
-
resp =
|
28
|
+
resp = call_handler(env)
|
31
29
|
|
32
|
-
|
33
|
-
@after_filters.each { |filter| app.instance_exec(env, &filter) }
|
30
|
+
call_after_filters(env)
|
34
31
|
|
35
32
|
resp
|
36
33
|
end
|
37
34
|
|
38
|
-
def
|
39
|
-
if
|
40
|
-
app.instance_exec(env,
|
41
|
-
|
42
|
-
rails_style_response(env)
|
35
|
+
def call_before_filters(env)
|
36
|
+
if app
|
37
|
+
app.class.before_filters[:all].each { |filter| app.instance_exec(env, &filter) }
|
38
|
+
before_filters.each { |filter| app.instance_exec(env, &filter) }
|
43
39
|
else
|
44
|
-
|
40
|
+
before_filters.each { |filter| filter.call(env) }
|
45
41
|
end
|
46
42
|
end
|
47
43
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
if method
|
54
|
-
obj.send(method.to_sym, env)
|
44
|
+
def call_after_filters(env)
|
45
|
+
if app
|
46
|
+
app.class.after_filters[:all].each { |filter| app.instance_exec(env, &filter) }
|
47
|
+
after_filters.each { |filter| app.instance_exec(env, &filter) }
|
55
48
|
else
|
56
|
-
|
49
|
+
after_filters.each { |filter| filter.call(env) }
|
57
50
|
end
|
58
51
|
end
|
59
52
|
|
60
|
-
def
|
61
|
-
|
62
|
-
|
63
|
-
|
53
|
+
def call_handler(env)
|
54
|
+
if app and handler.is_a? Proc
|
55
|
+
app.instance_exec(env, &handler)
|
56
|
+
else
|
57
|
+
handler.call(env)
|
64
58
|
end
|
65
59
|
end
|
66
60
|
|
67
|
-
def accessor?(key)
|
68
|
-
respond_to?("#{key}=") && respond_to?(key)
|
69
|
-
end
|
70
|
-
|
71
61
|
def matcher
|
72
62
|
@matcher ||= Matcher.new(path, capture: @capture)
|
73
63
|
end
|
@@ -76,17 +66,9 @@ module Eldr
|
|
76
66
|
matcher.match(pattern)
|
77
67
|
end
|
78
68
|
|
79
|
-
def path(*args)
|
80
|
-
return @path if args.empty?
|
81
|
-
params = args[0]
|
82
|
-
params.delete(:captures)
|
83
|
-
matcher.expand(params)
|
84
|
-
end
|
85
|
-
|
86
69
|
def params(pattern)
|
87
70
|
params = matcher.handler.params(pattern)
|
88
|
-
params ||= {}
|
89
|
-
params
|
71
|
+
params ||= {} # rubocop:disable Lint/UselessAssignment
|
90
72
|
end
|
91
73
|
end
|
92
74
|
end
|
data/lib/eldr/version.rb
CHANGED
data/spec/route_spec.rb
CHANGED
@@ -17,28 +17,20 @@ describe Eldr::Route do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'takes options and sets them' do
|
20
|
-
route = Eldr::Route.new(
|
20
|
+
route = Eldr::Route.new(name: :cats)
|
21
21
|
expect(route.name).to eq(:cats)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
describe '#
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
it 'determines type of handler and calls it' do
|
31
|
-
expect(route.response({})).to eq('cats')
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe '#rails_style_response' do
|
36
|
-
let(:route) do
|
37
|
-
Eldr::Route.new(handler: 'CatsHandler#index')
|
38
|
-
end
|
25
|
+
describe '#create_handler' do
|
26
|
+
context 'rails style handler' do
|
27
|
+
let(:route) do
|
28
|
+
Eldr::Route.new(handler: 'CatsHandler#index')
|
29
|
+
end
|
39
30
|
|
40
|
-
|
41
|
-
|
31
|
+
it 'wraps the handler in a proc' do
|
32
|
+
expect(route.create_handler('CatsHandler#index')).to be_a Proc
|
33
|
+
end
|
42
34
|
end
|
43
35
|
end
|
44
36
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eldr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- K-2052
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -112,16 +112,16 @@ dependencies:
|
|
112
112
|
name: rack-test
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.6
|
117
|
+
version: '0.6'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.6
|
124
|
+
version: '0.6'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: tilt
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -200,6 +200,7 @@ files:
|
|
200
200
|
- lib/eldr.rb
|
201
201
|
- lib/eldr/app.rb
|
202
202
|
- lib/eldr/builder.rb
|
203
|
+
- lib/eldr/cascade.rb
|
203
204
|
- lib/eldr/configuration.rb
|
204
205
|
- lib/eldr/matcher.rb
|
205
206
|
- lib/eldr/recognizer.rb
|