speedometer 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/speedometer.rb +64 -27
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 365dcb09e53a5d5e670bf77b662e1d135dbc6900
4
- data.tar.gz: 507223abcb13dd50efea0e7287556c7886e489a5
3
+ metadata.gz: d4146ad9c933e1bdb3a8e83255c41448af41387e
4
+ data.tar.gz: 75930156a91df6b4f9df2f8b158602a215e5f59a
5
5
  SHA512:
6
- metadata.gz: 71d8617b08907ad55aa9a9f8ead30301027fafdf2febbaa4c5cfb31f010dc5f4bec77b29026dbe4c777df54b202b38cdce02f041e8c2c315f7944d11d3c6fc65
7
- data.tar.gz: 6f18b14fe6b8669ff6fb3973937d2e50a83dac1eafc0dc1d289a1f87f37af222db5653b6abe70a78646611b21d2e9f3f0a9a682e518042e2061f3b2c32b1328c
6
+ metadata.gz: fe4ba0898dd1a193e5e95c6b26481537f0038cf8bb5b1d2d4224d324c0112a82aecd20caa1d22a499dbe89b9323c81b3af34d874659cbb429f23f6b283c83742
7
+ data.tar.gz: e2c425c989d215ed9d6040fe049a364426aecb10910072f59636b4bc02148eaa49360764efa5c04da798900bd595ad65a9b904abe5d067cd60241bd62c31da3a
data/lib/speedometer.rb CHANGED
@@ -16,18 +16,29 @@
16
16
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
17
  ########################################################################
18
18
  # = Methods
19
- # * new - accepts units in KB/MB/GB
19
+ # * new - accepts hash with: units in KB/MB(default)/GB; progressbar - bool
20
20
  # * start - start displaying upload speed
21
21
  # * stop - stops displaying upload rate
22
- # * display - displays upload speed
22
+ # * done(bytesize) - increments uploaded byte counter for progressbar
23
23
  # * log(message) - you need to use this instead of puts
24
24
  ########################################################################
25
25
  class Speedometer
26
26
 
27
- attr_accessor :uploaded, :refresh_time, :active
27
+ attr_accessor :uploaded, :refresh_time, :active, :to_upload
28
28
 
29
- def initialize(units="MB")
29
+ def initialize(**options)
30
+ units = options[:units]
31
+ units = 'MB' if units.nil?
32
+ if options[:progressbar]
33
+ @progressbar = true
34
+ else
35
+ @progressbar = false
36
+ end
37
+ @to_upload = 0
38
+ @done = 0
39
+ @cols = `tput cols`.split.last.to_i
30
40
  @active = true
41
+ @work_to_do = false
31
42
  @refresh_time = 1000
32
43
  @msg_lock = Mutex.new
33
44
  if ["KB","MB","GB"].include?(units)
@@ -39,34 +50,15 @@ class Speedometer
39
50
 
40
51
  def clear
41
52
  @msg_lock.synchronize do
42
- length = `tput cols`
43
- length = length.split.last.to_i
44
53
  print "\r"
45
54
  STDOUT.flush
46
- print "#{' ' * length}"
55
+ print "#{' ' * @cols}"
47
56
  STDOUT.flush
48
57
  print "\r"
49
58
  STDOUT.flush
50
59
  end
51
60
  end
52
61
 
53
- def display
54
- clear
55
- time = Time.now
56
- speed = (uploaded.to_f / (time - @start_time)) / 1024
57
- if @units == "MB" or @units == "GB"
58
- speed = speed / 1024
59
- end
60
- if @units == "GB"
61
- speed = speed / 1024
62
- end
63
- @msg_lock.synchronize do
64
- print "#{speed.round(2)}#{@units}/s"
65
- STDOUT.flush
66
- end
67
- sleep @refresh_time.to_f / 1000
68
- end
69
-
70
62
  def log(msg)
71
63
  clear
72
64
  @msg_lock.synchronize do
@@ -80,9 +72,9 @@ class Speedometer
80
72
  def start
81
73
  @start_time = Time.now if @start_time.nil?
82
74
  if !@started
83
- Thread.new {
84
- while @active
85
- self.display
75
+ @t = Thread.new {
76
+ while @active || @work_to_do
77
+ display
86
78
  end
87
79
  }
88
80
  @started = true
@@ -92,5 +84,50 @@ class Speedometer
92
84
  def stop
93
85
  @active = false
94
86
  @started = false
87
+ @t.join
88
+ end
89
+
90
+ def done(size)
91
+ abort "Upload size needs to be positive!" if size < 0
92
+ @done += size
93
+ end
94
+
95
+ private
96
+
97
+ def progress(taken)
98
+ abort "Upload size needs to be positive!" if @to_upload < 0
99
+ available = (@cols / 2).ceil - 2
100
+ bar = ' ' * (@cols - available - taken - 2)
101
+ done_pr = (@done.to_f / @to_upload.to_f).round(3)
102
+ done_sc = (available * done_pr).ceil
103
+ bar += '|'
104
+ if done_sc < available - 1
105
+ @work_to_do = true
106
+ bar += '=' * done_sc + '>'
107
+ bar += '.' * (@cols - bar.length - taken - 1)
108
+ else
109
+ bar += '=' * available
110
+ @work_to_do = false
111
+ end
112
+ bar += '|'
113
+ end
114
+
115
+ def display
116
+ clear
117
+ time = Time.now
118
+ speed = (uploaded.to_f / (time - @start_time)) / 1024
119
+ if @units == "MB" or @units == "GB"
120
+ speed = speed / 1024
121
+ end
122
+ if @units == "GB"
123
+ speed = speed / 1024
124
+ end
125
+ @msg_lock.synchronize do
126
+ print "#{speed.round(2)}#{@units}/s"
127
+ print progress(speed.round(2).to_s.length + 4) if (@to_upload > 0) && @progressbar && (@done > 0)
128
+ STDOUT.flush
129
+ end
130
+ sleep @refresh_time.to_f / 1000
95
131
  end
132
+
96
133
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: speedometer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tadeus Dobrovolskij
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-17 00:00:00.000000000 Z
11
+ date: 2014-09-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Library to track and display bandwith usage inside the application
14
14
  email: root@tad-do.net