remedy 0.3.1 → 0.4.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.
- checksums.yaml +4 -4
- data/examples/from_readme/Gemfile +3 -0
- data/examples/menu/Gemfile +3 -0
- data/examples/menu/menu.rb +3 -8
- data/lib/remedy/partial.rb +5 -3
- data/lib/remedy/size.rb +7 -1
- data/lib/remedy/version.rb +1 -1
- data/lib/remedy/viewport.rb +27 -22
- data/spec/viewport_spec.rb +6 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af17b629f35cdae5c8a15c47a6e23f5aa51bce006afa7f7e129a8640c9d191b1
|
4
|
+
data.tar.gz: 36568e55906c286e97666183f9e6eb704535b6155830bc93acda7c59299a2ab6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 447afaf7d518eb6b8ddeb80dc9d7b4cae579a978ec6af952749dafe52b2d95b930ef6e6bbc24378ebab81ec48807102453d07e0f8196b251d62ffd84662f80a9
|
7
|
+
data.tar.gz: 7d800899e64c41e9acd31215df9b66fd1dd96f9da52a735e3393c855bf91f8d75f1fc224dc559f9560fedaa89a4c88468cce94b9713bd3bb1ef3e2b428d52e61
|
data/examples/menu/menu.rb
CHANGED
@@ -11,11 +11,6 @@ class Menu
|
|
11
11
|
|
12
12
|
# will do basic setup and then loop over user input
|
13
13
|
def listen
|
14
|
-
# get the screen in a reliable state and clear it
|
15
|
-
ANSI.screen.safe_reset!
|
16
|
-
ANSI.cursor.home!
|
17
|
-
ANSI.command.clear_screen!
|
18
|
-
|
19
14
|
# if the user resizes the screen we redraw it to fit the new dimensions
|
20
15
|
Console.set_console_resized_hook! do |size|
|
21
16
|
draw
|
@@ -24,10 +19,10 @@ class Menu
|
|
24
19
|
# create an interaction object to handle user input
|
25
20
|
interaction = Interaction.new
|
26
21
|
|
27
|
-
# call draw here because interaction blocks until it gets input
|
22
|
+
# call draw here because the interaction loop blocks until it gets input
|
28
23
|
draw
|
29
24
|
|
30
|
-
# loop over
|
25
|
+
# loop over individual keypresses or ANSI codes from the terminal
|
31
26
|
interaction.loop do |key|
|
32
27
|
@last_key = key
|
33
28
|
if key == "q" then
|
@@ -39,7 +34,7 @@ class Menu
|
|
39
34
|
|
40
35
|
# this tells the Viewport to draw to the screen
|
41
36
|
def draw
|
42
|
-
@viewport.draw content, Size
|
37
|
+
@viewport.draw content, Size.zero, header, footer
|
43
38
|
end
|
44
39
|
|
45
40
|
# this is the body of our menu, it will be squished if the terminal is too small
|
data/lib/remedy/partial.rb
CHANGED
@@ -16,6 +16,7 @@ module Remedy
|
|
16
16
|
reset_width!
|
17
17
|
line = "#{line}" # opportunistically convert any object into a string
|
18
18
|
@lines += clean line unless line.nil? || line.empty?
|
19
|
+
self
|
19
20
|
end
|
20
21
|
|
21
22
|
def first
|
@@ -26,16 +27,17 @@ module Remedy
|
|
26
27
|
lines.last
|
27
28
|
end
|
28
29
|
|
29
|
-
def
|
30
|
+
def height
|
30
31
|
lines.length
|
31
32
|
end
|
33
|
+
alias_method :length, :height
|
32
34
|
|
33
35
|
def width
|
34
|
-
|
36
|
+
lines.map{|line| line.length }.max
|
35
37
|
end
|
36
38
|
|
37
39
|
def size
|
38
|
-
Size.new
|
40
|
+
Size.new height, width
|
39
41
|
end
|
40
42
|
|
41
43
|
def to_a
|
data/lib/remedy/size.rb
CHANGED
@@ -11,6 +11,10 @@ module Remedy
|
|
11
11
|
end
|
12
12
|
attr_accessor :dimensions
|
13
13
|
|
14
|
+
def self.zero
|
15
|
+
self.new([0,0])
|
16
|
+
end
|
17
|
+
|
14
18
|
def - other_size
|
15
19
|
if other_size.respond_to? :length then
|
16
20
|
self.class.new subtract(other_size)
|
@@ -41,11 +45,13 @@ module Remedy
|
|
41
45
|
def rows
|
42
46
|
dimensions[0]
|
43
47
|
end
|
48
|
+
alias_method :height, :rows
|
44
49
|
|
45
50
|
def cols
|
46
51
|
dimensions[1]
|
47
52
|
end
|
48
|
-
|
53
|
+
alias_method :columns, :cols
|
54
|
+
alias_method :width, :cols
|
49
55
|
|
50
56
|
def [] index
|
51
57
|
dimensions[index]
|
data/lib/remedy/version.rb
CHANGED
data/lib/remedy/viewport.rb
CHANGED
@@ -5,14 +5,10 @@ require 'remedy/ansi'
|
|
5
5
|
|
6
6
|
module Remedy
|
7
7
|
class Viewport
|
8
|
-
def draw content,
|
9
|
-
range = range_find content,
|
8
|
+
def draw content, scroll = Size.zero, header = Partial.new, footer = Partial.new
|
9
|
+
range = range_find content, scroll, available_space(header,footer)
|
10
10
|
|
11
|
-
|
12
|
-
viewable_content = content
|
13
|
-
else
|
14
|
-
viewable_content = content.excerpt *range
|
15
|
-
end
|
11
|
+
viewable_content = content.excerpt *range
|
16
12
|
|
17
13
|
view = View.new viewable_content, header, footer
|
18
14
|
|
@@ -20,19 +16,22 @@ module Remedy
|
|
20
16
|
Console.output << view
|
21
17
|
end
|
22
18
|
|
23
|
-
def range_find partial,
|
24
|
-
|
25
|
-
|
19
|
+
def range_find partial, scroll, available_heightwidth
|
20
|
+
avail_height, avail_width = available_heightwidth
|
21
|
+
partial_height, partial_width = partial.size
|
22
|
+
|
23
|
+
center_row, center_col = scroll
|
26
24
|
|
27
|
-
center_row,
|
25
|
+
row_range = get_range center_row, partial_height, avail_height
|
26
|
+
col_range = get_range center_col, partial_width, avail_width
|
28
27
|
|
29
|
-
row_range = center_range center_row, row_size, row_limit
|
30
|
-
col_range = center_range center_col, col_size, col_limit
|
31
28
|
[row_range, col_range]
|
32
29
|
end
|
33
30
|
|
34
|
-
|
35
|
-
|
31
|
+
# This determines the maximum amount of room left available for Content
|
32
|
+
# after taking into consideration the height of the Header and Footer
|
33
|
+
def available_space header, footer
|
34
|
+
trim = Size [header.height + footer.height, 0]
|
36
35
|
size - trim
|
37
36
|
end
|
38
37
|
|
@@ -40,20 +39,26 @@ module Remedy
|
|
40
39
|
Size Console.size
|
41
40
|
end
|
42
41
|
|
43
|
-
def
|
44
|
-
|
42
|
+
def get_range offset, actual, available
|
43
|
+
# if the actual content can fit into the available space, then we're done
|
44
|
+
return (0...actual) if actual <= available
|
45
45
|
|
46
|
-
|
47
|
-
range_start = limit - width
|
48
|
-
end
|
46
|
+
# otherwise start looking at the scrolling offset, if any
|
49
47
|
|
50
|
-
|
48
|
+
# clamp the offset within the possible range of the actual content
|
49
|
+
if offset < 0 then
|
51
50
|
range_start = 0
|
51
|
+
elsif offset > actual then
|
52
|
+
range_start = actual
|
53
|
+
else
|
54
|
+
range_start = offset
|
52
55
|
end
|
53
56
|
|
54
|
-
|
57
|
+
# determine the subset of content that can be displayed
|
58
|
+
range_end = range_start + (available - offset)
|
55
59
|
|
56
60
|
(range_start...range_end)
|
57
61
|
end
|
62
|
+
|
58
63
|
end
|
59
64
|
end
|
data/spec/viewport_spec.rb
CHANGED
@@ -3,11 +3,17 @@ require 'remedy/viewport'
|
|
3
3
|
|
4
4
|
describe Remedy::Viewport do
|
5
5
|
it 'should be able to execute the example code from the readme' do
|
6
|
+
@stdout = $stdout
|
6
7
|
joke = ::Remedy::Partial.new
|
7
8
|
joke << "Q: What's the difference between a duck?"
|
8
9
|
joke << "A: Purple, because ice cream has no bones!"
|
9
10
|
|
10
11
|
screen = ::Remedy::Viewport.new
|
12
|
+
sio = StringIO.new
|
13
|
+
$stdout = sio
|
11
14
|
screen.draw joke unless ENV['CI']
|
15
|
+
expect(sio.string).to include("ice cream")
|
16
|
+
ensure
|
17
|
+
$stdout = @stdout
|
12
18
|
end
|
13
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: remedy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anthony M. Cook
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -42,7 +42,9 @@ files:
|
|
42
42
|
- LICENSE.txt
|
43
43
|
- README.markdown
|
44
44
|
- Rakefile
|
45
|
+
- examples/from_readme/Gemfile
|
45
46
|
- examples/from_readme/readme.rb
|
47
|
+
- examples/menu/Gemfile
|
46
48
|
- examples/menu/menu.rb
|
47
49
|
- lib/remedy.rb
|
48
50
|
- lib/remedy/ansi.rb
|