sidewalk 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,23 @@
1
+ module Sidewalk
2
+ module Oniguruma
3
+ module MatchData
4
+ def names
5
+ if @named_captures
6
+ @named_captures.keys.map(&:to_s)
7
+ else
8
+ []
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ USING_ONIGURUMA = RUBY_VERSION.start_with?('1.8.')
15
+ if USING_ONIGURUMA
16
+ require 'oniguruma'
17
+ Regexp = ::Oniguruma::ORegexp
18
+
19
+ ::MatchData.send(:include, Sidewalk::Oniguruma::MatchData)
20
+ else
21
+ Regexp = ::Regexp
22
+ end
23
+ end
@@ -0,0 +1,88 @@
1
+ require 'sidewalk/uri_match'
2
+
3
+ require 'rack/request'
4
+ require 'uri'
5
+
6
+ module Sidewalk
7
+ class Request
8
+ attr_reader :root_uri, :request_uri
9
+ def initialize env
10
+ @env = env
11
+ @rack_version = env['rack.version']
12
+
13
+ sanity_check!
14
+ @rack_request = Rack::Request.new(@env)
15
+
16
+ initialize_uris
17
+ end
18
+
19
+ def secure?
20
+ @secure
21
+ end
22
+
23
+ def get_params
24
+ @get_params ||= @rack_request.GET
25
+ end
26
+
27
+ def uri_match
28
+ @uri_match ||= @env['sidewalk.urimatch']
29
+ end
30
+
31
+ def post_params
32
+ @post_params ||= @rack_request.POST
33
+ end
34
+
35
+ def uri_params
36
+ uri_match.parameters
37
+ end
38
+
39
+ def params
40
+ # URI parameters take precendence
41
+ @params ||= post_params.merge(get_params.merge(uri_params))
42
+ end
43
+
44
+ private
45
+
46
+ def initialize_uris
47
+ case @env['rack.url_scheme']
48
+ when 'http'
49
+ @secure = false
50
+ uri_class = URI::HTTP
51
+ when 'https'
52
+ @secure = true
53
+ uri_class = URI::HTTPS
54
+ else
55
+ raise "Unknown URL scheme: #{@env['rack.url_scheme'].inspect}"
56
+ end
57
+
58
+ root = @env['SCRIPT_NAME']
59
+ unless root.start_with? '/'
60
+ root[0,0] = '/' # no prepend on 1.8
61
+ end
62
+
63
+ @root_uri = uri_class.build(
64
+ :host => @env['SERVER_NAME'],
65
+ :port => @env['SERVER_PORT'].to_i,
66
+ :path => root
67
+ ).freeze
68
+ path_info = @env['PATH_INFO']
69
+ if root.end_with? '/' and path_info.start_with? '/'
70
+ path_info = path_info[1..-1]
71
+ end
72
+ @request_uri = @root_uri.dup
73
+ @request_uri.path += path_info
74
+ @request_uri.query = @env['QUERY_STRING']
75
+ @request_uri.freeze
76
+ end
77
+
78
+ def sanity_check!
79
+ # Sanity checks
80
+ unless @rack_version
81
+ raise ArgumentError.new "env doesn't specify a Rack version"
82
+ end
83
+ if @rack_version != [1, 1]
84
+ raise "Expected Rack version [1, 1], got #{@rack_version}"
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,81 @@
1
+ require 'sidewalk/regexp'
2
+ require 'sidewalk/uri_match'
3
+
4
+ module Sidewalk
5
+ class UriMapper
6
+ attr_reader :uri_map
7
+ def initialize uri_map = {}
8
+ unless uri_map.is_a? Hash
9
+ raise ArgumentError.new('URI map must be a Hash')
10
+ end
11
+ @uri_map = Sidewalk::UriMapper.convert_map(uri_map)
12
+ end
13
+
14
+ def map path
15
+ Sidewalk::UriMapper.map(
16
+ [], #stack
17
+ self.uri_map,
18
+ path
19
+ )
20
+ end
21
+
22
+ # Replace string keys with Sidewalk::Regexp instances
23
+ def self.convert_map uri_map
24
+ out = {}
25
+ uri_map.each do |key, value|
26
+ # In particular, we don't want standard regexp objects -
27
+ # those don't support named captures on 1.8
28
+ unless key.is_a? String
29
+ raise ArgumentError.new('URI map keys must be strings')
30
+ end
31
+
32
+ unless key.include? '^'
33
+ key = '^' + key
34
+ end
35
+
36
+ key = Sidewalk::Regexp.new(key)
37
+ if value.is_a? Hash
38
+ out[key] = convert_map(value)
39
+ else
40
+ out[key] = value
41
+ end
42
+ end
43
+ out
44
+ end
45
+
46
+ def self.map stack, uri_map, path
47
+ uri_map.each do |re, next_map|
48
+ match = re.match(path)
49
+ next unless match
50
+
51
+ stack.push re.source[1..-1] # get rid of the '^' added
52
+
53
+ case next_map
54
+ when Hash
55
+ return map(stack, next_map, match.post_match)
56
+ else
57
+ params = {}
58
+ match.names.map.each do |name|
59
+ # the symbol vs string stuff is because of differences between
60
+ # Regexp on Ruby 1.9 and Oniguruma::ORegexp on Ruby 1.8
61
+ symbol = name.to_sym
62
+ string = name.to_s
63
+
64
+ value = match[symbol]
65
+ if value
66
+ params[string] = value
67
+ params[symbol] = value
68
+ end
69
+ end
70
+
71
+ return UriMatch.new(
72
+ stack,
73
+ params,
74
+ next_map
75
+ )
76
+ end
77
+ end
78
+ nil
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,13 @@
1
+ module Sidewalk
2
+ class UriMatch
3
+ attr_reader :parts, :parameters, :controller
4
+ def initialize parts = [], parameters = {}, controller = nil
5
+ unless parts.is_a?(Array) && parameters.is_a?(Hash)
6
+ raise ArgumentError.new(
7
+ 'Sidewalk::UriMatch([parts], {parameters}, controller)'
8
+ )
9
+ end
10
+ @parts, @parameters, @controller = parts, parameters, controller
11
+ end
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sidewalk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Fred Emmott
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: &70101453840880 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.4'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70101453840880
25
+ description:
26
+ email:
27
+ - sidewalk-gem@fredemmott.co.uk
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - lib/sidewalk/regexp.rb
33
+ - lib/sidewalk/request.rb
34
+ - lib/sidewalk/uri_mapper.rb
35
+ - lib/sidewalk/uri_match.rb
36
+ homepage: https://github.com/fredemmott/sidewalk
37
+ licenses: []
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubyforge_project:
56
+ rubygems_version: 1.8.6
57
+ signing_key:
58
+ specification_version: 3
59
+ summary: A lightweight web framework
60
+ test_files: []