io-extra 1.3.0 → 1.4.0

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