pendragon 0.6.0 → 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4e7cbea66f8dd29316768cfb0fe023d1406a8b64
4
- data.tar.gz: 0e01b51a0a24b2ee596bf4f01d228a9885b49269
3
+ metadata.gz: 89f0b037692dd728f51329a2cc4df730582d0480
4
+ data.tar.gz: 20859c54d93fa69ff145d11d052600b60245ffd9
5
5
  SHA512:
6
- metadata.gz: 2010774c84e8aa9c33c4190c69e068b9e1d318dada14316dcaa4a3550a7363544626a2d77a791269ec0ec86426bd9c7542f5013f96340c020afdba74027d8cbe
7
- data.tar.gz: 62dd9579a534ded3447bc6de68503cfcd6e70e56db1df11802c3bcb1abc26ac5274e332b083b33b0c96033e434427cac2e9f38bd70ff114de4a2228811da14ee
6
+ metadata.gz: e7226f8f044f7310cd4de904661c2cfeda0ac66169d691363f905718498db5cae9f44bf4d857f585a1c4547d9b1de8356763ef6e5414245724f4e4a2031063a7
7
+ data.tar.gz: 80b0c5acd5492211707c5e7c3fd5f0bb3b3fba6adadd5863e641dca640ca544752e5ff7fdfa97ad87a5de58a292f68c7dc3c048bdc3090a8e61dae5e1d524678
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pendragon (0.5.1)
4
+ pendragon (0.6.0)
5
5
  mustermann (= 0.2.0)
6
6
  rack (>= 1.3.0)
7
7
 
@@ -36,26 +36,21 @@ module Pendragon
36
36
  end
37
37
 
38
38
  def url(*args)
39
- params = args.extract_options! # parameters is hash at end
40
- names, params_array = args.partition{|a| a.is_a?(Symbol)}
41
- name = names[0, 2].join(" ").to_sym # route name is concatenated with underscores
42
- if params.is_a?(Hash)
43
- params[:format] = params[:format].to_s unless params[:format].nil?
44
- params = value_to_param(params)
45
- end
46
- url =
47
- if params_array.empty?
48
- compiled_router.path(name, params)
49
- else
50
- compiled_router.path(name, *(params_array << params))
51
- end
52
- rebase_url(url)
53
- rescue Pendragon::InvalidRouteException
54
- route_error = "route mapping for url(#{name.inspect}) could not be found!"
55
- raise ::Padrino::Routing::UnrecognizedException.new(route_error)
39
+ params = args.extract_options!
40
+ fragment = params.delete(:fragment) || params.delete(:anchor)
41
+ path = make_path_with_params(args, value_to_param(params.symbolize_keys))
42
+ rebase_url(fragment ? path << '#' << fragment : path)
56
43
  end
57
44
  alias :url_for :url
58
45
 
46
+ def make_path_with_params(args, params)
47
+ names, params_array = args.partition{ |arg| arg.is_a?(Symbol) }
48
+ name = names[0, 2].join(" ").to_sym
49
+ compiled_router.path(name, *(params_array << params))
50
+ rescue Pendragon::InvalidRouteException
51
+ raise ::Padrino::Routing::UnrecognizedException, "Route mapping for url(#{name.inspect}) could not be found"
52
+ end
53
+
59
54
  def recognize_path(path)
60
55
  responses = @router.recognize_path(path)
61
56
  [responses[0], responses[1]]
@@ -64,8 +59,8 @@ module Pendragon
64
59
  def rebase_url(url)
65
60
  if url.start_with?('/')
66
61
  new_url = ''
67
- new_url << conform_uri(uri_root) if defined?(uri_root)
68
62
  new_url << conform_uri(ENV['RACK_BASE_URI']) if ENV['RACK_BASE_URI']
63
+ new_url << conform_uri(uri_root) if defined?(uri_root)
69
64
  new_url << url
70
65
  else
71
66
  url.blank? ? '/' : url
@@ -92,9 +87,11 @@ module Pendragon
92
87
 
93
88
  route_options = options.dup
94
89
  route_options[:provides] = @_provides if @_provides
90
+ route_options[:accepts] = @_accepts if @_accepts
91
+ route_options[:params] = @_params unless @_params.nil? || route_options.include?(:params)
95
92
 
96
- if allow_disabled_csrf
97
- unless route_options[:csrf_protection] == false
93
+ if protect_from_csrf && (report_csrf_failure || allow_disabled_csrf)
94
+ unless route_options.has_key?(:csrf_protection)
98
95
  route_options[:csrf_protection] = true
99
96
  end
100
97
  end
@@ -158,6 +155,13 @@ module Pendragon
158
155
  def parse_route(path, options, verb)
159
156
  route_options = {}
160
157
 
158
+ if options[:params] == true
159
+ options.delete(:params)
160
+ elsif options.include?(:params)
161
+ options[:params] ||= []
162
+ options[:params] += options[:with] if options[:with]
163
+ end
164
+
161
165
  # We need check if path is a symbol, if that it's a named route.
162
166
  map = options.delete(:map)
163
167
 
@@ -127,7 +127,7 @@ module Pendragon
127
127
  # @return [Array]
128
128
  def recognize_path(path_info)
129
129
  route, params = recognize(Rack::MockRequest.env_for(path_info)).first
130
- [route.name, params.inject({}){|hash, (key, value)| hash[key.to_sym] = value; hash }]
130
+ [route.name, params.inject({}){|hash, (key, value)| hash[key] = value; hash }]
131
131
  end
132
132
 
133
133
  # Returns an expanded path matched with the conditions as arguments
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Pendragon
3
- VERSION = '0.6.0'
3
+ VERSION = '0.6.1'
4
4
  end
@@ -1,5 +1,6 @@
1
1
  require File.expand_path('../../lib/pendragon/padrino', __FILE__)
2
2
  $:.unshift(File.dirname(__FILE__))
3
+ require 'active_support/core_ext/hash/conversions'
3
4
  require 'helper'
4
5
 
5
6
  class FooError < RuntimeError; end
@@ -8,6 +9,7 @@ describe "Pendragon::Padrino" do
8
9
  setup do
9
10
  Padrino::Application.send(:register, Pendragon::Padrino)
10
11
  Padrino::Rendering::DEFAULT_RENDERING_OPTIONS[:strict_format] = false
12
+ ENV['RACK_BASE_URI'] = nil
11
13
  end
12
14
 
13
15
  should "serve static files with simple cache control" do
@@ -824,6 +826,18 @@ describe "Pendragon::Padrino" do
824
826
  ENV['RACK_BASE_URI'] = nil
825
827
  end
826
828
 
829
+ it 'should use uri_root and RACK_BASE_URI' do
830
+ mock_app do
831
+ controller :foo do
832
+ get(:bar){ "bar" }
833
+ end
834
+ end
835
+ ENV['RACK_BASE_URI'] = '/base'
836
+ @app.uri_root = 'testing'
837
+ assert_equal '/base/testing/foo/bar', @app.url(:foo, :bar)
838
+ ENV['RACK_BASE_URI'] = nil
839
+ end
840
+
827
841
  should 'reset routes' do
828
842
  mock_app do
829
843
  get("/"){ "foo" }
@@ -1882,14 +1896,14 @@ describe "Pendragon::Padrino" do
1882
1896
  get(:simple, :map => "/simple/:id") { }
1883
1897
  get(:with_format, :with => :id, :provides => :js) { }
1884
1898
  end
1885
- assert_equal [:"foo bar", { :id => "fantastic" }], @app.recognize_path(@app.url(:foo, :bar, :id => :fantastic))
1886
- assert_equal [:"foo bar", { :id => "18" }], @app.recognize_path(@app.url(:foo, :bar, :id => 18))
1887
- assert_equal [:simple, { :id => "bar" }], @app.recognize_path(@app.url(:simple, :id => "bar"))
1888
- assert_equal [:simple, { :id => "true" }], @app.recognize_path(@app.url(:simple, :id => true))
1889
- assert_equal [:simple, { :id => "9" }], @app.recognize_path(@app.url(:simple, :id => 9))
1890
- assert_equal [:with_format, { :id => "bar", :format => "js" }], @app.recognize_path(@app.url(:with_format, :id => "bar", :format => :js))
1891
- assert_equal [:with_format, { :id => "true", :format => "js" }], @app.recognize_path(@app.url(:with_format, :id => true, :format => "js"))
1892
- assert_equal [:with_format, { :id => "9", :format => "js" }], @app.recognize_path(@app.url(:with_format, :id => 9, :format => :js))
1899
+ assert_equal [:"foo bar", { :id => "fantastic" }.with_indifferent_access], @app.recognize_path(@app.url(:foo, :bar, :id => :fantastic))
1900
+ assert_equal [:"foo bar", { :id => "18" }.with_indifferent_access], @app.recognize_path(@app.url(:foo, :bar, :id => 18))
1901
+ assert_equal [:simple, { :id => "bar" }.with_indifferent_access], @app.recognize_path(@app.url(:simple, :id => "bar"))
1902
+ assert_equal [:simple, { :id => "true" }.with_indifferent_access], @app.recognize_path(@app.url(:simple, :id => true))
1903
+ assert_equal [:simple, { :id => "9" }.with_indifferent_access], @app.recognize_path(@app.url(:simple, :id => 9))
1904
+ assert_equal [:with_format, { :id => "bar", :format => "js" }.with_indifferent_access], @app.recognize_path(@app.url(:with_format, :id => "bar", :format => :js))
1905
+ assert_equal [:with_format, { :id => "true", :format => "js" }.with_indifferent_access], @app.recognize_path(@app.url(:with_format, :id => true, :format => "js"))
1906
+ assert_equal [:with_format, { :id => "9", :format => "js" }.with_indifferent_access], @app.recognize_path(@app.url(:with_format, :id => 9, :format => :js))
1893
1907
  end
1894
1908
 
1895
1909
  should 'have current_path' do
@@ -1939,4 +1953,160 @@ describe "Pendragon::Padrino" do
1939
1953
  get '/users//'
1940
1954
  assert_equal 404, status
1941
1955
  end
1956
+ describe "Padrino::ParamsProtection" do
1957
+ before do
1958
+ @teri = { 'name' => 'Teri Bauer', 'position' => 'baby' }
1959
+ @kim = { 'name' => 'Kim Bauer', 'position' => 'daughter', 'child' => @teri }
1960
+ @jack = { 'name' => 'Jack Bauer', 'position' => 'terrorist', 'child' => @kim }
1961
+ @family = { 'name' => 'Bauer', 'persons' => { 1 => @teri, 2 => @kim, 3 => @jack } }
1962
+ end
1963
+
1964
+ it 'should drop all parameters except allowed ones' do
1965
+ result = nil
1966
+ mock_app do
1967
+ post :basic, :params => [ :name ] do
1968
+ result = params
1969
+ ''
1970
+ end
1971
+ end
1972
+ post '/basic?' + @jack.to_query
1973
+ assert_equal({ 'name' => @jack['name'] }, result)
1974
+ end
1975
+
1976
+ it 'should preserve original params' do
1977
+ result = nil
1978
+ mock_app do
1979
+ post :basic, :params => [ :name ] do
1980
+ result = original_params
1981
+ ''
1982
+ end
1983
+ end
1984
+ post '/basic?' + @jack.to_query
1985
+ assert_equal(@jack, result)
1986
+ end
1987
+
1988
+ it 'should work with recursive data' do
1989
+ result = nil
1990
+ mock_app do
1991
+ post :basic, :params => [ :name, :child => [ :name, :child => [ :name ] ] ] do
1992
+ result = [params, original_params]
1993
+ ''
1994
+ end
1995
+ end
1996
+ post '/basic?' + @jack.to_query
1997
+ assert_equal(
1998
+ [
1999
+ { 'name' => @jack['name'], 'child' => { 'name' => @kim['name'], 'child' => { 'name' => @teri['name'] } } },
2000
+ @jack
2001
+ ],
2002
+ result
2003
+ )
2004
+ end
2005
+
2006
+ it 'should be able to process the data' do
2007
+ result = nil
2008
+ mock_app do
2009
+ post :basic, :params => [ :name, :position => proc{ |v| 'anti-'+v } ] do
2010
+ result = params
2011
+ ''
2012
+ end
2013
+ end
2014
+ post '/basic?' + @jack.to_query
2015
+ assert_equal({ 'name' => @jack['name'], 'position' => 'anti-terrorist' }, result)
2016
+ end
2017
+
2018
+ it 'should pass :with parameters' do
2019
+ result = nil
2020
+ mock_app do
2021
+ post :basic, :with => [:id, :tag], :params => [ :name ] do
2022
+ result = params
2023
+ ''
2024
+ end
2025
+ end
2026
+ post '/basic/24/42?' + @jack.to_query
2027
+ assert_equal({ 'name' => @jack['name'], 'id' => '24', 'tag' => '42' }, result)
2028
+ end
2029
+
2030
+ it 'should understand true or false values' do
2031
+ result = nil
2032
+ mock_app do
2033
+ get :hide, :with => [ :id ], :params => false do
2034
+ result = params
2035
+ ''
2036
+ end
2037
+ get :show, :with => [ :id ], :params => true do
2038
+ result = params
2039
+ ''
2040
+ end
2041
+ end
2042
+ get '/hide/1?' + @jack.to_query
2043
+ assert_equal({"id"=>"1"}, result)
2044
+ get '/show/1?' + @jack.to_query
2045
+ assert_equal({"id"=>"1"}.merge(@jack), result)
2046
+ end
2047
+
2048
+ it 'should be configurable with controller options' do
2049
+ result = nil
2050
+ mock_app do
2051
+ controller :persons, :params => [ :name ] do
2052
+ post :create, :params => [ :name, :position ] do
2053
+ result = params
2054
+ ''
2055
+ end
2056
+ post :update, :with => [ :id ] do
2057
+ result = params
2058
+ ''
2059
+ end
2060
+ post :delete, :params => true do
2061
+ result = params
2062
+ ''
2063
+ end
2064
+ post :destroy, :with => [ :id ], :params => false do
2065
+ result = params
2066
+ ''
2067
+ end
2068
+ end
2069
+ controller :noparam, :params => false do
2070
+ get :index do
2071
+ result = params
2072
+ ''
2073
+ end
2074
+ end
2075
+ end
2076
+ post '/persons/create?' + @jack.to_query
2077
+ assert_equal({ 'name' => @jack['name'], 'position' => 'terrorist' }, result)
2078
+ post '/persons/update/1?name=Chloe+O\'Brian&position=hacker'
2079
+ assert_equal({ 'id' => '1', 'name' => 'Chloe O\'Brian' }, result)
2080
+ post '/persons/delete?' + @jack.to_query
2081
+ assert_equal(@jack, result)
2082
+ post '/persons/destroy/1?' + @jack.to_query
2083
+ assert_equal({"id"=>"1"}, result)
2084
+ get '/noparam?a=1;b=2'
2085
+ assert_equal({}, result)
2086
+ end
2087
+
2088
+ it 'should successfully filter hashes' do
2089
+ result = nil
2090
+ mock_app do
2091
+ post :family, :params => [ :persons => [ :name ] ] do
2092
+ result = params
2093
+ ''
2094
+ end
2095
+ end
2096
+ post '/family?' + @family.to_query
2097
+ assert_equal({"persons" => {"3" => {"name" => @jack["name"]}, "2" => {"name" => @kim["name"]}, "1" => {"name" => @teri["name"]}}}, result)
2098
+ end
2099
+
2100
+ it 'should pass arrays' do
2101
+ result = nil
2102
+ mock_app do
2103
+ post :family, :params => [ :names => [] ] do
2104
+ result = params
2105
+ ''
2106
+ end
2107
+ end
2108
+ post '/family?names[]=Jack&names[]=Kim&names[]=Teri'
2109
+ assert_equal({"names" => %w[Jack Kim Teri]}, result)
2110
+ end
2111
+ end
1942
2112
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pendragon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - namusyaka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-22 00:00:00.000000000 Z
11
+ date: 2014-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack