wassup 0.1.2 → 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/.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
|