infobar 0.0.7 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f6a434af8a03ac85dcd80652a14e8cdb2e94662
4
- data.tar.gz: 5453eeb5f4d781111d841679fa89298e647878ae
3
+ metadata.gz: 224e1a27bb2395439832350f0f9ae226d70d6dc7
4
+ data.tar.gz: 27de3a8fe8fa615dff727dfe647bf23224258093
5
5
  SHA512:
6
- metadata.gz: e78b1cb39709d08fa1747603c935bea95c7a25357289b672e8a272a0efa51265be223b74bf86ecc34a999b65745976bf824996b87bb2037361e57e972f0f0e0f
7
- data.tar.gz: a42a5d228efa7ac73d97be14758b04843b71ec487d6060ef1d68035848e9e6bbeae3218f22cad69c74f576fb3be1289fc4ee3c563e9e90301f981bd9d1a0f5d3
6
+ metadata.gz: '09038c7c40c1860f68d719eb7cc4e76e5fc701edce4aaeb8ba564e0da5dbf91e34a1b9dff18bf11750fe6314de5ed49f38ce27ab2038aac519ea1576919e675b'
7
+ data.tar.gz: 48af752e245e7d9930a972b813b233c6069e48f250a2a3f4e4386b398228beb904ad24cb6750ade8ed3e349d10743cec8750257ba6bbd35cfb38c2e2a5e84650
@@ -0,0 +1,10 @@
1
+ rvm:
2
+ - 2.3.3
3
+ - 2.4.1
4
+ - ruby-head
5
+ - jruby-head
6
+ sudo: false
7
+ matrix:
8
+ allow_failures:
9
+ - rvm: ruby-head
10
+ - rvm: jruby-head
data/Gemfile CHANGED
@@ -3,3 +3,5 @@
3
3
  source 'https://rubygems.org'
4
4
 
5
5
  gemspec
6
+
7
+ gem 'byebug', platform: :mri
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.7
1
+ 0.1.0
@@ -1,18 +1,18 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: infobar 0.0.7 ruby lib
2
+ # stub: infobar 0.1.0 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "infobar".freeze
6
- s.version = "0.0.7"
6
+ s.version = "0.1.0"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Florian Frank".freeze]
11
- s.date = "2017-04-13"
11
+ s.date = "2017-04-24"
12
12
  s.description = "This gem displays progress of computations and additional information to the terminal.".freeze
13
13
  s.email = "flori@ping.de".freeze
14
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/fifo.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/rate.rb".freeze, "lib/infobar/spinner.rb".freeze, "lib/infobar/timer.rb".freeze, "lib/infobar/trend.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/fifo.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/rate.rb".freeze, "lib/infobar/spinner.rb".freeze, "lib/infobar/timer.rb".freeze, "lib/infobar/trend.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/fifo_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/rate_spec.rb".freeze, "spec/infobar/spinner_spec.rb".freeze, "spec/infobar/timer_spec.rb".freeze, "spec/infobar/trend_spec.rb".freeze, "spec/infobar_spec.rb".freeze, "spec/spec_helper.rb".freeze]
15
+ s.files = [".gitignore".freeze, ".rspec".freeze, ".travis.yml".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/fifo.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/rate.rb".freeze, "lib/infobar/spinner.rb".freeze, "lib/infobar/timer.rb".freeze, "lib/infobar/trend.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/fifo_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/rate_spec.rb".freeze, "spec/infobar/spinner_spec.rb".freeze, "spec/infobar/timer_spec.rb".freeze, "spec/infobar/trend_spec.rb".freeze, "spec/infobar_spec.rb".freeze, "spec/spec_helper.rb".freeze]
16
16
  s.homepage = "http://flori.github.com/infobar".freeze
17
17
  s.rdoc_options = ["--title".freeze, "Infobar".freeze, "--main".freeze, "README.md".freeze]
18
18
  s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze)
@@ -51,6 +51,8 @@ class Infobar
51
51
 
52
52
  delegate :style=, to: :display
53
53
 
54
+ delegate :as_styles=, to: :display
55
+
54
56
  def call(
55
57
  total:,
56
58
  current: 0,
@@ -60,19 +62,18 @@ class Infobar
60
62
  style: cc.infobar?&.style?&.to_h,
61
63
  frequency: cc.infobar?&.frequency?,
62
64
  update: false,
63
- finish: nil
65
+ finish: nil,
66
+ as_styles: nil
64
67
  )
65
68
  self.label = label
66
69
  counter.reset(total: total, current: current)
70
+ display.reset
67
71
  @message = convert_to_message(message)
68
72
  show.nil? or self.show = show
69
- if update
70
- update(message: @message, force: true)
71
- else
72
- display.reset
73
- end
74
73
  frequency.nil? or display.frequency = frequency
75
74
  style.nil? or self.style = style
75
+ self.as_styles = as_styles
76
+ update and update(message: @message, force: true)
76
77
  self
77
78
  end
78
79
 
@@ -105,14 +106,14 @@ class Infobar
105
106
 
106
107
  def update(message: nil, force: true)
107
108
  @message = convert_to_message(message)
108
- display.update(message: @message, progressed: counter.progressed, force: force)
109
+ display.update(message: @message, counter: counter, force: force)
109
110
  self
110
111
  end
111
112
 
112
- def progress(by: 1, message: nil, finish: true, force: false)
113
- counter.progress(by: by)
113
+ def progress(by: 1, as: nil, message: nil, finish: true, force: false)
114
+ counter.progress(by: by, as: as)
114
115
  @message = convert_to_message(message)
115
- display.update(message: @message, force: force, progressed: counter.progressed)
116
+ display.update(message: @message, force: force, counter: counter)
116
117
  finish && counter.done? and finish(message: finish)
117
118
  self
118
119
  end
@@ -120,7 +121,7 @@ class Infobar
120
121
  def finish(message: nil)
121
122
  counter.finish
122
123
  @message = convert_to_message(message)
123
- display.update(message: @message, force: true, progressed: counter.progressed)
124
+ display.update(message: @message, force: true, counter: counter)
124
125
  self
125
126
  end
126
127
 
@@ -13,12 +13,16 @@ class Infobar::Counter
13
13
 
14
14
  attr_reader :total
15
15
 
16
+ attr_reader :as
17
+
16
18
  def reset(total: 0, current: 0)
17
19
  @current = current
20
+ @as = Hash.new(0).update(nil => current)
18
21
  @total = total
19
22
  @start = nil
20
23
  @finished = false
21
24
  @timer = Infobar::Timer.new
25
+ self
22
26
  end
23
27
 
24
28
  delegate :rate, to: :@timer
@@ -40,12 +44,13 @@ class Infobar::Counter
40
44
  self
41
45
  end
42
46
 
43
- def progress(by: 1)
47
+ def progress(by: 1, as: nil)
44
48
  if !finished? && by >= 1
45
49
  now = Time.now
46
50
  @start ||= now
47
51
  @timer.add(now, by)
48
52
  @current += by
53
+ @as[as] += 1
49
54
  end
50
55
  self
51
56
  end
@@ -24,7 +24,7 @@ class Infobar::Display
24
24
  self.input = $stdin
25
25
  self.frequency = 0.05
26
26
  @show = true
27
- self.style = self.class.default_style
27
+ @style = self.class.default_style.dup
28
28
  end
29
29
 
30
30
  def frequency=(duration)
@@ -62,34 +62,63 @@ class Infobar::Display
62
62
  end
63
63
  end
64
64
 
65
- def style
66
- self.class.default_style.each_key.each_with_object({}) do |attribute, h|
67
- h[attribute] = instance_variable_get "@#{attribute}"
68
- end
69
- end
65
+ attr_reader :style
70
66
 
71
67
  def style=(new_style)
72
- self.class.default_style.each_key do |attribute|
73
- value = new_style[attribute]
74
- value.nil? and next
75
- instance_variable_set "@#{attribute}", value
76
- end
77
- self
68
+ @style.update(new_style)
69
+ end
70
+
71
+ def as_styles
72
+ defined? @as_styles or self.as_styles = {}
73
+ @as_styles
78
74
  end
79
75
 
80
- def update(message:, progressed:, force: false, **options)
76
+ def as_styles=(styles)
77
+ @as_styles = styles.to_h.dup
78
+ @as_styles.default_proc = proc { style.subhash(/\Adone_/) }
79
+ end
80
+
81
+ def update(message:, counter:, force: false, **options)
81
82
  force and @frequency.reset
82
83
  @frequency.call do
83
84
  message = Infobar.convert_to_message(message)
84
85
  carriage_return
85
86
  self.style = options
86
- cols = columns
87
- todo = message.to_str.center cols, replace_character
88
- done = todo.slice!(0, (progressed * cols))
89
- done.gsub!(replace_character, @done_fill[0])
90
- todo.gsub!(replace_character, @todo_fill[0])
91
- output << color(@done_fg_color, on_color(@done_bg_color, done)) +
92
- color(@todo_fg_color, on_color(@todo_bg_color, todo))
87
+ layout_bar(message, counter)
88
+ end
89
+ end
90
+
91
+ private\
92
+ def layout_bar(message, counter)
93
+ cols = columns
94
+ todo = message.to_str.center cols, replace_character
95
+
96
+ if counter.total > 0
97
+ max_done_length = counter.progressed * cols
98
+
99
+ total_done = 0
100
+ counter.as.each_with_index do |(name, count), i|
101
+ done_fill = as_styles[name].fetch(:done_fill) { @style[:done_fill] }
102
+ done_fg_color = as_styles[name].fetch(:done_fg_color) { @style[:done_fg_color] }
103
+ done_bg_color = as_styles[name].fetch(:done_bg_color) { @style[:done_bg_color] }
104
+
105
+ as_progressed = count / counter.total.to_f
106
+ as_done = as_progressed * cols
107
+ total_done += as_done
108
+ if counter.done? && i == counter.as.size - 1 && total_done <= max_done_length
109
+ done = todo.dup
110
+ todo = ''
111
+ else
112
+ done = todo.slice!(0, as_done)
113
+ end
114
+ done.gsub!(replace_character, done_fill[0])
115
+ output << color(done_fg_color, on_color(done_bg_color, done))
116
+ end
117
+ end
118
+
119
+ if todo.present?
120
+ todo.gsub!(replace_character, @style[:todo_fill][0])
121
+ output << color(@style[:todo_fg_color], on_color(@style[:todo_bg_color], todo))
93
122
  end
94
123
  end
95
124
 
@@ -124,9 +124,13 @@ class Infobar::Message
124
124
 
125
125
  attr_reader :opts
126
126
 
127
- delegate :directives, to: self
127
+ def directives
128
+ self.class.directives
129
+ end
128
130
 
129
- delegate :directive_default_options, to: self
131
+ def directive_default_options
132
+ self.class.directive_default_options
133
+ end
130
134
 
131
135
  def opts_for(directive)
132
136
  @opts.fetch(directive, directive_default_options[directive])
@@ -1,6 +1,6 @@
1
1
  class Infobar
2
2
  # Infobar version
3
- VERSION = '0.0.7'
3
+ VERSION = '0.1.0'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -1,5 +1,5 @@
1
1
  ---
2
- development:
2
+ default: &default
3
3
  label: Progress
4
4
  message:
5
5
  format: ' %l %c/%t (%P%%) in %te with %r, ETA %e @%E %s '
@@ -18,3 +18,6 @@ development:
18
18
  todo_fg_color: 124
19
19
  todo_bg_color: 214
20
20
  show: <%= STDIN.tty? %>
21
+
22
+ development: *default
23
+ test: *default
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe 'Infobar config' do
4
4
  before do
5
5
  ComplexConfig::Provider.config_dir =
6
- Pathname.new(__FILE__).dirname.dirname + 'config'
6
+ Pathname.new(__FILE__).join('../../config')
7
7
  extend ComplexConfig::Provider::Shortcuts
8
8
  ComplexConfig::Provider.reload
9
9
  end
@@ -20,6 +20,9 @@ describe 'Infobar config' do
20
20
  it 'configures default infobar' do
21
21
  Infobar(total: 23)
22
22
  expect(infobar.display.output).to receive(:<<).with(?\r)
23
+ expect(infobar.display.output).to receive(:<<).with(
24
+ "\e[38;5;22m\e[48;5;40m\e[0m\e[0m"
25
+ )
23
26
  expect(infobar.display.output).to receive(:<<).with(%r(Progress 0/23.*⣽))
24
27
  infobar.update
25
28
  expect(infobar).to be_show
@@ -9,20 +9,24 @@ describe Infobar::Display do
9
9
  described_class.new
10
10
  end
11
11
 
12
+ let :counter do
13
+ Infobar::Counter.new.reset(total: 2, current: 1)
14
+ end
15
+
12
16
  before do
13
17
  display.output = output
14
18
  allow(display).to receive(:columns).and_return 40
15
19
  end
16
20
 
17
21
  it 'can be updated' do
18
- display.update message: 'test', progressed: 0.5
22
+ display.update message: 'test', counter: counter
19
23
  expect(output.tap(&:rewind).read).to eq\
20
24
  "\r\e[38;5;22m\e[48;5;40m░░░░░░░░░░░░░░░░░░te\e[0m\e[0m\e[38;5;40m\e[48;5;22mst \e[0m\e[0m"
21
25
  end
22
26
 
23
27
  it 'update returns carriage first' do
24
28
  expect(display).to receive(:carriage_return).and_call_original
25
- display.update message: 'test', progressed: 0.5
29
+ display.update message: 'test', counter: counter
26
30
  expect(output.tap(&:rewind).read).to start_with ?\r
27
31
  end
28
32
 
@@ -47,12 +51,37 @@ describe Infobar::Display do
47
51
  todo_bg_color: 8
48
52
  }
49
53
  display.style = test_style
50
- display.update message: 'test', progressed: 0.5
54
+ display.update message: 'test', counter: counter
51
55
  expect(output.tap(&:rewind).read).to eq\
52
56
  "\r\e[38;5;1m\e[48;5;9mXXXXXXXXXXXXXXXXXXte\e[0m\e[0m\e[38;5;0m\e[48;5;8mstOOOOOOOOOOOOOOOOOO\e[0m\e[0m"
53
57
  expect(display.style).to eq(test_style)
54
58
  end
55
59
 
60
+ it 'styles are different as kinds differ' do
61
+ counter = Infobar::Counter.new.reset(total: 7, current: 5)
62
+ allow(counter).to receive(:as).and_return(
63
+ foo: 3,
64
+ bar: 2
65
+ )
66
+ allow(display).to receive(:as_styles).and_return(
67
+ {
68
+ foo: {
69
+ done_fill: ?X,
70
+ done_fg_color: 1,
71
+ done_bg_color: 9,
72
+ },
73
+ bar: {
74
+ done_fill: ?*,
75
+ done_fg_color: 0,
76
+ done_bg_color: 10,
77
+ }
78
+ }
79
+ )
80
+ display.update message: 'test', counter: counter
81
+ expect(output.tap(&:rewind).read).to eq\
82
+ "\r\e[38;5;1m\e[48;5;9mXXXXXXXXXXXXXXXXX\e[0m\e[0m\e[38;5;0m\e[48;5;10m*test******\e[0m\e[0m\e[38;5;40m\e[48;5;22m \e[0m\e[0m"
83
+ end
84
+
56
85
  it 'can output newline' do
57
86
  expect(display.output).to receive(:<<).with($/)
58
87
  display.newline
@@ -29,7 +29,7 @@ describe Infobar do
29
29
  expect(infobar.display).to receive(:update).
30
30
  with(
31
31
  message: anything,
32
- progressed: anything,
32
+ counter: anything,
33
33
  force: true
34
34
  ).and_call_original
35
35
  infobar.update
@@ -72,6 +72,20 @@ describe Infobar do
72
72
  expect(infobar.counter.current).to eq 7
73
73
  end
74
74
 
75
+ it 'can progress as some kind' do
76
+ Infobar(total: 10)
77
+ expect(infobar.counter.current).to eq 0
78
+ expect(infobar.progress).to eq infobar
79
+ expect(infobar.progress(as: :foo)).to eq infobar
80
+ expect(infobar.progress(as: :bar)).to eq infobar
81
+ expect(infobar.progress(as: :foo)).to eq infobar
82
+ expect(infobar.counter.as).to eq(
83
+ nil => 1,
84
+ foo: 2,
85
+ bar: 1
86
+ )
87
+ end
88
+
75
89
  it 'can be progressing with <<' do
76
90
  Infobar(total: 10)
77
91
  expect(infobar.counter.current).to eq 0
@@ -123,7 +137,7 @@ describe Infobar do
123
137
  expect(infobar.display).to receive(:update).with(
124
138
  message: message,
125
139
  force: true,
126
- progressed: 0.0
140
+ counter: anything
127
141
  ).and_call_original
128
142
  infobar.finish message: message
129
143
  expect(infobar).to be_finished
@@ -144,6 +158,7 @@ describe Infobar do
144
158
  Infobar(total: 10, style: { done_fill: ?X })
145
159
  output = ''
146
160
  infobar.display.output = output
161
+ allow(Tins::Terminal).to receive(:columns).and_return 80
147
162
  infobar.progress(force: true)
148
163
  expect(output).to include 'X'
149
164
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: infobar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-13 00:00:00.000000000 Z
11
+ date: 2017-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gem_hadar
@@ -153,6 +153,7 @@ extra_rdoc_files:
153
153
  files:
154
154
  - ".gitignore"
155
155
  - ".rspec"
156
+ - ".travis.yml"
156
157
  - ".utilsrc"
157
158
  - Gemfile
158
159
  - README.md