3
0
Fork 0

feat: add basic views for Alembic Migrations, Dashboard

can see all "known" migration revisions (per alembic config), and
migrate the DB arbitrarily via alembic upgrade/downgrade
This commit is contained in:
Lance Edgar 2025-12-22 17:35:07 -06:00
parent 6791abe96f
commit 3e7aa1fa0b
15 changed files with 1151 additions and 8 deletions

View file

@ -432,3 +432,98 @@ class TestBatchIdWidget(WebTestCase):
result = widget.serialize(field, 42)
self.assertEqual(result, "00000042")
class TestAlembicRevisionWidget(WebTestCase):
def setUp(self):
super().setUp()
self.pyramid_config.add_route(
"alembic.migrations.view", "/alembic/migrations/{revision}"
)
def make_field(self, node, **kwargs):
# TODO: not sure why default renderer is in use even though
# pyramid_deform was included in setup? but this works..
kwargs.setdefault("renderer", deform.Form.default_renderer)
return deform.Field(node, **kwargs)
def make_widget(self, **kwargs):
return mod.AlembicRevisionWidget(self.request, **kwargs)
def test_serialize(self):
node = colander.SchemaNode(colander.String())
field = self.make_field(node)
widget = self.make_widget()
html = widget.serialize(field, colander.null)
self.assertIs(html, colander.null)
html = widget.serialize(field, None)
self.assertIs(html, colander.null)
html = widget.serialize(field, "")
self.assertIs(html, colander.null)
html = widget.serialize(field, "fc3a3bcaa069")
self.assertEqual(
html,
'<a href="http://example.com/alembic/migrations/fc3a3bcaa069">fc3a3bcaa069</a>',
)
def test_deserialize(self):
node = colander.SchemaNode(colander.String())
field = self.make_field(node)
widget = self.make_widget()
self.assertRaises(
NotImplementedError, widget.deserialize, field, "fc3a3bcaa069"
)
class TestAlembicRevisionsWidget(WebTestCase):
def setUp(self):
super().setUp()
self.pyramid_config.add_route(
"alembic.migrations.view", "/alembic/migrations/{revision}"
)
def make_field(self, node, **kwargs):
# TODO: not sure why default renderer is in use even though
# pyramid_deform was included in setup? but this works..
kwargs.setdefault("renderer", deform.Form.default_renderer)
return deform.Field(node, **kwargs)
def make_widget(self, **kwargs):
return mod.AlembicRevisionsWidget(self.request, **kwargs)
def test_serialize(self):
node = colander.SchemaNode(colander.String())
field = self.make_field(node)
widget = self.make_widget()
html = widget.serialize(field, colander.null)
self.assertIs(html, colander.null)
html = widget.serialize(field, None)
self.assertIs(html, colander.null)
html = widget.serialize(field, "")
self.assertIs(html, colander.null)
html = widget.serialize(field, "fc3a3bcaa069")
self.assertEqual(
html,
'<a href="http://example.com/alembic/migrations/fc3a3bcaa069">fc3a3bcaa069</a>',
)
html = widget.serialize(field, "fc3a3bcaa069, d686f7abe3e0")
self.assertEqual(
html,
'<a href="http://example.com/alembic/migrations/fc3a3bcaa069">fc3a3bcaa069</a>, '
'<a href="http://example.com/alembic/migrations/d686f7abe3e0">d686f7abe3e0</a>',
)
def test_deserialize(self):
node = colander.SchemaNode(colander.String())
field = self.make_field(node)
widget = self.make_widget()
self.assertRaises(
NotImplementedError, widget.deserialize, field, "fc3a3bcaa069"
)