helium-console 0.1.1 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 54fc81366dbb279e9171184f31ff7135a786bc4d580c87d09c2d2c7b6b2356aa
4
- data.tar.gz: dc4b4b8558dd42e2bffa3e9a7d08c0219d69ab5acb8b508742552924dfe70c7e
3
+ metadata.gz: e6e87b40fb5846db36163081102d3a414bdecdbdc782f6f4c0da3f0001536fd7
4
+ data.tar.gz: 1ba3c78a6f962b1a64e883d350c35618e6bbcad4de3a2ac789058a90f0efceff
5
5
  SHA512:
6
- metadata.gz: a76d12e67666b760c17c7b3688cba45e47313a29d03f6c08a7bb9e278c55b2abbb7de882eb3f258a4ae61614afb53c41dc288966945bf66ff65601f88819bac4
7
- data.tar.gz: 4fec3cb33980a14cf3e9f7cbbf09a93f4707438076b1009bccfdc02f61184a002b6fb37c19a12cc993f5d4f1a1f1fe276e481bda1e1a09166251cd0532090e6b
6
+ metadata.gz: 9dd45ae18f91693ef71bff49a32a7fa09d0a0fa1d2eae81ed92b0d1b34f110085eea6004fcfe2241f372f3407d0aedb42d4bb521eaf40de71be43bb8e7cd265e
7
+ data.tar.gz: 0e7a3083dc49d4e3798ac54e0c6636a589f783b4faa41c544d9970bcc694d7ea22b82297f757c788965e9908675b6df340149521cb9dd97ab7e9200cd2bc0200
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- helium-console (0.1.1)
4
+ helium-console (0.1.6)
5
+ colorize
5
6
  pry
6
7
 
7
8
  GEM
@@ -9,6 +10,7 @@ GEM
9
10
  specs:
10
11
  byebug (11.1.3)
11
12
  coderay (1.1.3)
13
+ colorize (0.8.1)
12
14
  diff-lcs (1.4.4)
13
15
  ffaker (2.18.0)
14
16
  method_source (1.0.0)
data/bin/console CHANGED
@@ -6,4 +6,10 @@ require "helium/console"
6
6
  require 'byebug'
7
7
  require 'ffaker'
8
8
 
9
+ class A
10
+ def initialize(a)
11
+ @a = a
12
+ end
13
+ end
14
+
9
15
  Pry.start
@@ -23,4 +23,5 @@ Gem::Specification.new do |spec|
23
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  spec.require_paths = ["lib"]
25
25
  spec.add_dependency "pry"
26
+ spec.add_dependency "colorize"
26
27
  end
@@ -39,6 +39,8 @@ module Helium
39
39
 
40
40
  def format(object, **options)
41
41
  options = default_options.merge(options)
42
+ return "(...)" if options[:ignore_objects].include?(object.object_id)
43
+
42
44
  handler = registry.handler_for(object, **options)
43
45
 
44
46
  if handler
@@ -57,16 +59,17 @@ module Helium
57
59
  end
58
60
 
59
61
  def simple?(object)
60
- SIMPLE_OBJECTS.any? {|simple_obj_class| object.is_a? simple_obj_class }
62
+ SIMPLE_OBJECTS.any? {|simple_obj_class| object.is_a? simple_obj_class } ||
63
+ registry.handler_for(object).is_simple
61
64
  end
62
65
 
63
66
  def default_options
64
67
  {
65
68
  overflow: :wrap,
66
69
  indent: 0,
67
- max_lines: nil,
68
70
  max_width: `tput cols`.chomp.to_i,
69
- level: 1
71
+ level: 1,
72
+ ignore_objects: [],
70
73
  }
71
74
  end
72
75
 
@@ -1,3 +1,5 @@
1
+ require 'colorized_string'
2
+
1
3
  module Helium
2
4
  class Console
3
5
  class Registry
@@ -9,8 +11,12 @@ module Helium
9
11
 
10
12
  attr_reader :object, :options
11
13
 
12
- def format(object, **options)
13
- Helium::Console.format(object, **nested_opts(options))
14
+ def format_nested(other_object, **options)
15
+ Helium::Console.format(other_object, **nested_opts(options))
16
+ end
17
+
18
+ def format(other_object, **options)
19
+ Helium::Console.format(other_object, **nested_opts(options, increase_level: false))
14
20
  end
15
21
 
16
22
  def format_string(string, **options)
@@ -21,13 +27,23 @@ module Helium
21
27
  Helium::Console.simple?(object)
22
28
  end
23
29
 
30
+ def is_simple
31
+ false
32
+ end
33
+
24
34
  def method_missing(name, *args)
25
35
  return @options[name] if @options.key?(name)
36
+ if ColorizedString.colors.include?(name)
37
+ return ColorizedString.new(*args).colorize(name)
38
+ end
26
39
  super
27
40
  end
28
41
 
29
- def nested_opts(options)
30
- { level: @options[:level] + 1 }.merge(options)
42
+ def nested_opts(new_options, increase_level: true)
43
+ new_options = options.merge(new_options)
44
+ new_options[:level] += 1 if increase_level
45
+ new_options[:ignore_objects] << object.object_id
46
+ new_options
31
47
  end
32
48
  end
33
49
 
@@ -2,21 +2,27 @@ module Helium
2
2
  class Console
3
3
  define_formatter_for Array do
4
4
  def call
5
+ return "[]" if object.none?
5
6
  return format_inline_with_truncation if force_inline?
7
+
6
8
  format_inline_with_no_truncation || format_as_table
7
9
  end
8
10
 
11
+ def is_simple
12
+ object.none?
13
+ end
14
+
9
15
  private
10
16
 
11
17
  def format_as_table
12
18
  table = Table.new(runner: ' ', format_keys: false)
13
19
  object.each.with_index do |element, index|
14
- table.row("[#{index}]:", element)
20
+ table.row(light_black("[#{index}]:"), element)
15
21
  end
16
22
 
17
23
  [
18
24
  "[",
19
- format(table, **options),
25
+ format(table),
20
26
  "]"
21
27
  ].join($/)
22
28
  end
@@ -27,7 +33,7 @@ module Helium
27
33
  total = object.length
28
34
 
29
35
  object.each.with_index do |element, index|
30
- formatted = format(element, max_lines: 1, nesting: 1, max_width: 15)
36
+ formatted = format_nested(element, max_lines: 1, nesting: 1, max_width: 15)
31
37
 
32
38
  new_joined = [joined, formatted].compact.join(" | ")
33
39
  new_trunc = (" | (#{total - index - 1} #{index.zero? ? 'elements' : 'more'})" unless index == total - 1)
@@ -52,7 +58,7 @@ module Helium
52
58
  object.each do |element|
53
59
  return unless simple?(element)
54
60
 
55
- formatted = format(element)
61
+ formatted = format_nested(element)
56
62
  joined = [joined, formatted].compact.join(" | ")
57
63
 
58
64
  return if joined.length > max_width - 4
@@ -0,0 +1,15 @@
1
+ module Helium
2
+ class Console
3
+ define_formatter_for TrueClass do
4
+ def call
5
+ green('true')
6
+ end
7
+ end
8
+
9
+ define_formatter_for FalseClass do
10
+ def call
11
+ red('false')
12
+ end
13
+ end
14
+ end
15
+ end
@@ -9,9 +9,9 @@ module Helium
9
9
  private
10
10
 
11
11
  def format_as_table
12
- table = Table.new(runner: ' ', after_key: all_symbol? ? ": " : " => ", format_keys: !all_symbol?)
12
+ table = Table.new(runner: ' ', after_key: after_key, format_keys: !all_symbol?)
13
13
  object.each do |key, value|
14
- key = key.to_s if all_symbol?
14
+ key = light_blue(key.to_s) if all_symbol?
15
15
  table.row(key, value)
16
16
  end
17
17
 
@@ -66,12 +66,16 @@ module Helium
66
66
  end
67
67
 
68
68
  def force_inline?
69
- (max_lines && max_lines < 5) || level > 2
69
+ level > 2
70
70
  end
71
71
 
72
72
  def all_symbol?
73
73
  object.keys.all? { |key| key.is_a? Symbol }
74
74
  end
75
+
76
+ def after_key
77
+ all_symbol? ? light_blue(": ") : light_black(" => ")
78
+ end
75
79
  end
76
80
  end
77
81
  end
@@ -0,0 +1,16 @@
1
+ module Helium
2
+ class Console
3
+ define_formatter_for Module do
4
+ def call
5
+ light_yellow(object.name || anonymus_text)
6
+ end
7
+
8
+ private
9
+
10
+ def anonymus_text
11
+ closest = object.ancestors.find(&:name).name
12
+ "(anonymous #{closest})"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ module Helium
2
+ class Console
3
+ define_formatter_for NilClass do
4
+ def call
5
+ light_black('nil')
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Helium
2
+ class Console
3
+ define_formatter_for Numeric do
4
+ def call
5
+ light_cyan(object.to_s)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,14 +1,69 @@
1
1
  module Helium
2
2
  class Console
3
- register Object do
4
- formatters = [
5
- Formatters::Overflow.get(overflow).new(max_width: max_width - indent),
6
- Formatters::Indent.new(indent),
7
- Formatters::MaxLines.new(max_lines: max_lines, max_width: max_width, ellipses: "...")
8
- ]
9
-
10
- formatters.inject(object.inspect) do |string, formatter|
11
- formatter.call(string)
3
+ define_formatter_for Object do
4
+ def call
5
+ return format_inline_with_truncation if force_inline?
6
+ format_as_table
7
+ end
8
+
9
+ private
10
+
11
+ def format_as_table
12
+ table = Table.new(runner: light_black('| '), after_key: light_black(": "), format_keys: false)
13
+
14
+ object.instance_variables.each do |inst|
15
+ table.row(magenta(inst.to_s), object.instance_variable_get(inst))
16
+ end
17
+
18
+ [
19
+ table_header,
20
+ format(table),
21
+ ].reject(&:empty?).join($/)
22
+ end
23
+
24
+ def format_inline_with_truncation
25
+ "#{object.class.name}##{object.object_id.to_s(16)}"
26
+ end
27
+
28
+ def format_inline_with_no_truncation
29
+ joined = nil
30
+
31
+ object.each do |key, value|
32
+ return unless simple?(value)
33
+
34
+ formatted_key = format(key, level: 3, max_with: 15)
35
+ formatted_value = format(value, level: 3, max_width: 15)
36
+ formatted = "#{formatted_key} => #{formatted_value}"
37
+
38
+ joined = [joined, formatted].compact.join(", ")
39
+
40
+ return if joined.length > max_width - 4
41
+ end
42
+ joined = " #{joined} " if joined
43
+ ["{", joined, "}"].compact.join
44
+ end
45
+
46
+ def table_header
47
+ type = case object
48
+ when Class then :class
49
+ when Module then :module
50
+ else :instance
51
+ end
52
+ klass = type == :instance ? object.class : object
53
+ klass_name = klass.name
54
+ if !klass_name
55
+ named_ancestor = klass.ancestors.find(&:name)
56
+ klass_name = ['anonymous', named_ancestor&.name].compact.join(" ")
57
+ end
58
+ "#{light_black('#')} #{light_yellow(klass_name)} #{type}"
59
+ end
60
+
61
+ def force_inline?
62
+ level > 2
63
+ end
64
+
65
+ def all_symbol?
66
+ object.keys.all? { |key| key.is_a? Symbol }
12
67
  end
13
68
  end
14
69
  end
@@ -2,17 +2,20 @@ module Helium
2
2
  class Console
3
3
  define_formatter_for String do
4
4
  def call
5
- Helium::Console.format_string(
5
+ formatted = Helium::Console.format_string(
6
6
  object.dump.gsub('\n', "\n"),
7
7
  max_width: max_width,
8
8
  max_lines: max_lines,
9
9
  overflow: overflow,
10
10
  ellipses: "...\""
11
11
  )
12
+
13
+ formatted.lines
14
+ .map { |line| light_green(line) }
15
+ .join
12
16
  end
13
17
 
14
18
  def max_lines
15
- return options[:max_lines] if options[:max_lines]
16
19
  case level
17
20
  when 1 then nil
18
21
  when 2 then 3
@@ -0,0 +1,9 @@
1
+ module Helium
2
+ class Console
3
+ define_formatter_for Symbol do
4
+ def call
5
+ light_blue(':' + object.to_s)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -2,38 +2,73 @@ module Helium
2
2
  class Console
3
3
  define_formatter_for Table do
4
4
  def call
5
- formatted_values.join($/)
5
+ [
6
+ *formatted_values,
7
+ truncation,
8
+ ].compact.join($/)
6
9
  end
7
10
 
8
11
  def formatted_values
9
- object.rows.flat_map do |key, value|
10
- formatted_value = format(value, max_width: max_value_width)
12
+ rows.flat_map do |key, value|
13
+ formatted_value = format_nested(value, max_width: max_value_width)
11
14
 
12
15
  formatted_value.lines.map.with_index do |line, index|
13
16
  [
14
17
  object.runner,
15
- index.zero? ? format_key(key).rjust(key_width) : " " * key_width,
16
- index.zero? ? object.after_key : " " * object.after_key.length,
18
+ index.zero? ? rjust(format_key(key), key_width) : " " * key_width,
19
+ index.zero? ? object.after_key : " " * length_of(object.after_key),
17
20
  line.chomp,
18
21
  ].join
19
22
  end
20
23
  end
21
24
  end
22
25
 
26
+ def truncation
27
+ return unless object.rows.length > rows.length
28
+
29
+ [
30
+ object.runner,
31
+ light_black("(#{object.rows.length - rows.length} more)")
32
+ ].join
33
+ end
34
+
35
+
23
36
  def key_width
24
- @key_width ||= object.rows
37
+ @key_width ||= rows
25
38
  .map(&:first)
26
39
  .map(&method(:format_key))
27
- .map(&:length).max
40
+ .map(&method(:length_of))
41
+ .max
28
42
  end
29
43
 
30
44
  def max_value_width
31
- max_width - object.runner.length - key_width - object.after_key.length
45
+ max_width - length_of(object.runner) - key_width - length_of(object.after_key)
32
46
  end
33
47
 
34
48
  def format_key(key)
35
- return key unless object.format_keys
36
- format(key, max_width: 15, level: 3)
49
+ object.format_keys ? format(key, max_width: 15, level: 3) : key
50
+ end
51
+
52
+ def rjust(string, width)
53
+ " " * (width - length_of(string)) + string
54
+ end
55
+
56
+ def length_of(string)
57
+ if string.respond_to?(:uncolorize)
58
+ string.uncolorize.length
59
+ else
60
+ string.length
61
+ end
62
+ end
63
+
64
+ def rows
65
+ @rows ||= case level
66
+ when 1 then object.rows
67
+ when 2
68
+ object.rows.count < 10 ? object.rows : object.rows.first(9)
69
+ else
70
+ object.rows.count < 3 ? object.rows : object.rows.first(2)
71
+ end
37
72
  end
38
73
  end
39
74
  end
@@ -1,5 +1,5 @@
1
1
  module Helium
2
2
  class Console
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.6"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: helium-console
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stanislaw Klajn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-05 00:00:00.000000000 Z
11
+ date: 2021-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: colorize
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description:
28
42
  email:
29
43
  - sklajn@gmail.com
@@ -51,9 +65,14 @@ files:
51
65
  - lib/helium/console/printer.rb
52
66
  - lib/helium/console/registry.rb
53
67
  - lib/helium/console/registry/array.rb
68
+ - lib/helium/console/registry/booleans.rb
54
69
  - lib/helium/console/registry/hash.rb
70
+ - lib/helium/console/registry/module.rb
71
+ - lib/helium/console/registry/nil.rb
72
+ - lib/helium/console/registry/numeric.rb
55
73
  - lib/helium/console/registry/object.rb
56
74
  - lib/helium/console/registry/string.rb
75
+ - lib/helium/console/registry/symbol.rb
57
76
  - lib/helium/console/registry/table.rb
58
77
  - lib/helium/console/table.rb
59
78
  - lib/helium/console/version.rb