11 Commits

Author SHA1 Message Date
kojix2
1697360b6b Add MacOS to CI 2020-11-23 21:47:53 +09:00
kojix2
7034a83dea Add some basic tests 2020-11-23 21:35:32 +09:00
kojix2
a0c3863b4c Add barplot test 2020-11-23 20:09:32 +09:00
kojix2
0ff8c6a9f0 Start testing the command line interface 2020-11-23 17:14:43 +09:00
kojix2
7a08d6bab9 Provides a mechanism to switch back-end libraries 2020-11-23 15:02:53 +09:00
kojix2
b72f982618 Add youplot as an executable file 2020-11-23 13:46:33 +09:00
kojix2
e831fa93f4 Rename uplot to youplot 2020-11-23 13:23:59 +09:00
kojix2
d85be56521 Removed needless file 2020-11-23 11:50:22 +09:00
kojix2
5c59a77054 Update README
* Build status badge travis -> github actions
2020-11-19 22:58:09 +09:00
kojix2
8c78465ce9 Fix CI 2020-11-19 22:49:15 +09:00
kojix2
648e606ed4 Use Guthub Actions 2020-11-19 22:42:47 +09:00
29 changed files with 627 additions and 241 deletions

18
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: test
on: [push, pull_request]
jobs:
build:
name: ${{ matrix.os }} Ruby ${{ matrix.ruby }}
runs-on: ${{ matrix.os }}-latest
strategy:
matrix:
os: ['ubuntu', 'macos']
ruby: [ '2.5', '2.6', '2.7' ]
steps:
- uses: actions/checkout@v2
- uses: actions/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
- run: gem install bundler
- run: bundle install
- run: bundle exec rake test

View File

@@ -1,7 +0,0 @@
language: ruby
rvm: 2.7
script: bundle exec rake test
notifications:
email:
on_success: never
on_failure: change

View File

@@ -2,5 +2,5 @@
source 'https://rubygems.org' source 'https://rubygems.org'
# Specify your gem's dependencies in uplot.gemspec # Specify your gem's dependencies in youplot.gemspec
gemspec gemspec

View File

@@ -1,8 +1,8 @@
# uplot # YouPlot
[![Build Status](https://travis-ci.com/kojix2/uplot.svg?branch=master)](https://travis-ci.com/kojix2/uplot) ![Build Status](https://github.com/kojix2/youplot/workflows/test/badge.svg)
[![Gem Version](https://badge.fury.io/rb/u-plot.svg)](https://badge.fury.io/rb/u-plot) [![Gem Version](https://badge.fury.io/rb/youplot.svg)](https://badge.fury.io/rb/youplot)
[![Docs Latest](https://img.shields.io/badge/docs-latest-blue.svg)](https://rubydoc.info/gems/u-plot) [![Docs Latest](https://img.shields.io/badge/docs-latest-blue.svg)](https://rubydoc.info/gems/youplot)
[![The MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.txt) [![The MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.txt)
Create ASCII charts on the terminal with data from standard streams in the pipeline. Create ASCII charts on the terminal with data from standard streams in the pipeline.
@@ -12,11 +12,9 @@ Create ASCII charts on the terminal with data from standard streams in the pipel
## Installation ## Installation
``` ```
gem install u-plot gem install youplot
``` ```
Note: The name of the Gem is `u-plot` (not uplot).
## Screenshots ## Screenshots
**histogram** **histogram**
@@ -81,9 +79,9 @@ uplot colors
`uplot --help` `uplot --help`
``` ```
Program: uplot (Tools for plotting on the terminal) Program: YouPlot (Tools for plotting on the terminal)
Version: 0.2.7 (using UnicodePlot 0.0.4) Version: 0.2.7 (using UnicodePlot 0.0.4)
Source: https://github.com/kojix2/uplot Source: https://github.com/kojix2/youplot
Usage: uplot <command> [options] <in.tsv> Usage: uplot <command> [options] <in.tsv>
@@ -102,7 +100,7 @@ Commands:
Options: Options:
-O, --pass [VAL] file to output standard input data to [stdout] -O, --pass [VAL] file to output standard input data to [stdout]
for inserting uplot in the middle of Unix pipes for inserting YouPlot in the middle of Unix pipes
-o, --output VAL file to output results to [stderr] -o, --output VAL file to output results to [stderr]
-d, --delimiter VAL use DELIM instead of TAB for field delimiter -d, --delimiter VAL use DELIM instead of TAB for field delimiter
-H, --headers specify that the input has header row -H, --headers specify that the input has header row
@@ -143,7 +141,7 @@ Let's keep it simple.
## Contributing ## Contributing
Bug reports and pull requests are welcome on GitHub at [https://github.com/kojix2/uplot](https://github.com/kojix2/uplot). Bug reports and pull requests are welcome on GitHub at [https://github.com/kojix2/youplot](https://github.com/kojix2/youplot).
## License ## License

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
# frozen_string_literal: true # frozen_string_literal: true
require 'uplot' require 'youplot'
Uplot::Command.new.run YouPlot::Command.new.run

6
exe/youplot Executable file
View File

@@ -0,0 +1,6 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
require 'youplot'
YouPlot::Command.new.run

View File

@@ -1,10 +0,0 @@
# frozen_string_literal: true
require 'unicode_plot'
require 'uplot/version'
require 'uplot/preprocessing'
require 'uplot/plot'
require 'uplot/command'
module Uplot
end

View File

@@ -1,165 +0,0 @@
# frozen_string_literal: true
require 'unicode_plot'
module Uplot
# plotting functions.
module Plot
module_function
def barplot(data, params, count: false)
headers = data.headers
series = data.series
# `uplot count`
if count
series = Preprocessing.count_values(series[0])
params.title = headers[0] if headers
end
if series.size == 1
# If there is only one series, use the line number for label.
params.title ||= headers[0] if headers
labels = Array.new(series[0].size) { |i| (i + 1).to_s }
values = series[0].map(&:to_f)
else
params.title ||= headers[1] if headers
labels = series[0]
values = series[1].map(&:to_f)
end
UnicodePlot.barplot(labels, values, **params.to_hc)
end
def histogram(data, params)
headers = data.headers
series = data.series
params.title ||= data.headers[0] if headers
values = series[0].map(&:to_f)
UnicodePlot.histogram(values, **params.to_hc)
end
def line(data, params)
headers = data.headers
series = data.series
if series.size == 1
# If there is only one series, it is assumed to be sequential data.
params.ylabel ||= headers[0] if headers
y = series[0].map(&:to_f)
UnicodePlot.lineplot(y, **params.to_hc)
else
# If there are 2 or more series,
# assume that the first 2 series are the x and y series respectively.
if headers
params.xlabel ||= headers[0]
params.ylabel ||= headers[1]
end
x = series[0].map(&:to_f)
y = series[1].map(&:to_f)
UnicodePlot.lineplot(x, y, **params.to_hc)
end
end
def get_method2(method1)
"#{method1}!".to_sym
end
def plot_xyy(data, method1, params)
headers = data.headers
series = data.series
method2 = get_method2(method1)
series.map! { |s| s.map(&:to_f) }
if headers
params.name ||= headers[1]
params.xlabel ||= headers[0]
end
params.ylim ||= series[1..-1].flatten.minmax # why need?
plot = UnicodePlot.public_send(method1, series[0], series[1], **params.to_hc)
2.upto(series.size - 1) do |i|
UnicodePlot.public_send(method2, plot, series[0], series[i], name: headers&.[](i))
end
plot
end
def plot_xyxy(data, method1, params)
headers = data.headers
series = data.series
method2 = get_method2(method1)
series.map! { |s| s.map(&:to_f) }
series = series.each_slice(2).to_a
params.name ||= headers[0] if headers
params.xlim = series.map(&:first).flatten.minmax # why need?
params.ylim = series.map(&:last).flatten.minmax # why need?
x1, y1 = series.shift
plot = UnicodePlot.public_send(method1, x1, y1, **params.to_hc)
series.each_with_index do |(xi, yi), i|
UnicodePlot.public_send(method2, plot, xi, yi, name: headers&.[]((i + 1) * 2))
end
plot
end
def plot_fmt(data, fmt, method1, params)
case fmt
when 'xyy'
plot_xyy(data, method1, params)
when 'xyxy'
plot_xyxy(data, method1, params)
else
raise "Unknown format: #{fmt}"
end
end
def lines(data, params, fmt = 'xyy')
check_series_size(data, fmt)
plot_fmt(data, fmt, :lineplot, params)
end
def scatter(data, params, fmt = 'xyy')
check_series_size(data, fmt)
plot_fmt(data, fmt, :scatterplot, params)
end
def density(data, params, fmt = 'xyy')
check_series_size(data, fmt)
plot_fmt(data, fmt, :densityplot, params)
end
def boxplot(data, params)
headers = data.headers
series = data.series
headers ||= (1..series.size).map(&:to_s)
series.map! { |s| s.map(&:to_f) }
UnicodePlot.boxplot(headers, series, **params.to_hc)
end
def colors(color_names = false)
UnicodePlot::StyledPrinter::TEXT_COLORS.each do |k, v|
print v
print k
unless color_names
print "\t"
print ' ●'
end
print "\033[0m"
print "\t"
end
puts
end
def check_series_size(data, fmt)
series = data.series
if series.size == 1
warn 'uplot: There is only one series of input data. Please check the delimiter.'
warn ''
warn " Headers: \e[35m#{data.headers.inspect}\e[0m"
warn " The first item is: \e[35m\"#{series[0][0]}\"\e[0m"
warn " The last item is : \e[35m\"#{series[0][-1]}\"\e[0m"
exit 1
end
if fmt == 'xyxy' && series.size.odd?
warn 'uplot: In the xyxy format, the number of series must be even.'
warn ''
warn " Number of series: \e[35m#{series.size}\e[0m"
warn " Headers: \e[35m#{data.headers.inspect}\e[0m"
exit 1
end
end
end
end

9
lib/youplot.rb Normal file
View File

@@ -0,0 +1,9 @@
# frozen_string_literal: true
require 'unicode_plot'
require 'youplot/version'
require 'youplot/preprocessing'
require 'youplot/command'
module YouPlot
end

View File

@@ -0,0 +1,167 @@
# frozen_string_literal: true
require 'unicode_plot'
module YouPlot
# plotting functions.
module Backends
module UnicodePlotBackend
module_function
def barplot(data, params, count: false)
headers = data.headers
series = data.series
# `uplot count`
if count
series = Preprocessing.count_values(series[0])
params.title = headers[0] if headers
end
if series.size == 1
# If there is only one series, use the line number for label.
params.title ||= headers[0] if headers
labels = Array.new(series[0].size) { |i| (i + 1).to_s }
values = series[0].map(&:to_f)
else
params.title ||= headers[1] if headers
labels = series[0]
values = series[1].map(&:to_f)
end
UnicodePlot.barplot(labels, values, **params.to_hc)
end
def histogram(data, params)
headers = data.headers
series = data.series
params.title ||= data.headers[0] if headers
values = series[0].map(&:to_f)
UnicodePlot.histogram(values, **params.to_hc)
end
def line(data, params)
headers = data.headers
series = data.series
if series.size == 1
# If there is only one series, it is assumed to be sequential data.
params.ylabel ||= headers[0] if headers
y = series[0].map(&:to_f)
UnicodePlot.lineplot(y, **params.to_hc)
else
# If there are 2 or more series,
# assume that the first 2 series are the x and y series respectively.
if headers
params.xlabel ||= headers[0]
params.ylabel ||= headers[1]
end
x = series[0].map(&:to_f)
y = series[1].map(&:to_f)
UnicodePlot.lineplot(x, y, **params.to_hc)
end
end
def get_method2(method1)
"#{method1}!".to_sym
end
def plot_xyy(data, method1, params)
headers = data.headers
series = data.series
method2 = get_method2(method1)
series.map! { |s| s.map(&:to_f) }
if headers
params.name ||= headers[1]
params.xlabel ||= headers[0]
end
params.ylim ||= series[1..-1].flatten.minmax # why need?
plot = UnicodePlot.public_send(method1, series[0], series[1], **params.to_hc)
2.upto(series.size - 1) do |i|
UnicodePlot.public_send(method2, plot, series[0], series[i], name: headers&.[](i))
end
plot
end
def plot_xyxy(data, method1, params)
headers = data.headers
series = data.series
method2 = get_method2(method1)
series.map! { |s| s.map(&:to_f) }
series = series.each_slice(2).to_a
params.name ||= headers[0] if headers
params.xlim = series.map(&:first).flatten.minmax # why need?
params.ylim = series.map(&:last).flatten.minmax # why need?
x1, y1 = series.shift
plot = UnicodePlot.public_send(method1, x1, y1, **params.to_hc)
series.each_with_index do |(xi, yi), i|
UnicodePlot.public_send(method2, plot, xi, yi, name: headers&.[]((i + 1) * 2))
end
plot
end
def plot_fmt(data, fmt, method1, params)
case fmt
when 'xyy'
plot_xyy(data, method1, params)
when 'xyxy'
plot_xyxy(data, method1, params)
else
raise "Unknown format: #{fmt}"
end
end
def lines(data, params, fmt = 'xyy')
check_series_size(data, fmt)
plot_fmt(data, fmt, :lineplot, params)
end
def scatter(data, params, fmt = 'xyy')
check_series_size(data, fmt)
plot_fmt(data, fmt, :scatterplot, params)
end
def density(data, params, fmt = 'xyy')
check_series_size(data, fmt)
plot_fmt(data, fmt, :densityplot, params)
end
def boxplot(data, params)
headers = data.headers
series = data.series
headers ||= (1..series.size).map(&:to_s)
series.map! { |s| s.map(&:to_f) }
UnicodePlot.boxplot(headers, series, **params.to_hc)
end
def colors(color_names = false)
UnicodePlot::StyledPrinter::TEXT_COLORS.each do |k, v|
print v
print k
unless color_names
print "\t"
print ' ●'
end
print "\033[0m"
print "\t"
end
puts
end
def check_series_size(data, fmt)
series = data.series
if series.size == 1
warn 'youplot: There is only one series of input data. Please check the delimiter.'
warn ''
warn " Headers: \e[35m#{data.headers.inspect}\e[0m"
warn " The first item is: \e[35m\"#{series[0][0]}\"\e[0m"
warn " The last item is : \e[35m\"#{series[0][-1]}\"\e[0m"
exit 1
end
if fmt == 'xyxy' && series.size.odd?
warn 'YouPlot: In the xyxy format, the number of series must be even.'
warn ''
warn " Number of series: \e[35m#{series.size}\e[0m"
warn " Headers: \e[35m#{data.headers.inspect}\e[0m"
exit 1
end
end
end
end
end

View File

@@ -3,20 +3,25 @@
require_relative 'preprocessing' require_relative 'preprocessing'
require_relative 'command/parser' require_relative 'command/parser'
module Uplot # FIXME
require_relative 'backends/unicode_plot_backend'
module YouPlot
Data = Struct.new(:headers, :series) Data = Struct.new(:headers, :series)
class Command class Command
attr_accessor :params attr_accessor :params
attr_reader :data, :fmt, :parser attr_reader :data, :fmt, :parser
def initialize def initialize(argv = ARGV)
@argv = argv
@params = Params.new @params = Params.new
@parser = Parser.new @parser = Parser.new
@backend = YouPlot::Backends::UnicodePlotBackend
end end
def run def run
parser.parse_options parser.parse_options(@argv)
command = parser.command command = parser.command
params = parser.params params = parser.params
delimiter = parser.delimiter delimiter = parser.delimiter
@@ -28,7 +33,7 @@ module Uplot
@debug = parser.debug @debug = parser.debug
if command == :colors if command == :colors
Plot.colors(parser.color_names) @backend.colors(parser.color_names)
exit exit
end end
@@ -39,26 +44,27 @@ module Uplot
pp @data if @debug pp @data if @debug
plot = case command plot = case command
when :bar, :barplot when :bar, :barplot
Plot.barplot(data, params) @backend.barplot(data, params)
when :count, :c when :count, :c
Plot.barplot(data, params, count: true) @backend.barplot(data, params, count: true)
when :hist, :histogram when :hist, :histogram
Plot.histogram(data, params) @backend.histogram(data, params)
when :line, :lineplot when :line, :lineplot
Plot.line(data, params) @backend.line(data, params)
when :lines, :lineplots when :lines, :lineplots
Plot.lines(data, params, fmt) @backend.lines(data, params, fmt)
when :scatter, :s when :scatter, :s
Plot.scatter(data, params, fmt) @backend.scatter(data, params, fmt)
when :density, :d when :density, :d
Plot.density(data, params, fmt) @backend.density(data, params, fmt)
when :box, :boxplot when :box, :boxplot
Plot.boxplot(data, params) @backend.boxplot(data, params)
else else
raise "unrecognized plot_type: #{command}" raise "unrecognized plot_type: #{command}"
end end
if output.is_a?(IO) case output
when IO
plot.render(output) plot.render(output)
else else
File.open(output, 'w') do |f| File.open(output, 'w') do |f|
@@ -66,9 +72,11 @@ module Uplot
end end
end end
if pass.is_a?(IO) case pass
print input when IO
elsif pass pass.print(input)
else
if pass
File.open(pass, 'w') do |f| File.open(pass, 'w') do |f|
f.print(input) f.print(input)
end end
@@ -77,3 +85,4 @@ module Uplot
end end
end end
end end
end

View File

@@ -1,6 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
module Uplot module YouPlot
class Command class Command
# UnicodePlot parameters. # UnicodePlot parameters.
# * Normally in a Ruby program, you might use hash for the parameter object. # * Normally in a Ruby program, you might use hash for the parameter object.

View File

@@ -3,7 +3,7 @@
require 'optparse' require 'optparse'
require_relative 'params' require_relative 'params'
module Uplot module YouPlot
class Command class Command
class Parser class Parser
attr_reader :command, :params, attr_reader :command, :params,
@@ -26,14 +26,14 @@ module Uplot
def create_default_parser def create_default_parser
OptionParser.new do |opt| OptionParser.new do |opt|
opt.program_name = 'uplot' opt.program_name = 'YouPlot'
opt.version = Uplot::VERSION opt.version = YouPlot::VERSION
opt.summary_width = 24 opt.summary_width = 24
opt.on_tail('') # Add a blank line at the end opt.on_tail('') # Add a blank line at the end
opt.separator('') opt.separator('')
opt.on('Common options:') opt.on('Common options:')
opt.on('-O', '--pass [VAL]', 'file to output standard input data to [stdout]', opt.on('-O', '--pass [VAL]', 'file to output standard input data to [stdout]',
'for inserting uplot in the middle of Unix pipes') do |v| 'for inserting YouPlot in the middle of Unix pipes') do |v|
@pass = v || $stdout @pass = v || $stdout
end end
opt.on('-o', '--output VAL', 'file to output results to [stderr]') do |v| opt.on('-o', '--output VAL', 'file to output results to [stderr]') do |v|
@@ -102,9 +102,9 @@ module Uplot
main_parser.banner = \ main_parser.banner = \
<<~MSG <<~MSG
Program: uplot (Tools for plotting on the terminal) Program: YouPlot (Tools for plotting on the terminal)
Version: #{Uplot::VERSION} (using UnicodePlot #{UnicodePlot::VERSION}) Version: #{YouPlot::VERSION} (using UnicodePlot #{UnicodePlot::VERSION})
Source: https://github.com/kojix2/uplot Source: https://github.com/kojix2/youplot
Usage: uplot <command> [options] <in.tsv> Usage: uplot <command> [options] <in.tsv>
@@ -123,7 +123,7 @@ module Uplot
General options: General options:
--help print command specific help menu --help print command specific help menu
--version print the version of uplot --version print the version of YouPlot
MSG MSG
# Actually, main_parser can take common optional arguments. # Actually, main_parser can take common optional arguments.
@@ -141,7 +141,7 @@ module Uplot
@sub_parser ||= create_default_parser do |parser| @sub_parser ||= create_default_parser do |parser|
parser.banner = <<~MSG parser.banner = <<~MSG
Usage: uplot #{command} [options] <in.tsv> Usage: YouPlot #{command} [options] <in.tsv>
Options for #{command}: Options for #{command}:
MSG MSG

View File

@@ -2,7 +2,7 @@
require 'csv' require 'csv'
module Uplot module YouPlot
module Preprocessing module Preprocessing
module_function module_function

View File

@@ -1,5 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
module Uplot module YouPlot
VERSION = '0.2.8' VERSION = '0.3.0'
end end

1
test/fixtures/colors.txt vendored Normal file

File diff suppressed because one or more lines are too long

153
test/fixtures/iris-barplot.txt vendored Normal file
View File

@@ -0,0 +1,153 @@
IRIS-BARPLOT
┌ ┐
5.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.5
4.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
4.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
4.6 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
5.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.6
5.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.9
4.6 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
5.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
4.4 ┤■■■■■■■■■■■■■■■■■■■■■■■ 2.9
4.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
5.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.7
4.8 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
4.8 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
4.3 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
5.8 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 4.0
5.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 4.4
5.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.9
5.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.5
5.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.8
5.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.8
5.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
5.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.7
4.6 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.6
5.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.3
4.8 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
5.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
5.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
5.2 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.5
5.2 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
4.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
4.8 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
5.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
5.2 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 4.1
5.5 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 4.2
4.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
5.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
5.5 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.5
4.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
4.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
5.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
5.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.5
4.5 ┤■■■■■■■■■■■■■■■■■■ 2.3
4.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
5.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.5
5.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.8
4.8 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
5.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.8
4.6 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
5.3 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.7
5.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.3
7.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
6.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
6.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
5.5 ┤■■■■■■■■■■■■■■■■■■ 2.3
6.5 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
5.7 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
6.3 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.3
4.9 ┤■■■■■■■■■■■■■■■■■■■ 2.4
6.6 ┤■■■■■■■■■■■■■■■■■■■■■■■ 2.9
5.2 ┤■■■■■■■■■■■■■■■■■■■■■ 2.7
5.0 ┤■■■■■■■■■■■■■■■■ 2.0
5.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
6.0 ┤■■■■■■■■■■■■■■■■■■ 2.2
6.1 ┤■■■■■■■■■■■■■■■■■■■■■■■ 2.9
5.6 ┤■■■■■■■■■■■■■■■■■■■■■■■ 2.9
6.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
5.6 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
5.8 ┤■■■■■■■■■■■■■■■■■■■■■ 2.7
6.2 ┤■■■■■■■■■■■■■■■■■■ 2.2
5.6 ┤■■■■■■■■■■■■■■■■■■■■ 2.5
5.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
6.1 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
6.3 ┤■■■■■■■■■■■■■■■■■■■■ 2.5
6.1 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
6.4 ┤■■■■■■■■■■■■■■■■■■■■■■■ 2.9
6.6 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
6.8 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
6.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
6.0 ┤■■■■■■■■■■■■■■■■■■■■■■■ 2.9
5.7 ┤■■■■■■■■■■■■■■■■■■■■■ 2.6
5.5 ┤■■■■■■■■■■■■■■■■■■■ 2.4
5.5 ┤■■■■■■■■■■■■■■■■■■■ 2.4
5.8 ┤■■■■■■■■■■■■■■■■■■■■■ 2.7
6.0 ┤■■■■■■■■■■■■■■■■■■■■■ 2.7
5.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
6.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
6.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
6.3 ┤■■■■■■■■■■■■■■■■■■ 2.3
5.6 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
5.5 ┤■■■■■■■■■■■■■■■■■■■■ 2.5
5.5 ┤■■■■■■■■■■■■■■■■■■■■■ 2.6
6.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
5.8 ┤■■■■■■■■■■■■■■■■■■■■■ 2.6
5.0 ┤■■■■■■■■■■■■■■■■■■ 2.3
5.6 ┤■■■■■■■■■■■■■■■■■■■■■ 2.7
5.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
5.7 ┤■■■■■■■■■■■■■■■■■■■■■■■ 2.9
6.2 ┤■■■■■■■■■■■■■■■■■■■■■■■ 2.9
5.1 ┤■■■■■■■■■■■■■■■■■■■■ 2.5
5.7 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
6.3 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.3
5.8 ┤■■■■■■■■■■■■■■■■■■■■■ 2.7
7.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
6.3 ┤■■■■■■■■■■■■■■■■■■■■■■■ 2.9
6.5 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
7.6 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
4.9 ┤■■■■■■■■■■■■■■■■■■■■ 2.5
7.3 ┤■■■■■■■■■■■■■■■■■■■■■■■ 2.9
6.7 ┤■■■■■■■■■■■■■■■■■■■■ 2.5
7.2 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.6
6.5 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
6.4 ┤■■■■■■■■■■■■■■■■■■■■■ 2.7
6.8 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
5.7 ┤■■■■■■■■■■■■■■■■■■■■ 2.5
5.8 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
6.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
6.5 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
7.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.8
7.7 ┤■■■■■■■■■■■■■■■■■■■■■ 2.6
6.0 ┤■■■■■■■■■■■■■■■■■■ 2.2
6.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
5.6 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
7.7 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
6.3 ┤■■■■■■■■■■■■■■■■■■■■■ 2.7
6.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.3
7.2 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
6.2 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
6.1 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
6.4 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
7.2 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
7.4 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
7.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.8
6.4 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
6.3 ┤■■■■■■■■■■■■■■■■■■■■■■ 2.8
6.1 ┤■■■■■■■■■■■■■■■■■■■■■ 2.6
7.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
6.3 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
6.4 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
6.0 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
6.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
6.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
6.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.1
5.8 ┤■■■■■■■■■■■■■■■■■■■■■ 2.7
6.8 ┤■■■■■■■■■■■■■■■■■■■■■■■■■ 3.2
6.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.3
6.7 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
6.3 ┤■■■■■■■■■■■■■■■■■■■■ 2.5
6.5 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
6.2 ┤■■■■■■■■■■■■■■■■■■■■■■■■■■■ 3.4
5.9 ┤■■■■■■■■■■■■■■■■■■■■■■■■ 3.0
└ ┘

19
test/fixtures/iris-boxplot.txt vendored Normal file
View File

@@ -0,0 +1,19 @@
IRIS-BOXPLOT
┌ ┐
╷ ┌──┬──┐ ╷
sepal_length ├───┤ │ ├───────┤
╵ └──┴──┘ ╵
╷ ┌┬┐ ╷
sepal_width ├───┤│├─────┤
╵ └┴┘ ╵
╷ ┌─────────────┬───┐ ╷
petal_length ├──┤ │ ├───────┤
╵ └─────────────┴───┘ ╵
╷┌───┬──┐ ╷
petal_width ├┤ │ ├──┤
╵└───┴──┘ ╵
species ┤
└ ┘
0 4 8

20
test/fixtures/iris-density.txt vendored Normal file
View File

@@ -0,0 +1,20 @@
IRIS-DENSITY
┌────────────────────────────────────────┐
6.9 │ │ sepal_width
│ │ petal_length
│ │ petal_width
│ │ species
│ ░ │
│ │
│ ░ │
│ ░ │
│ ░ ░ ░░ ░ │
│ ░ ░ ░ │
│ │
│ ░ ░▒ ░ ░ ░ ░ │
│ ░ ░ ░ │
│ │
0 │ ░░ ▒ ░█ ░ ░▒ ░░ ░ ░░░ ░ │
└────────────────────────────────────────┘
4 8
sepal_length

12
test/fixtures/iris-histogram.txt vendored Normal file
View File

@@ -0,0 +1,12 @@
IRIS-HISTOGRAM
┌ ┐
[4.0, 4.5) ┤▇▇▇▇▇ 4
[4.5, 5.0) ┤▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 18
[5.0, 5.5) ┤▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 30
[5.5, 6.0) ┤▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 31
[6.0, 6.5) ┤▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 32
[6.5, 7.0) ┤▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 22
[7.0, 7.5) ┤▇▇▇▇▇▇▇▇ 7
[7.5, 8.0) ┤▇▇▇▇▇▇▇ 6
└ ┘
Frequency

20
test/fixtures/iris-lineplot.txt vendored Normal file
View File

@@ -0,0 +1,20 @@
IRIS-LINEPLOT
┌────────────────────────────────────────┐
5 │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠎⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡔⠒⣽⠋⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢣⣼⠇⡠⠠⠊⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⢀⣀⣀⠤⢤⣼⢿⣿⣿⠯⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠤⢊⡧⡺⠁│
sepal_width │⠀⠀⠀⠀⠀⠈⢑⠦⣺⣵⣿⣿⡝⢵⡠⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠔⣺⠥⢊⠥⠊⠁⡷⠁⠀│
│⠀⠀⠀⠀⢀⡨⡽⣿⣯⢟⣿⡯⠿⠭⠥⠤⠤⢤⠤⠮⢍⣕⣣⣏⣉⣒⣦⣶⣭⣤⣺⣥⠊⠁⠀⠀⡰⡇⠀⠀│
│⠀⠀⠀⡠⣗⣭⣞⣿⣾⣟⡇⠀⠀⠀⢀⠤⢊⣁⣰⣣⣾⣟⣥⣾⣿⣽⢿⣿⡿⡿⠛⠉⠓⠢⠤⣴⣁⡇⠀⠀│
│⠀⠀⠈⠉⡟⠋⠉⡝⠀⠉⠁⠀⠀⠀⠉⢺⣷⣷⢿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⣯⢿⡿⢟⡻⠋⠉⡇⠀⠀│
│⠀⠀⠀⠀⢱⠀⡰⠁⠀⠀⠀⢀⢖⣶⣾⣿⣿⣻⡿⣿⣿⣿⣿⢿⣿⠟⠛⢻⢛⡻⠛⠉⠉⠉⠉⠉⠉⡇⠀⠀│
│⠀⠀⠀⠀⢸⢠⠃⠀⠀⢔⣶⡾⡿⣟⡿⢿⠷⣟⡿⢿⡟⢅⡱⢏⠎⠀⠀⠗⢁⣀⣀⠤⠤⠒⠒⠉⠉⠁⠀⠀│
│⠀⠀⠀⠀⠸⠇⠀⠀⠀⠁⢴⠋⡩⠊⠀⠗⠋⠁⠉⢺⣷⣎⡱⠮⠔⠒⠊⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
2 │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡮⠊⠀⠀⠀⠀⠀⠀⠀⠀⠁⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
└────────────────────────────────────────┘
4 8
sepal_length

20
test/fixtures/iris-lineplots.txt vendored Normal file
View File

@@ -0,0 +1,20 @@
IRIS-LINEPLOTS
┌────────────────────────────────────────┐
6.9 │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣲⠭⠃⠀⠀│ sepal_width
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⢀⣀⣠⣤⣶⣿⣿⣯⣴⣒⠖⠉⠁│ petal_length
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⢮⣤⣤⣶⣿⣿⣿⠿⠛⠛⠋⠉⠀⠀⠀⠀⠀⠀│ petal_width
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣴⣷⣿⣿⣿⣿⣿⣿⣟⣟⡂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│ species
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠤⠔⠒⢙⡻⠝⢋⡽⢝⣳⣾⣫⣥⣒⣪⣵⣖⣂⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠁⠀⠀⢀⣉⣟⣻⣿⣻⣿⣿⣿⠿⣿⣿⠿⠟⡢⠒⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣤⣿⣷⣾⣿⡿⣿⡯⠿⠛⠋⠉⠀⣀⠔⠉⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣄⣀⠄│
│⠀⠀⠀⠀⢀⣨⣽⣿⣿⣿⣿⣿⣿⣿⣵⣚⣉⣃⣀⣠⣤⣤⣔⣮⣤⣄⣀⣠⣤⣔⣲⣾⡳⠮⠛⠋⢉⡗⠁⠀│
│⠀⠀⠐⠒⡿⠿⠟⡻⠛⠛⠛⠚⠉⠀⠲⣶⣿⣷⣾⣷⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣶⣷⡇⠀⠀│
│⠀⠀⠀⠀⢱⡠⠊⠀⠀⣤⣤⣶⣿⣿⠿⣿⣿⣿⣿⣿⣟⣿⣿⣟⣟⣉⣉⣝⣛⣫⣭⣥⣤⣤⣔⣒⣒⡃⠀⠀│
│⠀⠀⠀⠀⠀⠁⠀⢀⡀⠀⢯⠒⠉⡠⠔⠡⠤⠮⣤⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣶⣶⣶⣶⣿⣿⠥⠤⠄│
│⠀⠀⠀⠀⣀⣠⣄⣤⣭⣿⣿⣿⣿⣿⣿⣿⣿⣯⣯⣯⣭⣽⣿⣿⣿⣿⣿⣯⣭⣍⡙⠛⠝⠉⠀⠀⠀⠀⠀⠀│
│⠀⠀⠠⠴⠿⢯⠭⠿⠯⣭⣷⡾⠿⠿⠿⣿⢿⡿⡻⠿⡟⠛⢛⣛⠯⠭⠒⠒⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣄⠀⠀⠀⢀⣀⡠⠤⠔⠒⠊⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
0 │⠀⠀⢀⣀⣴⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣷⣄⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⡀│
└────────────────────────────────────────┘
4 8
sepal_length

20
test/fixtures/iris-scatter.txt vendored Normal file
View File

@@ -0,0 +1,20 @@
IRIS-SCATTER
┌────────────────────────────────────────┐
6.9 │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠄⠃⠀⠀│ sepal_width
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⡄⠂⠄⠀⠀⠄⠀⠁│ petal_length
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⡀⡀⠂⠀⡆⠁⠄⠈⠀⠂⠀⠀⠀⠀⠀⠀⠀│ petal_width
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⡀⡀⠀⠂⡀⠃⡅⠀⠄⠁⡂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│ species
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⠁⠀⠄⢕⠀⠄⡃⠀⠀⠀⡁⠄⠂⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠁⣊⠀⡃⠀⡀⠉⠀⠅⠂⠅⠙⠀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠀⢅⠀⡄⡮⠀⠅⠇⠀⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠄⠀⠄│
│⠀⠀⠀⠀⠀⠨⠀⠠⠀⡀⣷⠀⠆⠀⠄⠊⠀⠂⠀⠀⠄⠀⠄⡄⠀⠀⠀⡀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠐⠀⠇⠘⠀⠑⠀⠂⠓⠀⠀⠀⠂⢰⠀⡆⡀⠃⢶⠀⡄⡄⡇⡳⠀⠂⡃⠃⠑⠀⠃⠄⡀⠀⠂⡂⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⠠⠀⠁⠀⠀⡮⠀⠆⡃⠀⠑⠀⠀⡅⠁⠀⠀⡄⠀⠀⠀⠀⠄⠀⠀⠀⠀⠂⠀⠀│
│⠀⠀⠀⠀⠀⠁⠀⢀⠀⠀⢅⠀⠀⠀⠀⠡⠀⠄⡀⠀⠁⠀⠁⡁⡃⠅⠀⠃⠃⠃⠐⠀⠀⠀⡀⠀⠂⠅⠀⠄│
│⠀⠀⠀⠀⡀⢠⠀⢤⠀⡆⣴⠀⡤⠀⠆⡠⠀⠆⠀⠅⢍⠀⠅⠅⠅⢅⠀⡇⡀⠄⡀⠀⠅⠁⠀⠀⠀⠀⠀⠀│
│⠀⠀⠠⠀⠁⢁⠀⠁⠀⡀⡣⠀⠀⠀⠁⡯⠀⡃⡂⠀⡘⠀⠁⠁⠁⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
│⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
0 │⠀⠀⢀⠀⡄⣲⠀⣴⠀⡄⣿⠀⣤⠀⡅⣄⠀⡃⡄⡀⣀⠀⡀⡀⡀⣀⠀⡀⡀⡀⣀⠀⡀⡀⡀⠀⡀⡀⠀⡀│
└────────────────────────────────────────┘
4 8
sepal_length

View File

@@ -3,6 +3,6 @@
require 'simplecov' require 'simplecov'
SimpleCov.start SimpleCov.start
require 'uplot' require 'youplot'
require 'test/unit' require 'test/unit'

View File

@@ -1,6 +1,102 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'tempfile'
require_relative '../test_helper' require_relative '../test_helper'
class UplotCommandTest < Test::Unit::TestCase class YouPlotCommandTest < Test::Unit::TestCase
class << self
def startup
@stdin = $stdin.dup
@stderr = $stderr.dup
end
def shutdown
$stdin = @stdin
$stderr = @stderr
end
end
def setup
$stdin = File.open(File.expand_path('../fixtures/iris.csv', __dir__), 'r')
@tmp_file = Tempfile.new
$stderr = @tmp_file
end
def teardown
@tmp_file.close
end
def fixture(fname)
File.read(File.expand_path("../fixtures/#{fname}", __dir__))
end
test :bar do
YouPlot::Command.new(['bar', '-H', '-d,', '-t', 'IRIS-BARPLOT']).run
assert_equal fixture('iris-barplot.txt'), @tmp_file.read
end
test :barplot do
YouPlot::Command.new(['barplot', '-H', '-d,', '-t', 'IRIS-BARPLOT']).run
assert_equal fixture('iris-barplot.txt'), @tmp_file.read
end
test :hist do
YouPlot::Command.new(['hist', '-H', '-d,', '-t', 'IRIS-HISTOGRAM']).run
assert_equal fixture('iris-histogram.txt'), @tmp_file.read
end
test :histogram do
YouPlot::Command.new(['histogram', '-H', '-d,', '-t', 'IRIS-HISTOGRAM']).run
assert_equal fixture('iris-histogram.txt'), @tmp_file.read
end
test :line do
YouPlot::Command.new(['line', '-H', '-d,', '-t', 'IRIS-LINEPLOT']).run
assert_equal fixture('iris-lineplot.txt'), @tmp_file.read
end
test :lineplot do
YouPlot::Command.new(['lineplot', '-H', '-d,', '-t', 'IRIS-LINEPLOT']).run
assert_equal fixture('iris-lineplot.txt'), @tmp_file.read
end
test :lines do
YouPlot::Command.new(['lines', '-H', '-d,', '-t', 'IRIS-LINEPLOTS']).run
assert_equal fixture('iris-lineplots.txt'), @tmp_file.read
end
test :lineplots do
YouPlot::Command.new(['lineplots', '-H', '-d,', '-t', 'IRIS-LINEPLOTS']).run
assert_equal fixture('iris-lineplots.txt'), @tmp_file.read
end
test :s do
YouPlot::Command.new(['s', '-H', '-d,', '-t', 'IRIS-SCATTER']).run
assert_equal fixture('iris-scatter.txt'), @tmp_file.read
end
test :scatter do
YouPlot::Command.new(['scatter', '-H', '-d,', '-t', 'IRIS-SCATTER']).run
assert_equal fixture('iris-scatter.txt'), @tmp_file.read
end
test :d do
YouPlot::Command.new(['d', '-H', '-d,', '-t', 'IRIS-DENSITY']).run
assert_equal fixture('iris-density.txt'), @tmp_file.read
end
test :density do
YouPlot::Command.new(['density', '-H', '-d,', '-t', 'IRIS-DENSITY']).run
assert_equal fixture('iris-density.txt'), @tmp_file.read
end
test :box do
YouPlot::Command.new(['box', '-H', '-d,', '-t', 'IRIS-BOXPLOT']).run
assert_equal fixture('iris-boxplot.txt'), @tmp_file.read
end
test :boxplot do
YouPlot::Command.new(['boxplot', '-H', '-d,', '-t', 'IRIS-BOXPLOT']).run
assert_equal fixture('iris-boxplot.txt'), @tmp_file.read
end
end end

View File

@@ -2,5 +2,5 @@
require_relative '../test_helper' require_relative '../test_helper'
class UplotPlotTest < Test::Unit::TestCase class YouPlotPlotTest < Test::Unit::TestCase
end end

View File

@@ -2,9 +2,9 @@
require_relative '../test_helper' require_relative '../test_helper'
class UplotPreprocessingTest < Test::Unit::TestCase class YouPlotPreprocessingTest < Test::Unit::TestCase
def setup def setup
@m = Uplot::Preprocessing @m = YouPlot::Preprocessing
end end
test :transpose2 do test :transpose2 do

View File

@@ -2,8 +2,8 @@
require 'test_helper' require 'test_helper'
class UplotTest < Test::Unit::TestCase class YouPlotTest < Test::Unit::TestCase
def test_that_it_has_a_version_number def test_that_it_has_a_version_number
assert_kind_of String, ::Uplot::VERSION assert_kind_of String, ::YouPlot::VERSION
end end
end end

View File

@@ -1,10 +1,10 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative 'lib/uplot/version' require_relative 'lib/youplot/version'
Gem::Specification.new do |spec| Gem::Specification.new do |spec|
spec.name = 'u-plot' spec.name = 'youplot'
spec.version = Uplot::VERSION spec.version = YouPlot::VERSION
spec.authors = ['kojix2'] spec.authors = ['kojix2']
spec.email = ['2xijok@gmail.com'] spec.email = ['2xijok@gmail.com']
@@ -13,13 +13,13 @@ Gem::Specification.new do |spec|
Create ASCII charts on the terminal with data from standard streams in the Create ASCII charts on the terminal with data from standard streams in the
pipeline. pipeline.
MSG MSG
spec.homepage = 'https://github.com/kojix2/uplot' spec.homepage = 'https://github.com/kojix2/youplot'
spec.license = 'MIT' spec.license = 'MIT'
spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0') spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
spec.files = Dir['*.{md,txt}', '{lib,exe}/**/*'] spec.files = Dir['*.{md,txt}', '{lib,exe}/**/*']
spec.bindir = 'exe' spec.bindir = 'exe'
spec.executables = ['uplot'] spec.executables = ['uplot', 'youplot']
spec.require_paths = ['lib'] spec.require_paths = ['lib']
spec.add_runtime_dependency 'unicode_plot' spec.add_runtime_dependency 'unicode_plot'