xchan.rb 0.17.0 → 0.17.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/tests.yml +2 -2
- data/.gitlab-ci.yml +1 -1
- data/README.md +3 -2
- data/lib/xchan/bytes.rb +18 -27
- data/lib/xchan/{stat.rb → counter.rb} +12 -13
- data/lib/xchan/unix_socket.rb +45 -43
- data/lib/xchan/version.rb +1 -1
- data/lib/xchan.rb +5 -5
- data/share/xchan.rb/examples/read_operations/1_blocking_read.rb +3 -2
- data/test/xchan_test.rb +36 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ce716f918994e2481e8fbd333dbdb7e0b258341a09e32d464a54a2331edbd09
|
4
|
+
data.tar.gz: f17d86bf4004ca1ebef87950ff9d20c7aaad29940e8c031ff84d817ade3adeb9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c77e364ea0f6365d4fddae810cd14e999cf584dd301e5a651a5565d78fcce157909f0b96a155f67f8f22bb50f1c7d5c2535653e4871f2e5dab862c1e38f207f3
|
7
|
+
data.tar.gz: a4f2d57cf1843407d7056c4528d7e41372ed84378e33f6ca2777b6b2dde93b80fe5e57d33d2b01337a089d808b11e3e6d92c91b4f57f86aeefc4a3e4782c6afa
|
data/.github/workflows/tests.yml
CHANGED
@@ -12,7 +12,7 @@ jobs:
|
|
12
12
|
fail-fast: false
|
13
13
|
matrix:
|
14
14
|
os: [ubuntu-latest, macos-latest]
|
15
|
-
ruby: [3.1, 3.2]
|
15
|
+
ruby: [3.1, 3.2, 3.3]
|
16
16
|
runs-on: ${{ matrix.os }}
|
17
17
|
steps:
|
18
18
|
- uses: actions/checkout@v2
|
@@ -23,4 +23,4 @@ jobs:
|
|
23
23
|
- run: SERIALIZER=marshal bundle exec rake
|
24
24
|
- run: SERIALIZER=json bundle exec rake
|
25
25
|
- run: SERIALIZER=yaml bundle exec rake
|
26
|
-
- run: SERIALIZER=
|
26
|
+
- run: SERIALIZER=pure bundle exec rake
|
data/.gitlab-ci.yml
CHANGED
data/README.md
CHANGED
@@ -52,13 +52,14 @@ the parent process writes to the channel:
|
|
52
52
|
require "xchan"
|
53
53
|
|
54
54
|
ch = xchan(:marshal)
|
55
|
-
|
55
|
+
fork do
|
56
56
|
print "Received a random number (child process): ", ch.recv, "\n"
|
57
|
-
|
57
|
+
end
|
58
58
|
sleep(1)
|
59
59
|
print "Send a random number (from parent process)", "\n"
|
60
60
|
ch.send(rand(21))
|
61
61
|
ch.close
|
62
|
+
Process.wait
|
62
63
|
|
63
64
|
##
|
64
65
|
# Send a random number (from parent process)
|
data/lib/xchan/bytes.rb
CHANGED
@@ -1,39 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
##
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# the
|
9
|
-
# is read from a channel, the array decreases in
|
10
|
-
# size.
|
4
|
+
# {Chan::Bytes Chan::Bytes} represents a collection
|
5
|
+
# of byte counts for each object stored on a channel.
|
6
|
+
# When an object is written to a channel, the collection
|
7
|
+
# increases in size, and when an object is read from
|
8
|
+
# a channel, the collection decreases in size.
|
11
9
|
class Chan::Bytes
|
12
10
|
require "json"
|
13
|
-
require_relative "
|
14
|
-
|
15
|
-
##
|
16
|
-
# @return [Chan::Stat]
|
17
|
-
attr_reader :stat
|
11
|
+
require_relative "counter"
|
18
12
|
|
19
13
|
##
|
20
14
|
# @param [String] tmpdir
|
21
|
-
#
|
15
|
+
# Directory where temporary files are stored
|
22
16
|
#
|
23
17
|
# @return [Chan::Bytes]
|
24
18
|
def initialize(tmpdir)
|
25
|
-
@
|
26
|
-
@io = Chan.temporary_file("xchan.bytes", tmpdir:)
|
19
|
+
@io = Chan.temporary_file(%w[bytes .json], tmpdir:)
|
27
20
|
@io.sync = true
|
28
|
-
@stat = Chan::Stat.new(tmpdir)
|
29
21
|
write(@io, [])
|
30
22
|
end
|
31
23
|
|
32
24
|
##
|
33
|
-
#
|
25
|
+
# Adds a count to the start of the collection
|
34
26
|
#
|
35
27
|
# @param [Integer] len
|
36
|
-
#
|
28
|
+
# The bytesize of an object
|
37
29
|
#
|
38
30
|
# @return [void]
|
39
31
|
def unshift(len)
|
@@ -41,15 +33,14 @@ class Chan::Bytes
|
|
41
33
|
bytes = read(@io)
|
42
34
|
bytes.unshift(len)
|
43
35
|
write(@io, bytes)
|
44
|
-
@stat.store(bytes_written: len)
|
45
36
|
len
|
46
37
|
end
|
47
38
|
|
48
39
|
##
|
49
|
-
#
|
40
|
+
# Adds a count to the end of the collection
|
50
41
|
#
|
51
42
|
# @param [Integer] len
|
52
|
-
#
|
43
|
+
# The bytesize of an object
|
53
44
|
#
|
54
45
|
# @return [void]
|
55
46
|
def push(len)
|
@@ -57,25 +48,25 @@ class Chan::Bytes
|
|
57
48
|
bytes = read(@io)
|
58
49
|
bytes.push(len)
|
59
50
|
write(@io, bytes)
|
60
|
-
@stat.store(bytes_written: len)
|
61
51
|
len
|
62
52
|
end
|
63
53
|
|
64
54
|
##
|
55
|
+
# Removes a count from the start of the collection
|
56
|
+
#
|
65
57
|
# @return [Integer]
|
66
|
-
# Returns
|
58
|
+
# Returns the removed byte count
|
67
59
|
def shift
|
68
60
|
bytes = read(@io)
|
69
61
|
return 0 if bytes.size.zero?
|
70
62
|
len = bytes.shift
|
71
63
|
write(@io, bytes)
|
72
|
-
@stat.store(bytes_read: len)
|
73
64
|
len
|
74
65
|
end
|
75
66
|
|
76
67
|
##
|
77
68
|
# @return [Integer]
|
78
|
-
# Returns the
|
69
|
+
# Returns the number of objects in the collection
|
79
70
|
def size
|
80
71
|
read(@io).size
|
81
72
|
end
|
@@ -100,10 +91,10 @@ class Chan::Bytes
|
|
100
91
|
end
|
101
92
|
|
102
93
|
def serialize(bytes)
|
103
|
-
|
94
|
+
JSON.dump(bytes)
|
104
95
|
end
|
105
96
|
|
106
97
|
def deserialize(bytes)
|
107
|
-
|
98
|
+
JSON.load(bytes)
|
108
99
|
end
|
109
100
|
end
|
@@ -1,33 +1,32 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
##
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
class Chan::
|
4
|
+
# {Chan::Counter Chan::Counter} provides a counter
|
5
|
+
# for the number of written and received bytes on a
|
6
|
+
# given channel.
|
7
|
+
class Chan::Counter
|
8
8
|
require "json"
|
9
9
|
|
10
10
|
##
|
11
11
|
# @param [String] tmpdir
|
12
|
-
#
|
12
|
+
# Directory where temporary files are stored
|
13
13
|
#
|
14
|
-
# @return [Chan::
|
14
|
+
# @return [Chan::Counter]
|
15
15
|
def initialize(tmpdir)
|
16
|
-
@
|
17
|
-
@io = Chan.temporary_file("xchan.stat", tmpdir:)
|
16
|
+
@io = Chan.temporary_file(%w[counter .json], tmpdir:)
|
18
17
|
write(@io, {"bytes_read" => 0, "bytes_written" => 0})
|
19
18
|
end
|
20
19
|
|
21
20
|
##
|
22
21
|
# @return [Integer]
|
23
|
-
# Returns the number of bytes written to a channel
|
22
|
+
# Returns the number of bytes written to a channel
|
24
23
|
def bytes_written
|
25
24
|
read(@io).fetch("bytes_written")
|
26
25
|
end
|
27
26
|
|
28
27
|
##
|
29
28
|
# @return [Integer]
|
30
|
-
# Returns the number of bytes read from a channel
|
29
|
+
# Returns the number of bytes read from a channel
|
31
30
|
def bytes_read
|
32
31
|
read(@io).fetch("bytes_read")
|
33
32
|
end
|
@@ -36,7 +35,7 @@ class Chan::Stat
|
|
36
35
|
# @param [Hash] new_stat
|
37
36
|
# @return [void]
|
38
37
|
# @private
|
39
|
-
def
|
38
|
+
def increment!(new_stat)
|
40
39
|
stat = read(@io)
|
41
40
|
new_stat.each { stat[_1.to_s] += _2 }
|
42
41
|
write(@io, stat)
|
@@ -54,10 +53,10 @@ class Chan::Stat
|
|
54
53
|
end
|
55
54
|
|
56
55
|
def serialize(bytes)
|
57
|
-
|
56
|
+
JSON.dump(bytes)
|
58
57
|
end
|
59
58
|
|
60
59
|
def deserialize(bytes)
|
61
|
-
|
60
|
+
JSON.load(bytes)
|
62
61
|
end
|
63
62
|
end
|
data/lib/xchan/unix_socket.rb
CHANGED
@@ -17,6 +17,12 @@ class Chan::UNIXSocket
|
|
17
17
|
# Returns a socket used for write operations
|
18
18
|
attr_reader :w
|
19
19
|
|
20
|
+
##
|
21
|
+
# @return [<#dump, #load>]
|
22
|
+
# Returns the serializer used by the channel
|
23
|
+
attr_reader :s
|
24
|
+
alias_method :serializer, :s
|
25
|
+
|
20
26
|
##
|
21
27
|
# @example
|
22
28
|
# ch = Chan::UNIXSocket.new(:marshal)
|
@@ -24,7 +30,7 @@ class Chan::UNIXSocket
|
|
24
30
|
# ch.recv.pop # => 3
|
25
31
|
# ch.close
|
26
32
|
#
|
27
|
-
# @param [Symbol, <#dump, #load>]
|
33
|
+
# @param [Symbol, <#dump, #load>] s
|
28
34
|
# The name of a serializer
|
29
35
|
#
|
30
36
|
# @param [Integer] sock_type
|
@@ -35,32 +41,26 @@ class Chan::UNIXSocket
|
|
35
41
|
#
|
36
42
|
# @return [Chan::UNIXSocket]
|
37
43
|
# Returns an instance of {Chan::UNIXSocket Chan::UNIXSocket}
|
38
|
-
def initialize(
|
39
|
-
@
|
44
|
+
def initialize(s, sock_type: Socket::SOCK_DGRAM, tmpdir: Dir.tmpdir)
|
45
|
+
@s = Chan.shortcuts[s]&.call || s
|
40
46
|
@r, @w = ::UNIXSocket.pair(sock_type)
|
41
47
|
@bytes = Chan::Bytes.new(tmpdir)
|
42
|
-
@
|
43
|
-
|
44
|
-
|
45
|
-
##
|
46
|
-
# @return [<#dump, #load>]
|
47
|
-
# Returns the serializer used by the channel.
|
48
|
-
def serializer
|
49
|
-
@serializer
|
48
|
+
@counter = Chan::Counter.new(tmpdir)
|
49
|
+
@lock = LockFile.new Chan.temporary_file(%w[xchan .lock], tmpdir:)
|
50
50
|
end
|
51
51
|
|
52
52
|
##
|
53
53
|
# @return [Boolean]
|
54
|
-
# Returns true when the channel is closed
|
54
|
+
# Returns true when the channel is closed
|
55
55
|
def closed?
|
56
56
|
@r.closed? and @w.closed?
|
57
57
|
end
|
58
58
|
|
59
59
|
##
|
60
|
-
# Closes the channel
|
60
|
+
# Closes the channel
|
61
61
|
#
|
62
62
|
# @raise [IOError]
|
63
|
-
# When the channel is closed
|
63
|
+
# When the channel is closed
|
64
64
|
#
|
65
65
|
# @return [void]
|
66
66
|
def close
|
@@ -79,13 +79,13 @@ class Chan::UNIXSocket
|
|
79
79
|
# Performs a blocking write
|
80
80
|
#
|
81
81
|
# @param [Object] object
|
82
|
-
# An object
|
82
|
+
# An object
|
83
83
|
#
|
84
84
|
# @raise [IOError]
|
85
|
-
# When the channel is closed
|
85
|
+
# When the channel is closed
|
86
86
|
#
|
87
87
|
# @return [Object]
|
88
|
-
# Returns the number of bytes written to the channel
|
88
|
+
# Returns the number of bytes written to the channel
|
89
89
|
def send(object)
|
90
90
|
send_nonblock(object)
|
91
91
|
rescue Chan::WaitWritable, Chan::WaitLockable
|
@@ -97,24 +97,25 @@ class Chan::UNIXSocket
|
|
97
97
|
# Performs a non-blocking write
|
98
98
|
#
|
99
99
|
# @param [Object] object
|
100
|
-
# An object
|
100
|
+
# An object
|
101
101
|
#
|
102
102
|
# @raise [IOError]
|
103
|
-
# When the channel is closed
|
103
|
+
# When the channel is closed
|
104
104
|
#
|
105
105
|
# @raise [Chan::WaitWritable]
|
106
|
-
# When a write to
|
106
|
+
# When a write to {#w} blocks
|
107
107
|
#
|
108
108
|
# @raise [Chan::WaitLockable]
|
109
|
-
# When a write blocks because of a lock held by another process
|
109
|
+
# When a write blocks because of a lock held by another process
|
110
110
|
#
|
111
111
|
# @return [Integer, nil]
|
112
|
-
# Returns the number of bytes written to the channel
|
112
|
+
# Returns the number of bytes written to the channel
|
113
113
|
def send_nonblock(object)
|
114
114
|
@lock.lock_nonblock
|
115
115
|
raise IOError, "channel closed" if closed?
|
116
116
|
len = @w.write_nonblock(serialize(object))
|
117
117
|
@bytes.push(len)
|
118
|
+
@counter.increment!(bytes_written: len)
|
118
119
|
len.tap { @lock.release }
|
119
120
|
rescue IOError, IO::WaitWritable, Errno::ENOBUFS => ex
|
120
121
|
@lock.release
|
@@ -134,10 +135,10 @@ class Chan::UNIXSocket
|
|
134
135
|
# Performs a blocking read
|
135
136
|
#
|
136
137
|
# @raise [IOError]
|
137
|
-
# When the channel is closed
|
138
|
+
# When the channel is closed
|
138
139
|
#
|
139
140
|
# @return [Object]
|
140
|
-
# Returns an object from the channel
|
141
|
+
# Returns an object from the channel
|
141
142
|
def recv
|
142
143
|
recv_nonblock
|
143
144
|
rescue Chan::WaitReadable
|
@@ -152,21 +153,22 @@ class Chan::UNIXSocket
|
|
152
153
|
# Performs a non-blocking read
|
153
154
|
#
|
154
155
|
# @raise [IOError]
|
155
|
-
# When the channel is closed
|
156
|
+
# When the channel is closed
|
156
157
|
#
|
157
158
|
# @raise [Chan::WaitReadable]
|
158
|
-
# When a read from
|
159
|
+
# When a read from {#r} blocks
|
159
160
|
#
|
160
161
|
# @raise [Chan::WaitLockable]
|
161
|
-
# When a read blocks because of a lock held by another process
|
162
|
+
# When a read blocks because of a lock held by another process
|
162
163
|
#
|
163
164
|
# @return [Object]
|
164
|
-
# Returns an object from the channel
|
165
|
+
# Returns an object from the channel
|
165
166
|
def recv_nonblock
|
166
167
|
@lock.lock_nonblock
|
167
168
|
raise IOError, "closed channel" if closed?
|
168
169
|
len = @bytes.shift
|
169
170
|
obj = deserialize(@r.read_nonblock(len.zero? ? 1 : len))
|
171
|
+
@counter.increment!(bytes_read: len)
|
170
172
|
obj.tap { @lock.release }
|
171
173
|
rescue IOError => ex
|
172
174
|
@lock.release
|
@@ -190,7 +192,7 @@ class Chan::UNIXSocket
|
|
190
192
|
# ch.to_a.last # => 4
|
191
193
|
#
|
192
194
|
# @return [Array<Object>]
|
193
|
-
# Returns the
|
195
|
+
# Returns the contents of the channel
|
194
196
|
def to_a
|
195
197
|
lock do
|
196
198
|
[].tap { _1.push(recv) until empty? }
|
@@ -199,7 +201,7 @@ class Chan::UNIXSocket
|
|
199
201
|
|
200
202
|
##
|
201
203
|
# @return [Boolean]
|
202
|
-
# Returns true when the channel is empty
|
204
|
+
# Returns true when the channel is empty
|
203
205
|
def empty?
|
204
206
|
return true if closed?
|
205
207
|
lock { size.zero? }
|
@@ -210,23 +212,23 @@ class Chan::UNIXSocket
|
|
210
212
|
|
211
213
|
##
|
212
214
|
# @return [Integer]
|
213
|
-
# Returns the total number of bytes written to the channel
|
215
|
+
# Returns the total number of bytes written to the channel
|
214
216
|
def bytes_sent
|
215
|
-
lock { @
|
217
|
+
lock { @counter.bytes_written }
|
216
218
|
end
|
217
219
|
alias_method :bytes_written, :bytes_sent
|
218
220
|
|
219
221
|
##
|
220
222
|
# @return [Integer]
|
221
|
-
# Returns the total number of bytes read from the channel
|
223
|
+
# Returns the total number of bytes read from the channel
|
222
224
|
def bytes_received
|
223
|
-
lock { @
|
225
|
+
lock { @counter.bytes_read }
|
224
226
|
end
|
225
227
|
alias_method :bytes_read, :bytes_received
|
226
228
|
|
227
229
|
##
|
228
230
|
# @return [Integer]
|
229
|
-
# Returns the number of objects waiting to be read
|
231
|
+
# Returns the number of objects waiting to be read
|
230
232
|
def size
|
231
233
|
lock { @bytes.size }
|
232
234
|
end
|
@@ -238,25 +240,25 @@ class Chan::UNIXSocket
|
|
238
240
|
# @group Wait methods
|
239
241
|
|
240
242
|
##
|
241
|
-
# Waits for the channel to become readable
|
243
|
+
# Waits for the channel to become readable
|
242
244
|
#
|
243
245
|
# @param [Float, Integer, nil] s
|
244
|
-
# The number of seconds to wait. Waits indefinitely
|
246
|
+
# The number of seconds to wait. Waits indefinitely with no arguments.
|
245
247
|
#
|
246
248
|
# @return [Chan::UNIXSocket, nil]
|
247
|
-
# Returns self when the channel is readable, otherwise returns nil
|
249
|
+
# Returns self when the channel is readable, otherwise returns nil
|
248
250
|
def wait_readable(s = nil)
|
249
251
|
@r.wait_readable(s) and self
|
250
252
|
end
|
251
253
|
|
252
254
|
##
|
253
|
-
# Waits for the channel to become writable
|
255
|
+
# Waits for the channel to become writable
|
254
256
|
#
|
255
257
|
# @param [Float, Integer, nil] s
|
256
|
-
# The number of seconds to wait. Waits indefinitely
|
258
|
+
# The number of seconds to wait. Waits indefinitely with no arguments.
|
257
259
|
#
|
258
260
|
# @return [Chan::UNIXSocket, nil]
|
259
|
-
# Returns self when the channel is writable, otherwise returns nil
|
261
|
+
# Returns self when the channel is writable, otherwise returns nil
|
260
262
|
def wait_writable(s = nil)
|
261
263
|
@w.wait_writable(s) and self
|
262
264
|
end
|
@@ -274,10 +276,10 @@ class Chan::UNIXSocket
|
|
274
276
|
end
|
275
277
|
|
276
278
|
def serialize(obj)
|
277
|
-
@
|
279
|
+
@s.dump(obj)
|
278
280
|
end
|
279
281
|
|
280
282
|
def deserialize(str)
|
281
|
-
@
|
283
|
+
@s.load(str)
|
282
284
|
end
|
283
285
|
end
|
data/lib/xchan/version.rb
CHANGED
data/lib/xchan.rb
CHANGED
@@ -47,8 +47,8 @@ module Chan
|
|
47
47
|
|
48
48
|
##
|
49
49
|
# @return [Hash<Symbol, Proc>]
|
50
|
-
#
|
51
|
-
def self.
|
50
|
+
# Maps a short name to a serializer
|
51
|
+
def self.shortcuts
|
52
52
|
{
|
53
53
|
pure: lambda { Pure },
|
54
54
|
marshal: lambda { Marshal },
|
@@ -72,11 +72,11 @@ module Kernel
|
|
72
72
|
# ch.recv.pop # => 3
|
73
73
|
# ch.close
|
74
74
|
#
|
75
|
-
# @param
|
75
|
+
# @param s (see Chan::UNIXSocket#initialize)
|
76
76
|
# @param sock_type (see Chan::UNIXSocket#initialize)
|
77
77
|
# @param tmpdir (see Chan::UNIXSocket#initialize)
|
78
78
|
# @return (see Chan::UNIXSocket#initialize)
|
79
|
-
def xchan(
|
80
|
-
Chan::UNIXSocket.new(
|
79
|
+
def xchan(s, **kw_args)
|
80
|
+
Chan::UNIXSocket.new(s, **kw_args)
|
81
81
|
end
|
82
82
|
end
|
@@ -5,13 +5,14 @@ require "xchan"
|
|
5
5
|
|
6
6
|
$stdout.sync = true
|
7
7
|
ch = xchan(:marshal)
|
8
|
-
|
8
|
+
fork do
|
9
9
|
print "Received random number (child process): ", ch.recv, "\n"
|
10
|
-
|
10
|
+
end
|
11
11
|
sleep(1)
|
12
12
|
print "Send a random number (from parent process)", "\n"
|
13
13
|
ch.send(rand(21))
|
14
14
|
ch.close
|
15
|
+
Process.wait
|
15
16
|
|
16
17
|
##
|
17
18
|
# Send a random number (from parent process)
|
data/test/xchan_test.rb
CHANGED
@@ -4,7 +4,7 @@ require_relative "setup"
|
|
4
4
|
|
5
5
|
class Chan::Test < Test::Unit::TestCase
|
6
6
|
def setup
|
7
|
-
@ch = xchan
|
7
|
+
@ch = xchan(serializer)
|
8
8
|
end
|
9
9
|
|
10
10
|
def teardown
|
@@ -17,9 +17,13 @@ class Chan::Test < Test::Unit::TestCase
|
|
17
17
|
@ch
|
18
18
|
end
|
19
19
|
|
20
|
+
def serializer
|
21
|
+
ENV.fetch("SERIALIZER", "pure").to_sym
|
22
|
+
end
|
23
|
+
|
20
24
|
def object
|
21
|
-
case
|
22
|
-
when
|
25
|
+
case serializer
|
26
|
+
when :pure then "xchan"
|
23
27
|
else %w[xchan]
|
24
28
|
end
|
25
29
|
end
|
@@ -190,3 +194,32 @@ class Chan::BytesReadTest < Chan::Test
|
|
190
194
|
assert_equal object_size * 2, ch.bytes_read
|
191
195
|
end
|
192
196
|
end
|
197
|
+
|
198
|
+
##
|
199
|
+
# Chan.temporary_file
|
200
|
+
class Chan::TemporaryFileTest < Chan::Test
|
201
|
+
def test_temporary_file_mode
|
202
|
+
assert_equal 0, file.stat.mode & 0o777
|
203
|
+
ensure
|
204
|
+
file.close
|
205
|
+
end
|
206
|
+
|
207
|
+
def test_temporary_file_path
|
208
|
+
assert_match %r|#{Regexp.escape(Dir.tmpdir)}/foobar[a-zA-Z0-9-]+\.txt|,
|
209
|
+
file.to_path
|
210
|
+
ensure
|
211
|
+
file.close
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_temporary_file_unlinked
|
215
|
+
refute File.exist?(file.to_path)
|
216
|
+
ensure
|
217
|
+
file.close
|
218
|
+
end
|
219
|
+
|
220
|
+
private
|
221
|
+
|
222
|
+
def file
|
223
|
+
@file ||= Chan.temporary_file %w[foobar .txt]
|
224
|
+
end
|
225
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xchan.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.17.
|
4
|
+
version: 0.17.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- '0x1eef'
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-05-
|
11
|
+
date: 2024-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lockf.rb
|
@@ -127,7 +127,7 @@ files:
|
|
127
127
|
- Rakefile.rb
|
128
128
|
- lib/xchan.rb
|
129
129
|
- lib/xchan/bytes.rb
|
130
|
-
- lib/xchan/
|
130
|
+
- lib/xchan/counter.rb
|
131
131
|
- lib/xchan/tempfile.rb
|
132
132
|
- lib/xchan/unix_socket.rb
|
133
133
|
- lib/xchan/version.rb
|