Record Workshop versions in Drone changelogs and retire local sending

This commit is contained in:
2026-10-17 17:42:39 +02:00
parent 8f2e1f210d
commit 38fd8f7dd2
10 changed files with 222 additions and 96 deletions
+14
View File
@@ -35,6 +35,20 @@ class SelectionTests(unittest.TestCase):
def test_edit_current_entry(self):
self.assertIn('Corrected feature.', ci.latest_changes(NEW, NEW.replace('New feature.', 'Corrected feature.')))
def test_workshop_version_context_and_no_metadata_only_repost(self):
with_version = NEW.replace('# Changelog\n', '# Changelog\n\nLatest published Workshop version: **0.0.109**\n')
self.assertIn('Last published Workshop version: **0.0.109**', ci.latest_changes(OLD, with_version))
self.assertIsNone(ci.latest_changes(NEW, with_version))
self.assertIsNone(ci.latest_changes(with_version, with_version.replace('0.0.109', '0.0.110')))
for bad in ('not-a-version', '99999.0.0'):
with self.assertRaises(ci.ChangelogError):
ci.latest_changes(OLD, with_version.replace('0.0.109', bad))
def test_version_note_counts_toward_discord_limit(self):
text = '# Changelog\n\nLatest published Workshop version: **0.0.109**\n\n## A\n' + 'x' * 1993
with self.assertRaises(ci.ChangelogError):
ci.latest_changes('', text)
def test_invalid_entries(self):
for text in ('', '# Changelog', '## Empty\n', '## A\nOne\n## A\nTwo', '## Huge\n' + 'x' * 2000,
'## Emoji\n' + '\U0001f680' * 1000):
+44
View File
@@ -0,0 +1,44 @@
"""Version extraction uses the addon asset, not the manifest schema or game version."""
import importlib.util
from pathlib import Path
import unittest
ROOT = Path(__file__).resolve().parents[1]
spec = importlib.util.spec_from_file_location('workshop_changelog', ROOT / 'tools/workshop_changelog.py')
tool = importlib.util.module_from_spec(spec)
spec.loader.exec_module(tool)
PROJECT = 'GameProject { GUID "2528466DE220D91C" }'
TEXT = '# Changelog\n\n## Update\n\n- Gameplay fix.\n'
class WorkshopTests(unittest.TestCase):
def test_asset_version(self):
manifest = {'version': 1, 'asset': {'id': '2528466DE220D91C', 'version': '0.0.109', 'gameVersion': '1.8.0.13'}}
self.assertEqual(tool.bundled_version(manifest, PROJECT), '0.0.109')
def test_reject_wrong_addon_and_invalid_manifest(self):
for manifest in (None, [], {}, {'asset': None}, {'asset': {'id': None}},
{'asset': {'id': 'OTHER', 'version': '0.0.109'}},
{'asset': {'id': '2528466DE220D91C', 'version': '99999.0.0'}},
{'version': '0.0.109', 'asset': {'id': '2528466DE220D91C'}}):
with self.subTest(manifest=manifest), self.assertRaises(ValueError):
tool.bundled_version(manifest, PROJECT)
def test_update_preserves_notes_and_is_idempotent(self):
updated = tool.update_changelog(TEXT, '0.0.109')
self.assertIn('Latest published Workshop version: **0.0.109**', updated)
self.assertTrue(updated.endswith('## Update\n\n- Gameplay fix.\n'))
self.assertEqual(updated, tool.update_changelog(updated, '0.0.109'))
next_release = tool.update_changelog(updated, '0.0.110')
self.assertNotIn('0.0.109', next_release)
self.assertEqual(next_release.count('Latest published Workshop version:'), 1)
def test_bad_layout_refused(self):
for text in ('Notes only', TEXT + 'Latest published Workshop version: **0.0.1**\n',
'# Changelog\nLatest published Workshop version: **0.0.1**\nLatest published Workshop version: **0.0.2**\n'):
with self.subTest(text=text), self.assertRaises(ValueError):
tool.update_changelog(text, '0.0.109')
if __name__ == '__main__':
unittest.main()