xchan.rb 0.17.2 → 0.18.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 +4 -4
- data/.github/workflows/tests.yml +5 -5
- data/.projectile +2 -1
- data/README.md +17 -22
- data/lib/xchan/bytes.rb +1 -1
- data/lib/xchan/counter.rb +1 -1
- data/lib/xchan/tempfile.rb +23 -17
- data/lib/xchan/unix_socket.rb +17 -17
- data/lib/xchan/version.rb +1 -1
- data/lib/xchan.rb +9 -12
- data/share/xchan.rb/examples/serialization/1_serializers.rb +4 -3
- data/test/readme_test.rb +15 -13
- data/test/setup.rb +1 -0
- data/test/xchan_test.rb +2 -2
- data/xchan.rb.gemspec +2 -2
- metadata +7 -8
- data/.gitlab-ci.yml +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49c3ec314ad19f47d91dd30c854e94ad184fd70a0cb5ed7fd0139b506b295c6e
|
4
|
+
data.tar.gz: 1ba90eb765464330c3c6c35385c6ce6732f0bd95cd21e85be236576b7a0ba7c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d29f66b50713d1277b25ad2900bbcd5a99ac1589a921e0b0a8ccd2028e534204ffc8a382b68f3ba48947aa2be8fda90843adda2fbdf133db3cf9fb230f2a5873
|
7
|
+
data.tar.gz: 218b603663b0cac0af9c6780e942c74decb096045e9a7eef14daf5c6644286bd2ee8e1969445260952425bfad08b4bd2fb588a6a1d1f3be0b45d0913337575b5
|
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.
|
15
|
+
ruby: [3.2, 3.3]
|
16
16
|
runs-on: ${{ matrix.os }}
|
17
17
|
steps:
|
18
18
|
- uses: actions/checkout@v2
|
@@ -20,7 +20,7 @@ jobs:
|
|
20
20
|
with:
|
21
21
|
ruby-version: ${{ matrix.ruby }}
|
22
22
|
- run: bundle install
|
23
|
-
- run: SERIALIZER=marshal
|
24
|
-
- run: SERIALIZER=json
|
25
|
-
- run: SERIALIZER=yaml
|
26
|
-
- run: SERIALIZER=pure
|
23
|
+
- run: SERIALIZER=marshal; for t in *_test.rb; do ruby test/${t}; done
|
24
|
+
- run: SERIALIZER=json; for t in *_test.rb; do ruby test/${t}; done
|
25
|
+
- run: SERIALIZER=yaml; for t in *_test.rb; do ruby test/${t}; done
|
26
|
+
- run: SERIALIZER=pure; for t in *_test.rb; do ruby test/${t}; done
|
data/.projectile
CHANGED
data/README.md
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
xchan.rb is an easy to use library for InterProcess
|
4
4
|
Communication (IPC). The library provides a channel
|
5
|
-
that can
|
6
|
-
|
5
|
+
that can help facilitate communication between Ruby
|
6
|
+
processes who have a parent <=> child relationship.
|
7
7
|
|
8
8
|
## Examples
|
9
9
|
|
@@ -11,30 +11,25 @@ with a parent <-> child relationship.
|
|
11
11
|
|
12
12
|
#### Options
|
13
13
|
|
14
|
-
The first argument
|
15
|
-
that
|
16
|
-
in
|
17
|
-
available as `xchan(:pure)
|
18
|
-
|
19
|
-
|
20
|
-
a Ruby object is serialized (on write) or deserialized
|
21
|
-
(on read). The serializers available to choose from
|
22
|
-
are `xchan(:marshal)`, `xchan(:json)`, and `xchan(:yaml)`.
|
23
|
-
The example uses
|
24
|
-
[`Marshal`](https://www.rubydoc.info/stdlib/core/Marshal):
|
14
|
+
The first argument provided to xchan is the serializer
|
15
|
+
that should be used. A channel that will communicate
|
16
|
+
purely in strings (in other words: without serialization)
|
17
|
+
is available as `xchan(:pure)` - otherwise a wide range of
|
18
|
+
serializers are available by default: `xchan(:marshal)`,
|
19
|
+
`xchan(:json)`, and `xchan(:yaml)`.
|
25
20
|
|
26
21
|
```ruby
|
27
22
|
require "xchan"
|
28
23
|
|
29
24
|
##
|
30
|
-
#
|
25
|
+
# Marshal as the serializer
|
31
26
|
ch = xchan(:marshal)
|
32
27
|
Process.wait fork { ch.send(5) }
|
33
|
-
print "
|
28
|
+
print "#{ch.recv} + 7 = 12", "\n"
|
34
29
|
ch.close
|
35
30
|
|
36
31
|
##
|
37
|
-
#
|
32
|
+
# 5 + 7 = 12
|
38
33
|
```
|
39
34
|
|
40
35
|
### Read operations
|
@@ -184,7 +179,7 @@ print "The maximum size of a single message is: ", sndbuf.int, " bytes.\n"
|
|
184
179
|
## Documentation
|
185
180
|
|
186
181
|
A complete API reference is available at
|
187
|
-
[0x1eef.github.io/x/xchan.rb](https://0x1eef.github.io/x/xchan.rb/)
|
182
|
+
[0x1eef.github.io/x/xchan.rb](https://0x1eef.github.io/x/xchan.rb/)
|
188
183
|
|
189
184
|
## Install
|
190
185
|
|
@@ -194,11 +189,11 @@ xchan.rb can be installed via rubygems.org:
|
|
194
189
|
|
195
190
|
## Sources
|
196
191
|
|
197
|
-
* [
|
198
|
-
* [
|
192
|
+
* [GitHub](https://github.com/0x1eef/xchan.rb#readme)
|
193
|
+
* [GitLab](https://gitlab.com/0x1eef/xchan.rb#about)
|
199
194
|
|
200
|
-
##
|
195
|
+
## License
|
201
196
|
|
202
|
-
[BSD Zero Clause](https://choosealicense.com/licenses/0bsd/)
|
197
|
+
[BSD Zero Clause](https://choosealicense.com/licenses/0bsd/)
|
203
198
|
<br>
|
204
|
-
See [LICENSE](./LICENSE)
|
199
|
+
See [LICENSE](./LICENSE)
|
data/lib/xchan/bytes.rb
CHANGED
data/lib/xchan/counter.rb
CHANGED
data/lib/xchan/tempfile.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "delegate"
|
4
|
+
require "tmpdir"
|
3
5
|
|
4
6
|
##
|
5
7
|
# @private
|
@@ -63,12 +65,12 @@ class Chan::Tempfile < DelegateClass(File)
|
|
63
65
|
#
|
64
66
|
# Related: Tempfile.create.
|
65
67
|
#
|
66
|
-
def initialize(basename="", tmpdir=nil, mode: 0, perm:
|
68
|
+
def initialize(basename = "", tmpdir = nil, mode: 0, perm: 0o600, **kwargs)
|
67
69
|
warn "Tempfile.new doesn't call the given block.", uplevel: 1 if block_given?
|
68
70
|
|
69
71
|
@unlinked = false
|
70
|
-
@mode = mode|File::RDWR|File::CREAT|File::EXCL
|
71
|
-
::Dir::Tmpname.create(basename, tmpdir, **
|
72
|
+
@mode = mode | File::RDWR | File::CREAT | File::EXCL
|
73
|
+
::Dir::Tmpname.create(basename, tmpdir, **kwargs) do |tmpname, n, opts|
|
72
74
|
@tmpfile = File.open(tmpname, @mode, perm, **opts)
|
73
75
|
@perm = perm
|
74
76
|
@opts = opts.freeze
|
@@ -81,7 +83,7 @@ class Chan::Tempfile < DelegateClass(File)
|
|
81
83
|
# Opens or reopens the file with mode "r+".
|
82
84
|
def open
|
83
85
|
_close
|
84
|
-
mode = @mode & ~(File::CREAT|File::EXCL)
|
86
|
+
mode = @mode & ~(File::CREAT | File::EXCL)
|
85
87
|
@tmpfile = File.open(@tmpfile.path, mode, **@opts)
|
86
88
|
__setobj__(@tmpfile)
|
87
89
|
end
|
@@ -97,7 +99,7 @@ class Chan::Tempfile < DelegateClass(File)
|
|
97
99
|
#
|
98
100
|
# If you don't explicitly unlink the temporary file, the removal
|
99
101
|
# will be delayed until the object is finalized.
|
100
|
-
def close(unlink_now=false)
|
102
|
+
def close(unlink_now = false)
|
101
103
|
_close
|
102
104
|
unlink if unlink_now
|
103
105
|
end
|
@@ -153,7 +155,7 @@ class Chan::Tempfile < DelegateClass(File)
|
|
153
155
|
ObjectSpace.undefine_finalizer(self)
|
154
156
|
@unlinked = true
|
155
157
|
end
|
156
|
-
|
158
|
+
alias_method :delete, :unlink
|
157
159
|
|
158
160
|
# Returns the full path name of the temporary file.
|
159
161
|
# This will be nil if #unlink has been called.
|
@@ -170,7 +172,7 @@ class Chan::Tempfile < DelegateClass(File)
|
|
170
172
|
File.size(@tmpfile.path)
|
171
173
|
end
|
172
174
|
end
|
173
|
-
|
175
|
+
alias_method :length, :size
|
174
176
|
|
175
177
|
# :stopdoc:
|
176
178
|
def inspect
|
@@ -190,7 +192,7 @@ class Chan::Tempfile < DelegateClass(File)
|
|
190
192
|
def call(*args)
|
191
193
|
return if @pid != Process.pid
|
192
194
|
|
193
|
-
|
195
|
+
warn "removing #{@tmpfile.path}..." if $DEBUG
|
194
196
|
|
195
197
|
@tmpfile.close
|
196
198
|
begin
|
@@ -198,7 +200,7 @@ class Chan::Tempfile < DelegateClass(File)
|
|
198
200
|
rescue Errno::ENOENT
|
199
201
|
end
|
200
202
|
|
201
|
-
|
203
|
+
warn "done" if $DEBUG
|
202
204
|
end
|
203
205
|
end
|
204
206
|
|
@@ -240,8 +242,8 @@ class Chan::Tempfile < DelegateClass(File)
|
|
240
242
|
# ensure
|
241
243
|
# f.close
|
242
244
|
# end
|
243
|
-
def self.open(*args, **
|
244
|
-
tempfile = new(*args, **
|
245
|
+
def self.open(*args, **kwargs)
|
246
|
+
tempfile = new(*args, **kwargs)
|
245
247
|
|
246
248
|
if block_given?
|
247
249
|
begin
|
@@ -313,10 +315,10 @@ module Chan
|
|
313
315
|
#
|
314
316
|
# Related: Tempfile.new.
|
315
317
|
#
|
316
|
-
def Tempfile.create(basename="", tmpdir=nil, mode: 0, perm:
|
318
|
+
def Tempfile.create(basename = "", tmpdir = nil, mode: 0, perm: 0o600, **kwargs)
|
317
319
|
tmpfile = nil
|
318
|
-
Dir::Tmpname.create(basename, tmpdir, **
|
319
|
-
mode |= File::RDWR|File::CREAT|File::EXCL
|
320
|
+
Dir::Tmpname.create(basename, tmpdir, **kwargs) do |tmpname, n, opts|
|
321
|
+
mode |= File::RDWR | File::CREAT | File::EXCL
|
320
322
|
tmpfile = File.open(tmpname, mode, perm, **opts)
|
321
323
|
end
|
322
324
|
if block_given?
|
@@ -325,7 +327,11 @@ module Chan
|
|
325
327
|
ensure
|
326
328
|
unless tmpfile.closed?
|
327
329
|
if File.identical?(tmpfile, tmpfile.path)
|
328
|
-
unlinked =
|
330
|
+
unlinked = begin
|
331
|
+
File.unlink tmpfile.path
|
332
|
+
rescue
|
333
|
+
nil
|
334
|
+
end
|
329
335
|
end
|
330
336
|
tmpfile.close
|
331
337
|
end
|
data/lib/xchan/unix_socket.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
##
|
4
|
-
# An easy-to-use InterProcess Communication (IPC) library
|
4
|
+
# An easy-to-use InterProcess Communication (IPC) library
|
5
5
|
class Chan::UNIXSocket
|
6
6
|
require "socket"
|
7
7
|
require "lockf"
|
@@ -42,11 +42,11 @@ class Chan::UNIXSocket
|
|
42
42
|
# @return [Chan::UNIXSocket]
|
43
43
|
# Returns an instance of {Chan::UNIXSocket Chan::UNIXSocket}
|
44
44
|
def initialize(s, sock_type: Socket::SOCK_DGRAM, tmpdir: Dir.tmpdir)
|
45
|
-
@s = Chan.
|
45
|
+
@s = Chan.serializers[s]&.call || s
|
46
46
|
@r, @w = ::UNIXSocket.pair(sock_type)
|
47
47
|
@bytes = Chan::Bytes.new(tmpdir)
|
48
48
|
@counter = Chan::Counter.new(tmpdir)
|
49
|
-
@
|
49
|
+
@lockf = Lock::File.new Chan.temporary_file(%w[xchan .lock], tmpdir:)
|
50
50
|
end
|
51
51
|
|
52
52
|
##
|
@@ -64,11 +64,11 @@ class Chan::UNIXSocket
|
|
64
64
|
#
|
65
65
|
# @return [void]
|
66
66
|
def close
|
67
|
-
@
|
67
|
+
@lockf.lock
|
68
68
|
raise IOError, "channel is closed" if closed?
|
69
|
-
[@r, @w, @bytes, @
|
69
|
+
[@r, @w, @bytes, @lockf].each(&:close)
|
70
70
|
rescue IOError => ex
|
71
|
-
@
|
71
|
+
@lockf.release
|
72
72
|
raise(ex)
|
73
73
|
end
|
74
74
|
|
@@ -111,14 +111,14 @@ class Chan::UNIXSocket
|
|
111
111
|
# @return [Integer, nil]
|
112
112
|
# Returns the number of bytes written to the channel
|
113
113
|
def send_nonblock(object)
|
114
|
-
@
|
114
|
+
@lockf.lock_nonblock
|
115
115
|
raise IOError, "channel closed" if closed?
|
116
116
|
len = @w.write_nonblock(serialize(object))
|
117
117
|
@bytes.push(len)
|
118
118
|
@counter.increment!(bytes_written: len)
|
119
|
-
len.tap { @
|
119
|
+
len.tap { @lockf.release }
|
120
120
|
rescue IOError, IO::WaitWritable, Errno::ENOBUFS => ex
|
121
|
-
@
|
121
|
+
@lockf.release
|
122
122
|
raise Chan::WaitWritable, ex.message
|
123
123
|
rescue Errno::EWOULDBLOCK => ex
|
124
124
|
raise Chan::WaitLockable, ex.message
|
@@ -164,18 +164,18 @@ class Chan::UNIXSocket
|
|
164
164
|
# @return [Object]
|
165
165
|
# Returns an object from the channel
|
166
166
|
def recv_nonblock
|
167
|
-
@
|
167
|
+
@lockf.lock_nonblock
|
168
168
|
raise IOError, "closed channel" if closed?
|
169
169
|
len = @bytes.shift
|
170
170
|
obj = deserialize(@r.read_nonblock(len.zero? ? 1 : len))
|
171
171
|
@counter.increment!(bytes_read: len)
|
172
|
-
obj.tap { @
|
172
|
+
obj.tap { @lockf.release }
|
173
173
|
rescue IOError => ex
|
174
|
-
@
|
174
|
+
@lockf.release
|
175
175
|
raise(ex)
|
176
176
|
rescue IO::WaitReadable => ex
|
177
177
|
@bytes.unshift(len)
|
178
|
-
@
|
178
|
+
@lockf.release
|
179
179
|
raise Chan::WaitReadable, ex.message
|
180
180
|
rescue Errno::EAGAIN => ex
|
181
181
|
raise Chan::WaitLockable, ex.message
|
@@ -187,9 +187,9 @@ class Chan::UNIXSocket
|
|
187
187
|
|
188
188
|
##
|
189
189
|
# @example
|
190
|
-
# ch = xchan
|
190
|
+
# ch = xchan(:pure)
|
191
191
|
# 1.upto(4) { ch.send(_1) }
|
192
|
-
# ch.to_a.last # => 4
|
192
|
+
# ch.to_a.last # => "4"
|
193
193
|
#
|
194
194
|
# @return [Array<Object>]
|
195
195
|
# Returns the contents of the channel
|
@@ -269,10 +269,10 @@ class Chan::UNIXSocket
|
|
269
269
|
private
|
270
270
|
|
271
271
|
def lock
|
272
|
-
@
|
272
|
+
@lockf.lock
|
273
273
|
yield
|
274
274
|
ensure
|
275
|
-
@
|
275
|
+
@lockf.release
|
276
276
|
end
|
277
277
|
|
278
278
|
def serialize(obj)
|
data/lib/xchan/version.rb
CHANGED
data/lib/xchan.rb
CHANGED
@@ -10,17 +10,14 @@ module Chan
|
|
10
10
|
WaitLockable = Class.new(Errno::EWOULDBLOCK)
|
11
11
|
|
12
12
|
##
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
# can be useful when you want to communicate
|
17
|
-
# purely in strings.
|
13
|
+
# Coerces an object to a string for a
|
14
|
+
# channel communicating in raw strings
|
15
|
+
# (in other words: without serialization)
|
18
16
|
#
|
19
17
|
# @example
|
20
18
|
# ch = xchan(:pure)
|
21
|
-
#
|
22
|
-
#
|
23
|
-
# }
|
19
|
+
# fork { ch.send "Hello world" }
|
20
|
+
# Process.wait
|
24
21
|
# puts ch.recv
|
25
22
|
Pure = Class.new do
|
26
23
|
def self.dump(str) = str.to_s
|
@@ -47,8 +44,8 @@ module Chan
|
|
47
44
|
|
48
45
|
##
|
49
46
|
# @return [Hash<Symbol, Proc>]
|
50
|
-
#
|
51
|
-
def self.
|
47
|
+
# Returns the default serializers
|
48
|
+
def self.serializers
|
52
49
|
{
|
53
50
|
pure: lambda { Pure },
|
54
51
|
marshal: lambda { Marshal },
|
@@ -76,7 +73,7 @@ module Kernel
|
|
76
73
|
# @param sock_type (see Chan::UNIXSocket#initialize)
|
77
74
|
# @param tmpdir (see Chan::UNIXSocket#initialize)
|
78
75
|
# @return (see Chan::UNIXSocket#initialize)
|
79
|
-
def xchan(s,
|
80
|
-
Chan::UNIXSocket.new(s,
|
76
|
+
def xchan(s, ...)
|
77
|
+
Chan::UNIXSocket.new(s, ...)
|
81
78
|
end
|
82
79
|
end
|
@@ -2,13 +2,14 @@
|
|
2
2
|
|
3
3
|
require_relative "../setup"
|
4
4
|
require "xchan"
|
5
|
+
require "xchan"
|
5
6
|
|
6
7
|
##
|
7
|
-
#
|
8
|
+
# Marshal as the serializer
|
8
9
|
ch = xchan(:marshal)
|
9
10
|
Process.wait fork { ch.send(5) }
|
10
|
-
print "
|
11
|
+
print "#{ch.recv} + 7 = 12", "\n"
|
11
12
|
ch.close
|
12
13
|
|
13
14
|
##
|
14
|
-
#
|
15
|
+
# 5 + 7 = 12
|
data/test/readme_test.rb
CHANGED
@@ -1,42 +1,44 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "setup"
|
4
|
-
require "test
|
4
|
+
require "test-cmd"
|
5
5
|
|
6
6
|
class Chan::ReadmeTest < Test::Unit::TestCase
|
7
7
|
def test_serialization_1_serializers
|
8
|
-
assert_equal "
|
9
|
-
readme_example("serialization/1_serializers.rb").stdout
|
8
|
+
assert_equal "5 + 7 = 12\n",
|
9
|
+
cmd("ruby", readme_example("serialization/1_serializers.rb")).stdout
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_read_operations_1_blocking_read
|
13
13
|
r = 'Send a random number \(from parent process\)\s*' \
|
14
14
|
'Received random number \(child process\): \d+'
|
15
15
|
assert_match Regexp.new(r),
|
16
|
-
readme_example("read_operations/1_blocking_read.rb")
|
17
|
-
|
16
|
+
cmd("ruby", readme_example("read_operations/1_blocking_read.rb"))
|
17
|
+
.stdout
|
18
|
+
.tr("\n", " ")
|
18
19
|
end
|
19
20
|
|
20
21
|
def test_write_operations_2_non_blocking_write
|
21
22
|
assert_equal ["Blocked - free send buffer\n"],
|
22
|
-
readme_example("write_operations/2_nonblocking_write.rb")
|
23
|
-
|
24
|
-
|
23
|
+
cmd("ruby", readme_example("write_operations/2_nonblocking_write.rb"))
|
24
|
+
.stdout
|
25
|
+
.each_line
|
26
|
+
.uniq
|
25
27
|
end
|
26
28
|
|
27
29
|
def test_socket_2_options
|
28
30
|
r = 'The read buffer can contain a maximum of: \d{1,6} bytes.\s*' \
|
29
31
|
'The maximum size of a single message is: \d{1,6} bytes.\s*'
|
30
32
|
assert_match Regexp.new(r),
|
31
|
-
readme_example("socket/2_options.rb")
|
32
|
-
|
33
|
+
cmd("ruby", readme_example("socket/2_options.rb"))
|
34
|
+
.stdout
|
35
|
+
.tr("\n", " ")
|
33
36
|
end
|
34
37
|
|
35
38
|
private
|
36
39
|
|
37
40
|
def readme_example(path)
|
38
|
-
|
39
|
-
|
40
|
-
cmd "bundle exec ruby #{example}"
|
41
|
+
dir = File.join(Dir.getwd, "share", "xchan.rb", "examples")
|
42
|
+
File.join(dir, path)
|
41
43
|
end
|
42
44
|
end
|
data/test/setup.rb
CHANGED
data/test/xchan_test.rb
CHANGED
@@ -84,7 +84,7 @@ class Chan::RecvNonBlockTest < Chan::Test
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def test_recv_nonblock_with_a_lock
|
87
|
-
ch.instance_variable_get(:@
|
87
|
+
ch.instance_variable_get(:@lockf).lock
|
88
88
|
pid = fork do
|
89
89
|
ch.recv_nonblock
|
90
90
|
exit(1)
|
@@ -205,7 +205,7 @@ class Chan::TemporaryFileTest < Chan::Test
|
|
205
205
|
end
|
206
206
|
|
207
207
|
def test_temporary_file_path
|
208
|
-
assert_match %r
|
208
|
+
assert_match %r{#{Regexp.escape(Dir.tmpdir)}/foobar[a-zA-Z0-9-]+\.txt},
|
209
209
|
file.to_path
|
210
210
|
ensure
|
211
211
|
file.close
|
data/xchan.rb.gemspec
CHANGED
@@ -12,11 +12,11 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.require_paths = ["lib"]
|
13
13
|
gem.summary = "An easy to use InterProcess Communication (IPC) library"
|
14
14
|
gem.description = gem.summary
|
15
|
-
gem.add_runtime_dependency "lockf.rb", "~> 1
|
15
|
+
gem.add_runtime_dependency "lockf.rb", "~> 2.1"
|
16
16
|
gem.add_development_dependency "test-unit", "~> 3.5.7"
|
17
17
|
gem.add_development_dependency "yard", "~> 0.9"
|
18
18
|
gem.add_development_dependency "redcarpet", "~> 3.5"
|
19
19
|
gem.add_development_dependency "standard", "~> 1.13"
|
20
|
-
gem.add_development_dependency "test-cmd.rb", "~> 0.
|
20
|
+
gem.add_development_dependency "test-cmd.rb", "~> 0.12.4"
|
21
21
|
gem.add_development_dependency "rake", "~> 13.1"
|
22
22
|
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.
|
4
|
+
version: 0.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- '0x1eef'
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lockf.rb
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1
|
19
|
+
version: '2.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1
|
26
|
+
version: '2.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: test-unit
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 0.12.4
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 0.12.4
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -117,7 +117,6 @@ extra_rdoc_files: []
|
|
117
117
|
files:
|
118
118
|
- ".github/workflows/tests.yml"
|
119
119
|
- ".gitignore"
|
120
|
-
- ".gitlab-ci.yml"
|
121
120
|
- ".projectile"
|
122
121
|
- ".rubocop.yml"
|
123
122
|
- ".yardopts"
|
@@ -162,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
161
|
- !ruby/object:Gem::Version
|
163
162
|
version: '0'
|
164
163
|
requirements: []
|
165
|
-
rubygems_version: 3.5.
|
164
|
+
rubygems_version: 3.5.11
|
166
165
|
signing_key:
|
167
166
|
specification_version: 4
|
168
167
|
summary: An easy to use InterProcess Communication (IPC) library
|
data/.gitlab-ci.yml
DELETED