php-serial 0.9.0 → 0.9.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/README.md CHANGED
@@ -1,6 +1,7 @@
1
- # Php::Serial
1
+ # Php-Serial
2
2
 
3
- TODO: Write a gem description
3
+ PHP serialization library. Reads and writes PHP's serialization format.
4
+ Also has support for reading and writing PHP sessions.
4
5
 
5
6
  ## Installation
6
7
 
@@ -18,7 +19,23 @@ Or install it yourself as:
18
19
 
19
20
  ## Usage
20
21
 
21
- TODO: Write usage instructions here
22
+ This library provides 4 public methods:
23
+ Php.serialize
24
+
25
+ Php.serilialize ['string', 100]
26
+ => "a:2:{i:0;s:6:\"string\";i:1;i:100;}"
27
+ Php.unserialize
28
+
29
+ Php.unserialize "a:2:{i:0;s:6:\"string\";i:1;i:100;}"
30
+ => ["string", 100]
31
+ Php.serialize_session
32
+
33
+ Php.unserialize_session "var_a|s:6:\"string\";var_b|d:3.14"
34
+ => {"var_a"=>"string", "var_b"=>3.14}
35
+ Php.unserialize_session
36
+
37
+ Php.unserialize_session {"var_a"=>"string", "var_b"=>3.14}
38
+ => "var_a|s:6:\"string\";var_b|d:3.14"
22
39
 
23
40
  ## Contributing
24
41
 
@@ -1,6 +1,63 @@
1
1
  require "php-serial/version"
2
2
 
3
3
  module Php
4
+ # Serializes a ruby object into PHP serialized format
5
+ #
6
+ # Params:
7
+ # Mixed var
8
+ # Returns: string
9
+ def self.serialize(var)
10
+ val = ''
11
+ case var.class.to_s
12
+ when 'NilClass'
13
+ val = 'N;'
14
+ when 'Fixnum'
15
+ val = 'i:' + var.to_s + ';'
16
+ when 'Float'
17
+ val = 'd:' + var.to_s + ';'
18
+ when 'TrueClass'
19
+ val = 'b:1' + ';'
20
+ when 'FalseClass'
21
+ val = 'b:0' + ';'
22
+ when 'String', 'Symbol'
23
+ val = 's:' + var.length.to_s + ':' + '"' + var.to_s + '";'
24
+ when 'Array'
25
+ val = 'a:' + var.length.to_s + ':' + '{'
26
+ var.length.times do |index|
27
+ val += serialize(index) + serialize(var[index])
28
+ end
29
+ val += '}'
30
+ when 'Hash'
31
+ val = 'a:' + var.length.to_s + ':' + '{'
32
+ var.each do |item_key, item_value|
33
+ val += serialize(item_key) + serialize(item_value)
34
+ end
35
+ val += '}'
36
+ else
37
+ klass = var.class.to_s
38
+ val = "O:#{klass.length.to_s}:\"#{klass}\":#{var.instance_variables.length}:{"
39
+ var.instance_variables.each do |ivar|
40
+ ivar = ivar.to_s
41
+ ivar.slice!(0)
42
+ val += serialize(ivar) + serialize(var.send(ivar))
43
+ end
44
+ val += '}'
45
+ end
46
+ val
47
+ end
48
+
49
+ # Serializes a hash into PHP session
50
+ #
51
+ # Params:
52
+ # Hash hash
53
+ # Returns: string
54
+ def self.serialize_session(hash)
55
+ serialized_session = ''
56
+ hash.each do |key,value|
57
+ serialized_session += key.to_s + "|" + serialize(value)
58
+ end
59
+ serialized_session
60
+ end
4
61
 
5
62
  # Unserializes a PHP session
6
63
  #
@@ -13,7 +70,7 @@ module Php
13
70
 
14
71
  while !data.empty? do
15
72
  key = extract_until!(data, "|")
16
- hash[key] = unserialize(data)
73
+ hash[key] = unserialize!(data)
17
74
  end
18
75
  hash
19
76
  end
@@ -24,6 +81,17 @@ module Php
24
81
  # String data
25
82
  # Returns: mixed
26
83
  def self.unserialize(data='')
84
+ unserialize!(data.strip)
85
+ end
86
+
87
+ private
88
+
89
+ # Unserializes recursively. Consumes the input string.
90
+ #
91
+ # Params:
92
+ # String data
93
+ # Returns: mixed
94
+ def self.unserialize!(data='')
27
95
  var_type = data.slice!(0)
28
96
  data.slice!(0)
29
97
  case var_type
@@ -45,8 +113,8 @@ module Php
45
113
  length = extract_until!(data, ":").to_i
46
114
  extract_until!(data, '{')
47
115
  length.times do
48
- key = unserialize(data)
49
- value[key] = unserialize(data)
116
+ key = unserialize!(data)
117
+ value[key] = unserialize!(data)
50
118
  end
51
119
  extract_until!(data, "}")
52
120
  # if keys are sequential numbers, return array
@@ -60,72 +128,13 @@ module Php
60
128
  length = extract_until!(data, ":").to_i
61
129
  extract_until!(data, '{')
62
130
  length.times do
63
- key = unserialize(data)
64
- value[key] = unserialize(data)
131
+ key = unserialize!(data)
132
+ value[key] = unserialize!(data)
65
133
  end
66
134
  end
67
135
  value
68
136
  end
69
137
 
70
- # Serializes a hash into PHP session
71
- #
72
- # Params:
73
- # Hash hash
74
- # Returns: string
75
- def self.serialize_session(hash)
76
- serialized_session = ''
77
- hash.each do |key,value|
78
- serialized_session += key.to_s + "|" + serialize(value)
79
- end
80
- serialized_session
81
- end
82
-
83
-
84
- # Serializes a ruby object into PHP serialized format
85
- #
86
- # Params:
87
- # Mixed var
88
- # Returns: string
89
- def self.serialize(var)
90
- val = ''
91
- case var.class.to_s
92
- when 'NilClass'
93
- val = 'N;'
94
- when 'Fixnum'
95
- val = 'i:' + var.to_s + ';'
96
- when 'Float'
97
- val = 'd:' + var.to_s + ';'
98
- when 'TrueClass'
99
- val = 'b:1' + ';'
100
- when 'FalseClass'
101
- val = 'b:0' + ';'
102
- when 'String', 'Symbol'
103
- val = 's:' + var.length.to_s + ':' + '"' + var.to_s + '";'
104
- when 'Array'
105
- val = 'a:' + var.length.to_s + ':' + '{'
106
- var.length.times do |index|
107
- val += serialize(index) + serialize(var[index])
108
- end
109
- val += '}'
110
- when 'Hash'
111
- val = 'a:' + var.length.to_s + ':' + '{'
112
- var.each do |item_key, item_value|
113
- val += serialize(item_key) + serialize(item_value)
114
- end
115
- val += '}'
116
- else
117
- klass = var.class.to_s
118
- val = "O:#{klass.length.to_s}:\"#{klass}\":#{var.instance_variables.length}:{"
119
- var.instance_variables.each do |ivar|
120
- ivar = ivar.to_s
121
- ivar.slice!(0)
122
- val += serialize(ivar) + serialize(var.send(ivar))
123
- end
124
- val += '}'
125
- end
126
- val
127
- end
128
-
129
138
  # Return all characters up to the first occurrence of char
130
139
  # Truncates those characters from input string
131
140
  #
@@ -1,5 +1,5 @@
1
1
  module Php
2
2
  module Serial
3
- VERSION = "0.9.0"
3
+ VERSION = "0.9.5"
4
4
  end
5
5
  end
@@ -126,6 +126,12 @@ describe 'Unserialize' do
126
126
  expected = {"class" => "Person", "first_name" => "John", "last_name" => "Doe"}
127
127
  Php.unserialize(input).must_equal expected
128
128
  end
129
+
130
+ it 'should not alter the input' do
131
+ input = "serialized data"
132
+ Php.unserialize(input)
133
+ input.must_equal "serialized data"
134
+ end
129
135
  end
130
136
 
131
137
 
@@ -167,4 +173,10 @@ describe 'Unserialize Session' do
167
173
  }
168
174
  Php.unserialize_session(input).must_equal expected
169
175
  end
176
+
177
+ it 'should not alter the input' do
178
+ input = "serialized data"
179
+ Php.unserialize_session(input)
180
+ input.must_equal "serialized data"
181
+ end
170
182
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: php-serial
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-14 00:00:00.000000000 Z
12
+ date: 2012-05-17 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: PHP serialization/unserialization with session support
15
15
  email: