rack-jquery-params 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9172bcca4b13cbe8b15425156a6139deb65cb013
4
+ data.tar.gz: 1c3452cd4b88cac928c732098e65ef2c7bc5fce8
5
+ SHA512:
6
+ metadata.gz: 89ff06303106907931d430498f98fce1cf150a05ed03491ebab743c95e927b57ba6e1f5e2f1cd59f3dbc3521b8bee7a3eee21f899d4dab6b4693642bf11e5a4d
7
+ data.tar.gz: 299c03e247fa6dfb1bda73714940d4bd18091b007500b51334e94367cc9896474744bc12f3caeb52d6c184f112425c2f786d885b5daa0f39ec99ba6c280c03d2
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
19
+ .DS_Store
20
+ .idea/
21
+ .idea/*
22
+ Gemfile.lock
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ --load ./.yardopts.rb
3
+ --markup-provider=redcarpet
4
+ --markup=markdown
5
+ --readme README.md
@@ -0,0 +1 @@
1
+ require 'redcarpet/compat'
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ group :development, :test do
5
+ gem 'rake'
6
+ gem 'minitest'
7
+ gem 'rack-test'
8
+ gem 'simplecov', :require => false
9
+ gem 'yard'
10
+ gem 'redcarpet'
11
+ gem 'github-markup', :require => true
12
+ end
@@ -0,0 +1,79 @@
1
+ rack-jquery-params
2
+ ===========
3
+
4
+ A Rack middleware that bridges the discrepancy between jQuery.param and how Rack parses nested params within query
5
+ strings and post bodies.
6
+
7
+ If you use jQuery's get, post, put, or ajax methods then jQuery.param is run on your data. The problem is that jQuery.param
8
+ turns this javascript object:
9
+
10
+ ```
11
+ {test: [{this_is_an_object_inside_an_array:'yes'}]}
12
+ ```
13
+
14
+ into a query string that Rack cannot read correctly:
15
+
16
+ ```
17
+ test[0][this_is_an_object_inside_an_array]=yes
18
+ ```
19
+
20
+ Rack expects all arrays to be sent as empty brackets (i.e., "test[]"). It parses jQuery's "test[0]" as a hash, resulting
21
+ in the following params:
22
+
23
+ ```ruby
24
+ {
25
+ :test => {
26
+ :0 => {
27
+ :this_is_an_object_inside_an_array => 'yes'
28
+ }
29
+ }
30
+ }
31
+ ```
32
+
33
+ This gem fixes the above params and converts it to:
34
+
35
+ ```ruby
36
+ {
37
+ :test => [
38
+ {
39
+ :this_is_an_object_inside_an_array => 'yes'
40
+ }
41
+ ]
42
+ }
43
+ ```
44
+
45
+ ## Setting Up JSONR
46
+
47
+ Install the gem:
48
+
49
+ ```ruby
50
+ gem install rack-jquery-params
51
+ ```
52
+
53
+ In your Gemfile:
54
+
55
+ ```ruby
56
+ gem 'rack-jquery-params', :require => 'rack/jquery-params'
57
+ ```
58
+
59
+ Activate by including it your config.ru file:
60
+
61
+ ```ruby
62
+ use Rack::JQueryParams
63
+ run Sinatra::Application
64
+ ```
65
+
66
+ ## Options
67
+
68
+ By default the JQueryParams fix is applied to all http methods, however you can change this functionality by setting
69
+ the applies_to option with your chosen http method:
70
+
71
+ ```ruby
72
+ use Rack::JQueryParams :applies_to => :get
73
+ ```
74
+
75
+ You can also set applies_to to be an array of http methods:
76
+
77
+ ```ruby
78
+ use Rack::JQueryParams :applies_to => [:get, :put, :delete]
79
+ ```
@@ -0,0 +1,22 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'fileutils'
4
+ include FileUtils
5
+
6
+ task :run_test do
7
+ Rake::Task['test'].execute
8
+ puts '---------------------------------------------------------------------'
9
+ puts 'TESTS PASSED... READY TO BUILD...'
10
+ puts '---------------------------------------------------------------------'
11
+ end
12
+ task :build => :run_test
13
+ task :default => :build
14
+
15
+ ########################################################################
16
+
17
+ Rake::TestTask.new do |t|
18
+ t.libs.push 'lib'
19
+ t.libs.push 'test'
20
+ t.pattern = 'test/**/*_test.rb'
21
+ t.verbose = false
22
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'jquery-params/load'
2
+ require_relative 'jquery-params/version'
@@ -0,0 +1,63 @@
1
+ require 'rack'
2
+
3
+ module Rack
4
+ class JQueryParams
5
+ include Rack::Utils
6
+
7
+ HTTP_METHODS = %w(GET PUT POST DELETE HEAD OPTIONS PATCH)
8
+ ALL = 'ALL'
9
+
10
+ def initialize(app, options={})
11
+ @options = options
12
+ @app = app
13
+ end
14
+
15
+ # Loops through all params and convert the hashes to arrays only if all keys are comprised of integers.
16
+ #
17
+ def call(env)
18
+ status, headers, response = @app.call(env)
19
+
20
+ self.class.fix(env, @options[:applies_to])
21
+ [status, headers, response]
22
+ end
23
+
24
+ def self.fix(env, valid_methods=:all)
25
+ valid_methods = extract_valid_methods(valid_methods)
26
+ return if valid_methods != :all and !valid_methods.include?(env['REQUEST_METHOD'])
27
+ env['rack.request.query_hash'].each {|k,p| env['rack.request.query_hash'][k] = fix_param(p) }
28
+ env['rack.request.form_hash'].each {|k,p| env['rack.request.form_hash'][k] = fix_param(p) }
29
+ end
30
+
31
+ def self.fix_param(param)
32
+ if param.is_a?(Hash)
33
+ if param.all?{|k,v| k =~ /^[0-9]+$/}
34
+ param.sort.inject([]){|result, v| result << fix_param(v[1]) }
35
+ else
36
+ param.each{|k,v| param[k] = fix_param(v)}
37
+ end
38
+ elsif param.is_a?(Array)
39
+ param.each_with_index {|v,i| param[i] = fix_param(v) }
40
+ return param
41
+ else
42
+ return param
43
+ end
44
+ end
45
+
46
+ def self.extract_valid_methods(object)
47
+ valid_methods = []
48
+ if object.is_a?(Array)
49
+ object.each do |a|
50
+ a = a.to_s.upcase
51
+ break valid_methods = [] if a == 'ALL'
52
+ valid_methods << a if HTTP_METHODS.include?(a)
53
+ end
54
+ else
55
+ method = object.to_s.upcase
56
+ valid_methods = [method] if HTTP_METHODS.include?(method)
57
+ end
58
+ (valid_methods.size > 0) ? valid_methods : :all
59
+ end
60
+
61
+ end
62
+
63
+ end
@@ -0,0 +1,3 @@
1
+ class Rack::JQueryParams
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rack/jquery-params'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'rack-jquery-params'
8
+ gem.version = Rack::JQueryParams::VERSION
9
+ gem.date = '2015-01-18'
10
+ gem.summary = %q{Rack middleware that fixes the discrepancy between jQuery.param and how Rack parses nested queries.}
11
+ gem.authors = ['Caleb Clark']
12
+ gem.email = ['cclark@fanforce.com']
13
+ gem.homepage = 'http://github.com/calebclark/rack-jquery-params'
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
+ gem.require_paths = ['lib']
18
+
19
+ gem.add_development_dependency 'rack'
20
+ end
@@ -0,0 +1,66 @@
1
+ require 'test_helper'
2
+ require 'rack/jquery-params'
3
+
4
+ describe 'params' do
5
+
6
+ def create_env
7
+ {
8
+ 'rack.request.query_hash' => {},
9
+ 'rack.request.form_hash' => {},
10
+ 'REQUEST_METHOD' => 'POST'
11
+ }
12
+ end
13
+
14
+ it 'should ignore hashes that have non-integers in the key' do
15
+ env = create_env.merge('rack.request.query_hash' => {non_array: {'0' => 'is integer', '1' => 'is integer', 'a' => 'is not integer'}})
16
+ Rack::JQueryParams.fix(env, :all)
17
+ assert env['rack.request.query_hash'][:non_array].is_a?(Hash)
18
+ end
19
+
20
+ it 'should convert first-level hashes that resembles an array' do
21
+ env = create_env.merge('rack.request.query_hash' => {array: {'0' => 'is integer', '1' => 'is integer', '2' => 'is integer'}})
22
+ Rack::JQueryParams.fix(env, :all)
23
+ assert env['rack.request.query_hash'][:array].is_a?(Array)
24
+ end
25
+
26
+ it 'should convert any level of hash that resembles an array' do
27
+ env = create_env.merge('rack.request.query_hash' => {non_array: {'a' => 'is not integer', :array => {'0' => 'is integer', '1' => 'is integer'}}})
28
+ Rack::JQueryParams.fix(env, :all)
29
+ assert env['rack.request.query_hash'][:non_array][:array].is_a?(Array)
30
+ end
31
+
32
+ it 'should fix query_hash or form_hash' do
33
+ env = create_env.merge('rack.request.query_hash' => {array: {'0' => 'is integer', '1' => 'is integer', '2' => 'is integer'}})
34
+ Rack::JQueryParams.fix(env, :all)
35
+ assert env['rack.request.query_hash'][:array].is_a?(Array)
36
+
37
+ env = create_env.merge('rack.request.form_hash' => {array: {'0' => 'is integer', '1' => 'is integer', '2' => 'is integer'}})
38
+ Rack::JQueryParams.fix(env, :all)
39
+ assert env['rack.request.form_hash'][:array].is_a?(Array)
40
+ end
41
+
42
+ it 'should apply to all methods' do
43
+ env = create_env.merge('rack.request.form_hash' => {array: {'0' => 'is integer', '1' => 'is integer', '2' => 'is integer'}})
44
+ env['REQUEST_METHOD'] = 'POST'
45
+ Rack::JQueryParams.fix(env, :all)
46
+ assert env['rack.request.form_hash'][:array].is_a?(Array)
47
+
48
+ env = create_env.merge('rack.request.query_hash' => {array: {'0' => 'is integer', '1' => 'is integer', '2' => 'is integer'}})
49
+ env['REQUEST_METHOD'] = 'GET'
50
+ Rack::JQueryParams.fix(env, :all)
51
+ assert env['rack.request.query_hash'][:array].is_a?(Array)
52
+ end
53
+
54
+ it 'should allow apply to a single methods' do
55
+ env = create_env.merge('rack.request.query_hash' => {array: {'0' => 'is integer', '1' => 'is integer', '2' => 'is integer'}})
56
+ env['REQUEST_METHOD'] = 'GET'
57
+ Rack::JQueryParams.fix(env, :get)
58
+ assert env['rack.request.query_hash'][:array].is_a?(Array)
59
+
60
+ env = create_env.merge('rack.request.form_hash' => {array: {'0' => 'is integer', '1' => 'is integer', '2' => 'is integer'}})
61
+ env['REQUEST_METHOD'] = 'POST'
62
+ Rack::JQueryParams.fix(env, :get)
63
+ assert env['rack.request.form_hash'][:array].is_a?(Hash)
64
+ end
65
+
66
+ end
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'minitest/autorun'
3
+ require 'minitest/spec'
4
+ require 'rack/test'
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-jquery-params
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Caleb Clark
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description:
28
+ email:
29
+ - cclark@fanforce.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - .gitignore
35
+ - .yardopts
36
+ - .yardopts.rb
37
+ - Gemfile
38
+ - README.md
39
+ - Rakefile
40
+ - lib/rack/jquery-params.rb
41
+ - lib/rack/jquery-params/load.rb
42
+ - lib/rack/jquery-params/version.rb
43
+ - rack-jquery-params.gemspec
44
+ - test/rack/params_test.rb
45
+ - test/test_helper.rb
46
+ homepage: http://github.com/calebclark/rack-jquery-params
47
+ licenses: []
48
+ metadata: {}
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubyforge_project:
65
+ rubygems_version: 2.0.14
66
+ signing_key:
67
+ specification_version: 4
68
+ summary: Rack middleware that fixes the discrepancy between jQuery.param and how Rack
69
+ parses nested queries.
70
+ test_files:
71
+ - test/rack/params_test.rb
72
+ - test/test_helper.rb
73
+ has_rdoc: