soliterm 1.0.0__tar.gz

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 (95) hide show
  1. soliterm-1.0.0/CHANGELOG.md +267 -0
  2. soliterm-1.0.0/LICENSE +21 -0
  3. soliterm-1.0.0/MANIFEST.in +12 -0
  4. soliterm-1.0.0/PKG-INFO +454 -0
  5. soliterm-1.0.0/README.md +418 -0
  6. soliterm-1.0.0/SECURITY.md +36 -0
  7. soliterm-1.0.0/docs/keybindings.md +198 -0
  8. soliterm-1.0.0/man/soliterm.6 +501 -0
  9. soliterm-1.0.0/pyproject.toml +157 -0
  10. soliterm-1.0.0/setup.cfg +4 -0
  11. soliterm-1.0.0/src/soliterm/__init__.py +24 -0
  12. soliterm-1.0.0/src/soliterm/__main__.py +8 -0
  13. soliterm-1.0.0/src/soliterm/aisleriot.py +398 -0
  14. soliterm-1.0.0/src/soliterm/camo.py +369 -0
  15. soliterm-1.0.0/src/soliterm/cli.py +492 -0
  16. soliterm-1.0.0/src/soliterm/deals.py +204 -0
  17. soliterm-1.0.0/src/soliterm/debuginfo.py +177 -0
  18. soliterm-1.0.0/src/soliterm/engine/__init__.py +71 -0
  19. soliterm-1.0.0/src/soliterm/engine/cards.py +54 -0
  20. soliterm-1.0.0/src/soliterm/engine/core.py +807 -0
  21. soliterm-1.0.0/src/soliterm/engine/gamedef.py +223 -0
  22. soliterm-1.0.0/src/soliterm/engine/games/__init__.py +111 -0
  23. soliterm-1.0.0/src/soliterm/engine/games/bakersdozen.py +99 -0
  24. soliterm-1.0.0/src/soliterm/engine/games/canfield.py +166 -0
  25. soliterm-1.0.0/src/soliterm/engine/games/eightoff.py +118 -0
  26. soliterm-1.0.0/src/soliterm/engine/games/fortythieves.py +154 -0
  27. soliterm-1.0.0/src/soliterm/engine/games/freecell.py +108 -0
  28. soliterm-1.0.0/src/soliterm/engine/games/golf.py +79 -0
  29. soliterm-1.0.0/src/soliterm/engine/games/klondike.py +185 -0
  30. soliterm-1.0.0/src/soliterm/engine/games/scorpion.py +109 -0
  31. soliterm-1.0.0/src/soliterm/engine/games/spider.py +212 -0
  32. soliterm-1.0.0/src/soliterm/engine/games/spiderette.py +29 -0
  33. soliterm-1.0.0/src/soliterm/engine/games/triplepeaks.py +120 -0
  34. soliterm-1.0.0/src/soliterm/engine/games/yukon.py +103 -0
  35. soliterm-1.0.0/src/soliterm/engine/rng.py +81 -0
  36. soliterm-1.0.0/src/soliterm/history.py +183 -0
  37. soliterm-1.0.0/src/soliterm/migrate.py +157 -0
  38. soliterm-1.0.0/src/soliterm/py.typed +0 -0
  39. soliterm-1.0.0/src/soliterm/saves.py +155 -0
  40. soliterm-1.0.0/src/soliterm/store.py +819 -0
  41. soliterm-1.0.0/src/soliterm/textmode.py +469 -0
  42. soliterm-1.0.0/src/soliterm/themes.py +229 -0
  43. soliterm-1.0.0/src/soliterm/tui/__init__.py +12 -0
  44. soliterm-1.0.0/src/soliterm/tui/__main__.py +11 -0
  45. soliterm-1.0.0/src/soliterm/tui/app.py +1817 -0
  46. soliterm-1.0.0/src/soliterm/tui/board.py +835 -0
  47. soliterm-1.0.0/src/soliterm/tui/cascade.py +111 -0
  48. soliterm-1.0.0/src/soliterm/tui/keys.py +150 -0
  49. soliterm-1.0.0/src/soliterm.egg-info/PKG-INFO +454 -0
  50. soliterm-1.0.0/src/soliterm.egg-info/SOURCES.txt +93 -0
  51. soliterm-1.0.0/src/soliterm.egg-info/dependency_links.txt +1 -0
  52. soliterm-1.0.0/src/soliterm.egg-info/entry_points.txt +2 -0
  53. soliterm-1.0.0/src/soliterm.egg-info/requires.txt +3 -0
  54. soliterm-1.0.0/src/soliterm.egg-info/top_level.txt +1 -0
  55. soliterm-1.0.0/tests/conftest.py +51 -0
  56. soliterm-1.0.0/tests/helpers.py +205 -0
  57. soliterm-1.0.0/tests/test_aisleriot_sync.py +696 -0
  58. soliterm-1.0.0/tests/test_build_pyz.py +93 -0
  59. soliterm-1.0.0/tests/test_camo.py +171 -0
  60. soliterm-1.0.0/tests/test_cascade.py +78 -0
  61. soliterm-1.0.0/tests/test_cli.py +1396 -0
  62. soliterm-1.0.0/tests/test_config.py +180 -0
  63. soliterm-1.0.0/tests/test_conformance.py +205 -0
  64. soliterm-1.0.0/tests/test_deals.py +213 -0
  65. soliterm-1.0.0/tests/test_debuginfo.py +321 -0
  66. soliterm-1.0.0/tests/test_engine.py +906 -0
  67. soliterm-1.0.0/tests/test_fortythieves.py +148 -0
  68. soliterm-1.0.0/tests/test_freecell.py +85 -0
  69. soliterm-1.0.0/tests/test_game_lists.py +99 -0
  70. soliterm-1.0.0/tests/test_hint.py +220 -0
  71. soliterm-1.0.0/tests/test_history.py +161 -0
  72. soliterm-1.0.0/tests/test_isolation.py +29 -0
  73. soliterm-1.0.0/tests/test_keybindings_doc.py +70 -0
  74. soliterm-1.0.0/tests/test_klondike.py +213 -0
  75. soliterm-1.0.0/tests/test_man_page.py +50 -0
  76. soliterm-1.0.0/tests/test_migrate.py +224 -0
  77. soliterm-1.0.0/tests/test_moves.py +300 -0
  78. soliterm-1.0.0/tests/test_readme.py +51 -0
  79. soliterm-1.0.0/tests/test_render.py +806 -0
  80. soliterm-1.0.0/tests/test_rng.py +121 -0
  81. soliterm-1.0.0/tests/test_saves.py +180 -0
  82. soliterm-1.0.0/tests/test_scorpion.py +176 -0
  83. soliterm-1.0.0/tests/test_screenshots_tool.py +206 -0
  84. soliterm-1.0.0/tests/test_spider.py +314 -0
  85. soliterm-1.0.0/tests/test_spiderette.py +105 -0
  86. soliterm-1.0.0/tests/test_store_files.py +252 -0
  87. soliterm-1.0.0/tests/test_textmode.py +743 -0
  88. soliterm-1.0.0/tests/test_themes.py +266 -0
  89. soliterm-1.0.0/tests/test_triplepeaks.py +185 -0
  90. soliterm-1.0.0/tests/test_tui_app.py +544 -0
  91. soliterm-1.0.0/tests/test_tui_keys.py +151 -0
  92. soliterm-1.0.0/tests/test_tui_play.py +2974 -0
  93. soliterm-1.0.0/tools/build_pyz.py +110 -0
  94. soliterm-1.0.0/tools/keybindings.py +337 -0
  95. soliterm-1.0.0/tools/screenshots.py +895 -0
@@ -0,0 +1,267 @@
1
+ # Changelog
2
+
3
+ All notable changes to Soliterm are written down here.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and Soliterm follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ Soliterm grew out of aisle-cli, a private project of mine that played the
9
+ same kind of games in a terminal under the command `aisle`. Its one
10
+ release, aisle-cli 1.0.0 of 2026-06-29, stays at the bottom as history, and
11
+ Soliterm 1.0.0 lists the changes since.
12
+
13
+ ## [Unreleased]
14
+
15
+ ## [1.0.0] - 2026-09-25
16
+
17
+ Soliterm's first public release. It grew out of aisle-cli, a private
18
+ project of mine, and these are the changes since aisle-cli 1.0.0, which is
19
+ at the bottom of CHANGELOG.md.
20
+
21
+ ### Added
22
+
23
+ - Three new games: Spiderette, Triple Peaks and Scorpion, for twelve in
24
+ all. Each shares its statistics with AisleRiot's own record of it, so
25
+ any games of them you've played in AisleRiot show up straight away, and
26
+ each has its page in `docs/games`. Triple Peaks has AisleRiot's
27
+ multiplier scoring as an option.
28
+ - Every deal has a number, shown on the board, at the end of a game and in
29
+ text mode. `--deal N` plays deal N, and `n` then deals the next one.
30
+ FreeCell deals are numbered as in Microsoft FreeCell.
31
+ - Share codes such as `klondike:d3:48213` name a deal with its options.
32
+ The end of a game shows its code, and `--deal` takes one, as do the `g`
33
+ key during a game and Play a deal on the menu.
34
+ - A daily deal for every game, from `--daily` or Daily deal on the menu:
35
+ the same cards for everyone that day, with the standard options. When
36
+ it ends there's a line to share that names no cards. It works offline.
37
+ - `--draw` and `--suits` set Klondike's draw or Spider's suits for one run
38
+ without saving them.
39
+ - A game you've started is kept for next time when you leave it with `q`,
40
+ `m` or Ctrl-C, or close the terminal on it, instead of counting as lost.
41
+ Its menu row reads `Resume your game: 0:42, 31 moves`, and picking it or
42
+ starting it with `--game` carries on where you left off, while a chosen
43
+ deal or option starts afresh and leaves it waiting. A daily is kept the
44
+ same way, its menu row says so, and that day's daily carries on with it.
45
+ Text mode keeps games too, when you're typing at a terminal. On the way
46
+ out a line says which game was kept and how to pick it up again.
47
+ - Every game played here goes in `history.jsonl`, one line each. The
48
+ statistics gain Streak and Longest columns, the win banner and text mode
49
+ name a run of two or more wins, and `--stats` lists the last ten games
50
+ and marks the dailies.
51
+ - `a` finishes the game once every card left can go up, safe or not, as
52
+ one move, and the message line says when that is. It does in text mode
53
+ too.
54
+ - `U` and `R` undo and redo every move at once, and text mode has
55
+ `undo all` and `redo all`. `U` used to be the same as `u`. It keeps the
56
+ clock and redo, where `N` deals the hand again as a new game.
57
+ - A kept game takes its newest 500 undo steps with it, and `U` on a
58
+ longer one says it stopped at the oldest move saved, as does text
59
+ mode's `undo all`.
60
+ - The finish sends the cards up one at a time, and a win bounces them off
61
+ the board. Any key skips either, the boss key still hides everything at
62
+ once, and `--no-animation` or `"animation": false` in config.json turns
63
+ them off.
64
+ - The win banner says when a win is your first of that game or a new best
65
+ time.
66
+ - Themes for the full-screen game: `classic` (the look it always had),
67
+ `dark`, `light` and `contrast`. `t` moves on to the next one and
68
+ remembers it, and `--theme NAME` picks one for a single run. A terminal
69
+ with too few colour pairs for a theme draws the ones it has no room for
70
+ in colours it does have. When `COLORFGBG` says the terminal's
71
+ background is light, `classic` and `contrast` swap the colours that
72
+ would vanish on it for ones that show.
73
+ - A four-colour deck with green clubs and orange diamonds (blue diamonds
74
+ on terminals without 256 colours). `4` turns it on and off, and it's
75
+ remembered too. A terminal without the colour pairs for it says so, and
76
+ the choice is kept for one that has them.
77
+ - The code skin colours its source's keywords, strings and numbers as an
78
+ editor would, in the theme's colours.
79
+ - `+` and `-` lift one card more or fewer while you hold a run, so the
80
+ keyboard can split a run the way a click mid-stack does.
81
+ - `--debug-info` prints what a bug report needs: the versions, the
82
+ terminal, curses and where Soliterm keeps its files. It only reads, and
83
+ leaves every file as it was.
84
+ - `--version`, and `--no-sync` (or `SOLITERM_NO_AISLERIOT=1`) to leave
85
+ AisleRiot's statistics alone for a run.
86
+ - Text mode puts a number on every slot, a hint is a command you can type
87
+ as it stands, a command that does nothing says why, and `N` starts the
88
+ deal over as it does in the full-screen game.
89
+ - Windows, through the windows-curses package, which pip installs there
90
+ by itself.
91
+ - A man page, `soliterm(6)`.
92
+
93
+ ### Changed
94
+
95
+ - The command is `soliterm` now, and settings and statistics live in
96
+ `soliterm` folders under `~/.config` and `~/.local/share`. The first run
97
+ copies aisle-cli's `config.json` and `stats.json` across, once, and
98
+ leaves the old files where they are.
99
+ - Deals come from Soliterm's own shuffle, not Python's, so a number deals
100
+ the same cards on every Python. This means the numbers from aisle-cli
101
+ 1.0.0 deal different cards now. `--seed` still works as another name for
102
+ `--deal`, though `--help` no longer lists it, and numbers run from 0 to
103
+ 2147483647.
104
+ - In the full-screen game, `--deal 5` without `--game` goes straight into
105
+ the game played last instead of the menu, and only that first game is
106
+ deal 5, not every game picked from the menu.
107
+ - SIGHUP and SIGTERM leave the way Ctrl-C does, so the game is kept, and
108
+ the exit status is 130. One ignored already, as `nohup` ignores SIGHUP,
109
+ stays ignored.
110
+ - `--reset-stats` asks first (`--yes` skips the question) and keeps a
111
+ backup of what it clears. It clears the history as well, and every game,
112
+ in AisleRiot's keyfile too when sharing, but leaves saved games alone.
113
+ - Spider deals four suits by default, in AisleRiot's layout, and Golf
114
+ starts with the waste empty, as AisleRiot's does.
115
+ - Autoplay only sends up cards that are safe to send up.
116
+ - A hint can be a move that sets up the next one, and in Spider one that
117
+ fills an empty column so you can deal. When nothing gains, it names a
118
+ plain move that goes somewhere instead of saying no move helps. It
119
+ lights up the whole run it would move, not just the top card, in a
120
+ colour of its own that shows on any background.
121
+ - `o` shows the options before it gives up the game in play. Esc, or
122
+ leaving them as they were, keeps the game, a change mid-game asks
123
+ first, and new options deal the next number, the way `n` does. Where
124
+ Soliterm asks whether to give a game up, only `y` says yes, so an Enter
125
+ too many can't.
126
+ - A game counts from its first move, even if you undo every move. One
127
+ with no moves left offers Undo on its banner and counts as lost only when
128
+ you leave it for a new deal or the menu.
129
+ - The end-of-game banner shows each choice with its key, as in
130
+ `Replay this deal (s)`.
131
+ - In Golf and Triple Peaks, Enter or a click on a card that goes on the
132
+ waste plays it, as a click does in AisleRiot. One that doesn't go is
133
+ picked up as before.
134
+ - The clock ticks on the status line and stops while another screen hides
135
+ the board, and the banner shows the same time the statistics keep.
136
+ - A board that's short of room closes up before it loses anything. A long
137
+ column piles its face-down cards onto one row that counts them and
138
+ keeps every face-up rank in view, the columns beside it squeeze alike,
139
+ and a wide game closes up its fans and the gaps between its columns. A
140
+ board, the menu or a dialog that still doesn't fit says what size it
141
+ needs instead of drawing off the edge.
142
+ - Klondike drawing three fans out the last three cards of the waste, as
143
+ AisleRiot does, and the stock's count sits on the stock itself.
144
+ - The code skin stays on for the menu, the dialogs, the banners and the
145
+ too-small notice, which show as comments in the same file, and draws
146
+ its source in the terminal's own colours instead of a card's black on
147
+ white. Its board sits as high as the plain one, so it takes no rows
148
+ from the cards.
149
+ - When curses can't drive the terminal, or can't load at all, Soliterm
150
+ says why and plays in text mode.
151
+ - `--no-color` and `NO_COLOR` beat the colour saved with `v`, and `--ascii`
152
+ works in the full-screen game as well as in text mode.
153
+
154
+ ### Removed
155
+
156
+ - The `aisle` command and the aisle-cli package. `soliterm` replaces them.
157
+ - Python 3.8. Soliterm needs Python 3.9 or newer.
158
+
159
+ ### Fixed
160
+
161
+ - The menu gives each game a line short enough to show whole at 80
162
+ columns, where most were cut off mid-word, and `--list` uses the same
163
+ line, so it fits in 80 columns too. `--help` sends you to `--list` for
164
+ the game names instead of spelling them all out twice.
165
+ - The help screen no longer says every game builds its foundations up by
166
+ suit, which isn't true of them all.
167
+ - A text-mode game won in one move says `1 move`, not `1 moves`, and
168
+ Spider's status line says `1 deal`, not `1 deals`.
169
+ - Games played while not sharing statistics, for a game this version
170
+ doesn't have, are kept for the version that recorded them instead of
171
+ being dropped.
172
+ - AisleRiot's keyfile is read the way GLib reads it. Each statistic is
173
+ written over the keyfile as it is at that moment, so one AisleRiot saved
174
+ in the meantime isn't put back, and a keyfile that can't be read, or
175
+ isn't valid UTF-8, is left as it is. A game missing from it is rebuilt
176
+ from Soliterm's own record, games played while sharing was off are
177
+ shared once it's back on, and Soliterm says so when it can't write the
178
+ file.
179
+ - Settings and statistics are written whole, so a crash can't leave half a
180
+ file, and a damaged one is kept aside instead of being written over. A
181
+ hand-edited file is read a value at a time, so one bad value doesn't
182
+ lose the rest, and a bad game option falls back to its default.
183
+ - A game kept waiting while another copy of Soliterm finishes with the
184
+ statistics says so, instead of stopping without a word. If Ctrl-C,
185
+ SIGTERM or SIGHUP cuts leaving short while it waits, a note at exit says
186
+ the game was neither saved nor counted, and a deal you haven't touched
187
+ leaves without waiting at all.
188
+ - Rules that had drifted from AisleRiot's: Klondike drawing one no longer
189
+ redeals forever, FreeCell's foundation cards stay out of play, Aces
190
+ can't slide between foundations for points, Eight Off and Forty Thieves
191
+ move only as many cards at once as their free cells or empty columns
192
+ allow, and a Spider game with too few cards left to deal ends. Canfield
193
+ and Bakers Dozen let foundation cards come back down, Canfield counts
194
+ its base card in the score, and Forty Thieves is scored as AisleRiot
195
+ scores it, can send a whole run up in one move, and on a double-click
196
+ puts a card that can't go up onto a column.
197
+ - Statistics are only shared when AisleRiot is there, as its keyfile or
198
+ its `sol` program, and not just because there's a `gnome-games` folder,
199
+ which other GNOME games keep too. Until AisleRiot has run once, the
200
+ statistics screen says they'll be shared from then on.
201
+ - `--reset-stats` only says the statistics are shared with GNOME
202
+ AisleRiot when AisleRiot has a record of one of these games to clear,
203
+ and then says `1 game`, not `1 game(s)`.
204
+ - Double-clicking a foundation sends up every card that can go.
205
+ - In Golf, Triple Peaks and Scorpion, an `f` or a double-click that does
206
+ nothing says why, as those games have no foundations. Text mode's `f`
207
+ does too.
208
+ - The mouse: a slow click picks a card up instead of undoing itself, a
209
+ double-click at a normal speed counts, and a click straight after a
210
+ drag isn't taken for one. Moving the pointer doesn't move the cursor,
211
+ and letting go of a click doesn't move the menu's. A click on the menu
212
+ or a dialog doesn't turn up on the board afterwards, and the banner
213
+ only takes a left click on a choice.
214
+ - The keys: Esc acts at once, and Alt with a key is no longer read as Esc
215
+ and then the key. Help and statistics stay up until a key is pressed.
216
+ The boss key works on every screen, not just the board, and brings you
217
+ back to where you were. Boss mode stays up when the mouse moves or the
218
+ window is resized, and game keys do nothing while the terminal is too
219
+ small to show the board.
220
+ - Hints name cards as the board draws them and no longer tell you to deal
221
+ when you can't, the Spider summary no longer claims that builds must
222
+ follow suit, and the status line catches up after undo and redo.
223
+ - Picking up a run names its card as the board draws it and says
224
+ `2 cards`, not `2 card(s)`.
225
+ - A card dealt from the stock clears the line saying why the move before
226
+ it did nothing.
227
+ - `*** YOU WIN! ***` shows in full on an 80-column status line in every
228
+ game, code skin too, where a long status used to cut it off.
229
+ - The full-screen game starts on terminals that can't hide the cursor and
230
+ on colour terminals without default colours, draws plain cards when the
231
+ locale can't show the suit symbols, and keeps a ten inside its card at
232
+ the narrowest width and in the compact view.
233
+ - Text mode lines the cards up under their tags, times each deal on its
234
+ own clock, counts a game left unfinished from a pipe as lost, uses
235
+ letter suits when the output can't show the symbols, and leaves quietly
236
+ on Ctrl-C or when piped into `head`. Its boss screen hides the board
237
+ properly, with paths that fit the platform.
238
+ - Soliterm starts on Klondike when the game played last no longer exists.
239
+
240
+ ## aisle-cli 1.0.0 - 2026-06-29
241
+
242
+ - Initial release. A dependency-free terminal Solitaire collection, a
243
+ command-line replica of GNOME AisleRiot (`/usr/games/sol`), pure Python 3
244
+ with no third-party packages.
245
+ - **Nine games**: Klondike, Spider (1/2/4 suit), FreeCell, Eight Off, Golf,
246
+ Yukon, Bakers Dozen, Forty Thieves, Canfield.
247
+ - **Curses TUI** with keyboard **and** mouse: arrow-key cursor, click to
248
+ pick up / drop, click mid-stack to split a run, double-click to a foundation
249
+ (or to deal on the stock).
250
+ - **Real overlapping card art**: top card full-size, covered cards peek with
251
+ their rank visible, with a one-key toggle (`x`) to the compact legacy view.
252
+ - **Progress-based hints** (`h`) that only ever suggest a move which advances
253
+ the game, and are provably loop-free.
254
+ - **AisleRiot statistics sharing**: reads from and writes to the installed
255
+ GNOME AisleRiot keyfile, so games played in either program are mirrored in
256
+ both (wins / total / percentage / best & worst time).
257
+ - Live toggles, all persisted: colour on/off (`v`), code-skin play mode (`c`),
258
+ and a boss key (`b` / F2) that hides the board behind fake build output.
259
+ - Restart-this-deal, undo/redo, autoplay, "no moves left" detection, and an
260
+ end-of-game banner with same-deal / new-deal / menu choices.
261
+ - Pipe-friendly text mode (`--text`) and three distribution forms: a zero
262
+ install single-file zipapp, a pip wheel + sdist, and a source archive.
263
+ - 17 test files covering the engine, all nine games' rules, scoring, undo/redo,
264
+ hints, statistics persistence, and the rendering modes.
265
+
266
+ [Unreleased]: https://github.com/bwenstar/soliterm/compare/v1.0.0...HEAD
267
+ [1.0.0]: https://github.com/bwenstar/soliterm/releases/tag/v1.0.0
soliterm-1.0.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Brendan Ta
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,12 @@
1
+ # Ship the whole test suite in the sdist, not just the test_*.py files
2
+ # setuptools picks up by default: conftest.py is what points every test at
3
+ # a throwaway home, so the tests must never travel without it.
4
+ include CHANGELOG.md
5
+ recursive-include tests *.py
6
+ include tools/build_pyz.py tools/keybindings.py tools/screenshots.py
7
+ # tests/test_keybindings_doc.py checks the key page against the code
8
+ include docs/keybindings.md
9
+ # the manual page, which tests/test_man_page.py checks against the code
10
+ include man/soliterm.6
11
+ # SECURITY.md, which tests/test_cli.py checks against --reset-stats
12
+ include SECURITY.md