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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -5
  3. data/Gemfile +2 -1
  4. data/lib/schlepp/sink/filter/chunker.rb +40 -0
  5. data/lib/schlepp/sink/filter/compressor/stream.rb +44 -0
  6. data/lib/schlepp/sink/filter/compressor/writer.rb +36 -0
  7. data/lib/schlepp/sink/filter/compressor.rb +20 -0
  8. data/lib/schlepp/sink/filter/formatter/csv/writer.rb +25 -0
  9. data/lib/schlepp/sink/filter/formatter/csv.rb +21 -0
  10. data/lib/schlepp/sink/filter.rb +20 -0
  11. data/lib/schlepp/sink/table_object/carosel.rb +65 -0
  12. data/lib/schlepp/sink/table_object/factory.rb +28 -0
  13. data/lib/schlepp/sink/table_object/filter/observer.rb +23 -0
  14. data/lib/schlepp/sink/table_object/filter/writer.rb +26 -0
  15. data/lib/schlepp/sink/table_object/filters.rb +22 -0
  16. data/lib/schlepp/sink/table_object/stream.rb +25 -0
  17. data/lib/schlepp/sink/table_object/writer/factory.rb +22 -0
  18. data/lib/schlepp/sink.rb +17 -2
  19. data/lib/schlepp/source/csv.rb +1 -1
  20. data/lib/schlepp/version.rb +1 -1
  21. data/test/integration/mock/sink.rb +51 -0
  22. data/test/integration/mock/source.rb +9 -0
  23. data/test/integration/schlepp_test.rb +27 -8
  24. data/test/integration/test_helper.rb +13 -6
  25. data/test/unit/schlepp/table_object/carosel_test.rb +104 -0
  26. data/test/unit/schlepp/table_object/factory_test.rb +55 -0
  27. data/test/unit/schlepp_test.rb +5 -4
  28. data/test/unit/test_helper.rb +13 -6
  29. metadata +27 -29
  30. data/bin/schlepp.rb +0 -29
  31. data/lib/schlepp/sink/chunker.rb +0 -30
  32. data/lib/schlepp/sink/data_object.rb +0 -26
  33. data/lib/schlepp/sink/data_stream.rb +0 -39
  34. data/lib/schlepp/sink/loader.rb +0 -35
  35. data/lib/schlepp/sink/sequencer.rb +0 -42
  36. data/lib/schlepp/sinks/fs/chunker.rb +0 -38
  37. data/lib/schlepp/sinks/fs/sequencer.rb +0 -21
  38. data/lib/schlepp/sinks/fs/table_object/collection.rb +0 -23
  39. data/lib/schlepp/sinks/fs/table_object/writer.rb +0 -33
  40. data/lib/schlepp/sinks/fs/table_object.rb +0 -31
  41. data/lib/schlepp/sinks/fs.rb +0 -2
  42. data/lib/schlepp/table_object/chunker.rb +0 -33
  43. data/test/unit/schlepp/sink/data_object_test.rb +0 -0
  44. data/test/unit/schlepp/sink/data_stream_test.rb +0 -0
  45. data/test/unit/schlepp/sink/loader_test.rb +0 -29
  46. data/test/unit/schlepp/sink/sequencer_test.rb +0 -0
  47. data/test/unit/schlepp/table_object/chunker_test.rb +0 -0
  48. /data/test/unit/schlepp/{sink/chunker_test.rb → table_object/writer/factory_test.rb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 937caf4f2826b085928376c932e22556cb4fcb77
4
- data.tar.gz: f3ac27937abb7605c6fc351751f15610faea6c4d
3
+ metadata.gz: 2b1ecbdd8608cf937d4aacec3d65899d9a89991c
4
+ data.tar.gz: e545caacec77ee3eafce431aa2f43b339852f3b1
5
5
  SHA512:
6
- metadata.gz: 01d49195f259f64f44caa3e158953ecc914c5289ab1d15e6fc475bfff8f4aa6cafded7162909469280f41afccc01baca46c5ee65e19219563bad71ef1799c5d0
7
- data.tar.gz: e503f9af56f2abf60ed774a42cefc31813058d535d97254566d2bf09e6621248c684b9e97b7b36837eb95d3f5afee39d2e72246fffa491f470f5bb139f7c5b06
6
+ metadata.gz: dac1ede8bb4e2ce790e1794d884451223fbc64633ffd2de5404da0d67ea58999e9a2dbe2dfb773f7ef2c9a048b228b93e56ca1fc297dd03ca6beabe022e52c15
7
+ data.tar.gz: 87cc9f384d060cfe89e67874e549927bb6b892a568f6542693851b1af4f2a59960145cad16e7f4df2d0b27ace85eca4e6b7070eb8f2f98bdfe415c022258a147
data/.travis.yml CHANGED
@@ -1,16 +1,17 @@
1
1
  language: ruby
2
2
 
3
3
  env:
4
- - TEST_SUITE=unit
5
- - TEST_SUITE=integration
4
+ global:
5
+ - COVERAGE=true
6
+ matrix:
7
+ - TEST_SUITE=unit
8
+ - TEST_SUITE=integration
6
9
 
7
10
  script: "bundle exec rake test:$TEST_SUITE"
8
11
 
9
12
  rvm:
10
13
  - "1.9.3"
11
- - "2.1.2"
14
+ - "2.1.3"
12
15
  - "ruby-head"
13
16
  - "jruby-19mode"
14
- - "jruby-head"
15
17
  - "rbx-2"
16
-
data/Gemfile CHANGED
@@ -1,5 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'coveralls', require: false
3
+ gem 'coveralls', group: :test, require: false
4
+ gem 'codeclimate-test-reporter', group: :test, require: nil
4
5
 
5
6
  gemspec
@@ -0,0 +1,40 @@
1
+ require 'schlepp/sink/table_object/filter/observer'
2
+ require 'schlepp/sink/table_object/filter/writer'
3
+ module Schlepp
4
+ class Sink
5
+ module Filter
6
+ class Chunker
7
+ class Builder
8
+ def initialize(observer)
9
+ @observer = observer
10
+ end
11
+
12
+ def new(writer)
13
+ Schlepp::Sink::TableObject::Filter::Writer.new(writer, @observer)
14
+ end
15
+ end
16
+ def initialize(opts = {})
17
+ @chunk = 0
18
+ @chunk_size = opts[:chunk_size] || 100000
19
+ @observer = Schlepp::Sink::TableObject::Filter::Observer.new
20
+ end
21
+
22
+ def extension
23
+ @chunk.to_s
24
+ end
25
+
26
+ def should_rotate?
27
+ @observer.count > @chunk_size
28
+ end
29
+
30
+ def rotate
31
+ @chunk += 1
32
+ end
33
+
34
+ def writer
35
+ @builder ||= Builder.new(@observer)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,44 @@
1
+ require 'zlib'
2
+
3
+ module Schlepp
4
+ class Sink
5
+ class TableObject
6
+ class Compressor
7
+ class Stream
8
+ def initialize
9
+ @buffer = StringIO.new("", "rb+")
10
+ @compressor = Zlib::GzipWriter.new(@buffer)
11
+ @dead = false
12
+ end
13
+
14
+ def write(data)
15
+ if @dead
16
+ raise "Stream has been dumped. No more writing permitted."
17
+ end
18
+ @compressor << data
19
+ end
20
+
21
+ def length
22
+ if @dead
23
+ raise "Stream has been dumped. No more writing permitted."
24
+ end
25
+ @compressor.pos
26
+ end
27
+
28
+ def finalize
29
+ if !@dead
30
+ @compressor.close
31
+ @dead = true
32
+ end
33
+ end
34
+
35
+ def to_s
36
+ finalize
37
+ @buffer.string
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,36 @@
1
+ require 'schlepp/sink/filter/compressor/stream'
2
+
3
+ module Schlepp
4
+ class Sink
5
+ class TableObject
6
+ class Compressor
7
+ class Writer
8
+ def initialize(writer, opts = {})
9
+ @stream = Stream.new
10
+ @writer = writer
11
+ @written = 0
12
+ end
13
+
14
+ def write(rows)
15
+ Array(rows).each do |row|
16
+ @written += row.length
17
+ @stream.write(row)
18
+ end
19
+ end
20
+
21
+
22
+ def rotate?
23
+ false
24
+ end
25
+
26
+ def finalize
27
+ bits = @stream.to_s
28
+
29
+ @writer.write(bits)
30
+ @writer.finalize
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,20 @@
1
+ require 'schlepp/sink/filter'
2
+ require 'schlepp/sink/filter/compressor/writer'
3
+
4
+ module Schlepp
5
+ class Sink
6
+ module Filter
7
+ class Compressor
8
+ include Schlepp::Sink::Filter::Static
9
+ def extension
10
+ 'gz'
11
+ end
12
+
13
+ def writer
14
+ Schlepp::Sink::TableObject::Compressor::Writer
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,25 @@
1
+ require 'csv'
2
+
3
+ module Schlepp
4
+ class Sink
5
+ class TableObject
6
+ class Formatter
7
+ class Csv
8
+ class Writer
9
+ def initialize(writer, opts = {})
10
+ @writer = writer
11
+ end
12
+
13
+ def write(rows)
14
+ @writer.write(rows.to_csv)
15
+ end
16
+
17
+ def finalize
18
+ @writer.finalize
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ require 'schlepp/sink/filter'
2
+ require 'schlepp/sink/table_object/formatter/csv/writer'
3
+
4
+ module Schlepp
5
+ class Sink
6
+ module Filter
7
+ class Csv
8
+ include Schlepp::Sink::Filter::Static
9
+ def extension
10
+ 'csv'
11
+ end
12
+
13
+ def writer
14
+ Schlepp::Sink::TableObject::Formatter::Csv::Writer
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+
@@ -0,0 +1,20 @@
1
+ module Schlepp
2
+ class Sink
3
+ module Filter
4
+ module Static
5
+ def should_rotate?
6
+ false
7
+ end
8
+
9
+ def rotate
10
+ nil
11
+ end
12
+ end
13
+ module Simple
14
+ def writer
15
+ Schlepp::Sink::TableObject::Writer
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,65 @@
1
+ require 'schlepp/sink/table_object/factory'
2
+ require 'schlepp/sink/table_object/writer/factory'
3
+
4
+ module Schlepp
5
+ class Sink
6
+ class TableObject
7
+ class Carosel
8
+ def initialize(factory, chain)
9
+ @factory = factory
10
+ @chain = chain
11
+ @parts = []
12
+ @current = rotate
13
+ @finalized = false
14
+ end
15
+
16
+ def write(data)
17
+ raise_if_finalized
18
+ if rotate?(data)
19
+ rotate
20
+ if rotate?(data)
21
+ raise
22
+ end
23
+ end
24
+ Array(data).each do |r|
25
+ @current.write(r)
26
+ end
27
+ end
28
+
29
+ def finalize
30
+ @current.finalize
31
+ @finalized = true
32
+ @parts
33
+ end
34
+
35
+ private
36
+
37
+ def raise_if_finalized
38
+ @finalized && raise
39
+ end
40
+
41
+ def rotate?(data)
42
+ @chain.any?(&:should_rotate?)
43
+ end
44
+
45
+ def rotate
46
+ @current.finalize if @current
47
+
48
+ to = table_object_factory.new
49
+
50
+ @parts << to
51
+
52
+ builder = Schlepp::Sink::TableObject::Writer::Factory.new(@factory, @chain, to)
53
+
54
+ @current = builder.new
55
+ end
56
+
57
+ private
58
+
59
+ def table_object_factory
60
+ @table_object_factory ||= Schlepp::Sink::TableObject::Factory.new(@factory, @chain)
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,28 @@
1
+ require 'schlepp/sink/table_object/writer/factory'
2
+
3
+ module Schlepp
4
+ class Sink
5
+ class TableObject
6
+ class Factory
7
+ def initialize(factory, components)
8
+ @factory = factory
9
+ @components = components
10
+ end
11
+
12
+ def new
13
+ @components.each(&:rotate)
14
+
15
+ url = @components.inject(@factory.url) do |u, f|
16
+ u.merge("#{u.path}.#{f.extension}")
17
+ end
18
+
19
+ Hydrogen::TableObject.new(@factory.model, url)
20
+ end
21
+
22
+ def writer
23
+ Writer::Factory.new(@factory, @components, self.new).new
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ module Schlepp
2
+ class Sink
3
+ class TableObject
4
+ class Filter
5
+ class Observer
6
+ def initialize
7
+ reset
8
+ end
9
+
10
+ attr_reader :count
11
+
12
+ def add(data)
13
+ @count += data.length
14
+ end
15
+
16
+ def reset
17
+ @count = 0
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ module Schlepp
2
+ class Sink
3
+ class TableObject
4
+ class Filter
5
+ class Writer
6
+ def initialize(writer, observer, opts = {})
7
+ @writer = writer
8
+ @observer = observer
9
+ end
10
+
11
+ def write(rows)
12
+ Array(rows).each do |row|
13
+ @writer.write(row)
14
+ @observer.add(row)
15
+ end
16
+ end
17
+
18
+ def finalize
19
+ @writer.finalize
20
+ @observer.reset
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,22 @@
1
+ module Schlepp
2
+ class Sink
3
+ class TableObject
4
+ class Filters
5
+ def initialize
6
+ @filters = []
7
+ end
8
+
9
+ def add(filter)
10
+ @filters << filter
11
+ end
12
+
13
+ def decorate(writer)
14
+ @filters.reverse.inject(writer) do |base, f|
15
+ f.decorate(base)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,25 @@
1
+ module Schlepp
2
+ class Sink
3
+ class TableObject
4
+ class Stream
5
+ def initialize(table_object_writer)
6
+ @table_object_writer = table_object_writer
7
+ end
8
+
9
+ def write(data)
10
+ @stream.write(data)
11
+ end
12
+
13
+ def length
14
+ @stream.length
15
+ end
16
+
17
+ def finalize
18
+ @stream.finalize
19
+
20
+ @table_object_writer.write(@stream.to_s)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ module Schlepp
2
+ class Sink
3
+ class TableObject
4
+ class Writer
5
+ class Factory
6
+ def initialize(factory, components, table_object)
7
+ @factory = factory
8
+ @components = components
9
+ @table_object = table_object
10
+ end
11
+
12
+ def new
13
+ writer = @factory.writer(@table_object)
14
+ @components.reverse.inject(writer) {|base, f|
15
+ f.writer.new(base)
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
data/lib/schlepp/sink.rb CHANGED
@@ -1,8 +1,23 @@
1
- require 'schlepp/sink/loader'
1
+ require 'schlepp/sink/table_object/carosel'
2
2
 
3
3
  module Schlepp
4
- module Sink
4
+ class Sink
5
+ def initialize(model, factory, filters)
6
+ @model = model
7
+ @carosel = TableObject::Carosel.new(factory, filters)
8
+ end
5
9
 
10
+ def name
11
+ @model.name
12
+ end
13
+
14
+ def write(data)
15
+ @carosel.write(data)
16
+ end
17
+
18
+ def finalize
19
+ @carosel.finalize
20
+ end
6
21
  end
7
22
  end
8
23
 
@@ -17,7 +17,7 @@ module Schlepp
17
17
 
18
18
  def each
19
19
  @csv.each do |r|
20
- yield r.fields
20
+ yield [r.fields]
21
21
  end
22
22
  end
23
23
  end
@@ -1,3 +1,3 @@
1
1
  module Schlepp
2
- VERSION = "0.0.1-alpha.1"
2
+ VERSION = "0.0.1-alpha.2"
3
3
  end
@@ -0,0 +1,51 @@
1
+ require 'schlepp/sink/filter/chunker'
2
+
3
+ module Schlepp::IntegrationTest::Mock
4
+ class Factory
5
+ def initialize(model, verifier)
6
+ @model = model
7
+ @verifier = verifier
8
+ end
9
+
10
+ def url
11
+ URI("http://www.example.com/")
12
+ end
13
+
14
+ def model
15
+ @model
16
+ end
17
+
18
+ def writer(to)
19
+ Writer.new(to, @verifier)
20
+ end
21
+ end
22
+ class Writer
23
+ def initialize(table_object, verifier)
24
+ @table_object = table_object
25
+ @verifier = verifier
26
+ end
27
+
28
+ def write(data)
29
+ @verifier.write(data)
30
+ end
31
+ def finalize
32
+ @verifier.finalize
33
+ end
34
+ end
35
+ class Sink
36
+ def initialize(model, verifier)
37
+ @model = model
38
+ @factory = Factory.new(@model, verifier)
39
+ @sink = Schlepp::Sink.new(@model, @factory, [Schlepp::Sink::Filter::Chunker.new])
40
+ end
41
+
42
+ def write(data)
43
+ @sink.write(data)
44
+ end
45
+
46
+ def finalize
47
+ @sink.finalize
48
+ end
49
+ end
50
+ end
51
+
@@ -0,0 +1,9 @@
1
+ module Schlepp::IntegrationTest::Mock
2
+ class Source
3
+ def each
4
+ 1.upto(100).each do |x|
5
+ yield [x.to_s]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -3,23 +3,42 @@ require File.expand_path('../test_helper', __FILE__)
3
3
  require 'pp'
4
4
  require 'schlepp'
5
5
 
6
+ $LOAD_PATH.unshift(File.expand_path('../', __FILE__))
7
+
8
+
6
9
  class Schlepp::IntegrationTest < Test::Unit::TestCase
7
10
  setup do
11
+ @model= Hydrogen::Model.new({
12
+ :table_name => "foo",
13
+ :key => "key",
14
+ :columns => ["baz", "blarg"]
15
+ })
16
+
17
+ @verifier = mock
18
+
8
19
  @mock_writer = mock
20
+ require 'mock/source'
21
+ @mock_source = Mock::Source.new
9
22
 
10
- #@mock_model = mock
11
- #@mock_model.expects(:name).at_least_once.returns("mock_models")
23
+ require 'mock/sink'
24
+ @mock_sink = Mock::Sink.new(@model, @verifier)
12
25
  end
13
26
 
14
- test 'stuff' do
15
- table_object = Hydrogen::TableObject.new(@mock_model)
27
+ test '.schlepp' do
28
+ 1.upto(100).each do |x|
29
+ @verifier.expects(:write).with(x.to_s)
30
+ end
31
+
32
+ @verifier.expects(:finalize)
33
+
34
+ res = Schlepp.schlepp(@mock_source, @mock_sink)
16
35
 
17
- loader = Schlepp::Sink::Loader.new(@mock_writer)
36
+ object = res.first
18
37
 
19
- @mock_writer.expects(:write)
20
- loader.write(["FOO|BAR|BAZ"] * 10)
38
+ puts res.inspect
21
39
 
22
- loader.finalize
40
+ assert_equal object.url, URI("http://www.example.com/.1")
41
+ assert_equal object.name, "foo"
23
42
  end
24
43
  end
25
44
 
@@ -1,10 +1,17 @@
1
- require 'coveralls'
2
- Coveralls.wear!
3
-
4
- if ENV["ENABLE_SIMPLE_COV"]
1
+ if ENV["COVERAGE"]
2
+ require 'coveralls'
3
+ require 'codeclimate-test-reporter'
5
4
  require 'simplecov'
6
- require File.expand_path('../../simplecov_helper', __FILE__)
7
- SimpleCov.start 'pocketchange'
5
+ SimpleCov.start do
6
+ add_group "Lib", "lib"
7
+ add_filter "/test/"
8
+ command_name "Integration 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'