mode 0.0.10 → 0.0.11
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/.rspec +1 -0
- data/.travis.yml +1 -0
- data/bin/mode +3 -8
- data/lib/connect.rb +13 -0
- data/lib/mode.rb +18 -5
- data/lib/mode/api/link.rb +4 -0
- data/lib/mode/api/request.rb +20 -10
- data/lib/mode/auth/access_token.rb +16 -0
- data/lib/mode/cli/connect.rb +1 -1
- data/lib/mode/commands/analyze_field.rb +1 -3
- data/lib/mode/commands/connect.rb +24 -49
- data/lib/mode/commands/helpers.rb +23 -18
- data/lib/mode/commands/import.rb +2 -4
- data/lib/mode/commands/login.rb +88 -25
- data/lib/mode/config.rb +60 -2
- data/lib/mode/connector/connect.rb +11 -0
- data/lib/mode/connector/daemon.rb +54 -12
- data/lib/mode/connector/daemonizer.rb +107 -0
- data/lib/mode/connector/data_source.rb +36 -9
- data/lib/mode/connector/scheduler.rb +6 -5
- data/lib/mode/connector/uploader.rb +3 -4
- data/lib/mode/version.rb +1 -1
- data/mode.gemspec +7 -4
- data/spec/api/request_spec.rb +9 -6
- data/spec/commands/connect_spec.rb +45 -59
- data/spec/commands/helpers_spec.rb +9 -22
- data/spec/commands/import_spec.rb +5 -0
- data/spec/commands/login_spec.rb +87 -76
- data/spec/config_spec.rb +9 -0
- data/spec/connector/daemon_spec.rb +11 -6
- data/spec/connector/daemonizer_spec.rb +106 -0
- data/spec/connector/data_source_spec.rb +15 -17
- data/spec/connector/registrar_spec.rb +5 -6
- data/spec/connector/scheduler_spec.rb +3 -2
- data/spec/connector/uploader_spec.rb +9 -9
- metadata +65 -65
- data/lib/mode/configurable.rb +0 -46
- data/lib/mode/connector/config.rb +0 -31
- data/spec/connector/config_spec.rb +0 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2c6df3ccb06a07283edcf39c63589afb87703dd
|
4
|
+
data.tar.gz: 344a3c504ecd0a4a00a5b7657baf993c4686a1a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b98ace299b5475dcf6a9eca4dc069cc0dea59c85ef800439f0141c4fb484bcb2a7111903ed20d9e710ebf4063db01db4e2751fa3332ec08128bc942b083f19b
|
7
|
+
data.tar.gz: c9a02420d3efc6597e12ea1245f6048ae38797531bcdf6a1d74f61f9c67a346a0b9d262020af2ba16ef9f38b40af87910d0886a3cd498b3e4437518e0c7de16b
|
data/.rspec
CHANGED
data/.travis.yml
CHANGED
data/bin/mode
CHANGED
data/lib/connect.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
4
|
+
|
5
|
+
require 'mode'
|
6
|
+
|
7
|
+
runner = Mode::Connector::Daemon.new(:max_jobs => ARGV[0] || 4)
|
8
|
+
|
9
|
+
trap("INT") { runner.stop }
|
10
|
+
trap("HUP") { runner.stop }
|
11
|
+
trap("TERM") { runner.stop }
|
12
|
+
|
13
|
+
runner.start
|
data/lib/mode.rb
CHANGED
@@ -5,27 +5,34 @@ require 'data_package'
|
|
5
5
|
|
6
6
|
require 'mode/version'
|
7
7
|
|
8
|
+
#
|
8
9
|
# Config & Logging
|
9
|
-
|
10
|
+
#
|
10
11
|
require 'mode/config'
|
11
12
|
require 'mode/logger'
|
12
13
|
|
14
|
+
#
|
13
15
|
# Auth
|
16
|
+
#
|
14
17
|
require 'mode/auth/access_token'
|
15
18
|
|
16
|
-
|
19
|
+
#
|
17
20
|
# API
|
21
|
+
#
|
18
22
|
require 'mode/api/link'
|
19
23
|
require 'mode/api/form'
|
20
24
|
require 'mode/api/resource'
|
21
25
|
require 'mode/api/request'
|
22
26
|
|
27
|
+
#
|
23
28
|
# Connector
|
24
|
-
|
29
|
+
#
|
30
|
+
|
31
|
+
# Core
|
25
32
|
require 'mode/connector/type_map'
|
26
33
|
require 'mode/connector/data_source'
|
27
|
-
require 'mode/connector/dataset'
|
28
34
|
|
35
|
+
# Operations
|
29
36
|
require 'mode/connector/registrar'
|
30
37
|
require 'mode/connector/scheduler'
|
31
38
|
require 'mode/connector/poller'
|
@@ -33,11 +40,17 @@ require 'mode/connector/processor'
|
|
33
40
|
require 'mode/connector/selector'
|
34
41
|
require 'mode/connector/uploader'
|
35
42
|
|
36
|
-
|
43
|
+
# Models
|
44
|
+
require 'mode/connector/dataset'
|
37
45
|
require 'mode/connector/message'
|
38
46
|
|
47
|
+
# Daemon
|
48
|
+
require 'mode/connector/daemon'
|
49
|
+
require 'mode/connector/daemonizer'
|
39
50
|
|
51
|
+
#
|
40
52
|
# Commands
|
53
|
+
#
|
41
54
|
require 'mode/commands/helpers'
|
42
55
|
|
43
56
|
require 'mode/commands/login'
|
data/lib/mode/api/link.rb
CHANGED
data/lib/mode/api/request.rb
CHANGED
@@ -48,8 +48,10 @@ module Mode
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def log_response(level, response)
|
51
|
+
response_lines = response.body.split("\n")
|
52
|
+
|
51
53
|
Mode::Logger.instance.send(level,
|
52
|
-
"API::Request", "#{response.status}", ["#{method.upcase} #{path}"])
|
54
|
+
"API::Request", "#{response.status}", ["#{method.upcase} #{path}", *response_lines])
|
53
55
|
end
|
54
56
|
|
55
57
|
class << self
|
@@ -59,6 +61,7 @@ module Mode
|
|
59
61
|
|
60
62
|
attr_reader :environment
|
61
63
|
attr_reader :credentials
|
64
|
+
attr_reader :access_token
|
62
65
|
|
63
66
|
def valid?
|
64
67
|
!environment.nil?
|
@@ -72,17 +75,23 @@ module Mode
|
|
72
75
|
|
73
76
|
def username
|
74
77
|
validate!
|
75
|
-
@credentials[
|
78
|
+
@credentials['username']
|
79
|
+
end
|
80
|
+
|
81
|
+
def password
|
82
|
+
validate!
|
83
|
+
@credentials['password']
|
76
84
|
end
|
77
85
|
|
78
86
|
def access_token
|
79
87
|
validate!
|
80
|
-
@
|
88
|
+
@access_token
|
81
89
|
end
|
82
90
|
|
83
91
|
def configure(environment, options = {})
|
84
92
|
@environment = environment
|
85
|
-
@credentials = options[
|
93
|
+
@credentials = options['credentials']
|
94
|
+
@access_token = options['access_token']
|
86
95
|
end
|
87
96
|
|
88
97
|
#
|
@@ -121,20 +130,21 @@ module Mode
|
|
121
130
|
"/api/#{username}"
|
122
131
|
end
|
123
132
|
|
124
|
-
def access_tokens_path
|
125
|
-
"#{base_path}/access_tokens"
|
126
|
-
end
|
127
|
-
|
128
133
|
def packages_path
|
129
134
|
"#{base_path}/packages"
|
130
135
|
end
|
131
136
|
|
137
|
+
def access_tokens_path
|
138
|
+
"#{base_path}/access_tokens"
|
139
|
+
end
|
140
|
+
|
132
141
|
def data_source_connections_path
|
133
142
|
"#{base_path}/data_source_connections"
|
134
143
|
end
|
135
144
|
|
136
145
|
def data_source_connection_path
|
137
|
-
|
146
|
+
token = access_token && access_token['token']
|
147
|
+
[data_source_connections_path, token].join('/').strip
|
138
148
|
end
|
139
149
|
|
140
150
|
def data_source_connection_messages_path
|
@@ -149,7 +159,7 @@ module Mode
|
|
149
159
|
builder.request :multipart # adds small overhead to each request
|
150
160
|
builder.request :url_encoded
|
151
161
|
builder.adapter Faraday.default_adapter
|
152
|
-
builder.basic_auth(username,
|
162
|
+
builder.basic_auth(username, password)
|
153
163
|
end
|
154
164
|
end
|
155
165
|
|
@@ -15,9 +15,25 @@ module Mode
|
|
15
15
|
resource.token
|
16
16
|
end
|
17
17
|
|
18
|
+
def password
|
19
|
+
resource.password
|
20
|
+
rescue
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
|
18
24
|
def account_name
|
19
25
|
resource.account_name
|
20
26
|
end
|
27
|
+
|
28
|
+
def verify(password)
|
29
|
+
verified = resource.links('verify').follow(:password => password)
|
30
|
+
|
31
|
+
if verified.is_a?(Mode::API::Resource)
|
32
|
+
Mode::Auth::AccessToken.new(verified)
|
33
|
+
else
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
end
|
21
37
|
end
|
22
38
|
end
|
23
39
|
end
|
data/lib/mode/cli/connect.rb
CHANGED
@@ -23,9 +23,7 @@ module Mode
|
|
23
23
|
|
24
24
|
csv = DataKit::CSV::Parser.new(path)
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
puts "Analyzing #{field_name} at #{path || 'input'}"
|
26
|
+
puts "Analyzing field #{field_pos} at #{path || 'input'}"
|
29
27
|
|
30
28
|
analysis, total_time = timer_block do
|
31
29
|
DataKit::CSV::FieldAnalyzer.analyze(csv, field_pos, {
|
@@ -12,79 +12,54 @@ module Mode
|
|
12
12
|
@concurrency = options[:concurrency] || 4
|
13
13
|
end
|
14
14
|
|
15
|
-
def execute
|
15
|
+
def execute(options = {})
|
16
16
|
validate_config!
|
17
|
-
|
18
|
-
|
17
|
+
|
18
|
+
register!
|
19
|
+
run_command!
|
19
20
|
end
|
20
21
|
|
21
22
|
def verify!
|
23
|
+
load_drivers!
|
22
24
|
validate_config!
|
25
|
+
|
23
26
|
configuration.data_sources.each do |data_source|
|
24
|
-
|
25
|
-
unless data_source.connection.test_connection
|
26
|
-
raise StandardError.new("Unknown connection error")
|
27
|
-
end
|
28
|
-
rescue => err
|
29
|
-
raise "Error: Cannot connect to #{data_source.name}. #{err.message}"
|
30
|
-
end
|
27
|
+
verify_data_source!(data_source)
|
31
28
|
end
|
32
29
|
end
|
33
30
|
|
34
31
|
private
|
35
32
|
|
36
|
-
def validate_config!
|
37
|
-
require_config!
|
38
|
-
require_credentials!
|
39
|
-
require_connect_config!
|
40
|
-
configure_api_requests!
|
41
|
-
end
|
42
|
-
|
43
|
-
def configuration
|
44
|
-
@configuration ||= Mode::Connector::Config.new(config_dir)
|
45
|
-
end
|
46
|
-
|
47
33
|
def register!
|
48
|
-
|
34
|
+
if ['start', 'restart'].include?(command)
|
35
|
+
Mode::Connector::Registrar.new(configuration).perform!
|
36
|
+
end
|
49
37
|
end
|
50
38
|
|
51
|
-
def
|
52
|
-
if command == '
|
53
|
-
|
54
|
-
elsif ['stop', '
|
55
|
-
|
39
|
+
def run_command!
|
40
|
+
if command == 'status'
|
41
|
+
daemon.alive?
|
42
|
+
elsif ['stop', 'start', 'restart'].include?(command)
|
43
|
+
daemon.send(command)
|
56
44
|
else
|
57
45
|
raise "Unknown command #{command}"
|
58
46
|
end
|
59
47
|
end
|
60
48
|
|
61
|
-
def
|
62
|
-
|
63
|
-
|
64
|
-
ensure
|
65
|
-
spawn_command!('start')
|
49
|
+
def verify_data_source!(data_source)
|
50
|
+
unless data_source.connection.test_connection
|
51
|
+
raise StandardError.new("Unknown connection error")
|
66
52
|
end
|
53
|
+
rescue => err
|
54
|
+
raise "Error: Cannot connect to #{data_source.name}. #{err.message}"
|
67
55
|
end
|
68
56
|
|
69
|
-
def
|
70
|
-
Mode::
|
71
|
-
end
|
72
|
-
|
73
|
-
def spawn_opts
|
74
|
-
{
|
75
|
-
:sync_log => true,
|
76
|
-
:working_dir => working_dir,
|
77
|
-
:log_file => File.join(working_dir, 'connect.log'),
|
78
|
-
:pid_file => File.join(working_dir, 'connect.pid')
|
79
|
-
}
|
80
|
-
end
|
81
|
-
|
82
|
-
def spawn_args(command)
|
83
|
-
[command, concurrency, configuration.data_sources]
|
57
|
+
def configuration
|
58
|
+
@configuration ||= Mode::Config.new(config_dir)
|
84
59
|
end
|
85
60
|
|
86
|
-
def
|
87
|
-
@
|
61
|
+
def daemon
|
62
|
+
@daemon ||= Mode::Connector::Daemonizer.new(:args => [concurrency])
|
88
63
|
end
|
89
64
|
end
|
90
65
|
end
|
@@ -10,16 +10,16 @@ module Mode
|
|
10
10
|
Mode::Config.default_dir
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
|
13
|
+
def drivers_dir
|
14
|
+
File.join(config_dir, 'drivers')
|
15
15
|
end
|
16
16
|
|
17
17
|
def config_exists?
|
18
18
|
Mode::Config.exists?(config_dir)
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
Mode::
|
21
|
+
def config
|
22
|
+
@config ||= Mode::Config.new(config_dir)
|
23
23
|
end
|
24
24
|
|
25
25
|
def require_config!
|
@@ -28,17 +28,10 @@ module Mode
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
def require_connect_config!
|
32
|
-
unless connect_config_exists?
|
33
|
-
raise "No connect configuration file found."
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
31
|
def require_credentials!
|
38
32
|
message = "Couldn't find Mode login credentials. Please use `mode login` before continuing."
|
39
33
|
|
40
34
|
if config_exists?
|
41
|
-
config = Mode::Config.new(config_dir)
|
42
35
|
unless config.username && config.access_token
|
43
36
|
raise message
|
44
37
|
end
|
@@ -47,15 +40,27 @@ module Mode
|
|
47
40
|
end
|
48
41
|
end
|
49
42
|
|
50
|
-
def
|
51
|
-
|
43
|
+
def validate_config!
|
44
|
+
require_config!
|
45
|
+
require_credentials!
|
46
|
+
configure_api_requests!
|
47
|
+
end
|
52
48
|
|
49
|
+
def load_drivers!
|
50
|
+
if RUBY_PLATFORM == 'java'
|
51
|
+
Dir[File.join(drivers_dir, '*.jar')].each do |driver|
|
52
|
+
load driver
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def configure_api_requests!
|
53
58
|
Mode::API::Request.configure(
|
54
|
-
config.environment, {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
}
|
59
|
+
config.environment, {
|
60
|
+
'credentials' => {
|
61
|
+
'username' => config.username,
|
62
|
+
'password' => config.access_token_password
|
63
|
+
}, 'access_token' => config.access_token
|
59
64
|
}
|
60
65
|
)
|
61
66
|
end
|
data/lib/mode/commands/import.rb
CHANGED
@@ -11,13 +11,11 @@ module Mode
|
|
11
11
|
@source = source
|
12
12
|
@account = account
|
13
13
|
@table_name = table_name
|
14
|
-
|
15
|
-
require_config!
|
16
|
-
require_credentials!
|
17
|
-
configure_api_requests!
|
18
14
|
end
|
19
15
|
|
20
16
|
def execute
|
17
|
+
validate_config!
|
18
|
+
|
21
19
|
package = make_package
|
22
20
|
uploaded = upload_package(package)
|
23
21
|
imported = import_package(uploaded)
|