zillabyte-cli 0.0.9
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 +15 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.md +29 -0
- data/bin/zillabyte +18 -0
- data/lib/zillabyte/api/base.rb +11 -0
- data/lib/zillabyte/api/data.rb +126 -0
- data/lib/zillabyte/api/flows.rb +239 -0
- data/lib/zillabyte/api/locks.rb +4 -0
- data/lib/zillabyte/api/logs.rb +32 -0
- data/lib/zillabyte/api/metrics.rb +48 -0
- data/lib/zillabyte/api/queries.rb +58 -0
- data/lib/zillabyte/api/semantic_tags.rb +24 -0
- data/lib/zillabyte/api/settings.rb +8 -0
- data/lib/zillabyte/api/sources.rb +28 -0
- data/lib/zillabyte/api/zillalogs.rb +66 -0
- data/lib/zillabyte/api.rb +170 -0
- data/lib/zillabyte/auth.rb +155 -0
- data/lib/zillabyte/cli/auth.rb +33 -0
- data/lib/zillabyte/cli/base.rb +161 -0
- data/lib/zillabyte/cli/config.rb +63 -0
- data/lib/zillabyte/cli/counters.rb +61 -0
- data/lib/zillabyte/cli/flows.rb +702 -0
- data/lib/zillabyte/cli/help.rb +137 -0
- data/lib/zillabyte/cli/helpers/data_schema_builder.rb +3 -0
- data/lib/zillabyte/cli/host.rb +21 -0
- data/lib/zillabyte/cli/logs.rb +118 -0
- data/lib/zillabyte/cli/query.rb +172 -0
- data/lib/zillabyte/cli/relations.rb +326 -0
- data/lib/zillabyte/cli/sources.rb +37 -0
- data/lib/zillabyte/cli/templates/js/simple_function.js +33 -0
- data/lib/zillabyte/cli/templates/js/zillabyte.conf.yaml +2 -0
- data/lib/zillabyte/cli/templates/python/requirements.txt +7 -0
- data/lib/zillabyte/cli/templates/python/simple_function.py +27 -0
- data/lib/zillabyte/cli/templates/python/zillabyte.conf.yaml +4 -0
- data/lib/zillabyte/cli/templates/ruby/Gemfile +3 -0
- data/lib/zillabyte/cli/templates/ruby/simple_function.rb +36 -0
- data/lib/zillabyte/cli/templates/ruby/zillabyte.conf.yaml +2 -0
- data/lib/zillabyte/cli/version.rb +11 -0
- data/lib/zillabyte/cli/zillalogs.rb +86 -0
- data/lib/zillabyte/cli.rb +37 -0
- data/lib/zillabyte/command.rb +254 -0
- data/lib/zillabyte/common/progress.rb +17 -0
- data/lib/zillabyte/common/tar.rb +102 -0
- data/lib/zillabyte/common.rb +13 -0
- data/lib/zillabyte/helpers.rb +49 -0
- data/lib/zillabyte/queries.rb +39 -0
- data/lib/zillabyte-cli/version.rb +5 -0
- data/lib/zillabyte-cli.rb +5 -0
- data/zillabyte-cli.gemspec +42 -0
- data/zillabyte_emails.csv +1 -0
- data/zillaconf.json +3 -0
- metadata +278 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
require "zillabyte/cli/base"
|
2
|
+
|
3
|
+
# list commands and display help
|
4
|
+
#
|
5
|
+
class Zillabyte::Command::Help < Zillabyte::Command::Base
|
6
|
+
|
7
|
+
PRIMARY_NAMESPACES = %w( relations query flows logs )
|
8
|
+
|
9
|
+
|
10
|
+
def index(*direct_args)
|
11
|
+
if command = args.shift || direct_args.shift
|
12
|
+
help_for_command(command)
|
13
|
+
else
|
14
|
+
help_for_root
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_command "-h", "help"
|
19
|
+
alias_command "--help", "help"
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def commands_for_namespace(name)
|
24
|
+
Zillabyte::Command.commands.values.select do |command|
|
25
|
+
command[:namespace] == name && command[:command] != name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def namespaces
|
30
|
+
namespaces = Zillabyte::Command.namespaces
|
31
|
+
namespaces
|
32
|
+
end
|
33
|
+
|
34
|
+
def commands
|
35
|
+
Zillabyte::Command.commands
|
36
|
+
end
|
37
|
+
|
38
|
+
def legacy_help_for_command(command)
|
39
|
+
Zillabyte::Command::Help.groups.each do |group|
|
40
|
+
group.each do |cmd, description|
|
41
|
+
return description if cmd.split(" ").first == command
|
42
|
+
end
|
43
|
+
end
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def skip_namespace?(ns)
|
48
|
+
return true if ns[:description] =~ /DEPRECATED:/
|
49
|
+
return true if ns[:description] =~ /HIDDEN:/
|
50
|
+
false
|
51
|
+
end
|
52
|
+
|
53
|
+
def skip_command?(command)
|
54
|
+
return true if command[:help] =~ /DEPRECATED:/
|
55
|
+
return true if command[:help] =~ /^ HIDDEN:/
|
56
|
+
false
|
57
|
+
end
|
58
|
+
|
59
|
+
def primary_namespaces
|
60
|
+
PRIMARY_NAMESPACES.map { |name| namespaces[name] }.compact
|
61
|
+
end
|
62
|
+
|
63
|
+
def additional_namespaces
|
64
|
+
(namespaces.values - primary_namespaces)
|
65
|
+
end
|
66
|
+
|
67
|
+
def summary_for_namespaces(namespaces)
|
68
|
+
size = longest(namespaces.map { |n| n[:name] })
|
69
|
+
namespaces.sort_by {|namespace| namespace[:name]}.each do |namespace|
|
70
|
+
next if skip_namespace?(namespace)
|
71
|
+
name = namespace[:name]
|
72
|
+
puts " %-#{size}s # %s" % [ name, namespace[:description] ]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def help_for_root
|
77
|
+
puts "Usage: zillabyte COMMAND [command-specific-options]"
|
78
|
+
puts
|
79
|
+
puts "Primary help topics, type \"zillabyte help TOPIC\" for more details:"
|
80
|
+
puts
|
81
|
+
summary_for_namespaces(primary_namespaces)
|
82
|
+
puts
|
83
|
+
puts "Additional topics:"
|
84
|
+
puts
|
85
|
+
summary_for_namespaces(additional_namespaces)
|
86
|
+
puts
|
87
|
+
puts "For help getting started, visit http://www.developers.zillabyte.com."
|
88
|
+
puts
|
89
|
+
end
|
90
|
+
|
91
|
+
def help_for_namespace(name)
|
92
|
+
namespace_commands = commands_for_namespace(name)
|
93
|
+
|
94
|
+
unless namespace_commands.empty?
|
95
|
+
size = longest(namespace_commands.map { |c| c[:banner] })
|
96
|
+
namespace_commands.sort_by { |c| c[:banner].to_s }.each do |command|
|
97
|
+
next if skip_command?(command)
|
98
|
+
command[:summary] ||= legacy_help_for_command(command[:command])
|
99
|
+
puts " %-#{size}s # %s" % [ command[:banner], command[:summary] ]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def help_for_command(name)
|
105
|
+
if command_alias = Zillabyte::Command.command_aliases[name]
|
106
|
+
display("Alias: #{name} redirects to #{command_alias}")
|
107
|
+
name = command_alias
|
108
|
+
end
|
109
|
+
if command = commands[name]
|
110
|
+
puts "Usage: zillabyte #{command[:banner]}"
|
111
|
+
|
112
|
+
if command[:help].strip.length > 0
|
113
|
+
help = command[:help].split("\n").reject do |line|
|
114
|
+
line =~ /HIDDEN/
|
115
|
+
end
|
116
|
+
puts help[1..-1].join("\n")
|
117
|
+
else
|
118
|
+
puts
|
119
|
+
puts " " + legacy_help_for_command(name).to_s
|
120
|
+
end
|
121
|
+
puts
|
122
|
+
end
|
123
|
+
|
124
|
+
namespace_commands = commands_for_namespace(name).reject do |command|
|
125
|
+
command[:help] =~ /DEPRECATED/
|
126
|
+
end
|
127
|
+
|
128
|
+
if !namespace_commands.empty?
|
129
|
+
puts "Additional commands, type \"zillabyte help COMMAND\" for more details:"
|
130
|
+
puts
|
131
|
+
help_for_namespace(name)
|
132
|
+
puts
|
133
|
+
elsif command.nil?
|
134
|
+
error "#{name} is not a zillabyte command. See `zillabyte help`."
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# require "zillabyte/cli/base"
|
2
|
+
#
|
3
|
+
# # manage the host that zillabyte connects
|
4
|
+
# #
|
5
|
+
# class Zillabyte::Command::Host < Zillabyte::Command::Base
|
6
|
+
#
|
7
|
+
# # host
|
8
|
+
# #
|
9
|
+
# #
|
10
|
+
# def index
|
11
|
+
# self.list
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# # host:list
|
15
|
+
# #
|
16
|
+
# # list the currently connected host
|
17
|
+
# #
|
18
|
+
# def list
|
19
|
+
# puts ENV["ZILLABYTE_API_HOST"] || "api.zillabyte.com"
|
20
|
+
# end
|
21
|
+
# end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require "zillabyte/cli/base"
|
2
|
+
require "pty"
|
3
|
+
require 'colorize'
|
4
|
+
|
5
|
+
# manage custom logs
|
6
|
+
#
|
7
|
+
class Zillabyte::Command::Logs < Zillabyte::Command::Base
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
# logs:show FLOW_ID [OPERATION]
|
14
|
+
#
|
15
|
+
# shows the logs
|
16
|
+
#
|
17
|
+
# -t, --tail # continuously watches for new results
|
18
|
+
# -v, --verbose LEVEL # sets the verbosity (error, info, debug) (default: info)
|
19
|
+
#
|
20
|
+
def show
|
21
|
+
|
22
|
+
flow_id = options[:flow] || shift_argument
|
23
|
+
operation_id = options[:operation] || shift_argument || '_ALL_'
|
24
|
+
tail = options[:tail]
|
25
|
+
priority = options[:verbose] || 'debug'
|
26
|
+
carry_settings = {
|
27
|
+
:priority => priority
|
28
|
+
}
|
29
|
+
api_options = {}
|
30
|
+
|
31
|
+
error "no id given" if flow_id.nil?
|
32
|
+
|
33
|
+
begin
|
34
|
+
|
35
|
+
res = self.api.logs.get(flow_id, operation_id, api_options)
|
36
|
+
|
37
|
+
carry_settings = show_log_output(res, carry_settings)
|
38
|
+
api_options[:since] = carry_settings[:since]
|
39
|
+
|
40
|
+
if (tail)
|
41
|
+
sleep(5) # HACK
|
42
|
+
end
|
43
|
+
end while(tail)
|
44
|
+
|
45
|
+
end
|
46
|
+
alias_command "log", "logs:show"
|
47
|
+
alias_command "logs", "logs:show"
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def show_log_output(lines, settings = {})
|
58
|
+
|
59
|
+
@colors ||= [:green, :yellow, :magenta, :cyan, :light_black, :light_green, :light_yellow, :light_blue, :light_magenta, :light_cyan]
|
60
|
+
|
61
|
+
max_category_size = 0
|
62
|
+
all_lines = []
|
63
|
+
|
64
|
+
lines.each_pair do |operation, lines|
|
65
|
+
settings[operation] ||= {}
|
66
|
+
settings[operation][:color] ||= @colors.shift
|
67
|
+
lines.each do |line_h|
|
68
|
+
|
69
|
+
line = line_h['line']
|
70
|
+
priority = line_h['priority']
|
71
|
+
date = line_h['date']
|
72
|
+
|
73
|
+
all_lines << {
|
74
|
+
:line => line,
|
75
|
+
:category => operation,
|
76
|
+
:priority => priority,
|
77
|
+
:color => settings[operation][:color],
|
78
|
+
:date => date
|
79
|
+
}
|
80
|
+
max_category_size = [max_category_size, operation.size].max
|
81
|
+
|
82
|
+
if settings[:since]
|
83
|
+
settings[:since] = [date, settings[:since]].max
|
84
|
+
else
|
85
|
+
settings[:since] = date
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
all_lines.sort! do |a,b|
|
93
|
+
a[:date] <=> b[:date]
|
94
|
+
end
|
95
|
+
|
96
|
+
requested_priority = settings[:priority]
|
97
|
+
|
98
|
+
all_lines.each do |h|
|
99
|
+
color = h[:color]
|
100
|
+
|
101
|
+
case h[:priority]
|
102
|
+
when 'error'
|
103
|
+
color = :red if h[:priority] == 'error'
|
104
|
+
when 'info'
|
105
|
+
next if ['error'].member?(requested_priority)
|
106
|
+
when 'system'
|
107
|
+
when 'debug'
|
108
|
+
next if ['info', 'error'].member?(requested_priority)
|
109
|
+
end
|
110
|
+
|
111
|
+
display "#{h[:category].rjust(max_category_size)} #{h[:priority].rjust(6)} - #{h[:line]}".colorize(color)
|
112
|
+
end
|
113
|
+
|
114
|
+
settings
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
require "zillabyte/cli/base"
|
2
|
+
|
3
|
+
# executes queries
|
4
|
+
#
|
5
|
+
class Zillabyte::Command::Query < Zillabyte::Command::Base
|
6
|
+
|
7
|
+
# query:sxp EXPRESSION
|
8
|
+
#
|
9
|
+
# executes queries against the zillabyte corpus
|
10
|
+
#
|
11
|
+
# -o, --offset OFFSET # skips to the offset (default: 0)
|
12
|
+
# -l, --limit LIMIT # sets the result limit (default: 20)
|
13
|
+
# -t, --tail # continuously watches for new results
|
14
|
+
#
|
15
|
+
#Examples:
|
16
|
+
#
|
17
|
+
# $ zillabyte query:sxp "(uses company 'web_css')" --limit 100
|
18
|
+
#
|
19
|
+
def sxp
|
20
|
+
|
21
|
+
opts = {}
|
22
|
+
opts[:offset] = options[:offset] || 0
|
23
|
+
opts[:limit] = options[:limit] || 10
|
24
|
+
tail = options[:tail] || false
|
25
|
+
expression = options[:expression] || shift_argument
|
26
|
+
opts[:since] = options[:since]
|
27
|
+
|
28
|
+
if expression.nil?
|
29
|
+
error "no expression given"
|
30
|
+
end
|
31
|
+
|
32
|
+
seen = {}
|
33
|
+
|
34
|
+
begin
|
35
|
+
|
36
|
+
validate_arguments!
|
37
|
+
res = api.query.sxp(expression, opts)
|
38
|
+
|
39
|
+
filtered = []
|
40
|
+
headings = []
|
41
|
+
if res['rows'].first
|
42
|
+
headings = res['rows'].first.keys
|
43
|
+
rows = res['rows'].each do |obj|
|
44
|
+
new_row = headings.map do |heading|
|
45
|
+
obj[heading]
|
46
|
+
end
|
47
|
+
unless seen[new_row.to_s]
|
48
|
+
filtered << new_row
|
49
|
+
seen[new_row.to_s] = true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
if filtered.size > 0
|
55
|
+
|
56
|
+
table = Terminal::Table.new :headings => headings, :rows => filtered
|
57
|
+
puts table.to_s
|
58
|
+
else
|
59
|
+
unless tail
|
60
|
+
display "no results"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
opts[:since] = DateTime.now
|
65
|
+
|
66
|
+
end while (tail && sleep(5))
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
alias_command "sxp", "query:sxp"
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
# query:sql EXPRESSION
|
76
|
+
#
|
77
|
+
# executes queries against the zillabyte corpus
|
78
|
+
#
|
79
|
+
# -o, --offset OFFSET # skips to the offset (default: 0)
|
80
|
+
# -l, --limit LIMIT # sets the result limit (default: 20)
|
81
|
+
# -t, --tail # continuously watches for new results
|
82
|
+
# -s, --since SINCE # newer records since
|
83
|
+
# --no_truncation # doesn't truncate long strings
|
84
|
+
#
|
85
|
+
#Examples:
|
86
|
+
#
|
87
|
+
# $ zillabyte query:sql "select * from company" --limit 100
|
88
|
+
#
|
89
|
+
def sql
|
90
|
+
|
91
|
+
opts = {}
|
92
|
+
opts[:offset] = options[:offset] || 0
|
93
|
+
opts[:limit] = options[:limit] || 10
|
94
|
+
tail = options[:tail] || false
|
95
|
+
expression = options[:expression] || shift_argument
|
96
|
+
opts[:since] = options[:since]
|
97
|
+
seen = {}
|
98
|
+
|
99
|
+
if expression.nil?
|
100
|
+
error "no expression given"
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
begin
|
105
|
+
|
106
|
+
validate_arguments!
|
107
|
+
res = api.query.sql(expression, opts)
|
108
|
+
|
109
|
+
headings = []
|
110
|
+
filtered = []
|
111
|
+
if res['rows'].first
|
112
|
+
headings = res['rows'].first.keys
|
113
|
+
rows = res['rows'].each do |obj|
|
114
|
+
|
115
|
+
# if obj['since']
|
116
|
+
# opts[:since] = [obj['since'], opts[:since]].compact.max
|
117
|
+
# end
|
118
|
+
|
119
|
+
new_row = headings.map do |heading|
|
120
|
+
if options[:no_truncation]
|
121
|
+
obj[heading]
|
122
|
+
else
|
123
|
+
if obj[heading].to_s.size > 30
|
124
|
+
obj[heading].to_s[0..30] + "..."
|
125
|
+
else
|
126
|
+
obj[heading]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
unless seen[new_row.to_s]
|
132
|
+
filtered << new_row
|
133
|
+
seen[new_row.to_s] = true
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
if filtered.size > 0
|
140
|
+
|
141
|
+
table = Terminal::Table.new :headings => headings, :rows => filtered
|
142
|
+
puts table.to_s
|
143
|
+
opts[:since] = Time.now.utc
|
144
|
+
|
145
|
+
else
|
146
|
+
unless tail
|
147
|
+
display "no results"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
end while (tail && sleep(5))
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
alias_command "sql", "query:sql"
|
157
|
+
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
# rules:init
|
162
|
+
#
|
163
|
+
# initializes an empty rule
|
164
|
+
#
|
165
|
+
def init
|
166
|
+
display "TODO: init new rule"
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
|
172
|
+
end
|