gfspark 0.0.1 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/README.md +50 -6
- data/images/gfspark_screenshot.png +0 -0
- data/lib/gfspark.rb +8 -2
- data/lib/gfspark/app.rb +25 -5
- data/lib/gfspark/config.rb +14 -5
- data/lib/gfspark/connection.rb +2 -1
- data/lib/gfspark/graph.rb +39 -25
- data/lib/gfspark/version.rb +2 -1
- metadata +5 -4
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Growth Forecast on Terminal.
|
4
4
|
|
5
|
-
gfspark is CLI graph viewer for Growth Forecast.
|
5
|
+
gfspark is a CLI graph viewer for Growth Forecast.
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -18,8 +18,14 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
$ gem install gfspark
|
20
20
|
|
21
|
+
## ScreenShots
|
22
|
+
|
23
|
+
<img src='https://github.com/yuroyoro/gfspark/raw/master/images/gfspark_screenshot.png' width='600'/>
|
24
|
+
|
21
25
|
## Usage
|
22
26
|
|
27
|
+
gfspark : Growth Forecast on Terminal
|
28
|
+
|
23
29
|
usage: gfspark <url|path|service_name> [section_name] [graph_name]
|
24
30
|
|
25
31
|
Examples:
|
@@ -32,15 +38,53 @@ Or install it yourself as:
|
|
32
38
|
-u, --user=USER
|
33
39
|
-p, --pass=PASS
|
34
40
|
-t=VALUE Range of Graph
|
35
|
-
--
|
36
|
-
--
|
37
|
-
|
38
|
-
-
|
39
|
-
-
|
41
|
+
--gmode=VALUE graph mode: gauge or subtract (default is gauge)
|
42
|
+
--from=VALUE Start date of graph (2011/12/08 12:10:00) required if t=c or sc
|
43
|
+
--to=VALUE End date of graph (2011/12/08 12:10:00) required if t=c or sc
|
44
|
+
-h, --height=VALUE graph height (default 10
|
45
|
+
-w, --width=VALUE graph width (default is deteced from $COLUMNS)
|
46
|
+
-c, --color=VALUE Color of graph bar (black/red/green/yellow/blue/magenta/cyan/white)
|
47
|
+
-n, --non-fullwidth-font Show bar symbol as fullwidth
|
40
48
|
--sslnoverify don't verify SSL
|
41
49
|
--sslcacert=v SSL CA CERT
|
42
50
|
--debug debug print
|
43
51
|
|
52
|
+
-t option detail:
|
53
|
+
y : Year (1day avg)
|
54
|
+
m : Month (2hour avg)
|
55
|
+
w : Week (30min avg)
|
56
|
+
3d : 3 Days (5min avg)
|
57
|
+
s3d : 3 Days (5min avg)
|
58
|
+
d : Day (5min avg)
|
59
|
+
sd : Day (1min avg)
|
60
|
+
8h : 8 Hours (5min avg)
|
61
|
+
s8h : 8 Hours (1min avg)
|
62
|
+
4h : 4 Hours (5min avg)
|
63
|
+
s4h : 4 Hours (1min avg)
|
64
|
+
h : Hour (5min avg),
|
65
|
+
sh : Hour (1min avg)
|
66
|
+
n : Half Day (5min avg)
|
67
|
+
sn : Half Day (1min avg)
|
68
|
+
c : Custom (5min avg)
|
69
|
+
sc : Custom (1min avg)
|
70
|
+
|
71
|
+
gfspark does not supports "COMPLEX GRAPH".
|
72
|
+
if graph output is broken, try `--non-fullwidth-font` option.
|
73
|
+
For example, your Terminal font is "Rickty", then it'll be fix graph output problem.
|
74
|
+
|
75
|
+
## Configuration
|
76
|
+
|
77
|
+
gfspark load default settings from `.gfspark` file.
|
78
|
+
This configuration file is searched from current dirctory to pararents, or your home directory(~/.gfspark).
|
79
|
+
|
80
|
+
.gfspark is YAML file. It's contents is like bellow
|
81
|
+
|
82
|
+
url: http://your.growthforecast.com/
|
83
|
+
color: red
|
84
|
+
username: "your basic auth username"
|
85
|
+
password: "your basic auth password"
|
86
|
+
non_fullwidth_font: true
|
87
|
+
|
44
88
|
## Contributing
|
45
89
|
|
46
90
|
1. Fork it
|
Binary file
|
data/lib/gfspark.rb
CHANGED
@@ -27,10 +27,16 @@ module Gfspark
|
|
27
27
|
app = nil
|
28
28
|
begin
|
29
29
|
app = Gfspark::App.new(argv)
|
30
|
-
if app.
|
30
|
+
if app && app.debug
|
31
|
+
puts "App Instance Variables ----"
|
32
|
+
pp app
|
33
|
+
puts "---------------------------"
|
34
|
+
end
|
35
|
+
|
36
|
+
if app && app.valid
|
31
37
|
status = app.execute
|
32
38
|
else
|
33
|
-
app.help
|
39
|
+
app.help if app
|
34
40
|
return false
|
35
41
|
end
|
36
42
|
rescue => e
|
data/lib/gfspark/app.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
class Gfspark::App
|
2
3
|
include Term::ANSIColor
|
3
4
|
include ::Gfspark::Config
|
@@ -17,12 +18,18 @@ class Gfspark::App
|
|
17
18
|
@options = load_default_settings
|
18
19
|
try_url(args) || try_path(args) || try_default(args)
|
19
20
|
|
20
|
-
|
21
|
-
|
21
|
+
required_args = [:url, :service, :section, :graph]
|
22
|
+
unless required_args.map(&:to_s).map(&"@".method(:+)).map(&method(:instance_variable_get)).inject(true, :&)
|
23
|
+
puts "Invalid Arguments: check arguments or your .gfspark file"
|
24
|
+
required_args.each do |n|
|
25
|
+
puts " #{n} is required" unless instance_variable_get("@#{n}")
|
26
|
+
end
|
27
|
+
puts ""
|
22
28
|
@valid = false
|
23
29
|
return
|
24
30
|
end
|
25
31
|
|
32
|
+
@valid = true
|
26
33
|
detect_width_and_height!
|
27
34
|
set_ssl_options!
|
28
35
|
end
|
@@ -31,17 +38,30 @@ class Gfspark::App
|
|
31
38
|
json = fetch(:xport)
|
32
39
|
summary = fetch(:summary)
|
33
40
|
|
34
|
-
|
41
|
+
url = to_url(:view_graph)
|
42
|
+
render(json, summary, url)
|
35
43
|
true
|
36
44
|
end
|
37
45
|
|
46
|
+
def to_url(api)
|
47
|
+
url = "#{@url}/#{api.to_s}/#{@service}/#{@section}/#{@graph}"
|
48
|
+
queries = {}
|
49
|
+
queries[:t] = @options[:t] || "d"
|
50
|
+
queries[:width] = @width
|
51
|
+
queries[:gmode] = @options[:gmode] if @options[:gmode]
|
52
|
+
queries[:from] = @options[:from] if @options[:from]
|
53
|
+
queries[:to] = @options[:to] if @options[:to]
|
54
|
+
"#{url}?#{queries.map{|k,v| "#{k}=#{v}"}.join("&")}"
|
55
|
+
end
|
56
|
+
|
38
57
|
def fetch(api)
|
39
58
|
url = "#{@url}/#{api.to_s}/#{@service}/#{@section}/#{@graph}"
|
40
59
|
queries = {}
|
41
60
|
queries[:t] = @options[:t] || "d"
|
42
61
|
queries[:width] = @width
|
43
|
-
queries[:
|
44
|
-
queries[:
|
62
|
+
queries[:gmode] = @options[:gmode] if @options[:gmode]
|
63
|
+
queries[:from] = @options[:from] if @options[:from].nil?
|
64
|
+
queries[:to] = @options[:to] if @options[:to].nil?
|
45
65
|
|
46
66
|
json = fetch_json(url, {}, queries)
|
47
67
|
end
|
data/lib/gfspark/config.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
module Gfspark::Config
|
2
3
|
|
3
4
|
def try_url(args)
|
@@ -60,6 +61,11 @@ module Gfspark::Config
|
|
60
61
|
MSG
|
61
62
|
puts " Options:"
|
62
63
|
puts @opt_parse_obj.summarize
|
64
|
+
puts <<-MSG
|
65
|
+
|
66
|
+
-t option detail:
|
67
|
+
#{Gfspark::Graph::RANGE_DEFS.map{|k,v| sprintf(" %3s : %s", k, v)}.join("\n")}
|
68
|
+
MSG
|
63
69
|
end
|
64
70
|
|
65
71
|
def parse_options(args)
|
@@ -102,6 +108,7 @@ module Gfspark::Config
|
|
102
108
|
return YAML.load_file filename if File.exists? filename
|
103
109
|
end
|
104
110
|
|
111
|
+
COLORS = [ :black, :red, :green, :yellow, :blue, :magenta, :cyan, :white]
|
105
112
|
|
106
113
|
def opt_parser
|
107
114
|
OptionParser.new{|opts|
|
@@ -110,11 +117,13 @@ module Gfspark::Config
|
|
110
117
|
opts.on('-u=USER', '--user=USER'){|v| @options[:username] = v }
|
111
118
|
opts.on('-p=PASS', '--pass=PASS'){|v| @options[:password] = v }
|
112
119
|
opts.on("-t=VALUE", "Range of Graph"){|v| @options[:t] = v}
|
113
|
-
opts.on("--
|
114
|
-
opts.on("--
|
115
|
-
opts.on("
|
116
|
-
opts.on("-
|
117
|
-
opts.on("-
|
120
|
+
opts.on("--gmode=VALUE", "graph mode: gauge or subtract (default is gauge)"){|v| @options[:gmode] = v}
|
121
|
+
opts.on("--from=VALUE", "Start date of graph (2011/12/08 12:10:00) required if t=c or sc"){|v| @options[:from] = v}
|
122
|
+
opts.on("--to=VALUE", "End date of graph (2011/12/08 12:10:00) required if t=c or sc"){|v| @options[:to] = v}
|
123
|
+
opts.on("-h=VALUE", "--height=VALUE", "graph height (default 10"){|v| @options[:height] = v}
|
124
|
+
opts.on("-w=VALUE", "--width=VALUE", "graph width (default is deteced from $COLUMNS)"){|v| @options[:width] = v}
|
125
|
+
opts.on("-c=VALUE", "--color=VALUE", "Color of graph bar (#{COLORS.join("/")})"){|v| @options[:color] = v if COLORS.include?(v.to_sym)}
|
126
|
+
opts.on("-n", "--non-fullwidth-font", "Show bar symbol as fullwidth"){ @options[:non_fullwidth_font] = true }
|
118
127
|
opts.on("--sslnoverify", "don't verify SSL"){|v| @options[:sslNoVerify] = true}
|
119
128
|
opts.on("--sslcacert=v", "SSL CA CERT"){|v| @options[:sslCaCert] = v}
|
120
129
|
opts.on("--debug", "debug print"){@debug= true }
|
data/lib/gfspark/connection.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
module Gfspark::Connection
|
2
3
|
@ssl_options = {}
|
3
4
|
|
@@ -14,7 +15,7 @@ module Gfspark::Connection
|
|
14
15
|
|
15
16
|
def fetch_json(url, options = {}, params = {})
|
16
17
|
response = send_request(url, {},options, params, :get)
|
17
|
-
raise response.code unless response_success?(response)
|
18
|
+
raise "#{response.code} #{response.msg}" unless response_success?(response)
|
18
19
|
json = JSON.parse(response.body)
|
19
20
|
|
20
21
|
if @debug
|
data/lib/gfspark/graph.rb
CHANGED
@@ -1,16 +1,27 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
module Gfspark::Graph
|
2
3
|
@height = 20
|
3
4
|
|
4
|
-
BARS = ["
|
5
|
-
def bar(val, unit)
|
5
|
+
BARS = [" ", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█" ]
|
6
|
+
def bar(val, unit, non_fullwidth_font = false)
|
6
7
|
n = (val.to_f/unit).ceil
|
7
8
|
@height.times.map{|i|
|
8
9
|
x = n - (i * 8)
|
9
|
-
|
10
|
+
if x <= 0
|
11
|
+
BARS.first
|
12
|
+
else
|
13
|
+
bar_symbol = if x < 8
|
14
|
+
BARS[x]
|
15
|
+
else
|
16
|
+
BARS.last
|
17
|
+
end
|
18
|
+
bar_symbol += " " if non_fullwidth_font
|
19
|
+
bar_symbol
|
20
|
+
end
|
10
21
|
}
|
11
22
|
end
|
12
23
|
|
13
|
-
def render(json, summary)
|
24
|
+
def render(json, summary, url = nil)
|
14
25
|
rows = json['rows']
|
15
26
|
max = rows.flatten.compact.max
|
16
27
|
max_val = (max / 8).ceil * 8
|
@@ -20,12 +31,14 @@ module Gfspark::Graph
|
|
20
31
|
e = Time.at(json["end_timestamp"].to_i).strftime("%Y-%m-%d %H:%M:%S")
|
21
32
|
|
22
33
|
puts " #{blue(json["column_names"].first)}"
|
34
|
+
puts " #{yellow(url)}"
|
23
35
|
puts ""
|
24
36
|
puts " #{period_title} #{s} - #{e}"
|
25
37
|
puts ""
|
26
38
|
|
27
39
|
result = []
|
28
|
-
|
40
|
+
|
41
|
+
rows.flatten.map{|row| bar(row, unit, @options[:non_fullwidth_font])}.transpose.reverse.each_with_index do |row, i|
|
29
42
|
i = (@height- i)
|
30
43
|
label = i.even? ? sprintf("%.1f", unit * i * 8) : ""
|
31
44
|
line = row.join
|
@@ -43,30 +56,31 @@ module Gfspark::Graph
|
|
43
56
|
|
44
57
|
def period_title
|
45
58
|
case @options[:t]
|
46
|
-
when "c", "sc" then sprintf(
|
59
|
+
when "c", "sc" then sprintf("%s to %s", @options[:from], @options[:to])
|
47
60
|
else RANGES[@options[:t]]
|
48
61
|
end
|
49
62
|
end
|
50
63
|
|
51
|
-
|
52
|
-
"y"
|
53
|
-
"m"
|
54
|
-
"w"
|
55
|
-
"3d"
|
56
|
-
"s3d"
|
57
|
-
"d"
|
58
|
-
"sd"
|
59
|
-
"8h"
|
60
|
-
"s8h"
|
61
|
-
"4h"
|
62
|
-
"s4h"
|
63
|
-
"h"
|
64
|
-
"sh"
|
65
|
-
"n"
|
66
|
-
"sn"
|
67
|
-
"c"
|
68
|
-
"sc"
|
69
|
-
|
64
|
+
RANGE_DEFS = [
|
65
|
+
["y" , 'Year (1day avg)'],
|
66
|
+
["m" , 'Month (2hour avg)'],
|
67
|
+
["w" , 'Week (30min avg)'],
|
68
|
+
["3d" , '3 Days (5min avg)'],
|
69
|
+
["s3d" , '3 Days (5min avg)'],
|
70
|
+
["d" , 'Day (5min avg)'],
|
71
|
+
["sd" , 'Day (1min avg)' ],
|
72
|
+
["8h" , '8 Hours (5min avg)'],
|
73
|
+
["s8h" , '8 Hours (1min avg)' ],
|
74
|
+
["4h" , '4 Hours (5min avg)'],
|
75
|
+
["s4h" , '4 Hours (1min avg)' ],
|
76
|
+
["h" , 'Hour (5min avg), '],
|
77
|
+
["sh" , 'Hour (1min avg)' ],
|
78
|
+
["n" , 'Half Day (5min avg)'],
|
79
|
+
["sn" , 'Half Day (1min avg)'],
|
80
|
+
["c" , "Custom (5min avg)"],
|
81
|
+
["sc" , "Custom (1min avg)"]
|
82
|
+
]
|
83
|
+
RANGES = Hash[*RANGE_DEFS.flatten]
|
70
84
|
|
71
85
|
def range_arg?(t)
|
72
86
|
RANGES.keys.include? t
|
data/lib/gfspark/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gfspark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tomohito Ozaki
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-05-
|
18
|
+
date: 2013-05-29 00:00:00 +09:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -77,6 +77,7 @@ files:
|
|
77
77
|
- Rakefile
|
78
78
|
- bin/gfspark
|
79
79
|
- gfspark.gemspec
|
80
|
+
- images/gfspark_screenshot.png
|
80
81
|
- lib/gfspark.rb
|
81
82
|
- lib/gfspark/app.rb
|
82
83
|
- lib/gfspark/config.rb
|