empire-client 0.3 → 0.3.1
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/lib/empire.rb +32 -25
- data/lib/exceptions.rb +22 -0
- data/lib/walkthrough.rb +4 -4
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f4fb9c86e7df8d24e6b73bee4f2daa7494dedca
|
4
|
+
data.tar.gz: 16ec7ecebb1b7be684c9e2605f037c3117f722c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a78109f1f14a5150ec7fec450dae4f26c04e88183166557a123f45e5466f411e3d1169747d61846ecfd2672df22cd27fa98cffdef11226e6e2667e3b1dda362
|
7
|
+
data.tar.gz: 2b2e51e26f9a9fc6836790967715e4cd7f9d8135918fa9321e837f56cdbc66f79a8556d2830f6a29c62d0816d35e123a62e5f081f108c8f4ecb1221f73ccb7c4
|
data/lib/empire.rb
CHANGED
@@ -6,6 +6,7 @@ require 'httpclient'
|
|
6
6
|
require 'irb-pager'
|
7
7
|
|
8
8
|
require_relative 'walkthrough.rb'
|
9
|
+
require_relative 'exceptions.rb'
|
9
10
|
|
10
11
|
class Empire
|
11
12
|
attr_reader :base_url
|
@@ -13,13 +14,13 @@ class Empire
|
|
13
14
|
# app_key is your Empire application key, and is necessary for using the API
|
14
15
|
# opts can include any of:
|
15
16
|
# * :api_server => the server to connect to (default: api.empiredata.com)
|
16
|
-
# * :
|
17
|
+
# * :enduser => a string identifying the end user, required for any operations on views (default: nil)
|
17
18
|
# * :secrets_yaml => the path to a YAML file generated by https://login.empiredata.co (default: nil)
|
18
19
|
def initialize(app_key = nil, opts = {})
|
19
20
|
api_server = opts[:api_server] || 'api.empiredata.co'
|
20
21
|
|
21
22
|
@app_key = app_key
|
22
|
-
@
|
23
|
+
@enduser = opts[:enduser]
|
23
24
|
@session_key = nil
|
24
25
|
|
25
26
|
@http_client = HTTPClient.new
|
@@ -27,9 +28,13 @@ class Empire
|
|
27
28
|
protocol = api_server.start_with?('localhost') ? 'http' : 'https'
|
28
29
|
@base_url = "#{protocol}://#{api_server}/empire/"
|
29
30
|
|
30
|
-
@service_secrets = nil
|
31
31
|
if opts[:secrets_yaml]
|
32
|
-
|
32
|
+
service_secrets = YAML.load_file opts[:secrets_yaml]
|
33
|
+
|
34
|
+
@secrets = {}
|
35
|
+
@service_secrets[service]['option'].each{|k, v|
|
36
|
+
secrets[k] = v['value']
|
37
|
+
}
|
33
38
|
end
|
34
39
|
end
|
35
40
|
|
@@ -39,13 +44,7 @@ class Empire
|
|
39
44
|
def connect(service, secrets = nil)
|
40
45
|
path = "services/#{service}/connect"
|
41
46
|
unless secrets
|
42
|
-
|
43
|
-
raise "secrets must be provided on connect command,
|
44
|
-
or secrets_yaml file must be given when constructing this instance"
|
45
|
-
end
|
46
|
-
|
47
|
-
secrets = {}
|
48
|
-
@service_secrets[service]['option'].each{|k, v| secrets[k] = v['value']}
|
47
|
+
raise Empire::MissingSecretsError.new
|
49
48
|
end
|
50
49
|
request path, :post, {}, secrets
|
51
50
|
end
|
@@ -58,7 +57,7 @@ class Empire
|
|
58
57
|
elsif service and !table
|
59
58
|
path += "/#{service}"
|
60
59
|
elsif !service and table
|
61
|
-
raise "Service must be specified if table is specified"
|
60
|
+
raise Empire::MissingServiceError.new("Service must be specified if table is specified")
|
62
61
|
end
|
63
62
|
|
64
63
|
request path
|
@@ -90,8 +89,8 @@ class Empire
|
|
90
89
|
|
91
90
|
# Materialize a SQL query as a view. This creates or updates a view.
|
92
91
|
def materialize_view(name, sql)
|
93
|
-
unless @
|
94
|
-
raise
|
92
|
+
unless @enduser
|
93
|
+
raise Empire::MissingEnduserError.new
|
95
94
|
end
|
96
95
|
path = "view/#{name}"
|
97
96
|
data = {'query' => sql}
|
@@ -100,8 +99,8 @@ class Empire
|
|
100
99
|
|
101
100
|
# Delete a materialized view of SQL query
|
102
101
|
def drop_view(name)
|
103
|
-
unless @
|
104
|
-
raise
|
102
|
+
unless @enduser
|
103
|
+
raise Empire::MissingEnduserError.new
|
105
104
|
end
|
106
105
|
path = "view/#{name}"
|
107
106
|
request path, :delete
|
@@ -116,7 +115,7 @@ class Empire
|
|
116
115
|
when 'ready' then true
|
117
116
|
when 'pending' then false
|
118
117
|
else
|
119
|
-
raise "Unknown view status: #{response['viewStatus']}"
|
118
|
+
raise APIError.new("Unknown view status: #{response['viewStatus']}")
|
120
119
|
end
|
121
120
|
end
|
122
121
|
|
@@ -136,8 +135,8 @@ class Empire
|
|
136
135
|
private
|
137
136
|
|
138
137
|
def view_status(name)
|
139
|
-
unless @
|
140
|
-
raise
|
138
|
+
unless @enduser
|
139
|
+
raise Empire::MissingEnduserError.new
|
141
140
|
end
|
142
141
|
path = "view/#{name}/status"
|
143
142
|
request path, :get
|
@@ -152,8 +151,8 @@ class Empire
|
|
152
151
|
def create_session
|
153
152
|
headers = {'Authorization' => "Empire appkey=\"#{@app_key}\""}
|
154
153
|
session_url = "session/create"
|
155
|
-
if @
|
156
|
-
session_url = session_url + "?enduser=#{@
|
154
|
+
if @enduser
|
155
|
+
session_url = session_url + "?enduser=#{@enduser}"
|
157
156
|
end
|
158
157
|
data = do_request session_url, :post, headers
|
159
158
|
@sessionkey = data['sessionkey']
|
@@ -167,12 +166,20 @@ class Empire
|
|
167
166
|
conn = @http_client.request_async method, url, nil, data.to_json, headers
|
168
167
|
conn.pop.content
|
169
168
|
else
|
170
|
-
# return the response body
|
169
|
+
# return the response body, parsed as JSON
|
170
|
+
|
171
171
|
response = @http_client.request method, url, body: data.to_json, header: headers
|
172
|
-
|
173
|
-
|
172
|
+
|
173
|
+
begin
|
174
|
+
json = JSON.parse(response.body)
|
175
|
+
rescue => e
|
176
|
+
raise Empire::APIError.new("#{e} #{response.body}")
|
177
|
+
end
|
178
|
+
|
179
|
+
if json["status"] != "OK"
|
180
|
+
raise Empire::APIError.new(json["error"])
|
174
181
|
end
|
175
|
-
|
182
|
+
json
|
176
183
|
end
|
177
184
|
end
|
178
185
|
end
|
data/lib/exceptions.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
class Empire
|
3
|
+
class APIError < RuntimeError; end
|
4
|
+
|
5
|
+
class MissingSecretsError < RuntimeError
|
6
|
+
def initialize(msg = "Secrets must be provided when connecting to a service, or a secrets YAML file must be given when constructing this instance")
|
7
|
+
super
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class MissingEnduserError < RuntimeError
|
12
|
+
def initialize(msg = "Cannot use a materialized view within a session initiated without an enduser")
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class MissingServiceError < RuntimeError
|
18
|
+
def initialize(msg = "Service must be specified")
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/walkthrough.rb
CHANGED
@@ -59,7 +59,7 @@ class Empire
|
|
59
59
|
sql = "SELECT * FROM #{service}.#{table} LIMIT 5"
|
60
60
|
puts "empire.query '#{sql}'"
|
61
61
|
query(sql) do |row|
|
62
|
-
print_row(row
|
62
|
+
print_row(row)
|
63
63
|
end
|
64
64
|
rescue Exception => e
|
65
65
|
puts "Problem with #{service}.#{table}"
|
@@ -77,21 +77,21 @@ class Empire
|
|
77
77
|
puts "empire.materialize_view('view_name', 'SELECT * FROM #{service}.#{table} LIMIT 5')"
|
78
78
|
materialize_view('view_name', "SELECT * FROM #{service}.#{table} LIMIT 5")
|
79
79
|
|
80
|
-
puts "until empire.view_ready? 'view_name'\n sleep 0.
|
80
|
+
puts "until empire.view_ready? 'view_name'\n sleep 0.01\nend"
|
81
81
|
until view_ready? 'view_name'
|
82
82
|
sleep 0.01
|
83
83
|
end
|
84
84
|
|
85
85
|
puts "empire.query 'SELECT * FROM view_name'"
|
86
86
|
query('SELECT * FROM view_name') do |row|
|
87
|
-
print_row(row
|
87
|
+
print_row(row)
|
88
88
|
end
|
89
89
|
|
90
90
|
puts "empire.drop_view 'view_name'"
|
91
91
|
drop_view 'view_name'
|
92
92
|
end
|
93
93
|
|
94
|
-
def print_row(row, max_length)
|
94
|
+
def print_row(row, max_length = 70)
|
95
95
|
fragment = row.slice(0, max_length)
|
96
96
|
if fragment.length == max_length
|
97
97
|
fragment = fragment + "..."
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: empire-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- UPSHOT Data, Inc.
|
@@ -66,16 +66,17 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.18'
|
69
|
-
description: Empire is an API for accessing enterprise
|
70
|
-
Zendesk, Google Apps, etc.
|
71
|
-
service that it supports. Empire makes it easy
|
72
|
-
services into your own enterprise app.
|
69
|
+
description: Ruby client for the Empire API. Empire is an API for accessing enterprise
|
70
|
+
SaaS services such as Salesforce, Zendesk, Google Apps, etc. Empire provides a uniform,
|
71
|
+
database-like interface to every service that it supports. Empire makes it easy
|
72
|
+
to integrate data from multiple enterprise services into your own enterprise app.
|
73
73
|
email: hello@empiredata.co
|
74
74
|
executables: []
|
75
75
|
extensions: []
|
76
76
|
extra_rdoc_files: []
|
77
77
|
files:
|
78
78
|
- lib/empire.rb
|
79
|
+
- lib/exceptions.rb
|
79
80
|
- lib/walkthrough.rb
|
80
81
|
homepage: http://empiredata.co
|
81
82
|
licenses:
|