wassup 0.1.0 → 0.2.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +3 -0
  3. data/.gitignore +4 -0
  4. data/README.md +45 -5
  5. data/bin/wassup +8 -1
  6. data/docs/.gitignore +20 -0
  7. data/docs/README.md +41 -0
  8. data/docs/babel.config.js +3 -0
  9. data/docs/blog/2021-12-09-welcome/index.md +8 -0
  10. data/docs/blog/authors.yml +5 -0
  11. data/docs/docs/Supfile-basics/_category_.json +4 -0
  12. data/docs/docs/Supfile-basics/understanding-the-supfile.md +50 -0
  13. data/docs/docs/intro.md +54 -0
  14. data/docs/docusaurus.config.js +110 -0
  15. data/docs/package-lock.json +21196 -0
  16. data/docs/package.json +43 -0
  17. data/docs/sidebars.js +31 -0
  18. data/docs/src/components/HomepageFeatures.module.css +10 -0
  19. data/docs/src/components/HomepageFeatures.tsx +60 -0
  20. data/docs/src/css/custom.css +28 -0
  21. data/docs/src/pages/index.module.css +36 -0
  22. data/docs/src/pages/index.tsx +39 -0
  23. data/docs/src/pages/markdown-page.md +7 -0
  24. data/docs/static/.nojekyll +0 -0
  25. data/docs/static/img/demo-supfile.png +0 -0
  26. data/docs/static/img/favicon.ico +0 -0
  27. data/docs/static/img/logo.svg +27 -0
  28. data/docs/static/img/tutorial/docsVersionDropdown.png +0 -0
  29. data/docs/static/img/tutorial/localeDropdown.png +0 -0
  30. data/docs/static/img/tutorial-intro-starter-screenshot.png +0 -0
  31. data/docs/static/img/undraw_docusaurus_mountain.svg +170 -0
  32. data/docs/static/img/undraw_docusaurus_react.svg +169 -0
  33. data/docs/static/img/undraw_docusaurus_tree.svg +1 -0
  34. data/docs/static/img/wassup-long.png +0 -0
  35. data/docs/static/img/wassup-screenshot.png +0 -0
  36. data/docs/static/img/wassup.png +0 -0
  37. data/docs/static/video/wassup-demo.mov +0 -0
  38. data/docs/tsconfig.json +7 -0
  39. data/examples/basic/Supfile +28 -0
  40. data/examples/debug/Supfile +116 -0
  41. data/examples/josh-fastlane/README.md +14 -0
  42. data/examples/josh-fastlane/Supfile +59 -35
  43. data/examples/josh-fastlane/demo.png +0 -0
  44. data/examples/starter/Supfile +44 -0
  45. data/lib/wassup/app.rb +82 -9
  46. data/lib/wassup/color.rb +76 -0
  47. data/lib/wassup/pane.rb +255 -82
  48. data/lib/wassup/pane_builder.rb +74 -3
  49. data/lib/wassup/version.rb +1 -1
  50. data/lib/wassup.rb +1 -0
  51. metadata +42 -2
data/lib/wassup/pane.rb CHANGED
@@ -6,11 +6,12 @@ module Wassup
6
6
  class Pane
7
7
  attr_accessor :win
8
8
  attr_accessor :subwin
9
- attr_accessor :data_lines
10
- attr_accessor :data_objects
11
9
  attr_accessor :top
12
10
 
11
+ attr_accessor :contents
12
+
13
13
  attr_accessor :title
14
+ attr_accessor :description
14
15
 
15
16
  attr_accessor :focused
16
17
  attr_accessor :focus_number
@@ -27,14 +28,41 @@ module Wassup
27
28
  attr_accessor :interval
28
29
  attr_accessor :last_refreshed
29
30
  attr_accessor :content_block
30
- attr_accessor :selection_block
31
+ attr_accessor :selection_blocks
32
+ attr_accessor :selection_blocks_description
33
+
34
+ attr_accessor :content_thread
35
+ attr_accessor :show_refresh
31
36
 
32
37
  attr_accessor :selected_view_index
33
- attr_accessor :all_view_data_objects
34
38
 
35
39
  attr_accessor :win_height, :win_width, :win_top, :win_left
36
40
 
37
- def initialize(height, width, top, left, title: nil, highlight: true, focus_number: nil, interval:, content_block:, selection_block:)
41
+ class Content
42
+ class Row
43
+ attr_accessor :display
44
+ attr_accessor :object
45
+
46
+ def initialize(display, object)
47
+ @display = display
48
+ @object = object || display
49
+ end
50
+ end
51
+
52
+ attr_accessor :title
53
+ attr_accessor :data
54
+
55
+ def initialize(title = nil)
56
+ @title = title
57
+ @data = []
58
+ end
59
+
60
+ def add_row(display, object = nil)
61
+ @data << Row.new(display, object)
62
+ end
63
+ end
64
+
65
+ 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:)
38
66
  self.win_height = Curses.lines * height
39
67
  self.win_width = Curses.cols * width
40
68
  self.win_top = Curses.lines * top
@@ -50,20 +78,22 @@ module Wassup
50
78
  self.virtual_scroll = true
51
79
 
52
80
  self.top = 0
53
- self.data_lines = []
54
- self.data_objects = []
81
+
82
+ self.contents = []
83
+ self.show_refresh = show_refresh
55
84
 
56
85
  self.selected_view_index = 0
57
- self.all_view_data_objects = [] # Array of array
58
86
 
59
87
  self.win.refresh
60
88
  self.subwin.refresh
61
89
 
62
90
  self.title = title
91
+ self.description = description
63
92
 
64
93
  self.interval = interval
65
94
  self.content_block = content_block
66
- self.selection_block = selection_block
95
+ self.selection_blocks = selection_blocks || {}
96
+ self.selection_blocks_description = selection_blocks_description || {}
67
97
  end
68
98
 
69
99
  def setup_subwin
@@ -75,16 +105,16 @@ module Wassup
75
105
  self.subwin = nil
76
106
  end
77
107
 
78
- if (@all_view_data_objects || []).size > 1
108
+ if (self.contents || []).size > 1
79
109
  top_bump = 4
80
110
 
81
- view_title = (self.all_view_data_objects[self.selected_view_index] || {})[:title]
111
+ view_title = self.contents[self.selected_view_index].title || "<No Title>"
82
112
  view_title += " " * 100
83
113
 
84
114
  self.win.setpos(2, 2)
85
115
  self.win.addstr(view_title[0...self.win.maxx()-3])
86
116
 
87
- subtitle = "(#{self.selected_view_index + 1} out of #{self.all_view_data_objects.size})"
117
+ subtitle = "(#{self.selected_view_index + 1} out of #{self.contents.size})"
88
118
  subtitle += " " * 100
89
119
  self.win.setpos(3, 2)
90
120
  self.win.addstr(subtitle[0...self.win.maxx()-3])
@@ -104,6 +134,16 @@ module Wassup
104
134
  self.subwin.scrollok(true)
105
135
  end
106
136
 
137
+ def close
138
+ unless self.subwin.nil?
139
+ self.subwin.clear
140
+ self.subwin.close
141
+ end
142
+
143
+ self.win.clear
144
+ self.win.close
145
+ end
146
+
107
147
  def needs_refresh?
108
148
  return false if self.content_block.nil?
109
149
  return false if self.interval.nil?
@@ -111,61 +151,160 @@ module Wassup
111
151
  return Time.now - self.interval > self.last_refreshed
112
152
  end
113
153
 
114
- def refresh
115
- return unless needs_refresh?
154
+ class Ope
155
+ attr_accessor :error
156
+ def initialize(error)
157
+ @error = error
158
+ end
159
+ end
116
160
 
117
- content = self.content_block.call()
161
+ def data_lines
162
+ return [] if self.selected_view_index.nil?
163
+ content = (self.contents || [])[self.selected_view_index]
164
+
165
+ if content.nil?
166
+ return []
167
+ else
168
+ content.data.map(&:display)
169
+ end
170
+ end
171
+
172
+ def refreshing?
173
+ return !self.content_thread.nil?
174
+ end
175
+
176
+ def redraw
177
+ self.update_box
178
+ self.update_title
179
+ self.refresh_content(nil)
180
+ end
118
181
 
119
- return unless content.is_a?(Array)
120
- return if content.first.nil?
182
+ def refresh(force: false)
183
+ if force
184
+ self.last_refreshed = nil
185
+ end
121
186
 
122
- if content.first.is_a?(Hash)
123
- self.all_view_data_objects = content
187
+ if !needs_refresh?
188
+ return
189
+ end
190
+
191
+ thread = self.content_thread
192
+ if !thread.nil?
193
+ if thread.status == "sleep" || thread.status == "run" || thread.status == "aborting"
194
+ self.update_refresh
195
+ return
196
+ elsif thread.status == nil
197
+ return
198
+ elsif thread.status == false
199
+ rtn = thread.value
200
+ if rtn.is_a?(Ope)
201
+ content = Wassup::Pane::Content.new
202
+
203
+ content.add_row("[fg=red]Error during refersh[fg=white]")
204
+ content.add_row("[fg=red]at #{Time.now}[fg=while]")
205
+ content.add_row("")
206
+ content.add_row("[fg=yellow]Will try again next interval[fg=white]")
207
+
208
+ self.refresh_content([content])
209
+ elsif rtn.is_a?(Wassup::PaneBuilder::ContentBuilder)
210
+ self.refresh_content(rtn.contents)
211
+ end
212
+
213
+ self.update_box
214
+ self.update_title
215
+ else
216
+ # This shouldn't happen
217
+ # TODO: also fix this
218
+ return
219
+ end
124
220
  else
125
- self.all_view_data_objects = [
126
- content
127
- ]
221
+ the_block = self.content_block
222
+ self.content_thread = Thread.new {
223
+ begin
224
+ builder = Wassup::PaneBuilder::ContentBuilder.new(self.contents)
225
+ content = the_block.call(builder)
226
+
227
+ builder
228
+ rescue => ex
229
+ next Ope.new(ex)
230
+ end
231
+ }
232
+ self.update_box
233
+ self.update_title
128
234
  end
235
+ end
129
236
 
130
- self.load_current_view()
237
+ def refresh_content(contents)
238
+ self.contents = contents unless contents.nil?
131
239
 
240
+ self.load_current_view()
132
241
  self.last_refreshed = Time.now
242
+
243
+ self.content_thread = nil
133
244
  end
134
245
 
135
246
  def load_current_view
136
247
  self.setup_subwin()
137
- view_content = self.all_view_data_objects[self.selected_view_index]
138
248
 
139
249
  # this might be bad
140
250
  self.highlighted_line = nil
251
+ self.virtual_reload()
252
+ end
253
+
254
+ def title=(title)
255
+ @title = title
256
+ self.update_box()
257
+ self.update_title()
258
+ end
259
+
260
+ attr_accessor :refresh_char_count
261
+ def refresh_char
262
+ return "" unless self.show_refresh
141
263
 
142
- require 'pp'
143
- if view_content.is_a?(Hash) && view_content[:content]
144
- view_content = view_content[:content]
264
+ if self.refresh_char_count.nil?
265
+ self.refresh_char_count = 0
145
266
  end
146
267
 
147
- @data_lines = []
148
- @data_objects = []
149
- view_content.each do |item|
150
- if item.is_a?(String)
151
- @data_objects << item
152
- self.add_line(item)
153
- elsif item.is_a?(Array)
154
- @data_objects << item[1]
155
- self.add_line(item[0])
268
+ if self.refreshing?
269
+ array = ['\\', '|', '/', '|']
270
+ rtn = array[self.refresh_char_count]
271
+
272
+ self.refresh_char_count += 1
273
+ if self.refresh_char_count >= array.size
274
+ self.refresh_char_count = 0
156
275
  end
276
+
277
+ return rtn
278
+ else
279
+ return ""
157
280
  end
158
281
  end
159
282
 
160
- def title=(title)
161
- @title = title
162
- self.update_box()
163
- self.update_title()
283
+ attr_accessor :last_refresh_char_at
284
+ def update_refresh
285
+ return unless self.should_box
286
+
287
+ self.last_refresh_char_at ||= Time.now
288
+
289
+ if Time.now - self.last_refresh_char_at >= 0.15
290
+ self.win.setpos(0, 1)
291
+ self.win.addstr(self.refresh_char)
292
+ self.win.refresh
293
+
294
+ self.last_refresh_char_at = Time.now
295
+ end
164
296
  end
165
297
 
166
298
  def update_title
299
+ return unless self.should_box
300
+
167
301
  title = self.title || "<No Title>"
168
- full_title = "#{self.focus_number} - #{title}"
302
+
303
+ if self.focus_number.nil?
304
+ full_title = title
305
+ else
306
+ full_title = "#{self.focus_number} - #{title}"
307
+ end
169
308
 
170
309
  self.win.setpos(0, 3)
171
310
  self.win.addstr(full_title)
@@ -182,21 +321,17 @@ module Wassup
182
321
  def update_box
183
322
  return unless self.should_box
184
323
 
185
- self.win.attron(self.focused ? Curses.color_pair(2) : Curses.color_pair(1))
186
- self.win.box()
187
- self.win.attron(Curses.color_pair(1))
324
+ show_focused = self.focused
188
325
 
189
- self.win.refresh
190
- end
326
+ if self.focus_number.nil?
327
+ show_focused = true
328
+ end
191
329
 
192
- def add_line(text)
193
- data_lines << text
330
+ self.win.attrset(show_focused ? Curses.color_pair(Wassup::Color::Pair::BORDER_FOCUS) : Curses.color_pair(Wassup::Color::Pair::BORDER))
331
+ self.win.box()
332
+ self.win.attrset(Curses.color_pair(Wassup::Color::Pair::NORMAL))
194
333
 
195
- if self.virtual_scroll
196
- self.virtual_reload
197
- else
198
- self.load_thing
199
- end
334
+ self.win.refresh
200
335
  end
201
336
 
202
337
  # Load the file into memory and
@@ -211,23 +346,59 @@ module Wassup
211
346
  end
212
347
 
213
348
  def virtual_reload
214
- return if self.data_lines.nil?
349
+ return if self.data_lines.nil? || self.data_lines.empty?
215
350
 
351
+ # TODO: This errored out but might be because thread stuff???
216
352
  self.data_lines[self.top..(self.top+self.subwin.maxy-1)].each_with_index do |line, idx|
217
353
 
218
- if self.focused && self.highlight && (idx + self.top) == self.highlighted_line
219
- self.subwin.attron(Curses.color_pair(4))
220
- else
221
- self.subwin.attron(Curses.color_pair(1))
222
- end
223
-
224
- short_line = line[0...self.subwin.maxx()-3]
225
-
226
- self.subwin.setpos(idx, 0)
227
- self.subwin.addstr(short_line)
228
- self.subwin.clrtoeol()
229
-
230
- self.subwin.attron(Curses.color_pair(1))
354
+ write_full_line = false
355
+ should_highlight = self.focused && self.highlight && (idx + self.top) == self.highlighted_line
356
+
357
+ max_char = self.subwin.maxx()-3
358
+
359
+ self.subwin.attrset(Curses.color_pair(Wassup::Color::Pair::NORMAL))
360
+
361
+ splits = line.split(/\[.*?\]/) # returns ["hey something", "other thing", "okay"]
362
+ scans = line.scan(/\[.*?\]/) #returns ["red", "white"]
363
+ scans = scans.map do |str|
364
+ if str.start_with?('[fg=')
365
+ str = str.gsub('[fg=', '').gsub(']','')
366
+ Wassup::Color.new(str)
367
+ else
368
+ str
369
+ end
370
+ end
371
+
372
+ all_parts = splits.zip(scans).flatten.compact
373
+
374
+ char_count = 0
375
+
376
+ if should_highlight
377
+ self.subwin.attrset(Curses.color_pair(Wassup::Color::Pair::HIGHLIGHT))
378
+ end
379
+
380
+ all_parts.each do |part|
381
+ if part.is_a?(Wassup::Color)
382
+ #color = Curses.color_pair([1,2,3,4].sample)
383
+ if !should_highlight
384
+ self.subwin.attrset(Curses.color_pair(part.color_pair))
385
+ end
386
+ else
387
+ new_char_count = char_count + part.size
388
+ if new_char_count >= max_char
389
+ part = part[0...(max_char - char_count)]
390
+ end
391
+
392
+ self.subwin.setpos(idx, char_count)
393
+ self.subwin.addstr(part)
394
+
395
+ char_count += part.size
396
+ end
397
+
398
+ end
399
+
400
+ self.subwin.attrset(Curses.color_pair(Wassup::Color::Pair::NORMAL))
401
+ self.subwin.clrtoeol()
231
402
  end
232
403
  self.subwin.refresh
233
404
  end
@@ -289,7 +460,7 @@ module Wassup
289
460
  def scroll_left
290
461
  self.selected_view_index -= 1
291
462
  if self.selected_view_index < 0
292
- self.selected_view_index = self.all_view_data_objects.size - 1
463
+ self.selected_view_index = self.contents.size - 1
293
464
  end
294
465
 
295
466
  self.load_current_view
@@ -297,7 +468,7 @@ module Wassup
297
468
 
298
469
  def scroll_right
299
470
  self.selected_view_index += 1
300
- if self.selected_view_index >= self.all_view_data_objects.size
471
+ if self.selected_view_index >= self.contents.size
301
472
  self.selected_view_index = 0
302
473
  end
303
474
 
@@ -327,10 +498,10 @@ module Wassup
327
498
  self.top += 1
328
499
  str = self.data_lines[self.top + self.subwin.maxy - 1]
329
500
  if str
330
- self.subwin.attron(Curses.color_pair(1))
501
+ self.subwin.attrset(Curses.color_pair(Wassup::Color::Pair::NORMAL))
331
502
  self.subwin.setpos(self.subwin.maxy - 1, 0)
332
503
  self.subwin.addstr(str)
333
- self.subwin.attron(Curses.color_pair(1))
504
+ self.subwin.attrset(Curses.color_pair(Wassup::Color::Pair::NORMAL))
334
505
  end
335
506
  return true
336
507
  else
@@ -348,27 +519,29 @@ module Wassup
348
519
 
349
520
  if input == "j"
350
521
  if virtual_scroll
351
- virtual_scroll_down
522
+ self.virtual_scroll_down
352
523
  else
353
524
  scroll_down
354
525
  end
355
526
  elsif input == "k"
356
527
  if virtual_scroll
357
- virtual_scroll_up
528
+ self.virtual_scroll_up
358
529
  else
359
530
  scroll_up
360
531
  end
361
532
  elsif input == "h"
362
- scroll_left
533
+ self.scroll_left
363
534
  elsif input == "l"
364
- scroll_right
365
- elsif input == "q"
366
- # TODO: This needs to quit
367
- # Need to kill the loop or something
368
- elsif input == 10 # enter
369
- if !self.selection_block.nil? && !self.highlighted_line.nil?
370
- data = @data_objects[self.highlighted_line]
371
- self.selection_block.call(data)
535
+ self.scroll_right
536
+ elsif input == "r"
537
+ self.refresh(force: true)
538
+ else
539
+ selection_block = self.selection_blocks[input]
540
+ if !selection_block.nil? && !self.highlighted_line.nil?
541
+ content = self.contents[self.selected_view_index]
542
+ row = content.data[self.highlighted_line]
543
+ data = row.object || row.display
544
+ selection_block.call(data)
372
545
  end
373
546
  end
374
547
  end
@@ -9,16 +9,87 @@ module Wassup
9
9
  attr_accessor :highlight
10
10
 
11
11
  attr_accessor :title
12
+ attr_accessor :description
13
+
14
+ attr_accessor :show_refresh
12
15
 
13
16
  attr_accessor :interval
14
17
  attr_accessor :content_block
15
- attr_accessor :selection_block
18
+ attr_accessor :selection_blocks
19
+ attr_accessor :selection_blocks_description
20
+
21
+ class ContentBuilder
22
+ attr_accessor :contents
23
+
24
+ def initialize(contents)
25
+ @contents = contents
26
+ @need_to_clear = true
27
+ @show_refresh = true
28
+ end
29
+
30
+ def clear=(clear)
31
+ @need_to_clear = clear
32
+ end
33
+
34
+ def add_row(display, object=nil, page:nil)
35
+ if @need_to_clear
36
+ @need_to_clear = false
37
+ self.contents = []
38
+ end
39
+
40
+ content = nil
41
+
42
+ # Create contents if none
43
+ if page.nil?
44
+ if self.contents.empty?
45
+ content = Pane::Content.new
46
+ self.contents << content
47
+ else
48
+ content = self.contents.first
49
+ end
50
+ elsif page.is_a?(String)
51
+ content = self.contents.find do |content|
52
+ content.title == page
53
+ end
54
+
55
+ if content.nil?
56
+ content = Pane::Content.new(page)
57
+ self.contents << content
58
+ end
59
+ end
60
+
61
+ content.add_row(display, object)
62
+ end
63
+ end
64
+
65
+ def initialize()
66
+ @height = 1
67
+ @weight = 1
68
+ @top = 0
69
+ @left = 0
70
+
71
+ @highlight = false
72
+ @interval = 60 * 5
73
+
74
+ @selection_blocks = {}
75
+ @selection_blocks_description = {}
76
+ end
16
77
 
17
78
  def content(&block)
18
79
  self.content_block = block
19
80
  end
20
- def selection(&block)
21
- self.selection_block = 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
+ input = "<Enter>"
89
+ end
90
+
91
+ self.selection_blocks[input] = block
92
+ self.selection_blocks_description[input] = description
22
93
  end
23
94
  end
24
95
  end
@@ -1,3 +1,3 @@
1
1
  module Wassup
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/wassup.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "wassup/version"
2
2
  require "wassup/app"
3
+ require "wassup/color"
3
4
  require "wassup/pane"
4
5
  require "wassup/pane_builder"
5
6
 
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.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Holtz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-02 00:00:00.000000000 Z
11
+ date: 2021-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -32,6 +32,7 @@ executables:
32
32
  extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
+ - ".github/FUNDING.yml"
35
36
  - ".gitignore"
36
37
  - ".rspec"
37
38
  - ".travis.yml"
@@ -44,9 +45,48 @@ files:
44
45
  - bin/console
45
46
  - bin/setup
46
47
  - bin/wassup
48
+ - docs/.gitignore
49
+ - docs/README.md
50
+ - docs/babel.config.js
51
+ - docs/blog/2021-12-09-welcome/index.md
52
+ - docs/blog/authors.yml
53
+ - docs/docs/Supfile-basics/_category_.json
54
+ - docs/docs/Supfile-basics/understanding-the-supfile.md
55
+ - docs/docs/intro.md
56
+ - docs/docusaurus.config.js
57
+ - docs/package-lock.json
58
+ - docs/package.json
59
+ - docs/sidebars.js
60
+ - docs/src/components/HomepageFeatures.module.css
61
+ - docs/src/components/HomepageFeatures.tsx
62
+ - docs/src/css/custom.css
63
+ - docs/src/pages/index.module.css
64
+ - docs/src/pages/index.tsx
65
+ - docs/src/pages/markdown-page.md
66
+ - docs/static/.nojekyll
67
+ - docs/static/img/demo-supfile.png
68
+ - docs/static/img/favicon.ico
69
+ - docs/static/img/logo.svg
70
+ - docs/static/img/tutorial-intro-starter-screenshot.png
71
+ - docs/static/img/tutorial/docsVersionDropdown.png
72
+ - docs/static/img/tutorial/localeDropdown.png
73
+ - docs/static/img/undraw_docusaurus_mountain.svg
74
+ - docs/static/img/undraw_docusaurus_react.svg
75
+ - docs/static/img/undraw_docusaurus_tree.svg
76
+ - docs/static/img/wassup-long.png
77
+ - docs/static/img/wassup-screenshot.png
78
+ - docs/static/img/wassup.png
79
+ - docs/static/video/wassup-demo.mov
80
+ - docs/tsconfig.json
81
+ - examples/basic/Supfile
82
+ - examples/debug/Supfile
83
+ - examples/josh-fastlane/README.md
47
84
  - examples/josh-fastlane/Supfile
85
+ - examples/josh-fastlane/demo.png
86
+ - examples/starter/Supfile
48
87
  - lib/wassup.rb
49
88
  - lib/wassup/app.rb
89
+ - lib/wassup/color.rb
50
90
  - lib/wassup/pane.rb
51
91
  - lib/wassup/pane_builder.rb
52
92
  - lib/wassup/version.rb