php_http_build_query 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/php_http_build_query.rb +57 -0
  2. metadata +77 -0
@@ -0,0 +1,57 @@
1
+ require 'cgi'
2
+
3
+ class PHP
4
+ class << self
5
+ # Build an HTTP URL-encoded string suitable for appending to GET paths.
6
+ # This is intended to have an as-similar-as-possible usage as PHP's.
7
+ def http_build_query(object)
8
+ h = hashify(object)
9
+ result = ""
10
+ separator = '&'
11
+ h.keys.sort.each do |key|
12
+ result << (CGI.escape(key) + '=' + CGI.escape(h[key]) + separator)
13
+ end
14
+ result = result.sub(/#{separator}$/, '') # Remove the trailing k-v separator
15
+ return result
16
+ end
17
+ def hashify(object, parent_key = '')
18
+ raise ArgumentError.new('This is made for serializing Hashes and Arrays only') unless (object.is_a?(Hash) or object.is_a?(Array) or parent_key.length > 0)
19
+
20
+ result = {}
21
+ case object
22
+ when String, Symbol, Numeric
23
+ result[parent_key] = object.to_s
24
+ when Hash
25
+ # Recursively call hashify, building closure-like state by
26
+ # appending the current location in the tree as new "parent_key"
27
+ # values.
28
+ hashes = object.map do |key, value|
29
+ if parent_key =~ /^[0-9]+/ or parent_key.length == 0
30
+ new_parent_key = key.to_s
31
+ else
32
+ new_parent_key = parent_key + '[' + key.to_s + ']'
33
+ end
34
+ hashify(value, new_parent_key)
35
+ end
36
+ hash = hashes.reduce { |memo, hash| memo.merge hash }
37
+ result.merge! hash
38
+ when Enumerable
39
+ # _Very_ similar to above, but iterating with "each_with_index"
40
+ hashes = {}
41
+ object.each_with_index do |value, index|
42
+ if parent_key.length == 0
43
+ new_parent_key = index.to_s
44
+ else
45
+ new_parent_key = parent_key + '[' + index.to_s + ']'
46
+ end
47
+ hashes.merge! hashify(value, new_parent_key)
48
+ end
49
+ result.merge! hashes
50
+ else
51
+ raise Exception.new("This should only be serializing Strings, Symbols, or Numerics.")
52
+ end
53
+
54
+ return result
55
+ end
56
+ end
57
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: php_http_build_query
3
+ version: !ruby/object:Gem::Version
4
+ hash: 9
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ version: "0.1"
10
+ platform: ruby
11
+ authors:
12
+ - Jonathan Lassoff <jof@thejof.com>
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2012-08-17 00:00:00 Z
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: rspec
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ hash: 3
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :development
32
+ version_requirements: *id001
33
+ description: The PHP language has a built-in http_build_query() function that creates a URL-encoded string that is a representation of multi-dimensional datatypes. This gem provides a mostly-congruent method in Ruby for dealing with PHP-based HTTP applications that expect parameters in this format.
34
+ email: jof@thejof.com
35
+ executables: []
36
+
37
+ extensions: []
38
+
39
+ extra_rdoc_files: []
40
+
41
+ files:
42
+ - lib/php_http_build_query.rb
43
+ homepage: http://github.com/jof/php_http_build_query
44
+ licenses:
45
+ - BSD 3-clause
46
+ post_install_message:
47
+ rdoc_options: []
48
+
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ hash: 3
66
+ segments:
67
+ - 0
68
+ version: "0"
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.8.13
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: A Ruby implementation of PHP's http_build_query()
76
+ test_files: []
77
+