multi_io 0.0.1.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/multi_io.rb +41 -0
  3. data/test/test_multi_io.rb +66 -0
  4. metadata +86 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a1a3510737a5cfd0f5efc1f46e50d7e06c180112fd3f481879a4f74916ebe8da
4
+ data.tar.gz: d0e0b3d66af568729b96ebdddc2af92a2a8c7006a17cebde7476f47208207818
5
+ SHA512:
6
+ metadata.gz: 4456a35ee7540559a976563efe5b1d75c67d43703cff9dcd1615494868bdac33e8e64e8b021688a6e2acf564555cee21a2334183100bd73b89971d7b432595e8
7
+ data.tar.gz: 79c5d24ca0c6ac8f4c5e4c6a048d1aa6b9a70e8b8c68922232e4bc6fa2f46694ec4bf571ee60267277e242a4cad3f88c06082429aceab7fbe2d873fe56feab88
@@ -0,0 +1,41 @@
1
+ # MultiIO aims to be an IO object that is the concatenation of other IO
2
+ # objects.
3
+ #
4
+ # This is useful, for example, when one wants to have an IO object that
5
+ # duplicates its writes to STDOUT, a file and maybe a socket too.
6
+ #
7
+ # NOTE: Not all methods from IO are implemented yet. Feel free to submit
8
+ # a patch if you need something that's missing.
9
+ class MultiIO
10
+ def initialize(*io)
11
+ @io = io
12
+ end
13
+
14
+ def close
15
+ @io.each { |io| io.close }
16
+ nil
17
+ end
18
+
19
+ def flush
20
+ @io.map { |io| io.flush }.first
21
+ end
22
+
23
+ def puts(*args)
24
+ @io.each { |io| io.puts(*args) }
25
+ nil
26
+ end
27
+
28
+ def read(*args)
29
+ @io.map { |io| io.read(*args) }
30
+ end
31
+
32
+ def rewind
33
+ @io.each { |io| io.rewind }
34
+ 0
35
+ end
36
+
37
+ # Returns the sum of the bytes written
38
+ def write(string)
39
+ @io.map { |io| io.write(string) }.inject(:+)
40
+ end
41
+ end
@@ -0,0 +1,66 @@
1
+ require "minitest/autorun"
2
+ require "multi_io"
3
+ require "tempfile"
4
+ require 'pry-byebug'
5
+
6
+ class MultiIOTest < Minitest::Test
7
+ def test_close
8
+ skip("TODO")
9
+ end
10
+
11
+ def test_flush
12
+ skip("TODO")
13
+ end
14
+
15
+ def test_puts
16
+ targets = ios
17
+
18
+ io = MultiIO.new(*targets.keys)
19
+
20
+ assert_nil io.puts("hi")
21
+
22
+ io.close
23
+
24
+ exp = "hi\n"
25
+
26
+ targets.each do |_, actualfn|
27
+ assert_equal exp, actualfn.call
28
+ end
29
+ end
30
+
31
+ def test_read
32
+ skip("TODO")
33
+ end
34
+
35
+ def test_rewind
36
+ skip("TODO")
37
+ end
38
+
39
+ def test_write
40
+ targets = ios
41
+
42
+ io = MultiIO.new(*targets.keys)
43
+
44
+ assert_equal 2*targets.count, io.write("hi")
45
+
46
+ io.close
47
+
48
+ exp = "hi"
49
+
50
+ targets.each do |_, actualfn|
51
+ assert_equal exp, actualfn.call
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def ios
58
+ stringio = StringIO.new
59
+ file = Tempfile.create("multi_io_tmpfile", "test")
60
+
61
+ {
62
+ stringio => ->{ stringio.string },
63
+ file => ->{ File.read(file.path) },
64
+ }
65
+ end
66
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: multi_io
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.pre2
5
+ platform: ruby
6
+ authors:
7
+ - Agis Anastasopoulos
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-05-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.14'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry-byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email: a@xz0.org
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/multi_io.rb
62
+ - test/test_multi_io.rb
63
+ homepage: https://github.com/agis/multi_io
64
+ licenses:
65
+ - MIT
66
+ metadata: {}
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">"
79
+ - !ruby/object:Gem::Version
80
+ version: 1.3.1
81
+ requirements: []
82
+ rubygems_version: 3.1.2
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: An IO object that is the concatenation of other IO objects
86
+ test_files: []