Documentation
* docs(database): remind readers that modifying dicts in loops results in an exception ([`3a247c8`](https://github.com/irtnog/lethbridge/commit/3a247c8032dd27339a18c5069f1d220ec229f950))
Feature
* feat(database): (de-)serialize faction data, matching Spansh&39;s galaxy data dump ([`6a2d8b3`](https://github.com/irtnog/lethbridge/commit/6a2d8b3c3c931e2c991486dd1cd73264292b4851))
* feat(database): pretty print BGS states ([`ecbecde`](https://github.com/irtnog/lethbridge/commit/ecbecdecdfc5e98338812378cb801f7b1fcf34f1))
* feat(database): switch to new-style (Python 3.10+, PEP 604) Union type syntax
This syntax doesn&39;t work with indirect ORM class references, so leave
that one alone.
Also note that the existing `__future__` import should make this
syntax work on Python 3.7+. ([`9bac86f`](https://github.com/irtnog/lethbridge/commit/9bac86fa2f9140670a0f06f5dd8f2acc77404984))
* feat(database): define serialization schemas for factions and BGS states ([`69e64c9`](https://github.com/irtnog/lethbridge/commit/69e64c934b85d9523cd6fb5dae8aa786cec5ef84))
* feat(database): model factions and their BGS states ([`ea70baa`](https://github.com/irtnog/lethbridge/commit/ea70baa9260276706ced2c893209e786a277b13e))
Fix
* fix(database): resize System.population as the default type mapping is too small on PostgreSQL ([`7d7634b`](https://github.com/irtnog/lethbridge/commit/7d7634b3756f95127fea50359110afc23bdf30f9))
* fix(database): sort serialized faction data, again to match Spansh ([`506cd28`](https://github.com/irtnog/lethbridge/commit/506cd28a9e831a97c023bf5b289cf181716cf617))
* fix(database): flatten faction data in BGS state dumps ([`6cb1438`](https://github.com/irtnog/lethbridge/commit/6cb14383cae278dc1d3e98c9f45050cfcc0694e9))
* fix(database): remove the ORM-managed faction name (foreign key) from BGS state dumps ([`b7b5447`](https://github.com/irtnog/lethbridge/commit/b7b54472232d5be193fad6729a8411aaff42ca5b))
* fix(database): avoid copying the output dict if not required ([`daf3693`](https://github.com/irtnog/lethbridge/commit/daf36930ed0d53aac0615e242ce25caa270c7c4c))
* fix(database): resize System.id64 as the default type mapping is too small on PostgreSQL ([`eb8f883`](https://github.com/irtnog/lethbridge/commit/eb8f8834a60a43c2dbac1d59a702b3692ef5b29c))
* fix(database): remove empty columns from the dump, matching Spansh ([`10cb937`](https://github.com/irtnog/lethbridge/commit/10cb9377f30a5c9a42d4824bfac4bfc8a9ef1711))
* fix(database): remove ORM relationship management columns from dumps ([`a2a0a6f`](https://github.com/irtnog/lethbridge/commit/a2a0a6faf7c80d8355a213017ae48d6a912ef4a1))
* fix(database): do not mutate inbound (pre-load) or outbound (post-dump) data structures
This violates the Principle of Least Astonishment. Make copies for
yourself, instead. ([`8771db7`](https://github.com/irtnog/lethbridge/commit/8771db71d184230bd517b7e88b979e99226722da))
* fix(database): exclude foreign keys from system data dumps
Spansh represents relationships using nesting, even though it results
in duplicate copies of the relevant data (e.g., faction name,
allegiance, and government). ([`48c9d86`](https://github.com/irtnog/lethbridge/commit/48c9d860906fcf195def4ee62b85af3b05b38720))
* fix(database): model controlling factions as nullable many-to-one relationships ([`c4b0925`](https://github.com/irtnog/lethbridge/commit/c4b0925ad214cd2cc2c302ad014082004dc0d5b4))
* fix(database): make database re-initialization flag optional ([`b13535f`](https://github.com/irtnog/lethbridge/commit/b13535f3241575cc48a6902769cf0afa854fa25e))
Refactor
* refactor: format Python code using Black ([`8bd018c`](https://github.com/irtnog/lethbridge/commit/8bd018c94eed4c6510763a5e58d4ccc8291d3fca))
* refactor(database): remove unused import ([`aa14c94`](https://github.com/irtnog/lethbridge/commit/aa14c94bb9a86a3e8aecbe524c489841443620ca))
Test
* test(database): log SQL for troubleshooting purposes ([`280cea1`](https://github.com/irtnog/lethbridge/commit/280cea11317a69e0b2b33480a654c4e07b77ca3c))
* test(database): match input date/time format to Marshmallow&39;s default output ([`92389bf`](https://github.com/irtnog/lethbridge/commit/92389bf89f7dfd9026417a2567d17c0f5c165896))
* test: narrow smoke tests to deserialization with fake data ([`b564de9`](https://github.com/irtnog/lethbridge/commit/b564de9ac7680725d7332c76441d0a8fa636d5be))
* test(database): add a smoke test for the System serialization schema ([`7772a55`](https://github.com/irtnog/lethbridge/commit/7772a5538907696c3ae8381f46c67108ac593ef1))
* test(database): rename index variable to better hint at purpose ([`cf7aeed`](https://github.com/irtnog/lethbridge/commit/cf7aeedc286d15a7d7b63ffb9588b4b7c9b7f1f1))
* test: define a set of preliminary tests, currently focused on the database ([`c4e4441`](https://github.com/irtnog/lethbridge/commit/c4e4441b69601eba89b977308a276a522e8b4981))
* test(database): remove unused fixture ([`0ddfd74`](https://github.com/irtnog/lethbridge/commit/0ddfd7446575af375a3984472d101bd64a513d27))
* test: reformat test data using jq for readability ([`baa7b36`](https://github.com/irtnog/lethbridge/commit/baa7b36bc739a1ba92c431913de2f2df9bf4e723))
* test(docker): report on test coverage during the build ([`ea4cc61`](https://github.com/irtnog/lethbridge/commit/ea4cc6145b45fbf82a546aa2a6f460b2e2842d07))
* test(database): skip system data timestamp checks for now ([`953b573`](https://github.com/irtnog/lethbridge/commit/953b573ffba67a9c1299ae54fcb308c0077d30c8))
* test(database): remove unused imports ([`8cb4b8f`](https://github.com/irtnog/lethbridge/commit/8cb4b8f009f004c625e9db6f4d92b10bfcff004e))
* test(database): remove redundant database schema checks
This gets checked by the CLI tests. ([`5d96096`](https://github.com/irtnog/lethbridge/commit/5d96096191287b9cbc6d043844b7b7d25f63565c))
* test(database): use real galaxy map data to test the serialization schema ([`d0902e3`](https://github.com/irtnog/lethbridge/commit/d0902e3d8e457cb3df39327872a675eb810eb60b))
* test(database): parameterize the database URI fixture ([`8160df2`](https://github.com/irtnog/lethbridge/commit/8160df2a85bc7d0eb35a30e797e3dc9665fca8f8))
* test(database): run relationship tests in a separate session/transaction ([`b6869d9`](https://github.com/irtnog/lethbridge/commit/b6869d9cd5480b3309bae09e722769f40eb093b9))
* test(database): verify system/faction/BGS state associations ([`7b56cee`](https://github.com/irtnog/lethbridge/commit/7b56ceea3316a8f1fa7de7b1de9a4bad03256e16))
* test(database): verify integrity constraints and query results ([`43ad80c`](https://github.com/irtnog/lethbridge/commit/43ad80c967dd72cb99ad01e3826075abb3340807))
* test(database): simplify the ORM test ([`132e8e1`](https://github.com/irtnog/lethbridge/commit/132e8e12a288e271f91ab398ede2e8e1c9318b9c))
Unknown
* release: cut the v0.0.2 release ([`8dab70a`](https://github.com/irtnog/lethbridge/commit/8dab70a638b802bbeb57a939e8338df2a399f359))