rquery_string 0.0.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 +7 -0
- data/lib/rquery_string/generator.rb +59 -0
- data/lib/rquery_string/parser.rb +111 -0
- data/lib/rquery_string.rb +16 -0
- metadata +60 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fb579fd62c35ea83c4bd4058728f0d5826b48838
|
4
|
+
data.tar.gz: 18a1eec86ffef623851723f99b8d7a442cf59d24
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 93113919a2100c18db194f682a4b1d4afc5bf07d6958ec789cc12a8dda80dc465f17f857175f1da84a9a63493ac7061ee3aec68761e8417ea7d8fa8ec4e17415
|
7
|
+
data.tar.gz: 71403d61e055c20bef8db99d46cd0ca7b07bd0b0e484d453474fd33a6ef0fd8b677a96dd464080325a6ee0e41522d8805bc9413c04deb10327b0467c120cb613
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module RqueryString
|
4
|
+
class Generator
|
5
|
+
def self.build_query_string(hash_para)
|
6
|
+
query_string = ""
|
7
|
+
hash_para.each do |key, value|
|
8
|
+
begin
|
9
|
+
query_string << (send "build_#{value.class.to_s.downcase}_type".to_sym, escape_key(key), value) << "&"
|
10
|
+
rescue NoMethodError => e
|
11
|
+
query_string << "#{escape_key(key)}=#{value}&"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
return query_string[0..query_string.length - 2]
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def self.build_hash_type(hash_key, hash_value)
|
20
|
+
query_string = ""
|
21
|
+
hash_value.each do |key, value|
|
22
|
+
new_key = "#{hash_key}[#{escape_key(key)}]"
|
23
|
+
begin
|
24
|
+
query_string << (send "build_#{value.class.to_s.downcase}_type".to_sym,
|
25
|
+
"#{new_key}", value) << "&"
|
26
|
+
rescue NoMethodError => e
|
27
|
+
query_string << "#{new_key}=#{value}&"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
return query_string[0..query_string.length - 2]
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.build_string_type(key, value)
|
34
|
+
str_value = "'" + value + "'"
|
35
|
+
"#{key}=#{CGI::escape(str_value)}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.build_array_type(key, value)
|
39
|
+
query_string = ""
|
40
|
+
value.each_index do |index|
|
41
|
+
begin
|
42
|
+
query_string << (send "build_#{value[index].class.to_s.downcase}_type".to_sym,
|
43
|
+
"#{key}[]", value[index]) << "&"
|
44
|
+
rescue NoMethodError => e
|
45
|
+
query_string << "#{key}[]=#{value[index]}&"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
return query_string[0..query_string.length - 2]
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.escape_key(key)
|
52
|
+
if key.is_a? String
|
53
|
+
key = "'" + key + "'"
|
54
|
+
end
|
55
|
+
CGI::escape(key.to_s)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module RqueryString
|
4
|
+
class Parser
|
5
|
+
|
6
|
+
def self.parse(query_string)
|
7
|
+
hash_pair_array = query_string.split("&")
|
8
|
+
result_hash = Hash.new
|
9
|
+
hash_pair_array.each do |hash_value|
|
10
|
+
key, value = hash_value.split("=")
|
11
|
+
if is_array(key)
|
12
|
+
parse_array(key, value, result_hash)
|
13
|
+
elsif is_hash(key)
|
14
|
+
parse_hash(key, value, result_hash)
|
15
|
+
elsif is_string(value)
|
16
|
+
result_hash[parse_key(key)] = parse_string(value)
|
17
|
+
else
|
18
|
+
result_hash[parse_key(key)] = eval(value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
return result_hash
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def self.is_array(key)
|
27
|
+
key.end_with?("]") && ((key.index("[")+ 2) == key.length)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.is_hash(key)
|
31
|
+
key.end_with?("]") && ((key.index("[")+ 1) < key.rindex("]"))
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.is_string(value)
|
35
|
+
value.start_with?("%27") && value.end_with?("%27")
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.parse_array(key, value, result_hash)
|
39
|
+
array_key = parse_key(key[0..key.index("[") - 1])
|
40
|
+
result_hash[array_key] = [] if result_hash[array_key].nil?
|
41
|
+
result_hash[array_key] << parse_value(value)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.parse_hash(key, value, result_hash)
|
45
|
+
hash_key = parse_key(key[0..key.index("[") - 1])
|
46
|
+
keys = key[key.index("[")..-1].split("]").reverse
|
47
|
+
sub_result_object = nil
|
48
|
+
keys.each_index do |index|
|
49
|
+
sub_key = parse_key(keys[index][1..-1])
|
50
|
+
sub_hash_value = sub_result_object
|
51
|
+
if sub_key == :""
|
52
|
+
sub_result_object = Array.new
|
53
|
+
if sub_hash_value
|
54
|
+
sub_result_object << sub_hash_value
|
55
|
+
else
|
56
|
+
sub_result_object << parse_value(value)
|
57
|
+
end
|
58
|
+
else
|
59
|
+
sub_result_object = Hash.new
|
60
|
+
if index == 0
|
61
|
+
sub_result_object[sub_key] = parse_value(value)
|
62
|
+
else
|
63
|
+
sub_result_object[sub_key] = sub_hash_value
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
if result_hash[hash_key].nil?
|
68
|
+
result_hash[hash_key] = sub_result_object
|
69
|
+
else
|
70
|
+
if sub_result_object.instance_of?(Array) && sub_result_object.instance_of?(Array)
|
71
|
+
result_hash[hash_key].concat sub_result_object
|
72
|
+
else
|
73
|
+
merge_array_value(result_hash[hash_key], sub_result_object)
|
74
|
+
result_hash[hash_key].merge! sub_result_object
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.parse_string(value)
|
80
|
+
CGI::unescape(value[3..value.rindex("%27")-1])
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.parse_value(value)
|
84
|
+
if is_string(value)
|
85
|
+
parse_string(value)
|
86
|
+
else
|
87
|
+
eval(value)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.parse_key(key)
|
92
|
+
if is_string(key)
|
93
|
+
return parse_string(key)
|
94
|
+
else
|
95
|
+
return key.to_sym
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.merge_array_value(old_hash_value, new_hash_value)
|
100
|
+
old_hash_value.each do |key, value|
|
101
|
+
if value.instance_of?(Array) && new_hash_value[key].instance_of?(Array)
|
102
|
+
new_hash_value[key] = value.concat new_hash_value[key]
|
103
|
+
else
|
104
|
+
if value.instance_of?(Hash) && new_hash_value[key].instance_of?(Hash)
|
105
|
+
merge_array_value(old_hash_value[key], new_hash_value[key])
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/rquery_string"
|
2
|
+
require 'generator'
|
3
|
+
require 'parser'
|
4
|
+
|
5
|
+
module RqueryString
|
6
|
+
extend self
|
7
|
+
|
8
|
+
def build(para_hash)
|
9
|
+
Generator.build_query_string(para_hash)
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse(query_string)
|
13
|
+
Parser.parse(query_string)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rquery_string
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Grant Chen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.14.1
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.14.1
|
27
|
+
description: query string generator and parser gem
|
28
|
+
email: kucss@hotmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/rquery_string/generator.rb
|
34
|
+
- lib/rquery_string/parser.rb
|
35
|
+
- lib/rquery_string.rb
|
36
|
+
homepage: https://github.com/grantchen/rquery_string
|
37
|
+
licenses: []
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 2.0.3
|
56
|
+
signing_key:
|
57
|
+
specification_version: 4
|
58
|
+
summary: query string generator and parser
|
59
|
+
test_files: []
|
60
|
+
has_rdoc:
|