infobar 0.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: efa40cb4c4b4763c56296e96a24358e46cef3a73
4
+ data.tar.gz: 3350e61f29a337276e17b84d1f3ee81eb91fc78f
5
+ SHA512:
6
+ metadata.gz: '079be8e48a1234be9d2e018939cb34fba2b87b84ad1c55e78ccee3ee7c19c67d93dad11f31c1117e8a5151671bd1e8d5eb7965c3c5aeedd898c88b775f9d9b81'
7
+ data.tar.gz: 00fc996234f4c637db4b1f0c79cd193e54eb49a3f6d2032f4bc8dd4b837753ba9619cf1aa4bfeab59f3c6e3c35c93fbed073bf6c8a1f281a0bc8909c1c403465
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ .*.sw[pon]
2
+ .AppleDouble
3
+ .DS_Store
4
+ .byebug_history
5
+ .rvmrc
6
+ Gemfile.lock
7
+ coverage
8
+ errors.lst
9
+ pkg
10
+ tags
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ -fd
2
+ -c
data/.utilsrc ADDED
@@ -0,0 +1,26 @@
1
+ # vim: set ft=ruby:
2
+
3
+ search do
4
+ prune_dirs /\A(\.svn|\.git|CVS|tmp|tags|coverage|pkg)\z/
5
+ skip_files /(\A\.|\.sw[pon]\z|\.(log|fnm|jpg|jpeg|png|pdf|svg)\z|tags|~\z)/i
6
+ end
7
+
8
+ discover do
9
+ prune_dirs /\A(\.svn|\.git|CVS|tmp|tags|coverage|pkg)\z/
10
+ skip_files /(\A\.|\.sw[pon]\z|\.log\z|~\z)/
11
+ binary false
12
+ end
13
+
14
+ strip_spaces do
15
+ prune_dirs /\A(\..*|CVS|pkg)\z/
16
+ skip_files /(\A\.|\.sw[pon]\z|\.log\z|~\z)/
17
+ end
18
+
19
+ probe do
20
+ test_framework :rspec
21
+ #include_dirs 'features'
22
+ end
23
+
24
+ ssh_tunnel do
25
+ terminal_multiplexer :tmux
26
+ end
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # vim: set filetype=ruby et sw=2 ts=2:
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # Infobar
2
+
3
+ ## Description
4
+
5
+ Display progress of computations and additional information to the terminal.
6
+
7
+ ## Installation
8
+
9
+ # gem install infobar
10
+
11
+ ## Usage
12
+
13
+ > Infobar(total: 23)
14
+ ░░░░░░░░░░ Infobar 6/23 in 00:00:05, ETA 00:00:17 @17:43:37 –
15
+ > 23.times { +infobar; sleep 1 }
16
+ ░░░░░░░░░░░Infobar 23/23 in 00:00:22, ETA 00:00:00 @17:43:37 ✓░░░░░░░░░░
17
+
18
+ or alternatively
19
+
20
+ > (1..23).with_infobar.each { |i| +infobar; sleep 1 }
21
+
22
+ ## Changes
23
+
24
+ * 2017-02-08 Release 0.0.0
25
+
26
+ ## Download
27
+
28
+ The homepage of this library is located at
29
+
30
+ * https://github.com/flori/infobar
31
+
32
+ ## Author
33
+
34
+ [Florian Frank](mailto:flori@ping.de)
35
+
36
+ ## License
37
+
38
+ This software is licensed under the Apache 2.0 license.
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ # vim: set filetype=ruby et sw=2 ts=2:
2
+
3
+ require 'gem_hadar'
4
+
5
+ GemHadar do
6
+ name 'infobar'
7
+ author 'Florian Frank'
8
+ email 'flori@ping.de'
9
+ homepage "http://flori.github.com/#{name}"
10
+ summary 'Gem to display information about computations.'
11
+ description 'This gem displays progress of computations and additional information to the terminal.'
12
+ module_type :class
13
+ test_dir 'spec'
14
+ ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', 'coverage', '.rvmrc',
15
+ '.AppleDouble', 'tags', '.byebug_history', '.DS_Store', 'errors.lst'
16
+ readme 'README.md'
17
+ title "#{name.camelize}"
18
+
19
+ required_ruby_version '>= 2.3'
20
+ dependency 'tins', '~> 1.0', '>= 1.13.2'
21
+ dependency 'term-ansicolor', '~> 1.4'
22
+ dependency 'complex_config', '~> 0.10'
23
+ development_dependency 'rake'
24
+ development_dependency 'simplecov'
25
+ development_dependency 'rspec'
26
+ end
27
+
28
+ task :default => :spec
data/TODO.md ADDED
@@ -0,0 +1,22 @@
1
+ # TODO
2
+
3
+ - add color gradients?
4
+ - cumulative counters to summarize several progress bars
5
+ - more documentation, lol
6
+
7
+ ## DONE
8
+
9
+ - units
10
+ - configuration file?
11
+ - add finished directive
12
+ - add nicer `Message#to_s` method
13
+ - add output methods that clear b4 printing to allow output while progressing
14
+ - elapsed time as duration
15
+ - ETA as duration
16
+ - ETA as datetime
17
+ - rate
18
+ - better average idea
19
+ - Update Frequency
20
+ - spinner animation
21
+ - newline method
22
+ - Easily switch on/off output
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
data/infobar.gemspec ADDED
@@ -0,0 +1,52 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # stub: infobar 0.0.0 ruby lib
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "infobar".freeze
6
+ s.version = "0.0.0"
7
+
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
+ s.require_paths = ["lib".freeze]
10
+ s.authors = ["Florian Frank".freeze]
11
+ s.date = "2017-02-08"
12
+ s.description = "This gem displays progress of computations and additional information to the terminal.".freeze
13
+ s.email = "flori@ping.de".freeze
14
+ s.extra_rdoc_files = ["README.md".freeze, "lib/infobar.rb".freeze, "lib/infobar/counter.rb".freeze, "lib/infobar/display.rb".freeze, "lib/infobar/duration.rb".freeze, "lib/infobar/fancy_interface.rb".freeze, "lib/infobar/frequency.rb".freeze, "lib/infobar/input_output.rb".freeze, "lib/infobar/message.rb".freeze, "lib/infobar/number.rb".freeze, "lib/infobar/spinner.rb".freeze, "lib/infobar/timer.rb".freeze, "lib/infobar/version.rb".freeze]
15
+ s.files = [".gitignore".freeze, ".rspec".freeze, ".utilsrc".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "TODO.md".freeze, "VERSION".freeze, "infobar.gemspec".freeze, "lib/infobar.rb".freeze, "lib/infobar/counter.rb".freeze, "lib/infobar/display.rb".freeze, "lib/infobar/duration.rb".freeze, "lib/infobar/fancy_interface.rb".freeze, "lib/infobar/frequency.rb".freeze, "lib/infobar/input_output.rb".freeze, "lib/infobar/message.rb".freeze, "lib/infobar/number.rb".freeze, "lib/infobar/spinner.rb".freeze, "lib/infobar/timer.rb".freeze, "lib/infobar/version.rb".freeze, "spec/config/infobar.yml".freeze, "spec/infobar/config_spec.rb".freeze, "spec/infobar/counter_spec.rb".freeze, "spec/infobar/display_spec.rb".freeze, "spec/infobar/duration_spec.rb".freeze, "spec/infobar/frequency_spec.rb".freeze, "spec/infobar/input_output_spec.rb".freeze, "spec/infobar/message_spec.rb".freeze, "spec/infobar/number_spec.rb".freeze, "spec/infobar/spinner_spec.rb".freeze, "spec/infobar/timer_spec.rb".freeze, "spec/infobar_spec.rb".freeze, "spec/spec_helper.rb".freeze]
16
+ s.homepage = "http://flori.github.com/infobar".freeze
17
+ s.rdoc_options = ["--title".freeze, "Infobar".freeze, "--main".freeze, "README.md".freeze]
18
+ s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze)
19
+ s.rubygems_version = "2.6.8".freeze
20
+ s.summary = "Gem to display information about computations.".freeze
21
+ s.test_files = ["spec/infobar/config_spec.rb".freeze, "spec/infobar/counter_spec.rb".freeze, "spec/infobar/display_spec.rb".freeze, "spec/infobar/duration_spec.rb".freeze, "spec/infobar/frequency_spec.rb".freeze, "spec/infobar/input_output_spec.rb".freeze, "spec/infobar/message_spec.rb".freeze, "spec/infobar/number_spec.rb".freeze, "spec/infobar/spinner_spec.rb".freeze, "spec/infobar/timer_spec.rb".freeze, "spec/infobar_spec.rb".freeze, "spec/spec_helper.rb".freeze]
22
+
23
+ if s.respond_to? :specification_version then
24
+ s.specification_version = 4
25
+
26
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
27
+ s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
28
+ s.add_development_dependency(%q<rake>.freeze, [">= 0"])
29
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
30
+ s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
31
+ s.add_runtime_dependency(%q<tins>.freeze, [">= 1.13.2", "~> 1.0"])
32
+ s.add_runtime_dependency(%q<term-ansicolor>.freeze, ["~> 1.4"])
33
+ s.add_runtime_dependency(%q<complex_config>.freeze, ["~> 0.10"])
34
+ else
35
+ s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
36
+ s.add_dependency(%q<rake>.freeze, [">= 0"])
37
+ s.add_dependency(%q<simplecov>.freeze, [">= 0"])
38
+ s.add_dependency(%q<rspec>.freeze, [">= 0"])
39
+ s.add_dependency(%q<tins>.freeze, [">= 1.13.2", "~> 1.0"])
40
+ s.add_dependency(%q<term-ansicolor>.freeze, ["~> 1.4"])
41
+ s.add_dependency(%q<complex_config>.freeze, ["~> 0.10"])
42
+ end
43
+ else
44
+ s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
45
+ s.add_dependency(%q<rake>.freeze, [">= 0"])
46
+ s.add_dependency(%q<simplecov>.freeze, [">= 0"])
47
+ s.add_dependency(%q<rspec>.freeze, [">= 0"])
48
+ s.add_dependency(%q<tins>.freeze, [">= 1.13.2", "~> 1.0"])
49
+ s.add_dependency(%q<term-ansicolor>.freeze, ["~> 1.4"])
50
+ s.add_dependency(%q<complex_config>.freeze, ["~> 0.10"])
51
+ end
52
+ end
data/lib/infobar.rb ADDED
@@ -0,0 +1,139 @@
1
+ require 'tins/xt'
2
+ require 'complex_config'
3
+
4
+ class Infobar
5
+ end
6
+
7
+ require 'infobar/version'
8
+ require 'infobar/counter'
9
+ require 'infobar/display'
10
+ require 'infobar/message'
11
+ require 'infobar/fancy_interface'
12
+ require 'infobar/input_output'
13
+
14
+ class Infobar
15
+ class << self
16
+ prepend Tins::Delegate
17
+ end
18
+ include Tins::SexySingleton
19
+ include Infobar::FancyInterface
20
+ prepend Infobar::InputOutput
21
+ include ComplexConfig::Provider::Shortcuts
22
+
23
+ def initialize
24
+ @counter = Infobar::Counter.new
25
+ @display = Infobar::Display.new
26
+ reset
27
+ end
28
+
29
+ def self.display
30
+ Infobar.instance.display
31
+ end
32
+
33
+ attr_reader :message
34
+
35
+ attr_reader :counter
36
+
37
+ attr_reader :display
38
+
39
+ attr_accessor :label
40
+
41
+ delegate :started?, to: :@counter
42
+
43
+ delegate :done?, to: :@counter
44
+
45
+ delegate :finished?, to: :@counter
46
+
47
+ delegate :show?, to: :@display
48
+
49
+ delegate :show=, to: :@display
50
+
51
+ delegate :style=, to: :@display
52
+
53
+ def call(
54
+ total:,
55
+ current: 0,
56
+ label: cc.infobar?&.label || 'Infobar',
57
+ message: cc.infobar?&.message?&.to_h,
58
+ show: cc.infobar?&.show?,
59
+ style: cc.infobar?&.style?&.to_h,
60
+ frequency: cc.infobar?&.frequency?,
61
+ update: false,
62
+ finish: nil
63
+ )
64
+ self.label = label
65
+ @counter.reset(total: total, current: current)
66
+ @message = convert_to_message(message)
67
+ show.nil? or self.show = show
68
+ if update
69
+ update(message: @message)
70
+ else
71
+ @display.reset
72
+ end
73
+ frequency.nil? or display.frequency = frequency
74
+ style.nil? or self.style = style
75
+ self
76
+ end
77
+
78
+ def reset
79
+ @message = convert_to_message('%l %c/%t in %te, ETA %e @%E %s')
80
+ @counter.reset(total: 0, current: 0)
81
+ @display.reset
82
+ self
83
+ end
84
+
85
+ def update(message: nil)
86
+ @message = convert_to_message(message)
87
+ @display.update(message: @message, progressed: @counter.progressed)
88
+ self
89
+ end
90
+
91
+ def progress(by: 1, message: nil, finish: true, force: false)
92
+ @counter.progress(by: by)
93
+ @message = convert_to_message(message)
94
+ @display.update(message: @message, force: force, progressed: @counter.progressed)
95
+ finish && @counter.done? and finish(message: finish)
96
+ self
97
+ end
98
+
99
+ def finish(message: nil)
100
+ @counter.finish
101
+ @message = convert_to_message(message)
102
+ @display.update(message: @message, force: true, progressed: @counter.progressed)
103
+ self
104
+ end
105
+
106
+ def convert_to_message(message)
107
+ case message
108
+ when Message
109
+ message
110
+ when Hash
111
+ Message.new(message)
112
+ when String
113
+ Message.new format: message
114
+ else
115
+ @message
116
+ end
117
+ end
118
+ end
119
+
120
+ def Infobar(**opts)
121
+ Infobar.(**opts)
122
+ end
123
+
124
+ class ::Object
125
+ def infobar
126
+ ::Infobar.instance
127
+ end
128
+
129
+ def with_infobar(**opts)
130
+ case
131
+ when total = opts[:total].ask_and_send(:to_sym)
132
+ opts[:total] = __send__(total)
133
+ when opts[:total].nil?
134
+ opts[:total] = size
135
+ end
136
+ Infobar.(**opts)
137
+ self
138
+ end
139
+ end
@@ -0,0 +1,101 @@
1
+ require 'infobar/timer'
2
+
3
+ class Infobar::Counter
4
+ class <<
5
+ prepend Tins::Delegate
6
+ end
7
+
8
+ def initialize
9
+ reset
10
+ end
11
+
12
+ attr_reader :current
13
+
14
+ attr_reader :total
15
+
16
+ def reset(total: 0, current: 0)
17
+ @current = current
18
+ @total = total
19
+ @start = nil
20
+ @finished = false
21
+ @timer = Infobar::Timer.new
22
+ end
23
+
24
+ delegate :rate, to: :@timer
25
+
26
+ delegate :average_time, to: :@timer
27
+
28
+ def started?
29
+ @start
30
+ end
31
+
32
+ def finished?
33
+ @finished
34
+ end
35
+
36
+ def finish
37
+ @finished = Time.now
38
+ self
39
+ end
40
+
41
+ def progress(by: 1)
42
+ if !finished? && by >= 1
43
+ now = Time.now
44
+ @start ||= now
45
+ @timer.add(now, by)
46
+ @current += by
47
+ end
48
+ self
49
+ end
50
+
51
+ def done?
52
+ @current >= @total
53
+ end
54
+
55
+ def to_go
56
+ [ total - current, 0 ].max
57
+ end
58
+
59
+ def to_go?
60
+ to_go.nonzero?
61
+ end
62
+
63
+ def time_remaining
64
+ if @finished
65
+ 0.0
66
+ else
67
+ average_time * to_go
68
+ end
69
+ end
70
+
71
+ def eta
72
+ if @finished
73
+ @finished
74
+ else
75
+ Time.now + time_remaining
76
+ end
77
+ end
78
+
79
+ def time_elapsed
80
+ case
81
+ when @finished && @start
82
+ @finished - @start
83
+ when @start
84
+ Time.now - @start
85
+ else
86
+ 0.0
87
+ end
88
+ end
89
+
90
+ def total_time
91
+ time_elapsed + time_remaining
92
+ end
93
+
94
+ def progressed
95
+ if @total.zero?
96
+ 0.0
97
+ else
98
+ @current / @total.to_f
99
+ end
100
+ end
101
+ end