mode 0.0.17 → 0.0.18

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 (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