track 0.0.2 → 0.1.0

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/README.md CHANGED
@@ -1,3 +1,73 @@
1
1
  # Track
2
2
 
3
- A nano framework for server applications based on rack and ruby 1.9
3
+ A nano framework for server applications based on rack and ruby 1.9 named capture groups.
4
+
5
+ ## What Track does
6
+
7
+ - modularize your rack app through controllers
8
+ - routes paths to methods inside of your controllers via the `route` method
9
+ - define before filters via the `pre` method
10
+
11
+ ## What Track does *not*
12
+
13
+ - support any template engines, your actions have to return low level rack responses
14
+ - support any ORM framework
15
+
16
+ ## Install
17
+
18
+ add the following to your Gemfile
19
+
20
+ `gem 'track'`
21
+
22
+ or install it via rubygems
23
+
24
+ `gem install track`
25
+
26
+ ## Usage
27
+
28
+ Subclass the `Track::Controller` class to define controllers:
29
+
30
+ ### Example
31
+
32
+ ```ruby
33
+ class UsersController < Track::Controller
34
+
35
+ route '/', :index, :get
36
+ route '/show/:id', :show, :get
37
+ route '/update/(?<id> [^\/]+)', :show, [:post, :put]
38
+
39
+ pre :find_user, :show
40
+
41
+ def index
42
+ [200, { "Content-Type" => 'text/plain' }, StringIO.new('hello from index')]
43
+ end
44
+
45
+ def show
46
+ [200, { "Content-Type" => 'text/plain' }, StringIO.new(@user.name)]
47
+ end
48
+
49
+ private
50
+
51
+ def find_user
52
+ @user = User.find(params['id'])
53
+ fail [404, { "Content-Type" => 'text/plain' }, StringIO.new('user not found')] unless @user
54
+ end
55
+ end
56
+ ```
57
+
58
+ The `route` method maps a route to an action in your controller. You can define named parameters by appending a : or by using a named capture group.
59
+
60
+ You can build arbitrary path match patterns by using regaular expressions.
61
+
62
+ The `pre` method calls a method prior to the action. If `fail` is called in before filter method the action will not get called and the given response will be returned.
63
+
64
+ ## Author
65
+
66
+ [Lars Kuhnt](http://www.github.com/larskuhnt)
67
+ Copyright (c) 2011
68
+
69
+ ## License
70
+
71
+ Published under the MIT License.
72
+
73
+ See [LICENSE](LICENSE) for details.
data/lib/track.rb CHANGED
@@ -1,8 +1,6 @@
1
- module Track
2
- VERSION = '0.0.2'
3
- end
4
-
5
1
  require 'rack'
6
- require 'track/application'
7
- require 'track/config'
2
+ require 'track/controller'
8
3
 
4
+ module Track
5
+ VERSION = '0.1.0'
6
+ end
@@ -3,18 +3,17 @@ require_relative 'route_map'
3
3
  require_relative 'filter_map'
4
4
 
5
5
  module Track
6
- class Application
7
-
6
+ class Controller
7
+
8
8
  @@route_map = RouteMap.new
9
9
  @@filter_map = FilterMap.new
10
-
10
+
11
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
12
+
13
+ def initialize
15
14
  @params = {}
16
15
  end
17
-
16
+
18
17
  def call(env)
19
18
  req = Rack::Request.new(env)
20
19
  @params.merge!(req.params)
@@ -22,28 +21,36 @@ module Track
22
21
  @params.merge!(route[:matches])
23
22
  response_for(route)
24
23
  else
25
- @routing_error_response
24
+ routing_error
26
25
  end
27
26
  end
28
-
27
+
29
28
  protected
30
-
29
+
30
+ def routing_error
31
+ [404, { 'Content-Type' => 'text/plain' }, ['route not found']]
32
+ end
33
+
31
34
  def response_for(route)
32
35
  if filters = @@filter_map.scan(self.class.name, route[:action])
33
36
  filters.each do |m|
34
- response = send(m)
35
- return response if response
37
+ send(m)
38
+ return @_response if @_response
36
39
  end
37
40
  end
38
41
  send(route[:action])
39
42
  end
40
-
43
+
44
+ def fail(response = [404, { 'Content-Type' => 'text/plain' }, ['']])
45
+ @_response = response
46
+ end
47
+
41
48
  def self.route(pattern, action, methods = nil)
42
49
  @@route_map.add self.name, pattern, action, methods
43
50
  end
44
-
45
- def self.before(action, method)
46
- @@filter_map.add self.name, action, method
51
+
52
+ def self.pre(method, actions)
53
+ @@filter_map.add self.name, method, actions
47
54
  end
48
55
 
49
56
  end
@@ -3,14 +3,21 @@
3
3
  module Track
4
4
  class FilterMap < Hash
5
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
6
+ def add(key, method, actions)
7
+ self[key] ||= {}
8
+ actions = actions.is_a?(Array) ? actions.map(&:to_sym) : [actions.to_sym]
9
+ actions.each do |action|
10
+ self[key][action.to_sym] ||= []
11
+ self[key][action.to_sym] << method.to_sym
12
+ end
10
13
  end
11
14
 
12
- def scan(clazz, action)
13
- self[clazz] && self[clazz][action.to_sym] ? self[clazz][action.to_sym] : nil
15
+ def scan(key, action)
16
+ if self[key]
17
+ self[key][action.to_sym] ? self[key][action.to_sym] : []
18
+ else
19
+ []
20
+ end
14
21
  end
15
22
 
16
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: track
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-07 00:00:00.000000000Z
12
+ date: 2011-12-08 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
- requirement: &70217309920280 !ruby/object:Gem::Requirement
16
+ requirement: &70191469044140 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70217309920280
24
+ version_requirements: *70191469044140
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70217309919780 !ruby/object:Gem::Requirement
27
+ requirement: &70191469043600 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70217309919780
35
+ version_requirements: *70191469043600
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: guard-rspec
38
- requirement: &70217309919340 !ruby/object:Gem::Requirement
38
+ requirement: &70191469043180 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70217309919340
46
+ version_requirements: *70191469043180
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rack-test
49
- requirement: &70217309918920 !ruby/object:Gem::Requirement
49
+ requirement: &70191469042760 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70217309918920
57
+ version_requirements: *70191469042760
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &70217309918500 !ruby/object:Gem::Requirement
60
+ requirement: &70191469042300 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70217309918500
68
+ version_requirements: *70191469042300
69
69
  description: Nano framework to build small server applications based on rack and ruby
70
70
  1.9
71
71
  email:
@@ -74,8 +74,7 @@ executables: []
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
- - lib/track/application.rb
78
- - lib/track/config.rb
77
+ - lib/track/controller.rb
79
78
  - lib/track/filter_map.rb
80
79
  - lib/track/route_map.rb
81
80
  - lib/track.rb
data/lib/track/config.rb DELETED
@@ -1,7 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Track
4
- class Config
5
-
6
- end
7
- end