Skip to content

Commit 40a0857

Browse files
[DOP-22145] Add file_name_template field (#196)
1 parent 31eaeab commit 40a0857

File tree

10 files changed

+318
-102
lines changed

10 files changed

+318
-102
lines changed

.env.docker

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ TEST_CLICKHOUSE_PORT_FOR_CONFTEST=8123
8181
TEST_CLICKHOUSE_HOST_FOR_WORKER=test-clickhouse
8282
TEST_CLICKHOUSE_PORT_FOR_WORKER=8123
8383
TEST_CLICKHOUSE_USER=default
84-
TEST_CLICKHOUSE_PASSWORD=
84+
TEST_CLICKHOUSE_PASSWORD=test_only
8585
TEST_CLICKHOUSE_DB=default
8686

8787
TEST_MSSQL_HOST_FOR_CONFTEST=test-mssql

.env.local

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export TEST_CLICKHOUSE_PORT_FOR_CONFTEST=8123
6868
export TEST_CLICKHOUSE_HOST_FOR_WORKER=test-clickhouse
6969
export TEST_CLICKHOUSE_PORT_FOR_WORKER=8123
7070
export TEST_CLICKHOUSE_USER=default
71-
export TEST_CLICKHOUSE_PASSWORD=
71+
export TEST_CLICKHOUSE_PASSWORD=test_only
7272
export TEST_CLICKHOUSE_DB=default
7373

7474
export TEST_MSSQL_HOST_FOR_CONFTEST=localhost

docker-compose.test.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ services:
173173
test-clickhouse:
174174
image: clickhouse/clickhouse-server
175175
restart: unless-stopped
176+
environment:
177+
CLICKHOUSE_USER: default
178+
CLICKHOUSE_PASSWORD: test_only
179+
CLICKHOUSE_DB: default
176180
ports:
177181
- 8123:8123
178182
- 9001:9000
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add `file_name_template` field to `target_params`

syncmaster/schemas/v1/transfers/file/base.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class ReadFileTransferTarget(BaseModel):
3333
...,
3434
discriminator="type",
3535
)
36+
file_name_template: str
3637
options: dict[str, Any]
3738

3839

@@ -61,6 +62,10 @@ class CreateFileTransferTarget(BaseModel):
6162
...,
6263
discriminator="type",
6364
)
65+
file_name_template: str = Field(
66+
default="{run_created_at}_{index}.{extension}",
67+
description="Template for file naming with required placeholders 'index' and 'extension'",
68+
)
6469
options: dict[str, Any] = Field(default_factory=dict)
6570

6671
class Config:
@@ -72,3 +77,20 @@ def _directory_path_is_valid_path(cls, value):
7277
if not PurePosixPath(value).is_absolute():
7378
raise ValueError("Directory path must be absolute")
7479
return value
80+
81+
@field_validator("file_name_template")
82+
@classmethod
83+
def validate_file_name_template(cls, value):
84+
required_keys = {"index", "extension"}
85+
placeholders = {key for key in required_keys if f"{{{key}}}" in value}
86+
87+
missing_keys = sorted(required_keys - placeholders)
88+
if missing_keys:
89+
raise ValueError(f"Missing required placeholders: {', '.join(missing_keys)}")
90+
91+
try:
92+
value.format(index="", extension="", run_created_at="", run_id="")
93+
except KeyError as e:
94+
raise ValueError(f"Invalid placeholder: {e}")
95+
96+
return value

0 commit comments

Comments
 (0)