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
data/doc/README.md ADDED
@@ -0,0 +1,74 @@
1
+ # tessella documentation
2
+
3
+ tessella draws text figures on a monospace grid, in Unicode or pure
4
+ ASCII: charts, trees, tables, bit-field, timing and sequence
5
+ diagrams, and pictures, all of which compose into one figure. Its
6
+ output is meant for documents first: no trailing blank, no escape
7
+ code unless asked, ASCII from the first byte when asked.
8
+
9
+ ```text
10
+ $ ruby datasheet.rb
11
+ CTRL (0x04)
12
+
13
+ 0 1
14
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
15
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16
+ | MODE | DIV | EN |
17
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
18
+
19
+ ─────────────────────────────────────
20
+
21
+ ──┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐
22
+ sclk └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─
23
+
24
+ ────┐ ┌───
25
+ cs └───────────────────────┘
26
+
27
+ ▒▒▒▒╳ ╳ ╳ ▒▒▒▒
28
+ mosi ▒▒▒▒╳──CMD──╳─ADDR──╳─DATA──▒▒▒▒
29
+ ```
30
+
31
+ ## Guide
32
+
33
+ 1. [Getting started](getting-started.md): install, a first chart, a
34
+ first diagram, the library.
35
+ 2. [Charts](charts.md): line, scatter, stairs, density, bar,
36
+ histogram, box, stem, heatmap, candlestick and pie; input formats,
37
+ options, canvases, colour, ASCII.
38
+ 3. [Composition](composition.md): blocks; frame, beside, stack, grid,
39
+ indent, caption, shadow, fill.
40
+ 4. Diagrams: [trees](tree.md), [tables](table.md),
41
+ [bit fields](bitfield.md), [timing diagrams](wave.md),
42
+ [sequence diagrams](seq.md).
43
+ 5. [Pictures](images.md): images as text.
44
+ 6. One-liners: [sparklines](sparkline.md), charts one line high;
45
+ [meters](meter.md), progress bars and gauges;
46
+ [rules](rule.md), dividers; [text styles](text.md), Unicode's
47
+ styled alphabets.
48
+ 7. [Linting](lint.md): checking a figure, drawn or hand-made, for
49
+ what breaks it on someone else's screen.
50
+ 8. [Glyph sets](glyphs.md): width classes, the named glyph sets, and
51
+ checking a set of one's own.
52
+ 9. [Width targets](targets.md): drawing for a Western terminal, a CJK
53
+ one, or a browser.
54
+
55
+ ## Reference
56
+
57
+ - [The `tessella` command](cli.md): every command and option, exit
58
+ statuses, pipelines.
59
+ - [The library](library.md): every factory, `Block`, `Raster`,
60
+ `Width`, errors, the output rules, vendoring.
61
+ - [DESIGN.md](../DESIGN.md): the internal interfaces, and why the
62
+ project is shaped as it is.
63
+
64
+ ## Examples
65
+
66
+ Every figure in these pages is real output. The input files and the
67
+ Ruby scripts are in [examples/](../examples/); each `$` command runs
68
+ in that directory. `doc/check.rb` re-runs every one of them and
69
+ compares the output byte for byte:
70
+
71
+ ```sh
72
+ ruby doc/check.rb # report any figure that changed
73
+ ruby doc/check.rb --update # rewrite the pages from what runs now
74
+ ```
data/doc/bitfield.md ADDED
@@ -0,0 +1,123 @@
1
+ # Bit fields
2
+
3
+ `bitfield` draws a packet header or a register as RFC 2360 draws one:
4
+ a bit ruler, `+-+` ticks, one row per word, each field's name centred
5
+ in its cell. It is always ASCII, as the genre is.
6
+
7
+ ```ruby
8
+ Tessella.bitfield(fields, word: 32, octets: false, ruler: true,
9
+ abbrev: false) # => Block
10
+ ```
11
+
12
+ ```text
13
+ tessella bitfield [--word N] [--octets] [--no-ruler] [--abbrev]
14
+ [--max-width N] [file]
15
+ ```
16
+
17
+ ## Input
18
+
19
+ One field per line, `name:bits`, in order from the most significant
20
+ bit; or, in Ruby, an Array of `[name, bits]` pairs.
21
+
22
+ ```text
23
+ $ cat ipv4.txt
24
+ Version:4
25
+ IHL:4
26
+ DSCP:6
27
+ ECN:2
28
+ Total Length:16
29
+ Identification:16
30
+ Flags:3
31
+ Fragment Offset:13
32
+ TTL:8
33
+ Protocol:8
34
+ Header Checksum:16
35
+ Source Address:32
36
+ ```
37
+
38
+ ```text
39
+ $ tessella bitfield ipv4.txt
40
+ 0 1 2 3
41
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
42
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43
+ |Version| IHL | DSCP |ECN| Total Length |
44
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45
+ | Identification |Flags| Fragment Offset |
46
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
47
+ | TTL | Protocol | Header Checksum |
48
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
49
+ | Source Address |
50
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51
+ ```
52
+
53
+ A field longer than what is left of its row continues on the next,
54
+ as an Ethernet header's addresses do:
55
+
56
+ ```text
57
+ $ tessella bitfield ethernet.txt
58
+ 0 1 2 3
59
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
60
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
61
+ | Destination MAC |
62
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63
+ | Destination MAC | Source MAC |
64
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65
+ | Source MAC |
66
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67
+ | EtherType |
68
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69
+ ```
70
+
71
+ ## Options
72
+
73
+ - `--word N` (`word:`): bits per row, 8, 16, 32 (the default) or 64.
74
+ - `--octets`: byte-oriented, one tick per octet instead of per bit,
75
+ and no bit ruler.
76
+ - `--no-ruler` (`ruler: false`): drop the two ruler rows.
77
+ - `--abbrev`: truncate a name too wide for its cell, instead of
78
+ refusing it.
79
+ - `--ascii` is accepted and changes nothing.
80
+
81
+ ```text
82
+ $ tessella bitfield --word 16 --octets icmp.txt
83
+ +---------------+---------------+
84
+ | Type | Code |
85
+ +---------------+---------------+
86
+ | Checksum |
87
+ +---------------+---------------+
88
+ ```
89
+
90
+ ```text
91
+ $ tessella bitfield --no-ruler icmp.txt
92
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
93
+ | Type | Code | Checksum |
94
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
95
+ ```
96
+
97
+ A bit is two columns wide, so a 1-bit field has room for one
98
+ character and a 4-bit field for seven:
99
+
100
+ ```text
101
+ $ printf 'Destination:4\nx:4\n' | tessella bitfield --word 8
102
+ tessella bitfield: name "Destination" needs 11 columns, this cell only has 7
103
+ ```
104
+
105
+ ```text
106
+ $ printf 'Destination:4\nx:4\n' | tessella bitfield --word 8 --abbrev
107
+ 0
108
+ 0 1 2 3 4 5 6 7
109
+ +-+-+-+-+-+-+-+-+
110
+ |Destin.| x |
111
+ +-+-+-+-+-+-+-+-+
112
+ ```
113
+
114
+ ## Errors
115
+
116
+ A line that is not `name:bits`, a field of zero bits, a name too wide
117
+ without `--abbrev`, a name that is not ASCII, or an output wider than `--max-width` exits 1,
118
+ naming the line. An unsupported `--word` exits 2.
119
+
120
+ ```text
121
+ $ printf 'Type:8\nCode\n' | tessella bitfield
122
+ tessella bitfield: line 2: "Code" not name:bits
123
+ ```