youplot 0.3.3 → 0.3.4

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
  SHA256:
3
- metadata.gz: 7f74b6c3834757ab941924f8455f0b933af654796740e80b85da400e764e14ae
4
- data.tar.gz: 6c77e305eb5e7361be28beca3cce569458832099f47a38efa61dbfd143e6a04b
3
+ metadata.gz: 39029ea73cd1233a1ad890343381986b5fcf46e1e7619708cd0329269d07135c
4
+ data.tar.gz: '08662eaab8c28351e57727c69f2f5479e1950d3cbbad7d65ab61ec8994830fec'
5
5
  SHA512:
6
- metadata.gz: 31f0a7ef9942ab7d6017ce60669ff1ca3f4ddc5b9a61ca0dd83e5c35093d8aaed725ef945bea0c9f2390fe97b2519319fc32894247d6caa136734b192e6a2287
7
- data.tar.gz: 854f725384dfb6eb27c86ced3bb53321a850a015c343fdaf7e1639de96b01e8199557fd7beedf765126f74475c2506c938d2f26aa753c1f3abd5aca148dc48c7
6
+ metadata.gz: 7f24fc609bf6501d9b9f6a6452db84d015cfbea7fe6c3a86f4d69ab31043c5a99d9907fe8dbf34f2672589fbfa99e51cde6cfab578c1ef570552e649a7ebfb10
7
+ data.tar.gz: 6fb46f5492480a385dec175d022e693442c43cdead3b5bd948dfdc0030a81d661ea5363cb386c9c9f7da5e25329cdc11c286d78985cc9383f7032a3a56a8435a
data/README.md CHANGED
@@ -201,7 +201,7 @@ Usage: uplot histogram [options] <in.tsv>
201
201
 
202
202
  Options for histogram:
203
203
  --symbol VAL character to be used to plot the bars
204
- --closed VAL
204
+ --closed VAL side of the intervals to be closed [left]
205
205
  -n, --nbins VAL approximate number of bins
206
206
 
207
207
  Options:
@@ -233,6 +233,12 @@ bundle exec rake test # Run the test
233
233
  bundle exec rake install # Installation from source code
234
234
  ```
235
235
 
236
+ ### Acknowledgements
237
+
238
+ * [Red Data Tools](https://github.com/red-data-tools) - Technical support
239
+ * [sampo grafiikka](https://jypg.net/sampo_grafiikka) - Project logo creation
240
+ * [yutaas](https://github.com/yutaas) - English proofreading
241
+
236
242
  ## License
237
243
 
238
244
  [MIT License](https://opensource.org/licenses/MIT).
data/exe/uplot CHANGED
@@ -3,4 +3,4 @@
3
3
 
4
4
  require 'youplot'
5
5
 
6
- YouPlot::Command.new.run
6
+ YouPlot::Command.new.run_as_executable
@@ -3,4 +3,4 @@
3
3
 
4
4
  require 'youplot'
5
5
 
6
- YouPlot::Command.new.run
6
+ YouPlot::Command.new.run_as_executable
@@ -6,4 +6,12 @@ require 'youplot/dsv'
6
6
  require 'youplot/command'
7
7
 
8
8
  module YouPlot
9
+ class << self
10
+ attr_accessor :run_as_executable
11
+
12
+ def run_as_executable?
13
+ @run_as_executable
14
+ end
15
+ end
16
+ @run_as_executable = false
9
17
  end
@@ -6,9 +6,9 @@ module YouPlot
6
6
  module Processing
7
7
  module_function
8
8
 
9
- def count_values(arr)
9
+ def count_values(arr, tally: true)
10
10
  # tally was added in Ruby 2.7
11
- if Enumerable.method_defined? :tally
11
+ if tally && Enumerable.method_defined?(:tally)
12
12
  arr.tally
13
13
  else
14
14
  # https://github.com/marcandre/backports
@@ -7,6 +7,8 @@ module YouPlot
7
7
  # plotting functions.
8
8
  module Backends
9
9
  module UnicodePlotBackend
10
+ class Error < StandardError; end
11
+
10
12
  module_function
11
13
 
12
14
  def barplot(data, params, fmt = nil, count: false)
@@ -37,7 +39,19 @@ module YouPlot
37
39
  labels = series[x_col]
38
40
  values = series[y_col].map(&:to_f)
39
41
  end
40
- UnicodePlot.barplot(labels, values, **params.to_hc)
42
+ begin
43
+ UnicodePlot.barplot(labels, values, **params.to_hc)
44
+ # UnicodePlot error:
45
+ # All values have to be positive. Negative bars are not supported.
46
+ rescue ArgumentError => e
47
+ if YouPlot.run_as_executable?
48
+ warn e.backtrace[0]
49
+ warn "\e[35m#{e}\e[0m"
50
+ exit 1
51
+ else
52
+ raise e
53
+ end
54
+ end
41
55
  end
42
56
 
43
57
  def histogram(data, params)
@@ -90,6 +104,7 @@ module YouPlot
90
104
  params.name ||= headers[1]
91
105
  params.xlabel ||= headers[0]
92
106
  end
107
+ params.xlim ||= series[0].flatten.minmax # why need?
93
108
  params.ylim ||= series[1..-1].flatten.minmax # why need?
94
109
  plot = UnicodePlot.public_send(method1, series[0], series[1], **params.to_hc)
95
110
  2.upto(series.size - 1) do |i|
@@ -103,13 +118,14 @@ module YouPlot
103
118
  series = data.series
104
119
  method2 = get_method2(method1)
105
120
  series.map! { |s| s.map(&:to_f) }
106
- series = series.each_slice(2).to_a
121
+ series2 = series.each_slice(2).to_a
122
+ series = nil
107
123
  params.name ||= headers[0] if headers
108
- params.xlim = series.map(&:first).flatten.minmax # why need?
109
- params.ylim = series.map(&:last).flatten.minmax # why need?
110
- x1, y1 = series.shift
124
+ params.xlim ||= series2.map(&:first).flatten.minmax # why need?
125
+ params.ylim ||= series2.map(&:last).flatten.minmax # why need?
126
+ x1, y1 = series2.shift
111
127
  plot = UnicodePlot.public_send(method1, x1, y1, **params.to_hc)
112
- series.each_with_index do |(xi, yi), i|
128
+ series2.each_with_index do |(xi, yi), i|
113
129
  UnicodePlot.public_send(method2, plot, xi, yi, name: headers&.[]((i + 1) * 2))
114
130
  end
115
131
  plot
@@ -179,14 +195,14 @@ module YouPlot
179
195
  warn " Headers: \e[35m#{data.headers.inspect}\e[0m"
180
196
  warn " The first item is: \e[35m\"#{series[0][0]}\"\e[0m"
181
197
  warn " The last item is : \e[35m\"#{series[0][-1]}\"\e[0m"
182
- exit 1
198
+ YouPlot.run_as_executable ? exit(1) : raise(Error)
183
199
  end
184
200
  if fmt == 'xyxy' && series.size.odd?
185
201
  warn 'YouPlot: In the xyxy format, the number of series must be even.'
186
202
  warn ''
187
203
  warn " Number of series: \e[35m#{series.size}\e[0m"
188
204
  warn " Headers: \e[35m#{data.headers.inspect}\e[0m"
189
- exit 1
205
+ YouPlot.run_as_executable ? exit(1) : raise(Error)
190
206
  end
191
207
  end
192
208
  end
@@ -22,6 +22,11 @@ module YouPlot
22
22
  @backend = YouPlot::Backends::UnicodePlotBackend
23
23
  end
24
24
 
25
+ def run_as_executable
26
+ YouPlot.run_as_executable = true
27
+ run
28
+ end
29
+
25
30
  def run
26
31
  parser.parse_options(@argv)
27
32
  @command ||= parser.command
@@ -34,11 +39,15 @@ module YouPlot
34
39
  elsif options[:progressive]
35
40
  stop = false
36
41
  Signal.trap(:INT) { stop = true }
42
+ options[:output].print "\e[?25l" # make cursor invisible
37
43
  while (input = Kernel.gets)
38
- main_progressive(input)
44
+ n = main_progressive(input)
39
45
  break if stop
46
+
47
+ options[:output].print "\e[#{n}F"
40
48
  end
41
49
  options[:output].print "\e[0J"
50
+ options[:output].print "\e[?25h" # make cursor visible
42
51
  else
43
52
  # Sometimes the input file does not end with a newline code.
44
53
  while (input = Kernel.gets(nil))
@@ -154,8 +163,7 @@ module YouPlot
154
163
  end
155
164
  options[:output].print "\e[0J"
156
165
  options[:output].flush
157
- n = out.string.lines.size
158
- options[:output].print "\e[#{n}F"
166
+ out.string.lines.size
159
167
  else
160
168
  raise 'In progressive mode, output to a file is not possible.'
161
169
  end
@@ -7,7 +7,10 @@ require_relative 'plot_params'
7
7
  module YouPlot
8
8
  class Command
9
9
  class Parser
10
- attr_reader :command, :options, :params
10
+ class Error < StandardError; end
11
+
12
+ attr_reader :command, :options, :params,
13
+ :main_parser, :sub_parser
11
14
 
12
15
  def initialize
13
16
  @command = nil
@@ -28,257 +31,265 @@ module YouPlot
28
31
  end
29
32
 
30
33
  def create_default_parser
31
- OptionParser.new do |opt|
32
- opt.program_name = 'YouPlot'
33
- opt.version = YouPlot::VERSION
34
- opt.summary_width = 24
35
- opt.on_tail('') # Add a blank line at the end
36
- opt.separator('')
37
- opt.on('Common options:')
38
- opt.on('-O', '--pass [FILE]', 'file to output input data to [stdout]',
39
- 'for inserting YouPlot in the middle of Unix pipes') do |v|
40
- @options[:pass] = v || $stdout
34
+ OptionParser.new do |parser|
35
+ parser.program_name = 'YouPlot'
36
+ parser.version = YouPlot::VERSION
37
+ parser.summary_width = 24
38
+ parser.on_tail('') # Add a blank line at the end
39
+ parser.separator('')
40
+ parser.on('Common options:')
41
+ parser.on('-O', '--pass [FILE]', 'file to output input data to [stdout]',
42
+ 'for inserting YouPlot in the middle of Unix pipes') do |v|
43
+ options[:pass] = v || $stdout
41
44
  end
42
- opt.on('-o', '--output [FILE]', 'file to output plots to [stdout]',
43
- 'If no option is specified, plot will print to stderr') do |v|
44
- @options[:output] = v || $stdout
45
+ parser.on('-o', '--output [FILE]', 'file to output plots to [stdout]',
46
+ 'If no option is specified, plot will print to stderr') do |v|
47
+ options[:output] = v || $stdout
45
48
  end
46
- opt.on('-d', '--delimiter VAL', String, 'use DELIM instead of TAB for field delimiter') do |v|
47
- @options[:delimiter] = v
49
+ parser.on('-d', '--delimiter DELIM', String, 'use DELIM instead of [TAB] for field delimiter') do |v|
50
+ options[:delimiter] = v
48
51
  end
49
- opt.on('-H', '--headers', TrueClass, 'specify that the input has header row') do |v|
50
- @options[:headers] = v
52
+ parser.on('-H', '--headers', TrueClass, 'specify that the input has header row') do |v|
53
+ options[:headers] = v
51
54
  end
52
- opt.on('-T', '--transpose', TrueClass, 'transpose the axes of the input data') do |v|
53
- @options[:transpose] = v
55
+ parser.on('-T', '--transpose', TrueClass, 'transpose the axes of the input data') do |v|
56
+ options[:transpose] = v
54
57
  end
55
- opt.on('-t', '--title VAL', String, 'print string on the top of plot') do |v|
58
+ parser.on('-t', '--title STR', String, 'print string on the top of plot') do |v|
56
59
  params.title = v
57
60
  end
58
- opt.on('-x', '--xlabel VAL', String, 'print string on the bottom of the plot') do |v|
61
+ parser.on('-x', '--xlabel STR', String, 'print string on the bottom of the plot') do |v|
59
62
  params.xlabel = v
60
63
  end
61
- opt.on('-y', '--ylabel VAL', String, 'print string on the far left of the plot') do |v|
64
+ parser.on('-y', '--ylabel STR', String, 'print string on the far left of the plot') do |v|
62
65
  params.ylabel = v
63
66
  end
64
- opt.on('-w', '--width VAL', Integer, 'number of characters per row') do |v|
67
+ parser.on('-w', '--width INT', Integer, 'number of characters per row') do |v|
65
68
  params.width = v
66
69
  end
67
- opt.on('-h', '--height VAL', Numeric, 'number of rows') do |v|
70
+ parser.on('-h', '--height INT', Numeric, 'number of rows') do |v|
68
71
  params.height = v
69
72
  end
70
- opt.on('-b', '--border VAL', String, 'specify the style of the bounding box') do |v|
73
+ parser.on('-b', '--border STR', String, 'specify the style of the bounding box') do |v|
71
74
  params.border = v.to_sym
72
75
  end
73
- opt.on('-m', '--margin VAL', Numeric, 'number of spaces to the left of the plot') do |v|
76
+ parser.on('-m', '--margin INT', Numeric, 'number of spaces to the left of the plot') do |v|
74
77
  params.margin = v
75
78
  end
76
- opt.on('-p', '--padding VAL', Numeric, 'space of the left and right of the plot') do |v|
79
+ parser.on('--padding INT', Numeric, 'space of the left and right of the plot') do |v|
77
80
  params.padding = v
78
81
  end
79
- opt.on('-c', '--color VAL', String, 'color of the drawing') do |v|
82
+ parser.on('-c', '--color VAL', String, 'color of the drawing') do |v|
80
83
  params.color = v =~ /\A[0-9]+\z/ ? v.to_i : v.to_sym
81
84
  end
82
- opt.on('--[no-]labels', TrueClass, 'hide the labels') do |v|
85
+ parser.on('--[no-]labels', TrueClass, 'hide the labels') do |v|
83
86
  params.labels = v
84
87
  end
85
- opt.on('--progress', TrueClass, 'progressive mode [experimental]') do |v|
86
- @options[:progressive] = v
88
+ parser.on('-p', '--progress', TrueClass, 'progressive mode [experimental]') do |v|
89
+ options[:progressive] = v
87
90
  end
88
- opt.on('--encoding VAL', String, 'Specify the input encoding') do |v|
89
- @options[:encoding] = v
91
+ parser.on('--encoding STR', String, 'Specify the input encoding') do |v|
92
+ options[:encoding] = v
90
93
  end
91
94
  # Optparse adds the help option, but it doesn't show up in usage.
92
95
  # This is why you need the code below.
93
- opt.on('--help', 'print sub-command help menu') do
94
- puts opt.help
95
- exit
96
+ parser.on('--help', 'print sub-command help menu') do
97
+ puts parser.help
98
+ exit if YouPlot.run_as_executable?
96
99
  end
97
- opt.on('--debug', TrueClass, 'print preprocessed data') do |v|
98
- @options[:debug] = v
100
+ parser.on('--debug', TrueClass, 'print preprocessed data') do |v|
101
+ options[:debug] = v
99
102
  end
100
- yield opt if block_given?
103
+ # yield opt if block_given?
101
104
  end
102
105
  end
103
106
 
104
- def main_parser
105
- @main_parser ||= create_default_parser do |main_parser|
106
- # Here, help message is stored in the banner.
107
- # Because help of main_parser may be referred by `sub_parser`.
108
-
109
- main_parser.banner = \
110
- <<~MSG
111
-
112
- Program: YouPlot (Tools for plotting on the terminal)
113
- Version: #{YouPlot::VERSION} (using UnicodePlot #{UnicodePlot::VERSION})
114
- Source: https://github.com/kojix2/youplot
115
-
116
- Usage: uplot <command> [options] <in.tsv>
117
-
118
- Commands:
119
- barplot bar draw a horizontal barplot
120
- histogram hist draw a horizontal histogram
121
- lineplot line draw a line chart
122
- lineplots lines draw a line chart with multiple series
123
- scatter s draw a scatter plot
124
- density d draw a density plot
125
- boxplot box draw a horizontal boxplot
126
- colors color show the list of available colors
127
-
128
- count c draw a baplot based on the number of
129
- occurrences (slow)
130
-
131
- General options:
132
- --help print command specific help menu
133
- --version print the version of YouPlot
134
- MSG
135
-
136
- # Actually, main_parser can take common optional arguments.
137
- # However, these options dose not be shown in the help menu.
138
- # I think the main help should be simple.
139
- main_parser.on('--help', 'print sub-command help menu') do
140
- puts main_parser.banner
141
- puts
142
- exit
143
- end
107
+ def create_main_parser
108
+ @main_parser = create_default_parser
109
+ main_parser.banner = \
110
+ <<~MSG
111
+
112
+ Program: YouPlot (Tools for plotting on the terminal)
113
+ Version: #{YouPlot::VERSION} (using UnicodePlot #{UnicodePlot::VERSION})
114
+ Source: https://github.com/kojix2/youplot
115
+
116
+ Usage: uplot <command> [options] <in.tsv>
117
+
118
+ Commands:
119
+ barplot bar draw a horizontal barplot
120
+ histogram hist draw a horizontal histogram
121
+ lineplot line draw a line chart
122
+ lineplots lines draw a line chart with multiple series
123
+ scatter s draw a scatter plot
124
+ density d draw a density plot
125
+ boxplot box draw a horizontal boxplot
126
+ colors color show the list of available colors
127
+
128
+ count c draw a baplot based on the number of
129
+ occurrences (slow)
130
+
131
+ General options:
132
+ --help print command specific help menu
133
+ --version print the version of YouPlot
134
+ MSG
135
+
136
+ # Help for the main parser is simple.
137
+ # Simply show the banner above.
138
+ main_parser.on('--help', 'print sub-command help menu') do
139
+ puts main_parser.banner
140
+ puts
141
+ exit if YouPlot.run_as_executable?
142
+ end
143
+ end
144
+
145
+ def sub_parser_add_symbol
146
+ sub_parser.on_head('--symbol STR', String, 'character to be used to plot the bars') do |v|
147
+ params.symbol = v
148
+ end
149
+ end
150
+
151
+ def sub_parser_add_xscale
152
+ xscale_options = UnicodePlot::ValueTransformer::PREDEFINED_TRANSFORM_FUNCTIONS.keys.join(', ')
153
+ sub_parser.on_head('--xscale STR', String, "axis scaling (#{xscale_options})") do |v|
154
+ params.xscale = v
155
+ end
156
+ end
157
+
158
+ def sub_parser_add_canvas
159
+ sub_parser.on_head('--canvas STR', String, 'type of canvas') do |v|
160
+ params.canvas = v.to_sym
161
+ end
162
+ end
163
+
164
+ def sub_parser_add_xlim
165
+ sub_parser.on_head('--xlim FLOAT,FLOAT', Array, 'plotting range for the x coordinate') do |v|
166
+ params.xlim = v.take(2)
167
+ end
168
+ end
169
+
170
+ def sub_parser_add_ylim
171
+ sub_parser.on_head('--ylim FLOAT,FLOAT', Array, 'plotting range for the y coordinate') do |v|
172
+ params.ylim = v.take(2)
173
+ end
174
+ end
175
+
176
+ def sub_parser_add_grid
177
+ sub_parser.on_head('--[no-]grid', TrueClass, 'draws grid-lines at the origin') do |v|
178
+ params.grid = v
144
179
  end
145
180
  end
146
181
 
147
- def sub_parser
148
- @sub_parser ||= create_default_parser do |parser|
149
- parser.banner = <<~MSG
182
+ def create_sub_parser
183
+ @sub_parser = create_default_parser
184
+ sub_parser.banner = \
185
+ <<~MSG
150
186
 
151
187
  Usage: YouPlot #{command} [options] <in.tsv>
152
188
 
153
189
  Options for #{command}:
154
190
  MSG
155
191
 
156
- case command
192
+ case command
157
193
 
158
- # If you type only `uplot` in the terminal.
159
- when nil
160
- warn main_parser.banner
161
- warn "\n"
162
- exit 1
194
+ # If you type only `uplot` in the terminal.
195
+ when nil
196
+ warn main_parser.banner
197
+ warn "\n"
198
+ exit 1 if YouPlot.run_as_executable?
199
+
200
+ when :barplot, :bar
201
+ sub_parser_add_symbol
202
+ sub_parser.on_head('--fmt STR', String, 'xy : header is like x, y...', 'yx : header is like y, x...') do |v|
203
+ options[:fmt] = v
204
+ end
205
+ sub_parser_add_xscale
163
206
 
164
- when :barplot, :bar
165
- parser.on_head('--symbol VAL', String, 'character to be used to plot the bars') do |v|
166
- params.symbol = v
167
- end
168
- parser.on_head('--xscale VAL', String, 'axis scaling') do |v|
169
- params.xscale = v
170
- end
171
- parser.on_head('--fmt VAL', String, 'xy : header is like x, y...', 'yx : header is like y, x...') do |v|
172
- @options[:fmt] = v
173
- end
174
-
175
- when :count, :c
176
- parser.on_head('--symbol VAL', String, 'character to be used to plot the bars') do |v|
177
- params.symbol = v
178
- end
179
-
180
- when :histogram, :hist
181
- parser.on_head('-n', '--nbins VAL', Numeric, 'approximate number of bins') do |v|
182
- params.nbins = v
183
- end
184
- parser.on_head('--closed VAL', String) do |v|
185
- params.closed = v
186
- end
187
- parser.on_head('--symbol VAL', String, 'character to be used to plot the bars') do |v|
188
- params.symbol = v
189
- end
190
-
191
- when :lineplot, :line
192
- parser.on_head('--canvas VAL', String, 'type of canvas') do |v|
193
- params.canvas = v
194
- end
195
- parser.on_head('--xlim VAL', Array, 'plotting range for the x coordinate') do |v|
196
- params.xlim = v.take(2)
197
- end
198
- parser.on_head('--ylim VAL', Array, 'plotting range for the y coordinate') do |v|
199
- params.ylim = v.take(2)
200
- end
201
- parser.on_head('--fmt VAL', String, 'xy : header is like x, y...', 'yx : header is like y, x...') do |v|
202
- @options[:fmt] = v
203
- end
204
-
205
- when :lineplots, :lines
206
- parser.on_head('--canvas VAL', String) do |v|
207
- params.canvas = v
208
- end
209
- parser.on_head('--xlim VAL', Array, 'plotting range for the x coordinate') do |v|
210
- params.xlim = v.take(2)
211
- end
212
- parser.on_head('--ylim VAL', Array, 'plotting range for the y coordinate') do |v|
213
- params.ylim = v.take(2)
214
- end
215
- parser.on_head('--fmt VAL', String, 'xyxy : header is like x1, y1, x2, y2, x3, y3...',
216
- 'xyy : header is like x, y1, y2, y2, y3...') do |v|
217
- @options[:fmt] = v
218
- end
219
-
220
- when :scatter, :s
221
- parser.on_head('--canvas VAL', String) do |v|
222
- params.canvas = v
223
- end
224
- parser.on_head('--xlim VAL', Array, 'plotting range for the x coordinate') do |v|
225
- params.xlim = v.take(2)
226
- end
227
- parser.on_head('--ylim VAL', Array, 'plotting range for the y coordinate') do |v|
228
- params.ylim = v.take(2)
229
- end
230
- parser.on_head('--fmt VAL', String, 'xyxy : header is like x1, y1, x2, y2, x3, y3...',
231
- 'xyy : header is like x, y1, y2, y2, y3...') do |v|
232
- @options[:fmt] = v
233
- end
234
-
235
- when :density, :d
236
- parser.on_head('--grid', TrueClass) do |v|
237
- params.grid = v
238
- end
239
- parser.on_head('--xlim VAL', Array, 'plotting range for the x coordinate') do |v|
240
- params.xlim = v.take(2)
241
- end
242
- parser.on_head('--ylim VAL', Array, 'plotting range for the y coordinate') do |v|
243
- params.ylim = v.take(2)
244
- end
245
- parser.on('--fmt VAL', String, 'xyxy : header is like x1, y1, x2, y2, x3, y3...',
246
- 'xyy : header is like x, y1, y2, y2, y3...') do |v|
247
- @options[:fmt] = v
248
- end
249
-
250
- when :boxplot, :box
251
- parser.on_head('--xlim VAL', Array, 'plotting range for the x coordinate') do |v|
252
- params.xlim = v.take(2)
253
- end
254
-
255
- when :colors, :color, :colours, :colour
256
- parser.on_head('-n', '--names', 'show color names only', TrueClass) do |v|
257
- @options[:color_names] = v
258
- end
207
+ when :count, :c
208
+ sub_parser_add_symbol
209
+ sub_parser_add_xscale
259
210
 
260
- else
261
- warn "uplot: unrecognized command '#{command}'"
211
+ when :histogram, :hist
212
+ sub_parser_add_symbol
213
+ sub_parser.on_head('--closed STR', String, 'side of the intervals to be closed [left]') do |v|
214
+ params.closed = v
215
+ end
216
+ sub_parser.on_head('-n', '--nbins INT', Numeric, 'approximate number of bins') do |v|
217
+ params.nbins = v
218
+ end
219
+
220
+ when :lineplot, :line
221
+ sub_parser_add_canvas
222
+ sub_parser_add_grid
223
+ sub_parser.on_head('--fmt STR', String, 'xy : header is like x, y...', 'yx : header is like y, x...') do |v|
224
+ options[:fmt] = v
225
+ end
226
+ sub_parser_add_ylim
227
+ sub_parser_add_xlim
228
+
229
+ when :lineplots, :lines
230
+ sub_parser_add_canvas
231
+ sub_parser_add_grid
232
+ sub_parser.on_head('--fmt STR', String, 'xyxy : header is like x1, y1, x2, y2, x3, y3...',
233
+ 'xyy : header is like x, y1, y2, y2, y3...') do |v|
234
+ options[:fmt] = v
235
+ end
236
+ sub_parser_add_ylim
237
+ sub_parser_add_xlim
238
+
239
+ when :scatter, :s
240
+ sub_parser_add_canvas
241
+ sub_parser_add_grid
242
+ sub_parser.on_head('--fmt STR', String, 'xyxy : header is like x1, y1, x2, y2, x3, y3...',
243
+ 'xyy : header is like x, y1, y2, y2, y3...') do |v|
244
+ options[:fmt] = v
245
+ end
246
+ sub_parser_add_ylim
247
+ sub_parser_add_xlim
248
+
249
+ when :density, :d
250
+ sub_parser_add_canvas
251
+ sub_parser_add_grid
252
+ sub_parser.on('--fmt STR', String, 'xyxy : header is like x1, y1, x2, y2, x3, y3...',
253
+ 'xyy : header is like x, y1, y2, y2, y3...') do |v|
254
+ options[:fmt] = v
255
+ end
256
+ sub_parser_add_ylim
257
+ sub_parser_add_xlim
258
+
259
+ when :boxplot, :box
260
+ sub_parser_add_xlim
261
+
262
+ when :colors, :color, :colours, :colour
263
+ sub_parser.on_head('-n', '--names', 'show color names only', TrueClass) do |v|
264
+ options[:color_names] = v
265
+ end
266
+
267
+ else
268
+ error_message = "uplot: unrecognized command '#{command}'"
269
+ if YouPlot.run_as_executable?
270
+ warn error_message
262
271
  exit 1
272
+ else
273
+ raise Error, error_message
263
274
  end
264
275
  end
265
276
  end
266
277
 
267
278
  def parse_options(argv = ARGV)
268
279
  begin
269
- main_parser.order!(argv)
280
+ create_main_parser.order!(argv)
270
281
  rescue OptionParser::ParseError => e
271
282
  warn "uplot: #{e.message}"
272
- exit 1
283
+ exit 1 if YouPlot.run_as_executable?
273
284
  end
274
285
 
275
286
  @command = argv.shift&.to_sym
276
287
 
277
288
  begin
278
- sub_parser.parse!(argv)
289
+ create_sub_parser&.parse!(argv)
279
290
  rescue OptionParser::ParseError => e
280
291
  warn "uplot: #{e.message}"
281
- exit 1
292
+ exit 1 if YouPlot.run_as_executable?
282
293
  end
283
294
  end
284
295
  end
@@ -25,10 +25,10 @@ module YouPlot
25
25
  Data.new(headers, series)
26
26
  elsif h_size > s_size
27
27
  warn "\e[35mThe number of headers is greater than the number of series.\e[0m"
28
- exit 1
28
+ exit 1 if YouPlot.run_as_executable?
29
29
  elsif h_size < s_size
30
30
  warn "\e[35mThe number of headers is less than the number of series.\e[0m"
31
- exit 1
31
+ exit 1 if YouPlot.run_as_executable?
32
32
  end
33
33
  end
34
34
  end
@@ -67,12 +67,10 @@ module YouPlot
67
67
  else
68
68
  Array.new(arr[0].size, [])
69
69
  end
70
+ elsif transpose
71
+ arr
70
72
  else
71
- if transpose
72
- arr
73
- else
74
- transpose2(arr)
75
- end
73
+ transpose2(arr)
76
74
  end
77
75
  end
78
76
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module YouPlot
4
- VERSION = '0.3.3'
4
+ VERSION = '0.3.4'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: youplot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - kojix2
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-01 00:00:00.000000000 Z
11
+ date: 2021-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: unicode_plot