rack-matrix_params 0.0.1 → 0.0.5
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/.travis.yml +4 -0
- data/README.markdown +19 -7
- data/TODO +1 -0
- data/VERSION +1 -0
- data/lib/rack/matrix_params.rb +26 -24
- data/rack-matrix_params.gemspec +5 -3
- data/spec/matrix_params_spec.rb +64 -0
- data/spec/spec_helper.rb +7 -0
- metadata +46 -13
- data/lib/rack/matrix_params/version.rb +0 -5
data/.travis.yml
ADDED
data/README.markdown
CHANGED
@@ -1,18 +1,23 @@
|
|
1
1
|
Rack::MatrixParams
|
2
2
|
==================
|
3
3
|
|
4
|
-
|
4
|
+
[](https://travis-ci.org/jphastings/rack-matrix_params)
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
|
7
|
+
Just simple Rack middleware to enable 'matrix' params.
|
8
|
+
|
9
|
+
*Originally developed by [Michal Fojtik](https://github.com/mifo/rack-matrix-params).*
|
10
|
+
|
11
|
+
Features
|
12
|
+
--------
|
8
13
|
|
9
14
|
- Allow you to use Matrix URLs:
|
10
15
|
- http://localhost:9393/library;category=biology/book;author=Bond;hardcover=yes
|
11
16
|
- http://localhost:9393/library/book;author=Bond;hardcover=yes
|
12
17
|
- http://localhost:9393/library;category=biology/book?id=123
|
13
18
|
|
14
|
-
|
15
|
-
|
19
|
+
Examples
|
20
|
+
--------
|
16
21
|
|
17
22
|
### Example Sinatra server
|
18
23
|
|
@@ -22,7 +27,7 @@ EXAMPLES:
|
|
22
27
|
use Rack::MatrixParams
|
23
28
|
|
24
29
|
get '/' do
|
25
|
-
"Visit <a href=\"/library;category=biology/book;author=Bond;hardcover=yes\"
|
30
|
+
"Visit <a href=\"/library;category=biology/book;author=Bond;hardcover=yes\">a matrix URL</a>."
|
26
31
|
end
|
27
32
|
|
28
33
|
get '/library/book' do
|
@@ -44,7 +49,14 @@ http://localhost:9393/library;category=biology/book?id=123
|
|
44
49
|
params['library']['category']='biology'
|
45
50
|
params['id']=123
|
46
51
|
|
47
|
-
|
52
|
+
To Do
|
53
|
+
-----
|
54
|
+
|
55
|
+
* Write more tests!
|
56
|
+
* Investigate which environment variables are changed, so that hopefully the Rack Log (eg. in Sinatra) doesn't have the hacked query string visible.
|
57
|
+
|
58
|
+
LICENSE
|
59
|
+
-------
|
48
60
|
|
49
61
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
50
62
|
contributor license agreements. See the NOTICE file distributed with
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.5
|
data/lib/rack/matrix_params.rb
CHANGED
@@ -40,50 +40,52 @@ module Rack
|
|
40
40
|
# regular <form> parameters.
|
41
41
|
|
42
42
|
def call(env)
|
43
|
-
# Copy PATH_INFO to REQUEST_URI if Rack::Test
|
44
|
-
env['REQUEST_URI'] = env['PATH_INFO'] if env['rack.test']
|
45
|
-
|
46
43
|
# Split URI to components and then extract ;var=value pairs
|
47
|
-
uri_components = env['
|
44
|
+
uri_components = env['PATH_INFO'].split('/')
|
48
45
|
matrix_params = {}
|
49
46
|
uri_components.each do |component|
|
50
|
-
sub_components, value = component.split(/\;(\w+)\=/), nil
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
47
|
+
sub_components, value = component.split(/\;([\w:]+)\=/), nil
|
48
|
+
next unless sub_components.first # Skip subcomponent if it's empty (usually /)
|
49
|
+
while param = sub_components.pop do
|
50
|
+
if value
|
51
|
+
# There are matrix components to this path element
|
52
|
+
(matrix_params[sub_components.first] ||= {}).merge!( param => value )
|
53
|
+
|
54
|
+
value = nil
|
55
|
+
next
|
56
|
+
else
|
57
|
+
# There are no matrix components to this path element
|
58
|
+
value = param
|
59
|
+
end
|
62
60
|
end
|
63
61
|
end
|
64
|
-
|
62
|
+
|
63
|
+
# No need for anything else if there are no matrix params
|
64
|
+
return @app.call(env) if matrix_params.keys.empty?
|
65
65
|
|
66
66
|
# If request method is POST, simply include matrix params in form_hash
|
67
67
|
env['rack.request.form_hash'].merge!(matrix_params) if env['rack.request.form_hash']
|
68
68
|
|
69
69
|
# For other methods it's a way complicated ;-)
|
70
|
-
if env['REQUEST_METHOD']!='POST'
|
70
|
+
if env['REQUEST_METHOD'] != 'POST'
|
71
71
|
|
72
|
-
# Rewrite current path and query string and strip all
|
73
|
-
env['
|
74
|
-
|
75
|
-
env['QUERY_STRING']
|
72
|
+
# Rewrite current path and query string and strip all query params from it
|
73
|
+
env['PATH_INFO'].gsub!(/;([^\/]*)/, '').gsub(/\?(.*)$/, '')
|
74
|
+
|
75
|
+
env['QUERY_STRING'].gsub!(/;([^\/]*)/, '').freeze
|
76
76
|
|
77
77
|
new_params = matrix_params.collect do |component, params|
|
78
|
-
params.collect
|
78
|
+
params.collect do |k,v|
|
79
|
+
"#{component}[#{k}]=#{CGI::escape(v.to_s)}"
|
80
|
+
end
|
79
81
|
end.flatten
|
80
82
|
|
81
83
|
# Add matrix params as a regular GET params
|
82
84
|
env['QUERY_STRING'] += '&' if not env['QUERY_STRING'].empty?
|
83
85
|
env['QUERY_STRING'] += "#{new_params.join('&')}"
|
84
86
|
end
|
87
|
+
|
85
88
|
@app.call(env)
|
86
89
|
end
|
87
90
|
end
|
88
|
-
|
89
91
|
end
|
data/rack-matrix_params.gemspec
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'rack/matrix_params/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |gem|
|
7
6
|
gem.name = "rack-matrix_params"
|
8
|
-
gem.version =
|
7
|
+
gem.version = open('./VERSION').read
|
9
8
|
gem.authors = ["JP Hastings-Spital","Michal Fojtik"]
|
10
9
|
gem.email = ["jphastings@gmail.com"]
|
11
10
|
gem.description = %q{Rack middleware that populates the params variable with the contents of matrix parameters in a URL}
|
@@ -16,7 +15,10 @@ Gem::Specification.new do |gem|
|
|
16
15
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
16
|
gem.require_paths = ["lib"]
|
18
17
|
|
19
|
-
gem.
|
18
|
+
gem.add_dependency 'rack'
|
19
|
+
|
20
20
|
gem.add_development_dependency 'rake'
|
21
|
+
gem.add_development_dependency 'rspec'
|
21
22
|
gem.add_development_dependency 'bundler'
|
23
|
+
gem.add_development_dependency 'rack-test'
|
22
24
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__),'spec_helper')
|
2
|
+
|
3
|
+
describe Rack::MatrixParams do
|
4
|
+
include Rack::Test::Methods
|
5
|
+
|
6
|
+
let(:inner_app) do
|
7
|
+
lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['All good!'] ]}
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:app) { described_class.new(inner_app) }
|
11
|
+
|
12
|
+
it 'should not change a normal GET query' do
|
13
|
+
get "/?key=value"
|
14
|
+
|
15
|
+
last_request.env['PATH_INFO'].should == "/"
|
16
|
+
last_request.env['REQUEST_METHOD'].should == "GET"
|
17
|
+
last_request.env['QUERY_STRING'].should == "key=value"
|
18
|
+
last_response.should be_ok
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should not change a normal POST query' do
|
22
|
+
post "/",{'key' => "value"}
|
23
|
+
|
24
|
+
last_request.env['PATH_INFO'].should == "/"
|
25
|
+
last_request.env['REQUEST_METHOD'].should == "POST"
|
26
|
+
last_request.env['rack.input'].read.should == "key=value"
|
27
|
+
last_response.should be_ok
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should add variables to the params when a matrix URL is used on a GET request' do
|
31
|
+
get "/path/info;key=value/more"
|
32
|
+
|
33
|
+
last_request.env['PATH_INFO'].should == "/path/info/more"
|
34
|
+
last_request.env['QUERY_STRING'].should == "info[key]=value"
|
35
|
+
last_response.should be_ok
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should not erase data in a query parameter if a matrix parameter has the same keyname' do
|
39
|
+
get '/path/info;key=value/more?info[key]=somethingelse'
|
40
|
+
|
41
|
+
last_request.env['QUERY_STRING'].should == "info[key]=somethingelse&info[key]=value"
|
42
|
+
last_response.should be_ok
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should put matrix parameters after query parameters' do
|
46
|
+
get '/path/info;key=value/more?queryparams'
|
47
|
+
|
48
|
+
last_request.env['QUERY_STRING'].should == "queryparams&info[key]=value"
|
49
|
+
last_request.env['QUERY_STRING'].should_not == "info[key]=value&queryparams"
|
50
|
+
last_response.should be_ok
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should provide access to the matrix parameters via the params variable' do
|
54
|
+
get '/path/info;key=value/more?queryparams'
|
55
|
+
|
56
|
+
last_request.params.should == {'queryparams'=>nil, 'info'=>{'key'=>'value'}}
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should work in the blinkbox books format' do
|
60
|
+
get '/client;img:w=200/server;v=0/test/9780111222333.sample.epub/OEBPS/chapter_001.html'
|
61
|
+
|
62
|
+
last_request.params.should == {'client'=>{'img:w' => '200'}, 'server'=>{'v'=>'0'}}
|
63
|
+
end
|
64
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-matrix_params
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,17 +10,17 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-02-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: rack
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '0'
|
23
|
-
type: :
|
23
|
+
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
none: false
|
@@ -44,6 +44,22 @@ dependencies:
|
|
44
44
|
- - ! '>='
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: !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: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
47
63
|
- !ruby/object:Gem::Dependency
|
48
64
|
name: bundler
|
49
65
|
requirement: !ruby/object:Gem::Requirement
|
@@ -60,6 +76,22 @@ dependencies:
|
|
60
76
|
- - ! '>='
|
61
77
|
- !ruby/object:Gem::Version
|
62
78
|
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: rack-test
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
63
95
|
description: Rack middleware that populates the params variable with the contents
|
64
96
|
of matrix parameters in a URL
|
65
97
|
email:
|
@@ -69,12 +101,16 @@ extensions: []
|
|
69
101
|
extra_rdoc_files: []
|
70
102
|
files:
|
71
103
|
- .gitignore
|
104
|
+
- .travis.yml
|
72
105
|
- Gemfile
|
73
106
|
- README.markdown
|
74
107
|
- Rakefile
|
108
|
+
- TODO
|
109
|
+
- VERSION
|
75
110
|
- lib/rack/matrix_params.rb
|
76
|
-
- lib/rack/matrix_params/version.rb
|
77
111
|
- rack-matrix_params.gemspec
|
112
|
+
- spec/matrix_params_spec.rb
|
113
|
+
- spec/spec_helper.rb
|
78
114
|
homepage: http://github.com/jphastings/rack-matrix_params
|
79
115
|
licenses: []
|
80
116
|
post_install_message:
|
@@ -87,22 +123,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
87
123
|
- - ! '>='
|
88
124
|
- !ruby/object:Gem::Version
|
89
125
|
version: '0'
|
90
|
-
segments:
|
91
|
-
- 0
|
92
|
-
hash: 2501651430979619619
|
93
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
127
|
none: false
|
95
128
|
requirements:
|
96
129
|
- - ! '>='
|
97
130
|
- !ruby/object:Gem::Version
|
98
131
|
version: '0'
|
99
|
-
segments:
|
100
|
-
- 0
|
101
|
-
hash: 2501651430979619619
|
102
132
|
requirements: []
|
103
133
|
rubyforge_project:
|
104
|
-
rubygems_version: 1.8.
|
134
|
+
rubygems_version: 1.8.24
|
105
135
|
signing_key:
|
106
136
|
specification_version: 3
|
107
137
|
summary: Allows the use of matrix URLs in a Rack environment
|
108
|
-
test_files:
|
138
|
+
test_files:
|
139
|
+
- spec/matrix_params_spec.rb
|
140
|
+
- spec/spec_helper.rb
|
141
|
+
has_rdoc:
|