wassup 0.1.2 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/Gemfile.lock +19 -1
- data/README.md +19 -13
- data/bin/wassup +6 -1
- data/docs/.gitignore +20 -0
- data/docs/README.md +41 -0
- data/docs/babel.config.js +3 -0
- data/docs/blog/2021-12-09-welcome/index.md +8 -0
- data/docs/blog/authors.yml +5 -0
- data/docs/docs/Supfile-basics/_category_.json +4 -0
- data/docs/docs/Supfile-basics/understanding-the-supfile.md +50 -0
- data/docs/docs/intro.md +54 -0
- data/docs/docusaurus.config.js +110 -0
- data/docs/package-lock.json +21196 -0
- data/docs/package.json +43 -0
- data/docs/sidebars.js +31 -0
- data/docs/src/components/HomepageFeatures.module.css +10 -0
- data/docs/src/components/HomepageFeatures.tsx +60 -0
- data/docs/src/css/custom.css +28 -0
- data/docs/src/pages/index.module.css +36 -0
- data/docs/src/pages/index.tsx +39 -0
- data/docs/src/pages/markdown-page.md +7 -0
- data/docs/static/.nojekyll +0 -0
- data/docs/static/img/demo-supfile.png +0 -0
- data/docs/static/img/favicon.ico +0 -0
- data/docs/static/img/logo.svg +27 -0
- data/docs/static/img/tutorial/docsVersionDropdown.png +0 -0
- data/docs/static/img/tutorial/localeDropdown.png +0 -0
- data/docs/static/img/tutorial-intro-starter-screenshot.png +0 -0
- data/docs/static/img/undraw_docusaurus_mountain.svg +170 -0
- data/docs/static/img/undraw_docusaurus_react.svg +169 -0
- data/docs/static/img/undraw_docusaurus_tree.svg +1 -0
- data/docs/static/img/wassup-long.png +0 -0
- data/docs/static/img/wassup-screenshot.png +0 -0
- data/docs/static/img/wassup.png +0 -0
- data/docs/static/video/wassup-demo.mov +0 -0
- data/docs/tsconfig.json +7 -0
- data/examples/basic/Supfile +183 -16
- data/examples/debug/Supfile +90 -13
- data/examples/josh-fastlane/Supfile +61 -117
- data/examples/simple/Supfile +17 -0
- data/examples/starter/Supfile +44 -0
- data/lib/wassup/app.rb +167 -6
- data/lib/wassup/color.rb +5 -0
- data/lib/wassup/helpers/circleci.rb +75 -0
- data/lib/wassup/helpers/github.rb +137 -0
- data/lib/wassup/helpers/netlify.rb +70 -0
- data/lib/wassup/helpers/shortcut.rb +114 -0
- data/lib/wassup/pane.rb +244 -134
- data/lib/wassup/pane_builder.rb +60 -1
- data/lib/wassup/version.rb +1 -1
- data/lib/wassup.rb +5 -0
- data/wassup.gemspec +1 -0
- metadata +55 -2
@@ -20,9 +20,13 @@ add_pane do |pane|
|
|
20
20
|
pane.highlight = false
|
21
21
|
|
22
22
|
pane.title = "Stats: fastlane-community"
|
23
|
+
pane.description = [
|
24
|
+
"Highlevel stats from fastlane-community about PR count"
|
25
|
+
]
|
23
26
|
|
24
|
-
pane.interval =
|
25
|
-
pane.
|
27
|
+
pane.interval = 2
|
28
|
+
pane.show_refresh = false
|
29
|
+
pane.content do |builder|
|
26
30
|
days_1 = 0
|
27
31
|
days_7 = 0
|
28
32
|
days_30 = 0
|
@@ -41,13 +45,11 @@ add_pane do |pane|
|
|
41
45
|
days_365 +=1 if days <= 365
|
42
46
|
end
|
43
47
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
"Opened 365 days: #{days_365}"
|
50
|
-
]
|
48
|
+
builder.add_row("Opened today: #{days_1}")
|
49
|
+
builder.add_row("Opened 7 days: #{days_7}")
|
50
|
+
builder.add_row("Opened 30 days: #{days_30}")
|
51
|
+
builder.add_row("Opened 60 days: #{days_60}")
|
52
|
+
builder.add_row("Opened 365 days: #{days_365}")
|
51
53
|
end
|
52
54
|
end
|
53
55
|
|
@@ -63,9 +65,13 @@ add_pane do |pane|
|
|
63
65
|
pane.highlight = false
|
64
66
|
|
65
67
|
pane.title = "Stats: fastlane/fastlane"
|
68
|
+
pane.description = [
|
69
|
+
"Highlevel stats from fastlane/fastlane about PR count"
|
70
|
+
]
|
66
71
|
|
67
|
-
pane.interval =
|
68
|
-
pane.
|
72
|
+
pane.interval = 2
|
73
|
+
pane.show_refresh = false
|
74
|
+
pane.content do |builder|
|
69
75
|
days_1 = 0
|
70
76
|
days_7 = 0
|
71
77
|
days_30 = 0
|
@@ -86,14 +92,12 @@ add_pane do |pane|
|
|
86
92
|
days_60_plus +=1 if days > 60
|
87
93
|
end
|
88
94
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
"More than 60 days: #{days_60_plus}",
|
96
|
-
]
|
95
|
+
builder.add_row("Opened today: #{days_1}")
|
96
|
+
builder.add_row("Opened 7 days: #{days_7}")
|
97
|
+
builder.add_row("Opened 30 days: #{days_30}")
|
98
|
+
builder.add_row("Opened 45 days: #{days_45}")
|
99
|
+
builder.add_row("Opened 60 days: #{days_60}")
|
100
|
+
builder.add_row("More than 60 days: #{days_60_plus}")
|
97
101
|
end
|
98
102
|
end
|
99
103
|
|
@@ -109,48 +113,22 @@ add_pane do |pane|
|
|
109
113
|
pane.highlight = true
|
110
114
|
|
111
115
|
pane.title = "Circle CI - fastlane/fastlane"
|
116
|
+
pane.description = [
|
117
|
+
"Shows workflows from last 14 days"
|
118
|
+
]
|
112
119
|
|
113
120
|
pane.interval = 60 * 5
|
114
|
-
pane.
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
json["items"].select do |item|
|
122
|
-
date = Time.parse(item["updated_at"])
|
123
|
-
days = (Time.now - date).to_i / (24 * 60 * 60)
|
124
|
-
days < 14
|
125
|
-
end.map do |item|
|
126
|
-
id = item["id"]
|
127
|
-
number = item["number"]
|
128
|
-
message = item["vcs"]["commit"]["subject"]
|
129
|
-
login = item["trigger"]["actor"]["login"]
|
130
|
-
|
131
|
-
resp = RestClient::Request.execute(
|
132
|
-
method: :get,
|
133
|
-
url: "https://circleci.com/api/v2/pipeline/#{id}/workflow",
|
134
|
-
headers: { "Circle-Token": ENV["WASSUP_CIRCLE_CI_API_TOKEN"] }
|
135
|
-
)
|
136
|
-
json = JSON.parse(resp)
|
137
|
-
workflow = json["items"].first
|
138
|
-
status = workflow["status"]
|
139
|
-
|
140
|
-
if status == "failed"
|
141
|
-
status = "[fg=red]#{status}[fg=white]"
|
142
|
-
elsif status == "success"
|
143
|
-
status = "[fg=green]#{status}[fg=white]"
|
144
|
-
else
|
145
|
-
status = "[fg=yellow]#{status}[fg=white]"
|
146
|
-
end
|
147
|
-
|
148
|
-
["#{number} (#{status}) by #{login} - #{message}", [item, workflow]]
|
121
|
+
pane.show_refresh = true
|
122
|
+
|
123
|
+
pane.content do |builder|
|
124
|
+
workflows = Helpers::CircleCI.workflows(vcs: 'github', org: 'fastlane', repo: 'fastlane', limit_days: 14)
|
125
|
+
workflows.each do |workflow|
|
126
|
+
display = Helpers::CircleCI::Formatter.workflow(workflow)
|
127
|
+
builder.add_row(display, workflow)
|
149
128
|
end
|
150
129
|
end
|
151
|
-
pane.selection do |data|
|
152
|
-
workflow = data[1]
|
153
130
|
|
131
|
+
pane.selection('enter', 'Opens up CirceCI workflow') do |workflow|
|
154
132
|
slug = workflow["project_slug"]
|
155
133
|
pipeline_number = workflow["pipeline_number"]
|
156
134
|
workflow_id = workflow["id"]
|
@@ -158,8 +136,9 @@ add_pane do |pane|
|
|
158
136
|
url = "https://app.circleci.com/pipelines/#{slug}/#{pipeline_number}/workflows/#{workflow_id}"
|
159
137
|
`open #{url}`
|
160
138
|
end
|
161
|
-
|
162
|
-
|
139
|
+
|
140
|
+
pane.selection('o', 'Opens up version control review URL') do |workflow|
|
141
|
+
pipeline = workflow["pipeline"]
|
163
142
|
url = pipeline["vcs"]["review_url"]
|
164
143
|
`open #{url}`
|
165
144
|
end
|
@@ -177,52 +156,26 @@ add_pane do |pane|
|
|
177
156
|
pane.highlight = true
|
178
157
|
|
179
158
|
pane.title = "Open PRs - fastlane-community"
|
159
|
+
pane.description = [
|
160
|
+
"Open PRs from all the fastlane-community repos"
|
161
|
+
]
|
180
162
|
|
181
163
|
pane.interval = 60 * 5
|
182
|
-
pane.
|
164
|
+
pane.show_refresh = true
|
165
|
+
pane.content do |builder|
|
183
166
|
fastlane_community_prs = []
|
184
167
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
name = repo["name"]
|
194
|
-
full_name = repo["full_name"]
|
195
|
-
|
196
|
-
resp = RestClient::Request.execute(
|
197
|
-
method: :get,
|
198
|
-
url: "https://api.github.com/repos/#{full_name}/pulls",
|
199
|
-
user: ENV["WASSUP_GITHUB_USERNAME"],
|
200
|
-
password: ENV["WASSUP_GITHUB_ACCESS_TOKEN"]
|
201
|
-
)
|
202
|
-
json = JSON.parse(resp)
|
203
|
-
prs = json.map do |pr|
|
204
|
-
fastlane_community_prs << pr
|
205
|
-
|
206
|
-
number = pr["number"]
|
207
|
-
title = pr["title"]
|
208
|
-
created_at = pr["created_at"]
|
209
|
-
|
210
|
-
number_formatted = '%5.5s' % "##{number}"
|
211
|
-
|
212
|
-
date = Time.parse(created_at)
|
213
|
-
days = (Time.now - date).to_i / (24 * 60 * 60)
|
214
|
-
days_formatted = '%3.3s' % days.to_s
|
215
|
-
|
216
|
-
["[fg=yellow]#{number_formatted}[fg=cyan] #{days_formatted}d ago[fg=white] #{title}",pr]
|
217
|
-
end
|
218
|
-
|
219
|
-
{
|
220
|
-
title: name,
|
221
|
-
content: prs
|
222
|
-
}
|
168
|
+
prs = Wassup::Helpers::GitHub.pull_requests(org: 'fastlane-community')
|
169
|
+
prs.each do |pr|
|
170
|
+
fastlane_community_prs << pr
|
171
|
+
|
172
|
+
repo_name = pr["base"]["repo"]["name"]
|
173
|
+
|
174
|
+
display = Helpers::GitHub::Formatter.pr(pr)
|
175
|
+
builder.add_row(display, pr, page: repo_name)
|
223
176
|
end
|
224
177
|
end
|
225
|
-
pane.selection do |data|
|
178
|
+
pane.selection('enter', 'Open PR in web browser') do |data|
|
226
179
|
url = data["html_url"]
|
227
180
|
`open #{url}`
|
228
181
|
end
|
@@ -241,33 +194,24 @@ add_pane do |pane|
|
|
241
194
|
pane.highlight = true
|
242
195
|
|
243
196
|
pane.title = "Open PRs - fastlane/fastlane"
|
197
|
+
pane.description = [
|
198
|
+
"Open PRs from all the fastlane/fastlane repo"
|
199
|
+
]
|
244
200
|
|
245
201
|
pane.interval = 60 * 5
|
246
|
-
pane.
|
202
|
+
pane.show_refresh = true
|
203
|
+
pane.content do |builder|
|
247
204
|
fastlane_prs = []
|
248
205
|
|
249
|
-
|
250
|
-
|
251
|
-
url: "https://api.github.com/repos/fastlane/fastlane/pulls?per_page=100",
|
252
|
-
user: ENV["WASSUP_GITHUB_USERNAME"],
|
253
|
-
password: ENV["WASSUP_GITHUB_ACCESS_TOKEN"]
|
254
|
-
)
|
255
|
-
json = JSON.parse(resp)
|
256
|
-
json.map do |pr|
|
206
|
+
prs = Wassup::Helpers::GitHub.pull_requests(org: 'fastlane', repo: 'fastlane')
|
207
|
+
prs.each do |pr|
|
257
208
|
fastlane_prs << pr
|
258
209
|
|
259
|
-
|
260
|
-
|
261
|
-
created_at = pr["created_at"]
|
262
|
-
|
263
|
-
date = Time.parse(created_at)
|
264
|
-
days = (Time.now - date).to_i / (24 * 60 * 60)
|
265
|
-
days_formatted = '%3.3s' % days.to_s
|
266
|
-
|
267
|
-
["[fg=yellow]##{number}[fg=cyan] #{days_formatted}d ago[fg=white] #{title}",pr]
|
210
|
+
display = Helpers::GitHub::Formatter.pr(pr)
|
211
|
+
builder.add_row(display, pr)
|
268
212
|
end
|
269
213
|
end
|
270
|
-
pane.selection do |data|
|
214
|
+
pane.selection('enter', 'Open PR in browser') do |data|
|
271
215
|
url = data["html_url"]
|
272
216
|
`open #{url}`
|
273
217
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
add_pane do |pane|
|
2
|
+
pane.height = 0.25
|
3
|
+
pane.width = 0.25
|
4
|
+
pane.top = 0
|
5
|
+
pane.left = 0
|
6
|
+
|
7
|
+
pane.highlight = false
|
8
|
+
pane.title = "The Title"
|
9
|
+
|
10
|
+
pane.interval = 1
|
11
|
+
pane.content do |content|
|
12
|
+
date = `date`
|
13
|
+
content.add_row(date)
|
14
|
+
content.add_row(date, page: "page 2")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
add_pane do |pane|
|
2
|
+
pane.height = 0.5
|
3
|
+
pane.width = 0.4
|
4
|
+
pane.top = 0
|
5
|
+
pane.left = 0
|
6
|
+
|
7
|
+
pane.highlight = false
|
8
|
+
pane.title = "Current Time"
|
9
|
+
|
10
|
+
pane.interval = 1
|
11
|
+
pane.content do |content|
|
12
|
+
date = `date`
|
13
|
+
|
14
|
+
content.add_row(date)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
add_pane do |pane|
|
19
|
+
pane.height = 0.5
|
20
|
+
pane.width = 0.6
|
21
|
+
pane.top = 0
|
22
|
+
pane.left = 0.4
|
23
|
+
|
24
|
+
pane.highlight = false
|
25
|
+
pane.title = "Open PRs - fastlane/fastlane"
|
26
|
+
|
27
|
+
pane.interval = 60 * 5
|
28
|
+
pane.content do |content|
|
29
|
+
require 'uri'
|
30
|
+
require 'net/http'
|
31
|
+
require 'json'
|
32
|
+
|
33
|
+
uri = URI('https://api.github.com/repos/fastlane/fastlane/pulls')
|
34
|
+
res = Net::HTTP.get_response(uri)
|
35
|
+
|
36
|
+
JSON.parse(res.body).each do |pr|
|
37
|
+
display = "[fg=cyan]##{pr['number']} - [fg=white]#{pr['title']}"
|
38
|
+
content.add_row(display)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
pane.selection do |pr|
|
42
|
+
`open #{pr['html_url']}`
|
43
|
+
end
|
44
|
+
end
|
data/lib/wassup/app.rb
CHANGED
@@ -20,6 +20,44 @@ module Wassup
|
|
20
20
|
app = App.new(path: path)
|
21
21
|
end
|
22
22
|
|
23
|
+
def self.debug(path:)
|
24
|
+
app = App.new(path: path, debug: true)
|
25
|
+
|
26
|
+
app.panes.each do |k, pane|
|
27
|
+
puts "#{k} - #{pane.title}"
|
28
|
+
end
|
29
|
+
|
30
|
+
puts ""
|
31
|
+
puts "Choose a pane to run:"
|
32
|
+
|
33
|
+
selection = $stdin.gets.chomp.to_s
|
34
|
+
|
35
|
+
pane = app.panes[selection]
|
36
|
+
if pane.nil?
|
37
|
+
puts "That was not a valid option"
|
38
|
+
else
|
39
|
+
puts "Going to run: \"#{pane.title}\""
|
40
|
+
|
41
|
+
builder = Wassup::PaneBuilder::ContentBuilder.new(pane.contents)
|
42
|
+
pane.content_block.call(builder)
|
43
|
+
|
44
|
+
builder.contents.each_with_index do |content, idx|
|
45
|
+
puts "#########################"
|
46
|
+
puts "# #{content.title || (idx == 0 ? "Default" : "<No Title>")}"
|
47
|
+
puts "#########################"
|
48
|
+
|
49
|
+
content.data.each do |data|
|
50
|
+
puts data.display
|
51
|
+
.split(/\[.*?\]/).join('') # Removes colors but make this an option probably
|
52
|
+
end
|
53
|
+
|
54
|
+
puts ""
|
55
|
+
puts ""
|
56
|
+
puts ""
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
23
61
|
def add_pane
|
24
62
|
pane_builder = Wassup::PaneBuilder.new
|
25
63
|
yield(pane_builder)
|
@@ -31,27 +69,62 @@ module Wassup
|
|
31
69
|
pane_builder.top,
|
32
70
|
pane_builder.left,
|
33
71
|
title: pane_builder.title,
|
72
|
+
description: pane_builder.description,
|
34
73
|
highlight: pane_builder.highlight,
|
35
74
|
focus_number: number,
|
36
75
|
interval: pane_builder.interval,
|
76
|
+
show_refresh: pane_builder.show_refresh,
|
37
77
|
content_block: pane_builder.content_block,
|
38
|
-
selection_blocks: pane_builder.selection_blocks
|
78
|
+
selection_blocks: pane_builder.selection_blocks,
|
79
|
+
selection_blocks_description: pane_builder.selection_blocks_description,
|
80
|
+
debug: debug
|
39
81
|
)
|
40
82
|
pane.focus_handler = @focus_handler
|
41
83
|
@panes[number.to_s] = pane
|
42
84
|
end
|
43
85
|
|
44
|
-
|
86
|
+
attr_accessor :panes
|
87
|
+
attr_accessor :debug
|
88
|
+
|
89
|
+
def initialize(path:, debug: false)
|
45
90
|
@hidden_pane = nil
|
91
|
+
@help_pane = nil
|
46
92
|
@focused_pane = nil
|
47
93
|
@panes = {}
|
94
|
+
@debug = debug
|
95
|
+
|
96
|
+
if debug
|
97
|
+
self.start_debug(path)
|
98
|
+
else
|
99
|
+
self.start_curses(path)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def start_debug(path)
|
104
|
+
begin
|
105
|
+
eval(File.new(path).read)
|
106
|
+
rescue => err
|
107
|
+
puts err
|
108
|
+
puts err.backtrace
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def start_curses(path)
|
113
|
+
@redraw_panes = false
|
48
114
|
|
49
115
|
# TODO: this could maybe get replaced with selection_blocks now
|
50
116
|
@focus_handler = Proc.new do |input|
|
117
|
+
is_help_open = !@help_pane.nil?
|
118
|
+
|
51
119
|
if input == "q"
|
52
120
|
exit
|
121
|
+
elsif input == "?"
|
122
|
+
toggle_help
|
123
|
+
next true
|
53
124
|
end
|
54
125
|
|
126
|
+
next true if is_help_open
|
127
|
+
|
55
128
|
if (pane = @panes[input.to_s])
|
56
129
|
@focused_pane.focused = false
|
57
130
|
|
@@ -73,8 +146,7 @@ module Wassup
|
|
73
146
|
end
|
74
147
|
|
75
148
|
begin
|
76
|
-
|
77
|
-
@hidden_pane = Pane.new(0, 0, 0, 0, highlight: false, focus_number: 0, interval: nil, content_block: nil, selection_blocks: nil)
|
149
|
+
@hidden_pane = Pane.new(0, 0, 0, 0, highlight: false, focus_number: 0, interval: nil, show_refresh: false, content_block: nil, selection_blocks: nil, selection_blocks_description: nil)
|
78
150
|
@hidden_pane.focus_handler = @focus_handler
|
79
151
|
@focused_pane = @hidden_pane
|
80
152
|
|
@@ -82,13 +154,102 @@ module Wassup
|
|
82
154
|
|
83
155
|
loop do
|
84
156
|
@focused_pane.handle_keyboard
|
85
|
-
|
86
|
-
|
157
|
+
|
158
|
+
if @redraw_panes
|
159
|
+
Curses.clear
|
160
|
+
Curses.refresh
|
161
|
+
end
|
162
|
+
|
163
|
+
# This isn't ideal to now refresh other panes when help is open
|
164
|
+
# But it prevents things from getting drawn where the help is showing
|
165
|
+
if @help_pane.nil?
|
166
|
+
@panes.each do |id, pane|
|
167
|
+
pane.redraw() if @redraw_panes
|
168
|
+
pane.refresh()
|
169
|
+
end
|
170
|
+
@redraw_panes = false
|
171
|
+
else
|
172
|
+
@help_pane.refresh()
|
87
173
|
end
|
88
174
|
end
|
89
175
|
ensure
|
90
176
|
Curses.close_screen
|
91
177
|
end
|
92
178
|
end
|
179
|
+
|
180
|
+
def row_help
|
181
|
+
{
|
182
|
+
"j" => "moves row highlight down",
|
183
|
+
"k" => "moves row highlight up",
|
184
|
+
"enter" => "perform selection on highlighted row"
|
185
|
+
}
|
186
|
+
end
|
187
|
+
|
188
|
+
def page_help
|
189
|
+
{
|
190
|
+
"h" => "previous page in pane",
|
191
|
+
"l" => "next page in pane"
|
192
|
+
}
|
193
|
+
end
|
194
|
+
|
195
|
+
def toggle_help
|
196
|
+
if @help_pane.nil?
|
197
|
+
if @focused_pane == @hidden_pane
|
198
|
+
content_block = Proc.new do |content|
|
199
|
+
items = [
|
200
|
+
"Welcome to Wassup!",
|
201
|
+
"",
|
202
|
+
"Press any number key to focus a pane",
|
203
|
+
"",
|
204
|
+
row_help.map { |k,v| "#{k} - #{v}"},
|
205
|
+
"",
|
206
|
+
page_help.map { |k,v| "#{k} - #{v}"},
|
207
|
+
"",
|
208
|
+
"? - opens help for focused pane"
|
209
|
+
].flatten
|
210
|
+
|
211
|
+
items.each do |item|
|
212
|
+
content.add_row(item)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
else
|
216
|
+
content_block = Proc.new do |content|
|
217
|
+
hash = {}
|
218
|
+
|
219
|
+
hash = hash.merge(row_help)
|
220
|
+
hash = hash.merge(@focused_pane.selection_blocks_description)
|
221
|
+
|
222
|
+
row_help.map { |k,v| "#{k} - #{v}"}
|
223
|
+
|
224
|
+
copy_error = @focused_pane.caught_error.nil? ? [] : [
|
225
|
+
"c - copy stacktrace to clipboard",
|
226
|
+
""
|
227
|
+
]
|
228
|
+
|
229
|
+
items = [
|
230
|
+
@focused_pane.description,
|
231
|
+
"",
|
232
|
+
hash.map do |k,v|
|
233
|
+
"#{k} - #{v}"
|
234
|
+
end,
|
235
|
+
"",
|
236
|
+
copy_error,
|
237
|
+
page_help.map { |k,v| "#{k} - #{v}"},
|
238
|
+
].flatten.compact
|
239
|
+
|
240
|
+
items.each do |item|
|
241
|
+
content.add_row(item)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
# Maybe find a way to add some a second border or an clear border to add more space to show its floating
|
247
|
+
@help_pane = Pane.new(0.5, 0.5, 0.25, 0.25, title: "Help", highlight: false, focus_number: nil, interval: 100, show_refresh: false, content_block: content_block, selection_blocks: nil, selection_blocks_description: nil)
|
248
|
+
else
|
249
|
+
@help_pane.close
|
250
|
+
@help_pane = nil
|
251
|
+
@redraw_panes = true
|
252
|
+
end
|
253
|
+
end
|
93
254
|
end
|
94
255
|
end
|
data/lib/wassup/color.rb
CHANGED
@@ -17,6 +17,8 @@ module Wassup
|
|
17
17
|
NORMAL = 20
|
18
18
|
HIGHLIGHT = 21
|
19
19
|
|
20
|
+
GRAY = 22
|
21
|
+
|
20
22
|
BORDER = 20
|
21
23
|
BORDER_FOCUS = 7
|
22
24
|
|
@@ -44,6 +46,7 @@ module Wassup
|
|
44
46
|
Curses.init_pair(Pair::RED, Curses::COLOR_RED, 0)
|
45
47
|
Curses.init_pair(Pair::WHITE, Pair::WHITE, 0)
|
46
48
|
Curses.init_pair(Pair::YELLOW, Curses::COLOR_YELLOW, 0)
|
49
|
+
Curses.init_pair(Pair::GRAY, Curses::COLOR_WHITE, 0)
|
47
50
|
end
|
48
51
|
|
49
52
|
def initialize(string_name)
|
@@ -64,6 +67,8 @@ module Wassup
|
|
64
67
|
Pair::WHITE
|
65
68
|
when "yellow"
|
66
69
|
Pair::YELLOW
|
70
|
+
when "gray"
|
71
|
+
Pair::GRAY
|
67
72
|
else
|
68
73
|
if string_name.to_i.to_s == string_name
|
69
74
|
string_name.to_i
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Wassup
|
2
|
+
module Helpers
|
3
|
+
module CircleCI
|
4
|
+
def self.workflows(vcs:, org:, repo:, limit_days: nil)
|
5
|
+
require 'json'
|
6
|
+
require 'rest-client'
|
7
|
+
|
8
|
+
resp = RestClient::Request.execute(
|
9
|
+
method: :get,
|
10
|
+
url: "https://circleci.com/api/v2/project/#{vcs}/#{org}/#{repo}/pipeline",
|
11
|
+
headers: { "Circle-Token": ENV["WASSUP_CIRCLE_CI_API_TOKEN"] }
|
12
|
+
)
|
13
|
+
json = JSON.parse(resp)
|
14
|
+
|
15
|
+
return json["items"].select do |item|
|
16
|
+
if !limit_days.nil?
|
17
|
+
date = Time.parse(item["updated_at"])
|
18
|
+
days = (Time.now - date).to_i / (24 * 60 * 60)
|
19
|
+
days < limit_days
|
20
|
+
else
|
21
|
+
true
|
22
|
+
end
|
23
|
+
end.map do |pipeline|
|
24
|
+
id = pipeline["id"]
|
25
|
+
|
26
|
+
resp = RestClient::Request.execute(
|
27
|
+
method: :get,
|
28
|
+
url: "https://circleci.com/api/v2/pipeline/#{id}/workflow",
|
29
|
+
headers: { "Circle-Token": ENV["WASSUP_CIRCLE_CI_API_TOKEN"] }
|
30
|
+
)
|
31
|
+
json = JSON.parse(resp)
|
32
|
+
workflow = json["items"].first
|
33
|
+
|
34
|
+
if workflow
|
35
|
+
workflow["pipeline"] = pipeline
|
36
|
+
end
|
37
|
+
|
38
|
+
workflow
|
39
|
+
end.compact
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module Wassup
|
46
|
+
module Helpers
|
47
|
+
module CircleCI
|
48
|
+
module Formatter
|
49
|
+
def self.workflow(workflow)
|
50
|
+
pipeline = workflow["pipeline"]
|
51
|
+
number = pipeline["number"]
|
52
|
+
message = (pipeline["vcs"]["commit"] || {})["subject"]
|
53
|
+
login = pipeline["trigger"]["actor"]["login"]
|
54
|
+
|
55
|
+
status = workflow["status"]
|
56
|
+
status_formatted = '%-8.8s' % status
|
57
|
+
|
58
|
+
number_formatted = '%-7.7s' % "##{number}"
|
59
|
+
|
60
|
+
if status == "failed"
|
61
|
+
status_formatted = "[fg=red]#{status_formatted}[fg=white]"
|
62
|
+
elsif status == "success"
|
63
|
+
status_formatted = "[fg=green]#{status_formatted}[fg=white]"
|
64
|
+
else
|
65
|
+
status_formatted = "[fg=yellow]#{status_formatted}[fg=white]"
|
66
|
+
end
|
67
|
+
|
68
|
+
display = "[fg=yellow]#{number_formatted} [fg=while]#{status_formatted} [fg=white]#{login} [fg=gray]#{message}"
|
69
|
+
|
70
|
+
return display
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|