Name | alembic-postgresql-enum JSON |
Version |
1.7.0
JSON |
| download |
home_page | None |
Summary | Alembic autogenerate support for creation, alteration and deletion of enums |
upload_time | 2025-02-20 08:22:36 |
maintainer | None |
docs_url | None |
author | RustyGuard |
requires_python | <4.0,>=3.7 |
license | MIT |
keywords |
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# alembic-postgresql-enum
[<img src="https://img.shields.io/pypi/pyversions/alembic-postgresql-enum">](https://pypi.org/project/alembic-postgresql-enum/)
[<img src="https://img.shields.io/pypi/v/alembic-postgresql-enum">](https://pypi.org/project/alembic-postgresql-enum/)
[<img src="https://img.shields.io/pypi/l/alembic-postgresql-enum">](https://pypi.org/project/alembic-postgresql-enum/)
Alembic autogenerate support for creation, alteration and deletion of enums
Alembic will now automatically:
- Create enums that currently are not in postgres schema
- Remove/add/alter enum values
- Reorder enum values
- Delete unused enums from schema
If you are curious to know about analogs and reasons for this library to exist see [alternatives and motivation](https://github.com/Pogchamp-company/alembic-postgresql-enum/blob/master/docs/alternatives.md)
## Usage
Install library:
```
pip install alembic-postgresql-enum
```
Add the line:
```python
# env.py
import alembic_postgresql_enum
...
```
To the top of your migrations/env.py file.
## Features
* [Creation of enums](#creation-of-enum)
* [Deletion of unreferenced enums](#deletion-of-unreferenced-enum)
* [Detection of enum values changes](#detection-of-enum-values-changes)
* [Creation of new enum values](#creation-of-new-enum-values)
* [Deletion of enums values](#deletion-of-enums-values)
* [Renaming of enum values](#rename-enum-value)
* [Omitting managing enums](#omitting-managing-enums)
## Creation of enum<a id="creation-of-enum"></a>
### When table is created
```python
class MyEnum(enum.Enum):
one = 1
two = 2
three = 3
class ExampleTable(BaseModel):
test_field = Column(Integer, primary_key=True, autoincrement=False)
enum_field = Column(postgresql.ENUM(MyEnum))
```
This code will generate migration given below:
```python
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
# this line is generated by our library
sa.Enum('one', 'two', 'three', name='myenum').create(op.get_bind())
op.create_table('example_table',
sa.Column('test_field', sa.Integer(), nullable=False),
# create_type=False argument is now present on postgresql.ENUM as library takes care of enum creation
sa.Column('enum_field', postgresql.ENUM('one', 'two', 'three', name='myenum', create_type=False), nullable=True),
sa.PrimaryKeyConstraint('test_field')
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
# drop_table does not drop enum by alembic
op.drop_table('example_table')
# It is dropped by us
sa.Enum('one', 'two', 'three', name='myenum').drop(op.get_bind())
# ### end Alembic commands ###
```
### When column is added
```python
class MyEnum(enum.Enum):
one = 1
two = 2
three = 3
class ExampleTable(BaseModel):
test_field = Column(Integer, primary_key=True, autoincrement=False)
# this column has just been added
enum_field = Column(postgresql.ENUM(MyEnum))
```
This code will generate migration given below:
```python
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
# this line is generated by our library
sa.Enum('one', 'two', 'three', name='myenum').create(op.get_bind())
# create_type=False argument is now present on postgresql.ENUM as library takes care of enum creation
op.add_column('example_table', sa.Column('enum_field', postgresql.ENUM('one', 'two', 'three', name='myenum', create_type=False), nullable=False))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('example_table', 'enum_field')
# enum is explicitly dropped as it is no longer used
sa.Enum('one', 'two', 'three', name='myenum').drop(op.get_bind())
# ### end Alembic commands ###
```
## Deletion of unreferenced enum<a id="deletion-of-unreferenced-enum"></a>
If enum is defined in postgres schema, but its mentions removed from code - It will be automatically removed
```python
class ExampleTable(BaseModel):
test_field = Column(Integer, primary_key=True, autoincrement=False)
# enum_field is removed from table
```
```python
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('example_table', 'enum_field')
sa.Enum('one', 'two', 'four', name='myenum').drop(op.get_bind())
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
sa.Enum('one', 'two', 'four', name='myenum').create(op.get_bind())
op.add_column('example_table', sa.Column('enum_field', postgresql.ENUM('one', 'two', 'four', name='myenum', create_type=False), autoincrement=False, nullable=True))
# ### end Alembic commands ###
```
## Detection of enum values changes<a id="detection-of-enum-values-changes"></a>
***Can be disabled with `detect_enum_values_changes` configuration flag turned off***
### Creation of new enum values<a id="creation-of-new-enum-values"></a>
If new enum value is defined sync_enum_values function call will be added to migration to account for it
```python
class MyEnum(enum.Enum):
one = 1
two = 2
three = 3
four = 4 # New enum value
```
```python
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values(
enum_schema='public',
enum_name='myenum',
new_values=['one', 'two', 'three', 'four'],
affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],
enum_values_to_rename=[],
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values(
enum_schema='public',
enum_name='myenum',
new_values=['one', 'two', 'three'],
affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],
enum_values_to_rename=[],
)
# ### end Alembic commands ###
```
### Deletion of enums values<a id="deletion-of-enums-values"></a>
If enum value is removed it also will be detected
```python
class MyEnum(enum.Enum):
one = 1
two = 2
# three = 3 removed
```
```python
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values(
enum_schema='public',
enum_name='myenum',
new_values=['one', 'two'],
affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],
enum_values_to_rename=[],
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values(
enum_schema='public',
enum_name='myenum',
new_values=['one', 'two', 'three'],
affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],
enum_values_to_rename=[],
)
# ### end Alembic commands ###
```
### Rename enum value<a id="rename-enum-value"></a>
In this case you must manually edit migration
```python
class MyEnum(enum.Enum):
one = 1
two = 2
three = 3 # renamed from `tree`
```
This code will generate this migration:
```python
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values(
enum_schema='public',
enum_name='myenum',
new_values=['one', 'two', 'three'],
affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],
enum_values_to_rename=[],
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values(
enum_schema='public',
enum_name='myenum',
new_values=['one', 'two', 'tree'],
affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],
enum_values_to_rename=[],
)
# ### end Alembic commands ###
```
This migration will cause problems with existing rows that references MyEnum
So adjust migration like that
```python
def upgrade():
op.sync_enum_values(
enum_schema='public',
enum_name='myenum',
new_values=['one', 'two', 'three'],
affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],
enum_values_to_rename=[('tree', 'three')],
)
def downgrade():
op.sync_enum_values(
enum_schema='public',
enum_name='myenum',
new_values=['one', 'two', 'tree'],
affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],
enum_values_to_rename=[('three', 'tree')],
)
```
Do not forget to switch places old and new values for downgrade
All defaults in postgres will be renamed automatically as well
## Omitting managing enums<a id="omitting-managing-enums"></a>
If configured `include_name` function returns `False` given enum will be not managed.
```python
import alembic_postgresql_enum
def include_name(name: str) -> bool:
return name not in ['enum-to-ignore', 'some-internal-enum']
alembic_postgresql_enum.set_configuration(
alembic_postgresql_enum.Config(
include_name=include_name,
)
)
```
Feature is similar to [sqlalchemy feature for tables](https://alembic.sqlalchemy.org/en/latest/autogenerate.html#omitting-table-names-from-the-autogenerate-process)
## Configuration
You can configure this extension to disable parts of it, or to enable some feature flags
To do so you need to call set_configuration function after the import:
```python
import alembic_postgresql_enum
alembic_postgresql_enum.set_configuration(
alembic_postgresql_enum.Config(
add_type_ignore=True,
)
)
```
Available options:
- `add_type_ignore` (`False` by default) - flag that can be turned on
to add `# type: ignore[attr-defined]` at the end of generated `op.sync_enum_values` calls.
This is helpful if you are using type checker such as `mypy`.
`type: ignore` is needed because there is no way to add new function to an existing alembic's `op`.
- `include_name` (`lambda _: True` bby default) - it adds ability to ignore process enum by name in similar way alembic allows to define `include_name` function.
This property accepts function that takes enum name and returns whether it should be processed.
- `drop_unused_enums` (`True` by default) - feature flag that can be turned off to disable clean up of undeclared enums
- `detect_enum_values_changes` (`True` by default) - feature flag that can be turned off to disable generation of `op.sync_enum_values`.
- `force_dialect_support` (`False` by default) - if you are using one of the postgresql dialects
you can activate the library with this flag. **WARNING** we do not guarantee the performance of our extension with this flag enabled.
Raw data
{
"_id": null,
"home_page": null,
"name": "alembic-postgresql-enum",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.7",
"maintainer_email": null,
"keywords": null,
"author": "RustyGuard",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/f9/45/d3a66a8c7604baba5b498727539539120897fd8f931a6c89aa68ff0d7cb3/alembic_postgresql_enum-1.7.0.tar.gz",
"platform": null,
"description": "# alembic-postgresql-enum\n[<img src=\"https://img.shields.io/pypi/pyversions/alembic-postgresql-enum\">](https://pypi.org/project/alembic-postgresql-enum/)\n[<img src=\"https://img.shields.io/pypi/v/alembic-postgresql-enum\">](https://pypi.org/project/alembic-postgresql-enum/)\n[<img src=\"https://img.shields.io/pypi/l/alembic-postgresql-enum\">](https://pypi.org/project/alembic-postgresql-enum/)\n\nAlembic autogenerate support for creation, alteration and deletion of enums\n\nAlembic will now automatically:\n- Create enums that currently are not in postgres schema\n- Remove/add/alter enum values\n- Reorder enum values\n- Delete unused enums from schema\n\nIf you are curious to know about analogs and reasons for this library to exist see [alternatives and motivation](https://github.com/Pogchamp-company/alembic-postgresql-enum/blob/master/docs/alternatives.md)\n\n## Usage\n\nInstall library:\n```\npip install alembic-postgresql-enum\n```\n\nAdd the line:\n\n```python \n# env.py\nimport alembic_postgresql_enum\n...\n```\n\nTo the top of your migrations/env.py file.\n\n## Features\n\n* [Creation of enums](#creation-of-enum)\n* [Deletion of unreferenced enums](#deletion-of-unreferenced-enum)\n* [Detection of enum values changes](#detection-of-enum-values-changes)\n * [Creation of new enum values](#creation-of-new-enum-values)\n * [Deletion of enums values](#deletion-of-enums-values)\n * [Renaming of enum values](#rename-enum-value)\n* [Omitting managing enums](#omitting-managing-enums)\n\n## Creation of enum<a id=\"creation-of-enum\"></a>\n\n### When table is created\n\n```python\nclass MyEnum(enum.Enum):\n one = 1\n two = 2\n three = 3\n\n\nclass ExampleTable(BaseModel):\n test_field = Column(Integer, primary_key=True, autoincrement=False)\n enum_field = Column(postgresql.ENUM(MyEnum)) \n```\nThis code will generate migration given below: \n```python\ndef upgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n # this line is generated by our library\n sa.Enum('one', 'two', 'three', name='myenum').create(op.get_bind())\n op.create_table('example_table',\n sa.Column('test_field', sa.Integer(), nullable=False),\n # create_type=False argument is now present on postgresql.ENUM as library takes care of enum creation\n sa.Column('enum_field', postgresql.ENUM('one', 'two', 'three', name='myenum', create_type=False), nullable=True),\n sa.PrimaryKeyConstraint('test_field')\n )\n # ### end Alembic commands ###\n\n\ndef downgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n # drop_table does not drop enum by alembic\n op.drop_table('example_table')\n # It is dropped by us\n sa.Enum('one', 'two', 'three', name='myenum').drop(op.get_bind())\n # ### end Alembic commands ###\n```\n\n### When column is added\n```python\nclass MyEnum(enum.Enum):\n one = 1\n two = 2\n three = 3\n\n\nclass ExampleTable(BaseModel):\n test_field = Column(Integer, primary_key=True, autoincrement=False)\n # this column has just been added\n enum_field = Column(postgresql.ENUM(MyEnum)) \n```\nThis code will generate migration given below: \n```python\ndef upgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n # this line is generated by our library\n sa.Enum('one', 'two', 'three', name='myenum').create(op.get_bind())\n # create_type=False argument is now present on postgresql.ENUM as library takes care of enum creation\n op.add_column('example_table', sa.Column('enum_field', postgresql.ENUM('one', 'two', 'three', name='myenum', create_type=False), nullable=False))\n # ### end Alembic commands ###\n\n\ndef downgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_column('example_table', 'enum_field')\n # enum is explicitly dropped as it is no longer used\n sa.Enum('one', 'two', 'three', name='myenum').drop(op.get_bind())\n # ### end Alembic commands ###\n```\n\n## Deletion of unreferenced enum<a id=\"deletion-of-unreferenced-enum\"></a>\nIf enum is defined in postgres schema, but its mentions removed from code - It will be automatically removed\n```python\nclass ExampleTable(BaseModel):\n test_field = Column(Integer, primary_key=True, autoincrement=False)\n # enum_field is removed from table\n```\n\n```python\ndef upgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_column('example_table', 'enum_field')\n sa.Enum('one', 'two', 'four', name='myenum').drop(op.get_bind())\n # ### end Alembic commands ###\n\n\ndef downgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n sa.Enum('one', 'two', 'four', name='myenum').create(op.get_bind())\n op.add_column('example_table', sa.Column('enum_field', postgresql.ENUM('one', 'two', 'four', name='myenum', create_type=False), autoincrement=False, nullable=True))\n # ### end Alembic commands ###\n```\n\n## Detection of enum values changes<a id=\"detection-of-enum-values-changes\"></a>\n\n***Can be disabled with `detect_enum_values_changes` configuration flag turned off***\n\n### Creation of new enum values<a id=\"creation-of-new-enum-values\"></a>\n\nIf new enum value is defined sync_enum_values function call will be added to migration to account for it\n\n```python\nclass MyEnum(enum.Enum):\n one = 1\n two = 2\n three = 3\n four = 4 # New enum value\n```\n\n```python\ndef upgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n op.sync_enum_values(\n enum_schema='public', \n enum_name='myenum', \n new_values=['one', 'two', 'three', 'four'], \n affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],\n enum_values_to_rename=[],\n )\n # ### end Alembic commands ###\n\n\ndef downgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n op.sync_enum_values(\n enum_schema='public', \n enum_name='myenum', \n new_values=['one', 'two', 'three'], \n affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],\n enum_values_to_rename=[],\n )\n # ### end Alembic commands ###\n```\n\n### Deletion of enums values<a id=\"deletion-of-enums-values\"></a>\n\nIf enum value is removed it also will be detected\n\n```python\nclass MyEnum(enum.Enum):\n one = 1\n two = 2\n # three = 3 removed\n```\n\n```python\ndef upgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n op.sync_enum_values(\n enum_schema='public', \n enum_name='myenum', \n new_values=['one', 'two'], \n affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],\n enum_values_to_rename=[],\n )\n # ### end Alembic commands ###\n\n\ndef downgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n op.sync_enum_values(\n enum_schema='public', \n enum_name='myenum', \n new_values=['one', 'two', 'three'], \n affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],\n enum_values_to_rename=[],\n )\n # ### end Alembic commands ###\n```\n\n\n### Rename enum value<a id=\"rename-enum-value\"></a>\nIn this case you must manually edit migration\n\n```python\nclass MyEnum(enum.Enum):\n one = 1\n two = 2\n three = 3 # renamed from `tree`\n```\n\nThis code will generate this migration:\n```python\ndef upgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n op.sync_enum_values(\n enum_schema='public', \n enum_name='myenum', \n new_values=['one', 'two', 'three'], \n affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],\n enum_values_to_rename=[],\n )\n # ### end Alembic commands ###\n\n\ndef downgrade():\n # ### commands auto generated by Alembic - please adjust! ###\n op.sync_enum_values(\n enum_schema='public', \n enum_name='myenum', \n new_values=['one', 'two', 'tree'], \n affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],\n enum_values_to_rename=[],\n )\n # ### end Alembic commands ###\n```\n\nThis migration will cause problems with existing rows that references MyEnum\n\nSo adjust migration like that\n\n```python\ndef upgrade():\n op.sync_enum_values(\n enum_schema='public', \n enum_name='myenum', \n new_values=['one', 'two', 'three'], \n affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],\n enum_values_to_rename=[('tree', 'three')],\n )\n\n\ndef downgrade():\n op.sync_enum_values(\n enum_schema='public', \n enum_name='myenum', \n new_values=['one', 'two', 'tree'], \n affected_columns=[TableReference(table_schema='public', table_name='example_table', column_name='enum_field')],\n enum_values_to_rename=[('three', 'tree')],\n )\n```\n\nDo not forget to switch places old and new values for downgrade\n\nAll defaults in postgres will be renamed automatically as well\n\n## Omitting managing enums<a id=\"omitting-managing-enums\"></a>\n\nIf configured `include_name` function returns `False` given enum will be not managed.\n```python\nimport alembic_postgresql_enum\n\ndef include_name(name: str) -> bool:\n return name not in ['enum-to-ignore', 'some-internal-enum']\n\nalembic_postgresql_enum.set_configuration(\n alembic_postgresql_enum.Config(\n include_name=include_name,\n )\n)\n```\n\nFeature is similar to [sqlalchemy feature for tables](https://alembic.sqlalchemy.org/en/latest/autogenerate.html#omitting-table-names-from-the-autogenerate-process)\n\n## Configuration\n\nYou can configure this extension to disable parts of it, or to enable some feature flags\n\nTo do so you need to call set_configuration function after the import:\n\n```python\nimport alembic_postgresql_enum\n\nalembic_postgresql_enum.set_configuration(\n alembic_postgresql_enum.Config(\n add_type_ignore=True,\n )\n)\n```\n\nAvailable options:\n\n- `add_type_ignore` (`False` by default) - flag that can be turned on \nto add `# type: ignore[attr-defined]` at the end of generated `op.sync_enum_values` calls.\nThis is helpful if you are using type checker such as `mypy`.\n`type: ignore` is needed because there is no way to add new function to an existing alembic's `op`.\n\n- `include_name` (`lambda _: True` bby default) - it adds ability to ignore process enum by name in similar way alembic allows to define `include_name` function. \nThis property accepts function that takes enum name and returns whether it should be processed. \n\n- `drop_unused_enums` (`True` by default) - feature flag that can be turned off to disable clean up of undeclared enums\n\n- `detect_enum_values_changes` (`True` by default) - feature flag that can be turned off to disable generation of `op.sync_enum_values`.\n\n- `force_dialect_support` (`False` by default) - if you are using one of the postgresql dialects \nyou can activate the library with this flag. **WARNING** we do not guarantee the performance of our extension with this flag enabled.\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Alembic autogenerate support for creation, alteration and deletion of enums",
"version": "1.7.0",
"project_urls": {
"Source code": "https://github.com/Pogchamp-company/alembic-postgresql-enum"
},
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7d9a05d3f24be838af98f52e2a961f1f78f8575091198542a2add5cff7d62ef8",
"md5": "5f913284a7505c84430354e4a977324f",
"sha256": "2a64260f3f1ed96f1bf984f55cb838e5d915693b8478b7b6ffea13cc09184ae0"
},
"downloads": -1,
"filename": "alembic_postgresql_enum-1.7.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "5f913284a7505c84430354e4a977324f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.7",
"size": 23516,
"upload_time": "2025-02-20T08:22:34",
"upload_time_iso_8601": "2025-02-20T08:22:34.239414Z",
"url": "https://files.pythonhosted.org/packages/7d/9a/05d3f24be838af98f52e2a961f1f78f8575091198542a2add5cff7d62ef8/alembic_postgresql_enum-1.7.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f945d3a66a8c7604baba5b498727539539120897fd8f931a6c89aa68ff0d7cb3",
"md5": "69b3be9124ac9010f5ca354bb6956dad",
"sha256": "1a12a2b25f3f49440f419821888530496511573875438b6e9a08cbcb8a6f006f"
},
"downloads": -1,
"filename": "alembic_postgresql_enum-1.7.0.tar.gz",
"has_sig": false,
"md5_digest": "69b3be9124ac9010f5ca354bb6956dad",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.7",
"size": 15637,
"upload_time": "2025-02-20T08:22:36",
"upload_time_iso_8601": "2025-02-20T08:22:36.285870Z",
"url": "https://files.pythonhosted.org/packages/f9/45/d3a66a8c7604baba5b498727539539120897fd8f931a6c89aa68ff0d7cb3/alembic_postgresql_enum-1.7.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-20 08:22:36",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Pogchamp-company",
"github_project": "alembic-postgresql-enum",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "alembic-postgresql-enum"
}