sidewalk 0.0.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.
@@ -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: []