track 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,8 @@
1
+ module Track
2
+ VERSION = '0.0.1'
3
+ end
4
+
5
+ require 'rack'
6
+ require 'track/application'
7
+ require 'track/config'
8
+
@@ -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
@@ -0,0 +1,7 @@
1
+ # encoding: utf-8
2
+
3
+ module Track
4
+ class Config
5
+
6
+ end
7
+ end
@@ -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: []