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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +1 -0
  4. data/bin/mode +3 -8
  5. data/lib/connect.rb +13 -0
  6. data/lib/mode.rb +18 -5
  7. data/lib/mode/api/link.rb +4 -0
  8. data/lib/mode/api/request.rb +20 -10
  9. data/lib/mode/auth/access_token.rb +16 -0
  10. data/lib/mode/cli/connect.rb +1 -1
  11. data/lib/mode/commands/analyze_field.rb +1 -3
  12. data/lib/mode/commands/connect.rb +24 -49
  13. data/lib/mode/commands/helpers.rb +23 -18
  14. data/lib/mode/commands/import.rb +2 -4
  15. data/lib/mode/commands/login.rb +88 -25
  16. data/lib/mode/config.rb +60 -2
  17. data/lib/mode/connector/connect.rb +11 -0
  18. data/lib/mode/connector/daemon.rb +54 -12
  19. data/lib/mode/connector/daemonizer.rb +107 -0
  20. data/lib/mode/connector/data_source.rb +36 -9
  21. data/lib/mode/connector/scheduler.rb +6 -5
  22. data/lib/mode/connector/uploader.rb +3 -4
  23. data/lib/mode/version.rb +1 -1
  24. data/mode.gemspec +7 -4
  25. data/spec/api/request_spec.rb +9 -6
  26. data/spec/commands/connect_spec.rb +45 -59
  27. data/spec/commands/helpers_spec.rb +9 -22
  28. data/spec/commands/import_spec.rb +5 -0
  29. data/spec/commands/login_spec.rb +87 -76
  30. data/spec/config_spec.rb +9 -0
  31. data/spec/connector/daemon_spec.rb +11 -6
  32. data/spec/connector/daemonizer_spec.rb +106 -0
  33. data/spec/connector/data_source_spec.rb +15 -17
  34. data/spec/connector/registrar_spec.rb +5 -6
  35. data/spec/connector/scheduler_spec.rb +3 -2
  36. data/spec/connector/uploader_spec.rb +9 -9
  37. metadata +65 -65
  38. data/lib/mode/configurable.rb +0 -46
  39. data/lib/mode/connector/config.rb +0 -31
  40. data/spec/connector/config_spec.rb +0 -46
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bafc28cae256c4ce4821bb00753799dadb4c468c
4
- data.tar.gz: 7360d725309e1253b0cff15f9974942405fbd370
3
+ metadata.gz: b2c6df3ccb06a07283edcf39c63589afb87703dd
4
+ data.tar.gz: 344a3c504ecd0a4a00a5b7657baf993c4686a1a1
5
5
  SHA512:
6
- metadata.gz: 1e6ffd7b71345345d3e8399c74a7b6b358353ae632839ac60f46085cb0cbfaed4c09f4e2a748429ece0df50ed802095977adf605b92812e462544b2a864c4e56
7
- data.tar.gz: 9bd2f1c0f0f3fe7f788a83785d7d1b591d6e355231ea3507dcf70db113e44d1ffc5c44b08cda7a0d65bd3a469ffd481ae8b9f8e781f1536d06f748752ca0a4bd
6
+ metadata.gz: 8b98ace299b5475dcf6a9eca4dc069cc0dea59c85ef800439f0141c4fb484bcb2a7111903ed20d9e710ebf4063db01db4e2751fa3332ec08128bc942b083f19b
7
+ data.tar.gz: c9a02420d3efc6597e12ea1245f6048ae38797531bcdf6a1d74f61f9c67a346a0b9d262020af2ba16ef9f38b40af87910d0886a3cd498b3e4437518e0c7de16b
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
+ --tty
1
2
  --color
2
3
  --format documentation
@@ -2,6 +2,7 @@ language: ruby
2
2
 
3
3
  rvm:
4
4
  - 2.0.0
5
+ - jruby-19mode
5
6
 
6
7
  script:
7
8
  - CODECLIMATE_REPO_TOKEN=2c6f0a277b4e6919f0fd5e5fdef7bf7adcb4e7a7da23d71a3ac4b07093446e4d bundle exec rake
data/bin/mode CHANGED
@@ -1,13 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- begin
4
- require 'mode'
5
- require 'mode/cli'
6
- rescue LoadError
7
- require 'rubygems'
3
+ require 'rubygems'
8
4
 
9
- require 'mode'
10
- require 'mode/cli'
11
- end
5
+ require 'mode'
6
+ require 'mode/cli'
12
7
 
13
8
  Mode::CLI::Base.start(ARGV)
@@ -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
@@ -5,27 +5,34 @@ require 'data_package'
5
5
 
6
6
  require 'mode/version'
7
7
 
8
+ #
8
9
  # Config & Logging
9
- require 'mode/configurable'
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
- require 'mode/connector/config'
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
- require 'mode/connector/daemon'
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'
@@ -21,6 +21,10 @@ module Mode
21
21
  template.expand(params)
22
22
  end
23
23
 
24
+ def follow(params = {})
25
+ Mode::API::Request.get(expand(params))
26
+ end
27
+
24
28
  private
25
29
 
26
30
  def template
@@ -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[:username]
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
- @credentials[:access_token]
88
+ @access_token
81
89
  end
82
90
 
83
91
  def configure(environment, options = {})
84
92
  @environment = environment
85
- @credentials = options[:credentials]
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
- [data_source_connections_path, access_token].join('/').strip
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, access_token)
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
@@ -20,7 +20,7 @@ module Mode
20
20
  say "Error: valid commands for connect are start, stop and restart"
21
21
  end
22
22
  rescue => err
23
- say "Error: #{err.message}"
23
+ say "Error: #{err.message} #{err.backtrace}"
24
24
  end
25
25
  end
26
26
  end
@@ -23,9 +23,7 @@ module Mode
23
23
 
24
24
  csv = DataKit::CSV::Parser.new(path)
25
25
 
26
- field_name = csv.headers[field_pos]
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
- register! if ['start', 'restart'].include?(command)
18
- spawn!
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
- begin
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
- Mode::Connector::Registrar.new(configuration).perform!
34
+ if ['start', 'restart'].include?(command)
35
+ Mode::Connector::Registrar.new(configuration).perform!
36
+ end
49
37
  end
50
38
 
51
- def spawn!
52
- if command == 'restart'
53
- spawn_restart!
54
- elsif ['stop', 'status', 'start'].include?(command)
55
- spawn_command!(command)
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 spawn_restart!
62
- begin
63
- spawn_command!('stop')
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 spawn_command!(command)
70
- Mode::Connector::Daemon.spawn!(spawn_opts, spawn_args(command))
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 working_dir
87
- @working_dir ||= File.expand_path('~/.mode')
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 config_path
14
- Mode::Config.full_path(config_dir)
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 connect_config_exists?
22
- Mode::Connector::Config.exists?(config_dir)
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 configure_api_requests!
51
- config = Mode::Config.new(config_dir)
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
- :credentials => {
56
- :username => config.username,
57
- :access_token => config.access_token
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
@@ -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)