track 0.0.1
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.
- data/CHANGELOG.md +0 -0
- data/LICENSE +0 -0
- data/README.md +0 -0
- data/ROADMAP.md +0 -0
- data/lib/track.rb +8 -0
- data/lib/track/application.rb +50 -0
- data/lib/track/config.rb +7 -0
- data/lib/track/filter_map.rb +17 -0
- data/lib/track/route_map.rb +45 -0
- metadata +109 -0
data/CHANGELOG.md
ADDED
File without changes
|
data/LICENSE
ADDED
File without changes
|
data/README.md
ADDED
File without changes
|
data/ROADMAP.md
ADDED
File without changes
|
data/lib/track.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require_relative 'route_map'
|
3
|
+
require_relative 'filter_map'
|
4
|
+
|
5
|
+
module Track
|
6
|
+
class Application
|
7
|
+
|
8
|
+
@@route_map = RouteMap.new
|
9
|
+
@@filter_map = FilterMap.new
|
10
|
+
|
11
|
+
attr_accessor :params
|
12
|
+
|
13
|
+
def initialize(routing_error_response = [404, { 'Content-Type' => 'text/plain' }, ['route not found']])
|
14
|
+
@routing_error_response = routing_error_response
|
15
|
+
@params = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def call(env)
|
19
|
+
req = Rack::Request.new(env)
|
20
|
+
@params.merge!(req.params)
|
21
|
+
if route = @@route_map.scan(self.class.name, req)
|
22
|
+
@params.merge!(route[:matches])
|
23
|
+
response_for(route)
|
24
|
+
else
|
25
|
+
@routing_error_response
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def response_for(route)
|
32
|
+
if filters = @@filter_map.scan(self.class.name, route[:action])
|
33
|
+
filters.each do |m|
|
34
|
+
response = send(m)
|
35
|
+
return response if response
|
36
|
+
end
|
37
|
+
end
|
38
|
+
send(route[:action])
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.route(pattern, action, methods = nil)
|
42
|
+
@@route_map.add self.name, pattern, action, methods
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.before(action, method)
|
46
|
+
@@filter_map.add self.name, action, method
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
data/lib/track/config.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Track
|
4
|
+
class FilterMap < Hash
|
5
|
+
|
6
|
+
def add(clazz, action, method)
|
7
|
+
self[clazz] ||= {}
|
8
|
+
self[clazz][action.to_sym] ||= []
|
9
|
+
self[clazz][action.to_sym] << method.to_sym
|
10
|
+
end
|
11
|
+
|
12
|
+
def scan(clazz, action)
|
13
|
+
self[clazz] && self[clazz][action.to_sym] ? self[clazz][action.to_sym] : nil
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Track
|
4
|
+
class RouteMap < Hash
|
5
|
+
|
6
|
+
def add(clazz, pattern, action, methods)
|
7
|
+
methods = methods.is_a?(Array) ? methods : [methods] if methods
|
8
|
+
self[clazz] ||= []
|
9
|
+
self[clazz].push(
|
10
|
+
:pattern => compile_regexp(pattern),
|
11
|
+
:action => action.to_sym,
|
12
|
+
:methods => methods
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def scan(clazz, req)
|
17
|
+
method = req.request_method.downcase.to_sym
|
18
|
+
self[clazz].each do |route|
|
19
|
+
md = req.path_info.match(route[:pattern])
|
20
|
+
return route.merge(:matches => match_hash(md)) if md && allowed_method?(route, method)
|
21
|
+
end
|
22
|
+
false
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def allowed_method?(route, method)
|
28
|
+
route[:methods].nil? ? true : route[:methods].include?(method)
|
29
|
+
end
|
30
|
+
|
31
|
+
def match_hash(md)
|
32
|
+
params = {}
|
33
|
+
md.names.each do |key|
|
34
|
+
params[key.to_s] = md[key]
|
35
|
+
end
|
36
|
+
params
|
37
|
+
end
|
38
|
+
|
39
|
+
def compile_regexp(pattern)
|
40
|
+
pattern = (pattern[-1,1] == '/' ? pattern.chop : pattern) << '/?'
|
41
|
+
pattern.gsub!(/:([^\/]+)/i, '(?<\1> [^/]+)')
|
42
|
+
Regexp.new('\A'+pattern+'\z', Regexp::EXTENDED)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: track
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Lars Kuhnt
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-07 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rack
|
16
|
+
requirement: &70213019125900 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70213019125900
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &70213019125440 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70213019125440
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: guard-rspec
|
38
|
+
requirement: &70213019125020 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70213019125020
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rack-test
|
49
|
+
requirement: &70213019124600 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70213019124600
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rake
|
60
|
+
requirement: &70213019124180 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70213019124180
|
69
|
+
description: Nano framework to build small server applications based on rack
|
70
|
+
email:
|
71
|
+
- lars.kuhnt@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/track/application.rb
|
77
|
+
- lib/track/config.rb
|
78
|
+
- lib/track/filter_map.rb
|
79
|
+
- lib/track/route_map.rb
|
80
|
+
- lib/track.rb
|
81
|
+
- LICENSE
|
82
|
+
- README.md
|
83
|
+
- CHANGELOG.md
|
84
|
+
- ROADMAP.md
|
85
|
+
homepage: http://github.com/larskuhnt/track
|
86
|
+
licenses: []
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 1.3.6
|
103
|
+
requirements: []
|
104
|
+
rubyforge_project:
|
105
|
+
rubygems_version: 1.8.10
|
106
|
+
signing_key:
|
107
|
+
specification_version: 3
|
108
|
+
summary: Nano framework to build small server applications based on rack
|
109
|
+
test_files: []
|