io-wait 0.2.1 → 0.3.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: e443d24e34f86142b3d27ca1a774e3828b63f445b00f94bd79273bb5583e4699
4
- data.tar.gz: 5766517962c90389a10199460414a7088b8316edaa7f0854c98ebbdfd65ec4ba
3
+ metadata.gz: 630936f8af6e2cf9265ebff0794cab1daf10048933460b71306486aecb92a85a
4
+ data.tar.gz: 153bc0301fdb8fce6f4983d45879364509bb6534a81775d98e5f61b5ffe1923e
5
5
  SHA512:
6
- metadata.gz: 526b1f255ac3a9999f9965a5ee35b4c43d32d0493bfaf2cb32e2ad8e4978f57c579574649986f6dfd77a5a2a058f7c5b2f8eaf2b83d8f31a9deac5fc24ffd55f
7
- data.tar.gz: 0424cf27d9a11aeb5dc142963073b9624e9102465cd5358d5f92b9e1cb258b2b60f224d0ef43c1d49d6156d04c0f6a8e26dcb6d339adcfab1400d7c53bd5b1b7
6
+ metadata.gz: 07e0a9997d9e8dd84368feb0fdcd681282d7c583aea8d03d90abf031d6474224aa7a6f61050de11a03750cc0e20ba5759ac4eca28aae07891a778ef82cef24c6
7
+ data.tar.gz: 7294e823b4536cded39faead19916b437e4a8a4d398e35917c81e84d4618d5f99bd414aa9f6989cfad4bfb8bf0721fb7934b083a72576a7e95a60d7fcf35e853
data/Gemfile CHANGED
@@ -2,3 +2,10 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in io-wait.gemspec
4
4
  gemspec
5
+
6
+ group :development do
7
+ gem "rake"
8
+ gem "rake-compiler"
9
+ gem "test-unit"
10
+ gem 'ruby-maven', :platforms => :jruby
11
+ end
@@ -1,20 +1,24 @@
1
1
  # frozen_string_literal: false
2
2
  require 'mkmf'
3
- target = "io/wait"
4
3
 
5
- have_func("rb_io_wait")
6
- unless macro_defined?("DOSISH", "#include <ruby.h>")
7
- have_header(ioctl_h = "sys/ioctl.h") or ioctl_h = nil
8
- fionread = %w[sys/ioctl.h sys/filio.h sys/socket.h].find do |h|
9
- have_macro("FIONREAD", [h, ioctl_h].compact)
10
- end
11
- if fionread
12
- $defs << "-DFIONREAD_HEADER=\"<#{fionread}>\""
13
- create_makefile(target)
14
- end
4
+ if RUBY_VERSION < "2.6"
5
+ File.write("Makefile", dummy_makefile($srcdir).join(""))
15
6
  else
16
- if have_func("rb_w32_ioctlsocket", "ruby.h")
17
- have_func("rb_w32_is_socket", "ruby.h")
18
- create_makefile(target)
7
+ target = "io/wait"
8
+ have_func("rb_io_wait")
9
+ unless macro_defined?("DOSISH", "#include <ruby.h>")
10
+ have_header(ioctl_h = "sys/ioctl.h") or ioctl_h = nil
11
+ fionread = %w[sys/ioctl.h sys/filio.h sys/socket.h].find do |h|
12
+ have_macro("FIONREAD", [h, ioctl_h].compact)
13
+ end
14
+ if fionread
15
+ $defs << "-DFIONREAD_HEADER=\"<#{fionread}>\""
16
+ create_makefile(target)
17
+ end
18
+ else
19
+ if have_func("rb_w32_ioctlsocket", "ruby.h")
20
+ have_func("rb_w32_is_socket", "ruby.h")
21
+ create_makefile(target)
22
+ end
19
23
  end
20
24
  end
data/ext/io/wait/wait.c CHANGED
@@ -41,22 +41,17 @@
41
41
  #endif
42
42
 
43
43
  #ifndef HAVE_RB_IO_WAIT
44
- static VALUE io_ready_p _((VALUE io));
45
- static VALUE io_wait_readable _((int argc, VALUE *argv, VALUE io));
46
- static VALUE io_wait_writable _((int argc, VALUE *argv, VALUE io));
47
- void Init_wait _((void));
48
-
49
44
  static struct timeval *
50
45
  get_timeout(int argc, VALUE *argv, struct timeval *timerec)
51
46
  {
52
47
  VALUE timeout = Qnil;
53
48
  rb_check_arity(argc, 0, 1);
54
49
  if (!argc || NIL_P(timeout = argv[0])) {
55
- return NULL;
50
+ return NULL;
56
51
  }
57
52
  else {
58
- *timerec = rb_time_interval(timeout);
59
- return timerec;
53
+ *timerec = rb_time_interval(timeout);
54
+ return timerec;
60
55
  }
61
56
  }
62
57
 
@@ -65,7 +60,7 @@ wait_for_single_fd(rb_io_t *fptr, int events, struct timeval *tv)
65
60
  {
66
61
  int i = rb_wait_for_single_fd(fptr->fd, events, tv);
67
62
  if (i < 0)
68
- rb_sys_fail(0);
63
+ rb_sys_fail(0);
69
64
  rb_io_check_closed(fptr);
70
65
  return (i & events);
71
66
  }
@@ -77,6 +72,8 @@ wait_for_single_fd(rb_io_t *fptr, int events, struct timeval *tv)
77
72
  *
78
73
  * Returns number of bytes that can be read without blocking.
79
74
  * Returns zero if no information available.
75
+ *
76
+ * You must require 'io/wait' to use this method.
80
77
  */
81
78
 
82
79
  static VALUE
@@ -98,30 +95,36 @@ io_nread(VALUE io)
98
95
 
99
96
  #ifdef HAVE_RB_IO_WAIT
100
97
  static VALUE
101
- io_wait_event(VALUE io, int event, VALUE timeout)
98
+ io_wait_event(VALUE io, int event, VALUE timeout, int return_io)
102
99
  {
103
100
  VALUE result = rb_io_wait(io, RB_INT2NUM(event), timeout);
104
101
 
105
102
  if (!RB_TEST(result)) {
106
- return Qnil;
103
+ return Qnil;
107
104
  }
108
105
 
109
106
  int mask = RB_NUM2INT(result);
110
107
 
111
108
  if (mask & event) {
112
- return io;
109
+ if (return_io)
110
+ return io;
111
+ else
112
+ return result;
113
113
  }
114
114
  else {
115
- return Qfalse;
115
+ return Qfalse;
116
116
  }
117
117
  }
118
118
  #endif
119
119
 
120
120
  /*
121
121
  * call-seq:
122
- * io.ready? -> true or false
122
+ * io.ready? -> truthy or falsy
123
+ *
124
+ * Returns a truthy value if input available without blocking, or a
125
+ * falsy value.
123
126
  *
124
- * Returns +true+ if input available without blocking, or +false+.
127
+ * You must require 'io/wait' to use this method.
125
128
  */
126
129
 
127
130
  static VALUE
@@ -137,23 +140,25 @@ io_ready_p(VALUE io)
137
140
  if (rb_io_read_pending(fptr)) return Qtrue;
138
141
 
139
142
  #ifndef HAVE_RB_IO_WAIT
140
- if (wait_for_single_fd(fptr, RB_WAITFD_IN, &tv))
141
- return Qtrue;
143
+ return wait_for_single_fd(fptr, RB_WAITFD_IN, &tv) ? Qtrue : Qfalse;
142
144
  #else
143
- if (RTEST(io_wait_event(io, RUBY_IO_READABLE, RB_INT2NUM(0))))
144
- return Qtrue;
145
+ return io_wait_event(io, RUBY_IO_READABLE, RB_INT2NUM(0), 1);
145
146
  #endif
146
- return Qfalse;
147
147
  }
148
148
 
149
+ /* Ruby 3.2+ can define these methods. This macro indicates that case. */
150
+ #ifndef RUBY_IO_WAIT_METHODS
151
+
149
152
  /*
150
153
  * call-seq:
151
- * io.wait_readable -> true or false
152
- * io.wait_readable(timeout) -> true or false
154
+ * io.wait_readable -> truthy or falsy
155
+ * io.wait_readable(timeout) -> truthy or falsy
156
+ *
157
+ * Waits until IO is readable and returns a truthy value, or a falsy
158
+ * value when times out. Returns a truthy value immediately when
159
+ * buffered data is available.
153
160
  *
154
- * Waits until IO is readable and returns +true+, or
155
- * +false+ when times out.
156
- * Returns +true+ immediately when buffered data is available.
161
+ * You must require 'io/wait' to use this method.
157
162
  */
158
163
 
159
164
  static VALUE
@@ -175,24 +180,26 @@ io_wait_readable(int argc, VALUE *argv, VALUE io)
175
180
 
176
181
  #ifndef HAVE_RB_IO_WAIT
177
182
  if (wait_for_single_fd(fptr, RB_WAITFD_IN, tv)) {
178
- return io;
183
+ return io;
179
184
  }
180
185
  return Qnil;
181
186
  #else
182
187
  rb_check_arity(argc, 0, 1);
183
188
  VALUE timeout = (argc == 1 ? argv[0] : Qnil);
184
189
 
185
- return io_wait_event(io, RUBY_IO_READABLE, timeout);
190
+ return io_wait_event(io, RUBY_IO_READABLE, timeout, 1);
186
191
  #endif
187
192
  }
188
193
 
189
194
  /*
190
195
  * call-seq:
191
- * io.wait_writable -> true or false
192
- * io.wait_writable(timeout) -> true or false
196
+ * io.wait_writable -> truthy or falsy
197
+ * io.wait_writable(timeout) -> truthy or falsy
193
198
  *
194
- * Waits until IO is writable and returns +true+ or
195
- * +false+ when times out.
199
+ * Waits until IO is writable and returns a truthy value or a falsy
200
+ * value when times out.
201
+ *
202
+ * You must require 'io/wait' to use this method.
196
203
  */
197
204
  static VALUE
198
205
  io_wait_writable(int argc, VALUE *argv, VALUE io)
@@ -209,25 +216,28 @@ io_wait_writable(int argc, VALUE *argv, VALUE io)
209
216
  #ifndef HAVE_RB_IO_WAIT
210
217
  tv = get_timeout(argc, argv, &timerec);
211
218
  if (wait_for_single_fd(fptr, RB_WAITFD_OUT, tv)) {
212
- return io;
219
+ return io;
213
220
  }
214
221
  return Qnil;
215
222
  #else
216
223
  rb_check_arity(argc, 0, 1);
217
224
  VALUE timeout = (argc == 1 ? argv[0] : Qnil);
218
225
 
219
- return io_wait_event(io, RUBY_IO_WRITABLE, timeout);
226
+ return io_wait_event(io, RUBY_IO_WRITABLE, timeout, 1);
220
227
  #endif
221
228
  }
222
229
 
223
230
  #ifdef HAVE_RB_IO_WAIT
224
231
  /*
225
232
  * call-seq:
226
- * io.wait_priority -> true or false
227
- * io.wait_priority(timeout) -> true or false
233
+ * io.wait_priority -> truthy or falsy
234
+ * io.wait_priority(timeout) -> truthy or falsy
235
+ *
236
+ * Waits until IO is priority and returns a truthy value or a falsy
237
+ * value when times out. Priority data is sent and received using
238
+ * the Socket::MSG_OOB flag and is typically limited to streams.
228
239
  *
229
- * Waits until IO is priority and returns +true+ or
230
- * +false+ when times out.
240
+ * You must require 'io/wait' to use this method.
231
241
  */
232
242
  static VALUE
233
243
  io_wait_priority(int argc, VALUE *argv, VALUE io)
@@ -242,7 +252,7 @@ io_wait_priority(int argc, VALUE *argv, VALUE io)
242
252
  rb_check_arity(argc, 0, 1);
243
253
  VALUE timeout = argc == 1 ? argv[0] : Qnil;
244
254
 
245
- return io_wait_event(io, RUBY_IO_PRIORITY, timeout);
255
+ return io_wait_event(io, RUBY_IO_PRIORITY, timeout, 1);
246
256
  }
247
257
  #endif
248
258
 
@@ -250,51 +260,65 @@ static int
250
260
  wait_mode_sym(VALUE mode)
251
261
  {
252
262
  if (mode == ID2SYM(rb_intern("r"))) {
253
- return RB_WAITFD_IN;
263
+ return RB_WAITFD_IN;
254
264
  }
255
265
  if (mode == ID2SYM(rb_intern("read"))) {
256
- return RB_WAITFD_IN;
266
+ return RB_WAITFD_IN;
257
267
  }
258
268
  if (mode == ID2SYM(rb_intern("readable"))) {
259
- return RB_WAITFD_IN;
269
+ return RB_WAITFD_IN;
260
270
  }
261
271
  if (mode == ID2SYM(rb_intern("w"))) {
262
- return RB_WAITFD_OUT;
272
+ return RB_WAITFD_OUT;
263
273
  }
264
274
  if (mode == ID2SYM(rb_intern("write"))) {
265
- return RB_WAITFD_OUT;
275
+ return RB_WAITFD_OUT;
266
276
  }
267
277
  if (mode == ID2SYM(rb_intern("writable"))) {
268
- return RB_WAITFD_OUT;
278
+ return RB_WAITFD_OUT;
269
279
  }
270
280
  if (mode == ID2SYM(rb_intern("rw"))) {
271
- return RB_WAITFD_IN|RB_WAITFD_OUT;
281
+ return RB_WAITFD_IN|RB_WAITFD_OUT;
272
282
  }
273
283
  if (mode == ID2SYM(rb_intern("read_write"))) {
274
- return RB_WAITFD_IN|RB_WAITFD_OUT;
284
+ return RB_WAITFD_IN|RB_WAITFD_OUT;
275
285
  }
276
286
  if (mode == ID2SYM(rb_intern("readable_writable"))) {
277
- return RB_WAITFD_IN|RB_WAITFD_OUT;
287
+ return RB_WAITFD_IN|RB_WAITFD_OUT;
278
288
  }
279
289
  rb_raise(rb_eArgError, "unsupported mode: %"PRIsVALUE, mode);
280
290
  return 0;
281
291
  }
282
292
 
293
+ #ifdef HAVE_RB_IO_WAIT
294
+ static inline rb_io_event_t
295
+ io_event_from_value(VALUE value)
296
+ {
297
+ int events = RB_NUM2INT(value);
298
+
299
+ if (events <= 0) rb_raise(rb_eArgError, "Events must be positive integer!");
300
+
301
+ return events;
302
+ }
303
+ #endif
304
+
283
305
  /*
284
306
  * call-seq:
285
- * io.wait(events, timeout) -> event mask or false.
286
- * io.wait(timeout = nil, mode = :read) -> event mask or false.
307
+ * io.wait(events, timeout) -> event mask, false or nil
308
+ * io.wait(timeout = nil, mode = :read) -> self, true, or false
287
309
  *
288
310
  * Waits until the IO becomes ready for the specified events and returns the
289
- * subset of events that become ready, or +false+ when times out.
311
+ * subset of events that become ready, or a falsy value when times out.
290
312
  *
291
313
  * The events can be a bit mask of +IO::READABLE+, +IO::WRITABLE+ or
292
314
  * +IO::PRIORITY+.
293
315
  *
294
- * Returns +true+ immediately when buffered data is available.
316
+ * Returns a truthy value immediately when buffered data is available.
295
317
  *
296
318
  * Optional parameter +mode+ is one of +:read+, +:write+, or
297
319
  * +:read_write+.
320
+ *
321
+ * You must require 'io/wait' to use this method.
298
322
  */
299
323
 
300
324
  static VALUE
@@ -309,61 +333,77 @@ io_wait(int argc, VALUE *argv, VALUE io)
309
333
 
310
334
  GetOpenFile(io, fptr);
311
335
  for (i = 0; i < argc; ++i) {
312
- if (SYMBOL_P(argv[i])) {
313
- event |= wait_mode_sym(argv[i]);
314
- }
315
- else {
316
- *(tv = &timerec) = rb_time_interval(argv[i]);
317
- }
336
+ if (SYMBOL_P(argv[i])) {
337
+ event |= wait_mode_sym(argv[i]);
338
+ }
339
+ else {
340
+ *(tv = &timerec) = rb_time_interval(argv[i]);
341
+ }
318
342
  }
319
343
  /* rb_time_interval() and might_mode() might convert the argument */
320
344
  rb_io_check_closed(fptr);
321
345
  if (!event) event = RB_WAITFD_IN;
322
346
  if ((event & RB_WAITFD_IN) && rb_io_read_pending(fptr))
323
- return Qtrue;
347
+ return Qtrue;
324
348
  if (wait_for_single_fd(fptr, event, tv))
325
- return io;
349
+ return io;
326
350
  return Qnil;
327
351
  #else
328
352
  VALUE timeout = Qundef;
329
353
  rb_io_event_t events = 0;
354
+ int i, return_io = 0;
330
355
 
356
+ /* The documented signature for this method is actually incorrect.
357
+ * A single timeout is allowed in any position, and multiple symbols can be given.
358
+ * Whether this is intentional or not, I don't know, and as such I consider this to
359
+ * be a legacy/slow path. */
331
360
  if (argc != 2 || (RB_SYMBOL_P(argv[0]) || RB_SYMBOL_P(argv[1]))) {
332
- for (int i = 0; i < argc; i += 1) {
333
- if (RB_SYMBOL_P(argv[i])) {
334
- events |= wait_mode_sym(argv[i]);
335
- }
336
- else if (timeout == Qundef) {
337
- rb_time_interval(timeout = argv[i]);
338
- }
339
- else {
340
- rb_raise(rb_eArgError, "timeout given more than once");
341
- }
342
- }
343
- if (timeout == Qundef) timeout = Qnil;
361
+ /* We'd prefer to return the actual mask, but this form would return the io itself: */
362
+ return_io = 1;
363
+
364
+ /* Slow/messy path: */
365
+ for (i = 0; i < argc; i += 1) {
366
+ if (RB_SYMBOL_P(argv[i])) {
367
+ events |= wait_mode_sym(argv[i]);
368
+ }
369
+ else if (timeout == Qundef) {
370
+ rb_time_interval(timeout = argv[i]);
371
+ }
372
+ else {
373
+ rb_raise(rb_eArgError, "timeout given more than once");
374
+ }
375
+ }
376
+
377
+ if (timeout == Qundef) timeout = Qnil;
378
+
379
+ if (events == 0) {
380
+ events = RUBY_IO_READABLE;
381
+ }
344
382
  }
345
- else /* argc == 2 */ {
346
- events = RB_NUM2UINT(argv[0]);
347
- timeout = argv[1];
348
- }
349
-
350
- if (events == 0) {
351
- events = RUBY_IO_READABLE;
383
+ else /* argc == 2 and neither are symbols */ {
384
+ /* This is the fast path: */
385
+ events = io_event_from_value(argv[0]);
386
+ timeout = argv[1];
352
387
  }
353
388
 
354
389
  if (events & RUBY_IO_READABLE) {
355
- rb_io_t *fptr = NULL;
356
- RB_IO_POINTER(io, fptr);
357
-
358
- if (rb_io_read_pending(fptr)) {
359
- return Qtrue;
360
- }
390
+ rb_io_t *fptr = NULL;
391
+ RB_IO_POINTER(io, fptr);
392
+
393
+ if (rb_io_read_pending(fptr)) {
394
+ /* This was the original behaviour: */
395
+ if (return_io) return Qtrue;
396
+ /* New behaviour always returns an event mask: */
397
+ else return RB_INT2NUM(RUBY_IO_READABLE);
398
+ }
361
399
  }
362
400
 
363
- return io_wait_event(io, events, timeout);
401
+ return io_wait_event(io, events, timeout, return_io);
364
402
  #endif
365
403
  }
366
404
 
405
+ #endif /* RUBY_IO_WAIT_METHODS */
406
+
367
407
  /*
368
408
  * IO wait methods
369
409
  */
@@ -378,6 +418,7 @@ Init_wait(void)
378
418
  rb_define_method(rb_cIO, "nread", io_nread, 0);
379
419
  rb_define_method(rb_cIO, "ready?", io_ready_p, 0);
380
420
 
421
+ #ifndef RUBY_IO_WAIT_METHODS
381
422
  rb_define_method(rb_cIO, "wait", io_wait, -1);
382
423
 
383
424
  rb_define_method(rb_cIO, "wait_readable", io_wait_readable, -1);
@@ -385,4 +426,5 @@ Init_wait(void)
385
426
  #ifdef HAVE_RB_IO_WAIT
386
427
  rb_define_method(rb_cIO, "wait_priority", io_wait_priority, -1);
387
428
  #endif
429
+ #endif
388
430
  }
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: io-wait
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nobu Nakada
8
+ - Charles Oliver Nutter
8
9
  autorequire:
9
10
  bindir: exe
10
11
  cert_chain: []
11
- date: 2021-11-19 00:00:00.000000000 Z
12
+ date: 2022-12-16 00:00:00.000000000 Z
12
13
  dependencies: []
13
14
  description: Waits until IO is readable or writable without blocking.
14
15
  email:
15
16
  - nobu@ruby-lang.org
17
+ - headius@headius.com
16
18
  executables: []
17
19
  extensions:
18
20
  - ext/io/wait/extconf.rb
@@ -21,15 +23,9 @@ files:
21
23
  - COPYING
22
24
  - Gemfile
23
25
  - README.md
24
- - Rakefile
25
26
  - ext/io/wait/depend
26
27
  - ext/io/wait/extconf.rb
27
28
  - ext/io/wait/wait.c
28
- - io-wait.gemspec
29
- - rakelib/changelogs.rake
30
- - rakelib/epoch.rake
31
- - rakelib/sync_tool.rake
32
- - rakelib/version.rake
33
29
  homepage: https://github.com/ruby/io-wait
34
30
  licenses:
35
31
  - Ruby
@@ -45,14 +41,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
45
41
  requirements:
46
42
  - - ">="
47
43
  - !ruby/object:Gem::Version
48
- version: 2.6.0
44
+ version: '0'
49
45
  required_rubygems_version: !ruby/object:Gem::Requirement
50
46
  requirements:
51
47
  - - ">="
52
48
  - !ruby/object:Gem::Version
53
49
  version: '0'
54
50
  requirements: []
55
- rubygems_version: 3.3.0.dev
51
+ rubygems_version: 3.4.0.dev
56
52
  signing_key:
57
53
  specification_version: 4
58
54
  summary: Waits until IO is readable or writable without blocking.
data/Rakefile DELETED
@@ -1,19 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
3
-
4
- name = "io/wait"
5
-
6
- require 'rake/extensiontask'
7
- extask = Rake::ExtensionTask.new(name) do |x|
8
- x.lib_dir << "/#{RUBY_VERSION}/#{x.platform}"
9
- end
10
- Rake::TestTask.new(:test) do |t|
11
- t.libs << extask.lib_dir
12
- t.libs << "test/lib"
13
- t.ruby_opts << "-rhelper"
14
- t.test_files = FileList["test/**/test_*.rb"]
15
- end
16
-
17
- task :test => :compile
18
-
19
- task :default => :test
data/io-wait.gemspec DELETED
@@ -1,27 +0,0 @@
1
- _VERSION = "0.2.1"
2
-
3
- Gem::Specification.new do |spec|
4
- spec.name = "io-wait"
5
- spec.version = _VERSION
6
- spec.authors = ["Nobu Nakada"]
7
- spec.email = ["nobu@ruby-lang.org"]
8
-
9
- spec.summary = %q{Waits until IO is readable or writable without blocking.}
10
- spec.description = %q{Waits until IO is readable or writable without blocking.}
11
- spec.homepage = "https://github.com/ruby/io-wait"
12
- spec.licenses = ["Ruby", "BSD-2-Clause"]
13
- spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
14
-
15
- spec.metadata["homepage_uri"] = spec.homepage
16
- spec.metadata["source_code_uri"] = spec.homepage
17
-
18
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
19
- `git ls-files -z`.split("\x0").reject do |f|
20
- f.match(%r{\A(?:test|spec|features)/|\A\.(?:git|travis)})
21
- end
22
- end
23
- spec.extensions = %w[ext/io/wait/extconf.rb]
24
- spec.bindir = "exe"
25
- spec.executables = []
26
- spec.require_paths = ["lib"]
27
- end
@@ -1,34 +0,0 @@
1
- task "build" => "changelogs"
2
-
3
- changelog = proc do |output, ver = nil, prev = nil|
4
- ver &&= Gem::Version.new(ver)
5
- range = [[prev], [ver, "HEAD"]].map {|ver, branch| ver ? "v#{ver.to_s}" : branch}.compact.join("..")
6
- IO.popen(%W[git log --format=fuller --topo-order --no-merges #{range}]) do |log|
7
- line = log.gets
8
- FileUtils.mkpath(File.dirname(output))
9
- File.open(output, "wb") do |f|
10
- f.print "-*- coding: utf-8 -*-\n\n", line
11
- log.each_line do |line|
12
- line.sub!(/^(?!:)(?:Author|Commit)?(?:Date)?: /, ' \&')
13
- line.sub!(/ +$/, '')
14
- f.print(line)
15
- end
16
- end
17
- end
18
- end
19
-
20
- tags = IO.popen(%w[git tag -l v[0-9]*]).grep(/v(.*)/) {$1}
21
- tags.sort_by! {|tag| tag.scan(/\d+/).map(&:to_i)}
22
- tags.inject(nil) do |prev, tag|
23
- task("logs/ChangeLog-#{tag}") {|t| changelog[t.name, tag, prev]}
24
- tag
25
- end
26
-
27
- desc "Make ChangeLog"
28
- task "ChangeLog", [:ver, :prev] do |t, ver: nil, prev: tags.last|
29
- changelog[t.name, ver, prev]
30
- end
31
-
32
- changelogs = ["ChangeLog", *tags.map {|tag| "logs/ChangeLog-#{tag}"}]
33
- task "changelogs" => changelogs
34
- CLOBBER.concat(changelogs) << "logs"
data/rakelib/epoch.rake DELETED
@@ -1,5 +0,0 @@
1
- task "build" => "date_epoch"
2
-
3
- task "date_epoch" do
4
- ENV["SOURCE_DATE_EPOCH"] = IO.popen(%W[git -C #{__dir__} log -1 --format=%ct], &:read).chomp
5
- end
@@ -1,6 +0,0 @@
1
- task :sync_tool do
2
- require 'fileutils'
3
- FileUtils.cp "../ruby/tool/lib/core_assertions.rb", "./test/lib"
4
- FileUtils.cp "../ruby/tool/lib/envutil.rb", "./test/lib"
5
- FileUtils.cp "../ruby/tool/lib/find_executable.rb", "./test/lib"
6
- end
data/rakelib/version.rake DELETED
@@ -1,44 +0,0 @@
1
- class << (helper = Bundler::GemHelper.instance)
2
- def update_gemspec
3
- path = gemspec.loaded_from
4
- File.open(path, "r+b") do |f|
5
- d = f.read
6
- if d.sub!(/^(_VERSION\s*=\s*)".*"/) {$1 + gemspec.version.to_s.dump}
7
- f.rewind
8
- f.truncate(0)
9
- f.print(d)
10
- end
11
- end
12
- end
13
-
14
- def commit_bump
15
- sh(%W[git commit -m bump\ up\ to\ #{gemspec.version}
16
- #{gemspec.loaded_from}])
17
- end
18
-
19
- def version=(v)
20
- gemspec.version = v
21
- update_gemspec
22
- commit_bump
23
- end
24
- end
25
-
26
- major, minor, teeny = helper.gemspec.version.segments
27
-
28
- task "bump:teeny" do
29
- helper.version = Gem::Version.new("#{major}.#{minor}.#{teeny+1}")
30
- end
31
-
32
- task "bump:minor" do
33
- helper.version = Gem::Version.new("#{major}.#{minor+1}.0")
34
- end
35
-
36
- task "bump:major" do
37
- helper.version = Gem::Version.new("#{major+1}.0.0")
38
- end
39
-
40
- task "bump" => "bump:teeny"
41
-
42
- task "tag" do
43
- helper.__send__(:tag_version)
44
- end