iostreams 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e4099b7285a53bdc5f6ab88dcef531c6d7575d06
4
- data.tar.gz: 68f52bb99df8b7edc3f24ac0b8fed8d4a6a1dbab
3
+ metadata.gz: f17b7f95e61b93d4e1e69390deaa85511c3765fc
4
+ data.tar.gz: 29b174a1959de6a887040c89af1f63a072807f7b
5
5
  SHA512:
6
- metadata.gz: b6579da43c8d3341dc91c50b929852e7caf6916cd197ca338cdb75920005a2413285c4a006c86b9221ce7070e56836626ddc4dca4f68edfe0a7e04976528bb2a
7
- data.tar.gz: 7293d70e70612990e8038bd6deb188f3e85b663b3748c0385b91254ea78f62ac46c0e3e76130791cb662d1c99d135f73b72384407ce96c2a3109c1e440593484
6
+ metadata.gz: b2edf62d725b21fcb292ffbb025113462083a1f6156097e496c2d67e7a2cf77f10cb482b8094b431a5521577a29bb37bb19466e068acc6f1286f55a5e846acd9
7
+ data.tar.gz: 7bb62d42bb61a520132188d9f8304b1eb1923bf7b7d9b119b675a0c8cb980884b24818011e805d57a82532e6c13ab32f3a4593a03fa7ff82103b59cb5381569c
@@ -1,3 +1,3 @@
1
1
  module IOStreams #:nodoc
2
- VERSION = '0.8.1'
2
+ VERSION = '0.8.2'
3
3
  end
@@ -0,0 +1,55 @@
1
+ begin
2
+ require 'creek'
3
+ rescue LoadError => e
4
+ puts "Install the 'creek' gem for xlsx streaming support"
5
+ raise(e)
6
+ end
7
+ require 'csv'
8
+
9
+ module IOStreams
10
+ module Xlsx
11
+ class Reader
12
+ attr_reader :worksheet
13
+
14
+ def initialize(workbook)
15
+ @worksheet = workbook.sheets[0]
16
+ end
17
+
18
+ def each_line(&block)
19
+ worksheet.rows.each do |row|
20
+ block.call(row.values.to_csv(row_sep: nil))
21
+ end
22
+ end
23
+
24
+ # Read from a xlsx file or stream.
25
+ #
26
+ # Example:
27
+ # IOStreams::Xlsx::Reader.open('spreadsheet.xlsx') do |spreadsheet_stream|
28
+ # spreadsheet_stream.each_line do |line|
29
+ # puts line
30
+ # end
31
+ # end
32
+ def self.open(file_name_or_io, options={}, &block)
33
+ options = options.dup
34
+ buffer_size = options.delete(:buffer_size) || 65536
35
+ raise(ArgumentError, "Unknown IOStreams::Xlsx::Reader option: #{options.inspect}") if options.size > 0
36
+
37
+ if file_name_or_io.respond_to?(:read)
38
+ temp_file = Tempfile.new('rocket_job_xlsx')
39
+ file_name = temp_file.to_path
40
+
41
+ ::File.open(file_name, 'wb') do |file|
42
+ IOStreams.copy(file_name_or_io, file, buffer_size)
43
+ end
44
+ else
45
+ file_name = file_name_or_io
46
+ end
47
+
48
+ block.call(self.new(Creek::Book.new(file_name, check_file_extension: false)))
49
+ ensure
50
+ temp_file.delete if temp_file
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -6,7 +6,7 @@ module IOStreams
6
6
  # to the supplied block
7
7
  #
8
8
  # Example:
9
- # IOStreams::ZipReader.open('abc.zip') do |io_stream|
9
+ # IOStreams::Zip::Reader.open('abc.zip') do |io_stream|
10
10
  # # Read 256 bytes at a time
11
11
  # while data = io_stream.read(256)
12
12
  # puts data
@@ -79,4 +79,4 @@ module IOStreams
79
79
  end
80
80
  end
81
81
  end
82
- end
82
+ end
data/lib/iostreams.rb CHANGED
@@ -16,5 +16,8 @@ module IOStreams
16
16
  autoload :Reader, 'io_streams/delimited/reader'
17
17
  autoload :Writer, 'io_streams/delimited/writer'
18
18
  end
19
+ module Xlsx
20
+ autoload :Reader, 'io_streams/xlsx/reader'
21
+ end
19
22
  end
20
23
  require 'io_streams/io_streams'
@@ -3,8 +3,8 @@ require_relative 'test_helper'
3
3
  # Unit Test for IOStreams::File
4
4
  module Streams
5
5
  class DelimitedReaderTest < Minitest::Test
6
- context IOStreams::File::Reader do
7
- setup do
6
+ describe IOStreams::File::Reader do
7
+ before do
8
8
  @file_name = File.join(File.dirname(__FILE__), 'files', 'text.txt')
9
9
  @data = []
10
10
  File.open(@file_name, 'rt') do |file|
@@ -14,8 +14,8 @@ module Streams
14
14
  end
15
15
  end
16
16
 
17
- context '.open' do
18
- should 'each_line file' do
17
+ describe '.open' do
18
+ it 'each_line file' do
19
19
  lines = []
20
20
  IOStreams::Delimited::Reader.open(@file_name) do |io|
21
21
  io.each_line { |line| lines << line }
@@ -23,7 +23,7 @@ module Streams
23
23
  assert_equal @data, lines
24
24
  end
25
25
 
26
- should 'each_line stream' do
26
+ it 'each_line stream' do
27
27
  lines = []
28
28
  File.open(@file_name) do |file|
29
29
  IOStreams::Delimited::Reader.open(file) do |io|
@@ -34,7 +34,7 @@ module Streams
34
34
  end
35
35
 
36
36
  ["\r\n", "\n\r", "\n", "\r"].each do |delimiter|
37
- should "autodetect delimiter: #{delimiter.inspect}" do
37
+ it "autodetect delimiter: #{delimiter.inspect}" do
38
38
  lines = []
39
39
  stream = StringIO.new(@data.join(delimiter))
40
40
  IOStreams::Delimited::Reader.open(stream, buffer_size: 15) do |io|
@@ -45,7 +45,7 @@ module Streams
45
45
  end
46
46
 
47
47
  ['@', 'BLAH'].each do |delimiter|
48
- should "read delimited #{delimiter.inspect}" do
48
+ it "read delimited #{delimiter.inspect}" do
49
49
  lines = []
50
50
  stream = StringIO.new(@data.join(delimiter))
51
51
  IOStreams::Delimited::Reader.open(stream, buffer_size: 15, delimiter: delimiter) do |io|
@@ -55,7 +55,7 @@ module Streams
55
55
  end
56
56
  end
57
57
 
58
- should "read binary delimited" do
58
+ it "read binary delimited" do
59
59
  delimiter = "\x01"
60
60
  lines = []
61
61
  stream = StringIO.new(@data.join(delimiter))
@@ -3,20 +3,20 @@ require_relative 'test_helper'
3
3
  # Unit Test for IOStreams::File
4
4
  module Streams
5
5
  class FileReaderTest < Minitest::Test
6
- context IOStreams::File::Reader do
7
- setup do
6
+ describe IOStreams::File::Reader do
7
+ before do
8
8
  @file_name = File.join(File.dirname(__FILE__), 'files', 'text.txt')
9
9
  @data = File.read(@file_name)
10
10
  end
11
11
 
12
- context '.open' do
13
- should 'file' do
12
+ describe '.open' do
13
+ it 'file' do
14
14
  result = IOStreams::File::Reader.open(@file_name) do |io|
15
15
  io.read
16
16
  end
17
17
  assert_equal @data, result
18
18
  end
19
- should 'stream' do
19
+ it 'stream' do
20
20
  result = File.open(@file_name) do |file|
21
21
  IOStreams::File::Reader.open(file) do |io|
22
22
  io.read
@@ -28,4 +28,4 @@ module Streams
28
28
 
29
29
  end
30
30
  end
31
- end
31
+ end
@@ -3,14 +3,14 @@ require_relative 'test_helper'
3
3
  # Unit Test for IOStreams::File
4
4
  module Streams
5
5
  class FileWriterTest < Minitest::Test
6
- context IOStreams::File::Writer do
7
- setup do
6
+ describe IOStreams::File::Writer do
7
+ before do
8
8
  @file_name = File.join(File.dirname(__FILE__), 'files', 'text.txt')
9
9
  @data = File.read(@file_name)
10
10
  end
11
11
 
12
- context '.open' do
13
- should 'file' do
12
+ describe '.open' do
13
+ it 'file' do
14
14
  temp_file = Tempfile.new('rocket_job')
15
15
  file_name = temp_file.to_path
16
16
  IOStreams::File::Writer.open(file_name) do |io|
@@ -19,7 +19,7 @@ module Streams
19
19
  result = File.read(file_name)
20
20
  assert_equal @data, result
21
21
  end
22
- should 'stream' do
22
+ it 'stream' do
23
23
  io_string = StringIO.new
24
24
  IOStreams::File::Writer.open(io_string) do |io|
25
25
  io.write(@data)
@@ -30,4 +30,4 @@ module Streams
30
30
 
31
31
  end
32
32
  end
33
- end
33
+ end
Binary file
@@ -3,21 +3,21 @@ require_relative 'test_helper'
3
3
  # Unit Test for IOStreams::Gzip
4
4
  module Streams
5
5
  class GzipReaderTest < Minitest::Test
6
- context IOStreams::Gzip::Reader do
7
- setup do
6
+ describe IOStreams::Gzip::Reader do
7
+ before do
8
8
  @file_name = File.join(File.dirname(__FILE__), 'files', 'text.txt.gz')
9
9
  @gzip_data = File.open(@file_name, 'rb') { |f| f.read }
10
10
  @data = Zlib::GzipReader.open(@file_name) { |gz| gz.read }
11
11
  end
12
12
 
13
- context '.open' do
14
- should 'file' do
13
+ describe '.open' do
14
+ it 'file' do
15
15
  result = IOStreams::Gzip::Reader.open(@file_name) do |io|
16
16
  io.read
17
17
  end
18
18
  assert_equal @data, result
19
19
  end
20
- should 'stream' do
20
+ it 'stream' do
21
21
  result = File.open(@file_name) do |file|
22
22
  IOStreams::Gzip::Reader.open(file) do |io|
23
23
  io.read
@@ -3,14 +3,14 @@ require_relative 'test_helper'
3
3
  # Unit Test for IOStreams::Gzip
4
4
  module Streams
5
5
  class GzipWriterTest < Minitest::Test
6
- context IOStreams::Gzip::Writer do
7
- setup do
6
+ describe IOStreams::Gzip::Writer do
7
+ before do
8
8
  @file_name = File.join(File.dirname(__FILE__), 'files', 'text.txt.gz')
9
9
  @data = Zlib::GzipReader.open(@file_name) { |gz| gz.read }
10
10
  end
11
11
 
12
- context '.open' do
13
- should 'file' do
12
+ describe '.open' do
13
+ it 'file' do
14
14
  temp_file = Tempfile.new('rocket_job')
15
15
  file_name = temp_file.to_path
16
16
  IOStreams::Gzip::Writer.open(file_name) do |io|
@@ -20,7 +20,7 @@ module Streams
20
20
  temp_file.delete
21
21
  assert_equal @data, result
22
22
  end
23
- should 'stream' do
23
+ it 'stream' do
24
24
  io_string = StringIO.new(''.force_encoding('ASCII-8BIT'))
25
25
  IOStreams::Gzip::Writer.open(io_string) do |io|
26
26
  io.write(@data)
data/test/test_helper.rb CHANGED
@@ -3,7 +3,6 @@ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
3
  require 'yaml'
4
4
  require 'minitest/autorun'
5
5
  require 'minitest/reporters'
6
- require 'shoulda/context'
7
6
  require 'iostreams'
8
7
  require 'awesome_print'
9
8
  require 'symmetric-encryption'
@@ -0,0 +1,43 @@
1
+ require_relative 'test_helper'
2
+
3
+ module Streams
4
+ describe IOStreams::Xlsx::Reader do
5
+ XLSX_CONTENTS = [
6
+ "first column,second column,third column",
7
+ "data 1,data 2,more data",
8
+ ]
9
+
10
+ describe '.open' do
11
+ let(:file_name) { File.join(File.dirname(__FILE__), 'files', 'spreadsheet.xlsx') }
12
+
13
+ describe 'with a file path' do
14
+ before do
15
+ @file = File.open(file_name)
16
+ end
17
+
18
+ it 'returns the contents of the file' do
19
+ rows = []
20
+ IOStreams::Xlsx::Reader.open(@file) do |spreadsheet|
21
+ spreadsheet.each_line { |row| rows << row }
22
+ end
23
+ assert_equal(XLSX_CONTENTS, rows)
24
+ end
25
+ end
26
+
27
+ describe 'with a file stream' do
28
+
29
+ it 'returns the contents of the file' do
30
+ rows = []
31
+ File.open(file_name) do |file|
32
+ IOStreams::Xlsx::Reader.open(file) do |spreadsheet|
33
+ spreadsheet.each_line { |row| rows << row }
34
+ end
35
+ end
36
+
37
+ assert_equal(XLSX_CONTENTS, rows)
38
+ end
39
+ end
40
+ end
41
+
42
+ end
43
+ end
@@ -4,21 +4,21 @@ require 'zip'
4
4
  # Unit Test for IOStreams::Zip
5
5
  module Streams
6
6
  class ZipReaderTest < Minitest::Test
7
- context IOStreams::Zip::Reader do
8
- setup do
7
+ describe IOStreams::Zip::Reader do
8
+ before do
9
9
  @file_name = File.join(File.dirname(__FILE__), 'files', 'text.zip')
10
10
  @zip_data = File.open(@file_name, 'rb') { |f| f.read }
11
11
  @data = Zip::File.open(@file_name) { |zip_file| zip_file.first.get_input_stream.read }
12
12
  end
13
13
 
14
- context '.open' do
15
- should 'file' do
14
+ describe '.open' do
15
+ it 'file' do
16
16
  result = IOStreams::Zip::Reader.open(@file_name) do |io|
17
17
  io.read
18
18
  end
19
19
  assert_equal @data, result
20
20
  end
21
- should 'stream' do
21
+ it 'stream' do
22
22
  result = File.open(@file_name) do |file|
23
23
  IOStreams::Zip::Reader.open(file) do |io|
24
24
  io.read
@@ -30,4 +30,4 @@ module Streams
30
30
 
31
31
  end
32
32
  end
33
- end
33
+ end
@@ -4,14 +4,14 @@ require 'zip'
4
4
  # Unit Test for IOStreams::Zip
5
5
  module Streams
6
6
  class ZipWriterTest < Minitest::Test
7
- context IOStreams::Zip::Writer do
8
- setup do
7
+ describe IOStreams::Zip::Writer do
8
+ before do
9
9
  file_name = File.join(File.dirname(__FILE__), 'files', 'text.txt')
10
10
  @data = File.read(file_name)
11
11
  end
12
12
 
13
- context '.open' do
14
- should 'file' do
13
+ describe '.open' do
14
+ it 'file' do
15
15
  temp_file = Tempfile.new('rocket_job')
16
16
  file_name = temp_file.to_path
17
17
  IOStreams::Zip::Writer.open(file_name, zip_file_name: 'text.txt') do |io|
@@ -24,7 +24,7 @@ module Streams
24
24
  assert_equal @data, result
25
25
  end
26
26
 
27
- should 'stream' do
27
+ it 'stream' do
28
28
  io_string = StringIO.new(''.force_encoding('ASCII-8BIT'))
29
29
  IOStreams::Zip::Writer.open(io_string) do |io|
30
30
  io.write(@data)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iostreams
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-27 00:00:00.000000000 Z
11
+ date: 2015-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: symmetric-encryption
@@ -54,12 +54,14 @@ files:
54
54
  - lib/io_streams/gzip/writer.rb
55
55
  - lib/io_streams/io_streams.rb
56
56
  - lib/io_streams/version.rb
57
+ - lib/io_streams/xlsx/reader.rb
57
58
  - lib/io_streams/zip/reader.rb
58
59
  - lib/io_streams/zip/writer.rb
59
60
  - lib/iostreams.rb
60
61
  - test/delimited_reader_test.rb
61
62
  - test/file_reader_test.rb
62
63
  - test/file_writer_test.rb
64
+ - test/files/spreadsheet.xlsx
63
65
  - test/files/text.txt
64
66
  - test/files/text.txt.gz
65
67
  - test/files/text.txt.gz.zip
@@ -67,6 +69,7 @@ files:
67
69
  - test/gzip_reader_test.rb
68
70
  - test/gzip_writer_test.rb
69
71
  - test/test_helper.rb
72
+ - test/xlsx_reader_test.rb
70
73
  - test/zip_reader_test.rb
71
74
  - test/zip_writer_test.rb
72
75
  homepage: https://github.com/rocketjob/streams
@@ -97,6 +100,7 @@ test_files:
97
100
  - test/delimited_reader_test.rb
98
101
  - test/file_reader_test.rb
99
102
  - test/file_writer_test.rb
103
+ - test/files/spreadsheet.xlsx
100
104
  - test/files/text.txt
101
105
  - test/files/text.txt.gz
102
106
  - test/files/text.txt.gz.zip
@@ -104,5 +108,7 @@ test_files:
104
108
  - test/gzip_reader_test.rb
105
109
  - test/gzip_writer_test.rb
106
110
  - test/test_helper.rb
111
+ - test/xlsx_reader_test.rb
107
112
  - test/zip_reader_test.rb
108
113
  - test/zip_writer_test.rb
114
+ has_rdoc: true