helium-console 0.1.0 → 0.1.1

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: f9dc5199dab8e2122be6f6601ac154b823a0f0c6a89b2fc52d7ce6e97ddb8122
4
- data.tar.gz: 9fd7a98d45dd3e4ee441680a35e2f740f2cd44a01e403d4fa86e86f48a21f30a
3
+ metadata.gz: 54fc81366dbb279e9171184f31ff7135a786bc4d580c87d09c2d2c7b6b2356aa
4
+ data.tar.gz: dc4b4b8558dd42e2bffa3e9a7d08c0219d69ab5acb8b508742552924dfe70c7e
5
5
  SHA512:
6
- metadata.gz: 12758df2c4c32118f8416691d4179ccb53d85f8bc22fd4a46907f09c678f4a5d5fec4cee6df0f33e250d7e6ebf2e8624c453bd5c12eb44be376c949e01c48627
7
- data.tar.gz: a2d9e9a75f7005aad6044639b783df65f59ad1bf570154829e51e841d1c74b995e31fceba3055fdb7c00614054717126bee99b56111be370a2f672aa34e0fc7b
6
+ metadata.gz: a76d12e67666b760c17c7b3688cba45e47313a29d03f6c08a7bb9e278c55b2abbb7de882eb3f258a4ae61614afb53c41dc288966945bf66ff65601f88819bac4
7
+ data.tar.gz: 4fec3cb33980a14cf3e9f7cbbf09a93f4707438076b1009bccfdc02f61184a002b6fb37c19a12cc993f5d4f1a1f1fe276e481bda1e1a09166251cd0532090e6b
data/.gitignore CHANGED
@@ -9,3 +9,5 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+
13
+ .byebug_history
data/Gemfile.lock CHANGED
@@ -1,15 +1,20 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- helium-console (0.1.0)
5
- ruby-terminfo
4
+ helium-console (0.1.1)
5
+ pry
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
10
  byebug (11.1.3)
11
+ coderay (1.1.3)
11
12
  diff-lcs (1.4.4)
12
13
  ffaker (2.18.0)
14
+ method_source (1.0.0)
15
+ pry (0.14.1)
16
+ coderay (~> 1.1)
17
+ method_source (~> 1.0)
13
18
  rake (12.3.3)
14
19
  rspec (3.10.0)
15
20
  rspec-core (~> 3.10.0)
@@ -24,7 +29,6 @@ GEM
24
29
  diff-lcs (>= 1.2.0, < 2.0)
25
30
  rspec-support (~> 3.10.0)
26
31
  rspec-support (3.10.2)
27
- ruby-terminfo (0.1.1)
28
32
 
29
33
  PLATFORMS
30
34
  ruby
data/bin/console CHANGED
@@ -3,12 +3,7 @@
3
3
  require "bundler/setup"
4
4
  require "helium/console"
5
5
 
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
6
+ require 'byebug'
7
+ require 'ffaker'
8
8
 
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)
9
+ Pry.start
@@ -22,5 +22,5 @@ Gem::Specification.new do |spec|
22
22
  spec.bindir = "exe"
23
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  spec.require_paths = ["lib"]
25
- spec.add_dependency "ruby-terminfo"
25
+ spec.add_dependency "pry"
26
26
  end
@@ -1,26 +1,99 @@
1
- require "helium/console/version"
1
+ require "pry"
2
2
 
3
+ require "helium/console/version"
3
4
  require "helium/console/formatters/indent"
4
5
  require "helium/console/formatters/overflow"
5
6
  require "helium/console/formatters/max_lines"
6
- require "terminfo"
7
+ require "helium/console/table"
8
+ require "helium/console/registry"
9
+
10
+ require "helium/console/printer"
7
11
 
8
12
  module Helium
9
- module Console
13
+ class Console
10
14
  Error = Class.new(StandardError)
11
15
 
16
+ SIMPLE_OBJECTS = [
17
+ Numeric,
18
+ NilClass,
19
+ FalseClass,
20
+ TrueClass,
21
+ Symbol
22
+ ]
23
+
12
24
  class << self
13
- def format(text, overflow: :wrap, indent: 0, max_lines: nil, max_width: TermInfo.screen_width)
14
- formatters = [
15
- Formatters::Overflow.get(overflow).new(max_width: max_width - indent),
16
- Formatters::Indent.new(indent),
17
- Formatters::MaxLines.new(max_lines: max_lines, max_width: max_width)
18
- ]
19
-
20
- formatters.inject(text) do |text, formatter|
21
- formatter.call(text)
22
- end
25
+ def instance
26
+ @instance ||= new(registry: Registry.new)
27
+ end
28
+
29
+ def method_missing(name, *args, &block)
30
+ super unless instance.respond_to?(name)
31
+
32
+ instance.public_send(name, *args, &block)
33
+ end
34
+ end
35
+
36
+ def initialize(registry:)
37
+ @registry = registry
38
+ end
39
+
40
+ def format(object, **options)
41
+ options = default_options.merge(options)
42
+ handler = registry.handler_for(object, **options)
43
+
44
+ if handler
45
+ handler.call
46
+ else
47
+ format(object.inspect, **options)
48
+ end
49
+ end
50
+
51
+ def register(klass, &handler)
52
+ registry.add(klass, &handler)
53
+ end
54
+
55
+ def define_formatter_for(klass, &handler)
56
+ registry.define(klass, &handler)
57
+ end
58
+
59
+ def simple?(object)
60
+ SIMPLE_OBJECTS.any? {|simple_obj_class| object.is_a? simple_obj_class }
61
+ end
62
+
63
+ def default_options
64
+ {
65
+ overflow: :wrap,
66
+ indent: 0,
67
+ max_lines: nil,
68
+ max_width: `tput cols`.chomp.to_i,
69
+ level: 1
70
+ }
71
+ end
72
+
73
+ def format_string(string, ellipses: "...", **options)
74
+ options = default_options.merge(options)
75
+
76
+ formatters = [
77
+ Formatters::Overflow.get(options[:overflow]).new(max_width: options[:max_width] - options[:indent]),
78
+ Formatters::Indent.new(options[:indent]),
79
+ Formatters::MaxLines.new(
80
+ max_lines: options[:max_lines],
81
+ max_width: options[:max_width],
82
+ ellipses: ellipses
83
+ )
84
+ ]
85
+
86
+ formatters.inject(string) do |string, formatter|
87
+ formatter.call(string)
23
88
  end
24
89
  end
90
+
91
+ private
92
+
93
+ attr_reader :registry
25
94
  end
26
95
  end
96
+
97
+ Dir.glob(File.join(File.dirname(__FILE__), "console", "registry", "**/*.rb")).each do |file|
98
+ require file
99
+ end
@@ -1,5 +1,5 @@
1
1
  module Helium
2
- module Console
2
+ class Console
3
3
  module Formatters
4
4
  class Indent
5
5
  def initialize(indent)
@@ -1,11 +1,13 @@
1
1
  module Helium
2
- module Console
2
+ class Console
3
3
  module Formatters
4
4
  class MaxLines
5
- ELLIPSES = "..."
6
- def initialize(max_lines:, max_width:)
5
+ ELLIPSES = "...\""
6
+
7
+ def initialize(max_lines:, max_width:, ellipses:)
7
8
  @max_lines = max_lines
8
9
  @max_width = max_width
10
+ @ellipses = ellipses
9
11
  end
10
12
 
11
13
  def call(string)
@@ -13,7 +15,7 @@ module Helium
13
15
 
14
16
  lines = string.lines.first(@max_lines)
15
17
  last_line = lines.pop
16
- lines << last_line.chars.first(@max_width - ELLIPSES.length).join + ELLIPSES
18
+ lines << last_line.chars.first(@max_width - @ellipses.length).join + @ellipses
17
19
  lines.join()
18
20
  end
19
21
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Helium
3
- module Console
3
+ class Console
4
4
  module Formatters
5
5
  module Overflow
6
6
  def self.get(type)
@@ -1,5 +1,5 @@
1
1
  module Helium
2
- module Console
2
+ class Console
3
3
  module Formatters
4
4
  module Overflow
5
5
  class Wrap
@@ -0,0 +1,20 @@
1
+ module Helium
2
+ class Console
3
+ class ColorPrinter < Pry::ColorPrinter
4
+ def self.pp(obj, output = $DEFAULT_OUTPUT, max_width = 79)
5
+ queue = ColorPrinter.new(output, max_width, "\n")
6
+ queue.guard_inspect_key { queue.pp(obj) }
7
+ queue.flush
8
+ output << "\n"
9
+ end
10
+
11
+ def pp(object)
12
+ formatted = Helium::Console.format(object)
13
+ formatted = $/ + formatted if formatted.lines.count > 1
14
+ output << formatted
15
+ end
16
+
17
+ ::Pry.config.print = self.method(:default)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,58 @@
1
+ module Helium
2
+ class Console
3
+ class Registry
4
+ class Element
5
+ def initialize(object, **options)
6
+ @object = object
7
+ @options = options
8
+ end
9
+
10
+ attr_reader :object, :options
11
+
12
+ def format(object, **options)
13
+ Helium::Console.format(object, **nested_opts(options))
14
+ end
15
+
16
+ def format_string(string, **options)
17
+ Helium::Console.format_string(string, **options)
18
+ end
19
+
20
+ def simple?(object)
21
+ Helium::Console.simple?(object)
22
+ end
23
+
24
+ def method_missing(name, *args)
25
+ return @options[name] if @options.key?(name)
26
+ super
27
+ end
28
+
29
+ def nested_opts(options)
30
+ { level: @options[:level] + 1 }.merge(options)
31
+ end
32
+ end
33
+
34
+ def add(klass, &handler)
35
+ define(klass) do
36
+ define_method(:call, &handler)
37
+ end
38
+ end
39
+
40
+ def define(klass, &block)
41
+ handlers[klass] = Class.new(Element, &block)
42
+ end
43
+
44
+ def handler_for(object, **options)
45
+ object.class.ancestors.each do |ancestor|
46
+ return handlers[ancestor].new(object, **options) if handlers.key?(ancestor)
47
+ end
48
+ nil
49
+ end
50
+
51
+ private
52
+
53
+ def handlers
54
+ @handlers ||= {}
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,69 @@
1
+ module Helium
2
+ class Console
3
+ define_formatter_for Array do
4
+ def call
5
+ return format_inline_with_truncation if force_inline?
6
+ format_inline_with_no_truncation || format_as_table
7
+ end
8
+
9
+ private
10
+
11
+ def format_as_table
12
+ table = Table.new(runner: ' ', format_keys: false)
13
+ object.each.with_index do |element, index|
14
+ table.row("[#{index}]:", element)
15
+ end
16
+
17
+ [
18
+ "[",
19
+ format(table, **options),
20
+ "]"
21
+ ].join($/)
22
+ end
23
+
24
+ def format_inline_with_truncation
25
+ joined = nil
26
+ trunc = nil
27
+ total = object.length
28
+
29
+ object.each.with_index do |element, index|
30
+ formatted = format(element, max_lines: 1, nesting: 1, max_width: 15)
31
+
32
+ new_joined = [joined, formatted].compact.join(" | ")
33
+ new_trunc = (" | (#{total - index - 1} #{index.zero? ? 'elements' : 'more'})" unless index == total - 1)
34
+
35
+ break if new_joined.length > max_width - (new_trunc&.length || 0) - 4
36
+
37
+ joined = new_joined
38
+ trunc = new_trunc
39
+ end
40
+
41
+ if joined
42
+ joined = [" ", joined, trunc, " "].compact.join if joined
43
+ ["[", joined, "]"].compact.join
44
+ else
45
+ "[...(#{object.length})]"
46
+ end
47
+ end
48
+
49
+ def format_inline_with_no_truncation
50
+ joined = nil
51
+
52
+ object.each do |element|
53
+ return unless simple?(element)
54
+
55
+ formatted = format(element)
56
+ joined = [joined, formatted].compact.join(" | ")
57
+
58
+ return if joined.length > max_width - 4
59
+ end
60
+ joined = " #{joined} " if joined
61
+ ["[", joined, "]"].compact.join
62
+ end
63
+
64
+ def force_inline?
65
+ level > 2
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,77 @@
1
+ module Helium
2
+ class Console
3
+ define_formatter_for Hash do
4
+ def call
5
+ return format_inline_with_truncation if force_inline?
6
+ format_inline_with_no_truncation || format_as_table
7
+ end
8
+
9
+ private
10
+
11
+ def format_as_table
12
+ table = Table.new(runner: ' ', after_key: all_symbol? ? ": " : " => ", format_keys: !all_symbol?)
13
+ object.each do |key, value|
14
+ key = key.to_s if all_symbol?
15
+ table.row(key, value)
16
+ end
17
+
18
+ [
19
+ "{",
20
+ format(table, **options),
21
+ "}"
22
+ ].join($/)
23
+ end
24
+
25
+ def format_inline_with_truncation
26
+ joined = nil
27
+ trunc = nil
28
+ total = object.length
29
+
30
+ object.each.with_index do |(key, value), index|
31
+ formatted_key = format(key, max_lines: 1, nesting: 1, max_with: 15)
32
+ formatted_value = format(value, max_lines: 1, nesting: 1, max_width: 15)
33
+
34
+ formatted = "#{formatted_key} => #{formatted_value}"
35
+
36
+ new_joined = [joined, formatted].compact.join(", ")
37
+ new_trunc = (", (#{total - index - 1} #{index.zero? ? 'elements' : 'more'})" unless index == total - 1)
38
+
39
+ break if new_joined.length > max_width - (new_trunc&.length || 0) - 4
40
+
41
+ joined = new_joined
42
+ trunc = new_trunc
43
+ end
44
+
45
+ joined = [" ", joined, trunc, " "].compact.join if joined
46
+ ["{", joined, "}"].compact.join
47
+ end
48
+
49
+ def format_inline_with_no_truncation
50
+ joined = nil
51
+ one_complex = false
52
+
53
+ object.each do |key, value|
54
+ return unless simple?(value)
55
+
56
+ formatted_key = format(key, max_lines: 1, nesting: 1, max_with: 15)
57
+ formatted_value = format(value, max_lines: 1, nesting: 1, max_width: 15)
58
+ formatted = "#{formatted_key} => #{formatted_value}"
59
+
60
+ joined = [joined, formatted].compact.join(", ")
61
+
62
+ return if joined.length > max_width - 4
63
+ end
64
+ joined = " #{joined} " if joined
65
+ ["{", joined, "}"].compact.join
66
+ end
67
+
68
+ def force_inline?
69
+ (max_lines && max_lines < 5) || level > 2
70
+ end
71
+
72
+ def all_symbol?
73
+ object.keys.all? { |key| key.is_a? Symbol }
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,15 @@
1
+ module Helium
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)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ module Helium
2
+ class Console
3
+ define_formatter_for String do
4
+ def call
5
+ Helium::Console.format_string(
6
+ object.dump.gsub('\n', "\n"),
7
+ max_width: max_width,
8
+ max_lines: max_lines,
9
+ overflow: overflow,
10
+ ellipses: "...\""
11
+ )
12
+ end
13
+
14
+ def max_lines
15
+ return options[:max_lines] if options[:max_lines]
16
+ case level
17
+ when 1 then nil
18
+ when 2 then 3
19
+ else 1
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ module Helium
2
+ class Console
3
+ define_formatter_for Table do
4
+ def call
5
+ formatted_values.join($/)
6
+ end
7
+
8
+ def formatted_values
9
+ object.rows.flat_map do |key, value|
10
+ formatted_value = format(value, max_width: max_value_width)
11
+
12
+ formatted_value.lines.map.with_index do |line, index|
13
+ [
14
+ object.runner,
15
+ index.zero? ? format_key(key).rjust(key_width) : " " * key_width,
16
+ index.zero? ? object.after_key : " " * object.after_key.length,
17
+ line.chomp,
18
+ ].join
19
+ end
20
+ end
21
+ end
22
+
23
+ def key_width
24
+ @key_width ||= object.rows
25
+ .map(&:first)
26
+ .map(&method(:format_key))
27
+ .map(&:length).max
28
+ end
29
+
30
+ def max_value_width
31
+ max_width - object.runner.length - key_width - object.after_key.length
32
+ end
33
+
34
+ def format_key(key)
35
+ return key unless object.format_keys
36
+ format(key, max_width: 15, level: 3)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,22 @@
1
+ module Helium
2
+ class Console
3
+ class Table
4
+
5
+ def initialize(runner: "|", after_key: " ", format_keys: true)
6
+ @runner = runner
7
+ @after_key = after_key
8
+ @format_keys = format_keys
9
+ end
10
+
11
+ attr_reader :runner, :after_key, :format_keys
12
+
13
+ def row(key, value)
14
+ rows << [key, value]
15
+ end
16
+
17
+ def rows
18
+ @rows ||= []
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,5 +1,5 @@
1
1
  module Helium
2
- module Console
3
- VERSION = "0.1.0"
2
+ class Console
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: helium-console
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
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-05-22 00:00:00.000000000 Z
11
+ date: 2021-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: ruby-terminfo
14
+ name: pry
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -31,7 +31,6 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
- - ".byebug_history"
35
34
  - ".gitignore"
36
35
  - ".rspec"
37
36
  - ".travis.yml"
@@ -49,6 +48,14 @@ files:
49
48
  - lib/helium/console/formatters/max_lines.rb
50
49
  - lib/helium/console/formatters/overflow.rb
51
50
  - lib/helium/console/formatters/overflow/wrap.rb
51
+ - lib/helium/console/printer.rb
52
+ - lib/helium/console/registry.rb
53
+ - lib/helium/console/registry/array.rb
54
+ - lib/helium/console/registry/hash.rb
55
+ - lib/helium/console/registry/object.rb
56
+ - lib/helium/console/registry/string.rb
57
+ - lib/helium/console/registry/table.rb
58
+ - lib/helium/console/table.rb
52
59
  - lib/helium/console/version.rb
53
60
  homepage: https://github.com/helium-rb/console
54
61
  licenses:
data/.byebug_history DELETED
@@ -1,7 +0,0 @@
1
- c
2
- FFaker::Lorem.sentences(rand(4..10)).count
3
- FFaker::Lorem.sentences(rand(4..10))
4
- FFaker::Lorem.sentences
5
- FFaker::Lorem.sentence
6
- rand(4..10)
7
- text