termclock 0.4.0 → 0.5.0

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: 97954b7ee94050e29c1d43619a147275d89a731d8e317e84af0afa59e6958961
4
- data.tar.gz: f5b29cef16329eb7db1442a0073b32cdaef8563fa21abc9dca4d36de28925441
3
+ metadata.gz: 7bdab290cda29c688c44fb92516f6b5438d5d64dd9ad240cd2c33f648fbb6ea6
4
+ data.tar.gz: 0137ffaf7141499d18134b9b2d9334b4e37675f401e4b01d01ff0bfc55d8e509
5
5
  SHA512:
6
- metadata.gz: e707c28bb571a7f6fe4655d0b9f24217361b64ff2489ee0f23d1475ecda543d85186bd6b8b476ae7247d088428baa2f424b4d0fafa507d1057bced4f626e708d
7
- data.tar.gz: bdb1086fbb90979c98084f0fdcd8c4a0cbdf4ff689dd623d39c61079166a29525e2c07881b080838c3b0535a1c98c8db966f987253a6e9e14837f0700120c274
6
+ metadata.gz: fd583ba7e1a2896ed7dbf4be664f4cecf5dcc1c136ceca207da1e38978db16c0b884684d02d3577da7af73a7e20a3ee1ad5e6448af5668823c66571cf8fe85b9
7
+ data.tar.gz: 5ee71483b7c1d0e70c5c87e8f4913b7fc0d7786c2f5a3f2d5b8617b8eff79a53ef5d183db8210556835d76367836b2c9c94a50e571b0b29e2399604cef2357ca
@@ -14,11 +14,12 @@ def version(logo_colour)
14
14
  _v[vl_2..-1].gradient(logo_colour[1], logo_colour[2], underline: true, bold: true)
15
15
  end
16
16
 
17
- logo_colour = [
18
- %w(ff0 f55 55f),
19
- %w(fa0 f5a 55f),
20
- %w(3eb 55f 55f),
21
- ].sample.map(&Termclock.method(:hex2rgb))
17
+ unless STDOUT.tty?
18
+ IO.undef_method(:winsize)
19
+ IO.define_method(:winsize) { [100, 100] }
20
+ end
21
+
22
+ LOGO_COLOUR = %w(ff0 f55 55f).map(&Termclock.method(:hex2rgb))
22
23
 
23
24
  if ARGV.any? { |x| x[/\A\-(\-help|h)\z/] }
24
25
  puts <<~EOF
@@ -36,36 +37,42 @@ if ARGV.any? { |x| x[/\A\-(\-help|h)\z/] }
36
37
  --character=|char=\t\tDraws specified character
37
38
  --clean\t\t\t\tJust run the clean bare clock
38
39
  --colour=|-c=\t\t\tSpecify hex colour (4 colours)
39
- \t\t\t\t[ with or without # ]
40
- --text-colour|-tc\t\tSpecify text colour (2 colours)
41
- \t\t\t\t[ with or without # ]
40
+ --text-colour=|-tc=\t\tSpecify text colour (2 colours)
41
+
42
+ \u2B22 \e[3mColours has to be hex, 3 or 6 characters with or
43
+ without the leading # in front\e[0m
42
44
 
43
45
  \e[1m3. Information:\e[0m
44
46
  --no-date|-nd\t\t\tShows no date
45
47
  --no-message|-nm\t\tShows no messages
46
48
  --no-sysinfo|-ni\t\tShows no system info
47
- --refresh|r\t\t\tSpecify delay or refresh time
49
+ --refresh=|r=\t\t\tSpecify delay or refresh time
48
50
  --no-logo|-nl\t\t\tDon't show the logo at the bottom
49
51
 
50
- \e[1m4. Formats:\e[0m
52
+ \e[1m4. Antiflicker:\e[0m
53
+ --antiflicker|-af\t\tDon't flicker terminal
54
+
55
+ \u2B22 \e[3mIf refresh time is low or terminal is slow, use this option\e[0m
56
+
57
+ \e[1m5. Formats:\e[0m
51
58
  --date-format=|-df=\t\tSpecify the date format
52
59
  --time-format=|-tf=\t\tSpecify the time format
53
60
 
54
61
  Usually the format looks like this:
55
62
  %H:%M:%S:%2N or %d %B, %Y
56
63
 
57
- \e[3mRun `date --help` to know more formats\e[0m
64
+ \u2B22 \e[3mRun `date --help` to know more formats\e[0m
58
65
 
59
66
  Supported characters are 0 - 9, a - z, /, \\, !, %, and |.
60
67
 
61
- #{version(logo_colour)}
68
+ #{version(LOGO_COLOUR)}
62
69
  EOF
63
70
 
64
71
  exit 0
65
72
  end
66
73
 
67
74
  if ARGV.any? { |x| x[/\A\-(-version|v)\z/] }
68
- puts version(logo_colour)
75
+ puts version(LOGO_COLOUR)
69
76
  exit 0
70
77
  end
71
78
 
@@ -106,6 +113,7 @@ begin
106
113
 
107
114
  bold = ARGV.any? { |x| x[/\A\-(\-bold|b)\z/] }
108
115
  italic = ARGV.any? { |x| x[/\A\-(\-italic|i)\z/] }
116
+ anti_flicker = ARGV.any? { |x| x[/\A\-(\-antiflicker|af)\z/] }
109
117
 
110
118
  no_print_info = ARGV.any? { |x| x[/\A\-(\-no\-sysinfo|ni)\z/] }
111
119
  no_logo = ARGV.any? { |x| x[/\A\-(\-no\-logo|nl)\z/] }
@@ -137,10 +145,13 @@ begin
137
145
  no_logo: no_logo,
138
146
  time_format: time_format,
139
147
  date_format: date_format,
140
- logo_colour: logo_colour
148
+ logo_colour: LOGO_COLOUR,
149
+ anti_flicker: anti_flicker
141
150
  )
142
151
  rescue Interrupt, SignalException
143
152
  print "\e[H\e[2J\e[3J"
153
+ # rescue Errno::ENOTTY
154
+ # abort "This should be run on a TTY! Also please don't pipe or redirect the output!"
144
155
  ensure
145
156
  print "\e[?25h"
146
157
  end
@@ -3,7 +3,9 @@ require 'io/console'
3
3
  require_relative "termclock/version"
4
4
 
5
5
  module Termclock
6
+ GC_COMPACT_TIME = 7200
6
7
  CLEAR = "\e[H\e[2J\e[3J".freeze
8
+ ANTIFLICKER = "\e[J\e[1;1H".freeze
7
9
  NEWLINE = ?\n.freeze
8
10
  SPACE = ?\s.freeze
9
11
  TAB = ?\t.freeze
@@ -9,9 +9,12 @@ module Termclock
9
9
  time_format: "%H %M %S %2N",
10
10
  date_format: '%a, %d %B %Y',
11
11
  no_logo: false,
12
+ anti_flicker: false,
12
13
  logo_colour: [Termclock.hex2rgb('ff0'), Termclock.hex2rgb('f55'), Termclock.hex2rgb('55f')]
13
14
  )
14
15
 
16
+ clear_character = anti_flicker ? ANTIFLICKER : CLEAR
17
+
15
18
  generate = proc do |start, stop, n = 5|
16
19
  r_op = r_val = nil
17
20
  ary = []
@@ -31,8 +34,7 @@ module Termclock
31
34
  ary
32
35
  end
33
36
 
34
- gc_compact, gc_compacted = GC.respond_to?(:compact), Time.now.to_i + 7200
35
- print CLEAR
37
+ gc_compact, gc_compacted = GC.respond_to?(:compact), Time.now.to_i + GC_COMPACT_TIME
36
38
 
37
39
  r1, g1, b1 = *colour1
38
40
  r2, g2, b2 = *colour2
@@ -58,19 +60,11 @@ module Termclock
58
60
  tc1 = textcolour1 ? hex2rgb(textcolour1) : hex2rgb('5555ff')
59
61
  tc2 = textcolour2 ? hex2rgb(textcolour2) : hex2rgb('3ce3b5')
60
62
 
61
- cpu_usage = 0
62
- cpu_usage_t = Thread.new { }
63
-
64
- current_net_usage = ''
65
- current_net_usage_t = Thread.new { }
66
-
67
- message_time = Time.now.to_i - 5
68
63
  message_counter = -1
69
64
  message = ''
70
65
  message_final = ''
71
66
  message_align = 0
72
67
  message_temp = ''
73
- point_five_tick = 0
74
68
 
75
69
  date, info = '', ''
76
70
 
@@ -114,22 +108,25 @@ module Termclock
114
108
  chop_message = 0
115
109
  deviation = 0
116
110
 
111
+ time_seperators = [?:, ?$]
112
+ time_seperator = time_seperators[0]
113
+ point_five_tick = -0.5
114
+
115
+ height, width = *STDOUT.winsize
116
+ height2, width2 = *STDOUT.winsize
117
+
118
+ print CLEAR
119
+
117
120
  while true
118
121
  monotonic_time_1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
119
122
  time_now = Time.now
120
123
  height, width = *STDOUT.winsize
121
124
 
122
- if time_now.to_f./(0.5).to_i.even?
123
- unless point_five_tick == 1
124
- point_five_tick = 1
125
- splitter = ?:.freeze
126
- clock_emoji.rotate!
127
- end
128
- else
129
- unless point_five_tick == 0
130
- point_five_tick = 0
131
- splitter = ?$.freeze
132
- end
125
+ if time_now.to_f > point_five_tick
126
+ point_five_tick = time_now.to_f + 0.5
127
+ time_seperators.rotate!
128
+ clock_emoji.rotate!
129
+ time_seperator = time_seperators[0]
133
130
  end
134
131
 
135
132
  unless no_logo
@@ -167,18 +164,14 @@ module Termclock
167
164
  )
168
165
  end
169
166
 
170
- if print_info
171
- info = system_info(width).gradient(
172
- tc1, tc2, bold: bold, italic: italic
173
- )
174
- end
167
+ info = system_info(width, tc1, tc2, bold, italic) if print_info
175
168
 
176
169
  if print_date
177
170
  date = time_now.strftime(date_format).center(width)
178
171
  .gradient(tc1, tc2, bold: bold, italic: italic, exclude_spaces: true)
179
172
  end
180
173
 
181
- time = time_now.strftime(time_format).split.join(splitter)
174
+ time = time_now.strftime(time_format).split.join(time_seperator)
182
175
  art = Termclock::ParseCharacters.display(time).lines
183
176
 
184
177
  art_aligned = art.each_with_index do |x, i|
@@ -192,21 +185,27 @@ module Termclock
192
185
  end.join
193
186
 
194
187
  vertical_gap = "\e[#{height./(2.0).-(art.length / 2.0).to_i + 1}H"
188
+ final_output = "#{info}#{vertical_gap}#{art_aligned}\n#{date}\n\n\e[K#{message_final}#{term_clock_v}"
189
+
190
+ if anti_flicker && (height != height2 || width != width2)
191
+ height2, width2 = *STDOUT.winsize
192
+ print CLEAR
193
+ end
195
194
 
196
- print "#{CLEAR}#{info}#{vertical_gap}#{art_aligned}\n#{date}\n\n#{message_final}#{term_clock_v}"
195
+ print "#{clear_character}#{final_output}"
197
196
 
198
197
  if gc_compact && time_now.to_i > gc_compacted
199
198
  GC.compact
200
- gc_compacted = time_now.to_i + 7200
199
+ gc_compacted = time_now.to_i + GC_COMPACT_TIME
201
200
  end
202
201
 
203
202
  monotonic_time_2 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
204
203
  time_diff = monotonic_time_2 - monotonic_time_1
205
- sleep_time = refresh.-(time_diff + EPSILON + deviation)
204
+ sleep_time = refresh.-(time_diff + deviation)
206
205
  sleep_time = 0 if sleep_time < 0
207
206
 
208
- deviation = Process.clock_gettime(Process::CLOCK_MONOTONIC) - monotonic_time_2
209
207
  sleep(sleep_time)
208
+ deviation = Process.clock_gettime(Process::CLOCK_MONOTONIC).-(monotonic_time_2 + sleep_time + EPSILON)
210
209
  end
211
210
  end
212
211
  end
@@ -6,7 +6,7 @@ module Termclock
6
6
  @@current_net_usage_t = Thread.new { }.join
7
7
 
8
8
  class << self
9
- def system_info(width)
9
+ def system_info(width, tc1, tc2, bold, italic)
10
10
  unless @@cpu_usage_t.alive?
11
11
  @@cpu_usage_t = Thread.new {
12
12
  _cpu_usage = LS::CPU.usage(0.25)
@@ -20,14 +20,14 @@ module Termclock
20
20
  @@current_net_usage_t = Thread.new do
21
21
  _m = LS::Net.current_usage(0.25)
22
22
 
23
- _dl = LS::PrettifyBytes.convert_short_decimal(_m[:received], precision: 1)
24
- _ul = LS::PrettifyBytes.convert_short_decimal(_m[:transmitted], precision: 1)
23
+ _dl = LS::PrettifyBytes.convert_short_decimal(_m[:received])
24
+ _ul = LS::PrettifyBytes.convert_short_decimal(_m[:transmitted])
25
25
 
26
- @@current_net_usage = "\u{1F4CA} Curr. DL/UL: #{sprintf "%-8s", _dl} | #{sprintf "%8s", _ul}"
26
+ @@current_net_usage = "\u{1F4CA} Curr. DL/UL: #{"%-9s" % _dl} | #{ "%9s" % _ul}"
27
27
  end
28
28
  end
29
29
 
30
- cpu = "\u{1F9E0} CPU: #{sprintf "%5s", @@cpu_usage}% (#{LS::CPU.count_online} / #{LS::CPU.count})"
30
+ cpu = "\u{1F9E0} CPU: #{"%6s" % @@cpu_usage}% (#{LS::CPU.count_online}/#{LS::CPU.count})"
31
31
 
32
32
  battery = if LS::Battery.present?
33
33
  stat = LS::Battery.stat
@@ -48,45 +48,44 @@ module Termclock
48
48
  _m = LS::Net.total_bytes
49
49
  ip = "\u{1F30F} IP Addr: #{LS::Net.ipv4_private}"
50
50
 
51
- net_usage = "\u{1F4C8} Totl. DL/UL: #{sprintf "%-8s", LS::PrettifyBytes.convert_short_decimal(_m[:received], precision: 1)}"\
52
- " | #{sprintf "%8s", LS::PrettifyBytes.convert_short_decimal(_m[:transmitted], precision: 1)}"
51
+ net_usage = "\u{1F4C8} Totl. DL/UL: #{"%-9s" % LS::PrettifyBytes.convert_short_decimal(_m[:received])}"\
52
+ " | #{"%9s" % LS::PrettifyBytes.convert_short_decimal(_m[:transmitted])}"
53
53
 
54
54
  _m = LS::Memory.stat
55
55
  _m.default = 0
56
56
 
57
57
  memory = "\u{1F3B0} Mem: #{LS::PrettifyBytes.convert_short_decimal(_m[:used] * 1000)}"\
58
58
  " / #{LS::PrettifyBytes.convert_short_decimal(_m[:total] * 1000)}"\
59
- " (#{_m[:percent_used]}%)"
59
+ " (#{"%.2f" % _m[:percent_used]}%)"
60
60
 
61
61
  _m = LS::Swap.stat
62
62
  _m.default = 0
63
63
 
64
64
  swap = "\u{1F300} Swap: #{LS::PrettifyBytes.convert_short_decimal(_m[:used] * 1000)}"\
65
65
  " / #{LS::PrettifyBytes.convert_short_decimal(_m[:total] * 1000)}"\
66
- " (#{_m[:percent_used]}%)"
66
+ " (#{"%.2f" % _m[:percent_used]}%)"
67
67
 
68
68
  _m = LS::Filesystem.stat('/')
69
69
  _m.default = 0
70
70
 
71
71
  fs = "\u{1F4BD} FS: #{LS::PrettifyBytes.convert_short_decimal(_m[:used])}"\
72
72
  " / #{LS::PrettifyBytes.convert_short_decimal(_m[:total])}"\
73
- " (#{_m[:used].*(100).fdiv(_m[:total]).round(2)}%)"
73
+ " (#{"%.2f" % _m[:used].*(100).fdiv(_m[:total]).round(2)}%)"
74
74
 
75
75
  pt = LS::Process.types.values
76
76
 
77
- process = "\u{1F9EE} Process: T:#{sprintf "%4s", LS::Process.count}|"\
78
- "R:#{sprintf "%3s", pt.count(:running)}|"\
79
- "S:#{sprintf "%3s", pt.count(:sleeping)}|"\
80
- "I:#{sprintf "%3s", pt.count(:idle)}"
77
+ process = "\u{1F9EE} Process: T:#{"%4s" % pt.length}|"\
78
+ "R:#{"%3s" % pt.count(:running)}|"\
79
+ "S:#{"%3s" % pt.count(:sleeping)}|"\
80
+ "I:#{"%3s" % pt.count(:idle)}"
81
81
 
82
- _os_v = LS::OS.version
83
- os_v = unless _os_v.empty?
84
- " (#{_os_v})"
82
+ @@os_v ||= unless LS::OS.version.empty?
83
+ " (#{LS::OS.version})"
85
84
  else
86
85
  EMPTY
87
86
  end
88
87
 
89
- os = "\u{1F427} Distrib: #{LS::OS.distribution} #{LS::OS.machine}#{os_v}"
88
+ @@os ||= "\u{1F427} Distrib: #{LS::OS.distribution} #{LS::OS.machine}#{@@os_v}"
90
89
 
91
90
  _uptime = LS::OS.uptime
92
91
  _second = _uptime[:second]
@@ -99,28 +98,55 @@ module Termclock
99
98
 
100
99
  uptime = "\u{1F3A1} Uptime: #{hour}:#{minute}:#{second}:#{ms} (#{LS::OS.uptime_i}s)"
101
100
 
102
- _loadavg = LS::Sysinfo.loads.map! { |x| sprintf("%.2f", x) }
101
+ _loadavg = LS::Sysinfo.loads.map! { |x| "%.2f" % x }
103
102
  loadavg = "\u{1F9FA} LoadAvg: 1m #{_loadavg[0]}|5m #{_loadavg[1]}|15m #{_loadavg[2]}"
104
103
 
105
- all_info = [
104
+ all_info = []
105
+ max_l = 0
106
+ i = -1
107
+
108
+ [
106
109
  user, hostname,
107
- os, battery,
110
+ @@os, battery,
108
111
  cpu, ip,
109
112
  memory, @@current_net_usage,
110
113
  swap, net_usage,
111
114
  fs, process,
112
115
  uptime, loadavg
113
- ].map(&:to_s).reject(&:empty?)
114
- max_l = 0
115
-
116
- all_info.each_with_index { |x, i|
117
- max_l = x.length if i.odd? && x.length > max_l
116
+ ].each { |x|
117
+ unless x.empty?
118
+ all_info << x
119
+ i += 1
120
+
121
+ if i.odd?
122
+ _x_len = x.length
123
+ max_l = _x_len if max_l < _x_len
124
+ end
125
+ end
118
126
  }
119
127
 
120
128
  max_l += 4
121
129
 
122
130
  all_info.each_slice(2).map { |x, y|
123
- "\s#{x}#{SPACE.*(width.-(x.length + max_l).abs)}#{y}"
131
+ _diff = width.-(x.length + max_l)
132
+ _diff = 0 if _diff < 1
133
+ y_to_s = y.to_s
134
+
135
+ padding = "#{SPACE * _diff}"
136
+ str = SPACE + x + padding + y_to_s
137
+
138
+ grads = SPACE + x.gradient(tc1, tc2, bold: bold, italic: italic) +
139
+ padding +
140
+ y_to_s.gradient(tc1, tc2, bold: bold, italic: italic)
141
+
142
+ len = str.chars.map { |x|
143
+ _x = x.bytesize./(2)
144
+ _x == 0 ? 1 : _x
145
+ }.sum
146
+
147
+ w = width - 2
148
+
149
+ len < w ? grads.+(SPACE.*(w - len)) : grads
124
150
  }.join(NEWLINE)
125
151
  end
126
152
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Termclock
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: termclock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sourav Goswami