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 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: []