wassup 0.1.1 → 0.3.0

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +3 -0
  3. data/.gitignore +4 -0
  4. data/Gemfile.lock +19 -1
  5. data/README.md +45 -5
  6. data/bin/wassup +6 -1
  7. data/docs/.gitignore +20 -0
  8. data/docs/README.md +41 -0
  9. data/docs/babel.config.js +3 -0
  10. data/docs/blog/2021-12-09-welcome/index.md +8 -0
  11. data/docs/blog/authors.yml +5 -0
  12. data/docs/docs/Supfile-basics/_category_.json +4 -0
  13. data/docs/docs/Supfile-basics/understanding-the-supfile.md +50 -0
  14. data/docs/docs/intro.md +54 -0
  15. data/docs/docusaurus.config.js +110 -0
  16. data/docs/package-lock.json +21196 -0
  17. data/docs/package.json +43 -0
  18. data/docs/sidebars.js +31 -0
  19. data/docs/src/components/HomepageFeatures.module.css +10 -0
  20. data/docs/src/components/HomepageFeatures.tsx +60 -0
  21. data/docs/src/css/custom.css +28 -0
  22. data/docs/src/pages/index.module.css +36 -0
  23. data/docs/src/pages/index.tsx +39 -0
  24. data/docs/src/pages/markdown-page.md +7 -0
  25. data/docs/static/.nojekyll +0 -0
  26. data/docs/static/img/demo-supfile.png +0 -0
  27. data/docs/static/img/favicon.ico +0 -0
  28. data/docs/static/img/logo.svg +27 -0
  29. data/docs/static/img/tutorial/docsVersionDropdown.png +0 -0
  30. data/docs/static/img/tutorial/localeDropdown.png +0 -0
  31. data/docs/static/img/tutorial-intro-starter-screenshot.png +0 -0
  32. data/docs/static/img/undraw_docusaurus_mountain.svg +170 -0
  33. data/docs/static/img/undraw_docusaurus_react.svg +169 -0
  34. data/docs/static/img/undraw_docusaurus_tree.svg +1 -0
  35. data/docs/static/img/wassup-long.png +0 -0
  36. data/docs/static/img/wassup-screenshot.png +0 -0
  37. data/docs/static/img/wassup.png +0 -0
  38. data/docs/static/video/wassup-demo.mov +0 -0
  39. data/docs/tsconfig.json +7 -0
  40. data/examples/basic/Supfile +195 -0
  41. data/examples/debug/Supfile +131 -0
  42. data/examples/josh-fastlane/README.md +14 -0
  43. data/examples/josh-fastlane/Supfile +70 -109
  44. data/examples/josh-fastlane/demo.png +0 -0
  45. data/examples/simple/Supfile +17 -0
  46. data/examples/starter/Supfile +44 -0
  47. data/lib/wassup/app.rb +178 -10
  48. data/lib/wassup/color.rb +81 -0
  49. data/lib/wassup/helpers/circleci.rb +75 -0
  50. data/lib/wassup/helpers/github.rb +137 -0
  51. data/lib/wassup/helpers/netlify.rb +70 -0
  52. data/lib/wassup/helpers/shortcut.rb +114 -0
  53. data/lib/wassup/pane.rb +298 -90
  54. data/lib/wassup/pane_builder.rb +74 -3
  55. data/lib/wassup/version.rb +1 -1
  56. data/lib/wassup.rb +6 -0
  57. data/wassup.gemspec +1 -0
  58. metadata +61 -2
@@ -3,6 +3,8 @@ require 'rest-client'
3
3
  require 'json'
4
4
  require 'colorize'
5
5
 
6
+ require 'curses'
7
+
6
8
  fastlane_community_prs = []
7
9
  fastlane_prs = []
8
10
 
@@ -18,9 +20,13 @@ add_pane do |pane|
18
20
  pane.highlight = false
19
21
 
20
22
  pane.title = "Stats: fastlane-community"
23
+ pane.description = [
24
+ "Highlevel stats from fastlane-community about PR count"
25
+ ]
21
26
 
22
- pane.interval = 1
23
- pane.content do
27
+ pane.interval = 2
28
+ pane.show_refresh = false
29
+ pane.content do |builder|
24
30
  days_1 = 0
25
31
  days_7 = 0
26
32
  days_30 = 0
@@ -39,13 +45,11 @@ add_pane do |pane|
39
45
  days_365 +=1 if days <= 365
40
46
  end
41
47
 
42
- [
43
- "Opened today: #{days_1}",
44
- "Opened 7 days: #{days_7}",
45
- "Opened 30 days: #{days_30}",
46
- "Opened 60 days: #{days_60}",
47
- "Opened 365 days: #{days_365}"
48
- ]
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}")
49
53
  end
50
54
  end
51
55
 
@@ -61,9 +65,13 @@ add_pane do |pane|
61
65
  pane.highlight = false
62
66
 
63
67
  pane.title = "Stats: fastlane/fastlane"
68
+ pane.description = [
69
+ "Highlevel stats from fastlane/fastlane about PR count"
70
+ ]
64
71
 
65
- pane.interval = 1
66
- pane.content do
72
+ pane.interval = 2
73
+ pane.show_refresh = false
74
+ pane.content do |builder|
67
75
  days_1 = 0
68
76
  days_7 = 0
69
77
  days_30 = 0
@@ -84,14 +92,12 @@ add_pane do |pane|
84
92
  days_60_plus +=1 if days > 60
85
93
  end
86
94
 
87
- [
88
- "Opened today: #{days_1}",
89
- "Opened 7 days: #{days_7}",
90
- "Opened 30 days: #{days_30}",
91
- "Opened 45 days: #{days_45}",
92
- "Opened 60 days: #{days_60}",
93
- "More than 60 days: #{days_60_plus}",
94
- ]
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}")
95
101
  end
96
102
  end
97
103
 
@@ -107,45 +113,35 @@ add_pane do |pane|
107
113
  pane.highlight = true
108
114
 
109
115
  pane.title = "Circle CI - fastlane/fastlane"
116
+ pane.description = [
117
+ "Shows workflows from last 14 days"
118
+ ]
110
119
 
111
120
  pane.interval = 60 * 5
112
- pane.content do
113
- resp = RestClient::Request.execute(
114
- method: :get,
115
- url: "https://circleci.com/api/v2/project/github/fastlane/fastlane/pipeline",
116
- headers: { "Circle-Token": ENV["WASSUP_CIRCLE_CI_API_TOKEN"] }
117
- )
118
- json = JSON.parse(resp)
119
- json["items"].select do |item|
120
- date = Time.parse(item["updated_at"])
121
- days = (Time.now - date).to_i / (24 * 60 * 60)
122
- days < 14
123
- end.map do |item|
124
- id = item["id"]
125
- number = item["number"]
126
- message = item["vcs"]["commit"]["subject"]
127
- login = item["trigger"]["actor"]["login"]
128
-
129
- resp = RestClient::Request.execute(
130
- method: :get,
131
- url: "https://circleci.com/api/v2/pipeline/#{id}/workflow",
132
- headers: { "Circle-Token": ENV["WASSUP_CIRCLE_CI_API_TOKEN"] }
133
- )
134
- json = JSON.parse(resp)
135
- workflow = json["items"].first
136
- status = workflow["status"]
137
-
138
- ["#{number} (#{status}) by #{login} - #{message}", 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)
139
128
  end
140
129
  end
141
- pane.selection do |data|
142
- slug = data["project_slug"]
143
- pipeline_number = data["pipeline_number"]
144
- workflow_id = data["id"]
130
+
131
+ pane.selection('enter', 'Opens up CirceCI workflow') do |workflow|
132
+ slug = workflow["project_slug"]
133
+ pipeline_number = workflow["pipeline_number"]
134
+ workflow_id = workflow["id"]
145
135
 
146
136
  url = "https://app.circleci.com/pipelines/#{slug}/#{pipeline_number}/workflows/#{workflow_id}"
147
137
  `open #{url}`
148
138
  end
139
+
140
+ pane.selection('o', 'Opens up version control review URL') do |workflow|
141
+ pipeline = workflow["pipeline"]
142
+ url = pipeline["vcs"]["review_url"]
143
+ `open #{url}`
144
+ end
149
145
  end
150
146
 
151
147
  #
@@ -160,52 +156,26 @@ add_pane do |pane|
160
156
  pane.highlight = true
161
157
 
162
158
  pane.title = "Open PRs - fastlane-community"
159
+ pane.description = [
160
+ "Open PRs from all the fastlane-community repos"
161
+ ]
163
162
 
164
163
  pane.interval = 60 * 5
165
- pane.content do
164
+ pane.show_refresh = true
165
+ pane.content do |builder|
166
166
  fastlane_community_prs = []
167
167
 
168
- resp = RestClient::Request.execute(
169
- method: :get,
170
- url: "https://api.github.com/orgs/fastlane-community/repos",
171
- user: ENV["WASSUP_GITHUB_USERNAME"],
172
- password: ENV["WASSUP_GITHUB_ACCESS_TOKEN"]
173
- )
174
- json = JSON.parse(resp)
175
- json.map do |repo|
176
- name = repo["name"]
177
- full_name = repo["full_name"]
178
-
179
- resp = RestClient::Request.execute(
180
- method: :get,
181
- url: "https://api.github.com/repos/#{full_name}/pulls",
182
- user: ENV["WASSUP_GITHUB_USERNAME"],
183
- password: ENV["WASSUP_GITHUB_ACCESS_TOKEN"]
184
- )
185
- json = JSON.parse(resp)
186
- prs = json.map do |pr|
187
- fastlane_community_prs << pr
188
-
189
- number = pr["number"]
190
- title = pr["title"]
191
- created_at = pr["created_at"]
192
-
193
- number_formatted = '%5.5s' % "##{number}"
194
-
195
- date = Time.parse(created_at)
196
- days = (Time.now - date).to_i / (24 * 60 * 60)
197
- days_formatted = '%3.3s' % days.to_s
198
-
199
- ["#{number_formatted} #{days_formatted}d ago #{title}",pr]
200
- end
201
-
202
- {
203
- title: name,
204
- content: prs
205
- }
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)
206
176
  end
207
177
  end
208
- pane.selection do |data|
178
+ pane.selection('enter', 'Open PR in web browser') do |data|
209
179
  url = data["html_url"]
210
180
  `open #{url}`
211
181
  end
@@ -224,33 +194,24 @@ add_pane do |pane|
224
194
  pane.highlight = true
225
195
 
226
196
  pane.title = "Open PRs - fastlane/fastlane"
197
+ pane.description = [
198
+ "Open PRs from all the fastlane/fastlane repo"
199
+ ]
227
200
 
228
201
  pane.interval = 60 * 5
229
- pane.content do
202
+ pane.show_refresh = true
203
+ pane.content do |builder|
230
204
  fastlane_prs = []
231
205
 
232
- resp = RestClient::Request.execute(
233
- method: :get,
234
- url: "https://api.github.com/repos/fastlane/fastlane/pulls?per_page=100",
235
- user: ENV["WASSUP_GITHUB_USERNAME"],
236
- password: ENV["WASSUP_GITHUB_ACCESS_TOKEN"]
237
- )
238
- json = JSON.parse(resp)
239
- json.map do |pr|
206
+ prs = Wassup::Helpers::GitHub.pull_requests(org: 'fastlane', repo: 'fastlane')
207
+ prs.each do |pr|
240
208
  fastlane_prs << pr
241
209
 
242
- number = pr["number"]
243
- title = pr["title"]
244
- created_at = pr["created_at"]
245
-
246
- date = Time.parse(created_at)
247
- days = (Time.now - date).to_i / (24 * 60 * 60)
248
- days_formatted = '%3.3s' % days.to_s
249
-
250
- ["##{number} #{days_formatted}d ago #{title}",pr]
210
+ display = Helpers::GitHub::Formatter.pr(pr)
211
+ builder.add_row(display, pr)
251
212
  end
252
213
  end
253
- pane.selection do |data|
214
+ pane.selection('enter', 'Open PR in browser') do |data|
254
215
  url = data["html_url"]
255
216
  `open #{url}`
256
217
  end
Binary file
@@ -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
@@ -10,14 +10,54 @@ module Wassup
10
10
 
11
11
  Curses.stdscr.scrollok true
12
12
 
13
- Curses.init_pair(1, 15, 0) #white foreground, black background
14
- Curses.init_pair(2, 2, 0) # red foreground, black background
15
- Curses.init_pair(3, 7, 3) # white foreground, yellow background
16
- Curses.init_pair(4, 0, 15) # white foreground, yellow background
13
+ Wassup::Color.init
14
+
15
+ # Determines the colors in the 'attron' below
16
+
17
+ #Curses.init_pair(Curses::COLOR_BLUE,Curses::COLOR_BLUE,Curses::COLOR_BLACK)
18
+ #Curses.init_pair(Curses::COLOR_RED,Curses::COLOR_RED,Curses::COLOR_BLACK)
17
19
 
18
20
  app = App.new(path: path)
19
21
  end
20
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|
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
+
21
61
  def add_pane
22
62
  pane_builder = Wassup::PaneBuilder.new
23
63
  yield(pane_builder)
@@ -29,22 +69,62 @@ module Wassup
29
69
  pane_builder.top,
30
70
  pane_builder.left,
31
71
  title: pane_builder.title,
72
+ description: pane_builder.description,
32
73
  highlight: pane_builder.highlight,
33
74
  focus_number: number,
34
75
  interval: pane_builder.interval,
76
+ show_refresh: pane_builder.show_refresh,
35
77
  content_block: pane_builder.content_block,
36
- selection_block: pane_builder.selection_block
78
+ selection_blocks: pane_builder.selection_blocks,
79
+ selection_blocks_description: pane_builder.selection_blocks_description,
80
+ debug: debug
37
81
  )
38
82
  pane.focus_handler = @focus_handler
39
83
  @panes[number.to_s] = pane
40
84
  end
41
85
 
42
- def initialize(path:)
86
+ attr_accessor :panes
87
+ attr_accessor :debug
88
+
89
+ def initialize(path:, debug: false)
43
90
  @hidden_pane = nil
91
+ @help_pane = nil
44
92
  @focused_pane = nil
45
93
  @panes = {}
94
+ @debug = debug
46
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
114
+
115
+ # TODO: this could maybe get replaced with selection_blocks now
47
116
  @focus_handler = Proc.new do |input|
117
+ is_help_open = !@help_pane.nil?
118
+
119
+ if input == "q"
120
+ exit
121
+ elsif input == "?"
122
+ toggle_help
123
+ next true
124
+ end
125
+
126
+ next true if is_help_open
127
+
48
128
  if (pane = @panes[input.to_s])
49
129
  @focused_pane.focused = false
50
130
 
@@ -66,8 +146,7 @@ module Wassup
66
146
  end
67
147
 
68
148
  begin
69
-
70
- @hidden_pane = Pane.new(0, 0, 0, 0, highlight: false, focus_number: 0, interval: nil, content_block: nil, selection_block: 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)
71
150
  @hidden_pane.focus_handler = @focus_handler
72
151
  @focused_pane = @hidden_pane
73
152
 
@@ -75,13 +154,102 @@ module Wassup
75
154
 
76
155
  loop do
77
156
  @focused_pane.handle_keyboard
78
- @panes.each do |id, pane|
79
- pane.refresh()
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()
80
173
  end
81
174
  end
82
175
  ensure
83
176
  Curses.close_screen
84
177
  end
85
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
86
254
  end
87
255
  end
@@ -0,0 +1,81 @@
1
+ require 'curses'
2
+
3
+ module Wassup
4
+ class Color
5
+ attr_accessor :color_pair
6
+
7
+ module Pair
8
+ BLACK = 0
9
+ BLUE = 1
10
+ CYAN = 2
11
+ GREEN = 3
12
+ MAGENTA = 4
13
+ RED = 5
14
+ WHITE = 15
15
+ YELLOW = 7
16
+
17
+ NORMAL = 20
18
+ HIGHLIGHT = 21
19
+
20
+ GRAY = 22
21
+
22
+ BORDER = 20
23
+ BORDER_FOCUS = 7
24
+
25
+ TITLE = 20
26
+ TITLE_FOCUS = 20
27
+ end
28
+
29
+ def self.init
30
+ Curses.use_default_colors()
31
+
32
+ Curses.init_pair(Pair::NORMAL, Pair::WHITE, 0) #white foreground, black background
33
+ Curses.init_pair(Pair::HIGHLIGHT, 0, Pair::WHITE) # black foreground, white background
34
+
35
+ # Curses.init_pair(Pair::BORDER, Pair::WHITE, 0) #white foreground, black background
36
+ # Curses.init_pair(Pair::BORDER_FOCUS, Pair::MAGENTA, 0) #white foreground, black background
37
+ #
38
+ # Curses.init_pair(Pair::TITLE, Pair::WHITE, 0) #white foreground, black background
39
+ # Curses.init_pair(Pair::TITLE_FOCUS, Pair::WHITE, 0) #white foreground, black background
40
+
41
+ Curses.init_pair(Pair::BLACK, Curses::COLOR_BLACK, 0)
42
+ Curses.init_pair(Pair::BLUE, Curses::COLOR_BLUE, 0)
43
+ Curses.init_pair(Pair::CYAN, Curses::COLOR_CYAN, 0)
44
+ Curses.init_pair(Pair::GREEN, Curses::COLOR_GREEN, 0)
45
+ Curses.init_pair(Pair::MAGENTA, Curses::COLOR_MAGENTA, 0)
46
+ Curses.init_pair(Pair::RED, Curses::COLOR_RED, 0)
47
+ Curses.init_pair(Pair::WHITE, Pair::WHITE, 0)
48
+ Curses.init_pair(Pair::YELLOW, Curses::COLOR_YELLOW, 0)
49
+ Curses.init_pair(Pair::GRAY, Curses::COLOR_WHITE, 0)
50
+ end
51
+
52
+ def initialize(string_name)
53
+ @color_pair = case string_name
54
+ when "black"
55
+ Pair::BLACK
56
+ when "blue"
57
+ Pair::BLUE
58
+ when "cyan"
59
+ Pair::CYAN
60
+ when "green"
61
+ Pair::GREEN
62
+ when "magenta"
63
+ Pair::MAGENTA
64
+ when "red"
65
+ Pair::RED
66
+ when "white"
67
+ Pair::WHITE
68
+ when "yellow"
69
+ Pair::YELLOW
70
+ when "gray"
71
+ Pair::GRAY
72
+ else
73
+ if string_name.to_i.to_s == string_name
74
+ string_name.to_i
75
+ else
76
+ Pair::WHITE
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end