mode 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
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)