Skip to content

Config

sereto.cli.config

_get_dates_table(version_config, version)

Get table of dates from specified VersionConfig.

Source code in sereto/cli/config.py
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
@validate_call
def _get_dates_table(version_config: VersionConfigModel, version: ProjectVersion) -> Table:
    """Get table of dates from specified VersionConfig."""
    table = Table(
        "%",
        "Type",
        "From",
        "To",
        title=f"Dates {version}",
        box=box.MINIMAL,
    )

    for ix, date in enumerate(version_config.dates, start=1):
        match date.date:
            case SeretoDate():
                table.add_row(str(ix), date.type.value, str(date.date), "[yellow]n/a")
            case DateRange():
                table.add_row(
                    str(ix),
                    date.type.value,
                    str(date.date.start),
                    str(date.date.end),
                )

    return table

_get_person_table(version_config, version)

Get table of people from specified VersionConfig.

Source code in sereto/cli/config.py
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
@validate_call
def _get_person_table(version_config: VersionConfigModel, version: ProjectVersion) -> Table:
    """Get table of people from specified VersionConfig."""
    table = Table(
        "%",
        "Type",
        "Name",
        "BU",
        "Email",
        "Role",
        title=f"People {version}",
        box=box.MINIMAL,
    )

    for ix, person in enumerate(version_config.people, start=1):
        table.add_row(
            str(ix),
            person.type,
            person.name if person.name is not None else "[yellow]n/a",
            (person.business_unit if person.business_unit is not None else "[yellow]n/a"),
            person.email if person.email is not None else "[yellow]n/a",
            person.role if person.role is not None else "[yellow]n/a",
        )

    return table

_get_target_table(version_config, version)

Get table of targets from specified VersionConfig.

Source code in sereto/cli/config.py
344
345
346
347
348
349
350
351
352
353
354
355
356
357
@validate_call
def _get_target_table(version_config: VersionConfigModel, version: ProjectVersion) -> Table:
    """Get table of targets from specified VersionConfig."""
    table = Table(
        "%",
        "Category",
        "Name",
        title=f"Targets {version}",
        box=box.MINIMAL,
    )
    for ix, target in enumerate(version_config.targets, start=1):
        table.add_row(str(ix), target.category, target.name)

    return table

add_dates_config(config, version=None)

Add date to the configuration.

Parameters:

Name Type Description Default
config Config

Configuration of the project.

required
version ProjectVersion | None

The version of the project. If not provided, the last version is used.

None
Source code in sereto/cli/config.py
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
@validate_call
def add_dates_config(config: Config, version: ProjectVersion | None = None) -> None:
    """Add date to the configuration.

    Args:
        config: Configuration of the project.
        version: The version of the project. If not provided, the last version is used.
    """
    if version is None:
        version = config.last_version

    # Prompt user for the date
    date_type: DateType = load_enum(enum=DateType, message="Type:")
    new_date = prompt_user_for_date(date_type=date_type)

    # Add the date to the configuration
    config.at_version(version).add_date(Date(type=date_type, date=new_date))

    # Write the configuration
    config.save()

add_people_config(config, version=None)

Add person to the configuration.

Parameters:

Name Type Description Default
config Config

Configuration of the project.

required
version ProjectVersion | None

The version of the project. If not provided, the last version is used.

None
Source code in sereto/cli/config.py
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
@validate_call
def add_people_config(config: Config, version: ProjectVersion | None = None) -> None:
    """Add person to the configuration.

    Args:
        config: Configuration of the project.
        version: The version of the project. If not provided, the last version is used.
    """
    if version is None:
        version = config.last_version

    # Prompt user for the person
    person_type: PersonType = load_enum(enum=PersonType, message="Type:")
    new_person = prompt_user_for_person(person_type=person_type)

    # Add the person to the configuration
    config.at_version(version).add_person(new_person)

    # Write the configuration
    config.save()

add_target(project_path, templates, config, categories, version=None)

Add target to the configuration.

Parameters:

Name Type Description Default
project_path DirectoryPath

Path to the project directory.

required
templates DirectoryPath

Path to the templates directory.

required
config Config

Configuration of the project.

required
categories Iterable[str]

List of all categories.

required
version ProjectVersion | None

The version of the project. If not provided, the last version is used.

None
Source code in sereto/cli/config.py
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
@validate_call
def add_target(
    project_path: DirectoryPath,
    templates: DirectoryPath,
    config: Config,
    categories: Iterable[str],
    version: ProjectVersion | None = None,
) -> None:
    """Add target to the configuration.

    Args:
        project_path: Path to the project directory.
        templates: Path to the templates directory.
        config: Configuration of the project.
        categories: List of all categories.
        version: The version of the project. If not provided, the last version is used.
    """
    if version is None:
        version = config.last_version

    # Prompt user for the target details
    new_target_model = prompt_user_for_target(categories=categories)

    # Create the target instance, including on the filesystem
    new_target = Target.new(data=new_target_model, project_path=project_path, templates=templates, version=version)

    # Add the target to the configuration
    config.at_version(version).add_target(new_target)

    # Write the configuration
    config.save()

delete_target(config, index, version=None, interactive=False)

Delete target from the configuration by its index.

Parameters:

Name Type Description Default
config Config

Configuration of the project.

required
index int

Index to item which should be deleted. First item is 1.

required
version ProjectVersion | None

The version of the project. If not provided, the last version is used.

None
interactive bool

Whether to ask for confirmations.

False
Source code in sereto/cli/config.py
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
@validate_call
def delete_target(
    config: Config, index: int, version: ProjectVersion | None = None, interactive: bool = False
) -> None:
    """Delete target from the configuration by its index.

    Args:
        config: Configuration of the project.
        index: Index to item which should be deleted. First item is 1.
        version: The version of the project. If not provided, the last version is used.
        interactive: Whether to ask for confirmations.
    """
    if version is None:
        version = config.last_version

    # Extract the filesystem path before deleting the values
    version_config = config.at_version(version)
    target_path = version_config.targets[index - 1].path

    # Delete the date from the configuration
    version_config.delete_target(index=index)

    # Write the configuration
    config.save()

    # Delete target from the filesystem
    if (
        target_path.is_dir()
        and interactive
        and yes_no_dialog(title="Confirm", text=f"Delete '{target_path}' from the filesystem?").run()
    ):
        shutil.rmtree(target_path)

edit_config(project)

Edit the configuration file in default CLI editor.

Parameters:

Name Type Description Default
project Project

Project's representation.

required
Source code in sereto/cli/config.py
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@validate_call
def edit_config(project: Project) -> None:
    """Edit the configuration file in default CLI editor.

    Args:
        project: Project's representation.
    """
    sereto_ver = importlib.metadata.version("sereto")
    config = project.config_path

    # If the config file does not exist, create it with default values
    if not project.config_path.is_file():
        Config(
            sereto_version=SeretoVersion.from_str(sereto_ver),
            version_configs={
                ProjectVersion.from_str("v1.0"): VersionConfig(
                    version=ProjectVersion.from_str("v1.0"),
                    id="",
                    name="",
                    version_description="Initial",
                ),
            },
            path=project.config_path,
        ).save()

    # Open the config file in the default editor
    click.edit(filename=str(config))

show_config(config, output_format, all=False, version=None)

Display the configuration for a project.

Parameters:

Name Type Description Default
config Config

Configuration of the project.

required
output_format OutputFormat

Format of the output.

required
all bool

Whether to show values from all versions or just the last one.

False
version ProjectVersion | None

Show config at specific version, e.g. 'v1.0'.

None
Source code in sereto/cli/config.py
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
@validate_call
def show_config(
    config: Config, output_format: OutputFormat, all: bool = False, version: ProjectVersion | None = None
) -> None:
    """Display the configuration for a project.

    Args:
        config: Configuration of the project.
        output_format: Format of the output.
        all: Whether to show values from all versions or just the last one.
        version: Show config at specific version, e.g. 'v1.0'.
    """
    if version is None:
        version = config.last_version

    version_config = config.at_version(version)

    match output_format:
        case OutputFormat.table:
            Console().print(f"\n\n[blue]{version_config.id} - {version_config.name}\n", justify="center")
            show_targets_config(config=config, output_format=OutputFormat.table, all=all, version=version)
            show_dates_config(config=config, output_format=OutputFormat.table, all=all, version=version)
            show_people_config(config=config, output_format=OutputFormat.table, all=all, version=version)
        case OutputFormat.json:
            if all:
                Console().print_json(config.to_model().model_dump_json())
            else:
                Console().print_json(version_config.to_model().model_dump_json())

show_dates_config(config, output_format, all, version)

Display the configured dates.

By default, if neither of version and all arguments are used, dates from the latest version are displayed.

Parameters:

Name Type Description Default
config Config

Configuration of the project.

required
output_format OutputFormat

Select format of the output.

required
all bool

Show dates from all versions.

required
version ProjectVersion | None

Show dates from specific version.

required
Source code in sereto/cli/config.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
@validate_call
def show_dates_config(
    config: Config,
    output_format: OutputFormat,
    all: bool,
    version: ProjectVersion | None,
) -> None:
    """Display the configured dates.

    By default, if neither of `version` and `all` arguments are used, dates from the latest version are displayed.

    Args:
        config: Configuration of the project.
        output_format: Select format of the output.
        all: Show dates from all versions.
        version: Show dates from specific version.
    """
    if version is None:
        version = config.last_version

    match output_format:
        case OutputFormat.table:
            for ver in config.versions if all else [version]:
                Console().line()
                table = _get_dates_table(version_config=config.at_version(version=ver).to_model(), version=ver)
                Console().print(table, justify="center")
        case OutputFormat.json:
            DateList: TypeAdapter[list[Date]] = TypeAdapter(list[Date])
            DateAll: TypeAdapter[dict[str, list[Date]]] = TypeAdapter(dict[str, list[Date]])

            if all:
                all_dates = DateAll.validate_python(
                    {str(ver): config.at_version(version=ver).dates for ver in config.versions}
                )
                Console().print_json(DateAll.dump_json(all_dates).decode("utf-8"))
            else:
                dates = DateList.validate_python(config.at_version(version).dates)
                Console().print_json(DateList.dump_json(dates).decode("utf-8"))

show_people_config(config, output_format, all, version)

Display the configured people.

By default, if neither of version and all arguments are used, people from the latest version are displayed.

Parameters:

Name Type Description Default
config Config

Configuration of the project.

required
output_format OutputFormat

Select format of the output.

required
all bool

Show people from all versions.

required
version ProjectVersion | None

Show people from specific version.

required
Source code in sereto/cli/config.py
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
@validate_call
def show_people_config(config: Config, output_format: OutputFormat, all: bool, version: ProjectVersion | None) -> None:
    """Display the configured people.

    By default, if neither of `version` and `all` arguments are used, people from the latest version are displayed.

    Args:
        config: Configuration of the project.
        output_format: Select format of the output.
        all: Show people from all versions.
        version: Show people from specific version.
    """
    if version is None:
        version = config.last_version

    match output_format:
        case OutputFormat.table:
            for ver in config.versions if all else [version]:
                Console().line()
                table = _get_person_table(version_config=config.at_version(version=ver).to_model(), version=ver)
                Console().print(table, justify="center")
        case OutputFormat.json:
            PersonList: TypeAdapter[list[Person]] = TypeAdapter(list[Person])
            PersonAll: TypeAdapter[dict[str, list[Person]]] = TypeAdapter(dict[str, list[Person]])

            if all:
                all_people = PersonAll.validate_python(
                    {str(ver): config.at_version(version=ver).people for ver in config.versions}
                )
                Console().print_json(PersonAll.dump_json(all_people).decode("utf-8"))
            else:
                people = PersonList.validate_python(config.at_version(version).people)
                Console().print_json(PersonList.dump_json(people).decode("utf-8"))

show_targets_config(config, output_format, all, version)

Display the configured targets.

By default, if neither of version and all arguments are used, targets from the latest version are displayed.

Parameters:

Name Type Description Default
config Config

Configuration of the project.

required
output_format OutputFormat

Select format of the output.

required
all bool

Show targets from all versions.

required
version ProjectVersion | None

Show targets from the specified project's version.

required
Source code in sereto/cli/config.py
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
@validate_call
def show_targets_config(
    config: Config, output_format: OutputFormat, all: bool, version: ProjectVersion | None
) -> None:
    """Display the configured targets.

    By default, if neither of `version` and `all` arguments are used, targets from the latest version are displayed.

    Args:
        config: Configuration of the project.
        output_format: Select format of the output.
        all: Show targets from all versions.
        version: Show targets from the specified project's version.
    """
    if version is None:
        version = config.last_version

    match output_format:
        case OutputFormat.table:
            for ver in config.versions if all else [version]:
                Console().line()
                table = _get_target_table(version_config=config.at_version(version=ver).to_model(), version=ver)
                Console().print(table, justify="center")
        case OutputFormat.json:
            TargetList: TypeAdapter[list[TargetModel]] = TypeAdapter(list[TargetModel])
            TargetAll: TypeAdapter[dict[str, list[TargetModel]]] = TypeAdapter(dict[str, list[TargetModel]])

            if all:
                all_targets = TargetAll.validate_python(
                    {
                        str(ver): [t.to_model() for t in config.at_version(version=ver).targets]
                        for ver in config.versions
                    }
                )
                Console().print_json(TargetAll.dump_json(all_targets).decode("utf-8"))
            else:
                target_models = [t.to_model() for t in config.at_version(version).targets]
                targets = TargetList.validate_python(target_models)
                Console().print_json(TargetList.dump_json(targets).decode("utf-8"))