mode 0.0.17 → 0.0.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -134
  3. data/lib/connect.rb +5 -5
  4. data/lib/mode.rb +12 -8
  5. data/lib/mode/api/form.rb +30 -8
  6. data/lib/mode/api/request.rb +34 -16
  7. data/lib/mode/commands/connect.rb +0 -8
  8. data/lib/mode/commands/import.rb +1 -1
  9. data/lib/mode/config.rb +9 -1
  10. data/lib/mode/connector/commands/select_report_run_dataset.rb +84 -0
  11. data/lib/mode/connector/commands/select_table_metadata.rb +113 -0
  12. data/lib/mode/connector/daemon.rb +3 -3
  13. data/lib/mode/connector/data_sources/base.rb +191 -0
  14. data/lib/mode/connector/databases/rdbms.rb +69 -0
  15. data/lib/mode/connector/dataset.rb +0 -1
  16. data/lib/mode/connector/dispatcher.rb +27 -0
  17. data/lib/mode/connector/poller.rb +2 -3
  18. data/lib/mode/connector/registrar.rb +74 -16
  19. data/lib/mode/connector/scheduler.rb +24 -15
  20. data/lib/mode/connector/selector.rb +1 -0
  21. data/lib/mode/connector/tables/rdbms.rb +130 -0
  22. data/lib/mode/version.rb +2 -2
  23. data/mode.gemspec +2 -0
  24. data/script/console.rb +11 -0
  25. data/spec/api/form_spec.rb +17 -8
  26. data/spec/api/request_spec.rb +3 -3
  27. data/spec/commands/connect_spec.rb +1 -10
  28. data/spec/config_spec.rb +1 -1
  29. data/spec/connector/commands/select_report_run_dataset_spec.rb +96 -0
  30. data/spec/connector/commands/select_table_metadata_spec.rb +115 -0
  31. data/spec/connector/{data_source_spec.rb → data_sources/base_spec.rb} +8 -8
  32. data/spec/connector/databases/rdbms_spec.rb +43 -0
  33. data/spec/connector/dispatcher_spec.rb +47 -0
  34. data/spec/connector/poller_spec.rb +2 -1
  35. data/spec/connector/registrar_spec.rb +111 -26
  36. data/spec/connector/scheduler_spec.rb +12 -31
  37. data/spec/connector/selector_spec.rb +1 -1
  38. data/spec/connector/tables/rdbms_spec.rb +85 -0
  39. metadata +49 -15
  40. data/lib/mode/connector/connect.rb +0 -11
  41. data/lib/mode/connector/data_source.rb +0 -171
  42. data/lib/mode/connector/message.rb +0 -31
  43. data/lib/mode/connector/processor.rb +0 -58
  44. data/lib/mode/connector/uploader.rb +0 -54
  45. data/spec/connector/message_spec.rb +0 -22
  46. data/spec/connector/processor_spec.rb +0 -93
  47. data/spec/connector/uploader_spec.rb +0 -57
@@ -1,31 +0,0 @@
1
- module Mode
2
- module Connector
3
- class Message
4
- attr_reader :resource
5
-
6
- def initialize(resource)
7
- @resource = resource
8
- end
9
-
10
- def type
11
- resource.content['type']
12
- end
13
-
14
- def name
15
- resource.content['name']
16
- end
17
-
18
- def query
19
- resource.content['query']
20
- end
21
-
22
- def data_source
23
- resource.embedded('data_source')
24
- end
25
-
26
- def execution_path
27
- resource.links('execution').href
28
- end
29
- end
30
- end
31
- end
@@ -1,58 +0,0 @@
1
- require 'date'
2
- require 'time'
3
- require 'tmpdir'
4
-
5
- module Mode
6
- module Connector
7
- class Processor
8
- attr_reader :message
9
- attr_reader :data_sources
10
-
11
- def initialize(message, data_sources)
12
- @message = message
13
- @data_sources = data_sources
14
- end
15
-
16
- def perform!
17
- if data_source
18
- send!(select!)
19
- else
20
- raise "Data source not found #{message.data_source.name}"
21
- end
22
- rescue => err
23
- error!(err.message, err.backtrace.join("\n"))
24
-
25
- Mode::Logger.instance.error(
26
- "Connector::Processor", err.message, err.backtrace)
27
- end
28
-
29
- private
30
-
31
- def select!
32
- Mode::Connector::Selector.new(query, data_source).perform!
33
- end
34
-
35
- def send!(dataset)
36
- Mode::Connector::Uploader.new(upload_path, dataset).perform!
37
- end
38
-
39
- def error!(message, detail = nil)
40
- Mode::Connector::Uploader.error!(upload_path, message, detail)
41
- end
42
-
43
- def query
44
- message.query
45
- end
46
-
47
- def upload_path
48
- message.execution_path
49
- end
50
-
51
- def data_source
52
- data_sources.find do |ds|
53
- ds.name == message.data_source.name
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,54 +0,0 @@
1
- module Mode
2
- module Connector
3
- class Uploader
4
- attr_reader :path
5
- attr_reader :dataset
6
-
7
- def initialize(path, dataset)
8
- @path = path
9
- @dataset = dataset
10
- end
11
-
12
- def perform!
13
- Mode::API::Request.put(path,
14
- :report_run => {
15
- :dataset => {
16
- :count => count,
17
- :content => content,
18
- :columns => JSON.generate(columns)
19
- }
20
- }
21
- )
22
- end
23
-
24
- class << self
25
- def error!(path, message, detail = nil)
26
- Mode::API::Request.put(path,
27
- :report_run => {
28
- :error => {
29
- :detail => detail,
30
- :message => message
31
- }
32
- }
33
- )
34
- end
35
- end
36
-
37
- private
38
-
39
- def count
40
- dataset.count
41
- end
42
-
43
- def columns
44
- dataset.column_types.map do |name, type|
45
- {:name => name, :type => type}
46
- end
47
- end
48
-
49
- def content
50
- Faraday::UploadIO.new(dataset.path, 'applicaton/octet-stream')
51
- end
52
- end
53
- end
54
- end
@@ -1,22 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mode::Connector::Message do
4
- let(:resource) {
5
- Mode::API::Resource.new({
6
- 'type' => 'query',
7
- 'name' => 'fake',
8
- 'query' => 'query'
9
- })
10
- }
11
-
12
- before do
13
- initialize_logger
14
- end
15
-
16
- it "initializes with resource" do
17
- message = Mode::Connector::Message.new(resource)
18
- message.type.should == 'query'
19
- message.name.should == 'fake'
20
- message.query.should == 'query'
21
- end
22
- end
@@ -1,93 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mode::Connector::Processor do
4
- let(:data_sources) {
5
- [
6
- Mode::Connector::DataSource.new('testdb', {
7
- 'adapter' => 'postgres',
8
- 'host' => 'localhost',
9
- 'username' => 'postgres',
10
- 'database' => 'warehouse',
11
- 'password' => nil
12
- })
13
- ]
14
- }
15
-
16
- let(:execution_path) { '/execution' }
17
-
18
- let(:resource) {
19
- Mode::API::Resource.new({
20
- 'type' => 'query',
21
- 'query' => 'SELECT 1',
22
- '_embedded' => {
23
- 'data_source' => {
24
- 'name' => 'testdb'
25
- }
26
- },
27
- '_links' => {
28
- 'execution' => {
29
- 'href' => execution_path
30
- }
31
- }
32
- })
33
- }
34
-
35
- let(:message) {
36
- Mode::Connector::Message.new(resource)
37
- }
38
-
39
- before do
40
- initialize_logger
41
- end
42
-
43
- it "initializes with message and data sources" do
44
- processor = Mode::Connector::Processor.new(message, data_sources)
45
-
46
- processor.message.should_not == nil
47
- processor.data_sources.should_not == nil
48
- end
49
-
50
- it "selects a dataset" do
51
- processor = Mode::Connector::Processor.new(message, data_sources)
52
-
53
- selector = double(:selector, :perform! => true)
54
- Mode::Connector::Selector.should_receive(:new).with(
55
- message.query, data_sources.first).and_return(selector)
56
-
57
- processor.send(:select!)
58
- end
59
-
60
- it "sends a dataset" do
61
- processor = Mode::Connector::Processor.new(message, data_sources)
62
-
63
- dataset = double(:dataset)
64
- uploader = double(:uploader, :perform! => true)
65
- Mode::Connector::Uploader.should_receive(:new).with(execution_path, dataset).and_return(uploader)
66
-
67
- processor.send(:send!, dataset)
68
- end
69
-
70
- it "sends an error" do
71
- processor = Mode::Connector::Processor.new(message, data_sources)
72
-
73
- Mode::Connector::Uploader.should_receive(:error!).with(
74
- execution_path, "message", "details").and_return(true)
75
-
76
- processor.send(:error!, "message", "details")
77
- end
78
-
79
- it "performs a send" do
80
- processor = Mode::Connector::Processor.new(message, data_sources)
81
- processor.should_receive(:select!).and_return(true)
82
- processor.should_receive(:send!).and_return(true)
83
- processor.perform!
84
- end
85
-
86
- it "performs an error" do
87
- processor = Mode::Connector::Processor.new(message, data_sources)
88
- processor.should_receive(:select!).and_raise(StandardError.new("BREAK!"))
89
- processor.should_receive(:error!).and_return(true)
90
-
91
- processor.perform!
92
- end
93
- end
@@ -1,57 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mode::Connector::Uploader do
4
- let(:tmpdir) { Dir.mktmpdir }
5
- let(:outpath) { File.join(tmpdir, 'data.csv') }
6
- let(:runs_path) { Mode::API::Request.data_source_connection_path }
7
-
8
- let(:dataset) {
9
- double(:dataset,
10
- :path => outpath,
11
- :count => 0,
12
- :column_types => {
13
- 'int' => :integer,
14
- 'float' => :number
15
- }
16
- )
17
- }
18
-
19
- before do
20
- initialize_logger
21
- FileUtils.touch(outpath)
22
- end
23
-
24
- it "initializes with a dataset" do
25
- uploader = Mode::Connector::Uploader.new(runs_path, dataset)
26
- uploader.dataset.should_not == nil
27
- end
28
-
29
- it "sends a dataset and columns" do
30
- uploader = Mode::Connector::Uploader.new(runs_path, dataset)
31
-
32
- Mode::API::Request.should_receive(:put).with(runs_path,
33
- :report_run => {
34
- :dataset => {
35
- :count => 0,
36
- :columns => an_instance_of(String),
37
- :content => an_instance_of(Faraday::UploadIO)
38
- }
39
- }
40
- )
41
-
42
- uploader.send(:perform!)
43
- end
44
-
45
- it "sends error message and detail" do
46
- Mode::API::Request.should_receive(:put).with(runs_path,
47
- :report_run => {
48
- :error => {
49
- :message => "message",
50
- :detail => "detailed"
51
- }
52
- }
53
- )
54
-
55
- Mode::Connector::Uploader.send(:error!, runs_path, "message", "detailed")
56
- end
57
- end