zillabyte-cli 0.0.24 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/lib/#zillabyte-cli.rb# +5 -0
- data/lib/zillabyte/api/apps.rb +16 -132
- data/lib/zillabyte/api/components.rb +115 -0
- data/lib/zillabyte/api/flows.rb +121 -0
- data/lib/zillabyte/api/keys.rb +70 -0
- data/lib/zillabyte/api.rb +15 -2
- data/lib/zillabyte/auth.rb +43 -16
- data/lib/zillabyte/cli/#logs.rb# +12 -0
- data/lib/zillabyte/cli/#repl.rb# +43 -0
- data/lib/zillabyte/cli/apps.rb +52 -893
- data/lib/zillabyte/cli/auth.rb +3 -8
- data/lib/zillabyte/cli/base.rb +28 -7
- data/lib/zillabyte/cli/components.rb +245 -0
- data/lib/zillabyte/cli/flows.rb +549 -0
- data/lib/zillabyte/cli/git.rb +38 -0
- data/lib/zillabyte/cli/help.rb +11 -4
- data/lib/zillabyte/cli/keys.rb +177 -0
- data/lib/zillabyte/cli/query.rb +0 -1
- data/lib/zillabyte/cli/relations.rb +2 -1
- data/lib/zillabyte/cli/templates/{js → apps/js}/simple_function.js +0 -0
- data/lib/zillabyte/cli/templates/{js → apps/js}/zillabyte.conf.yaml +0 -0
- data/lib/zillabyte/cli/templates/apps/python/app.py +17 -0
- data/lib/zillabyte/cli/templates/{python → apps/python}/requirements.txt +0 -0
- data/lib/zillabyte/cli/templates/{python → apps/python}/zillabyte.conf.yaml +1 -1
- data/lib/zillabyte/cli/templates/{ruby → apps/ruby}/Gemfile +0 -0
- data/lib/zillabyte/cli/templates/{ruby → apps/ruby}/app.rb +1 -1
- data/lib/zillabyte/cli/templates/{ruby → apps/ruby}/zillabyte.conf.yaml +0 -0
- data/lib/zillabyte/cli/templates/python/{simple_function.py → #simple_function.py#} +3 -6
- data/lib/zillabyte/common/session.rb +3 -1
- data/lib/zillabyte/helpers.rb +64 -1
- data/lib/zillabyte/runner/app_runner.rb +226 -0
- data/lib/zillabyte/runner/component_operation.rb +529 -0
- data/lib/zillabyte/runner/component_runner.rb +244 -0
- data/lib/zillabyte/runner/multilang_operation.rb +1133 -0
- data/lib/zillabyte/runner/operation.rb +11 -0
- data/lib/zillabyte/runner.rb +6 -0
- data/lib/zillabyte-cli/version.rb +1 -1
- data/zillabyte-cli.gemspec +1 -0
- metadata +83 -52
data/lib/zillabyte/cli/auth.rb
CHANGED
@@ -10,22 +10,17 @@ class Zillabyte::Command::Auth < Zillabyte::Command::Base
|
|
10
10
|
|
11
11
|
# auth:login
|
12
12
|
#
|
13
|
-
#
|
13
|
+
# set the authentication token
|
14
14
|
#
|
15
|
-
# --auth_token TOKEN # provide the token
|
16
15
|
def login
|
17
|
-
|
18
|
-
Zillabyte::Auth.login( options[:auth_token])
|
19
|
-
else
|
20
|
-
Zillabyte::Auth.ask_for_and_save_credentials
|
21
|
-
end
|
16
|
+
Zillabyte::Auth.ask_for_and_save_credentials
|
22
17
|
end
|
23
18
|
|
24
19
|
alias_command "login", "auth:login"
|
25
20
|
|
26
21
|
# auth:logout
|
27
22
|
#
|
28
|
-
#
|
23
|
+
# clear the authentication token
|
29
24
|
#
|
30
25
|
def logout
|
31
26
|
Zillabyte::Auth.logout
|
data/lib/zillabyte/cli/base.rb
CHANGED
@@ -3,8 +3,8 @@ require "zillabyte/api"
|
|
3
3
|
require "zillabyte/command"
|
4
4
|
require "action_view"
|
5
5
|
|
6
|
-
class Zillabyte::Command::Base
|
7
|
-
include Zillabyte::Helpers
|
6
|
+
class Zillabyte::Command::Base
|
7
|
+
include Zillabyte::Helpers
|
8
8
|
include ActionView::Helpers::DateHelper
|
9
9
|
|
10
10
|
def self.namespace
|
@@ -19,8 +19,12 @@ class Zillabyte::Command::Base
|
|
19
19
|
@options = options
|
20
20
|
end
|
21
21
|
|
22
|
+
def api
|
23
|
+
@__api ||= Zillabyte::API.new(:api_key => Zillabyte::Auth.api_key, :session => self)
|
24
|
+
end
|
25
|
+
|
22
26
|
|
23
|
-
protected
|
27
|
+
protected
|
24
28
|
|
25
29
|
def self.inherited(klass)
|
26
30
|
unless klass == Zillabyte::Command::Base
|
@@ -140,10 +144,27 @@ protected
|
|
140
144
|
Zillabyte::Command.validate_arguments!
|
141
145
|
end
|
142
146
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
+
|
148
|
+
def git_remotes(base_dir=Dir.pwd)
|
149
|
+
remotes = {}
|
150
|
+
original_dir = Dir.pwd
|
151
|
+
Dir.chdir(base_dir)
|
152
|
+
|
153
|
+
return unless File.exists?(".git")
|
154
|
+
git("remote -v").split("\n").each do |remote|
|
155
|
+
name, url, method = remote.split(/\s/)
|
156
|
+
if url =~ /^git@#{Zillabyte::Auth.git_host}(?:[\.\w]*):([\w\d-]+)\.git$/
|
157
|
+
remotes[name] = $1
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
Dir.chdir(original_dir)
|
162
|
+
if remotes.empty?
|
163
|
+
nil
|
164
|
+
else
|
165
|
+
remotes
|
166
|
+
end
|
167
|
+
end
|
147
168
|
|
148
169
|
|
149
170
|
def session
|
@@ -0,0 +1,245 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require "zillabyte/cli/flows"
|
3
|
+
require "zillabyte/cli/config"
|
4
|
+
require "zillabyte/common"
|
5
|
+
|
6
|
+
# manage custom components
|
7
|
+
#
|
8
|
+
class Zillabyte::Command::Components < Zillabyte::Command::Flows
|
9
|
+
|
10
|
+
# components
|
11
|
+
#
|
12
|
+
# list custom components
|
13
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
14
|
+
#
|
15
|
+
def index
|
16
|
+
self.list
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
# components
|
22
|
+
#
|
23
|
+
# list custom components
|
24
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
25
|
+
def list
|
26
|
+
type = options[:output_type]
|
27
|
+
|
28
|
+
headings = ["id", "name", "state", "inputs", "outputs"]
|
29
|
+
rows = api.component.list.map do |row|
|
30
|
+
if headings.size == 0
|
31
|
+
headings = row.keys
|
32
|
+
headings.delete("rel_dir")
|
33
|
+
end
|
34
|
+
|
35
|
+
v = row.values_at *headings
|
36
|
+
v
|
37
|
+
end
|
38
|
+
|
39
|
+
display "components:\n" if type.nil?
|
40
|
+
display TableOutputBuilder.build_table(headings, rows, type)
|
41
|
+
display "Total number of components: " + rows.length.to_s if type.nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
# components:pull ID DIR
|
46
|
+
#
|
47
|
+
# pulls a component source to a directory.
|
48
|
+
#
|
49
|
+
# --force # pulls even if the directory exists
|
50
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
51
|
+
# --directory DIR # Directory of the component
|
52
|
+
#
|
53
|
+
# Examples:
|
54
|
+
#
|
55
|
+
# $ zillabyte components:pull .
|
56
|
+
#
|
57
|
+
def pull
|
58
|
+
super
|
59
|
+
end
|
60
|
+
|
61
|
+
# components:status [DIR]
|
62
|
+
#
|
63
|
+
# fetches detailed status of the component
|
64
|
+
#
|
65
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
66
|
+
# --directory DIR # Directory of the component
|
67
|
+
#
|
68
|
+
def status
|
69
|
+
super
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
# components:delete ID
|
75
|
+
#
|
76
|
+
# deletes a component.
|
77
|
+
#
|
78
|
+
# -f, --force # don't ask for confirmation
|
79
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
80
|
+
#
|
81
|
+
def delete
|
82
|
+
super
|
83
|
+
end
|
84
|
+
|
85
|
+
# components:kill ID
|
86
|
+
#
|
87
|
+
# kills the given component rpc
|
88
|
+
#
|
89
|
+
# --config CONFIG_FILE # use the given config file
|
90
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
91
|
+
#
|
92
|
+
def kill
|
93
|
+
id = options[:id] || shift_argument
|
94
|
+
type = options[:output_type]
|
95
|
+
|
96
|
+
if id.nil?
|
97
|
+
id = read_name_from_conf(options)
|
98
|
+
options[:is_name] = true
|
99
|
+
elsif !(id =~ /^\d*$/)
|
100
|
+
options[:is_name] = true
|
101
|
+
end
|
102
|
+
|
103
|
+
display "Killing component ##{id}...please wait..." if type.nil?
|
104
|
+
api.components.kill(id, options)
|
105
|
+
|
106
|
+
if type == "json"
|
107
|
+
display "{}"
|
108
|
+
else
|
109
|
+
display "Component ##{id} killed"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# components:info [DIR]
|
114
|
+
#
|
115
|
+
# outputs the info for the component in the dir.
|
116
|
+
#
|
117
|
+
# --pretty # Pretty prints the info output
|
118
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
119
|
+
# --directory DIR # Directory of the component
|
120
|
+
#
|
121
|
+
def info
|
122
|
+
super
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
# components:test
|
127
|
+
#
|
128
|
+
# tests a local component with sample data
|
129
|
+
#
|
130
|
+
# --config CONFIG_FILE # use the given config file
|
131
|
+
# --input INPUT_FILE # uses a CSV for component input
|
132
|
+
# --output OUTPUT_FILE # write output to a CSV
|
133
|
+
# --directory DIR # app directory
|
134
|
+
#
|
135
|
+
def test
|
136
|
+
super
|
137
|
+
end
|
138
|
+
|
139
|
+
# components:prep [DIR]
|
140
|
+
#
|
141
|
+
# performs any necessary initialization for the component
|
142
|
+
#
|
143
|
+
# --directory DIR # component directory
|
144
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
145
|
+
#
|
146
|
+
def prep
|
147
|
+
super
|
148
|
+
end
|
149
|
+
|
150
|
+
# components:errors ID
|
151
|
+
#
|
152
|
+
# show recent errors generated by the componeny rpc
|
153
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
154
|
+
#
|
155
|
+
def errors
|
156
|
+
super
|
157
|
+
end
|
158
|
+
|
159
|
+
# components:live_run [OPERATION_NAME] [PIPE_NAME] [DIR]
|
160
|
+
#
|
161
|
+
# runs a local component with live data
|
162
|
+
#
|
163
|
+
# --config CONFIG_FILE # use the given config file
|
164
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
165
|
+
# --directory DIR # Directory of the component
|
166
|
+
#
|
167
|
+
# HIDDEN:
|
168
|
+
def live_run
|
169
|
+
super
|
170
|
+
end
|
171
|
+
|
172
|
+
# components:rpc [ID] [QUERY_1_INPUT_1,QUERY_1_INPUT_2,...] [QUERY_2_INPUT_1,QUERY_2_INPUT_2,...], ...
|
173
|
+
#
|
174
|
+
# runs a component as an rpc
|
175
|
+
#
|
176
|
+
# --output_type OUTPUT_TYPE # specify an output type i.e. json
|
177
|
+
def rpc
|
178
|
+
component_id = options[:id] || shift_argument
|
179
|
+
|
180
|
+
if component_id.nil?
|
181
|
+
component_id = read_name_from_conf(options)
|
182
|
+
options[:is_name] = true
|
183
|
+
elsif !(component_id =~ /^\d*$/)
|
184
|
+
options[:is_name] = true
|
185
|
+
end
|
186
|
+
|
187
|
+
type = options[:output_type]
|
188
|
+
|
189
|
+
component_args = []
|
190
|
+
while(true) do
|
191
|
+
next_arg = shift_argument
|
192
|
+
break if next_arg.nil?
|
193
|
+
component_args << next_arg.split(",")
|
194
|
+
end
|
195
|
+
|
196
|
+
res = api.components.rpc(component_id, {:rpc_inputs => component_args})
|
197
|
+
if res['error']
|
198
|
+
error("error: #{res['error_message']}", type)
|
199
|
+
else
|
200
|
+
if type.nil?
|
201
|
+
display "Request submitted to component ##{res['id']}. The run ids are (query: run_id):"
|
202
|
+
res["execute_ids"].each do |pars, id|
|
203
|
+
display "\t #{pars}: #{id}"
|
204
|
+
end
|
205
|
+
display "Please use \"zillabyte components:results [run id]\" to check on the status of your query and to retrieve your results.\nYou may also wish to check \"zillabyte logs\" for errors."
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
# components:results [ID] [RUN_ID]
|
211
|
+
#
|
212
|
+
# gets the result of an rpc request if it is done running, otherwise gets current run status
|
213
|
+
#
|
214
|
+
def results
|
215
|
+
component_id = options[:id] || shift_argument
|
216
|
+
|
217
|
+
if component_id.nil?
|
218
|
+
component_id = read_name_from_conf(options)
|
219
|
+
options[:is_name] = true
|
220
|
+
elsif !(component_id =~ /^\d*$/)
|
221
|
+
options[:is_name] = true
|
222
|
+
end
|
223
|
+
|
224
|
+
type = options[:output_type]
|
225
|
+
|
226
|
+
run_ids = []
|
227
|
+
while(true) do
|
228
|
+
next_arg = shift_argument
|
229
|
+
break if next_arg.nil?
|
230
|
+
run_ids << next_arg
|
231
|
+
end
|
232
|
+
|
233
|
+
res = api.components.get_rpc_results(component_id, {:execute_ids => run_ids})
|
234
|
+
if res['error']
|
235
|
+
error("error: #{res['error_message']}", type)
|
236
|
+
else
|
237
|
+
if type.nil?
|
238
|
+
res["results"].each do |id, hash|
|
239
|
+
display "#{id}: #{hash["status"]}"
|
240
|
+
display "\t #{hash["data"]}" if hash["status"] == "complete"
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|