php_process 0.0.2 → 0.0.3

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/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
+