io-extra 1.2.6 → 1.2.7
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 +15 -0
- data/CHANGES +11 -0
- data/README +8 -8
- data/Rakefile +6 -1
- data/ext/extconf.rb +6 -0
- data/ext/io/extra.c +68 -19
- data/io-extra.gemspec +3 -3
- data/test/test_io_extra.rb +9 -8
- metadata +39 -58
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YWJjN2NhYmZlMzAwNWY1M2M2Zjk5YzcwYTQ2ODFhOGFjYzgxOTNiOA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZGM3YmIxOGE3Y2NiMGVkYTQ4ZmMyMTFmZWFlNmI4Y2JiZDQxZWI3Nw==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ODZhNDczYjAwYTJkNzY0MWJjN2Q3NmY3NmJkMDI5OTc1OThkODI5ZjMzZDQy
|
10
|
+
Y2RkNDlkNGRlMWE4ZTY1OTRiNTA4OTkyODI4ZmNlYjRjMzIyNWU5NGE0NjE1
|
11
|
+
ZjliOTM3YjJkZDY1MDVjNjhjYzAwODQwNTViMjRjY2EzOTNiOTI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZDEyNDY4ZjVmMzc3ZGUwNWEzMmIxZWUyYWNhNzM0ZjljZTNiNDExZTIxNzNh
|
14
|
+
OTFhNzJiZTM5NTBlZDUyMTNmOTQwZTg0MDAxY2YzNmU5MDI3NWU0YjZkMTU0
|
15
|
+
NTY4MTZkN2E0NmRhNDU3OTdhNTQ0ZjkzZmIzZDJlNTRlMzZkMzc=
|
data/CHANGES
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
== 1.2.7 - 10-Aug-2013
|
2
|
+
* Direct IO is now supported on Darwin, and some bugs in the directio
|
3
|
+
methods have been fixed. Thanks go to Genki Takiuchi for the patches.
|
4
|
+
* Fixed a bug in fdwalk and closefrom when using Ruby 1.9.3 where
|
5
|
+
closing reserved file descriptors would segfault the interpreter.
|
6
|
+
Thanks go to Eric Wong for the patch.
|
7
|
+
* Fixed a bug in the fdwalk method where it was not honoring the
|
8
|
+
lowfd argument, and added a test for it.
|
9
|
+
* The rb_thread_call_without_gvl function is now used internally in
|
10
|
+
place of rb_thread_blocking_region for Ruby 2.x.
|
11
|
+
|
1
12
|
== 1.2.6 - 22-May-2011
|
2
13
|
* Fixed a potential memory leak in the pread_ptr method where malloc'ed
|
3
14
|
memory was not freed if the pread function call failed. Thanks go to
|
data/README
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
This library is not supported on MS Windows.
|
7
7
|
|
8
|
-
Support for OS X is limited. See
|
8
|
+
Support for OS X is limited. See below for details.
|
9
9
|
|
10
10
|
= Installation
|
11
11
|
gem install io-extra
|
@@ -55,8 +55,8 @@
|
|
55
55
|
opened via system() calls.
|
56
56
|
|
57
57
|
= Note to OS X Users
|
58
|
-
The OS X platform does not support closefrom()
|
59
|
-
|
58
|
+
The OS X platform does not support closefrom() or fdwalk(). The hand-
|
59
|
+
crafted IO.closefrom function will not work because the getrlimit()
|
60
60
|
function on OS X does not work. Patches welcome.
|
61
61
|
|
62
62
|
= Documentation
|
@@ -64,24 +64,24 @@
|
|
64
64
|
documentation that was generated by RDoc (if you did a gem install).
|
65
65
|
|
66
66
|
= Known Issues
|
67
|
-
The IO.writev tests fail on Solaris.
|
67
|
+
The IO.writev tests fail on Solaris. Short test scripts seem to work,
|
68
|
+
however. We're not sure what the issue is yet. Help wanted.
|
68
69
|
|
69
70
|
Please file any bug reports on the project page at
|
70
|
-
|
71
|
+
https://github.com/djberg96/io-extra
|
71
72
|
|
72
73
|
= Future Plans
|
73
|
-
* I may add the File::O_DIRECT open constant on platforms that support it.
|
74
74
|
* Switch from C extension to FFI.
|
75
75
|
|
76
76
|
= Acknowledgements
|
77
77
|
Eric Wong for some great work on Linux compatibility and other fixes, as
|
78
78
|
well as the code for the IO.writev method.
|
79
|
-
|
79
|
+
|
80
80
|
= License
|
81
81
|
Artistic 2.0
|
82
82
|
|
83
83
|
= Copyright
|
84
|
-
(C) 2003-
|
84
|
+
(C) 2003-2013 Daniel J. Berger
|
85
85
|
All Rights Reserved
|
86
86
|
|
87
87
|
= Warranty
|
data/Rakefile
CHANGED
@@ -34,7 +34,12 @@ namespace :gem do
|
|
34
34
|
desc 'Create the io-extra gem'
|
35
35
|
task :create => [:clean] do
|
36
36
|
spec = eval(IO.read('io-extra.gemspec'))
|
37
|
-
Gem::
|
37
|
+
if Gem::VERSION.to_f >= 2.0
|
38
|
+
require 'rubygems/package'
|
39
|
+
Gem::Package.build(spec)
|
40
|
+
else
|
41
|
+
Gem::Builder.new(spec).build
|
42
|
+
end
|
38
43
|
end
|
39
44
|
|
40
45
|
desc "Install the io-extra library as a gem"
|
data/ext/extconf.rb
CHANGED
@@ -16,6 +16,8 @@ have_func('writev')
|
|
16
16
|
have_func('rb_str_set_len', 'ruby.h')
|
17
17
|
have_func('rb_thread_blocking_region')
|
18
18
|
have_func('ttyname')
|
19
|
+
have_func('rb_reserved_fd_p')
|
20
|
+
have_func('rb_thread_call_without_gvl', 'ruby/thread.h')
|
19
21
|
|
20
22
|
case RbConfig::CONFIG['host_os']
|
21
23
|
when /darwin/i
|
@@ -36,4 +38,8 @@ if have_macro("O_DIRECT", %w(sys/types.h fcntl.h))
|
|
36
38
|
$CPPFLAGS += " -DHAVE_O_DIRECT_MACRO"
|
37
39
|
end
|
38
40
|
|
41
|
+
if have_macro("F_NOCACHE", %w(fcntl.h))
|
42
|
+
$CPPFLAGS += " -DHAVE_F_NOCACHE_MACRO"
|
43
|
+
end
|
44
|
+
|
39
45
|
create_makefile('io/extra', 'io')
|
data/ext/io/extra.c
CHANGED
@@ -31,6 +31,10 @@
|
|
31
31
|
#endif
|
32
32
|
#endif
|
33
33
|
|
34
|
+
#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
|
35
|
+
#include <ruby/thread.h>
|
36
|
+
#endif
|
37
|
+
|
34
38
|
#ifndef HAVE_RB_THREAD_BLOCKING_REGION
|
35
39
|
/*
|
36
40
|
* partial emulation of the 1.9 rb_thread_blocking_region under 1.8,
|
@@ -72,6 +76,17 @@ static void rb_18_str_set_len(VALUE str, long len)
|
|
72
76
|
#define rb_str_set_len(str,len) rb_18_str_set_len(str,len)
|
73
77
|
#endif
|
74
78
|
|
79
|
+
/*
|
80
|
+
* Matz Ruby 1.9.3 has rb_reserved_fd_p() because it uses an internal
|
81
|
+
* timer thread + pipe to communicate signal wakeups (1.9.0 - 1.9.2
|
82
|
+
* wokeup every 10ms to check for signals). Accidentally closing this
|
83
|
+
* pipe breaks the VM completely, so we use this function to avoid it.
|
84
|
+
* This can be safely made a no-op for Ruby implementations that do
|
85
|
+
* not have this function (since it implies the VM does not reserve FDs)
|
86
|
+
*/
|
87
|
+
#ifndef RB_RESERVED_FD_P
|
88
|
+
#define RB_RESERVED_FD_P(fd) (0)
|
89
|
+
#endif
|
75
90
|
|
76
91
|
#ifdef PROC_SELF_FD_DIR
|
77
92
|
#include <dirent.h>
|
@@ -131,15 +146,18 @@ static int open_max(void){
|
|
131
146
|
* The manual approach was copied from the closefrom() man page on Solaris 9.
|
132
147
|
*/
|
133
148
|
static VALUE io_closefrom(VALUE klass, VALUE v_low_fd){
|
134
|
-
#
|
149
|
+
#if defined(HAVE_CLOSEFROM) && !defined(HAVE_RB_RESERVED_FD_P)
|
150
|
+
/* we can't safely use closefrom() if the RubyVM reserves FDs */
|
135
151
|
closefrom(NUM2INT(v_low_fd));
|
136
152
|
#else
|
137
153
|
int i, lowfd;
|
138
154
|
int maxfd = open_max();
|
139
155
|
lowfd = NUM2INT(v_low_fd);
|
140
156
|
|
141
|
-
for(i = lowfd; i < maxfd; i++)
|
142
|
-
|
157
|
+
for(i = lowfd; i < maxfd; i++) {
|
158
|
+
if(!RB_RESERVED_FD_P(i))
|
159
|
+
close(i);
|
160
|
+
}
|
143
161
|
#endif
|
144
162
|
return klass;
|
145
163
|
}
|
@@ -202,11 +220,16 @@ static int fdwalk(int (*func)(void *data, int fd), void *data){
|
|
202
220
|
* It's up to the user to close it.
|
203
221
|
*/
|
204
222
|
static int close_func(void* lowfd, int fd){
|
205
|
-
|
223
|
+
VALUE v_args[1];
|
224
|
+
|
225
|
+
if(fd >= *(int*)lowfd){
|
226
|
+
if (RB_RESERVED_FD_P(fd))
|
227
|
+
return 0;
|
228
|
+
v_args[0] = UINT2NUM(fd);
|
229
|
+
rb_yield(rb_class_new_instance(1, v_args, rb_cFile));
|
230
|
+
}
|
206
231
|
|
207
|
-
|
208
|
-
rb_yield(rb_class_new_instance(1, v_args, rb_cFile));
|
209
|
-
return 0;
|
232
|
+
return 0;
|
210
233
|
}
|
211
234
|
|
212
235
|
/*
|
@@ -230,7 +253,7 @@ static VALUE io_fdwalk(int argc, VALUE* argv, VALUE klass){
|
|
230
253
|
}
|
231
254
|
#endif
|
232
255
|
|
233
|
-
#if defined(HAVE_DIRECTIO) || defined(O_DIRECT)
|
256
|
+
#if defined(HAVE_DIRECTIO) || defined(O_DIRECT) || defined(F_NOCACHE)
|
234
257
|
/*
|
235
258
|
* call-seq:
|
236
259
|
* IO#directio?
|
@@ -239,11 +262,8 @@ static VALUE io_fdwalk(int argc, VALUE* argv, VALUE klass){
|
|
239
262
|
* current handle. The default is false.
|
240
263
|
*/
|
241
264
|
static VALUE io_get_directio(VALUE self){
|
242
|
-
#if defined(HAVE_DIRECTIO)
|
243
|
-
VALUE v_advice =
|
244
|
-
|
245
|
-
if(rb_ivar_defined(rb_cIO, rb_intern("@directio")))
|
246
|
-
v_advice = rb_iv_get(self, "directio");
|
265
|
+
#if defined(HAVE_DIRECTIO) || defined(F_NOCACHE)
|
266
|
+
VALUE v_advice = rb_iv_get(self, "@directio");
|
247
267
|
|
248
268
|
if(NIL_P(v_advice))
|
249
269
|
v_advice = Qfalse;
|
@@ -287,9 +307,12 @@ static VALUE io_set_directio(VALUE self, VALUE v_advice){
|
|
287
307
|
rb_raise(rb_eStandardError, "The directio() call failed");
|
288
308
|
|
289
309
|
if(advice == DIRECTIO_ON)
|
290
|
-
rb_iv_set(self, "directio", Qtrue);
|
310
|
+
rb_iv_set(self, "@directio", Qtrue);
|
311
|
+
else
|
312
|
+
rb_iv_set(self, "@directio", Qfalse);
|
291
313
|
#else
|
292
314
|
{
|
315
|
+
#if defined(O_DIRECT)
|
293
316
|
int flags = fcntl(fd, F_GETFL);
|
294
317
|
|
295
318
|
if(flags < 0)
|
@@ -306,6 +329,17 @@ static VALUE io_set_directio(VALUE self, VALUE v_advice){
|
|
306
329
|
rb_sys_fail("fcntl");
|
307
330
|
}
|
308
331
|
}
|
332
|
+
#elif defined(F_NOCACHE)
|
333
|
+
if(advice == DIRECTIO_OFF){
|
334
|
+
if(fcntl(fd, F_NOCACHE, 0) < 0)
|
335
|
+
rb_sys_fail("fcntl");
|
336
|
+
rb_iv_set(self, "@directio", Qfalse);
|
337
|
+
} else { /* DIRECTIO_ON*/
|
338
|
+
if(fcntl(fd, F_NOCACHE, 1) < 0)
|
339
|
+
rb_sys_fail("fcntl");
|
340
|
+
rb_iv_set(self, "@directio", Qtrue);
|
341
|
+
}
|
342
|
+
#endif
|
309
343
|
}
|
310
344
|
#endif
|
311
345
|
|
@@ -346,7 +380,11 @@ static VALUE s_io_pread(VALUE klass, VALUE fd, VALUE nbyte, VALUE offset){
|
|
346
380
|
str = rb_str_new(NULL, args.nbyte);
|
347
381
|
args.buf = RSTRING_PTR(str);
|
348
382
|
|
383
|
+
#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
|
384
|
+
nread = (ssize_t)rb_thread_call_without_gvl((void*)nogvl_pread, &args, RUBY_UBF_IO, 0);
|
385
|
+
#else
|
349
386
|
nread = (ssize_t)rb_thread_blocking_region(nogvl_pread, &args, RUBY_UBF_IO, 0);
|
387
|
+
#endif
|
350
388
|
|
351
389
|
if (nread == -1)
|
352
390
|
rb_sys_fail("pread");
|
@@ -416,7 +454,11 @@ static VALUE s_io_pwrite(VALUE klass, VALUE fd, VALUE buf, VALUE offset){
|
|
416
454
|
args.nbyte = RSTRING_LEN(buf);
|
417
455
|
args.offset = NUM2OFFT(offset);
|
418
456
|
|
457
|
+
#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
|
458
|
+
result = (ssize_t)rb_thread_call_without_gvl((void*)nogvl_pwrite, &args, RUBY_UBF_IO, 0);
|
459
|
+
#else
|
419
460
|
result = (ssize_t)rb_thread_blocking_region(nogvl_pwrite, &args, RUBY_UBF_IO, 0);
|
461
|
+
#endif
|
420
462
|
|
421
463
|
if(result == -1)
|
422
464
|
rb_sys_fail("pwrite");
|
@@ -483,8 +525,15 @@ static VALUE s_io_writev(VALUE klass, VALUE fd, VALUE ary) {
|
|
483
525
|
ARY2IOVEC(args.iov, args.iovcnt, left, ary);
|
484
526
|
|
485
527
|
for(;;) {
|
486
|
-
|
487
|
-
|
528
|
+
#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
|
529
|
+
ssize_t w = (ssize_t)rb_thread_call_without_gvl(
|
530
|
+
(void*)nogvl_writev, &args, RUBY_UBF_IO, 0
|
531
|
+
);
|
532
|
+
#else
|
533
|
+
ssize_t w = (ssize_t)rb_thread_blocking_region(
|
534
|
+
nogvl_writev, &args, RUBY_UBF_IO, 0
|
535
|
+
);
|
536
|
+
#endif
|
488
537
|
|
489
538
|
if(w == -1) {
|
490
539
|
if (rb_io_wait_writable(args.fd)) {
|
@@ -573,7 +622,7 @@ void Init_extra(){
|
|
573
622
|
rb_define_singleton_method(rb_cIO, "fdwalk", io_fdwalk, -1);
|
574
623
|
#endif
|
575
624
|
|
576
|
-
#if defined(HAVE_DIRECTIO) || defined(O_DIRECT)
|
625
|
+
#if defined(HAVE_DIRECTIO) || defined(O_DIRECT) || defined(F_NOCACHE)
|
577
626
|
rb_define_method(rb_cIO, "directio?", io_get_directio, 0);
|
578
627
|
rb_define_method(rb_cIO, "directio=", io_set_directio, 1);
|
579
628
|
|
@@ -608,6 +657,6 @@ void Init_extra(){
|
|
608
657
|
rb_define_method(rb_cIO, "ttyname", io_get_ttyname, 0);
|
609
658
|
#endif
|
610
659
|
|
611
|
-
/* 1.2.
|
612
|
-
rb_define_const(rb_cIO, "EXTRA_VERSION", rb_str_new2("1.2.
|
660
|
+
/* 1.2.7: The version of this library. This a string. */
|
661
|
+
rb_define_const(rb_cIO, "EXTRA_VERSION", rb_str_new2("1.2.7"));
|
613
662
|
}
|
data/io-extra.gemspec
CHANGED
@@ -2,13 +2,13 @@ require 'rubygems'
|
|
2
2
|
require 'rbconfig'
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
5
|
-
if
|
5
|
+
if File::ALT_SEPARATOR
|
6
6
|
STDERR.puts 'Not supported on this platform. Exiting.'
|
7
7
|
exit(-1)
|
8
8
|
end
|
9
9
|
|
10
10
|
spec.name = 'io-extra'
|
11
|
-
spec.version = '1.2.
|
11
|
+
spec.version = '1.2.7'
|
12
12
|
spec.author = 'Daniel J. Berger'
|
13
13
|
spec.license = 'Artistic 2.0'
|
14
14
|
spec.email = 'djberg96@gmail.com'
|
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.rubyforge_project = 'shards'
|
29
29
|
spec.required_ruby_version = '>= 1.8.6'
|
30
30
|
|
31
|
-
spec.add_development_dependency('test-unit', '>= 2.
|
31
|
+
spec.add_development_dependency('test-unit', '>= 2.5.0')
|
32
32
|
|
33
33
|
spec.description = <<-EOF
|
34
34
|
Adds the IO.closefrom, IO.fdwalk, IO.pread, IO.pread_ptr, IO.pwrite, and
|
data/test/test_io_extra.rb
CHANGED
@@ -4,10 +4,7 @@
|
|
4
4
|
# Test suite for the io-extra library. This test should be run via the
|
5
5
|
# 'rake test' task.
|
6
6
|
###########################################################################
|
7
|
-
require '
|
8
|
-
gem 'test-unit'
|
9
|
-
|
10
|
-
require 'test/unit'
|
7
|
+
require 'test-unit'
|
11
8
|
require 'rbconfig'
|
12
9
|
require 'io/nonblock'
|
13
10
|
require 'io/extra'
|
@@ -20,7 +17,7 @@ class TC_IO_Extra < Test::Unit::TestCase
|
|
20
17
|
end
|
21
18
|
|
22
19
|
def test_version
|
23
|
-
assert_equal('1.2.
|
20
|
+
assert_equal('1.2.7', IO::EXTRA_VERSION)
|
24
21
|
end
|
25
22
|
|
26
23
|
def test_direct_constant
|
@@ -38,20 +35,17 @@ class TC_IO_Extra < Test::Unit::TestCase
|
|
38
35
|
end
|
39
36
|
|
40
37
|
def test_directio
|
41
|
-
omit_if(RbConfig::CONFIG['host_os'] =~ /darwin/i, 'unsupported')
|
42
38
|
assert_respond_to(@fh, :directio?)
|
43
39
|
assert_nothing_raised{ @fh.directio? }
|
44
40
|
end
|
45
41
|
|
46
42
|
def test_directio_set
|
47
|
-
omit_if(RbConfig::CONFIG['host_os'] =~ /darwin/i, 'unsupported')
|
48
43
|
assert_respond_to(@fh, :directio=)
|
49
44
|
assert_raises(StandardError){ @fh.directio = 99 }
|
50
45
|
assert_nothing_raised{ @fh.directio = IO::DIRECTIO_ON }
|
51
46
|
end
|
52
47
|
|
53
48
|
def test_constants
|
54
|
-
omit_if(RbConfig::CONFIG['host_os'] =~ /darwin/i, 'unsupported')
|
55
49
|
assert_not_nil(IO::DIRECTIO_ON)
|
56
50
|
assert_not_nil(IO::DIRECTIO_OFF)
|
57
51
|
end
|
@@ -66,6 +60,11 @@ class TC_IO_Extra < Test::Unit::TestCase
|
|
66
60
|
assert_nothing_raised{ IO.fdwalk(0){ } }
|
67
61
|
end
|
68
62
|
|
63
|
+
def test_fdwalk_honors_lowfd
|
64
|
+
omit_if(RbConfig::CONFIG['host_os'] =~ /darwin/i, 'unsupported')
|
65
|
+
IO.fdwalk(1){ |f| assert_true(f.fileno >= 1) }
|
66
|
+
end
|
67
|
+
|
69
68
|
def test_closefrom
|
70
69
|
assert_respond_to(IO, :closefrom)
|
71
70
|
assert_nothing_raised{ IO.closefrom(3) }
|
@@ -113,6 +112,7 @@ class TC_IO_Extra < Test::Unit::TestCase
|
|
113
112
|
assert_equal(10, IO.writev(@fh.fileno, %w(hello world)))
|
114
113
|
end
|
115
114
|
|
115
|
+
=begin
|
116
116
|
def test_writev_retry
|
117
117
|
empty = ""
|
118
118
|
if empty.respond_to?(:force_encoding)
|
@@ -146,6 +146,7 @@ class TC_IO_Extra < Test::Unit::TestCase
|
|
146
146
|
end
|
147
147
|
end
|
148
148
|
end
|
149
|
+
=end
|
149
150
|
|
150
151
|
def test_ttyname
|
151
152
|
assert_respond_to(@fh, :ttyname)
|
metadata
CHANGED
@@ -1,50 +1,42 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: io-extra
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 2
|
9
|
-
- 6
|
10
|
-
version: 1.2.6
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.7
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Daniel J. Berger
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2013-08-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: test-unit
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 9
|
29
|
-
segments:
|
30
|
-
- 2
|
31
|
-
- 1
|
32
|
-
- 1
|
33
|
-
version: 2.1.1
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.5.0
|
34
20
|
type: :development
|
35
|
-
|
36
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.5.0
|
27
|
+
description: ! " Adds the IO.closefrom, IO.fdwalk, IO.pread, IO.pread_ptr, IO.pwrite,
|
28
|
+
and\n IO.writev singleton methods as well as the IO#directio, IO#directio? and\n
|
29
|
+
\ IO#ttyname instance methods (for those platforms that support them).\n"
|
37
30
|
email: djberg96@gmail.com
|
38
31
|
executables: []
|
39
|
-
|
40
|
-
extensions:
|
32
|
+
extensions:
|
41
33
|
- ext/extconf.rb
|
42
|
-
extra_rdoc_files:
|
34
|
+
extra_rdoc_files:
|
43
35
|
- CHANGES
|
44
36
|
- README
|
45
37
|
- MANIFEST
|
46
38
|
- ext/io/extra.c
|
47
|
-
files:
|
39
|
+
files:
|
48
40
|
- CHANGES
|
49
41
|
- doc/io_extra.txt
|
50
42
|
- examples/example_io_extra.rb
|
@@ -58,39 +50,28 @@ files:
|
|
58
50
|
- test/test_io_extra.rb
|
59
51
|
- .gemtest
|
60
52
|
homepage: http://www.rubyforge.org/projects/shards
|
61
|
-
licenses:
|
53
|
+
licenses:
|
62
54
|
- Artistic 2.0
|
55
|
+
metadata: {}
|
63
56
|
post_install_message:
|
64
57
|
rdoc_options: []
|
65
|
-
|
66
|
-
require_paths:
|
58
|
+
require_paths:
|
67
59
|
- lib
|
68
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
hash: 59
|
74
|
-
segments:
|
75
|
-
- 1
|
76
|
-
- 8
|
77
|
-
- 6
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
78
64
|
version: 1.8.6
|
79
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
hash: 3
|
85
|
-
segments:
|
86
|
-
- 0
|
87
|
-
version: "0"
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
88
70
|
requirements: []
|
89
|
-
|
90
71
|
rubyforge_project: shards
|
91
|
-
rubygems_version:
|
72
|
+
rubygems_version: 2.0.3
|
92
73
|
signing_key:
|
93
|
-
specification_version:
|
74
|
+
specification_version: 4
|
94
75
|
summary: Adds extra methods to the IO class.
|
95
|
-
test_files:
|
76
|
+
test_files:
|
96
77
|
- test/test_io_extra.rb
|