cli_progress_bar 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 399a70e89cbbf1b0185cd00850c4522f4bbe568f73cae6b05e1717ecb41d729d
4
+ data.tar.gz: 38fe781cb8198a0afdd6f2a5760cb7b323957f8446ca938ab23b549316c7b3ea
5
+ SHA512:
6
+ metadata.gz: 11e2e671777899f3100a43a8d1a5350c60b3e288c5932bb27dbea21c4d48bbf4d8a994ebf44821e6ca41fa5c921289400ad8eec44d41616ecd51b74f53501a7a
7
+ data.tar.gz: ec3ed2e3b4de76cecb6798d5cc908b8ccc063195cec1f10c6e5f69584df07d37dd48d4789bd85bc5641b041d1df88618444db1b9d2205ca29ba77b51c40fda57
@@ -0,0 +1,49 @@
1
+
2
+ # Progress bar for items, where you increment or set the current progress
3
+ # as an item count against a total, from which the percentage is calculated.
4
+ # e.g. max_items: 10, num_items: 5 == 50% output on the progress bar.
5
+ module CLIProgressBar
6
+ class ItemProgressBar < ProgressBar
7
+ attr_reader :max_items
8
+
9
+ def initialize(
10
+ max_items,
11
+ of: "", log_at: LOG_AT_ALL_PERCENTS, bar_length: BAR_LENGTH,
12
+ line_char: LINE_CHAR, prefix: "", suffix: "", stream: STD_OUT
13
+ )
14
+ raise "max_items must be positive" unless max_items.positive?
15
+
16
+ of = "#{max_items} #{of.strip}" unless of.empty?
17
+
18
+ super(of:, log_at:, bar_length:, line_char:, prefix:, suffix:, stream:)
19
+
20
+ @max_items = max_items
21
+ @current_items = 0
22
+ end
23
+
24
+ def increment(by: 1, prefix: nil, suffix: nil)
25
+ raise "Invalid by: value" unless (@current_items + by).between?(1, @max_items)
26
+
27
+ @current_items += by
28
+ update_progress(prefix:, suffix:)
29
+ end
30
+
31
+ def update(num_items, prefix: nil, suffix: nil)
32
+ raise "Invalid num_items value" unless num_items.between?(1, @max_items)
33
+
34
+ @current_items = num_items
35
+ update_progress(prefix:, suffix:)
36
+ end
37
+
38
+ private
39
+
40
+ def update_progress(prefix: nil, suffix: nil)
41
+ @progress = percentage(@current_items, @max_items)
42
+ write_to_stream(prefix:, suffix:, items: @current_items)
43
+ end
44
+
45
+ def percentage(num_items, max_items)
46
+ num_items * 100 / max_items
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,27 @@
1
+
2
+ # Progress bar for percentages, where you increment or set the current progress
3
+ # as a percentage and specify which percentages are to be logged to the stream.
4
+ module CLIProgressBar
5
+ class PercentProgressBar < ProgressBar
6
+ def initialize(
7
+ of: "", log_at: LOG_AT_TEN_PERCENTS, bar_length: BAR_LENGTH,
8
+ line_char: LINE_CHAR, prefix: "", suffix: "", stream: STD_OUT
9
+ )
10
+ super
11
+ end
12
+
13
+ def increment(by: 1, prefix: nil, suffix: nil)
14
+ raise "Invalid by: value" unless (@progress + by).between?(1, 100)
15
+
16
+ @progress += by
17
+ write_to_stream(prefix:, suffix:)
18
+ end
19
+
20
+ def update(percent, prefix: nil, suffix: nil)
21
+ raise "Invalid percent value" unless percent.between?(1, 100)
22
+
23
+ @progress = percent
24
+ write_to_stream(prefix:, suffix:)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,59 @@
1
+
2
+ # Parent progress bar class to be inherited from only.
3
+ class CLIProgressBar::ProgressBar
4
+ attr_reader :progress
5
+
6
+ def initialize(
7
+ of: "", log_at: LOG_AT_TEN_PERCENTS, bar_length: BAR_LENGTH,
8
+ line_char: LINE_CHAR, prefix: "", suffix: "", stream: STD_OUT
9
+ )
10
+ raise "bar_length: must be positive and even" unless bar_length.positive? && bar_length.even?
11
+ raise "stream: must respond to #puts" unless stream.respond_to?(:puts)
12
+
13
+ @progress = 0
14
+ @of = of.to_s
15
+ @log_at = log_at
16
+ @bar_length = bar_length
17
+ @line_char = line_char
18
+ @prefix = prefix
19
+ @suffix = suffix
20
+ @stream = stream
21
+ end
22
+
23
+ private
24
+
25
+ # Writes a single line to stream, something like:
26
+ #
27
+ # Percent: [-------------------> ] 70% of 2.3 MiB
28
+ # - or -
29
+ # Item: [------------------> ] 8 of 12 repos (66%)
30
+ def write_to_stream(prefix: nil, suffix: nil, items: nil)
31
+ raise "Invalid progress value" unless @progress.between?(1, 100)
32
+
33
+ return unless @log_at.include?(@progress)
34
+
35
+ completed_length = (@bar_length * @progress / 100).to_i
36
+ remaining_length = @bar_length - completed_length
37
+ remaining_length -= 1 if remaining_length == @bar_length
38
+
39
+ # Ensure non negative number and remove a char for the >
40
+ completed_length = completed_length < 1 ? 0 : completed_length - 1
41
+
42
+ prefix ||= @prefix
43
+ prefix = prefix.empty? ? "" : "#{prefix.strip} "
44
+ suffix ||= @suffix
45
+ suffix = suffix.empty? ? "" : " #{suffix.strip}"
46
+ of_str = @of.empty? ? "" : " of #{@of.strip}"
47
+ totals = if items
48
+ "#{items}#{of_str} (#{@progress}%)"
49
+ else
50
+ "#{@progress}%#{of_str}"
51
+ end
52
+
53
+ line = "%s[%s>%s] %s%s" % [
54
+ prefix, @line_char * completed_length, " " * remaining_length, totals, suffix
55
+ ]
56
+
57
+ @stream.puts(line)
58
+ end
59
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CLIProgressBar
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "cli_progress_bar/version"
4
+ require_relative "cli_progress_bar/progress_bar"
5
+ require_relative "cli_progress_bar/percent_progress_bar"
6
+ require_relative "cli_progress_bar/item_progress_bar"
7
+
8
+ module CLIProgressBar
9
+ LOG_AT_ALL_PERCENTS = (1..100).to_a.freeze
10
+ LOG_AT_FIVE_PERCENTS = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100].freeze
11
+ LOG_AT_TEN_PERCENTS = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100].freeze
12
+ LOG_AT_QUARTER_PERCENTS = [25, 50, 75, 100].freeze
13
+ BAR_LENGTH = 60.freeze
14
+ LINE_CHAR = "-".freeze
15
+ STD_OUT = $stdout
16
+
17
+ def self.new(*args, **kwargs)
18
+ new_percent_bar(*args, **kwargs)
19
+ end
20
+
21
+ def self.new_percent_bar(*args, **kwargs)
22
+ PercentProgressBar.new(*args, **kwargs)
23
+ end
24
+
25
+ def self.new_item_bar(*args, **kwargs)
26
+ ItemProgressBar.new(*args, **kwargs)
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cli_progress_bar
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Michael Telford
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: irb
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rake
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '13.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '13.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: minitest
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '5.16'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '5.16'
54
+ - !ruby/object:Gem::Dependency
55
+ name: byebug
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '12.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '12.0'
68
+ description: A simple and customizable command line progress bar for Ruby applications
69
+ email:
70
+ - michael.telford@live.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - lib/cli_progress_bar.rb
76
+ - lib/cli_progress_bar/item_progress_bar.rb
77
+ - lib/cli_progress_bar/percent_progress_bar.rb
78
+ - lib/cli_progress_bar/progress_bar.rb
79
+ - lib/cli_progress_bar/version.rb
80
+ homepage: https://github.com/michaeltelford/cli_progress_bar
81
+ licenses:
82
+ - MIT
83
+ metadata:
84
+ allowed_push_host: https://rubygems.org
85
+ homepage_uri: https://github.com/michaeltelford/cli_progress_bar
86
+ source_code_uri: https://github.com/michaeltelford/cli_progress_bar
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '3.0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubygems_version: 3.6.7
102
+ specification_version: 4
103
+ summary: A simple CLI progress bar for Ruby applications
104
+ test_files: []