tty-pie 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: 11c000927f796d72dc81d3c669f54a8c3bd4ef61c3da69abf0b9057ddc8cbe60
4
+ data.tar.gz: d5504fe31f97866a694aeb8920787a6f88b865a4d7feae193eb6457e869f0e98
5
+ SHA512:
6
+ metadata.gz: abb3e24bee240ea3262e3db8de2e88a1013591355c1385e155c32c01c34cc336b7ce873eb8a946905e2e09a086ce59bba36d053a33cc2015610347b468c283b6
7
+ data.tar.gz: 64891d4c43466f012af0594575f3197588cb40494cf35dacd2023bc5f59705601b9f6a898012b843cabc7a53dcbd0f170a086f057f727d947319fa0c0de60803
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Change log
2
+
3
+ ## [v0.1.0] - 2018-08-14
4
+
5
+ * Initial implementation and release
6
+
7
+ [v0.1.0]: https://github.com/piotrmurach/tty-pie/compare/v0.1.0
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Piotr Murach
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,279 @@
1
+ <div align="center">
2
+ <a href="https://piotrmurach.github.io/tty" target="_blank"><img width="130" src="https://github.com/piotrmurach/tty/blob/master/images/tty.png" alt="tty logo" /></a>
3
+ </div>
4
+
5
+ # TTY:Pie [![Gitter](https://badges.gitter.im/Join%20Chat.svg)][gitter]
6
+
7
+ [![Gem Version](https://badge.fury.io/rb/tty-pie.svg)][gem]
8
+ [![Build Status](https://secure.travis-ci.org/piotrmurach/tty-pie.svg?branch=master)][travis]
9
+ [![Build status](https://ci.appveyor.com/api/projects/status/9n69xpw64sylqh2y?svg=true)][appveyor]
10
+ [![Maintainability](https://api.codeclimate.com/v1/badges/dfac05073e1549e9dbb6/maintainability)][codeclimate]
11
+ [![Coverage Status](https://coveralls.io/repos/github/piotrmurach/tty-pie/badge.svg)][coverage]
12
+ [![Inline docs](http://inch-ci.org/github/piotrmurach/tty-pie.svg?branch=master)][inchpages]
13
+
14
+ [gitter]: https://gitter.im/piotrmurach/tty
15
+ [gem]: http://badge.fury.io/rb/tty-pie
16
+ [travis]: http://travis-ci.org/piotrmurach/tty-pie
17
+ [appveyor]: https://ci.appveyor.com/project/piotrmurach/tty-pie
18
+ [codeclimate]: https://codeclimate.com/github/piotrmurach/tty-pie/maintainability
19
+ [coverage]: https://coveralls.io/github/piotrmurach/tty-pie
20
+ [inchpages]: http://inch-ci.org/github/piotrmurach/tty-pie
21
+
22
+ > Draw pie charts in your terminal window
23
+
24
+ **TTY::Pie** provides pie chart drawing component for [TTY](https://github.com/piotrmurach/tty) toolkit.
25
+
26
+ ![Pie chart drawing](https://github.com/piotrmurach/tty-pie/blob/master/assets/tty-pie_chart_drawing_crypto.png)
27
+
28
+ ## Installation
29
+
30
+ Add this line to your application's Gemfile:
31
+
32
+ ```ruby
33
+ gem 'tty-pie'
34
+ ```
35
+
36
+ And then execute:
37
+
38
+ $ bundle
39
+
40
+ Or install it yourself as:
41
+
42
+ $ gem install tty-pie
43
+
44
+ ## Contents
45
+
46
+ * [1. Usage](#1-usage)
47
+ * [2. Interface](#2-interface)
48
+ * [2.1 data](#21-data)
49
+ * [2.2 add](#22-add)
50
+ * [2.3 update](#23-update)
51
+ * [2.4 draw](#24-draw)
52
+ * [2.5 position](#25-position)
53
+ * [2.6 radius](#26-radius)
54
+ * [2.7 legend](#27-legend)
55
+
56
+ ## 1. Usage
57
+
58
+ To draw a pie chart you need to provide an array of data items:
59
+
60
+ ```ruby
61
+ data = [
62
+ { name: 'BTC', value: 5977, color: :bright_yellow, fill: '*' },
63
+ { name: 'BCH', value: 3045, color: :bright_green, fill: 'x' },
64
+ { name: 'LTC', value: 2030, color: :bright_magenta, fill: '@' },
65
+ { name: 'ETH', value: 2350, color: :bright_cyan, fill: '+' }
66
+ ]
67
+ ```
68
+
69
+ Then pass data to **TTY::Pie** instance with a given radius:
70
+
71
+ ```ruby
72
+ pie_chart = TTY::Pie.new(data: data, radius: 5)
73
+ ```
74
+
75
+ and print the pie chart in your terminal window:
76
+
77
+ ```ruby
78
+ print pie_chart
79
+ # =>
80
+ # ++***
81
+ # ++++++******* * BTC 44.60%
82
+ # @@@+++++*********
83
+ # @@@@@@+++********** x BCH 22.72%
84
+ # @@@@@@@@@+***********
85
+ # @@@@@@@@@@x********** @ LTC 15.15%
86
+ # @@@@@@@@@xx**********
87
+ # @@@@@@xxxx********* + ETH 17.53%
88
+ # @@@xxxxxxx*******
89
+ # xxxxxxxx*****
90
+ # xxxx*
91
+ #
92
+ ```
93
+
94
+ ## 2. Interface
95
+
96
+ ### 2.1 data
97
+
98
+ To draw a pie chart you need to provide data. A single data item is just a Ruby hash that can contain the following keys:
99
+
100
+ * `:name` - used for setting the entry name in legend
101
+ * `:value` - used for calculating actual pie slice size
102
+ * `:color` - used to color a pie slice corresponding with a value
103
+ * `:fill` - used as a character to fill in a pie slice
104
+
105
+ At the very minimum you need to provide a `:value` in order for a pie to calculate slice sizes. If you wish to have a legend then add the `:name` key as well.
106
+
107
+ For example, the following will result in four slices in a pie chart:
108
+
109
+ ```ruby
110
+ data = [
111
+ { name: 'BTC', value: 5977 },
112
+ { name: 'BCH', value: 3045 },
113
+ { name: 'LTC', value: 2030 },
114
+ { name: 'ETH', value: 2350 }
115
+ ]
116
+ ```
117
+
118
+ However, the above data slices will be displayed without any color. Use `:color` out of [supported colors](https://github.com/piotrmurach/pastel#3-supported-colors):
119
+
120
+ ```ruby
121
+ data = [
122
+ { name: 'BTC', value: 5977, color: :bright_yellow },
123
+ { name: 'BCH', value: 3045, color: :bright_green },
124
+ { name: 'LTC', value: 2030, color: :bright_magenta },
125
+ { name: 'ETH', value: 2350, color: :bright_cyan }
126
+ ]
127
+ ```
128
+
129
+ To further make your chart readable consider making pie chart slices visible by channging the displayed characters using `:fill` key:
130
+
131
+ ```ruby
132
+ data = [
133
+ { name: 'BTC', value: 5977, color: :bright_yellow, fill: '*' },
134
+ { name: 'BCH', value: 3045, color: :bright_green, fill: 'x' },
135
+ { name: 'LTC', value: 2030, color: :bright_magenta, fill: '@' },
136
+ { name: 'ETH', value: 2350, color: :bright_cyan, fill: '+' }
137
+ ]
138
+ ```
139
+
140
+ There is no limit to the amount of data you can present, however there is a point of scale and legibility to be considered when printing in the terminals.
141
+
142
+ You can add data to pie chart during initialization using `:data` keyword:
143
+
144
+ ```ruby
145
+ pie_chart = TTY::Pie.new(data: data)
146
+ ```
147
+
148
+ Alternatively, you can delay adding data later with `add` or `<<` methods:
149
+
150
+ ```ruby
151
+ pie_chart = TTY::Pie.new
152
+ pie_chart << { name: 'BTC', value: 5977, color: :bright_yellow, fill: '*' }
153
+ pie_chart << { name: 'BCH', value: 3045, color: :bright_green, fill: 'x' }
154
+ pie_chart << { name: 'LTC', value: 2030, color: :bright_magenta, fill: '@' }
155
+ pie_chart << { name: 'ETH', value: 2350, color: :bright_cyan, fill: '+' }
156
+ ```
157
+
158
+ ### 2.2 add
159
+
160
+ You can also set data for the pie chart using the `add` or `<<` method calls. Once a pie chart is initialized, you can add data items:
161
+
162
+ ```ruby
163
+ pie_chart = TTY::Pie.new
164
+ pie_chart << { name: 'BTC', value: 5977, color: :bright_yellow, fill: '*' }
165
+ pie_chart << { name: 'BCH', value: 3045, color: :bright_green, fill: 'x' }
166
+ ...
167
+ ```
168
+
169
+ ### 2.3 update
170
+
171
+ To replace current data completely with the new use `update`:
172
+
173
+ ```ruby
174
+ data = [
175
+ { name: 'BTC', value: 5977, color: :bright_yellow, fill: '*' },
176
+ { name: 'BCH', value: 3045, color: :bright_green, fill: 'x' }
177
+ ]
178
+ pie_chart = TTY::Pie.new(data: data)
179
+
180
+ new_data = [
181
+ { name: 'BTC', value: 3400, color: :bright_yellow, fill: '*' },
182
+ { name: 'BCH', value: 1200, color: :bright_green, fill: 'x' },
183
+ ]
184
+
185
+ pie_chart.update(new_data)
186
+ ```
187
+
188
+ ### 2.4 draw
189
+
190
+ Once a pie chart has been initialized use the `draw` or `to_s` method to return a string representation of the chart.
191
+
192
+ To actually show it in a terminal, you need to print it:
193
+
194
+ ```ruby
195
+ print pie_chart.draw
196
+ # => this will render chart in terminal
197
+ ```
198
+
199
+ You can skip calling any method and simply print:
200
+
201
+ ```ruby
202
+ print pie_chart
203
+ # => this will render chart in terminal
204
+ ```
205
+
206
+ ### 2.5 position
207
+
208
+ If you don't provide location for you pie chart it will be printed at the current cursor location. In order to absolutely position the chart use `:left` and `:top` keyword arguments. For example, if you wanted to position the pie chart at `50th`column and `10th` row:
209
+
210
+ ```ruby
211
+ TTY::Pie.new(data: data, left: 50, top: 10)
212
+ ```
213
+
214
+ ### 2.6 radius
215
+
216
+ By default, a pie chart is rendered with a radius of `10`, you can change this using the `:radius` keyword:
217
+
218
+ ```ruby
219
+ TTY::Pie.new(data: data, radius: 5)
220
+ ```
221
+
222
+ ### 2.7 legend
223
+
224
+ Provided the following data:
225
+
226
+ ```ruby
227
+ data = [
228
+ { name: 'BTC', value: 5977, fill: '*' },
229
+ { name: 'BCH', value: 3045, fill: '+' },
230
+ { name: 'LTC', value: 2030, fill: 'x' }
231
+ ]
232
+ ```
233
+
234
+ You can control how the legend is displayed using the `:legend` keyword and hash as value with the following keys:
235
+
236
+ * `:left` - used to determine spacing between a chart and a legend, defaults to `4` columns
237
+ * `:line` - used to determine spacing between legend labels, defaults to `1` line
238
+
239
+ For example, to place a legend `10` columns away from the pie chart and separate each label by `2` lines do:
240
+
241
+ ```ruby
242
+ pie_chart = TTY::Pie.new(data: data, radius: 3, legend: {left: 10, line: 2})
243
+ ```
244
+
245
+ And printing in a terminal will produce:
246
+
247
+ ```ruby
248
+ print pie_chart
249
+ # =>
250
+ # x** * BTC 54.08%
251
+ # xxxx*****
252
+ # ++++xx*******
253
+ # ++++++******* + BCH 27.55%
254
+ # ++++++*******
255
+ # ++++*****
256
+ # +** x LTC 18.37%
257
+ ```
258
+
259
+ ## Development
260
+
261
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
262
+
263
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
264
+
265
+ ## Contributing
266
+
267
+ Bug reports and pull requests are welcome on GitHub at https://github.com/piotrmurach/tty-pie_chart. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
268
+
269
+ ## License
270
+
271
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
272
+
273
+ ## Code of Conduct
274
+
275
+ Everyone interacting in the TTY::Pie project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/piotrmurach/tty-pie_chart/blob/master/CODE_OF_CONDUCT.md).
276
+
277
+ ## Copyright
278
+
279
+ Copyright (c) 2018 Piotr Murach. See [LICENSE.txt](https://github.com/piotrmurach/tty-pie_chart/blob/master/LICENSE.txt) for further details.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ FileList['tasks/**/*.rake'].each(&method(:import))
4
+
5
+ desc 'Run all specs'
6
+ task ci: %w[ spec ]
7
+
8
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "tty/pie_chart"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/examples/basic.rb ADDED
@@ -0,0 +1,12 @@
1
+ require_relative '../lib/tty-pie'
2
+
3
+ data = [
4
+ { name: 'BTC', value: 5977, color: :bright_yellow },
5
+ { name: 'BCH', value: 3045, color: :bright_green },
6
+ { name: 'LTC', value: 2030, color: :bright_magenta },
7
+ { name: 'ETH', value: 2350, color: :bright_cyan }
8
+ ]
9
+
10
+ pie = TTY::Pie.new(data: data, radius: 10)
11
+
12
+ puts pie
data/examples/fill.rb ADDED
@@ -0,0 +1,12 @@
1
+ require_relative '../lib/tty-pie'
2
+
3
+ data = [
4
+ { name: 'BTC', value: 5977, color: :bright_yellow, fill: '*' },
5
+ { name: 'BCH', value: 3045, color: :bright_green, fill: 'x' },
6
+ { name: 'LTC', value: 2030, color: :bright_magenta, fill: '@' },
7
+ { name: 'ETH', value: 2350, color: :bright_cyan, fill: '+' }
8
+ ]
9
+
10
+ pie = TTY::Pie.new(data: data, radius: 10)
11
+
12
+ puts pie.draw
data/lib/tty-pie.rb ADDED
@@ -0,0 +1 @@
1
+ require_relative 'tty/pie'
data/lib/tty/pie.rb ADDED
@@ -0,0 +1,216 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pastel'
4
+ require 'tty-cursor'
5
+
6
+ require_relative 'pie/data_item'
7
+ require_relative 'pie/version'
8
+
9
+ module TTY
10
+ class Pie
11
+ FULL_CIRCLE_DEGREES = 360
12
+
13
+ POINT_SYMBOL = '•'
14
+
15
+ LEGEND_LINE_SPACE = 1
16
+
17
+ LEGEND_LEFT_SPACE = 4
18
+
19
+ attr_reader :top, :left
20
+
21
+ attr_reader :center_x, :center_y
22
+
23
+ attr_reader :radius
24
+
25
+ attr_reader :aspect_ratio
26
+
27
+ attr_reader :cursor
28
+
29
+ attr_reader :fill
30
+
31
+ attr_reader :legend
32
+
33
+ # Create pie chart
34
+ #
35
+ # @example
36
+ # data = [ { name: 'BTC', value: 5977, fill: '*' } ]
37
+ # pie_chart = TTY::Pie.new(data: data, radius: 2)
38
+ #
39
+ # @param [Array[Hash]] data
40
+ # the data to display in each slice
41
+ # @param [Integer] top
42
+ # @param [Integer] left
43
+ # @param [Integer] radius
44
+ # @param [Boolean] legend
45
+ # @param [String] fill
46
+ # @param [Float] aspect_ratio
47
+ #
48
+ # @api public
49
+ def initialize(data: [], top: nil, left: nil, radius: 10, legend: {}, fill: POINT_SYMBOL, aspect_ratio: 2)
50
+ @data = data.dup
51
+ @top = top
52
+ @left = left
53
+ @radius = radius
54
+ @legend = legend
55
+ @fill = fill
56
+ @aspect_ratio = aspect_ratio
57
+ @center_x = (left || 0) + radius * aspect_ratio
58
+ @center_y = (top || 0) + radius
59
+
60
+ @pastel = Pastel.new
61
+ @cursor = TTY::Cursor
62
+ end
63
+
64
+ # Total for the data items
65
+ #
66
+ # @return [Integer]
67
+ #
68
+ # @api private
69
+ def total
70
+ @data.inject(0) { |sum, item| sum += item[:value]; sum }
71
+ end
72
+
73
+ # Convert data into DataItems
74
+ #
75
+ # @return [Array[DataItem]]
76
+ #
77
+ # @api private
78
+ def data_items
79
+ total_value = total
80
+ @data.map do |item|
81
+ percent = (item[:value] * 100) / total_value.to_f
82
+ color_fill = item[:fill] || fill
83
+ DataItem.new(item[:name], item[:value], percent,
84
+ item.fetch(:color, false), color_fill)
85
+ end
86
+ end
87
+
88
+ # Add a data item
89
+ #
90
+ # @param [Hash]
91
+ #
92
+ # @return [self]
93
+ #
94
+ # @api public
95
+ def add(item)
96
+ @data << item
97
+ self
98
+ end
99
+ alias << add
100
+
101
+ # Replace current data with new set
102
+ #
103
+ # @param [Array[Hash]]
104
+ #
105
+ # @api public
106
+ def update(data)
107
+ @data = data
108
+ end
109
+
110
+ # Draw a pie based on the provided data
111
+ #
112
+ # @return [String]
113
+ #
114
+ # @api public
115
+ def draw
116
+ items = data_items
117
+ angles = data_angles(items)
118
+ output = []
119
+
120
+ labels = items.map(&:to_label)
121
+ label_vert_space = legend_line
122
+ label_horiz_space = legend_left
123
+ label_offset = labels.size / 2
124
+ label_boundry = label_vert_space * label_offset
125
+ labels_range = (-label_boundry..label_boundry).step(label_vert_space)
126
+
127
+ (-radius..radius).each do |y|
128
+ width = (Math.sqrt(radius * radius - y * y) * aspect_ratio).round
129
+ width = width.zero? ? (radius / aspect_ratio).round : width
130
+
131
+ output << ' ' * (center_x - width) if top.nil?
132
+ (-width..width).each do |x|
133
+ angle = radian_to_degree(Math.atan2(x, y))
134
+ item = items[select_data_item(angle, angles)]
135
+ if !top.nil?
136
+ output << cursor.move_to(center_x + x, center_y + y)
137
+ end
138
+ if item.color
139
+ output << @pastel.decorate(item.fill, item.color)
140
+ else
141
+ output << item.fill
142
+ end
143
+ end
144
+
145
+ if legend
146
+ if !top.nil?
147
+ output << cursor.move_to(center_x + aspect_ratio * radius + label_horiz_space, center_y + y)
148
+ end
149
+ if labels_range.include?(y)
150
+ output << ' ' * ((center_x - width) + label_horiz_space) if top.nil?
151
+ output << labels[label_offset + y / label_vert_space]
152
+ end
153
+ end
154
+
155
+ output << "\n"
156
+ end
157
+
158
+ output.join
159
+ end
160
+ alias to_s draw
161
+
162
+ private
163
+
164
+ # All angles from the data to slice the pie
165
+ #
166
+ # @return [Array[Numeric]]
167
+ #
168
+ # @api private
169
+ def data_angles(items)
170
+ start_angle = 0
171
+ items.reduce([]) do |acc, item|
172
+ acc << start_angle + item.angle
173
+ start_angle += item.angle
174
+ acc
175
+ end
176
+ end
177
+
178
+ # The space between a legend and a chart
179
+ #
180
+ # @return [Integer]
181
+ #
182
+ # @api private
183
+ def legend_left
184
+ legend ? legend.fetch(:left, LEGEND_LEFT_SPACE) : LEGEND_LEFT_SPACE
185
+ end
186
+
187
+ # The space between each legend item
188
+ #
189
+ # @return [Integer]
190
+ #
191
+ # @api private
192
+ def legend_line
193
+ (legend ? legend.fetch(:line, LEGEND_LINE_SPACE) : LEGEND_LINE_SPACE) + 1
194
+ end
195
+
196
+ # Select data item index based on angle
197
+ #
198
+ # @return [Integer]
199
+ #
200
+ # @api private
201
+ def select_data_item(angle, angles)
202
+ angles.index { |a| (FULL_CIRCLE_DEGREES / 2 - angle) < a }
203
+ end
204
+
205
+ # Convert radians to degrees
206
+ #
207
+ # @param [Float] radians
208
+ #
209
+ # @return [Float]
210
+ #
211
+ # @api private
212
+ def radian_to_degree(radians)
213
+ radians * 180 / Math::PI
214
+ end
215
+ end # Pie
216
+ end # TTY
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal
2
+
3
+ require 'pastel'
4
+
5
+ module TTY
6
+ class Pie
7
+ class DataItem
8
+ attr_accessor :name
9
+
10
+ attr_accessor :value
11
+
12
+ attr_accessor :percent
13
+
14
+ attr_writer :angle
15
+
16
+ attr_accessor :color
17
+
18
+ attr_accessor :fill
19
+
20
+ # Creat a DataItem
21
+ #
22
+ # @api private
23
+ def initialize(name, value, percent, color, fill)
24
+ @name = name
25
+ @value = value
26
+ @color = color
27
+ @percent = percent
28
+ @fill = fill
29
+ @pastel = Pastel.new
30
+ end
31
+
32
+ # The item start angle
33
+ #
34
+ # @api private
35
+ def angle
36
+ percent * FULL_CIRCLE_DEGREES / 100.to_f
37
+ end
38
+
39
+ # Convert a data item into a legend label
40
+ #
41
+ # @return [String]
42
+ #
43
+ # @api private
44
+ def to_label
45
+ percent_fmt = '%.2f' % percent
46
+ label = color ? @pastel.decorate(fill, color) : fill
47
+ "#{label} #{name} #{percent_fmt}%"
48
+ end
49
+ end
50
+ end # Pie
51
+ end # TTY
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TTY
4
+ class Pie
5
+ VERSION = "0.1.0".freeze
6
+ end # Pie
7
+ end # TTY
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ if ENV['COVERAGE'] || ENV['TRAVIS']
4
+ require 'simplecov'
5
+ require 'coveralls'
6
+
7
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
8
+ SimpleCov::Formatter::HTMLFormatter,
9
+ Coveralls::SimpleCov::Formatter
10
+ ]
11
+
12
+ SimpleCov.start do
13
+ command_name 'spec'
14
+ add_filter 'spec'
15
+ end
16
+ end
17
+
18
+ require "bundler/setup"
19
+ require "tty/pie"
20
+
21
+ RSpec.configure do |config|
22
+ # Enable flags like --only-failures and --next-failure
23
+ config.example_status_persistence_file_path = ".rspec_status"
24
+
25
+ # Disable RSpec exposing methods globally on `Module` and `main`
26
+ config.disable_monkey_patching!
27
+
28
+ config.expect_with :rspec do |c|
29
+ c.syntax = :expect
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe TTY::Pie, '#add' do
4
+ it "adds additional item" do
5
+ data = [ { name: 'BTC', value: 5977, fill: '*' } ]
6
+
7
+ pie = TTY::Pie.new(data: data, radius: 2)
8
+ pie << { name: 'BCH', value: 3045, fill: '+' }
9
+ pie << { name: 'LTC', value: 2030, fill: 'x' }
10
+
11
+ output = pie.draw
12
+
13
+ expect(output).to eq([
14
+ " x** * BTC 54.08%\n",
15
+ " +xx****\n",
16
+ "++++***** + BCH 27.55%\n",
17
+ " +++****\n",
18
+ " +** x LTC 18.37%\n"
19
+ ].join)
20
+ end
21
+
22
+ it "adds item without modifying original data source" do
23
+ data = [ { name: 'BTC', value: 5977, fill: '*' } ]
24
+ pie = TTY::Pie.new(data: data, radius: 2)
25
+ pie << { name: 'BCH', value: 3045, fill: '+' }
26
+
27
+ expect(data).to match([a_hash_including(name: 'BTC')])
28
+ end
29
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe TTY::Pie, ':color option' do
4
+ it "draws a pie chart without colors" do
5
+ data = [
6
+ { name: 'BTC', value: 5977, fill: '*' },
7
+ { name: 'BCH', value: 3045, fill: '+' },
8
+ { name: 'LTC', value: 2030, fill: 'x' }
9
+ ]
10
+ pie = TTY::Pie.new(data: data, radius: 2)
11
+
12
+ output = pie.draw
13
+
14
+ expect(output).to eq([
15
+ " x** * BTC 54.08%\n",
16
+ " +xx****\n",
17
+ "++++***** + BCH 27.55%\n",
18
+ " +++****\n",
19
+ " +** x LTC 18.37%\n"
20
+ ].join)
21
+ end
22
+
23
+ it "draws a pie chart with colors" do
24
+ data = [
25
+ { name: 'BTC', value: 5977, color: :bright_yellow },
26
+ { name: 'BCH', value: 3045, color: :bright_green },
27
+ { name: 'LTC', value: 2030, color: :bright_magenta }
28
+ ]
29
+ pie = TTY::Pie.new(data: data, radius: 2)
30
+
31
+ output = pie.draw
32
+
33
+ expect(output).to eq([
34
+ " \e[95m•\e[0m\e[93m•\e[0m\e[93m•\e[0m",
35
+ " \e[93m•\e[0m BTC 54.08%\n",
36
+ " \e[92m•\e[0m\e[95m•\e[0m\e[95m•\e[0m\e[93m•\e[0m\e[93m•\e[0m\e[93m•\e[0m\e[93m•\e[0m\n",
37
+ "\e[92m•\e[0m\e[92m•\e[0m\e[92m•\e[0m\e[92m•\e[0m\e[93m•\e[0m\e[93m•\e[0m\e[93m•\e[0m\e[93m•\e[0m\e[93m•\e[0m",
38
+ " \e[92m•\e[0m BCH 27.55%\n",
39
+ " \e[92m•\e[0m\e[92m•\e[0m\e[92m•\e[0m\e[93m•\e[0m\e[93m•\e[0m\e[93m•\e[0m\e[93m•\e[0m\n",
40
+ " \e[92m•\e[0m\e[93m•\e[0m\e[93m•\e[0m",
41
+ " \e[95m•\e[0m LTC 18.37%\n"
42
+ ].join)
43
+ end
44
+
45
+ it "draw a pie chart with legend and cursor positioning" do
46
+ data = [
47
+ { name: 'BTC', value: 5977, color: :bright_yellow },
48
+ { name: 'BCH', value: 3045, color: :bright_green },
49
+ { name: 'LTC', value: 2030, color: :bright_magenta }
50
+ ]
51
+ pie = TTY::Pie.new(data: data, radius: 2, left: 50, top: 10)
52
+
53
+ output = pie.draw
54
+
55
+ expect(output).to eq([
56
+ "\e[11;54H\e[95m•\e[0m\e[11;55H\e[93m•\e[0m\e[11;56H\e[93m•\e[0m",
57
+ "\e[11;63H\e[93m•\e[0m BTC 54.08%\n",
58
+ "\e[12;52H\e[92m•\e[0m\e[12;53H\e[95m•\e[0m\e[12;54H\e[95m•\e[0m\e[12;55H\e[93m•\e[0m\e[12;56H\e[93m•\e[0m\e[12;57H\e[93m•\e[0m\e[12;58H\e[93m•\e[0m\e[12;63H\n",
59
+ "\e[13;51H\e[92m•\e[0m\e[13;52H\e[92m•\e[0m\e[13;53H\e[92m•\e[0m\e[13;54H\e[92m•\e[0m\e[13;55H\e[93m•\e[0m\e[13;56H\e[93m•\e[0m\e[13;57H\e[93m•\e[0m\e[13;58H\e[93m•\e[0m\e[13;59H\e[93m•\e[0m",
60
+ "\e[13;63H\e[92m•\e[0m BCH 27.55%\n",
61
+ "\e[14;52H\e[92m•\e[0m\e[14;53H\e[92m•\e[0m\e[14;54H\e[92m•\e[0m\e[14;55H\e[93m•\e[0m\e[14;56H\e[93m•\e[0m\e[14;57H\e[93m•\e[0m\e[14;58H\e[93m•\e[0m\e[14;63H\n",
62
+ "\e[15;54H\e[92m•\e[0m\e[15;55H\e[93m•\e[0m\e[15;56H\e[93m•\e[0m",
63
+ "\e[15;63H\e[95m•\e[0m LTC 18.37%\n"
64
+ ].join)
65
+ end
66
+
67
+ it "draw a pie chart without legend and with cursor positioning" do
68
+ data = [
69
+ { name: 'BTC', value: 5977, color: :bright_yellow },
70
+ { name: 'BCH', value: 3045, color: :bright_green },
71
+ { name: 'LTC', value: 2030, color: :bright_magenta }
72
+ ]
73
+ pie = TTY::Pie.new(data: data, radius: 2, left: 50, top: 10, legend: false)
74
+
75
+ output = pie.draw
76
+
77
+ expect(output).to eq([
78
+ "\e[11;54H\e[95m•\e[0m\e[11;55H\e[93m•\e[0m\e[11;56H\e[93m•\e[0m\n",
79
+ "\e[12;52H\e[92m•\e[0m\e[12;53H\e[95m•\e[0m\e[12;54H\e[95m•\e[0m\e[12;55H\e[93m•\e[0m\e[12;56H\e[93m•\e[0m\e[12;57H\e[93m•\e[0m\e[12;58H\e[93m•\e[0m\n",
80
+ "\e[13;51H\e[92m•\e[0m\e[13;52H\e[92m•\e[0m\e[13;53H\e[92m•\e[0m\e[13;54H\e[92m•\e[0m\e[13;55H\e[93m•\e[0m\e[13;56H\e[93m•\e[0m\e[13;57H\e[93m•\e[0m\e[13;58H\e[93m•\e[0m\e[13;59H\e[93m•\e[0m\n",
81
+ "\e[14;52H\e[92m•\e[0m\e[14;53H\e[92m•\e[0m\e[14;54H\e[92m•\e[0m\e[14;55H\e[93m•\e[0m\e[14;56H\e[93m•\e[0m\e[14;57H\e[93m•\e[0m\e[14;58H\e[93m•\e[0m\n",
82
+ "\e[15;54H\e[92m•\e[0m\e[15;55H\e[93m•\e[0m\e[15;56H\e[93m•\e[0m\n",
83
+ ].join)
84
+ end
85
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe TTY::Pie, '#draw' do
4
+ let(:data) {
5
+ [
6
+ { name: 'BTC', value: 5977 },
7
+ { name: 'BCH', value: 3045 },
8
+ { name: 'LTC', value: 2030 }
9
+ ]
10
+ }
11
+
12
+ it "draws a pie chart with legend and without cursor positioning" do
13
+ pie = TTY::Pie.new(data: data, radius: 2)
14
+
15
+ output = pie.draw
16
+
17
+ expect(output).to eq([
18
+ " ••• • BTC 54.08%\n",
19
+ " •••••••\n",
20
+ "••••••••• • BCH 27.55%\n",
21
+ " •••••••\n",
22
+ " ••• • LTC 18.37%\n"
23
+ ].join)
24
+ end
25
+
26
+ it "draws a pie chart without legend and without cursor positioning" do
27
+ pie = TTY::Pie.new(data: data, radius: 2, legend: false)
28
+
29
+ output = pie.draw
30
+
31
+ expect(output).to eq([
32
+ " •••\n",
33
+ " •••••••\n",
34
+ "•••••••••\n",
35
+ " •••••••\n",
36
+ " •••\n"
37
+ ].join)
38
+ end
39
+
40
+ it "draw a pie chart with legend and cursor positioning" do
41
+ pie = TTY::Pie.new(data: data, radius: 2, left: 50, top: 10)
42
+
43
+ output = pie.draw
44
+
45
+ expect(output).to eq([
46
+ "\e[11;54H•\e[11;55H•\e[11;56H•\e[11;63H• BTC 54.08%\n",
47
+ "\e[12;52H•\e[12;53H•\e[12;54H•\e[12;55H•\e[12;56H•\e[12;57H•\e[12;58H•\e[12;63H\n",
48
+ "\e[13;51H•\e[13;52H•\e[13;53H•\e[13;54H•\e[13;55H•\e[13;56H•\e[13;57H•\e[13;58H•\e[13;59H•\e[13;63H• BCH 27.55%\n",
49
+ "\e[14;52H•\e[14;53H•\e[14;54H•\e[14;55H•\e[14;56H•\e[14;57H•\e[14;58H•\e[14;63H\n",
50
+ "\e[15;54H•\e[15;55H•\e[15;56H•",
51
+ "\e[15;63H• LTC 18.37%\n"
52
+ ].join)
53
+ end
54
+
55
+ it "draw a pie chart without legend and with cursor positioning" do
56
+ pie = TTY::Pie.new(data: data, radius: 2, left: 50, top: 10, legend: false)
57
+
58
+ output = pie.draw
59
+
60
+ expect(output).to eq([
61
+ "\e[11;54H\•\e[11;55H•\e[11;56H•\n",
62
+ "\e[12;52H\•\e[12;53H•\e[12;54H•\e[12;55H•\e[12;56H•\e[12;57H•\e[12;58H•\n",
63
+ "\e[13;51H\•\e[13;52H•\e[13;53H•\e[13;54H•\e[13;55H•\e[13;56H•\e[13;57H•\e[13;58H•\e[13;59H•\n",
64
+ "\e[14;52H\•\e[14;53H•\e[14;54H•\e[14;55H•\e[14;56H•\e[14;57H•\e[14;58H•\n",
65
+ "\e[15;54H\•\e[15;55H•\e[15;56H•\n",
66
+ ].join)
67
+ end
68
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe TTY::Pie, ':fill option' do
4
+ let(:data) {
5
+ [
6
+ { name: 'BTC', value: 5977, color: :bright_yellow, fill: '*' },
7
+ { name: 'BCH', value: 3045, color: :bright_green, fill: '+' },
8
+ { name: 'LTC', value: 2030, color: :bright_magenta, fill: 'x' }
9
+ ]
10
+ }
11
+
12
+ it "draws a pie chart with custom fill per data item" do
13
+ pie = TTY::Pie.new(data: data, radius: 2)
14
+
15
+ output = pie.draw
16
+
17
+ expect(output).to eq([
18
+ " \e[95mx\e[0m\e[93m*\e[0m\e[93m*\e[0m",
19
+ " \e[93m*\e[0m BTC 54.08%\n",
20
+ " \e[92m+\e[0m\e[95mx\e[0m\e[95mx\e[0m\e[93m*\e[0m\e[93m*\e[0m\e[93m*\e[0m\e[93m*\e[0m\n\e[92m+\e[0m\e[92m+\e[0m\e[92m+\e[0m\e[92m+\e[0m\e[93m*\e[0m\e[93m*\e[0m\e[93m*\e[0m\e[93m*\e[0m\e[93m*\e[0m",
21
+ " \e[92m+\e[0m BCH 27.55%\n",
22
+ " \e[92m+\e[0m\e[92m+\e[0m\e[92m+\e[0m\e[93m*\e[0m\e[93m*\e[0m\e[93m*\e[0m\e[93m*\e[0m\n",
23
+ " \e[92m+\e[0m\e[93m*\e[0m\e[93m*\e[0m",
24
+ " \e[95mx\e[0m LTC 18.37%\n"
25
+ ].join)
26
+ end
27
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe TTY::Pie, ':legend option' do
4
+ it "draws legend at default location with 1 line separator" do
5
+ data = [
6
+ { name: 'BTC', value: 5977, fill: '*' },
7
+ { name: 'BCH', value: 3045, fill: '+' },
8
+ { name: 'LTC', value: 2030, fill: 'x' }
9
+ ]
10
+
11
+ pie = TTY::Pie.new(data: data, radius: 2)
12
+
13
+ output = pie.draw
14
+
15
+ expect(output).to eq([
16
+ " x** * BTC 54.08%\n",
17
+ " +xx****\n",
18
+ "++++***** + BCH 27.55%\n",
19
+ " +++****\n",
20
+ " +** x LTC 18.37%\n"
21
+ ].join)
22
+ end
23
+
24
+ it "draws legend next to chart without any line separator" do
25
+ data = [
26
+ { name: 'BTC', value: 5977, fill: '*' },
27
+ { name: 'BCH', value: 3045, fill: '+' },
28
+ { name: 'LTC', value: 2030, fill: 'x' }
29
+ ]
30
+
31
+ pie = TTY::Pie.new(data: data, radius: 2, legend: {left: 0, line: 0})
32
+
33
+ output = pie.draw
34
+
35
+ expect(output).to eq([
36
+ " x**\n",
37
+ " +xx**** * BTC 54.08%\n",
38
+ "++++*****+ BCH 27.55%\n",
39
+ " +++**** x LTC 18.37%\n",
40
+ " +**\n"
41
+ ].join)
42
+ end
43
+
44
+ it "draws legend at custom location with line separator" do
45
+ data = [
46
+ { name: 'BTC', value: 5977, fill: '*' },
47
+ { name: 'BCH', value: 3045, fill: '+' },
48
+ { name: 'LTC', value: 2030, fill: 'x' }
49
+ ]
50
+
51
+ pie = TTY::Pie.new(data: data, radius: 3, legend: {left: 10, line: 2})
52
+
53
+ output = pie.draw
54
+
55
+ expect(output).to eq([
56
+ " x** * BTC 54.08%\n",
57
+ " xxxx*****\n",
58
+ "++++xx*******\n",
59
+ "++++++******* + BCH 27.55%\n",
60
+ "++++++*******\n",
61
+ " ++++*****\n",
62
+ " +** x LTC 18.37%\n"
63
+ ].join)
64
+ end
65
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe TTY::Pie, '#update' do
4
+ it "updates current data" do
5
+ data = [ { name: 'BTC', value: 5977, fill: '*' } ]
6
+
7
+ pie = TTY::Pie.new(data: data, radius: 2)
8
+
9
+ output = pie.draw
10
+
11
+ expect(output).to eq([
12
+ " ***\n",
13
+ " *******\n",
14
+ "********* * BTC 100.00%\n",
15
+ " *******\n",
16
+ " ***\n"
17
+ ].join)
18
+
19
+ pie.update([{name: 'LTC', value: 2030, fill: 'x'}])
20
+
21
+ output = pie.draw
22
+
23
+ expect(output).to eq([
24
+ " xxx\n",
25
+ " xxxxxxx\n",
26
+ "xxxxxxxxx x LTC 100.00%\n",
27
+ " xxxxxxx\n",
28
+ " xxx\n"
29
+ ].join)
30
+ end
31
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ desc 'Load gem inside irb console'
4
+ task :console do
5
+ require 'irb'
6
+ require 'irb/completion'
7
+ require File.join(__FILE__, '../../lib/tty-pie_chart')
8
+ ARGV.clear
9
+ IRB.start
10
+ end
11
+ task c: %w[ console ]
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ desc 'Measure code coverage'
4
+ task :coverage do
5
+ begin
6
+ original, ENV['COVERAGE'] = ENV['COVERAGE'], 'true'
7
+ Rake::Task['spec'].invoke
8
+ ensure
9
+ ENV['COVERAGE'] = original
10
+ end
11
+ end
data/tasks/spec.rake ADDED
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ begin
4
+ require 'rspec/core/rake_task'
5
+
6
+ desc 'Run all specs'
7
+ RSpec::Core::RakeTask.new(:spec) do |task|
8
+ task.pattern = 'spec/{unit,integration}{,/*/**}/*_spec.rb'
9
+ end
10
+
11
+ namespace :spec do
12
+ desc 'Run unit specs'
13
+ RSpec::Core::RakeTask.new(:unit) do |task|
14
+ task.pattern = 'spec/unit{,/*/**}/*_spec.rb'
15
+ end
16
+
17
+ desc 'Run integration specs'
18
+ RSpec::Core::RakeTask.new(:integration) do |task|
19
+ task.pattern = 'spec/integration{,/*/**}/*_spec.rb'
20
+ end
21
+ end
22
+
23
+ rescue LoadError
24
+ %w[spec spec:unit spec:integration].each do |name|
25
+ task name do
26
+ $stderr.puts "In order to run #{name}, do `gem install rspec`"
27
+ end
28
+ end
29
+ end
data/tty-pie.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "tty/pie/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "tty-pie"
7
+ spec.version = TTY::Pie::VERSION
8
+ spec.authors = ["Piotr Murach"]
9
+ spec.email = [""]
10
+
11
+ spec.summary = %q{Draw pie charts in your terminal window.}
12
+ spec.description = %q{Draw pie charts in your terminal window.}
13
+ spec.homepage = "https://piotrmurach.github.io/tty"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = Dir['{lib,spec,examples}/**/*.rb']
17
+ spec.files += Dir['{bin,tasks}/*', 'tty-pie.gemspec']
18
+ spec.files += Dir['README.md', 'CHANGELOG.md', 'LICENSE.txt', 'Rakefile']
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.required_ruby_version = '>= 2.0.0'
22
+
23
+ spec.add_dependency 'pastel', '~> 0.7.2'
24
+ spec.add_dependency 'tty-cursor', '~> 0.6.0'
25
+
26
+ spec.add_development_dependency 'bundler', '~> 1.16'
27
+ spec.add_development_dependency 'rake', '~> 10.0'
28
+ spec.add_development_dependency 'rspec', '~> 3.0'
29
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tty-pie
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Piotr Murach
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-12-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pastel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-cursor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.6.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.6.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.16'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.16'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ description: Draw pie charts in your terminal window.
84
+ email:
85
+ - ''
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - CHANGELOG.md
91
+ - LICENSE.txt
92
+ - README.md
93
+ - Rakefile
94
+ - bin/console
95
+ - bin/setup
96
+ - examples/basic.rb
97
+ - examples/fill.rb
98
+ - lib/tty-pie.rb
99
+ - lib/tty/pie.rb
100
+ - lib/tty/pie/data_item.rb
101
+ - lib/tty/pie/version.rb
102
+ - spec/spec_helper.rb
103
+ - spec/unit/add_spec.rb
104
+ - spec/unit/color_spec.rb
105
+ - spec/unit/draw_spec.rb
106
+ - spec/unit/fill_spec.rb
107
+ - spec/unit/legend_spec.rb
108
+ - spec/unit/update_spec.rb
109
+ - tasks/console.rake
110
+ - tasks/coverage.rake
111
+ - tasks/spec.rake
112
+ - tty-pie.gemspec
113
+ homepage: https://piotrmurach.github.io/tty
114
+ licenses:
115
+ - MIT
116
+ metadata: {}
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: 2.0.0
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubyforge_project:
133
+ rubygems_version: 2.7.3
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: Draw pie charts in your terminal window.
137
+ test_files: []