helium-console 0.1.9 → 0.1.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/pull_request.yml +37 -0
- data/.rspec +0 -1
- data/.rubocop.yml +18 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +9 -1
- data/README.md +69 -13
- data/bin/console +1 -1
- data/lib/helium/console/colorized_string.rb +31 -0
- data/lib/helium/console/formatter.rb +127 -0
- data/lib/helium/console/formatters/overflow/wrap.rb +2 -0
- data/lib/helium/console/key_value.rb +130 -0
- data/lib/helium/console/printer.rb +16 -4
- data/lib/helium/console/prompt.rb +44 -0
- data/lib/helium/console/registry/array.rb +22 -11
- data/lib/helium/console/registry/booleans.rb +2 -2
- data/lib/helium/console/registry/date.rb +15 -0
- data/lib/helium/console/registry/hash.rb +29 -14
- data/lib/helium/console/registry/method.rb +64 -0
- data/lib/helium/console/registry/module.rb +18 -6
- data/lib/helium/console/registry/nil.rb +1 -1
- data/lib/helium/console/registry/numeric.rb +7 -1
- data/lib/helium/console/registry/object.rb +21 -40
- data/lib/helium/console/registry/pathname.rb +11 -0
- data/lib/helium/console/registry/set.rb +91 -0
- data/lib/helium/console/registry/string.rb +32 -12
- data/lib/helium/console/registry/symbol.rb +1 -1
- data/lib/helium/console/registry/time.rb +15 -0
- data/lib/helium/console/registry.rb +16 -60
- data/lib/helium/console/version.rb +1 -1
- data/lib/helium/console.rb +45 -29
- metadata +12 -4
- data/lib/helium/console/registry/table.rb +0 -82
- data/lib/helium/console/table.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7a2bce9c0f3fe1f94baf382a4f23d10b9fab87164dddbce7736a00a10357cf4
|
4
|
+
data.tar.gz: 420ff6d68c766405c2f29a7ee37cd7fa4d78341ac52769341c4ed54f995ccd24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83528cf238a38ca7de2a49534233a1e8c2bce5c761291b1115114e7ac814096e669008445f063fe2eb1f3cdd4ef12de02258547344098cf776bed721ed95d666
|
7
|
+
data.tar.gz: 19f87c531bf302a9d66d8eced560fe81303d728ea778937396d4d439fc987d5fd9a97a88c39976df3431a65ca469c702f0aacca232e57587bbade9fd4ba99de0
|
@@ -0,0 +1,37 @@
|
|
1
|
+
name: Pull request
|
2
|
+
|
3
|
+
on:
|
4
|
+
pull_request:
|
5
|
+
|
6
|
+
jobs:
|
7
|
+
test:
|
8
|
+
name: Spec
|
9
|
+
runs-on: ubuntu-latest
|
10
|
+
strategy:
|
11
|
+
matrix:
|
12
|
+
ruby-version: ['2.6', '2.7', '3.0']
|
13
|
+
fail-fast: false
|
14
|
+
|
15
|
+
steps:
|
16
|
+
- uses: actions/checkout@v2
|
17
|
+
- name: Set up Ruby
|
18
|
+
uses: ruby/setup-ruby@v1
|
19
|
+
with:
|
20
|
+
ruby-version: ${{ matrix.ruby-version }}
|
21
|
+
bundler-cache: true
|
22
|
+
- name: Run tests
|
23
|
+
run: bundle exec rspec
|
24
|
+
|
25
|
+
lint:
|
26
|
+
name: Lint
|
27
|
+
runs-on: ubuntu-latest
|
28
|
+
|
29
|
+
steps:
|
30
|
+
- uses: actions/checkout@v2
|
31
|
+
- name: Set up Ruby
|
32
|
+
uses: ruby/setup-ruby@v1
|
33
|
+
with:
|
34
|
+
ruby-version: 2.7
|
35
|
+
bundler-cache: true
|
36
|
+
- name: Run tests
|
37
|
+
run: bundle exec rubocop
|
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
@@ -67,4 +67,22 @@ Style/NumericPredicate:
|
|
67
67
|
Style/EachWithObject:
|
68
68
|
Enabled: false
|
69
69
|
|
70
|
+
RSpec/MultipleMemoizedHelpers:
|
71
|
+
Enabled: false
|
72
|
+
|
73
|
+
RSpec/FilePath:
|
74
|
+
Enabled: false
|
75
|
+
|
76
|
+
RSpec/DescribeMethod:
|
77
|
+
Enabled: false
|
78
|
+
|
79
|
+
RSpec/DescribeClass:
|
80
|
+
Enabled: false
|
81
|
+
|
82
|
+
Metrics/ParameterLists:
|
83
|
+
CountKeywordArgs: false
|
84
|
+
|
85
|
+
Metrics/AbcSize:
|
86
|
+
Max: 20
|
87
|
+
|
70
88
|
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
helium-console (0.1.
|
4
|
+
helium-console (0.1.13)
|
5
5
|
colorize
|
6
6
|
pry
|
7
7
|
|
@@ -13,6 +13,7 @@ GEM
|
|
13
13
|
coderay (1.1.3)
|
14
14
|
colorize (0.8.1)
|
15
15
|
diff-lcs (1.4.4)
|
16
|
+
docile (1.4.0)
|
16
17
|
ffaker (2.18.0)
|
17
18
|
method_source (1.0.0)
|
18
19
|
parallel (1.20.1)
|
@@ -55,6 +56,12 @@ GEM
|
|
55
56
|
rubocop (~> 1.0)
|
56
57
|
rubocop-ast (>= 1.1.0)
|
57
58
|
ruby-progressbar (1.11.0)
|
59
|
+
simplecov (0.21.2)
|
60
|
+
docile (~> 1.1)
|
61
|
+
simplecov-html (~> 0.11)
|
62
|
+
simplecov_json_formatter (~> 0.1)
|
63
|
+
simplecov-html (0.12.3)
|
64
|
+
simplecov_json_formatter (0.1.3)
|
58
65
|
unicode-display_width (2.0.0)
|
59
66
|
|
60
67
|
PLATFORMS
|
@@ -69,6 +76,7 @@ DEPENDENCIES
|
|
69
76
|
rubocop
|
70
77
|
rubocop-rake
|
71
78
|
rubocop-rspec
|
79
|
+
simplecov
|
72
80
|
|
73
81
|
BUNDLED WITH
|
74
82
|
2.1.4
|
data/README.md
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
# Helium::Console
|
2
2
|
|
3
|
+
Readable console output for your ruby project!
|
4
|
+
|
3
5
|
It is really tricky to display data in the console in the readable and consistent way. Many objects needs to display other objects, which might break their own formatting.
|
4
|
-
Helium:Console is to make
|
6
|
+
Helium:Console is an attempt to make your development console more readable by:
|
7
|
+
* limiting displayed nesting levels to 3
|
8
|
+
* limiting data displayed for nested objects
|
9
|
+
* using nested table layout
|
10
|
+
* automatically dividing and wrapping long strings
|
5
11
|
|
6
12
|
## Installation
|
7
13
|
|
@@ -21,24 +27,74 @@ Or install it yourself as:
|
|
21
27
|
|
22
28
|
## Usage
|
23
29
|
|
24
|
-
|
30
|
+
You can start helium console same way as you would start Pry:
|
31
|
+
|
32
|
+
``` ruby
|
33
|
+
require 'helium/console'
|
34
|
+
Helium::Console.start
|
35
|
+
```
|
36
|
+
|
37
|
+
### Custom formatters
|
38
|
+
|
39
|
+
Helium::Console hooks into pry and brings a number of default formatters. Unlike IRB and Pry, it does not use object's methods for display
|
40
|
+
(so no `inspect` nor `pretty_print`) and replaces them by the collection of inheritable formatters objects stored in its registry.
|
41
|
+
|
42
|
+
Formatter can be any object that conforms to the following interface:
|
43
|
+
* `initialize(object_to_format, format, console_instance, **options)`
|
44
|
+
* `call` method returning any object responding to `lines` (e.g. `String` )
|
45
|
+
|
46
|
+
Formatter bellow will simply return a result of `inspect` call on the object:
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
class InspectFormatter
|
50
|
+
def initialize(object, _console, **)
|
51
|
+
@object = object
|
52
|
+
end
|
53
|
+
|
54
|
+
def call
|
55
|
+
@object.inspect
|
56
|
+
end
|
57
|
+
end
|
58
|
+
```
|
59
|
+
|
60
|
+
You can register your formatter in console registry with:
|
25
61
|
|
62
|
+
```ruby
|
63
|
+
Helium::Console.register(Kernel, InspectFormatter)
|
26
64
|
```
|
27
|
-
|
28
|
-
|
29
|
-
|
65
|
+
|
66
|
+
The call above makes `InspectFormatter` available for all the objects that derives from Kernel module.
|
67
|
+
|
68
|
+
To make formatting easier, you can subclass your formatter from `Helium::Console::Registry::Element`. By doing so, the following methods will be available to you inside your formatter class:
|
69
|
+
* `object`, `console` and `options` readers
|
70
|
+
* default `call` implementation, delegating formatting to one
|
71
|
+
* `format(other_object, **options)` - formats some other object **using the exact same options, including nesting level**.
|
72
|
+
* `format_nested(other_object, **options)` - as above, but increases nesting level.
|
73
|
+
* `format_string(string, **options)` - formats string by splitting it into lines of appropriate length and truncating (depending on nesting level).
|
74
|
+
This is different to `format` and `format_nested` as it will not trigger `String` formatter (which by default adds quotes, escapes inner quotes and colors the result light green)
|
75
|
+
* `red(string)`, `light_red(string)`, `yellow(string)`, etc - returns colorized string when `Pry.color` is set to true.
|
76
|
+
* `length_of(string)` - utility option returning the length of displayed string, handling both colorized and non-colorized strings.
|
77
|
+
|
78
|
+
### Displaying as a table
|
79
|
+
|
80
|
+
To display object in a form of a table, format instance of `Helium::Console::Table`:
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
class MyFormatter < Helium::Console::Registry::Element
|
84
|
+
def call
|
85
|
+
table = Helium::Console::Table.new(runner: '--@', after_key: '--@--', format_keys: false)
|
86
|
+
table.row magenta("property 1"), object.prop1
|
87
|
+
table.row magenta("property 2"), object.instance_variable_get(:@prop2)
|
88
|
+
|
89
|
+
format table
|
90
|
+
end
|
91
|
+
end
|
30
92
|
```
|
31
93
|
|
32
|
-
|
94
|
+
Table will automatically format all the right-hand values with an increased nesting level. By default, it will also format the left-hand keys, however this is controlled with `format_keys` option.
|
33
95
|
|
34
|
-
|
96
|
+
Other options: `runner` is a string to be displayed at the beginning of each line, and `after_key` is a string to be injected between left and right values.
|
35
97
|
|
36
|
-
* `indent` - specifies the amount of spaces added to each new line. Also accepts hash `{first:, other:}`. Defaults to 0.
|
37
|
-
* `overflow` - specifies how to handle lines longer than console line width.
|
38
|
-
* `:wrap` - splits the long line into few lines and applies the required indent.
|
39
|
-
* `:wrap_words` - similar to wrap, but will try to avoid breaking the words.
|
40
|
-
* `:none` - does not modify long strings.
|
41
|
-
* `max-lines` - specifies how many lines to display. Last line will be truncated with `...`. Defaults to `nil`
|
42
98
|
|
43
99
|
## Development
|
44
100
|
|
data/bin/console
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'colorized_string'
|
4
|
+
|
5
|
+
module Helium
|
6
|
+
class Console
|
7
|
+
class ColorizedString < ColorizedString
|
8
|
+
def length
|
9
|
+
uncolorize.to_s.length
|
10
|
+
end
|
11
|
+
|
12
|
+
def colorize(*)
|
13
|
+
return self unless Pry.color
|
14
|
+
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
module Helpers
|
19
|
+
ColorizedString.colors.each do |color|
|
20
|
+
define_method(color) do |string|
|
21
|
+
ColorizedString.new(string).colorize(color)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def length_of(string)
|
26
|
+
ColorizedString.new(string).length
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Helium
|
4
|
+
class Console
|
5
|
+
class Formatter
|
6
|
+
DEFAULT_STYLES = {
|
7
|
+
1 => [:full, {}],
|
8
|
+
2 => [:partial, {}],
|
9
|
+
3 => [:partial, { max_lines: 1 }]
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
class LazyStringEvaluator
|
13
|
+
def initialize(&block)
|
14
|
+
@lines = Enumerator.new { |y| block.(y) }
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :lines
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
lines.to_a.join
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(object, style, console, **options)
|
25
|
+
@object = object
|
26
|
+
@options = options
|
27
|
+
@style = style
|
28
|
+
@console = console
|
29
|
+
end
|
30
|
+
|
31
|
+
def call
|
32
|
+
method_name = [:render, @style].compact.join('_')
|
33
|
+
public_send(method_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
def optimal_format
|
37
|
+
DEFAULT_STYLES.fetch(level) { [:compact, {}] }
|
38
|
+
end
|
39
|
+
|
40
|
+
def render
|
41
|
+
style, options = optimal_format
|
42
|
+
format(object, style, **options)
|
43
|
+
end
|
44
|
+
|
45
|
+
def render_full
|
46
|
+
render_partial
|
47
|
+
end
|
48
|
+
|
49
|
+
def render_partial
|
50
|
+
format_string(render_inline, max_width: max_width, indent: indent)
|
51
|
+
end
|
52
|
+
|
53
|
+
def render_inline
|
54
|
+
render_compact
|
55
|
+
end
|
56
|
+
|
57
|
+
def render_compact
|
58
|
+
raise NotImplementedError
|
59
|
+
end
|
60
|
+
|
61
|
+
attr_reader :object, :options
|
62
|
+
|
63
|
+
def format_nested(other_object, style = nil, **options)
|
64
|
+
@console.format(other_object, style, **nested_opts(options))
|
65
|
+
end
|
66
|
+
|
67
|
+
def format(other_object, style = nil, **options)
|
68
|
+
@console.format(other_object, style, **nested_opts(options, increase_level: false))
|
69
|
+
end
|
70
|
+
|
71
|
+
def format_string(string, **options)
|
72
|
+
@console.format_string(string, **options)
|
73
|
+
end
|
74
|
+
|
75
|
+
def simple?
|
76
|
+
false
|
77
|
+
end
|
78
|
+
|
79
|
+
ColorizedString.colors.each do |color|
|
80
|
+
define_method color do |string|
|
81
|
+
ColorizedString.new(string).colorize(color)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def method_missing(name, *args)
|
86
|
+
return @options[name] if @options.key?(name)
|
87
|
+
|
88
|
+
super
|
89
|
+
end
|
90
|
+
|
91
|
+
def respond_to_missing?(name, private = false)
|
92
|
+
@options.key?(name) || super
|
93
|
+
end
|
94
|
+
|
95
|
+
def build_key_value(&block)
|
96
|
+
key_value = KeyValue.new
|
97
|
+
block.(key_value)
|
98
|
+
key_value
|
99
|
+
end
|
100
|
+
|
101
|
+
def format_key_value(key_value, **options)
|
102
|
+
key_value.as_table(level: level, console: @console, max_width: max_width, **options)
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def nested_objects
|
108
|
+
[]
|
109
|
+
end
|
110
|
+
|
111
|
+
def nested_opts(new_options, increase_level: true)
|
112
|
+
new_options = options.merge(new_options)
|
113
|
+
new_options[:level] += 1 if increase_level
|
114
|
+
new_options[:ignore_objects] = nested_objects
|
115
|
+
new_options
|
116
|
+
end
|
117
|
+
|
118
|
+
def length_of(string)
|
119
|
+
ColorizedString.new(string).length
|
120
|
+
end
|
121
|
+
|
122
|
+
def yield_lines(&block)
|
123
|
+
LazyStringEvaluator.new(&block)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Helium
|
4
|
+
class Console
|
5
|
+
class KeyValue
|
6
|
+
def row(key, value, format_key: {}, format_value: {})
|
7
|
+
rows << [key, value, { format_key: format_key, format_value: format_value }]
|
8
|
+
end
|
9
|
+
|
10
|
+
def rows
|
11
|
+
@rows ||= []
|
12
|
+
end
|
13
|
+
|
14
|
+
def as_table(console:, max_width:, level:, left: '|', between: ' ', right: '', format_keys: {}, format_values: {})
|
15
|
+
TableFormatter.(
|
16
|
+
self,
|
17
|
+
console: console,
|
18
|
+
left: left,
|
19
|
+
between: between,
|
20
|
+
right: right,
|
21
|
+
key_options: format_keys,
|
22
|
+
value_options: format_values,
|
23
|
+
max_width: max_width,
|
24
|
+
level: level
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
class TableFormatter
|
29
|
+
include ColorizedString::Helpers
|
30
|
+
|
31
|
+
def self.call(*args, **options)
|
32
|
+
new(*args, **options).()
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(
|
36
|
+
key_value,
|
37
|
+
console:,
|
38
|
+
level:,
|
39
|
+
left:,
|
40
|
+
between:,
|
41
|
+
right:,
|
42
|
+
max_width:,
|
43
|
+
key_options: {},
|
44
|
+
value_options: {}
|
45
|
+
)
|
46
|
+
@key_value = key_value
|
47
|
+
@console = console
|
48
|
+
@left = left
|
49
|
+
@between = between
|
50
|
+
@right = right
|
51
|
+
@max_width = max_width
|
52
|
+
@key_options = key_options
|
53
|
+
@level = level
|
54
|
+
@value_options = value_options
|
55
|
+
|
56
|
+
set_width_limits
|
57
|
+
end
|
58
|
+
|
59
|
+
def call
|
60
|
+
Formatter::LazyStringEvaluator.new do |y|
|
61
|
+
key_value.rows.each do |key, value, options|
|
62
|
+
format_entry(y, key, value, **options)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
attr_reader :key_value, :console, :left, :between, :right, :key_options, :value_options, :max_width
|
70
|
+
|
71
|
+
def format_entry(yielder, key, value, format_key:, format_value:)
|
72
|
+
key = format(key, merge_options(key_options, format_key))
|
73
|
+
value = format(value, merge_options(value_options, format_value))
|
74
|
+
zip_lines(key, value) do |key_line, value_line, index|
|
75
|
+
yielder << [
|
76
|
+
left,
|
77
|
+
rjust(key_line, key_width),
|
78
|
+
index.zero? ? between : ' ' * length_of(between),
|
79
|
+
value_line,
|
80
|
+
right
|
81
|
+
].join
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def key_width
|
86
|
+
@key_width ||= key_value.rows.first(100).map do |key, _, format_key:, **|
|
87
|
+
length_of(format(key, merge_options(key_options, format_key)))
|
88
|
+
end.max
|
89
|
+
end
|
90
|
+
|
91
|
+
def format(object, options = {})
|
92
|
+
return object unless options
|
93
|
+
|
94
|
+
console.format(object, options.delete(:style), level: @level + 1, **options)
|
95
|
+
end
|
96
|
+
|
97
|
+
def merge_options(opt1, opt2)
|
98
|
+
return false unless opt1 && opt2
|
99
|
+
|
100
|
+
opt1.merge(opt2)
|
101
|
+
end
|
102
|
+
|
103
|
+
def set_default(hash, key, &block)
|
104
|
+
hash[key] = block.() if hash && !hash[key]
|
105
|
+
end
|
106
|
+
|
107
|
+
def zip_lines(str1, str2)
|
108
|
+
str1 = (str1.lines.each + [nil].cycle).lazy
|
109
|
+
str2 = (str2.lines.each + [nil].cycle).lazy
|
110
|
+
str1.zip(str2).with_index.each do |(line1, line2), index|
|
111
|
+
break unless line1 || line2
|
112
|
+
|
113
|
+
yield [line1 || '', line2 || '', index]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def set_width_limits
|
118
|
+
set_default(key_options, :max_width) { max_width / 3 }
|
119
|
+
set_default(value_options, :max_width) do
|
120
|
+
max_width - key_width - length_of(left) - length_of(between) - length_of(right)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def rjust(string, length)
|
125
|
+
' ' * (length - length_of(string)) + string
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -11,12 +11,24 @@ module Helium
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def pp(object)
|
14
|
-
formatted = Helium::Console.format(object)
|
15
|
-
|
16
|
-
|
14
|
+
formatted = Helium::Console.format(object, max_width: maxwidth)
|
15
|
+
output << "\n" if multiline?(formatted)
|
16
|
+
|
17
|
+
formatted.lines.each.with_index do |line, index|
|
18
|
+
output << "\n" unless index.zero?
|
19
|
+
output << line.chomp
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def multiline?(formatted)
|
24
|
+
result = formatted.is_a?(Formatter::LazyStringEvaluator)
|
25
|
+
result ||= formatted.lines.count > 1
|
26
|
+
result || length_of(formatted.chomp) >= maxwidth - 2
|
17
27
|
end
|
18
28
|
|
19
|
-
|
29
|
+
def length_of(str)
|
30
|
+
ColorizedString.new(str).uncolorize.length
|
31
|
+
end
|
20
32
|
end
|
21
33
|
end
|
22
34
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Helium
|
4
|
+
class Console
|
5
|
+
class Prompt
|
6
|
+
def initialize
|
7
|
+
@line = 0
|
8
|
+
end
|
9
|
+
|
10
|
+
def pry_prompt
|
11
|
+
Pry::Prompt.new(
|
12
|
+
'helium',
|
13
|
+
'Default prompt for helium',
|
14
|
+
[
|
15
|
+
method(:active_prompt),
|
16
|
+
method(:wait_prompt)
|
17
|
+
]
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def active_prompt(context, _nesting, _pry)
|
24
|
+
@line += 1
|
25
|
+
str = [
|
26
|
+
ColorizedString.new("[#{@line}]").light_black,
|
27
|
+
ColorizedString.new("He\u269B").light_blue,
|
28
|
+
ColorizedString.new("(#{context.inspect})").magenta
|
29
|
+
].join(' ')
|
30
|
+
"#{str}> "
|
31
|
+
end
|
32
|
+
|
33
|
+
def wait_prompt(context, _nesting, _pry)
|
34
|
+
@line += 1
|
35
|
+
str = [
|
36
|
+
ColorizedString.new("[#{@line}]").light_black,
|
37
|
+
' ',
|
38
|
+
ColorizedString.new("(#{context.inspect})").magenta
|
39
|
+
].join(' ')
|
40
|
+
"#{str}> "
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -3,13 +3,23 @@
|
|
3
3
|
module Helium
|
4
4
|
class Console
|
5
5
|
define_formatter_for Array do
|
6
|
-
def
|
6
|
+
def render_compact
|
7
|
+
return '[]' unless object.any?
|
8
|
+
|
9
|
+
"##{format object.class, :compact}#{light_black "[#{object.size}]"}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def render_partial
|
7
13
|
return '[]' if object.none?
|
8
14
|
return inline_with_truncation if force_inline?
|
9
15
|
|
10
16
|
inline_without_truncation || format_as_table
|
11
17
|
end
|
12
18
|
|
19
|
+
def render_inline
|
20
|
+
inline_with_truncation
|
21
|
+
end
|
22
|
+
|
13
23
|
def simple?
|
14
24
|
object.none?
|
15
25
|
end
|
@@ -17,22 +27,23 @@ module Helium
|
|
17
27
|
private
|
18
28
|
|
19
29
|
def format_as_table
|
20
|
-
|
21
|
-
|
22
|
-
|
30
|
+
key_value = build_key_value do |kv|
|
31
|
+
object.each.with_index do |element, index|
|
32
|
+
kv.row(light_black("[#{index}]:"), element)
|
33
|
+
end
|
23
34
|
end
|
24
35
|
|
25
|
-
|
26
|
-
'['
|
27
|
-
|
28
|
-
']'
|
29
|
-
|
36
|
+
yield_lines do |y|
|
37
|
+
y << '['
|
38
|
+
format_key_value(key_value, left: ' ', format_keys: false).lines.each { |line| y << line }
|
39
|
+
y << ']'
|
40
|
+
end
|
30
41
|
end
|
31
42
|
|
32
43
|
def inline_with_truncation
|
33
44
|
formatted = formatted_elements.with_index.inject([]) do |joined, (element, index)|
|
34
45
|
new_joined = [*joined[0..-2], element, trunc_message(object_size - index - 1, all_truncated: index.zero?)]
|
35
|
-
break joined if too_long?(new_joined, max_width: max_width - 4)
|
46
|
+
break joined if max_width && too_long?(new_joined, max_width: max_width - 4)
|
36
47
|
|
37
48
|
new_joined
|
38
49
|
end
|
@@ -65,7 +76,7 @@ module Helium
|
|
65
76
|
def trunc_message(count, all_truncated: false)
|
66
77
|
return if count < 1
|
67
78
|
|
68
|
-
"(#{count} #{all_truncated ? 'elements' : 'more'})"
|
79
|
+
light_black "(#{count} #{all_truncated ? 'elements' : 'more'})"
|
69
80
|
end
|
70
81
|
|
71
82
|
def object_size
|