fatty 0.99.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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/.envrc +2 -0
  3. data/.simplecov +23 -0
  4. data/.yardopts +4 -0
  5. data/CHANGELOG.md +34 -0
  6. data/CHANGELOG.org +38 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +31 -0
  9. data/README.org +166 -0
  10. data/Rakefile +15 -0
  11. data/TODO.org +163 -0
  12. data/examples/markdown/native-markdown.md +370 -0
  13. data/examples/markdown/ox-gfm-markdown.md +373 -0
  14. data/examples/markdown/ox-gfm-markdown.org +376 -0
  15. data/exe/fatty +275 -0
  16. data/fatty.gemspec +42 -0
  17. data/lib/fatty/accept_env.rb +32 -0
  18. data/lib/fatty/action.rb +103 -0
  19. data/lib/fatty/action_environment.rb +42 -0
  20. data/lib/fatty/actionable.rb +73 -0
  21. data/lib/fatty/alert.rb +93 -0
  22. data/lib/fatty/ansi/renderer.rb +168 -0
  23. data/lib/fatty/ansi.rb +352 -0
  24. data/lib/fatty/colors/color.rb +379 -0
  25. data/lib/fatty/colors/pairs.rb +73 -0
  26. data/lib/fatty/colors/palette.rb +73 -0
  27. data/lib/fatty/colors/rgb.txt +788 -0
  28. data/lib/fatty/colors.rb +5 -0
  29. data/lib/fatty/config.rb +86 -0
  30. data/lib/fatty/config_files/config.yml +50 -0
  31. data/lib/fatty/config_files/help.md +120 -0
  32. data/lib/fatty/config_files/help.org +124 -0
  33. data/lib/fatty/config_files/keybindings.yml +49 -0
  34. data/lib/fatty/config_files/keydefs.yml +23 -0
  35. data/lib/fatty/config_files/themes/mono.yml +76 -0
  36. data/lib/fatty/config_files/themes/nordic.yml +77 -0
  37. data/lib/fatty/config_files/themes/solarized_dark.yml +77 -0
  38. data/lib/fatty/config_files/themes/terminal.yml +90 -0
  39. data/lib/fatty/config_files/themes/wordperfect.yml +77 -0
  40. data/lib/fatty/config_files/themes/wordperfect_light.yml +77 -0
  41. data/lib/fatty/core_ext/string.rb +21 -0
  42. data/lib/fatty/core_ext.rb +3 -0
  43. data/lib/fatty/counter.rb +81 -0
  44. data/lib/fatty/curses/context.rb +279 -0
  45. data/lib/fatty/curses/curses_coder.rb +684 -0
  46. data/lib/fatty/curses/event_source.rb +230 -0
  47. data/lib/fatty/curses/key_decoder.rb +183 -0
  48. data/lib/fatty/curses/patch.rb +116 -0
  49. data/lib/fatty/curses/window_styling.rb +32 -0
  50. data/lib/fatty/curses.rb +16 -0
  51. data/lib/fatty/env.rb +100 -0
  52. data/lib/fatty/help.rb +41 -0
  53. data/lib/fatty/history/entry.rb +71 -0
  54. data/lib/fatty/history.rb +289 -0
  55. data/lib/fatty/input_buffer.rb +998 -0
  56. data/lib/fatty/input_field.rb +507 -0
  57. data/lib/fatty/key_event.rb +342 -0
  58. data/lib/fatty/key_map.rb +392 -0
  59. data/lib/fatty/keymaps/emacs.rb +189 -0
  60. data/lib/fatty/log_formats/json.rb +47 -0
  61. data/lib/fatty/log_formats/text.rb +67 -0
  62. data/lib/fatty/logger.rb +142 -0
  63. data/lib/fatty/markdown/ansi_renderer.rb +373 -0
  64. data/lib/fatty/markdown/render.rb +22 -0
  65. data/lib/fatty/markdown.rb +4 -0
  66. data/lib/fatty/menu_env.rb +22 -0
  67. data/lib/fatty/mouse_event.rb +32 -0
  68. data/lib/fatty/output_buffer.rb +78 -0
  69. data/lib/fatty/pager.rb +801 -0
  70. data/lib/fatty/prompt.rb +40 -0
  71. data/lib/fatty/renderer/curses.rb +697 -0
  72. data/lib/fatty/renderer/truecolor.rb +607 -0
  73. data/lib/fatty/renderer.rb +419 -0
  74. data/lib/fatty/screen.rb +96 -0
  75. data/lib/fatty/search.rb +43 -0
  76. data/lib/fatty/session/alert_session.rb +52 -0
  77. data/lib/fatty/session/input_session.rb +99 -0
  78. data/lib/fatty/session/isearch_session.rb +172 -0
  79. data/lib/fatty/session/keytest_session.rb +236 -0
  80. data/lib/fatty/session/modal_session.rb +61 -0
  81. data/lib/fatty/session/output_session.rb +105 -0
  82. data/lib/fatty/session/popup_session.rb +540 -0
  83. data/lib/fatty/session/prompt_session.rb +157 -0
  84. data/lib/fatty/session/search_session.rb +136 -0
  85. data/lib/fatty/session/shell_session.rb +566 -0
  86. data/lib/fatty/session.rb +173 -0
  87. data/lib/fatty/sessions.rb +14 -0
  88. data/lib/fatty/terminal/popup_owner.rb +26 -0
  89. data/lib/fatty/terminal/progress.rb +374 -0
  90. data/lib/fatty/terminal.rb +1067 -0
  91. data/lib/fatty/themes/loader.rb +136 -0
  92. data/lib/fatty/themes/manager.rb +71 -0
  93. data/lib/fatty/themes/registry.rb +64 -0
  94. data/lib/fatty/themes/resolver.rb +224 -0
  95. data/lib/fatty/themes/themes.rb +131 -0
  96. data/lib/fatty/themes.rb +6 -0
  97. data/lib/fatty/version.rb +5 -0
  98. data/lib/fatty/view/alert_view.rb +14 -0
  99. data/lib/fatty/view/cursor_view.rb +18 -0
  100. data/lib/fatty/view/input_view.rb +9 -0
  101. data/lib/fatty/view/output_view.rb +9 -0
  102. data/lib/fatty/view/status_view.rb +14 -0
  103. data/lib/fatty/view.rb +33 -0
  104. data/lib/fatty/viewport.rb +90 -0
  105. data/lib/fatty/views.rb +9 -0
  106. data/lib/fatty.rb +55 -0
  107. data/sig/fatty.rbs +4 -0
  108. metadata +250 -0
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fatty
4
+ class StatusView < View
5
+ def render(screen:, renderer:, terminal:)
6
+ return unless terminal.status_text
7
+
8
+ renderer.render_status(
9
+ terminal.status_text,
10
+ role: terminal.status_role || :info,
11
+ )
12
+ end
13
+ end
14
+ end
data/lib/fatty/view.rb ADDED
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fatty
4
+ class View
5
+ attr_reader :id, :z
6
+
7
+ def initialize(id: nil, z: 0, log: false)
8
+ @id = (id || self.class.name.split("::").last).to_s
9
+ @z = Integer(z)
10
+ @log = !!log
11
+ end
12
+
13
+ # Render wrapper: logs once, then delegates to #draw.
14
+ # Subclasses implement #draw.
15
+ def render(screen:, renderer:, terminal:, session:)
16
+ if @log
17
+ Fatty.debug(
18
+ "View#render",
19
+ tag: :render,
20
+ view: id,
21
+ z: z,
22
+ session: session.respond_to?(:id) ? session.id : session.class.name,
23
+ )
24
+ end
25
+
26
+ draw(screen:, renderer:, terminal:, session:)
27
+ end
28
+
29
+ def draw(screen:, renderer:, terminal:, session:)
30
+ raise NotImplementedError, "#{self.class} must implement #draw"
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fatty
4
+ class Viewport
5
+ attr_accessor :top
6
+ attr_accessor :height
7
+
8
+ def initialize(top: 0, height:)
9
+ @top = top
10
+ @height = height
11
+ end
12
+
13
+ def adjust_for_trim(n)
14
+ @top = [@top - n, 0].max
15
+ end
16
+
17
+ def at_bottom?(total_lines = nil)
18
+ return false unless total_lines
19
+
20
+ @top >= max_top(total_lines)
21
+ end
22
+
23
+ def at_top?
24
+ @top <= 0
25
+ end
26
+
27
+ # 1-based index of the last visible line (clamped), or 0 if no lines.
28
+ def bottom_index(total_lines)
29
+ return 0 if total_lines <= 0
30
+
31
+ [@top + @height, total_lines].min
32
+ end
33
+
34
+ def position_percent(total_lines)
35
+ return 100 if total_lines <= 0
36
+
37
+ b = bottom_index(total_lines)
38
+ pct = (b.to_f / total_lines.to_f) * 100.0
39
+ pct.round
40
+ end
41
+
42
+ def slice(lines)
43
+ lines[@top, @height] || []
44
+ end
45
+
46
+ def max_top(total_lines)
47
+ [total_lines - @height, 0].max
48
+ end
49
+
50
+ def clamp!(lines)
51
+ @top = @top.clamp(0, max_top(lines.size))
52
+ end
53
+
54
+ def scroll_up(lines, n = 1)
55
+ @top -= n
56
+ clamp!(lines)
57
+ end
58
+
59
+ def scroll_down(lines, n = 1)
60
+ @top += n
61
+ clamp!(lines)
62
+ end
63
+
64
+ def scroll_to_bottom(lines)
65
+ @top = max_top(lines.size)
66
+ end
67
+
68
+ def page_up(lines)
69
+ scroll_up(lines, @height)
70
+ end
71
+
72
+ def page_down(lines)
73
+ scroll_down(lines, @height)
74
+ end
75
+
76
+ # Jump to the very top.
77
+ def page_top
78
+ @top = 0
79
+ end
80
+
81
+ # Jump to the very bottom.
82
+ def page_bottom(lines)
83
+ @top = max_top(lines.size)
84
+ end
85
+
86
+ def reset
87
+ @top = 0
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "view"
4
+
5
+ require_relative "view/output_view"
6
+ require_relative "view/alert_view"
7
+ require_relative "view/input_view"
8
+ require_relative "view/cursor_view"
9
+ require_relative "view/status_view"
data/lib/fatty.rb ADDED
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'fat_config'
5
+ require "json"
6
+ require "time"
7
+ require "fileutils"
8
+ require "rainbow"
9
+ require "redcarpet"
10
+ require "strscan"
11
+
12
+ require 'debug'
13
+
14
+ # Gem Overview (extracted from README.org by gem_docs)
15
+ #
16
+ # * Introduction
17
+ #
18
+ module Fatty
19
+ require_relative "fatty/version"
20
+ require_relative "fatty/core_ext"
21
+ require_relative "fatty/env"
22
+ require_relative "fatty/config"
23
+ require_relative "fatty/logger"
24
+ require_relative "fatty/counter"
25
+ require_relative "fatty/action_environment"
26
+ require_relative "fatty/accept_env"
27
+ require_relative "fatty/action"
28
+ require_relative "fatty/actionable"
29
+ require_relative "fatty/history"
30
+ require_relative "fatty/search"
31
+ require_relative "fatty/input_buffer"
32
+ require_relative "fatty/input_field"
33
+ require_relative "fatty/output_buffer"
34
+ require_relative "fatty/pager"
35
+ require_relative "fatty/alert"
36
+ require_relative "fatty/key_event"
37
+ require_relative "fatty/mouse_event"
38
+ require_relative "fatty/key_map"
39
+ require_relative "fatty/themes"
40
+ require_relative "fatty/ansi"
41
+ require_relative "fatty/colors"
42
+ require_relative "fatty/curses"
43
+ require_relative "fatty/renderer"
44
+ require_relative "fatty/prompt"
45
+ require_relative "fatty/menu_env"
46
+ require_relative "fatty/screen"
47
+ require_relative "fatty/viewport"
48
+ require_relative "fatty/views"
49
+ require_relative "fatty/sessions"
50
+ require_relative "fatty/terminal"
51
+ require_relative "fatty/markdown"
52
+ require_relative "fatty/help"
53
+
54
+ class Error < StandardError; end
55
+ end
data/sig/fatty.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Fatty
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,250 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fatty
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.99.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel E. Doherty
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: curses
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.4'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.4'
26
+ - !ruby/object:Gem::Dependency
27
+ name: fat_config
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.8.0
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 0.8.0
40
+ - !ruby/object:Gem::Dependency
41
+ name: unicode-display_width
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.5'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.5'
54
+ - !ruby/object:Gem::Dependency
55
+ name: yaml
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rainbow
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: redcarpet
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rouge
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: |
111
+ fatty is a pure Ruby curses-backed terminal interaction library with editable single-line input, scrollable output, and
112
+ programmable keybindings, inspired by modern shells like fish.
113
+ email:
114
+ - ded@ddoherty.net
115
+ executables:
116
+ - fatty
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - ".envrc"
121
+ - ".simplecov"
122
+ - ".yardopts"
123
+ - CHANGELOG.md
124
+ - CHANGELOG.org
125
+ - LICENSE.txt
126
+ - README.md
127
+ - README.org
128
+ - Rakefile
129
+ - TODO.org
130
+ - examples/markdown/native-markdown.md
131
+ - examples/markdown/ox-gfm-markdown.md
132
+ - examples/markdown/ox-gfm-markdown.org
133
+ - exe/fatty
134
+ - fatty.gemspec
135
+ - lib/fatty.rb
136
+ - lib/fatty/accept_env.rb
137
+ - lib/fatty/action.rb
138
+ - lib/fatty/action_environment.rb
139
+ - lib/fatty/actionable.rb
140
+ - lib/fatty/alert.rb
141
+ - lib/fatty/ansi.rb
142
+ - lib/fatty/ansi/renderer.rb
143
+ - lib/fatty/colors.rb
144
+ - lib/fatty/colors/color.rb
145
+ - lib/fatty/colors/pairs.rb
146
+ - lib/fatty/colors/palette.rb
147
+ - lib/fatty/colors/rgb.txt
148
+ - lib/fatty/config.rb
149
+ - lib/fatty/config_files/config.yml
150
+ - lib/fatty/config_files/help.md
151
+ - lib/fatty/config_files/help.org
152
+ - lib/fatty/config_files/keybindings.yml
153
+ - lib/fatty/config_files/keydefs.yml
154
+ - lib/fatty/config_files/themes/mono.yml
155
+ - lib/fatty/config_files/themes/nordic.yml
156
+ - lib/fatty/config_files/themes/solarized_dark.yml
157
+ - lib/fatty/config_files/themes/terminal.yml
158
+ - lib/fatty/config_files/themes/wordperfect.yml
159
+ - lib/fatty/config_files/themes/wordperfect_light.yml
160
+ - lib/fatty/core_ext.rb
161
+ - lib/fatty/core_ext/string.rb
162
+ - lib/fatty/counter.rb
163
+ - lib/fatty/curses.rb
164
+ - lib/fatty/curses/context.rb
165
+ - lib/fatty/curses/curses_coder.rb
166
+ - lib/fatty/curses/event_source.rb
167
+ - lib/fatty/curses/key_decoder.rb
168
+ - lib/fatty/curses/patch.rb
169
+ - lib/fatty/curses/window_styling.rb
170
+ - lib/fatty/env.rb
171
+ - lib/fatty/help.rb
172
+ - lib/fatty/history.rb
173
+ - lib/fatty/history/entry.rb
174
+ - lib/fatty/input_buffer.rb
175
+ - lib/fatty/input_field.rb
176
+ - lib/fatty/key_event.rb
177
+ - lib/fatty/key_map.rb
178
+ - lib/fatty/keymaps/emacs.rb
179
+ - lib/fatty/log_formats/json.rb
180
+ - lib/fatty/log_formats/text.rb
181
+ - lib/fatty/logger.rb
182
+ - lib/fatty/markdown.rb
183
+ - lib/fatty/markdown/ansi_renderer.rb
184
+ - lib/fatty/markdown/render.rb
185
+ - lib/fatty/menu_env.rb
186
+ - lib/fatty/mouse_event.rb
187
+ - lib/fatty/output_buffer.rb
188
+ - lib/fatty/pager.rb
189
+ - lib/fatty/prompt.rb
190
+ - lib/fatty/renderer.rb
191
+ - lib/fatty/renderer/curses.rb
192
+ - lib/fatty/renderer/truecolor.rb
193
+ - lib/fatty/screen.rb
194
+ - lib/fatty/search.rb
195
+ - lib/fatty/session.rb
196
+ - lib/fatty/session/alert_session.rb
197
+ - lib/fatty/session/input_session.rb
198
+ - lib/fatty/session/isearch_session.rb
199
+ - lib/fatty/session/keytest_session.rb
200
+ - lib/fatty/session/modal_session.rb
201
+ - lib/fatty/session/output_session.rb
202
+ - lib/fatty/session/popup_session.rb
203
+ - lib/fatty/session/prompt_session.rb
204
+ - lib/fatty/session/search_session.rb
205
+ - lib/fatty/session/shell_session.rb
206
+ - lib/fatty/sessions.rb
207
+ - lib/fatty/terminal.rb
208
+ - lib/fatty/terminal/popup_owner.rb
209
+ - lib/fatty/terminal/progress.rb
210
+ - lib/fatty/themes.rb
211
+ - lib/fatty/themes/loader.rb
212
+ - lib/fatty/themes/manager.rb
213
+ - lib/fatty/themes/registry.rb
214
+ - lib/fatty/themes/resolver.rb
215
+ - lib/fatty/themes/themes.rb
216
+ - lib/fatty/version.rb
217
+ - lib/fatty/view.rb
218
+ - lib/fatty/view/alert_view.rb
219
+ - lib/fatty/view/cursor_view.rb
220
+ - lib/fatty/view/input_view.rb
221
+ - lib/fatty/view/output_view.rb
222
+ - lib/fatty/view/status_view.rb
223
+ - lib/fatty/viewport.rb
224
+ - lib/fatty/views.rb
225
+ - sig/fatty.rbs
226
+ homepage: https://github.com/ddoherty03/fatty
227
+ licenses:
228
+ - MIT
229
+ metadata:
230
+ allowed_push_host: https://rubygems.org
231
+ homepage_uri: https://github.com/ddoherty03/fatty
232
+ source_code_uri: https://github.com/ddoherty03/fatty
233
+ rdoc_options: []
234
+ require_paths:
235
+ - lib
236
+ required_ruby_version: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - ">="
239
+ - !ruby/object:Gem::Version
240
+ version: 3.2.0
241
+ required_rubygems_version: !ruby/object:Gem::Requirement
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ requirements: []
247
+ rubygems_version: 4.0.0
248
+ specification_version: 4
249
+ summary: Stateful terminal UI with editable input and scrollback
250
+ test_files: []