wassup 0.2.0 → 0.3.2
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 +2 -0
- data/Gemfile.lock +19 -1
- data/README.md +11 -11
- 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 +18 -0
- data/examples/josh-fastlane/Supfile +37 -94
- data/examples/simple/Supfile +17 -0
- data/examples/starter/Supfile +44 -0
- data/lib/wassup/app.rb +166 -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 +85 -16
- data/lib/wassup/pane_builder.rb +14 -1
- data/lib/wassup/version.rb +1 -1
- data/lib/wassup.rb +5 -0
- data/wassup.gemspec +1 -0
- metadata +59 -6
@@ -0,0 +1,137 @@
|
|
1
|
+
module Wassup
|
2
|
+
module Helpers
|
3
|
+
module GitHub
|
4
|
+
require 'json'
|
5
|
+
require 'rest-client'
|
6
|
+
|
7
|
+
# https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests
|
8
|
+
def self.issues(org:, repo:nil, q: nil)
|
9
|
+
q_parts = []
|
10
|
+
|
11
|
+
if repo.nil?
|
12
|
+
q_parts << "org:#{org}"
|
13
|
+
else
|
14
|
+
q_parts << "repo:#{org}/#{repo}"
|
15
|
+
end
|
16
|
+
|
17
|
+
if q
|
18
|
+
q_parts << q
|
19
|
+
end
|
20
|
+
|
21
|
+
q = q_parts.join(' ')
|
22
|
+
|
23
|
+
items = []
|
24
|
+
|
25
|
+
resp = RestClient::Request.execute(
|
26
|
+
method: :get,
|
27
|
+
url: "https://api.github.com/search/issues?q=#{q}",
|
28
|
+
user: ENV["WASSUP_GITHUB_USERNAME"],
|
29
|
+
password: ENV["WASSUP_GITHUB_ACCESS_TOKEN"],
|
30
|
+
headers: { "Accept": "application/vnd.github.v3+json", "Content-Type": "application/json" },
|
31
|
+
)
|
32
|
+
partial_items = JSON.parse(resp)["items"]
|
33
|
+
items += partial_items
|
34
|
+
|
35
|
+
return items
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.repos(org:)
|
39
|
+
resp = RestClient::Request.execute(
|
40
|
+
method: :get,
|
41
|
+
url: "https://api.github.com/orgs/#{org}/repos",
|
42
|
+
user: ENV["WASSUP_GITHUB_USERNAME"],
|
43
|
+
password: ENV["WASSUP_GITHUB_ACCESS_TOKEN"]
|
44
|
+
)
|
45
|
+
return JSON.parse(resp)
|
46
|
+
end
|
47
|
+
|
48
|
+
Repo = Struct.new(:org, :repo)
|
49
|
+
def self.pull_requests(org:, repo: nil)
|
50
|
+
repos = []
|
51
|
+
if repo.nil?
|
52
|
+
repos += self.repos(org: org).map do |repo|
|
53
|
+
Repo.new(org, repo["name"])
|
54
|
+
end
|
55
|
+
else
|
56
|
+
repos << Repo.new(org, repo)
|
57
|
+
end
|
58
|
+
|
59
|
+
return repos.map do |repo|
|
60
|
+
resp = RestClient::Request.execute(
|
61
|
+
method: :get,
|
62
|
+
url: "https://api.github.com/repos/#{repo.org}/#{repo.repo}/pulls?per_page=100",
|
63
|
+
user: ENV["WASSUP_GITHUB_USERNAME"],
|
64
|
+
password: ENV["WASSUP_GITHUB_ACCESS_TOKEN"]
|
65
|
+
)
|
66
|
+
|
67
|
+
JSON.parse(resp)
|
68
|
+
end.flatten(1)
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.releases(org:, repo:)
|
72
|
+
resp = RestClient::Request.execute(
|
73
|
+
method: :get,
|
74
|
+
url: "https://api.github.com/repos/#{org}/#{repo}/releases",
|
75
|
+
user: ENV["WASSUP_GITHUB_USERNAME"],
|
76
|
+
password: ENV["WASSUP_GITHUB_ACCESS_TOKEN"]
|
77
|
+
)
|
78
|
+
|
79
|
+
return JSON.parse(resp)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
module Wassup
|
86
|
+
module Helpers
|
87
|
+
module GitHub
|
88
|
+
module Formatter
|
89
|
+
def self.issue(issue, show_repo: false, show_interactions: false)
|
90
|
+
self.pr(issue, show_repo: show_repo, show_interactions: show_interactions)
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.pr(pr, show_repo: false, show_interactions: false)
|
94
|
+
number = pr["number"]
|
95
|
+
title = pr["title"]
|
96
|
+
created_at = pr["created_at"]
|
97
|
+
|
98
|
+
repo_name = ""
|
99
|
+
if show_repo
|
100
|
+
repo_url_parts = pr["repository_url"].split("/")
|
101
|
+
repo_name = "[fg=gray]#{repo_url_parts.last} "
|
102
|
+
end
|
103
|
+
|
104
|
+
interactions = ""
|
105
|
+
if show_interactions
|
106
|
+
interaction_count = pr["comments"] + pr["reactions"]["total_count"]
|
107
|
+
interactions = "[fg=red]#{interaction_count} "
|
108
|
+
end
|
109
|
+
|
110
|
+
number_formatted = '%-7.7s' % "##{number}"
|
111
|
+
|
112
|
+
date = Time.parse(created_at)
|
113
|
+
days = (Time.now - date).to_i / (24 * 60 * 60)
|
114
|
+
days_formatted = '%3.3s' % days.to_s
|
115
|
+
|
116
|
+
display = "[fg=yellow]#{number_formatted}[fg=cyan] #{days_formatted}d ago #{interactions}#{repo_name}[fg=white]#{title}"
|
117
|
+
|
118
|
+
return display
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.release(release)
|
122
|
+
tag_name = release["tag_name"]
|
123
|
+
name = release["name"]
|
124
|
+
published_at = release["published_at"]
|
125
|
+
|
126
|
+
date = Time.parse(published_at)
|
127
|
+
days = (Time.now - date).to_i / (24 * 60 * 60)
|
128
|
+
days_formatted = '%3.3s' % days.to_s
|
129
|
+
|
130
|
+
display = "[fg=yellow]#{tag_name} [fg=cyan]#{days_formatted}d ago [fg=gray]#{name}"
|
131
|
+
|
132
|
+
return display
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Wassup
|
2
|
+
module Helpers
|
3
|
+
module Netlify
|
4
|
+
require 'json'
|
5
|
+
require 'rest-client'
|
6
|
+
|
7
|
+
def self.deploys(site_id:)
|
8
|
+
resp = RestClient::Request.execute(
|
9
|
+
method: :get,
|
10
|
+
url: "https://api.netlify.com/api/v1/sites/#{site_id}/deploys",
|
11
|
+
headers: { "Authorization": "Bearer #{ENV['WASSUP_NETLIFY_TOKEN']}", "User-Agent": "Wassup" }
|
12
|
+
)
|
13
|
+
return JSON.parse(resp)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module Wassup
|
21
|
+
module Helpers
|
22
|
+
module Netlify
|
23
|
+
module Formatter
|
24
|
+
def self.deploy(deploy)
|
25
|
+
review_id = deploy["review_id"]
|
26
|
+
context = deploy["context"]
|
27
|
+
state = deploy["state"]
|
28
|
+
error_message = deploy["error_message"]
|
29
|
+
branch = deploy["branch"]
|
30
|
+
commit_ref = deploy["commit_ref"] || "HEAD"
|
31
|
+
url = deploy["deploy_url"]
|
32
|
+
|
33
|
+
if error_message.to_s.downcase.include?("canceled")
|
34
|
+
state = "cancelled"
|
35
|
+
end
|
36
|
+
|
37
|
+
color = "green"
|
38
|
+
if state == "building"
|
39
|
+
color = "yellow"
|
40
|
+
elsif state == "enqueued"
|
41
|
+
color = "magenta"
|
42
|
+
elsif state == "cancelled"
|
43
|
+
color = "gray"
|
44
|
+
elsif state == "error"
|
45
|
+
color = "red"
|
46
|
+
end
|
47
|
+
|
48
|
+
display_context = context.split('-').map(&:capitalize).join(' ')
|
49
|
+
display_context = "[fg=#{color}]#{display_context}"
|
50
|
+
|
51
|
+
if !review_id.nil?
|
52
|
+
display_context += " - ##{review_id}"
|
53
|
+
end
|
54
|
+
|
55
|
+
display_context += "[fg=gray]"
|
56
|
+
display_context += " (#{state})"
|
57
|
+
display_context += "[fg=white]"
|
58
|
+
|
59
|
+
if !branch.nil? && !commit_ref.nil?
|
60
|
+
display_context += "[fg=cyan]: #{branch}@#{commit_ref[0...7]}"
|
61
|
+
end
|
62
|
+
|
63
|
+
display = "#{display_context}"
|
64
|
+
|
65
|
+
return display
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module Wassup
|
2
|
+
module Helpers
|
3
|
+
module Shortcut
|
4
|
+
require 'json'
|
5
|
+
require 'rest-client'
|
6
|
+
|
7
|
+
def self.members
|
8
|
+
endpoint = "https://api.app.shortcut.com"
|
9
|
+
resp = RestClient::Request.execute(
|
10
|
+
method: :get,
|
11
|
+
url: "#{endpoint}/api/v3/members",
|
12
|
+
headers: { "Shortcut-Token": ENV['WASSUP_SHORTCUT_TOKEN'], "Content-Type": "application/json" }
|
13
|
+
)
|
14
|
+
return JSON.parse(resp)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.workflows
|
18
|
+
endpoint = "https://api.app.shortcut.com"
|
19
|
+
resp = RestClient::Request.execute(
|
20
|
+
method: :get,
|
21
|
+
url: "#{endpoint}/api/v3/workflows",
|
22
|
+
headers: { "Shortcut-Token": ENV['WASSUP_SHORTCUT_TOKEN'], "Content-Type": "application/json" }
|
23
|
+
)
|
24
|
+
return JSON.parse(resp)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.search_stories(query:, page_size: 25)
|
28
|
+
endpoint = "https://api.app.shortcut.com"
|
29
|
+
|
30
|
+
members = self.members
|
31
|
+
workflows = self.workflows
|
32
|
+
|
33
|
+
stories = []
|
34
|
+
|
35
|
+
resp = RestClient::Request.execute(
|
36
|
+
method: :get,
|
37
|
+
url: "#{endpoint}/api/v3/search/stories",
|
38
|
+
payload: { page_size: page_size, query: query },
|
39
|
+
headers: { "Shortcut-Token": ENV['WASSUP_SHORTCUT_TOKEN'], "Content-Type": "application/json" }
|
40
|
+
)
|
41
|
+
json = JSON.parse(resp)
|
42
|
+
stories += json["data"]
|
43
|
+
|
44
|
+
next_url = json["next"]
|
45
|
+
while !next_url.nil?
|
46
|
+
resp = RestClient::Request.execute(
|
47
|
+
method: :get,
|
48
|
+
url: "#{endpoint}#{next_url}",
|
49
|
+
headers: { "Shortcut-Token": ENV['WASSUP_SHORTCUT_TOKEN'], "Content-Type": "application/json" }
|
50
|
+
)
|
51
|
+
json = JSON.parse(resp)
|
52
|
+
stories += json["data"]
|
53
|
+
next_url = json["next"]
|
54
|
+
end
|
55
|
+
|
56
|
+
stories = stories.map do |story|
|
57
|
+
story["followers"] = story["follower_ids"].map do |owner_id|
|
58
|
+
members.find do |member|
|
59
|
+
member["id"] == owner_id
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
story["owners"] = story["owner_ids"].map do |owner_id|
|
64
|
+
members.find do |member|
|
65
|
+
member["id"] == owner_id
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
if (workflow_id = story["workflow_id"]) && (workflow_state_id = story["workflow_state_id"])
|
70
|
+
workflow = workflows.find do |workflow|
|
71
|
+
workflow["id"] == workflow_id
|
72
|
+
end
|
73
|
+
|
74
|
+
story["workflow"] = workflow
|
75
|
+
if workflow
|
76
|
+
story["workflow_state"] = workflow["states"].find do |workflow_state|
|
77
|
+
workflow_state["id"] == workflow_state_id
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
story
|
83
|
+
end
|
84
|
+
|
85
|
+
return stories
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
module Wassup
|
93
|
+
module Helpers
|
94
|
+
module Shortcut
|
95
|
+
module Formatter
|
96
|
+
def self.story(story)
|
97
|
+
id = story["id"]
|
98
|
+
name = story["name"]
|
99
|
+
state = story["workflow_state"]["name"]
|
100
|
+
|
101
|
+
mention_name = (story["owners"] || {}).map do |member|
|
102
|
+
member["profile"]["mention_name"]
|
103
|
+
end.join(", ")
|
104
|
+
|
105
|
+
id_formatted = '%-7.7s' % "##{id}"
|
106
|
+
|
107
|
+
display = "[fg=yellow]#{id_formatted} [fg=cyan]#{state} [fg=white]#{mention_name} [fg=gray]#{name}"
|
108
|
+
|
109
|
+
return display
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
data/lib/wassup/pane.rb
CHANGED
@@ -11,6 +11,7 @@ module Wassup
|
|
11
11
|
attr_accessor :contents
|
12
12
|
|
13
13
|
attr_accessor :title
|
14
|
+
attr_accessor :description
|
14
15
|
|
15
16
|
attr_accessor :focused
|
16
17
|
attr_accessor :focus_number
|
@@ -28,6 +29,9 @@ module Wassup
|
|
28
29
|
attr_accessor :last_refreshed
|
29
30
|
attr_accessor :content_block
|
30
31
|
attr_accessor :selection_blocks
|
32
|
+
attr_accessor :selection_blocks_description
|
33
|
+
|
34
|
+
attr_accessor :caught_error
|
31
35
|
|
32
36
|
attr_accessor :content_thread
|
33
37
|
attr_accessor :show_refresh
|
@@ -60,14 +64,17 @@ module Wassup
|
|
60
64
|
end
|
61
65
|
end
|
62
66
|
|
63
|
-
def initialize(height, width, top, left, title: nil, highlight: true, focus_number: nil, interval:, show_refresh:, content_block:, selection_blocks:)
|
64
|
-
self.win_height = Curses.lines * height
|
65
|
-
self.win_width = Curses.cols * width
|
66
|
-
self.win_top = Curses.lines * top
|
67
|
-
self.win_left = Curses.cols * left
|
67
|
+
def initialize(height, width, top, left, title: nil, description: nil, highlight: true, focus_number: nil, interval:, show_refresh:, content_block:, selection_blocks:, selection_blocks_description:, debug: false)
|
68
68
|
|
69
|
-
|
70
|
-
|
69
|
+
if !debug
|
70
|
+
self.win_height = Curses.lines * height
|
71
|
+
self.win_width = Curses.cols * width
|
72
|
+
self.win_top = Curses.lines * top
|
73
|
+
self.win_left = Curses.cols * left
|
74
|
+
|
75
|
+
self.win = Curses::Window.new(self.win_height, self.win_width, self.win_top, self.win_left)
|
76
|
+
self.setup_subwin()
|
77
|
+
end
|
71
78
|
|
72
79
|
self.focused = false
|
73
80
|
self.focus_number = focus_number
|
@@ -82,14 +89,18 @@ module Wassup
|
|
82
89
|
|
83
90
|
self.selected_view_index = 0
|
84
91
|
|
85
|
-
|
86
|
-
|
92
|
+
if !debug
|
93
|
+
self.win.refresh
|
94
|
+
self.subwin.refresh
|
95
|
+
end
|
87
96
|
|
88
97
|
self.title = title
|
98
|
+
self.description = description
|
89
99
|
|
90
100
|
self.interval = interval
|
91
101
|
self.content_block = content_block
|
92
102
|
self.selection_blocks = selection_blocks || {}
|
103
|
+
self.selection_blocks_description = selection_blocks_description || {}
|
93
104
|
end
|
94
105
|
|
95
106
|
def setup_subwin
|
@@ -130,6 +141,16 @@ module Wassup
|
|
130
141
|
self.subwin.scrollok(true)
|
131
142
|
end
|
132
143
|
|
144
|
+
def close
|
145
|
+
unless self.subwin.nil?
|
146
|
+
self.subwin.clear
|
147
|
+
self.subwin.close
|
148
|
+
end
|
149
|
+
|
150
|
+
self.win.clear
|
151
|
+
self.win.close
|
152
|
+
end
|
153
|
+
|
133
154
|
def needs_refresh?
|
134
155
|
return false if self.content_block.nil?
|
135
156
|
return false if self.interval.nil?
|
@@ -159,12 +180,20 @@ module Wassup
|
|
159
180
|
return !self.content_thread.nil?
|
160
181
|
end
|
161
182
|
|
183
|
+
def redraw
|
184
|
+
self.update_box
|
185
|
+
self.update_title
|
186
|
+
self.load_current_view()
|
187
|
+
end
|
188
|
+
|
162
189
|
def refresh(force: false)
|
163
190
|
if force
|
164
191
|
self.last_refreshed = nil
|
165
192
|
end
|
166
193
|
|
167
|
-
|
194
|
+
if !needs_refresh?
|
195
|
+
return
|
196
|
+
end
|
168
197
|
|
169
198
|
thread = self.content_thread
|
170
199
|
if !thread.nil?
|
@@ -176,15 +205,27 @@ module Wassup
|
|
176
205
|
elsif thread.status == false
|
177
206
|
rtn = thread.value
|
178
207
|
if rtn.is_a?(Ope)
|
179
|
-
|
180
|
-
|
208
|
+
self.caught_error = rtn.error
|
209
|
+
content = Wassup::Pane::Content.new("Overview")
|
181
210
|
content.add_row("[fg=red]Error during refersh[fg=white]")
|
182
211
|
content.add_row("[fg=red]at #{Time.now}[fg=while]")
|
183
212
|
content.add_row("")
|
184
213
|
content.add_row("[fg=yellow]Will try again next interval[fg=white]")
|
185
214
|
|
186
|
-
|
215
|
+
content_directions = Wassup::Pane::Content.new("Directions")
|
216
|
+
content_directions.add_row("1. Press 'c' to copy the stacktrace")
|
217
|
+
content_directions.add_row("2. Debug pane content block with:")
|
218
|
+
content_directions.add_row(" $: wassup --debug")
|
219
|
+
content_directions.add_row("3. Stacktrace viewable in next page")
|
220
|
+
|
221
|
+
content_stacktrace = Wassup::Pane::Content.new("Stacktrace")
|
222
|
+
rtn.error.backtrace.each do |line|
|
223
|
+
content_stacktrace.add_row(line)
|
224
|
+
end
|
225
|
+
|
226
|
+
self.refresh_content([content, content_directions, content_stacktrace])
|
187
227
|
elsif rtn.is_a?(Wassup::PaneBuilder::ContentBuilder)
|
228
|
+
self.caught_error = nil
|
188
229
|
self.refresh_content(rtn.contents)
|
189
230
|
end
|
190
231
|
|
@@ -213,7 +254,8 @@ module Wassup
|
|
213
254
|
end
|
214
255
|
|
215
256
|
def refresh_content(contents)
|
216
|
-
|
257
|
+
self.contents = contents
|
258
|
+
|
217
259
|
self.load_current_view()
|
218
260
|
self.last_refreshed = Time.now
|
219
261
|
|
@@ -234,6 +276,13 @@ module Wassup
|
|
234
276
|
self.update_title()
|
235
277
|
end
|
236
278
|
|
279
|
+
def highlight
|
280
|
+
if self.caught_error
|
281
|
+
return true
|
282
|
+
end
|
283
|
+
return @highlight
|
284
|
+
end
|
285
|
+
|
237
286
|
attr_accessor :refresh_char_count
|
238
287
|
def refresh_char
|
239
288
|
return "" unless self.show_refresh
|
@@ -276,7 +325,12 @@ module Wassup
|
|
276
325
|
return unless self.should_box
|
277
326
|
|
278
327
|
title = self.title || "<No Title>"
|
279
|
-
|
328
|
+
|
329
|
+
if self.focus_number.nil?
|
330
|
+
full_title = title
|
331
|
+
else
|
332
|
+
full_title = "#{self.focus_number} - #{title}"
|
333
|
+
end
|
280
334
|
|
281
335
|
self.win.setpos(0, 3)
|
282
336
|
self.win.addstr(full_title)
|
@@ -293,7 +347,13 @@ module Wassup
|
|
293
347
|
def update_box
|
294
348
|
return unless self.should_box
|
295
349
|
|
296
|
-
self.
|
350
|
+
show_focused = self.focused
|
351
|
+
|
352
|
+
if self.focus_number.nil?
|
353
|
+
show_focused = true
|
354
|
+
end
|
355
|
+
|
356
|
+
self.win.attrset(show_focused ? Curses.color_pair(Wassup::Color::Pair::BORDER_FOCUS) : Curses.color_pair(Wassup::Color::Pair::BORDER))
|
297
357
|
self.win.box()
|
298
358
|
self.win.attrset(Curses.color_pair(Wassup::Color::Pair::NORMAL))
|
299
359
|
|
@@ -501,6 +561,15 @@ module Wassup
|
|
501
561
|
self.scroll_right
|
502
562
|
elsif input == "r"
|
503
563
|
self.refresh(force: true)
|
564
|
+
elsif input == "c"
|
565
|
+
if !self.caught_error.nil?
|
566
|
+
text = self.caught_error.backtrace.join("\n")
|
567
|
+
if RUBY_PLATFORM.downcase =~ /win32/
|
568
|
+
IO.popen('clip', 'w') { |pipe| pipe.puts text }
|
569
|
+
else
|
570
|
+
IO.popen('pbcopy', 'w') { |pipe| pipe.puts text }
|
571
|
+
end
|
572
|
+
end
|
504
573
|
else
|
505
574
|
selection_block = self.selection_blocks[input]
|
506
575
|
if !selection_block.nil? && !self.highlighted_line.nil?
|
data/lib/wassup/pane_builder.rb
CHANGED
@@ -9,12 +9,14 @@ module Wassup
|
|
9
9
|
attr_accessor :highlight
|
10
10
|
|
11
11
|
attr_accessor :title
|
12
|
+
attr_accessor :description
|
12
13
|
|
13
14
|
attr_accessor :show_refresh
|
14
15
|
|
15
16
|
attr_accessor :interval
|
16
17
|
attr_accessor :content_block
|
17
18
|
attr_accessor :selection_blocks
|
19
|
+
attr_accessor :selection_blocks_description
|
18
20
|
|
19
21
|
class ContentBuilder
|
20
22
|
attr_accessor :contents
|
@@ -70,13 +72,24 @@ module Wassup
|
|
70
72
|
@interval = 60 * 5
|
71
73
|
|
72
74
|
@selection_blocks = {}
|
75
|
+
@selection_blocks_description = {}
|
73
76
|
end
|
74
77
|
|
75
78
|
def content(&block)
|
76
79
|
self.content_block = block
|
77
80
|
end
|
78
|
-
def selection(input=10, &block)
|
81
|
+
def selection(input=10, description=nil, &block)
|
82
|
+
if input.to_s.downcase == "enter"
|
83
|
+
input = 10
|
84
|
+
end
|
85
|
+
|
86
|
+
description_input = input
|
87
|
+
if input.to_s == "10"
|
88
|
+
description_input = "enter"
|
89
|
+
end
|
90
|
+
|
79
91
|
self.selection_blocks[input] = block
|
92
|
+
self.selection_blocks_description[description_input] = description
|
80
93
|
end
|
81
94
|
end
|
82
95
|
end
|
data/lib/wassup/version.rb
CHANGED
data/lib/wassup.rb
CHANGED
@@ -4,6 +4,11 @@ require "wassup/color"
|
|
4
4
|
require "wassup/pane"
|
5
5
|
require "wassup/pane_builder"
|
6
6
|
|
7
|
+
require "wassup/helpers/circleci"
|
8
|
+
require "wassup/helpers/github"
|
9
|
+
require "wassup/helpers/netlify"
|
10
|
+
require "wassup/helpers/shortcut"
|
11
|
+
|
7
12
|
module Wassup
|
8
13
|
class Error < StandardError; end
|
9
14
|
# Your code goes here...
|
data/wassup.gemspec
CHANGED
@@ -16,6 +16,7 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.metadata["source_code_uri"] = "https://github.com/joshdholtz/wassup"
|
17
17
|
|
18
18
|
spec.add_runtime_dependency 'curses'
|
19
|
+
spec.add_runtime_dependency 'rest-client'
|
19
20
|
|
20
21
|
# Specify which files should be added to the gem when it is released.
|
21
22
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wassup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Holtz
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: curses
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rest-client
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
description: A scriptable terminal dashboard
|
28
42
|
email:
|
29
43
|
- me@joshholtz.com
|
@@ -45,14 +59,53 @@ files:
|
|
45
59
|
- bin/console
|
46
60
|
- bin/setup
|
47
61
|
- bin/wassup
|
62
|
+
- docs/.gitignore
|
63
|
+
- docs/README.md
|
64
|
+
- docs/babel.config.js
|
65
|
+
- docs/blog/2021-12-09-welcome/index.md
|
66
|
+
- docs/blog/authors.yml
|
67
|
+
- docs/docs/Supfile-basics/_category_.json
|
68
|
+
- docs/docs/Supfile-basics/understanding-the-supfile.md
|
69
|
+
- docs/docs/intro.md
|
70
|
+
- docs/docusaurus.config.js
|
71
|
+
- docs/package-lock.json
|
72
|
+
- docs/package.json
|
73
|
+
- docs/sidebars.js
|
74
|
+
- docs/src/components/HomepageFeatures.module.css
|
75
|
+
- docs/src/components/HomepageFeatures.tsx
|
76
|
+
- docs/src/css/custom.css
|
77
|
+
- docs/src/pages/index.module.css
|
78
|
+
- docs/src/pages/index.tsx
|
79
|
+
- docs/src/pages/markdown-page.md
|
80
|
+
- docs/static/.nojekyll
|
81
|
+
- docs/static/img/demo-supfile.png
|
82
|
+
- docs/static/img/favicon.ico
|
83
|
+
- docs/static/img/logo.svg
|
84
|
+
- docs/static/img/tutorial-intro-starter-screenshot.png
|
85
|
+
- docs/static/img/tutorial/docsVersionDropdown.png
|
86
|
+
- docs/static/img/tutorial/localeDropdown.png
|
87
|
+
- docs/static/img/undraw_docusaurus_mountain.svg
|
88
|
+
- docs/static/img/undraw_docusaurus_react.svg
|
89
|
+
- docs/static/img/undraw_docusaurus_tree.svg
|
90
|
+
- docs/static/img/wassup-long.png
|
91
|
+
- docs/static/img/wassup-screenshot.png
|
92
|
+
- docs/static/img/wassup.png
|
93
|
+
- docs/static/video/wassup-demo.mov
|
94
|
+
- docs/tsconfig.json
|
48
95
|
- examples/basic/Supfile
|
49
96
|
- examples/debug/Supfile
|
50
97
|
- examples/josh-fastlane/README.md
|
51
98
|
- examples/josh-fastlane/Supfile
|
52
99
|
- examples/josh-fastlane/demo.png
|
100
|
+
- examples/simple/Supfile
|
101
|
+
- examples/starter/Supfile
|
53
102
|
- lib/wassup.rb
|
54
103
|
- lib/wassup/app.rb
|
55
104
|
- lib/wassup/color.rb
|
105
|
+
- lib/wassup/helpers/circleci.rb
|
106
|
+
- lib/wassup/helpers/github.rb
|
107
|
+
- lib/wassup/helpers/netlify.rb
|
108
|
+
- lib/wassup/helpers/shortcut.rb
|
56
109
|
- lib/wassup/pane.rb
|
57
110
|
- lib/wassup/pane_builder.rb
|
58
111
|
- lib/wassup/version.rb
|
@@ -63,7 +116,7 @@ licenses:
|
|
63
116
|
metadata:
|
64
117
|
homepage_uri: https://github.com/joshdholtz/wassup
|
65
118
|
source_code_uri: https://github.com/joshdholtz/wassup
|
66
|
-
post_install_message:
|
119
|
+
post_install_message:
|
67
120
|
rdoc_options: []
|
68
121
|
require_paths:
|
69
122
|
- lib
|
@@ -78,8 +131,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
131
|
- !ruby/object:Gem::Version
|
79
132
|
version: '0'
|
80
133
|
requirements: []
|
81
|
-
rubygems_version: 3.
|
82
|
-
signing_key:
|
134
|
+
rubygems_version: 3.2.3
|
135
|
+
signing_key:
|
83
136
|
specification_version: 4
|
84
137
|
summary: A scriptable terminal dashboard
|
85
138
|
test_files: []
|