schlepp 0.0.1.pre.alpha.1 → 0.0.1.pre.alpha.2
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/.travis.yml +6 -5
- data/Gemfile +2 -1
- data/lib/schlepp/sink/filter/chunker.rb +40 -0
- data/lib/schlepp/sink/filter/compressor/stream.rb +44 -0
- data/lib/schlepp/sink/filter/compressor/writer.rb +36 -0
- data/lib/schlepp/sink/filter/compressor.rb +20 -0
- data/lib/schlepp/sink/filter/formatter/csv/writer.rb +25 -0
- data/lib/schlepp/sink/filter/formatter/csv.rb +21 -0
- data/lib/schlepp/sink/filter.rb +20 -0
- data/lib/schlepp/sink/table_object/carosel.rb +65 -0
- data/lib/schlepp/sink/table_object/factory.rb +28 -0
- data/lib/schlepp/sink/table_object/filter/observer.rb +23 -0
- data/lib/schlepp/sink/table_object/filter/writer.rb +26 -0
- data/lib/schlepp/sink/table_object/filters.rb +22 -0
- data/lib/schlepp/sink/table_object/stream.rb +25 -0
- data/lib/schlepp/sink/table_object/writer/factory.rb +22 -0
- data/lib/schlepp/sink.rb +17 -2
- data/lib/schlepp/source/csv.rb +1 -1
- data/lib/schlepp/version.rb +1 -1
- data/test/integration/mock/sink.rb +51 -0
- data/test/integration/mock/source.rb +9 -0
- data/test/integration/schlepp_test.rb +27 -8
- data/test/integration/test_helper.rb +13 -6
- data/test/unit/schlepp/table_object/carosel_test.rb +104 -0
- data/test/unit/schlepp/table_object/factory_test.rb +55 -0
- data/test/unit/schlepp_test.rb +5 -4
- data/test/unit/test_helper.rb +13 -6
- metadata +27 -29
- data/bin/schlepp.rb +0 -29
- data/lib/schlepp/sink/chunker.rb +0 -30
- data/lib/schlepp/sink/data_object.rb +0 -26
- data/lib/schlepp/sink/data_stream.rb +0 -39
- data/lib/schlepp/sink/loader.rb +0 -35
- data/lib/schlepp/sink/sequencer.rb +0 -42
- data/lib/schlepp/sinks/fs/chunker.rb +0 -38
- data/lib/schlepp/sinks/fs/sequencer.rb +0 -21
- data/lib/schlepp/sinks/fs/table_object/collection.rb +0 -23
- data/lib/schlepp/sinks/fs/table_object/writer.rb +0 -33
- data/lib/schlepp/sinks/fs/table_object.rb +0 -31
- data/lib/schlepp/sinks/fs.rb +0 -2
- data/lib/schlepp/table_object/chunker.rb +0 -33
- data/test/unit/schlepp/sink/data_object_test.rb +0 -0
- data/test/unit/schlepp/sink/data_stream_test.rb +0 -0
- data/test/unit/schlepp/sink/loader_test.rb +0 -29
- data/test/unit/schlepp/sink/sequencer_test.rb +0 -0
- data/test/unit/schlepp/table_object/chunker_test.rb +0 -0
- /data/test/unit/schlepp/{sink/chunker_test.rb → table_object/writer/factory_test.rb} +0 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'schlepp/sink/table_object/carosel'
|
4
|
+
|
5
|
+
class Schlepp::Sink::TableObject::CaroselTest < Test::Unit::TestCase
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
setup do
|
9
|
+
@mock_factory = mock
|
10
|
+
|
11
|
+
@mock_table_object = mock
|
12
|
+
|
13
|
+
@mock_filters = 5.times.map do |wf|
|
14
|
+
mock
|
15
|
+
end
|
16
|
+
|
17
|
+
@mock_table_object_factory = mock
|
18
|
+
Schlepp::Sink::TableObject::Factory.expects(:new).with(@mock_factory, @mock_filters).returns(@mock_table_object_factory)
|
19
|
+
|
20
|
+
@mock_table_object_factory.expects(:new).returns(@mock_table_object)
|
21
|
+
|
22
|
+
mock_table_object_writer_factory = mock
|
23
|
+
Schlepp::Sink::TableObject::Writer::Factory.expects(:new).with(@mock_factory, @mock_filters, @mock_table_object).returns(mock_table_object_writer_factory)
|
24
|
+
|
25
|
+
@mock_writer = mock
|
26
|
+
mock_table_object_writer_factory.expects(:new).returns(@mock_writer)
|
27
|
+
|
28
|
+
@carosel = Schlepp::Sink::TableObject::Carosel.new(@mock_factory, @mock_filters)
|
29
|
+
end
|
30
|
+
|
31
|
+
test "#write" do
|
32
|
+
mock_data = mock
|
33
|
+
|
34
|
+
@mock_filters.each do |f|
|
35
|
+
f.expects(:should_rotate?).returns(false)
|
36
|
+
end
|
37
|
+
|
38
|
+
@mock_writer.expects(:write).with(mock_data)
|
39
|
+
|
40
|
+
@carosel.write(mock_data)
|
41
|
+
end
|
42
|
+
|
43
|
+
test "#write with rotation" do
|
44
|
+
mock_data = mock
|
45
|
+
|
46
|
+
rotation_state = states('rotation').starts_as('unrotated')
|
47
|
+
|
48
|
+
@mock_filters.first.expects(:should_rotate?).
|
49
|
+
when(rotation_state.is('unrotated')).
|
50
|
+
then(rotation_state.is('rotated')).
|
51
|
+
returns(true)
|
52
|
+
|
53
|
+
|
54
|
+
@mock_filters.each do |f|
|
55
|
+
f.expects(:should_rotate?).when(rotation_state.is('rotated')).returns(false)
|
56
|
+
end
|
57
|
+
|
58
|
+
@mock_writer.expects(:finalize)
|
59
|
+
|
60
|
+
mock_second_table_object = mock
|
61
|
+
@mock_table_object_factory.expects(:new).returns(mock_second_table_object)
|
62
|
+
|
63
|
+
mock_table_object_writer_factory = mock
|
64
|
+
Schlepp::Sink::TableObject::Writer::Factory.expects(:new).with(@mock_factory, @mock_filters, mock_second_table_object).returns(mock_table_object_writer_factory)
|
65
|
+
|
66
|
+
mock_replacement_writer = mock
|
67
|
+
mock_table_object_writer_factory.expects(:new).returns(mock_replacement_writer)
|
68
|
+
|
69
|
+
mock_replacement_writer.expects(:write).with(mock_data)
|
70
|
+
|
71
|
+
@carosel.write(mock_data)
|
72
|
+
end
|
73
|
+
test "#write with endless rotation should fail" do
|
74
|
+
mock_data = mock
|
75
|
+
|
76
|
+
rotation_state = states('rotation').starts_as('unrotated')
|
77
|
+
|
78
|
+
@mock_filters.first.expects(:should_rotate?).
|
79
|
+
when(rotation_state.is('unrotated')).
|
80
|
+
then(rotation_state.is('rotated')).
|
81
|
+
returns(true)
|
82
|
+
|
83
|
+
@mock_filters.first.expects(:should_rotate?).
|
84
|
+
when(rotation_state.is('rotated')).
|
85
|
+
returns(true)
|
86
|
+
|
87
|
+
|
88
|
+
@mock_writer.expects(:finalize)
|
89
|
+
|
90
|
+
mock_second_table_object = mock
|
91
|
+
@mock_table_object_factory.expects(:new).returns(mock_second_table_object)
|
92
|
+
|
93
|
+
mock_table_object_writer_factory = mock
|
94
|
+
Schlepp::Sink::TableObject::Writer::Factory.expects(:new).with(@mock_factory, @mock_filters, mock_second_table_object).returns(mock_table_object_writer_factory)
|
95
|
+
|
96
|
+
mock_replacement_writer = mock
|
97
|
+
mock_table_object_writer_factory.expects(:new).returns(mock_replacement_writer)
|
98
|
+
|
99
|
+
assert_raises do
|
100
|
+
@carosel.write(mock_data)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'schlepp/sink/table_object/factory'
|
4
|
+
|
5
|
+
class Schlepp::Sink::TableObject::FactoryTest < Test::Unit::TestCase
|
6
|
+
include TestHelper
|
7
|
+
setup do
|
8
|
+
@mock_factory = mock
|
9
|
+
|
10
|
+
url = URI("file:///tmp/example")
|
11
|
+
|
12
|
+
@mock_factory.expects(:url).returns(url)
|
13
|
+
|
14
|
+
mock_model = mock
|
15
|
+
|
16
|
+
@mock_factory.expects(:model).returns(mock_model)
|
17
|
+
|
18
|
+
|
19
|
+
@mock_filters = 5.times.map do |wf|
|
20
|
+
mock_filter = mock
|
21
|
+
mock_filter.expects(:rotate)
|
22
|
+
|
23
|
+
mock_filter
|
24
|
+
end
|
25
|
+
|
26
|
+
@mock_filters.each_with_index do |f, idx|
|
27
|
+
f.expects(:extension).returns(idx)
|
28
|
+
end
|
29
|
+
|
30
|
+
@mock_table_object = mock
|
31
|
+
expected_url = URI("file:///tmp/example.0.1.2.3.4")
|
32
|
+
Hydrogen::TableObject.expects(:new).with(mock_model, expected_url).returns(@mock_table_object)
|
33
|
+
|
34
|
+
@factory = Schlepp::Sink::TableObject::Factory.new(@mock_factory, @mock_filters)
|
35
|
+
end
|
36
|
+
test "#new" do
|
37
|
+
res = @factory.new
|
38
|
+
|
39
|
+
assert_equal res, @mock_table_object
|
40
|
+
end
|
41
|
+
|
42
|
+
test "#writer" do
|
43
|
+
|
44
|
+
mock_table_object_writer_factory = mock
|
45
|
+
Schlepp::Sink::TableObject::Writer::Factory.expects(:new).with(@mock_factory, @mock_filters, @mock_table_object).returns(mock_table_object_writer_factory)
|
46
|
+
|
47
|
+
mock_writer = mock
|
48
|
+
mock_table_object_writer_factory.expects(:new).returns(mock_writer)
|
49
|
+
|
50
|
+
|
51
|
+
res = @factory.writer
|
52
|
+
|
53
|
+
assert_equal res, mock_writer
|
54
|
+
end
|
55
|
+
end
|
data/test/unit/schlepp_test.rb
CHANGED
@@ -5,8 +5,6 @@ require 'schlepp'
|
|
5
5
|
class SchleppTest < Test::Unit::TestCase
|
6
6
|
include TestHelper
|
7
7
|
test '.schlepp' do
|
8
|
-
table_object = Hydrogen::TableObject.new(@mock_model)
|
9
|
-
|
10
8
|
mock_source = mock
|
11
9
|
|
12
10
|
mock_source.expects(:each).multiple_yields("foo", "bar", "baz")
|
@@ -17,8 +15,11 @@ class SchleppTest < Test::Unit::TestCase
|
|
17
15
|
mock_sink.expects(:write).with("bar")
|
18
16
|
mock_sink.expects(:write).with("baz")
|
19
17
|
|
20
|
-
|
18
|
+
mock_parts = mock
|
19
|
+
mock_sink.expects(:finalize).returns(mock_parts)
|
20
|
+
|
21
|
+
parts = Schlepp.schlepp(mock_source, mock_sink)
|
21
22
|
|
22
|
-
|
23
|
+
assert_equal parts, mock_parts
|
23
24
|
end
|
24
25
|
end
|
data/test/unit/test_helper.rb
CHANGED
@@ -1,10 +1,17 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
if ENV["ENABLE_SIMPLE_COV"]
|
1
|
+
if ENV["COVERAGE"]
|
2
|
+
require 'coveralls'
|
3
|
+
require 'codeclimate-test-reporter'
|
5
4
|
require 'simplecov'
|
6
|
-
|
7
|
-
|
5
|
+
SimpleCov.start do
|
6
|
+
add_group "Lib", "lib"
|
7
|
+
add_filter "/test/"
|
8
|
+
command_name "Unit Tests"
|
9
|
+
formatter SimpleCov::Formatter::MultiFormatter[
|
10
|
+
SimpleCov::Formatter::HTMLFormatter,
|
11
|
+
Coveralls::SimpleCov::Formatter,
|
12
|
+
CodeClimate::TestReporter::Formatter
|
13
|
+
]
|
14
|
+
end
|
8
15
|
end
|
9
16
|
|
10
17
|
require 'test/unit'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schlepp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1.pre.alpha.
|
4
|
+
version: 0.0.1.pre.alpha.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ed Carrel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -111,8 +111,7 @@ dependencies:
|
|
111
111
|
description: An extensible chunking file transferer
|
112
112
|
email:
|
113
113
|
- edward@carrel.org
|
114
|
-
executables:
|
115
|
-
- schlepp.rb
|
114
|
+
executables: []
|
116
115
|
extensions: []
|
117
116
|
extra_rdoc_files: []
|
118
117
|
files:
|
@@ -123,34 +122,34 @@ files:
|
|
123
122
|
- LICENSE
|
124
123
|
- README.md
|
125
124
|
- Rakefile
|
126
|
-
- bin/schlepp.rb
|
127
125
|
- lib/schlepp.rb
|
128
126
|
- lib/schlepp/env.rb
|
129
127
|
- lib/schlepp/sink.rb
|
130
|
-
- lib/schlepp/sink/
|
131
|
-
- lib/schlepp/sink/
|
132
|
-
- lib/schlepp/sink/
|
133
|
-
- lib/schlepp/sink/
|
134
|
-
- lib/schlepp/sink/
|
135
|
-
- lib/schlepp/
|
136
|
-
- lib/schlepp/
|
137
|
-
- lib/schlepp/
|
138
|
-
- lib/schlepp/
|
139
|
-
- lib/schlepp/
|
140
|
-
- lib/schlepp/
|
128
|
+
- lib/schlepp/sink/filter.rb
|
129
|
+
- lib/schlepp/sink/filter/chunker.rb
|
130
|
+
- lib/schlepp/sink/filter/compressor.rb
|
131
|
+
- lib/schlepp/sink/filter/compressor/stream.rb
|
132
|
+
- lib/schlepp/sink/filter/compressor/writer.rb
|
133
|
+
- lib/schlepp/sink/filter/formatter/csv.rb
|
134
|
+
- lib/schlepp/sink/filter/formatter/csv/writer.rb
|
135
|
+
- lib/schlepp/sink/table_object/carosel.rb
|
136
|
+
- lib/schlepp/sink/table_object/factory.rb
|
137
|
+
- lib/schlepp/sink/table_object/filter/observer.rb
|
138
|
+
- lib/schlepp/sink/table_object/filter/writer.rb
|
139
|
+
- lib/schlepp/sink/table_object/filters.rb
|
140
|
+
- lib/schlepp/sink/table_object/stream.rb
|
141
|
+
- lib/schlepp/sink/table_object/writer/factory.rb
|
141
142
|
- lib/schlepp/source.rb
|
142
143
|
- lib/schlepp/source/csv.rb
|
143
|
-
- lib/schlepp/table_object/chunker.rb
|
144
144
|
- lib/schlepp/version.rb
|
145
145
|
- schlepp.gemspec
|
146
|
+
- test/integration/mock/sink.rb
|
147
|
+
- test/integration/mock/source.rb
|
146
148
|
- test/integration/schlepp_test.rb
|
147
149
|
- test/integration/test_helper.rb
|
148
|
-
- test/unit/schlepp/
|
149
|
-
- test/unit/schlepp/
|
150
|
-
- test/unit/schlepp/
|
151
|
-
- test/unit/schlepp/sink/loader_test.rb
|
152
|
-
- test/unit/schlepp/sink/sequencer_test.rb
|
153
|
-
- test/unit/schlepp/table_object/chunker_test.rb
|
150
|
+
- test/unit/schlepp/table_object/carosel_test.rb
|
151
|
+
- test/unit/schlepp/table_object/factory_test.rb
|
152
|
+
- test/unit/schlepp/table_object/writer/factory_test.rb
|
154
153
|
- test/unit/schlepp_test.rb
|
155
154
|
- test/unit/test_helper.rb
|
156
155
|
homepage: https://github.com/azanar/schlepp
|
@@ -178,13 +177,12 @@ signing_key:
|
|
178
177
|
specification_version: 4
|
179
178
|
summary: An extensible chunking file transferer
|
180
179
|
test_files:
|
180
|
+
- test/integration/mock/sink.rb
|
181
|
+
- test/integration/mock/source.rb
|
181
182
|
- test/integration/schlepp_test.rb
|
182
183
|
- test/integration/test_helper.rb
|
183
|
-
- test/unit/schlepp/
|
184
|
-
- test/unit/schlepp/
|
185
|
-
- test/unit/schlepp/
|
186
|
-
- test/unit/schlepp/sink/loader_test.rb
|
187
|
-
- test/unit/schlepp/sink/sequencer_test.rb
|
188
|
-
- test/unit/schlepp/table_object/chunker_test.rb
|
184
|
+
- test/unit/schlepp/table_object/carosel_test.rb
|
185
|
+
- test/unit/schlepp/table_object/factory_test.rb
|
186
|
+
- test/unit/schlepp/table_object/writer/factory_test.rb
|
189
187
|
- test/unit/schlepp_test.rb
|
190
188
|
- test/unit/test_helper.rb
|
data/bin/schlepp.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
$LOAD_PATH.push(File.dirname(__FILE__) + '/../lib')
|
3
|
-
|
4
|
-
require 'hydrogen'
|
5
|
-
require 'schlepp/sinks/fs'
|
6
|
-
|
7
|
-
config = {
|
8
|
-
:table_name => 'foo',
|
9
|
-
:source => {:file => 'data.csv'},
|
10
|
-
:columns => %w{foo bar baz}
|
11
|
-
}
|
12
|
-
|
13
|
-
AWS.config(
|
14
|
-
access_key_id: 'ACCESS_KEY_ID',
|
15
|
-
secret_access_key: 'SECRET_ACCESS_KEY',
|
16
|
-
stub_requests: Schlepp.env.test?,
|
17
|
-
)
|
18
|
-
|
19
|
-
model = Hydrogen::Model.new(config)
|
20
|
-
|
21
|
-
to = Hydrogen::TableObject.new(model)
|
22
|
-
|
23
|
-
source = Schlepp::Source::CSV.new(File.new('data.csv','r'))
|
24
|
-
|
25
|
-
l = Schlepp::Sink::Fs::Sequencer.new(to, :chunk_size => 40000)
|
26
|
-
|
27
|
-
res = Schlepp.schlepp(source, l)
|
28
|
-
|
29
|
-
puts res.inspect
|
data/lib/schlepp/sink/chunker.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'schlepp/sink/loader'
|
2
|
-
require 'schlepp/table_object/chunker'
|
3
|
-
|
4
|
-
module Schlepp
|
5
|
-
module Sink
|
6
|
-
class Chunker
|
7
|
-
def initialize(table_object, opts = {})
|
8
|
-
@table_object = table_object
|
9
|
-
end
|
10
|
-
|
11
|
-
def sequence
|
12
|
-
chunker.sequence
|
13
|
-
end
|
14
|
-
|
15
|
-
def parts
|
16
|
-
chunker.parts
|
17
|
-
end
|
18
|
-
|
19
|
-
def next
|
20
|
-
chunker.next
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def chunker
|
26
|
-
@chunker ||= Schlepp::TableObject::Chunker.new(@table_object)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'schlepp/sink/data_stream'
|
2
|
-
|
3
|
-
module Schlepp
|
4
|
-
module Sink
|
5
|
-
class DataObject
|
6
|
-
def initialize(table_object)
|
7
|
-
@stream = DataStream.new
|
8
|
-
@table_object = table_object
|
9
|
-
end
|
10
|
-
|
11
|
-
def write(data)
|
12
|
-
@stream.write(data)
|
13
|
-
end
|
14
|
-
|
15
|
-
def length
|
16
|
-
@stream.length
|
17
|
-
end
|
18
|
-
|
19
|
-
def finalize
|
20
|
-
@stream.finalize
|
21
|
-
|
22
|
-
@table_object.write(@stream.to_s)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'zlib'
|
2
|
-
|
3
|
-
module Schlepp
|
4
|
-
module Sink
|
5
|
-
class DataStream
|
6
|
-
def initialize
|
7
|
-
@buffer = StringIO.new("", "rb+")
|
8
|
-
@compressor = Zlib::GzipWriter.new(@buffer)
|
9
|
-
@dead = false
|
10
|
-
end
|
11
|
-
|
12
|
-
def write(data)
|
13
|
-
if @dead
|
14
|
-
raise "Stream has been dumped. No more writing permitted."
|
15
|
-
end
|
16
|
-
@compressor << data
|
17
|
-
end
|
18
|
-
|
19
|
-
def length
|
20
|
-
if @dead
|
21
|
-
raise "Stream has been dumped. No more writing permitted."
|
22
|
-
end
|
23
|
-
@compressor.pos
|
24
|
-
end
|
25
|
-
|
26
|
-
def finalize
|
27
|
-
if !@dead
|
28
|
-
@compressor.close
|
29
|
-
@dead = true
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def to_s
|
34
|
-
finalize
|
35
|
-
@buffer.string
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/schlepp/sink/loader.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'schlepp/sink/data_object'
|
2
|
-
|
3
|
-
module Schlepp
|
4
|
-
module Sink
|
5
|
-
class Loader
|
6
|
-
def initialize(writer, opts = {})
|
7
|
-
@writer = writer
|
8
|
-
|
9
|
-
@file = DataObject.new(writer)
|
10
|
-
end
|
11
|
-
|
12
|
-
def name
|
13
|
-
@writer.name
|
14
|
-
end
|
15
|
-
|
16
|
-
def path
|
17
|
-
@writer.path
|
18
|
-
end
|
19
|
-
|
20
|
-
def write(rows)
|
21
|
-
Array(rows).each do |row|
|
22
|
-
@file.write(row)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def written
|
27
|
-
@file.length
|
28
|
-
end
|
29
|
-
|
30
|
-
def finalize
|
31
|
-
@file.finalize
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Schlepp
|
2
|
-
module Sink
|
3
|
-
module Sequencer
|
4
|
-
DEFAULT_CHUNK_SIZE = 50 * 1024 * 1024 # 50 MB
|
5
|
-
def initialize(table_object, opts = {})
|
6
|
-
@table_object = table_object
|
7
|
-
@chunker = chunker.new(table_object)
|
8
|
-
@chunk_size = opts[:chunk_size] || DEFAULT_CHUNK_SIZE
|
9
|
-
end
|
10
|
-
|
11
|
-
def write(rows)
|
12
|
-
rows.each do |row|
|
13
|
-
if loader.written + row.length > @chunk_size
|
14
|
-
rotate
|
15
|
-
end
|
16
|
-
loader.write(row)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def parts
|
21
|
-
@chunker.parts
|
22
|
-
end
|
23
|
-
|
24
|
-
def finalize
|
25
|
-
loader.finalize
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def loader
|
31
|
-
@loader ||= rotate
|
32
|
-
end
|
33
|
-
|
34
|
-
def rotate
|
35
|
-
if @loader
|
36
|
-
@loader.finalize
|
37
|
-
end
|
38
|
-
@loader = @chunker.next
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'schlepp/sink/chunker'
|
2
|
-
|
3
|
-
require 'schlepp/sinks/fs/table_object'
|
4
|
-
require 'schlepp/sinks/fs/table_object/writer'
|
5
|
-
|
6
|
-
module Schlepp
|
7
|
-
module Sink
|
8
|
-
module Fs
|
9
|
-
class Chunker
|
10
|
-
def initialize(table_object, opts = {})
|
11
|
-
@table_object = table_object
|
12
|
-
end
|
13
|
-
|
14
|
-
def sequence
|
15
|
-
chunker.sequence
|
16
|
-
end
|
17
|
-
|
18
|
-
def parts
|
19
|
-
chunker.parts
|
20
|
-
end
|
21
|
-
|
22
|
-
def next
|
23
|
-
part = chunker.next
|
24
|
-
|
25
|
-
ts = Schlepp::Sink::Fs::TableObject.new(part)
|
26
|
-
|
27
|
-
Schlepp::Sink::Loader.new(ts)
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def chunker
|
33
|
-
@chunker ||= Schlepp::Sink::Chunker.new(@table_object)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'schlepp/sink/sequencer'
|
2
|
-
require 'schlepp/sinks/fs/chunker'
|
3
|
-
require 'schlepp/sinks/fs/table_object/collection'
|
4
|
-
|
5
|
-
module Schlepp
|
6
|
-
module Sink
|
7
|
-
module Fs
|
8
|
-
class Sequencer
|
9
|
-
include Schlepp::Sink::Sequencer
|
10
|
-
|
11
|
-
def collection
|
12
|
-
Schlepp::Sink::Fs::TableObject::Collection
|
13
|
-
end
|
14
|
-
|
15
|
-
def chunker
|
16
|
-
Schlepp::Sink::Fs::Chunker
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'hydrogen/table_object/collection'
|
2
|
-
|
3
|
-
module Schlepp
|
4
|
-
module Sink
|
5
|
-
module Fs
|
6
|
-
class TableObject
|
7
|
-
class Collection
|
8
|
-
include Hydrogen::TableObject::Collection
|
9
|
-
|
10
|
-
def url
|
11
|
-
"file:///#{path}"
|
12
|
-
end
|
13
|
-
|
14
|
-
def urls
|
15
|
-
parts.map do |p|
|
16
|
-
TableObject.new(p).url
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module Schlepp
|
2
|
-
module Sink
|
3
|
-
module Fs
|
4
|
-
class TableObject
|
5
|
-
class Writer
|
6
|
-
def initialize(table_object, opts = {})
|
7
|
-
@table_object = table_object
|
8
|
-
@written = 0
|
9
|
-
end
|
10
|
-
|
11
|
-
def file
|
12
|
-
@file ||= File.new("/tmp/#{@table_object.path}", 'w')
|
13
|
-
end
|
14
|
-
|
15
|
-
def write(rows)
|
16
|
-
Array(rows).each do |row|
|
17
|
-
@written += row.length
|
18
|
-
file.write(row)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def written
|
23
|
-
@written
|
24
|
-
end
|
25
|
-
|
26
|
-
def finalize
|
27
|
-
@file.close
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Schlepp
|
2
|
-
module Sink
|
3
|
-
module Fs
|
4
|
-
class TableObject
|
5
|
-
def initialize(table_object, opts = {})
|
6
|
-
@table_object = table_object
|
7
|
-
@written = 0
|
8
|
-
end
|
9
|
-
|
10
|
-
def write(rows)
|
11
|
-
Array(rows).each do |row|
|
12
|
-
@written += row.length
|
13
|
-
file.write(row)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def written
|
18
|
-
@written
|
19
|
-
end
|
20
|
-
|
21
|
-
def finalize
|
22
|
-
@file.close
|
23
|
-
end
|
24
|
-
|
25
|
-
def file
|
26
|
-
@file ||= File.new("/tmp/#{@table_object.path}", 'w')
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/schlepp/sinks/fs.rb
DELETED