feat: refactor provider name generation to use incremental naming & enforce unique constraints
parent
23a5ff410e
commit
7364d051d2
@ -0,0 +1,42 @@
|
||||
import logging
|
||||
import re
|
||||
from collections.abc import Sequence
|
||||
from typing import Any
|
||||
|
||||
from core.tools.entities.tool_entities import CredentialType
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def generate_provider_name(
|
||||
providers: Sequence[Any], credential_type: CredentialType, fallback_context: str = "provider"
|
||||
) -> str:
|
||||
try:
|
||||
return generate_incremental_name(
|
||||
[provider.name for provider in providers],
|
||||
f"{credential_type.get_name()}",
|
||||
)
|
||||
except Exception as e:
|
||||
logger.warning(f"Error generating next provider name for {fallback_context}: {str(e)}")
|
||||
return f"{credential_type.get_name()} 1"
|
||||
|
||||
|
||||
def generate_incremental_name(
|
||||
names: Sequence[str],
|
||||
default_pattern: str,
|
||||
) -> str:
|
||||
pattern = rf"^{re.escape(default_pattern)}\s+(\d+)$"
|
||||
numbers = []
|
||||
|
||||
for name in names:
|
||||
if not name:
|
||||
continue
|
||||
match = re.match(pattern, name.strip())
|
||||
if match:
|
||||
numbers.append(int(match.group(1)))
|
||||
|
||||
if not numbers:
|
||||
return f"{default_pattern} 1"
|
||||
|
||||
max_number = max(numbers)
|
||||
return f"{default_pattern} {max_number + 1}"
|
||||
@ -1,35 +0,0 @@
|
||||
import logging
|
||||
import re
|
||||
from collections.abc import Sequence
|
||||
from typing import Any
|
||||
|
||||
from core.tools.entities.tool_entities import CredentialType
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def generate_provider_name(
|
||||
providers: Sequence[Any],
|
||||
credential_type: CredentialType,
|
||||
fallback_context: str = "provider"
|
||||
) -> str:
|
||||
try:
|
||||
default_pattern = f"{credential_type.get_name()}"
|
||||
|
||||
pattern = rf"^{re.escape(default_pattern)}\s+(\d+)$"
|
||||
numbers = []
|
||||
|
||||
for provider in providers:
|
||||
if provider.name:
|
||||
match = re.match(pattern, provider.name.strip())
|
||||
if match:
|
||||
numbers.append(int(match.group(1)))
|
||||
|
||||
if not numbers:
|
||||
return f"{default_pattern} 1"
|
||||
|
||||
max_number = max(numbers)
|
||||
return f"{default_pattern} {max_number + 1}"
|
||||
except Exception as e:
|
||||
logger.warning(f"Error generating next provider name for {fallback_context}: {str(e)}")
|
||||
return f"{credential_type.get_name()} 1"
|
||||
@ -0,0 +1,33 @@
|
||||
"""add_pipeline_info_13
|
||||
|
||||
Revision ID: fcb46171d891
|
||||
Revises: 2008609cf2bb
|
||||
Create Date: 2025-07-18 21:34:31.914500
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import models as models
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = 'fcb46171d891'
|
||||
down_revision = '2008609cf2bb'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
with op.batch_alter_table('datasource_providers', schema=None) as batch_op:
|
||||
batch_op.create_unique_constraint('datasource_provider_unique_name', ['tenant_id', 'plugin_id', 'provider', 'name'])
|
||||
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
with op.batch_alter_table('datasource_providers', schema=None) as batch_op:
|
||||
batch_op.drop_constraint('datasource_provider_unique_name', type_='unique')
|
||||
|
||||
# ### end Alembic commands ###
|
||||
Loading…
Reference in New Issue