tessella 0.3.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.
Files changed (188) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +900 -0
  4. data/doc/README.md +74 -0
  5. data/doc/bitfield.md +123 -0
  6. data/doc/charts.md +1370 -0
  7. data/doc/check.rb +75 -0
  8. data/doc/cli.md +483 -0
  9. data/doc/composition.md +599 -0
  10. data/doc/getting-started.md +121 -0
  11. data/doc/glyphs.md +134 -0
  12. data/doc/images.md +325 -0
  13. data/doc/library.md +239 -0
  14. data/doc/lint.md +270 -0
  15. data/doc/meter.md +210 -0
  16. data/doc/rule.md +51 -0
  17. data/doc/seq.md +169 -0
  18. data/doc/sparkline.md +63 -0
  19. data/doc/table.md +347 -0
  20. data/doc/targets.md +222 -0
  21. data/doc/text.md +84 -0
  22. data/doc/tree.md +108 -0
  23. data/doc/wave.md +122 -0
  24. data/examples/README.md +103 -0
  25. data/examples/ages.txt +9 -0
  26. data/examples/bad.csv +3 -0
  27. data/examples/boxes.txt +3 -0
  28. data/examples/broken.txt +4 -0
  29. data/examples/calibration.rb +12 -0
  30. data/examples/cities.csv +4 -0
  31. data/examples/cjk.rb +13 -0
  32. data/examples/comment.rb +9 -0
  33. data/examples/comment.sh +13 -0
  34. data/examples/cpu.txt +60 -0
  35. data/examples/dashboard.sh +25 -0
  36. data/examples/datasheet.rb +16 -0
  37. data/examples/disc.pgm +0 -0
  38. data/examples/disks.sh +18 -0
  39. data/examples/disks.txt +5 -0
  40. data/examples/dose.txt +7 -0
  41. data/examples/drift.txt +4 -0
  42. data/examples/ethernet.txt +3 -0
  43. data/examples/figure.c +5 -0
  44. data/examples/fit.rb +16 -0
  45. data/examples/floors.rb +21 -0
  46. data/examples/gallery.sh +20 -0
  47. data/examples/gauges.sh +31 -0
  48. data/examples/gradient.rb +16 -0
  49. data/examples/growth.txt +6 -0
  50. data/examples/hosts.csv +4 -0
  51. data/examples/icmp.txt +3 -0
  52. data/examples/ipv4.txt +12 -0
  53. data/examples/kinds.csv +4 -0
  54. data/examples/langs.csv +4 -0
  55. data/examples/lint.rb +16 -0
  56. data/examples/load.rb +14 -0
  57. data/examples/login.txt +10 -0
  58. data/examples/neg.csv +4 -0
  59. data/examples/normal.txt +200 -0
  60. data/examples/note.txt +2 -0
  61. data/examples/notes-fixed.md +17 -0
  62. data/examples/notes.md +17 -0
  63. data/examples/ohlc.txt +7 -0
  64. data/examples/os.csv +10 -0
  65. data/examples/outline.txt +8 -0
  66. data/examples/plot.txt +5 -0
  67. data/examples/refusals.rb +17 -0
  68. data/examples/report.sh +21 -0
  69. data/examples/rfc.sh +22 -0
  70. data/examples/samples.txt +7 -0
  71. data/examples/shapes.pgm +0 -0
  72. data/examples/sizes.tsv +3 -0
  73. data/examples/spi.txt +6 -0
  74. data/examples/status.sh +23 -0
  75. data/examples/stem.txt +12 -0
  76. data/examples/table-drift.txt +4 -0
  77. data/examples/temps.txt +31 -0
  78. data/examples/trig.sh +13 -0
  79. data/examples/trig.txt +102 -0
  80. data/examples/week.txt +8 -0
  81. data/examples/wide.txt +2 -0
  82. data/exe/tessella +6 -0
  83. data/lib/tessella/axis.rb +71 -0
  84. data/lib/tessella/bitfield.rb +194 -0
  85. data/lib/tessella/block.rb +56 -0
  86. data/lib/tessella/borders.rb +85 -0
  87. data/lib/tessella/canvas/area.rb +155 -0
  88. data/lib/tessella/canvas/ascii.rb +120 -0
  89. data/lib/tessella/canvas/block.rb +40 -0
  90. data/lib/tessella/canvas/braille.rb +30 -0
  91. data/lib/tessella/canvas/clip.rb +49 -0
  92. data/lib/tessella/canvas/density.rb +51 -0
  93. data/lib/tessella/canvas/dot.rb +27 -0
  94. data/lib/tessella/canvas/eighths.rb +43 -0
  95. data/lib/tessella/canvas/half.rb +51 -0
  96. data/lib/tessella/canvas/sextant.rb +36 -0
  97. data/lib/tessella/canvas.rb +168 -0
  98. data/lib/tessella/cell.rb +10 -0
  99. data/lib/tessella/chart.rb +211 -0
  100. data/lib/tessella/check.rb +52 -0
  101. data/lib/tessella/cli/bitfield.rb +121 -0
  102. data/lib/tessella/cli/chart.rb +615 -0
  103. data/lib/tessella/cli/chart_candle.rb +36 -0
  104. data/lib/tessella/cli/chart_heatmap.rb +21 -0
  105. data/lib/tessella/cli/chart_help.rb +85 -0
  106. data/lib/tessella/cli/chart_pie.rb +38 -0
  107. data/lib/tessella/cli/compose.rb +156 -0
  108. data/lib/tessella/cli/compose_options.rb +259 -0
  109. data/lib/tessella/cli/glyphs.rb +97 -0
  110. data/lib/tessella/cli/image.rb +250 -0
  111. data/lib/tessella/cli/input.rb +44 -0
  112. data/lib/tessella/cli/iso_time.rb +28 -0
  113. data/lib/tessella/cli/lint.rb +102 -0
  114. data/lib/tessella/cli/lint_options.rb +99 -0
  115. data/lib/tessella/cli/main.rb +121 -0
  116. data/lib/tessella/cli/meter.rb +80 -0
  117. data/lib/tessella/cli/rule.rb +57 -0
  118. data/lib/tessella/cli/seq.rb +117 -0
  119. data/lib/tessella/cli/sparkline.rb +72 -0
  120. data/lib/tessella/cli/table.rb +167 -0
  121. data/lib/tessella/cli/text.rb +78 -0
  122. data/lib/tessella/cli/tree.rb +100 -0
  123. data/lib/tessella/cli/wave.rb +148 -0
  124. data/lib/tessella/cli.rb +36 -0
  125. data/lib/tessella/color.rb +106 -0
  126. data/lib/tessella/compose.rb +243 -0
  127. data/lib/tessella/compose_fill.rb +176 -0
  128. data/lib/tessella/compose_grid.rb +36 -0
  129. data/lib/tessella/compose_shadow.rb +41 -0
  130. data/lib/tessella/error.rb +13 -0
  131. data/lib/tessella/frame.rb +170 -0
  132. data/lib/tessella/glyphs.rb +106 -0
  133. data/lib/tessella/image.rb +454 -0
  134. data/lib/tessella/image_octant.rb +46 -0
  135. data/lib/tessella/image_petscii.rb +116 -0
  136. data/lib/tessella/kinds/bar.rb +344 -0
  137. data/lib/tessella/kinds/box.rb +213 -0
  138. data/lib/tessella/kinds/box_upright.rb +110 -0
  139. data/lib/tessella/kinds/candlestick.rb +164 -0
  140. data/lib/tessella/kinds/columns.rb +259 -0
  141. data/lib/tessella/kinds/date_axis.rb +102 -0
  142. data/lib/tessella/kinds/error_bars.rb +71 -0
  143. data/lib/tessella/kinds/heatmap.rb +130 -0
  144. data/lib/tessella/kinds/line.rb +173 -0
  145. data/lib/tessella/kinds/multibar.rb +98 -0
  146. data/lib/tessella/kinds/multibar_columns.rb +130 -0
  147. data/lib/tessella/kinds/multibar_fine.rb +45 -0
  148. data/lib/tessella/kinds/multibar_rows.rb +93 -0
  149. data/lib/tessella/kinds/pie.rb +123 -0
  150. data/lib/tessella/kinds/pie_rim.rb +78 -0
  151. data/lib/tessella/kinds/sideways.rb +62 -0
  152. data/lib/tessella/kinds/stem.rb +134 -0
  153. data/lib/tessella/kinds/threshold.rb +73 -0
  154. data/lib/tessella/legend.rb +31 -0
  155. data/lib/tessella/lint/alphabet.rb +56 -0
  156. data/lib/tessella/lint/drift.rb +82 -0
  157. data/lib/tessella/lint/fences.rb +51 -0
  158. data/lib/tessella/lint/geometry.rb +120 -0
  159. data/lib/tessella/lint/geometry_checks.rb +224 -0
  160. data/lib/tessella/lint/lines.rb +115 -0
  161. data/lib/tessella/lint/mixing.rb +61 -0
  162. data/lib/tessella/lint/runner.rb +73 -0
  163. data/lib/tessella/lint/shadows.rb +120 -0
  164. data/lib/tessella/lint/target_rows.rb +66 -0
  165. data/lib/tessella/lint.rb +158 -0
  166. data/lib/tessella/meter.rb +133 -0
  167. data/lib/tessella/meter_upright.rb +43 -0
  168. data/lib/tessella/png.rb +456 -0
  169. data/lib/tessella/raster.rb +92 -0
  170. data/lib/tessella/rmagick_reader.rb +52 -0
  171. data/lib/tessella/rule.rb +59 -0
  172. data/lib/tessella/seq.rb +522 -0
  173. data/lib/tessella/sparkline.rb +57 -0
  174. data/lib/tessella/stats.rb +199 -0
  175. data/lib/tessella/table.rb +547 -0
  176. data/lib/tessella/table_cells.rb +225 -0
  177. data/lib/tessella/target.rb +105 -0
  178. data/lib/tessella/text.rb +76 -0
  179. data/lib/tessella/text_forms.rb +150 -0
  180. data/lib/tessella/tree.rb +221 -0
  181. data/lib/tessella/version.rb +5 -0
  182. data/lib/tessella/wave.rb +353 -0
  183. data/lib/tessella/width.rb +122 -0
  184. data/lib/tessella/width_class.rb +77 -0
  185. data/lib/tessella/width_invisible.rb +66 -0
  186. data/lib/tessella/width_invisible_high.rb +60 -0
  187. data/lib/tessella.rb +94 -0
  188. metadata +226 -0
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # examples/gradient.rb: a Raster built in Ruby -- no image file --
4
+ # drawn in three styles, side by side.
5
+ require "tessella"
6
+
7
+ w = h = 48
8
+ luma = (0...h).flat_map do |y|
9
+ (0...w).map { |x| Math.hypot(x - 24, y - 24) < 22 ? x / 47.0 : 0 }
10
+ end
11
+ raster = Tessella::Raster.new(width: w, height: h, luma: luma)
12
+ figs = %i[ramp blocks quadrant].map do |style|
13
+ Tessella.caption(Tessella.image(raster, style: style, width: 16),
14
+ text: style.to_s)
15
+ end
16
+ puts Tessella.beside(*figs, gap: 3)
@@ -0,0 +1,6 @@
1
+ n t
2
+ 1 0.69
3
+ 10 2.40
4
+ 100 4.62
5
+ 1000 6.91
6
+ 10000 9.21
@@ -0,0 +1,4 @@
1
+ host,cpu,io,net
2
+ web,40,15,20
3
+ db,25,50,5
4
+ cache,10,5,30
data/examples/icmp.txt ADDED
@@ -0,0 +1,3 @@
1
+ Type:8
2
+ Code:8
3
+ Checksum:16
data/examples/ipv4.txt ADDED
@@ -0,0 +1,12 @@
1
+ Version:4
2
+ IHL:4
3
+ DSCP:6
4
+ ECN:2
5
+ Total Length:16
6
+ Identification:16
7
+ Flags:3
8
+ Fragment Offset:13
9
+ TTL:8
10
+ Protocol:8
11
+ Header Checksum:16
12
+ Source Address:32
@@ -0,0 +1,4 @@
1
+ kind,canvas,notes
2
+ line,braille,"joins points, one series per column"
3
+ bar,none,"negative values split at zero"
4
+ stem,none,"back-to-back with two columns"
@@ -0,0 +1,4 @@
1
+ lang,loc
2
+ ruby,12
3
+ c,30
4
+ rust,7.5
data/examples/lint.rb ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # examples/lint.rb: the lint from Ruby -- a figure tessella draws is
4
+ # clean by construction; a hand-drawn one is reported line by line,
5
+ # and the rulers show where its verticals stopped agreeing.
6
+ require "tessella"
7
+
8
+ chart = Tessella.bar(%w[ruby c rust], [12, 30, 7.5], width: 30)
9
+ puts "chart: #{Tessella.lint(chart.to_s, geometry: true).clean?}"
10
+
11
+ report = Tessella.lint(File.read("broken.txt"), geometry: true)
12
+ report.findings.each { puts "broken.txt:#{it.line}: #{it.message}" }
13
+
14
+ Tessella.lint(File.read("table-drift.txt")).rulers.each do |r|
15
+ puts "line #{r.line}: verticals #{r.verticals.inspect}"
16
+ end
data/examples/load.rb ADDED
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # examples/load.rb: a bar chart and a table side by side, framed and
4
+ # captioned -- composition of any two figures.
5
+ require "tessella"
6
+
7
+ rows = Tessella::Table.parse(File.read("langs.csv"))
8
+ labels = rows.drop(1).map(&:first)
9
+ values = rows.drop(1).map { Integer(it[1], exception: false) || it[1].to_f }
10
+ plot = Tessella.bar(labels, values, width: 20)
11
+ table = Tessella.table(rows, style: :rounded)
12
+ fig = Tessella.beside(plot, table, gap: 2, align: :middle)
13
+ puts Tessella.caption(Tessella.frame(fig, title: "Load"),
14
+ text: "Figure 1: lines of code, in thousands")
@@ -0,0 +1,10 @@
1
+ participant Browser
2
+ participant Server
3
+ participant DB
4
+ Browser -> Server: POST /login
5
+ Server -> DB: SELECT user
6
+ DB --> Server: row
7
+ Server -> Server: check hash
8
+ note over Server,DB: bcrypt, cost 12
9
+ Server ->> DB: log attempt
10
+ Server --> Browser: 200 + cookie
data/examples/neg.csv ADDED
@@ -0,0 +1,4 @@
1
+ delta,v
2
+ a,-6
3
+ b,3
4
+ c,0
@@ -0,0 +1,200 @@
1
+ 0.359
2
+ -0.404
3
+ 0.202
4
+ 0.263
5
+ -0.634
6
+ 1.031
7
+ -1.092
8
+ 1.528
9
+ 0.897
10
+ -0.984
11
+ 0.266
12
+ -0.215
13
+ -2.427
14
+ 2.111
15
+ -2.14
16
+ -0.896
17
+ 0.517
18
+ 1.054
19
+ -0.446
20
+ 0.403
21
+ 0.759
22
+ -0.049
23
+ -0.363
24
+ 0.354
25
+ -2.747
26
+ 0.946
27
+ 0.731
28
+ -0.633
29
+ 0.047
30
+ 0.123
31
+ -0.239
32
+ -0.412
33
+ 1.426
34
+ 0.975
35
+ 0.171
36
+ 2.28
37
+ -0.604
38
+ -0.104
39
+ 0.606
40
+ -2.56
41
+ 0.775
42
+ 0.97
43
+ -0.471
44
+ 1.004
45
+ -0.514
46
+ -0.57
47
+ -1.967
48
+ -1.14
49
+ 0.752
50
+ -0.573
51
+ -0.364
52
+ 0.125
53
+ 0.311
54
+ -1.164
55
+ -0.211
56
+ -0.678
57
+ -1.011
58
+ 1.042
59
+ -0.279
60
+ -0.524
61
+ -0.513
62
+ 1.118
63
+ -0.504
64
+ 0.607
65
+ -0.381
66
+ 1.137
67
+ 0.319
68
+ -0.507
69
+ 1.723
70
+ 0.481
71
+ -1.187
72
+ -0.212
73
+ -0.275
74
+ 0.271
75
+ -0.628
76
+ 0.505
77
+ 0.096
78
+ -1.14
79
+ 0.001
80
+ 0.374
81
+ 1.142
82
+ -0.223
83
+ -0.851
84
+ -0.753
85
+ -0.116
86
+ 0.144
87
+ -0.204
88
+ -0.781
89
+ -0.957
90
+ 0.337
91
+ 0.992
92
+ 0.496
93
+ -2.77
94
+ 0.113
95
+ -1.416
96
+ 0.44
97
+ 0.136
98
+ -1.38
99
+ 1.337
100
+ 0.385
101
+ 1.06
102
+ 1.493
103
+ 0.917
104
+ -1.842
105
+ -0.018
106
+ -0.744
107
+ -0.748
108
+ -1.115
109
+ 1.359
110
+ 0.917
111
+ -1.422
112
+ -1.406
113
+ -1.274
114
+ -0.047
115
+ 0.089
116
+ -1.385
117
+ -0.118
118
+ -0.489
119
+ 1.294
120
+ -1.361
121
+ 0.587
122
+ 0.934
123
+ 1.386
124
+ 0.721
125
+ -0.713
126
+ -0.631
127
+ 0.519
128
+ -0.866
129
+ 0.138
130
+ -1.498
131
+ 1.705
132
+ 0.192
133
+ -0.797
134
+ -0.549
135
+ 0.717
136
+ 0.088
137
+ 1.926
138
+ -0.439
139
+ -0.303
140
+ 1.604
141
+ -2.083
142
+ 0.138
143
+ 1.159
144
+ -0.507
145
+ -1.472
146
+ -1.016
147
+ -2.708
148
+ 0.768
149
+ -0.029
150
+ 0.032
151
+ 0.779
152
+ 0.175
153
+ 1.007
154
+ 2.001
155
+ -0.128
156
+ -0.452
157
+ 1.958
158
+ -0.383
159
+ 1.335
160
+ -1.437
161
+ -1.855
162
+ -1.555
163
+ -0.928
164
+ -0.402
165
+ -1.175
166
+ 0.568
167
+ 0.596
168
+ 0.846
169
+ -1.87
170
+ 0.826
171
+ 1.457
172
+ -0.204
173
+ -0.857
174
+ 1.07
175
+ -0.845
176
+ -0.752
177
+ -0.336
178
+ 1.838
179
+ -0.352
180
+ -0.658
181
+ -0.471
182
+ -0.333
183
+ -1.922
184
+ 1.922
185
+ -1.032
186
+ -0.932
187
+ -2.194
188
+ -1.048
189
+ -0.606
190
+ 0.345
191
+ 0.521
192
+ -0.633
193
+ -0.633
194
+ 0.401
195
+ -0.406
196
+ -1.679
197
+ 0.058
198
+ -0.895
199
+ 1.116
200
+ -0.543
data/examples/note.txt ADDED
@@ -0,0 +1,2 @@
1
+ ruby is 12 kLOC
2
+ c is the bulk
@@ -0,0 +1,17 @@
1
+ # Notes
2
+
3
+ | kind | canvas |
4
+ |------|--------|
5
+ | line | braille |
6
+
7
+ The pipeline, redrawn for the web:
8
+
9
+ ```text
10
+ ┌───────┐ ┌───────┐
11
+ │ parse │────▸│ draw │
12
+ └───────┘ └───┬───┘
13
+ │
14
+ ┌───┴───┐
15
+ │ print │
16
+ └───────┘
17
+ ```
data/examples/notes.md ADDED
@@ -0,0 +1,17 @@
1
+ # Notes
2
+
3
+ | kind | canvas |
4
+ |------|--------|
5
+ | line | braille |
6
+
7
+ The pipeline, as drawn by hand:
8
+
9
+ ```text
10
+ ┌───────┐ ┌───────┐
11
+ │ parse │────▶│ draw │
12
+ └───────┘ └───┬───┘
13
+ │
14
+ ┌───┴───┐
15
+ │ print │
16
+ └───────┘
17
+ ```
data/examples/ohlc.txt ADDED
@@ -0,0 +1,7 @@
1
+ date open high low close
2
+ 2026-11-02 100 104 98 103
3
+ 2026-11-03 103 107 101 102
4
+ 2026-11-04 102 103 95 96
5
+ 2026-11-05 96 99 94 98
6
+ 2026-11-06 98 105 97 104
7
+ 2026-11-09 104 106 102 104
data/examples/os.csv ADDED
@@ -0,0 +1,10 @@
1
+ os,share
2
+ linux,41
3
+ macos,22
4
+ windows,18
5
+ freebsd,9
6
+ openbsd,4
7
+ netbsd,2
8
+ haiku,2
9
+ plan9,1
10
+ qnx,1
@@ -0,0 +1,8 @@
1
+ tessella
2
+ lib # the library
3
+ tessella.rb # the entry
4
+ tessella
5
+ cli
6
+ exe
7
+ tessella # the command
8
+ test
data/examples/plot.txt ADDED
@@ -0,0 +1,5 @@
1
+ ┌ ┐
2
+ ruby ┤██████▍········· 12
3
+ c ┤████████████████ 30
4
+ rust ┤████············ 7.5
5
+ └ ┘
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # examples/refusals.rb: what the library refuses, and how it says so.
4
+ require "tessella"
5
+
6
+ [
7
+ -> { Tessella.line([1, 2, 3], [1, 2]) },
8
+ -> { Tessella.bar(%w[a b], [1, Float::NAN]) },
9
+ -> { Tessella.line([1, 2], width: 0) },
10
+ -> { Tessella.line([1, 2], colour: true) },
11
+ -> { Tessella.tree("a\n b\n c") },
12
+ -> { Tessella.frame("é", ascii: true) }
13
+ ].each do |call|
14
+ call.call
15
+ rescue ArgumentError => e
16
+ puts "#{e.class}: #{e.message}"
17
+ end
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ # examples/report.sh -- a chart and a table drawn from one CSV, set
3
+ # side by side, framed and captioned: compose reads one block from
4
+ # stdin, so the others go through a temp directory.
5
+ # usage: sh report.sh [file.csv] (default langs.csv)
6
+ set -eu
7
+
8
+ cd -- "$(dirname -- "$0")" || exit 1
9
+ csv=${1:-langs.csv}
10
+
11
+ tmpdir=
12
+ cleanup() { [ -z "$tmpdir" ] || rm -rf -- "$tmpdir"; }
13
+ trap cleanup EXIT INT HUP TERM
14
+ tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/report.XXXXXX") || exit 1
15
+
16
+ tessella chart --kind bar --width 20 -- "$csv" > "$tmpdir/chart"
17
+ tessella table --style rounded -- "$csv" > "$tmpdir/table"
18
+ tessella compose beside --gap 2 --align middle \
19
+ "$tmpdir/chart" "$tmpdir/table" |
20
+ tessella compose frame --title Load - |
21
+ tessella compose caption --text "Source: $csv" -
data/examples/rfc.sh ADDED
@@ -0,0 +1,22 @@
1
+ #!/bin/sh
2
+ # examples/rfc.sh -- an RFC-style section: a message exchange and the
3
+ # header it carries, both ASCII, stacked under a rule and indented
4
+ # three columns, as an RFC sets its figures.
5
+ # usage: sh rfc.sh
6
+ set -eu
7
+
8
+ cd -- "$(dirname -- "$0")" || exit 1
9
+
10
+ tmpdir=
11
+ cleanup() { [ -z "$tmpdir" ] || rm -rf -- "$tmpdir"; }
12
+ trap cleanup EXIT INT HUP TERM
13
+ tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/rfc.XXXXXX") || exit 1
14
+
15
+ printf 'Client -> Server: Echo Request\nServer --> Client: Echo Reply\n' |
16
+ tessella seq --ascii > "$tmpdir/seq"
17
+ tessella bitfield icmp.txt |
18
+ tessella compose caption --ascii --text 'Figure 1: ICMP header' - \
19
+ > "$tmpdir/header"
20
+ tessella compose stack --ascii --gap 1 --rule '-' --center \
21
+ "$tmpdir/seq" "$tmpdir/header" |
22
+ tessella compose indent --ascii --prefix ' ' --max-width 72 -
@@ -0,0 +1,7 @@
1
+ a b c
2
+ 1 2 3
3
+ 2 4 5
4
+ 3 4 6
5
+ 4 5 6
6
+ 5 9 7
7
+ 2 3 30
Binary file
@@ -0,0 +1,3 @@
1
+ name size
2
+ lib 7876
3
+ test 5120
data/examples/spi.txt ADDED
@@ -0,0 +1,6 @@
1
+ clk: p.......
2
+ cs: 10.....1
3
+ mosi: x=.=.=.x | A0 D0 D1
4
+ miso: z..=.=.z | R0 R1
5
+ ---
6
+ irq: 0....1.0
@@ -0,0 +1,23 @@
1
+ #!/bin/sh
2
+ # examples/status.sh -- telling bad data (exit 1) from a bad call
3
+ # (exit 2) in a script: draw what can be drawn, report the rest.
4
+ # usage: sh status.sh
5
+ set -eu
6
+
7
+ cd -- "$(dirname -- "$0")" || exit 1
8
+
9
+ draw() {
10
+ # shellcheck disable=SC3043 # local: every target sh has it
11
+ local status
12
+ status=0
13
+ tessella chart --kind bar --width 20 "$@" 2>/dev/null || status=$?
14
+ case $status in
15
+ 0) ;;
16
+ 1) printf '%s: bad data, skipped\n' "$*" ;;
17
+ *) printf '%s: bad call (exit %s)\n' "$*" "$status" ;;
18
+ esac
19
+ }
20
+
21
+ draw langs.csv
22
+ draw bad.csv
23
+ draw --bins 3 langs.csv
data/examples/stem.txt ADDED
@@ -0,0 +1,12 @@
1
+ 12
2
+ 15
3
+ 21
4
+ 23
5
+ 23
6
+ 27
7
+ 31
8
+ 34
9
+ 38
10
+ 45
11
+ 47
12
+ 52
@@ -0,0 +1,4 @@
1
+ ┌──┬──┐
2
+ │a │b │
3
+ │c │d │
4
+ └──┴──┘
@@ -0,0 +1,31 @@
1
+ date temp
2
+ 2026-10-01 12.0
3
+ 2026-10-02 13.5
4
+ 2026-10-03 14.9
5
+ 2026-10-04 16.1
6
+ 2026-10-05 17.0
7
+ 2026-10-06 17.7
8
+ 2026-10-07 18.0
9
+ 2026-10-08 17.9
10
+ 2026-10-09 17.5
11
+ 2026-10-10 16.7
12
+ 2026-10-11 15.6
13
+ 2026-10-12 14.3
14
+ 2026-10-13 12.8
15
+ 2026-10-14 11.4
16
+ 2026-10-15 9.9
17
+ 2026-10-16 8.6
18
+ 2026-10-17 7.5
19
+ 2026-10-18 6.6
20
+ 2026-10-19 6.1
21
+ 2026-10-20 6.0
22
+ 2026-10-21 6.2
23
+ 2026-10-22 6.8
24
+ 2026-10-23 7.8
25
+ 2026-10-24 9.0
26
+ 2026-10-25 10.3
27
+ 2026-10-26 11.8
28
+ 2026-10-27 13.3
29
+ 2026-10-28 14.7
30
+ 2026-10-29 15.9
31
+ 2026-10-30 16.9
data/examples/trig.sh ADDED
@@ -0,0 +1,13 @@
1
+ #!/bin/sh
2
+ # examples/trig.sh -- data made on the spot by awk, piped straight
3
+ # into a chart: a header row names the two series.
4
+ # usage: sh trig.sh
5
+ set -eu
6
+
7
+ awk 'BEGIN {
8
+ print "x sin cos"
9
+ for (i = 0; i <= 100; i++)
10
+ printf "%g %g %g\n", i / 10, sin(i / 10), cos(i / 10)
11
+ }' |
12
+ tessella chart --title trig --xlabel x --width 30 --height 6 \
13
+ --canvas block
data/examples/trig.txt ADDED
@@ -0,0 +1,102 @@
1
+ x sin cos
2
+ 0.0 0.0 1.0
3
+ 0.1 0.09983341664682815 0.9950041652780258
4
+ 0.2 0.19866933079506122 0.9800665778412416
5
+ 0.3 0.2955202066613396 0.955336489125606
6
+ 0.4 0.3894183423086505 0.9210609940028851
7
+ 0.5 0.479425538604203 0.8775825618903728
8
+ 0.6 0.5646424733950355 0.8253356149096782
9
+ 0.7 0.6442176872376911 0.7648421872844884
10
+ 0.8 0.7173560908995228 0.6967067093471654
11
+ 0.9 0.7833269096274834 0.6216099682706644
12
+ 1.0 0.8414709848078965 0.5403023058681398
13
+ 1.1 0.8912073600614354 0.4535961214255773
14
+ 1.2 0.9320390859672264 0.3623577544766734
15
+ 1.3 0.963558185417193 0.26749882862458735
16
+ 1.4 0.9854497299884603 0.16996714290024081
17
+ 1.5 0.9974949866040544 0.0707372016677029
18
+ 1.6 0.9995736030415051 -0.029199522301288815
19
+ 1.7 0.9916648104524686 -0.12884449429552486
20
+ 1.8 0.9738476308781951 -0.2272020946930871
21
+ 1.9 0.9463000876874145 -0.3232895668635035
22
+ 2.0 0.9092974268256817 -0.4161468365471424
23
+ 2.1 0.8632093666488737 -0.5048461045998576
24
+ 2.2 0.8084964038195901 -0.5885011172553458
25
+ 2.3 0.74570521217672 -0.6662760212798244
26
+ 2.4 0.6754631805511506 -0.7373937155412458
27
+ 2.5 0.5984721441039564 -0.8011436155469337
28
+ 2.6 0.5155013718214642 -0.8568887533689473
29
+ 2.7 0.4273798802338298 -0.9040721420170612
30
+ 2.8 0.33498815015590466 -0.9422223406686583
31
+ 2.9 0.23924932921398198 -0.9709581651495907
32
+ 3.0 0.1411200080598672 -0.9899924966004454
33
+ 3.1 0.04158066243329049 -0.9991351502732795
34
+ 3.2 -0.058374143427580086 -0.9982947757947531
35
+ 3.3 -0.15774569414324865 -0.9874797699088649
36
+ 3.4 -0.25554110202683167 -0.9667981925794609
37
+ 3.5 -0.35078322768961984 -0.9364566872907963
38
+ 3.6 -0.44252044329485246 -0.896758416334147
39
+ 3.7 -0.5298361409084934 -0.848100031710408
40
+ 3.8 -0.6118578909427193 -0.7909677119144165
41
+ 3.9 -0.6877661591839741 -0.7259323042001399
42
+ 4.0 -0.7568024953079282 -0.6536436208636119
43
+ 4.1 -0.8182771110644108 -0.5748239465332685
44
+ 4.2 -0.8715757724135882 -0.4902608213406994
45
+ 4.3 -0.9161659367494549 -0.40079917207997545
46
+ 4.4 -0.9516020738895161 -0.30733286997841935
47
+ 4.5 -0.977530117665097 -0.2107957994307797
48
+ 4.6 -0.9936910036334645 -0.112152526935054
49
+ 4.7 -0.9999232575641008 -0.01238866346289056
50
+ 4.8 -0.9961646088358406 0.08749898343944727
51
+ 4.9 -0.9824526126243325 0.18651236942257576
52
+ 5.0 -0.9589242746631385 0.28366218546322625
53
+ 5.1 -0.9258146823277321 0.37797774271298107
54
+ 5.2 -0.8834546557201531 0.4685166713003771
55
+ 5.3 -0.8322674422239008 0.5543743361791615
56
+ 5.4 -0.7727644875559871 0.6346928759426347
57
+ 5.5 -0.7055403255703919 0.70866977429126
58
+ 5.6 -0.6312666378723208 0.7755658785102502
59
+ 5.7 -0.5506855425976376 0.8347127848391598
60
+ 5.8 -0.4646021794137566 0.8855195169413194
61
+ 5.9 -0.373876664830236 0.9274784307440359
62
+ 6.0 -0.27941549819892586 0.960170286650366
63
+ 6.1 -0.18216250427209502 0.9832684384425847
64
+ 6.2 -0.0830894028174964 0.9965420970232175
65
+ 6.3 0.0168139004843506 0.9998586363834151
66
+ 6.4 0.11654920485049364 0.9931849187581926
67
+ 6.5 0.21511998808781552 0.9765876257280235
68
+ 6.6 0.3115413635133787 0.9502325919585293
69
+ 6.7 0.4048499206165983 0.9143831482353194
70
+ 6.8 0.49411335113860894 0.8693974903498248
71
+ 6.9 0.5784397643882002 0.8157251001253568
72
+ 7.0 0.6569865987187891 0.7539022543433046
73
+ 7.1 0.7289690401258765 0.6845466664428059
74
+ 7.2 0.7936678638491531 0.6083513145322546
75
+ 7.3 0.8504366206285648 0.5260775173811045
76
+ 7.4 0.8987080958116269 0.43854732757439036
77
+ 7.5 0.9379999767747389 0.3466353178350258
78
+ 7.6 0.9679196720314865 0.25125984258225487
79
+ 7.7 0.9881682338770004 0.15337386203786435
80
+ 7.8 0.998543345374605 0.05395542056264886
81
+ 7.9 0.998941341839772 -0.04600212563953695
82
+ 8.0 0.9893582466233818 -0.14550003380861354
83
+ 8.1 0.9698898108450863 -0.2435441537357911
84
+ 8.2 0.9407305566797726 -0.3391548609838362
85
+ 8.3 0.9021718337562933 -0.43137684497062084
86
+ 8.4 0.8545989080882805 -0.5192886541166856
87
+ 8.5 0.7984871126234903 -0.6020119026848236
88
+ 8.6 0.7343970978741133 -0.6787200473200125
89
+ 8.7 0.662969230082182 -0.7486466455973999
90
+ 8.8 0.5849171928917617 -0.811093014061656
91
+ 8.9 0.5010208564578846 -0.8654352092411123
92
+ 9.0 0.4121184852417566 -0.9111302618846769
93
+ 9.1 0.3190983623493521 -0.9477216021311119
94
+ 9.2 0.22288991410024592 -0.974843621404164
95
+ 9.3 0.1244544235070617 -0.9922253254526034
96
+ 9.4 0.024775425453357765 -0.9996930420352065
97
+ 9.5 -0.0751511204618093 -0.9971721561963784
98
+ 9.6 -0.1743267812229814 -0.9846878557941267
99
+ 9.7 -0.2717606264109442 -0.9623648798313097
100
+ 9.8 -0.3664791292519284 -0.9304262721047533
101
+ 9.9 -0.4575358937753214 -0.8891911526253609
102
+ 10.0 -0.5440211108893698 -0.8390715290764524
data/examples/week.txt ADDED
@@ -0,0 +1,8 @@
1
+ day 0h 3h 6h 9h 12h 15h 18h 21h
2
+ mon 10 14 18 72 76 63 67 21
3
+ tue 23 10 14 68 72 76 63 17
4
+ wed 19 23 10 64 68 72 76 13
5
+ thu 15 19 23 60 64 68 72 26
6
+ fri 11 15 19 73 60 64 68 22
7
+ sat 0 0 0 39 43 30 34 0
8
+ sun 0 0 0 35 39 43 30 0
data/examples/wide.txt ADDED
@@ -0,0 +1,2 @@
1
+ name size
2
+ 日本語 12
data/exe/tessella ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "../lib/tessella/cli"
5
+
6
+ exit Tessella::CLI.run(ARGV, stdin: $stdin, stdout: $stdout, stderr: $stderr)