php_process 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -2,8 +2,8 @@ source "http://rubygems.org"
2
2
  # Add dependencies required to use your gem here.
3
3
  # Example:
4
4
  # gem "activesupport", ">= 2.3.5"
5
- gem "knjrbfw"
6
- gem "php-serialize"
5
+ gem "knjrbfw", ">= 0.0.31"
6
+ gem "php-serialize4ruby"
7
7
 
8
8
  # Add dependencies to develop your gem here.
9
9
  # Include everything needed to run rake, tests, features, etc.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
data/lib/php_process.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "knjrbfw"
2
+ require "knj/wref"
2
3
  require "base64"
3
- require "php_serialize"
4
+ require "php-serialize4ruby"
4
5
 
5
6
  #This class starts a PHP-process and proxies various calls to it. It also spawns proxy-objects, which can you can call like they were normal Ruby-objects.
6
7
  #===Examples
@@ -13,7 +14,12 @@ class Php_process
13
14
 
14
15
  #This object controls which IDs should be unset on the PHP-side by being a destructor on the Ruby-side.
15
16
  def objects_unsetter(id)
16
- @object_unset_ids << @object_ids[id]
17
+ obj_count_id = @object_ids[id]
18
+
19
+ if @object_unset_ids.index(obj_count_id) == nil
20
+ @object_unset_ids << obj_count_id
21
+ end
22
+
17
23
  @object_ids.delete(id)
18
24
  end
19
25
 
@@ -28,6 +34,7 @@ class Php_process
28
34
  @responses = Knj::Threadsafe::Synced_hash.new
29
35
  @object_ids = Knj::Threadsafe::Synced_hash.new
30
36
  @object_unset_ids = Knj::Threadsafe::Synced_array.new
37
+ @objects = Knj::Wref_map.new
31
38
 
32
39
  #Used for 'create_func'.
33
40
  @callbacks = {}
@@ -45,17 +52,18 @@ class Php_process
45
52
  @stdout.sync = true
46
53
  @stdin.sync = true
47
54
 
48
- @stdout.autoclose = true
49
- @stdin.autoclose = true
55
+ @stdin.set_encoding("iso-8859-1:utf-8")
56
+ @stderr.set_encoding("utf-8:iso-8859-1")
57
+ @stdout.set_encoding("utf-8:iso-8859-1")
50
58
 
51
59
  @err_thread = Knj::Thread.new do
52
60
  @stderr.each_line do |str|
61
+ @args[:on_err].call(str) if @args[:on_err]
62
+ $stderr.print "Process error: #{str}" if @debug or @args[:debug_stderr]
63
+
53
64
  if str.match(/^PHP Fatal error: (.+)\s+/)
54
65
  @fatal = str.strip
55
66
  end
56
-
57
- @args[:on_err].call(str) if @args[:on_err]
58
- $stderr.print "Process error: #{str}" if @debug or @args[:debug_stderr]
59
67
  end
60
68
  end
61
69
 
@@ -75,6 +83,14 @@ class Php_process
75
83
 
76
84
  $stderr.print "PHP-script ready.\n" if @debug
77
85
  start_read_loop
86
+
87
+ if block_given?
88
+ begin
89
+ yield(self)
90
+ ensure
91
+ self.destroy
92
+ end
93
+ end
78
94
  end
79
95
 
80
96
  #Returns various info in a hash about the object-cache on the PHP-side.
@@ -124,7 +140,7 @@ class Php_process
124
140
  # pe = php.new("PHPExcel")
125
141
  # pe.getProperties.setCreator("kaspernj")
126
142
  def new(classname, *args)
127
- return self.send(:type => :new, :class => classname, :args => parse_data(args))["object"]
143
+ return self.send(:type => :new, :class => classname, :args => parse_data(args))
128
144
  end
129
145
 
130
146
  #Call a function in PHP.
@@ -133,14 +149,14 @@ class Php_process
133
149
  # pid_of_php_process = php.func("getmypid")
134
150
  # php.func("require_once", "PHPExcel.php")
135
151
  def func(func_name, *args)
136
- return self.send(:type => :func, :func_name => func_name, :args => parse_data(args))["result"]
152
+ return self.send(:type => :func, :func_name => func_name, :args => parse_data(args))
137
153
  end
138
154
 
139
155
  #Sends a call to a static method on a class with given arguments.
140
156
  #===Examples
141
157
  # php.static("Gtk", "main_quit")
142
158
  def static(class_name, method_name, *args)
143
- return self.send(:type => :static_method_call, :class_name => class_name, :method_name => method_name, :args => parse_data(args))["result"]
159
+ return self.send(:type => :static_method_call, :class_name => class_name, :method_name => method_name, :args => parse_data(args))
144
160
  end
145
161
 
146
162
  #Creates a function on the PHP-side. When the function is called, it callbacks to the Ruby-side which then can execute stuff back to PHP.
@@ -175,14 +191,17 @@ class Php_process
175
191
  $stderr.print "Sending unsets: #{elements}\n" if @debug
176
192
  send_real("type" => "unset_ids", "ids" => elements)
177
193
  end
194
+
195
+ #Clean wref-map.
196
+ @objects.clean
178
197
  end
179
198
 
180
199
  #Parses argument-data into special hashes that can be used on the PHP-side. It is public because the proxy-objects uses it. Normally you would never use it.
181
200
  def parse_data(data)
182
201
  if data.is_a?(Php_process::Proxy_obj)
183
- return {:type => "php_process_proxy", :id => data.args[:id]}
202
+ return {:type => :proxyobj, :id => data.args[:id]}
184
203
  elsif data.is_a?(Php_process::Created_function)
185
- return {:type => "php_process_created_function", :id => data.args[:id]}
204
+ return {:type => :php_process_created_function, :id => data.args[:id]}
186
205
  elsif data.is_a?(Hash)
187
206
  newhash = {}
188
207
  data.each do |key, val|
@@ -204,14 +223,27 @@ class Php_process
204
223
 
205
224
  #Returns the value of a constant on the PHP-side.
206
225
  def constant_val(name)
207
- return self.send(:type => :constant_val, :name => name)["result"]
226
+ return self.send(:type => :constant_val, :name => name)
227
+ end
228
+
229
+ #Returns various informations about boths sides memory in a hash.
230
+ def memory_info
231
+ return {
232
+ :php_info => self.send(:type => :memory_info),
233
+ :ruby_info => {
234
+ :responses => @responses.length,
235
+ :objects_ids => @object_ids.length,
236
+ :object_unset_ids => @object_unset_ids.length,
237
+ :objects => @objects.length
238
+ }
239
+ }
208
240
  end
209
241
 
210
242
  private
211
243
 
212
244
  #Generates the command from the given object and sends it to the PHP-process. Then returns the parsed result.
213
245
  def send_real(hash)
214
- $stderr.print "Sending: #{hash}\n" if @debug
246
+ $stderr.print "Sending: #{hash[:args]}\n" if @debug and hash[:args]
215
247
  str = Base64.strict_encode64(PHP.serialize(hash))
216
248
  @stdin.write("send:#{@send_count}:#{str}\n")
217
249
  id = @send_count
@@ -235,11 +267,12 @@ class Php_process
235
267
  raise "#{resp["msg"]}\n\n#{resp["bt"]}"
236
268
  end
237
269
 
270
+ $stderr.print "Found answer #{id} - returning it.\n" if @debug
238
271
  return read_parsed_data(resp)
239
272
  end
240
273
 
241
274
  check_alive
242
- sleep 0.05
275
+ sleep 0.01
243
276
  $stderr.print "Waiting for answer to ID: #{id}\n" if @debug
244
277
  end
245
278
  end
@@ -252,12 +285,21 @@ class Php_process
252
285
 
253
286
  #Parses special hashes to proxy-objects and leaves the rest. This is used automatically.
254
287
  def read_parsed_data(data)
255
- if data.is_a?(Hash) and data["type"] == "php_process_proxy" and data.key?("id")
256
- return Proxy_obj.new(
257
- :php => self,
258
- :id => data["id"].to_i,
259
- :class => data["class"].to_sym
260
- )
288
+ if data.is_a?(Array) and data.length == 2 and data[0] == "proxyobj"
289
+ id = data[1].to_i
290
+
291
+ if proxy_obj = @objects.get!(id)
292
+ $stderr.print "Reuse proxy-obj!\n" if @debug
293
+ return proxy_obj
294
+ else
295
+ $stderr.print "Spawn new proxy-obj!\n" if @debug
296
+ proxy_obj = Proxy_obj.new(
297
+ :php => self,
298
+ :id => id
299
+ )
300
+ @objects[id] = proxy_obj
301
+ return proxy_obj
302
+ end
261
303
  elsif data.is_a?(Hash)
262
304
  newdata = {}
263
305
  data.each do |key, val|
@@ -319,7 +361,7 @@ class Php_process::Proxy_obj
319
361
  #===Examples
320
362
  # proxy_obj.__phpclass #=> :PHPExcel
321
363
  def __phpclass
322
- return @args[:class]
364
+ return @args[:php].func("get_class", self)
323
365
  end
324
366
 
325
367
  #Sets an instance-variable on the object.
@@ -338,12 +380,12 @@ class Php_process::Proxy_obj
338
380
  # proxy_obj.__set_var("testvar", 5)
339
381
  # proxy_obj.__get_var("testvar") #=> 5
340
382
  def __get_var(name)
341
- return @args[:php].send(:type => "get_var", :id => @args[:id], :name => name)["result"]
383
+ return @args[:php].send(:type => "get_var", :id => @args[:id], :name => name)
342
384
  end
343
385
 
344
386
  #Uses 'method_missing' to proxy all other calls onto the PHP-process and the PHP-object. Then returns the parsed result.
345
387
  def method_missing(method_name, *args)
346
- return @args[:php].send(:type => :object_call, :method => method_name, :args => @args[:php].parse_data(args), :id => @args[:id])["result"]
388
+ return @args[:php].send(:type => :object_call, :method => method_name, :args => @args[:php].parse_data(args), :id => @args[:id])
347
389
  end
348
390
  end
349
391
 
data/lib/php_script.php CHANGED
@@ -6,9 +6,10 @@ class php_process{
6
6
  $this->sock_stdin = fopen("php://stdin", "r");
7
7
  $this->sock_stdout = fopen("php://stdout", "w");
8
8
  $this->objects = array();
9
+ $this->objects_spl = array();
9
10
  $this->objects_count = 0;
10
11
  $this->created_functions = array();
11
- $this->proxy_to_func = array("call_created_func", "constant_val", "create_func", "func", "get_var", "object_cache_info", "object_call", "require_once_path", "set_var", "static_method_call", "unset_ids");
12
+ $this->proxy_to_func = array("call_created_func", "constant_val", "create_func", "func", "get_var", "memory_info", "object_cache_info", "object_call", "require_once_path", "set_var", "static_method_call", "unset_ids");
12
13
  $this->send_count = 0;
13
14
 
14
15
  print "php_script_ready:" . getmypid() . "\n";
@@ -37,6 +38,9 @@ class php_process{
37
38
  $type = $data[0];
38
39
  $id = intval($data[1]);
39
40
  $args = unserialize(base64_decode($data[2]));
41
+ if ($args === false){
42
+ throw new exception("The args-data was not unserializeable: " . utf8_encode(base64_decode($data[2])));
43
+ }
40
44
 
41
45
  try{
42
46
  if ($type == "send"){
@@ -48,7 +52,7 @@ class php_process{
48
52
  }elseif(in_array($args["type"], $this->proxy_to_func)){
49
53
  $this->$args["type"]($id, $args);
50
54
  }else{
51
- throw new exception("Unknown send-type: " . $args["type"]);
55
+ throw new exception("Unknown send-type: " . $args["type"] . " (" . implode(", ", array_keys($args)) . ") (" . base64_decode($data[2]) . ")");
52
56
  }
53
57
  }else{
54
58
  throw new exception("Invalid type: " . $type);
@@ -62,17 +66,29 @@ class php_process{
62
66
  if (is_array($data)){
63
67
  foreach($data as $key => $val){
64
68
  if (is_object($val)){
65
- $this->objects[$this->objects_count] = $val;
66
- $data[$key] = array("type" => "php_process_proxy", "id" => $this->objects_count, "class" => get_class($val));
67
- $this->objects_count++;
69
+ $data[$key] = $this->parse_data($val);
68
70
  }
69
71
  }
70
72
 
71
73
  return $data;
72
74
  }elseif(is_object($data)){
73
- $this->objects[$this->objects_count] = $val;
74
- $ret = array("type" => "php_process_proxy", "id" => $this->objects_count, "class" => get_class($val));
75
- $this->objects_count++;
75
+ $spl = spl_object_hash($data);
76
+
77
+ if (array_key_exists($spl, $this->objects_spl)){
78
+ $id = $this->objects_spl[$spl];
79
+ }else{
80
+ $id = $this->objects_count;
81
+ $this->objects_count++;
82
+
83
+ if (array_key_exists($id, $this->objects)){
84
+ throw new exception("Object with that ID already exists: " . $id);
85
+ }
86
+
87
+ $this->objects[$id] = array("obj" => $data, "spl" => $spl);
88
+ $this->objects_spl[$spl] = $id;
89
+ }
90
+
91
+ $ret = array("proxyobj", $id);
76
92
  return $ret;
77
93
  }else{
78
94
  return $data;
@@ -80,14 +96,14 @@ class php_process{
80
96
  }
81
97
 
82
98
  function read_parsed_data($data){
83
- if (is_array($data) and array_key_exists("type", $data) and $data["type"] == "php_process_proxy" and array_key_exists("id", $data) and $data["id"]){
84
- $object = $this->objects[$data["id"]];
99
+ if (is_array($data) and array_key_exists("type", $data) and $data["type"] == "proxyobj" and array_key_exists("id", $data)){
100
+ $object = $this->objects[$data["id"]]["obj"];
85
101
  if (!$object){
86
102
  throw new exception("No object by that ID: " . $data["id"]);
87
103
  }
88
104
 
89
105
  return $object;
90
- }elseif(is_array($data) and array_key_exists("type", $data) and $data["type"] == "php_process_created_function" and array_key_exists("id", $data) and $data["id"]){
106
+ }elseif(is_array($data) and array_key_exists("type", $data) and $data["type"] == "php_process_created_function" and array_key_exists("id", $data)){
91
107
  $func = $this->created_functions[$data["id"]]["func"];
92
108
  return $func;
93
109
  }elseif(is_array($data)){
@@ -114,13 +130,11 @@ class php_process{
114
130
  $klass = new ReflectionClass($class);
115
131
  $object = $klass->newInstanceArgs($new_args);
116
132
 
117
- $this->answer($id, array(
118
- "object" => $object
119
- ));
133
+ $this->answer($id, $object);
120
134
  }
121
135
 
122
136
  function set_var($id, $args){
123
- $object = $this->objects[$args["id"]];
137
+ $object = $this->objects[$args["id"]]["obj"];
124
138
  if (!$object){
125
139
  throw new exception("No object by that ID: " . $args["id"]);
126
140
  }
@@ -130,23 +144,20 @@ class php_process{
130
144
  }
131
145
 
132
146
  function get_var($id, $args){
133
- $object = $this->objects[$args["id"]];
147
+ $object = $this->objects[$args["id"]]["obj"];
134
148
  if (!$object){
135
149
  throw new exception("No object by that ID: " . $args["id"]);
136
150
  }
137
151
 
138
- $this->answer($id, array(
139
- "result" => $object->$args["name"]
140
- ));
141
- }
142
-
143
- function require_once_path($id, $args){
144
- require_once $args["filepath"];
145
- $this->answer($id, true);
152
+ $this->answer($id, $object->$args["name"]);
146
153
  }
147
154
 
148
155
  function object_call($id, $args){
149
- $object = $this->objects[$args["id"]];
156
+ if (!array_key_exists($args["id"], $this->objects)){
157
+ throw new exception("No object by that ID: " . $args["id"]);
158
+ }
159
+
160
+ $object = $this->objects[$args["id"]]["obj"];
150
161
  $call_arr = array($object, $args["method"]);
151
162
 
152
163
  //Error handeling.
@@ -159,9 +170,7 @@ class php_process{
159
170
  }
160
171
 
161
172
  $res = call_user_func_array($call_arr, $this->read_parsed_data($args["args"]));
162
- $this->answer($id, array(
163
- "result" => $res
164
- ));
173
+ $this->answer($id, $res);
165
174
  }
166
175
 
167
176
  function func($id, $args){
@@ -191,11 +200,22 @@ class php_process{
191
200
  $res = call_user_func_array($args["func_name"], $newargs);
192
201
  }
193
202
 
194
- $this->answer($id, array("result" => $res));
203
+ $this->answer($id, $res);
195
204
  }
196
205
 
197
206
  function unset_ids($id, $args){
198
207
  foreach($args["ids"] as $obj_id){
208
+ if (!array_key_exists($obj_id, $this->objects)){
209
+ continue;
210
+ }
211
+
212
+ $spl = $this->objects[$obj_id]["spl"];
213
+
214
+ if (!array_key_exists($spl, $this->objects_spl)){
215
+ throw new exception("SPL could not be found: " . $spl);
216
+ }
217
+
218
+ unset($this->objects_spl[$spl]);
199
219
  unset($this->objects[$obj_id]);
200
220
  }
201
221
 
@@ -230,12 +250,9 @@ class php_process{
230
250
  }
231
251
 
232
252
  $newargs = $this->read_parsed_data($args["args"]);
233
- error_log("Args: " . print_r($newargs, true));
234
253
  $res = call_user_func_array($call_arr, $newargs);
235
254
 
236
- $this->answer($id, array(
237
- "result" => $res
238
- ));
255
+ $this->answer($id, $res);
239
256
  }
240
257
 
241
258
  function create_func($id, $args){
@@ -277,12 +294,18 @@ class php_process{
277
294
 
278
295
  $eval_str .= ");";
279
296
  $res = eval($eval_str);
280
- $this->answer($id, array("result" => $res));
297
+ $this->answer($id, $res);
281
298
  }
282
299
 
283
300
  function constant_val($id, $args){
301
+ $this->answer($id, constant($args["name"]));
302
+ }
303
+
304
+ function memory_info($id, $args){
284
305
  $this->answer($id, array(
285
- "result" => constant($args["name"])
306
+ "objects" => count($this->objects),
307
+ "objects_spl" => count($this->objects_spl),
308
+ "created_functions" => count($this->created_functions)
286
309
  ));
287
310
  }
288
311
  }
data/php_process.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{php_process}
8
- s.version = "0.0.2"
8
+ s.version = "0.0.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kasper Johansen"]
12
- s.date = %q{2012-05-05}
12
+ s.date = %q{2012-05-06}
13
13
  s.description = %q{Spawns a PHP process and proxies calls to it, making it possible to proxy objects and more.}
14
14
  s.email = %q{k@spernj.org}
15
15
  s.extra_rdoc_files = [
@@ -40,16 +40,16 @@ Gem::Specification.new do |s|
40
40
  s.specification_version = 3
41
41
 
42
42
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
- s.add_runtime_dependency(%q<knjrbfw>, [">= 0"])
44
- s.add_runtime_dependency(%q<php-serialize>, [">= 0"])
43
+ s.add_runtime_dependency(%q<knjrbfw>, [">= 0.0.31"])
44
+ s.add_runtime_dependency(%q<php-serialize4ruby>, [">= 0"])
45
45
  s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
46
46
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
47
47
  s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
48
48
  s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
49
49
  s.add_development_dependency(%q<rcov>, [">= 0"])
50
50
  else
51
- s.add_dependency(%q<knjrbfw>, [">= 0"])
52
- s.add_dependency(%q<php-serialize>, [">= 0"])
51
+ s.add_dependency(%q<knjrbfw>, [">= 0.0.31"])
52
+ s.add_dependency(%q<php-serialize4ruby>, [">= 0"])
53
53
  s.add_dependency(%q<rspec>, ["~> 2.8.0"])
54
54
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
55
55
  s.add_dependency(%q<bundler>, [">= 1.0.0"])
@@ -57,8 +57,8 @@ Gem::Specification.new do |s|
57
57
  s.add_dependency(%q<rcov>, [">= 0"])
58
58
  end
59
59
  else
60
- s.add_dependency(%q<knjrbfw>, [">= 0"])
61
- s.add_dependency(%q<php-serialize>, [">= 0"])
60
+ s.add_dependency(%q<knjrbfw>, [">= 0.0.31"])
61
+ s.add_dependency(%q<php-serialize4ruby>, [">= 0"])
62
62
  s.add_dependency(%q<rspec>, ["~> 2.8.0"])
63
63
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
64
64
  s.add_dependency(%q<bundler>, [">= 1.0.0"])
@@ -1,3 +1,5 @@
1
+ # coding: utf-8
2
+
1
3
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
4
 
3
5
  describe "PhpProcess" do
@@ -14,6 +16,13 @@ describe "PhpProcess" do
14
16
  raise "Invalid PID: #{pid}" if pid.to_i <= 0
15
17
 
16
18
 
19
+ #Test encoding.
20
+ test_str = "æøå"
21
+ $php.func("file_put_contents", "/tmp/php_process_test_encoding", test_str)
22
+ test_str_read = File.read("/tmp/php_process_test_encoding")
23
+ raise "Expected the two strings to be the same, but they werent: '#{test_str}', '#{test_str_read}'." if test_str != test_str_read
24
+
25
+
17
26
  #Test function calls with arguments.
18
27
  res = $php.func("explode", ";", "1;2;4;5")
19
28
  raise "Expected length of result to be 4 but it wasnt: #{res.length}" if res.length != 4
@@ -99,7 +108,7 @@ describe "PhpProcess" do
99
108
  sheet.getStyle("A5:C5").getBorders.getBottom.setBorderStyle(const_border_thick)
100
109
  sheet.getStyle("C1:C5").getBorders.getRight.setBorderStyle(const_border_thick)
101
110
 
102
- sheet.setCellValue("A1", "Kasper Johansen")
111
+ sheet.setCellValue("A1", "Kasper Johansen - æøå")
103
112
  sheet.getStyle("A1").getFont.setBold(true)
104
113
 
105
114
  writer = $php.new("PHPExcel_Writer_Excel2007", pe)
metadata CHANGED
@@ -1,103 +1,105 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: php_process
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.2
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 0.0.3
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Kasper Johansen
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-05 00:00:00.000000000 +02:00
12
+
13
+ date: 2012-05-06 00:00:00 +02:00
13
14
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
16
17
  name: knjrbfw
17
- requirement: &18683880 !ruby/object:Gem::Requirement
18
+ requirement: &id001 !ruby/object:Gem::Requirement
18
19
  none: false
19
- requirements:
20
- - - ! '>='
21
- - !ruby/object:Gem::Version
22
- version: '0'
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.31
23
24
  type: :runtime
24
25
  prerelease: false
25
- version_requirements: *18683880
26
- - !ruby/object:Gem::Dependency
27
- name: php-serialize
28
- requirement: &18682760 !ruby/object:Gem::Requirement
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: php-serialize4ruby
29
+ requirement: &id002 !ruby/object:Gem::Requirement
29
30
  none: false
30
- requirements:
31
- - - ! '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
34
35
  type: :runtime
35
36
  prerelease: false
36
- version_requirements: *18682760
37
- - !ruby/object:Gem::Dependency
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
38
39
  name: rspec
39
- requirement: &18681580 !ruby/object:Gem::Requirement
40
+ requirement: &id003 !ruby/object:Gem::Requirement
40
41
  none: false
41
- requirements:
42
+ requirements:
42
43
  - - ~>
43
- - !ruby/object:Gem::Version
44
+ - !ruby/object:Gem::Version
44
45
  version: 2.8.0
45
46
  type: :development
46
47
  prerelease: false
47
- version_requirements: *18681580
48
- - !ruby/object:Gem::Dependency
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
49
50
  name: rdoc
50
- requirement: &18680980 !ruby/object:Gem::Requirement
51
+ requirement: &id004 !ruby/object:Gem::Requirement
51
52
  none: false
52
- requirements:
53
+ requirements:
53
54
  - - ~>
54
- - !ruby/object:Gem::Version
55
- version: '3.12'
55
+ - !ruby/object:Gem::Version
56
+ version: "3.12"
56
57
  type: :development
57
58
  prerelease: false
58
- version_requirements: *18680980
59
- - !ruby/object:Gem::Dependency
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
60
61
  name: bundler
61
- requirement: &18679700 !ruby/object:Gem::Requirement
62
+ requirement: &id005 !ruby/object:Gem::Requirement
62
63
  none: false
63
- requirements:
64
- - - ! '>='
65
- - !ruby/object:Gem::Version
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
66
67
  version: 1.0.0
67
68
  type: :development
68
69
  prerelease: false
69
- version_requirements: *18679700
70
- - !ruby/object:Gem::Dependency
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
71
72
  name: jeweler
72
- requirement: &18678820 !ruby/object:Gem::Requirement
73
+ requirement: &id006 !ruby/object:Gem::Requirement
73
74
  none: false
74
- requirements:
75
+ requirements:
75
76
  - - ~>
76
- - !ruby/object:Gem::Version
77
+ - !ruby/object:Gem::Version
77
78
  version: 1.8.3
78
79
  type: :development
79
80
  prerelease: false
80
- version_requirements: *18678820
81
- - !ruby/object:Gem::Dependency
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
82
83
  name: rcov
83
- requirement: &18677920 !ruby/object:Gem::Requirement
84
+ requirement: &id007 !ruby/object:Gem::Requirement
84
85
  none: false
85
- requirements:
86
- - - ! '>='
87
- - !ruby/object:Gem::Version
88
- version: '0'
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
89
90
  type: :development
90
91
  prerelease: false
91
- version_requirements: *18677920
92
- description: Spawns a PHP process and proxies calls to it, making it possible to proxy
93
- objects and more.
92
+ version_requirements: *id007
93
+ description: Spawns a PHP process and proxies calls to it, making it possible to proxy objects and more.
94
94
  email: k@spernj.org
95
95
  executables: []
96
+
96
97
  extensions: []
97
- extra_rdoc_files:
98
+
99
+ extra_rdoc_files:
98
100
  - LICENSE.txt
99
101
  - README.rdoc
100
- files:
102
+ files:
101
103
  - .document
102
104
  - .rspec
103
105
  - Gemfile
@@ -112,31 +114,34 @@ files:
112
114
  - spec/spec_helper.rb
113
115
  has_rdoc: true
114
116
  homepage: http://github.com/kaspernj/php_process
115
- licenses:
117
+ licenses:
116
118
  - MIT
117
119
  post_install_message:
118
120
  rdoc_options: []
119
- require_paths:
121
+
122
+ require_paths:
120
123
  - lib
121
- required_ruby_version: !ruby/object:Gem::Requirement
124
+ required_ruby_version: !ruby/object:Gem::Requirement
122
125
  none: false
123
- requirements:
124
- - - ! '>='
125
- - !ruby/object:Gem::Version
126
- version: '0'
127
- segments:
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ hash: -690325750737638364
130
+ segments:
128
131
  - 0
129
- hash: -656564048361745716
130
- required_rubygems_version: !ruby/object:Gem::Requirement
132
+ version: "0"
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
134
  none: false
132
- requirements:
133
- - - ! '>='
134
- - !ruby/object:Gem::Version
135
- version: '0'
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: "0"
136
139
  requirements: []
140
+
137
141
  rubyforge_project:
138
142
  rubygems_version: 1.6.2
139
143
  signing_key:
140
144
  specification_version: 3
141
145
  summary: Ruby-to-PHP bridge
142
146
  test_files: []
147
+