io-extra 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e110a14a9b41e4ae67f06a04338ebba468ae3731b1ed8d940606cfc50f56fa11
4
- data.tar.gz: 90bc28cf009765f3cdefdeb4fa6028b4269a2b58067ceb9272f58fdfd75e5352
3
+ metadata.gz: 413914a045cda689f991f043d5b314d6734777094d0f90359e5c10c1062d7648
4
+ data.tar.gz: beeb120887bf9e7c3af06f0f2a9cc733cce21f21ddf9738ef2830bab0be1931f
5
5
  SHA512:
6
- metadata.gz: 6dbb68585d84b9e0fde2b4e508749500eb86993157aeff7ce830e7b86676ac96027ef6ba18bac8ec1258f16f5b1331a97d5187de90237858828361928c888bc2
7
- data.tar.gz: 66beb1736b6ca2d846aa0eeca812dcf317b90463b260a18f439197090df1de51d4117c9ae233ddcc9c687e84967af30446a270ec8e8ffd229636f9413ae70d6f
6
+ metadata.gz: 2ad2db30be150d3837b182e6063f2db69faf0895fde33b5ba552029c1ba988093efdfd96421a155129543ae43b545eca656b2e9243bc6c0c13fd3a4dec37a842
7
+ data.tar.gz: 3611120e98da21cd73fd3960a6a1df6a05514a5436fbf29de3e9d0f27971ad5c94e2309fcc3399581439dc95735c78bb75303ca772cca8dcd0225631a266a1b3
Binary file
data.tar.gz.sig CHANGED
Binary file
data/CHANGES CHANGED
@@ -1,3 +1,16 @@
1
+ == 1.4.0 - 8-Jul-2020
2
+ * Replaced the C versions of IO.pread and IO.pwrite singleton methods with
3
+ pure Ruby wrappers since core Ruby has implemented instance method versions
4
+ since Ruby 2.5. These now require filehandles (rather than fileno) as an
5
+ argument.
6
+ * Removed the pread_ptr method, I don't think anyone was using it. Might get
7
+ added back if there are complaints.
8
+ * Removed the DIRECT constant since that is now defined by core Ruby.
9
+ * Moved the VERSION constant into the pure Ruby file.
10
+ * Now requires Ruby 2.5 or later.
11
+ * Added a LICENSE file as required by the Apache-2.0 license.
12
+ * The 'io-extra' file is now the preferred way to require this library.
13
+
1
14
  == 1.3.0 - 19-Oct-2018
2
15
  * Now assumes Ruby 2.1 or later. This has no effect on the external API, but
3
16
  it does allow for lots of internal cleanup.
data/MANIFEST CHANGED
@@ -1,6 +1,7 @@
1
+ * CHANGES
2
+ * LICENSE
1
3
  * MANIFEST
2
4
  * README
3
- * CHANGES
4
5
  * Rakefile
5
6
  * io-extra.gemspec
6
7
  * certs/djberg96_pub.pem
data/README CHANGED
@@ -11,7 +11,7 @@
11
11
  gem install io-extra
12
12
 
13
13
  = Synopsis
14
- require 'io/extra' # or 'io-extra'
14
+ require 'io-extra' # Do not use 'io/extra'
15
15
 
16
16
  # Close all file descriptors from 3 up.
17
17
  IO.closefrom(3)
@@ -27,6 +27,10 @@
27
27
  IO.writev(fh.fileno, %w[a b c])
28
28
 
29
29
  = Developer's Notes
30
+ The "require 'io-extra'" is preferred over 'io/extra' because this is a mix
31
+ of pure Ruby and C extension. The former require's the latter, so that way
32
+ you get all the methods and constants that you expect.
33
+
30
34
  You might be wondering what the difference is between my implementation of
31
35
  IO.closefrom and a pure Ruby version that looks something like this:
32
36
 
@@ -73,10 +77,6 @@
73
77
  Please file any bug reports on the project page at
74
78
  https://github.com/djberg96/io-extra
75
79
 
76
- = Future Plans
77
- * Switch from C extension to FFI (maybe).
78
- * Add the IO.pselect method.
79
-
80
80
  = Acknowledgements
81
81
  Eric Wong for some great work on Linux compatibility and other fixes, as
82
82
  well as the code for the IO.writev method.
@@ -85,7 +85,7 @@
85
85
  Apache-2.0
86
86
 
87
87
  = Copyright
88
- (C) 2003-2018 Daniel J. Berger
88
+ (C) 2003-2020 Daniel J. Berger
89
89
  All Rights Reserved
90
90
 
91
91
  = Warranty
@@ -10,8 +10,6 @@ have_header('sys/uio.h')
10
10
  have_func('closefrom')
11
11
  have_func('fdwalk')
12
12
  have_func('directio')
13
- have_func('pread')
14
- have_func('pwrite')
15
13
  have_func('writev')
16
14
  have_func('ttyname')
17
15
 
@@ -284,117 +284,6 @@ static VALUE io_set_directio(VALUE self, VALUE v_advice){
284
284
  }
285
285
  #endif
286
286
 
287
- #ifdef HAVE_PREAD
288
- struct pread_args {
289
- int fd;
290
- void *buf;
291
- size_t nbyte;
292
- off_t offset;
293
- };
294
-
295
- static VALUE nogvl_pread(void *ptr)
296
- {
297
- struct pread_args *args = ptr;
298
- return (VALUE)pread(args->fd, args->buf, args->nbyte, args->offset);
299
- }
300
-
301
- /*
302
- * IO.pread(fd, length, offset)
303
- *
304
- * This is similar to the IO.read method, except that it reads from a given
305
- * position in the file without changing the file pointer. And unlike IO.read,
306
- * the +fd+, +length+ and +offset+ arguments are all mandatory.
307
- */
308
- static VALUE s_io_pread(VALUE klass, VALUE fd, VALUE nbyte, VALUE offset){
309
- struct pread_args args;
310
- VALUE str;
311
- ssize_t nread;
312
-
313
- args.fd = NUM2INT(fd);
314
- args.nbyte = NUM2ULONG(nbyte);
315
- args.offset = NUM2OFFT(offset);
316
- str = rb_str_new(NULL, args.nbyte);
317
- args.buf = RSTRING_PTR(str);
318
-
319
- nread = (ssize_t)rb_thread_call_without_gvl((void*)nogvl_pread, &args, RUBY_UBF_IO, 0);
320
-
321
- if(nread == -1)
322
- rb_sys_fail("pread");
323
-
324
- if((size_t)nread != args.nbyte)
325
- rb_str_set_len(str, nread);
326
-
327
- return str;
328
- }
329
-
330
- /*
331
- * IO.pread_ptr(fd, length, offset)
332
- *
333
- * This is identical to IO.pread, except that it returns the pointer address
334
- * of the string, instead of the actual buffer.
335
- *--
336
- * This was added because, in some cases, the IO.pread buffer might return
337
- * an empty string. In such situations we are unable to get the actual pointer
338
- * address with pure Ruby.
339
- */
340
- static VALUE s_io_pread_ptr(VALUE klass, VALUE v_fd, VALUE v_nbyte, VALUE v_offset){
341
- int fd = NUM2INT(v_fd);
342
- size_t nbyte = NUM2ULONG(v_nbyte);
343
- off_t offset = NUM2OFFT(v_offset);
344
- uintptr_t* vector = malloc(nbyte + 1);
345
-
346
- if(pread(fd, vector, nbyte, offset) == -1){
347
- free(vector);
348
- rb_sys_fail("pread");
349
- }
350
-
351
- return ULL2NUM(vector[0]);
352
- }
353
- #endif
354
-
355
- #ifdef HAVE_PWRITE
356
- struct pwrite_args {
357
- int fd;
358
- const void *buf;
359
- size_t nbyte;
360
- off_t offset;
361
- };
362
-
363
- static VALUE nogvl_pwrite(void *ptr)
364
- {
365
- struct pwrite_args *args = ptr;
366
- return (VALUE)pwrite(args->fd, args->buf, args->nbyte, args->offset);
367
- }
368
-
369
- /*
370
- * IO.pwrite(fd, buf, offset)
371
- *
372
- * This method writes the +buf+, starting at +offset+, to the given +fd+,
373
- * which must be opened with write permissions.
374
- *
375
- * This is similar to a seek & write in standard Ruby but the difference,
376
- * beyond being a singleton method, is that the file pointer is never moved.
377
- *
378
- * Returns the number of bytes written.
379
- */
380
- static VALUE s_io_pwrite(VALUE klass, VALUE fd, VALUE buf, VALUE offset){
381
- ssize_t result;
382
- struct pwrite_args args;
383
-
384
- args.fd = NUM2INT(fd);
385
- args.buf = RSTRING_PTR(buf);
386
- args.nbyte = RSTRING_LEN(buf);
387
- args.offset = NUM2OFFT(offset);
388
-
389
- result = (ssize_t)rb_thread_call_without_gvl((void*)nogvl_pwrite, &args, RUBY_UBF_IO, 0);
390
-
391
- if(result == -1)
392
- rb_sys_fail("pwrite");
393
-
394
- return ULL2NUM(result);
395
- }
396
- #endif
397
-
398
287
  /* this can't be a function since we use alloca() */
399
288
  #define ARY2IOVEC(iov,iovcnt,expect,ary) \
400
289
  do { \
@@ -448,6 +337,10 @@ static VALUE s_io_writev(VALUE klass, VALUE fd, VALUE ary) {
448
337
  ssize_t left;
449
338
  struct writev_args args;
450
339
 
340
+ // Allow a fileno or filehandle
341
+ if(rb_respond_to(fd, rb_intern("fileno")))
342
+ fd = rb_funcall(fd, rb_intern("fileno"), 0, 0);
343
+
451
344
  args.fd = NUM2INT(fd);
452
345
  ARY2IOVEC(args.iov, args.iovcnt, left, ary);
453
346
 
@@ -553,22 +446,8 @@ void Init_extra(){
553
446
  rb_define_const(rb_cIO, "DIRECTIO_ON", UINT2NUM(DIRECTIO_ON));
554
447
  #endif
555
448
 
556
- #ifdef O_DIRECT
557
- /* 040000: direct disk access (in Linux) */
558
- rb_define_const(rb_cIO, "DIRECT", UINT2NUM(O_DIRECT));
559
- #endif
560
-
561
449
  rb_define_const(rb_cIO, "IOV_MAX", LONG2NUM(IOV_MAX));
562
450
 
563
- #ifdef HAVE_PREAD
564
- rb_define_singleton_method(rb_cIO, "pread", s_io_pread, 3);
565
- rb_define_singleton_method(rb_cIO, "pread_ptr", s_io_pread_ptr, 3);
566
- #endif
567
-
568
- #ifdef HAVE_PWRITE
569
- rb_define_singleton_method(rb_cIO, "pwrite", s_io_pwrite, 3);
570
- #endif
571
-
572
451
  #ifdef HAVE_WRITEV
573
452
  rb_define_singleton_method(rb_cIO, "writev", s_io_writev, 2);
574
453
  #endif
@@ -576,7 +455,4 @@ void Init_extra(){
576
455
  #ifdef HAVE_TTYNAME
577
456
  rb_define_method(rb_cIO, "ttyname", io_get_ttyname, 0);
578
457
  #endif
579
-
580
- /* 1.3.0: The version of this library. */
581
- rb_define_const(rb_cIO, "EXTRA_VERSION", rb_str_freeze(rb_str_new2("1.3.0")));
582
458
  }
@@ -1 +1,17 @@
1
1
  require 'io/extra'
2
+
3
+ class IO
4
+ EXTRA_VERSION = '1.4.0'.freeze
5
+
6
+ # Singleton version of the IO#pwrite method.
7
+ #
8
+ def self.pwrite(fd, string, offset)
9
+ fd.pwrite(string, offset)
10
+ end
11
+
12
+ # Singleton version of the IO#pread method.
13
+ #
14
+ def self.pread(fd, maxlen, offset)
15
+ fd.pread(maxlen, offset)
16
+ end
17
+ end
@@ -7,7 +7,7 @@
7
7
  require 'test-unit'
8
8
  require 'rbconfig'
9
9
  require 'io/nonblock'
10
- require 'io/extra'
10
+ require 'io-extra'
11
11
 
12
12
  class TC_IO_Extra < Test::Unit::TestCase
13
13
  def setup
@@ -17,16 +17,10 @@ class TC_IO_Extra < Test::Unit::TestCase
17
17
  end
18
18
 
19
19
  def test_version
20
- assert_equal('1.3.0', IO::EXTRA_VERSION)
20
+ assert_equal('1.4.0', IO::EXTRA_VERSION)
21
21
  assert_true(IO::EXTRA_VERSION.frozen?)
22
22
  end
23
23
 
24
- def test_direct_constant
25
- omit_unless(RbConfig::CONFIG['host_os'] =~ /linux/i, 'Linux-only')
26
- assert_equal(040000, IO::DIRECT)
27
- assert_equal(040000, File::DIRECT)
28
- end
29
-
30
24
  def test_open_direct
31
25
  omit_unless(RbConfig::CONFIG['host_os'] =~ /linux/i, 'Linux-only')
32
26
  assert_nothing_raised do
@@ -75,7 +69,7 @@ class TC_IO_Extra < Test::Unit::TestCase
75
69
  @fh.close rescue nil
76
70
  @fh = File.open(@file)
77
71
  assert_respond_to(IO, :pread)
78
- assert_equal("quick", IO.pread(@fh.fileno, 5, 4))
72
+ assert_equal("quick", IO.pread(@fh, 5, 4))
79
73
  end
80
74
 
81
75
  def test_pread_binary
@@ -86,34 +80,26 @@ class TC_IO_Extra < Test::Unit::TestCase
86
80
  assert_nothing_raised { @fh.syswrite("FOO\0HELLO") }
87
81
  @fh.close rescue nil
88
82
  @fh = File.open(@file)
89
- assert_equal("O\0H", IO.pread(@fh.fileno, 3, size + 2))
90
- end
91
-
92
- def test_pread_ptr
93
- @fh.close rescue nil
94
- @fh = File.open(@file)
95
- assert_respond_to(IO, :pread_ptr)
96
- assert_kind_of(Integer, IO.pread_ptr(@fh.fileno, 5, 4))
83
+ assert_equal("O\0H", IO.pread(@fh, 3, size + 2))
97
84
  end
98
85
 
99
86
  def test_pread_last
100
87
  @fh.close rescue nil
101
88
  @fh = File.open(@file)
102
89
  size = @fh.stat.size
103
- assert_equal("ck\n", IO.pread(@fh.fileno, 5, size - 3))
90
+ assert_equal("ck\n", IO.pread(@fh, 5, size - 3))
104
91
  end
105
92
 
106
93
  def test_pwrite
107
94
  assert_respond_to(IO, :pwrite)
108
- assert_nothing_raised{ IO.pwrite(@fh.fileno, "HAL", 0) }
95
+ assert_nothing_raised{ IO.pwrite(@fh, "HAL", 0) }
109
96
  end
110
97
 
111
98
  def test_writev
112
99
  assert_respond_to(IO, :writev)
113
- assert_equal(10, IO.writev(@fh.fileno, %w(hello world)))
100
+ assert_equal(10, IO.writev(@fh, %w[hello world]))
114
101
  end
115
102
 
116
- =begin
117
103
  def test_writev_retry
118
104
  empty = ""
119
105
  if empty.respond_to?(:force_encoding)
@@ -147,7 +133,6 @@ class TC_IO_Extra < Test::Unit::TestCase
147
133
  end
148
134
  end
149
135
  end
150
- =end
151
136
 
152
137
  def test_ttyname
153
138
  assert_respond_to(@fh, :ttyname)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: io-extra
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
@@ -35,26 +35,26 @@ cert_chain:
35
35
  ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
36
36
  WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
37
37
  -----END CERTIFICATE-----
38
- date: 2018-10-19 00:00:00.000000000 Z
38
+ date:
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: test-unit
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
44
+ - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 2.5.0
46
+ version: '3.0'
47
47
  type: :development
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
51
+ - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 2.5.0
53
+ version: '3.0'
54
54
  description: |2
55
- Adds the IO.closefrom, IO.fdwalk, IO.pread, IO.pread_ptr, IO.pwrite, and
56
- IO.writev singleton methods as well as the IO#directio, IO#directio? and
57
- IO#ttyname instance methods (for those platforms that support them).
55
+ Adds the IO.closefrom, IO.fdwalk, IO.pread, IO.pwrite, and IO.writev
56
+ singleton methods as well as the IO#directio, IO#directio? and IO#ttyname
57
+ instance methods (for those platforms that support them).
58
58
  email: djberg96@gmail.com
59
59
  executables: []
60
60
  extensions:
@@ -84,15 +84,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
84
84
  requirements:
85
85
  - - ">="
86
86
  - !ruby/object:Gem::Version
87
- version: 2.1.0
87
+ version: 2.5.0
88
88
  required_rubygems_version: !ruby/object:Gem::Requirement
89
89
  requirements:
90
90
  - - ">="
91
91
  - !ruby/object:Gem::Version
92
92
  version: '0'
93
93
  requirements: []
94
- rubyforge_project:
95
- rubygems_version: 2.7.6
94
+ rubygems_version: 3.0.6
96
95
  signing_key:
97
96
  specification_version: 4
98
97
  summary: Adds extra methods to the IO class
metadata.gz.sig CHANGED
Binary file