interactive-logger 0.1.1 → 0.1.2
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/lib/interactive-logger.rb +27 -14
- data/lib/interactive_logger/step.rb +61 -3
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a9968debc063988b1bbc485e31145a487b5c526
|
4
|
+
data.tar.gz: 26611433c1293dcce8cc04d99d693a9873e09cdc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ff09b4c51163c387f018fa64a22927d918393bcb91b1b64dd0f4cf014e03e8aed804fd40074807722e1101a255081dd48e3edf019bb05319daad4f2dc5d0c45
|
7
|
+
data.tar.gz: bc8cc4c43d4f0201a67bd28dff417534c3655852ab80e86c4d3c2f773b2c57f60da3e3e7bad9e2bb06dee41548eda679076e3e8f2697b2b1c394a2d08c4ef82e
|
data/lib/interactive-logger.rb
CHANGED
@@ -11,6 +11,7 @@ class InteractiveLogger
|
|
11
11
|
def initialize(debug: false)
|
12
12
|
@debug = debug
|
13
13
|
@current_step = nil
|
14
|
+
@draw_mutex = Mutex.new
|
14
15
|
end
|
15
16
|
|
16
17
|
def debug?; @debug == true end
|
@@ -41,11 +42,16 @@ class InteractiveLogger
|
|
41
42
|
|
42
43
|
loop do
|
43
44
|
if queue.empty?
|
44
|
-
@
|
45
|
+
@draw_mutex.synchronize do
|
46
|
+
@current_step.continue # Keep the UI updating regardless of actual process.
|
47
|
+
end
|
45
48
|
else
|
46
49
|
until queue.empty?
|
47
50
|
msg = queue.pop
|
48
|
-
|
51
|
+
|
52
|
+
@draw_mutex.synchronize do
|
53
|
+
@current_step.send(msg.shift, *msg)
|
54
|
+
end
|
49
55
|
end
|
50
56
|
end
|
51
57
|
|
@@ -69,25 +75,32 @@ class InteractiveLogger
|
|
69
75
|
def debug(str)
|
70
76
|
return unless debug?
|
71
77
|
|
72
|
-
@
|
73
|
-
|
74
|
-
|
75
|
-
|
78
|
+
@draw_mutex.synchronize do
|
79
|
+
@current_step.blank if @current_step
|
80
|
+
print '--> '.yellow
|
81
|
+
puts str
|
82
|
+
@current_step.repaint if @current_step
|
83
|
+
end
|
76
84
|
end
|
85
|
+
|
77
86
|
# Post an informative message above the current step output.
|
78
87
|
def info(str)
|
79
|
-
@
|
80
|
-
|
81
|
-
|
82
|
-
|
88
|
+
@draw_mutex.synchronize do
|
89
|
+
@current_step.blank if @current_step
|
90
|
+
print '--> '.green
|
91
|
+
puts str
|
92
|
+
@current_step.repaint if @current_step
|
93
|
+
end
|
83
94
|
end
|
84
95
|
|
85
96
|
# Post an error message above the current step output.
|
86
97
|
def error(str)
|
87
|
-
@
|
88
|
-
|
89
|
-
|
90
|
-
|
98
|
+
@draw_mutex.synchronize do
|
99
|
+
@current_step.blank if @current_step
|
100
|
+
print '--> '.red
|
101
|
+
puts str
|
102
|
+
@current_step.repaint if @current_step
|
103
|
+
end
|
91
104
|
end
|
92
105
|
|
93
106
|
# Post a single message, without any progress tracking.
|
@@ -1,4 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
require 'io/console'
|
3
|
+
|
2
4
|
class InteractiveLogger
|
3
5
|
class Step
|
4
6
|
PROGRESS_SYMBOLS = %w(- \\ | /)
|
@@ -12,21 +14,24 @@ class InteractiveLogger
|
|
12
14
|
@start = Time.now
|
13
15
|
@show_time = show_time
|
14
16
|
@pos = 0
|
15
|
-
|
17
|
+
print_trimmed(in_progress_prefix << str)
|
16
18
|
end
|
17
19
|
|
18
20
|
def continue(str = nil)
|
19
21
|
@pos += 1
|
22
|
+
blank
|
20
23
|
@last_str = str if str
|
21
|
-
|
24
|
+
print_trimmed(in_progress_prefix << @last_str)
|
22
25
|
end
|
23
26
|
|
24
27
|
def failure(str = nil)
|
28
|
+
blank
|
25
29
|
@last_str = str if str
|
26
30
|
print_msg(prefix(FAILURE_SYMBOL) << @last_str)
|
27
31
|
end
|
28
32
|
|
29
33
|
def success(str = nil)
|
34
|
+
blank
|
30
35
|
@last_str = str if str
|
31
36
|
print_msg(prefix(SUCCESS_SYMBOL) << @last_str)
|
32
37
|
end
|
@@ -35,7 +40,7 @@ class InteractiveLogger
|
|
35
40
|
def blank
|
36
41
|
print "\r"
|
37
42
|
if @last_print_msg
|
38
|
-
print ' ' *
|
43
|
+
print ' ' * IO.console.winsize[1]
|
39
44
|
end
|
40
45
|
print "\r"
|
41
46
|
end
|
@@ -64,5 +69,58 @@ class InteractiveLogger
|
|
64
69
|
@last_print_msg = str
|
65
70
|
print str
|
66
71
|
end
|
72
|
+
|
73
|
+
# Trim string to current terminal width and break at newline so it can be
|
74
|
+
# replaced rather than causing the same line to print multiple times.
|
75
|
+
#
|
76
|
+
# The bulk of this logic is dedicated to counting only printable
|
77
|
+
# characters, and ensure we reset the colors afterward.
|
78
|
+
def print_trimmed(str)
|
79
|
+
terminal_width = IO.console.winsize[1]
|
80
|
+
|
81
|
+
# Take only the first line.
|
82
|
+
str = str.lines.first.chomp
|
83
|
+
@last_print_msg = ""
|
84
|
+
|
85
|
+
len = 0 # Printable length of characters sent to screen so far.
|
86
|
+
pos = 0 # Position in input string buffer.
|
87
|
+
c = true # Are we counting characters?
|
88
|
+
|
89
|
+
# Copy characters, including nonprintables, until we have copied
|
90
|
+
# terminal_width - 4 printables, then add an elipsis and call it
|
91
|
+
# a day.
|
92
|
+
loop do
|
93
|
+
if str[pos, 2] == "\e["
|
94
|
+
@last_print_msg << "\e["
|
95
|
+
pos += 2
|
96
|
+
c = false
|
97
|
+
next
|
98
|
+
end
|
99
|
+
|
100
|
+
if c == false && str[pos] == "m"
|
101
|
+
@last_print_msg << str[pos]
|
102
|
+
pos += 1
|
103
|
+
c = true
|
104
|
+
next
|
105
|
+
end
|
106
|
+
|
107
|
+
# Everything fits, nothing to do.
|
108
|
+
if pos == str.size
|
109
|
+
break
|
110
|
+
end
|
111
|
+
|
112
|
+
# We are going to run out of space, reset color to normal and draw an elipsis.
|
113
|
+
if len == terminal_width - 5 && str.size > pos + 3
|
114
|
+
@last_print_msg << "\e[0m..."
|
115
|
+
break
|
116
|
+
end
|
117
|
+
|
118
|
+
@last_print_msg << str[pos]
|
119
|
+
len += 1 if c
|
120
|
+
pos += 1
|
121
|
+
end
|
122
|
+
|
123
|
+
print @last_print_msg
|
124
|
+
end
|
67
125
|
end
|
68
126
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: interactive-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kyle Smith <askreet@gmail.com>
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
version: '3.2'
|
34
34
|
- - ">="
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: 3.2.
|
36
|
+
version: 3.2.3
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '3.2'
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 3.2.
|
46
|
+
version: 3.2.3
|
47
47
|
description: A colorful, interactive logger for tracking progress of an operation.
|
48
48
|
email: askreet@gmail.com
|
49
49
|
executables: []
|
@@ -73,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
73
73
|
version: '0'
|
74
74
|
requirements: []
|
75
75
|
rubyforge_project:
|
76
|
-
rubygems_version: 2.4.
|
76
|
+
rubygems_version: 2.4.6
|
77
77
|
signing_key:
|
78
78
|
specification_version: 4
|
79
79
|
summary: A colorful, interactive logger.
|