chore: update dep versions

This commit is contained in:
Xyphuz 2024-04-27 16:55:24 +08:00
parent 239ea20a68
commit aa4d3b70ed
7 changed files with 1404 additions and 1923 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "compose-spec"]
path = compose-spec
url = https://github.com/compose-spec/compose-spec.git

1
compose-spec Submodule

@ -0,0 +1 @@
Subproject commit c9480da2ad9670c2e99126f4aad8f1ffbf6d4a9a

View file

@ -2,6 +2,7 @@ import re
from typing import Any, Dict, List, Optional, Union from typing import Any, Dict, List, Optional, Union
from pydantic import ValidationError from pydantic import ValidationError
from pydantic_yaml import parse_yaml_raw_as
import compose_viz.spec.compose_spec as spec import compose_viz.spec.compose_spec as spec
from compose_viz.models.compose import Compose, Service from compose_viz.models.compose import Compose, Service
@ -19,7 +20,7 @@ class Parser:
def _unwrap_depends_on(data_depends_on: Union[spec.ListOfStrings, Dict[Any, spec.DependsOn], None]) -> List[str]: def _unwrap_depends_on(data_depends_on: Union[spec.ListOfStrings, Dict[Any, spec.DependsOn], None]) -> List[str]:
service_depends_on = [] service_depends_on = []
if type(data_depends_on) is spec.ListOfStrings: if type(data_depends_on) is spec.ListOfStrings:
service_depends_on = data_depends_on.__root__ service_depends_on = data_depends_on.root
elif type(data_depends_on) is dict: elif type(data_depends_on) is dict:
for depends_on in data_depends_on.keys(): for depends_on in data_depends_on.keys():
service_depends_on.append(str(depends_on)) service_depends_on.append(str(depends_on))
@ -40,7 +41,9 @@ class Parser:
compose_data: spec.ComposeSpecification compose_data: spec.ComposeSpecification
try: try:
compose_data = spec.ComposeSpecification.parse_file(file_path) with open(file_path, "r") as file:
file_content = file.read()
compose_data = parse_yaml_raw_as(spec.ComposeSpecification, file_content)
except ValidationError as e: except ValidationError as e:
raise RuntimeError(f"Error parsing file '{file_path}': {e}") raise RuntimeError(f"Error parsing file '{file_path}': {e}")
@ -63,7 +66,7 @@ class Parser:
if service_data.build is not None: if service_data.build is not None:
if type(service_data.build) is str: if type(service_data.build) is str:
service_image = f"build from '{service_data.build}'" service_image = f"build from '{service_data.build}'"
elif type(service_data.build) is spec.BuildItem: elif type(service_data.build) is spec.Build:
if service_data.build.context is not None and service_data.build.dockerfile is not None: if service_data.build.context is not None and service_data.build.dockerfile is not None:
service_image = ( service_image = (
f"build from '{service_data.build.context}' using '{service_data.build.dockerfile}'" f"build from '{service_data.build.context}' using '{service_data.build.dockerfile}'"
@ -79,7 +82,7 @@ class Parser:
service_networks: List[str] = [] service_networks: List[str] = []
if service_data.networks is not None: if service_data.networks is not None:
if type(service_data.networks) is spec.ListOfStrings: if type(service_data.networks) is spec.ListOfStrings:
service_networks = service_data.networks.__root__ service_networks = service_data.networks.root
elif type(service_data.networks) is dict: elif type(service_data.networks) is dict:
service_networks = list(service_data.networks.keys()) service_networks = list(service_data.networks.keys())
@ -87,7 +90,7 @@ class Parser:
if service_data.extends is not None: if service_data.extends is not None:
# https://github.com/compose-spec/compose-spec/blob/master/spec.md#extends # https://github.com/compose-spec/compose-spec/blob/master/spec.md#extends
# The value of the extends key MUST be a dictionary. # The value of the extends key MUST be a dictionary.
assert type(service_data.extends) is spec.Extend assert type(service_data.extends) is spec.Extends
service_extends = Extends( service_extends = Extends(
service_name=service_data.extends.service, from_file=service_data.extends.file service_name=service_data.extends.service, from_file=service_data.extends.file
) )
@ -122,7 +125,7 @@ class Parser:
host_port = f"{host_ip}{host_port}" host_port = f"{host_ip}{host_port}"
else: else:
host_port = f"0.0.0.0:{host_port}" host_port = f"0.0.0.0:{host_port}"
elif type(port_data) is spec.Port: elif type(port_data) is spec.Ports:
assert port_data.target is not None, "Invalid port format, aborting." assert port_data.target is not None, "Invalid port format, aborting."
# ruamel.yaml does not parse port as int # ruamel.yaml does not parse port as int
@ -180,7 +183,7 @@ class Parser:
access_mode=spilt_data[2], access_mode=spilt_data[2],
) )
) )
elif type(volume_data) is spec.ServiceVolume: elif type(volume_data) is spec.Volumes:
assert volume_data.target is not None, "Invalid volume input, aborting." assert volume_data.target is not None, "Invalid volume input, aborting."
# https://github.com/compose-spec/compose-spec/blob/master/spec.md#long-syntax-4 # https://github.com/compose-spec/compose-spec/blob/master/spec.md#long-syntax-4
@ -213,10 +216,10 @@ class Parser:
env_file: List[str] = [] env_file: List[str] = []
if service_data.env_file is not None: if service_data.env_file is not None:
if type(service_data.env_file) is spec.StringOrList: if type(service_data.env_file) is spec.StringOrList:
if type(service_data.env_file.__root__) is spec.ListOfStrings: if type(service_data.env_file.root) is spec.ListOfStrings:
env_file = service_data.env_file.__root__.__root__ env_file = service_data.env_file.root.root
elif type(service_data.env_file.__root__) is str: elif type(service_data.env_file.root) is str:
env_file.append(service_data.env_file.__root__) env_file.append(service_data.env_file.root)
expose: List[str] = [] expose: List[str] = []
if service_data.expose is not None: if service_data.expose is not None:
@ -226,7 +229,7 @@ class Parser:
profiles: List[str] = [] profiles: List[str] = []
if service_data.profiles is not None: if service_data.profiles is not None:
if type(service_data.profiles) is spec.ListOfStrings: if type(service_data.profiles) is spec.ListOfStrings:
profiles = service_data.profiles.__root__ profiles = service_data.profiles.root
devices: List[Device] = [] devices: List[Device] = []
if service_data.devices is not None: if service_data.devices is not None:

View file

@ -1,820 +0,0 @@
{
"$schema": "http://json-schema.org/draft/2019-09/schema#",
"id": "compose_spec.json",
"type": "object",
"title": "Compose Specification",
"description": "The Compose file is a YAML file defining a multi-containers based application.",
"properties": {
"version": {
"type": "string",
"description": "declared for backward compatibility, ignored."
},
"name": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]*$",
"description": "define the Compose project name, until user defines one explicitly."
},
"services": {
"id": "#/properties/services",
"type": "object",
"patternProperties": {
"^[a-zA-Z0-9._-]+$": {
"$ref": "#/definitions/service"
}
},
"additionalProperties": false
},
"networks": {
"id": "#/properties/networks",
"type": "object",
"patternProperties": {
"^[a-zA-Z0-9._-]+$": {
"$ref": "#/definitions/network"
}
}
},
"volumes": {
"id": "#/properties/volumes",
"type": "object",
"patternProperties": {
"^[a-zA-Z0-9._-]+$": {
"$ref": "#/definitions/volume"
}
},
"additionalProperties": false
},
"secrets": {
"id": "#/properties/secrets",
"type": "object",
"patternProperties": {
"^[a-zA-Z0-9._-]+$": {
"$ref": "#/definitions/secret"
}
},
"additionalProperties": false
},
"configs": {
"id": "#/properties/configs",
"type": "object",
"patternProperties": {
"^[a-zA-Z0-9._-]+$": {
"$ref": "#/definitions/config"
}
},
"additionalProperties": false
}
},
"patternProperties": {"^x-": {}},
"additionalProperties": false,
"definitions": {
"service": {
"id": "#/definitions/service",
"type": "object",
"properties": {
"deploy": {"$ref": "#/definitions/deployment"},
"build": {
"oneOf": [
{"type": "string"},
{
"type": "object",
"properties": {
"context": {"type": "string"},
"dockerfile": {"type": "string"},
"dockerfile_inline": {"type": "string"},
"args": {"$ref": "#/definitions/list_or_dict"},
"ssh": {"$ref": "#/definitions/list_or_dict"},
"labels": {"$ref": "#/definitions/list_or_dict"},
"cache_from": {"type": "array", "items": {"type": "string"}},
"cache_to": {"type": "array", "items": {"type": "string"}},
"no_cache": {"type": "boolean"},
"additional_contexts": {"$ref": "#/definitions/list_or_dict"},
"network": {"type": "string"},
"pull": {"type": "boolean"},
"target": {"type": "string"},
"shm_size": {"type": ["integer", "string"]},
"extra_hosts": {"$ref": "#/definitions/list_or_dict"},
"isolation": {"type": "string"},
"privileged": {"type": "boolean"},
"secrets": {"$ref": "#/definitions/service_config_or_secret"},
"tags": {"type": "array", "items": {"type": "string"}},
"platforms": {"type": "array", "items": {"type": "string"}}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
]
},
"blkio_config": {
"type": "object",
"properties": {
"device_read_bps": {
"type": "array",
"items": {"$ref": "#/definitions/blkio_limit"}
},
"device_read_iops": {
"type": "array",
"items": {"$ref": "#/definitions/blkio_limit"}
},
"device_write_bps": {
"type": "array",
"items": {"$ref": "#/definitions/blkio_limit"}
},
"device_write_iops": {
"type": "array",
"items": {"$ref": "#/definitions/blkio_limit"}
},
"weight": {"type": "integer"},
"weight_device": {
"type": "array",
"items": {"$ref": "#/definitions/blkio_weight"}
}
},
"additionalProperties": false
},
"cap_add": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
"cap_drop": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
"cgroup": {"type": "string", "enum": ["host", "private"]},
"cgroup_parent": {"type": "string"},
"command": {"$ref": "#/definitions/command"},
"configs": {"$ref": "#/definitions/service_config_or_secret"},
"container_name": {"type": "string"},
"cpu_count": {"type": "integer", "minimum": 0},
"cpu_percent": {"type": "integer", "minimum": 0, "maximum": 100},
"cpu_shares": {"type": ["number", "string"]},
"cpu_quota": {"type": ["number", "string"]},
"cpu_period": {"type": ["number", "string"]},
"cpu_rt_period": {"type": ["number", "string"]},
"cpu_rt_runtime": {"type": ["number", "string"]},
"cpus": {"type": ["number", "string"]},
"cpuset": {"type": "string"},
"credential_spec": {
"type": "object",
"properties": {
"config": {"type": "string"},
"file": {"type": "string"},
"registry": {"type": "string"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"depends_on": {
"oneOf": [
{"$ref": "#/definitions/list_of_strings"},
{
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9._-]+$": {
"type": "object",
"additionalProperties": false,
"properties": {
"restart": {"type": "boolean"},
"condition": {
"type": "string",
"enum": ["service_started", "service_healthy", "service_completed_successfully"]
}
},
"required": ["condition"]
}
}
}
]
},
"device_cgroup_rules": {"$ref": "#/definitions/list_of_strings"},
"devices": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
"dns": {"$ref": "#/definitions/string_or_list"},
"dns_opt": {"type": "array","items": {"type": "string"}, "uniqueItems": true},
"dns_search": {"$ref": "#/definitions/string_or_list"},
"domainname": {"type": "string"},
"entrypoint": {"$ref": "#/definitions/command"},
"env_file": {"$ref": "#/definitions/string_or_list"},
"environment": {"$ref": "#/definitions/list_or_dict"},
"expose": {
"type": "array",
"items": {
"type": ["string", "number"],
"format": "expose"
},
"uniqueItems": true
},
"extends": {
"oneOf": [
{"type": "string"},
{
"type": "object",
"properties": {
"service": {"type": "string"},
"file": {"type": "string"}
},
"required": ["service"],
"additionalProperties": false
}
]
},
"external_links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
"extra_hosts": {"$ref": "#/definitions/list_or_dict"},
"group_add": {
"type": "array",
"items": {
"type": ["string", "number"]
},
"uniqueItems": true
},
"healthcheck": {"$ref": "#/definitions/healthcheck"},
"hostname": {"type": "string"},
"image": {"type": "string"},
"init": {"type": "boolean"},
"ipc": {"type": "string"},
"isolation": {"type": "string"},
"labels": {"$ref": "#/definitions/list_or_dict"},
"links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
"logging": {
"type": "object",
"properties": {
"driver": {"type": "string"},
"options": {
"type": "object",
"patternProperties": {
"^.+$": {"type": ["string", "number", "null"]}
}
}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"mac_address": {"type": "string"},
"mem_limit": {"type": ["number", "string"]},
"mem_reservation": {"type": ["string", "integer"]},
"mem_swappiness": {"type": "integer"},
"memswap_limit": {"type": ["number", "string"]},
"network_mode": {"type": "string"},
"networks": {
"oneOf": [
{"$ref": "#/definitions/list_of_strings"},
{
"type": "object",
"patternProperties": {
"^[a-zA-Z0-9._-]+$": {
"oneOf": [
{
"type": "object",
"properties": {
"aliases": {"$ref": "#/definitions/list_of_strings"},
"ipv4_address": {"type": "string"},
"ipv6_address": {"type": "string"},
"link_local_ips": {"$ref": "#/definitions/list_of_strings"},
"priority": {"type": "number"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
{"type": "null"}
]
}
},
"additionalProperties": false
}
]
},
"oom_kill_disable": {"type": "boolean"},
"oom_score_adj": {"type": "integer", "minimum": -1000, "maximum": 1000},
"pid": {"type": ["string", "null"]},
"pids_limit": {"type": ["number", "string"]},
"platform": {"type": "string"},
"ports": {
"type": "array",
"items": {
"oneOf": [
{"type": "number", "format": "ports"},
{"type": "string", "format": "ports"},
{
"type": "object",
"properties": {
"mode": {"type": "string"},
"host_ip": {"type": "string"},
"target": {"type": "integer"},
"published": {"type": ["string", "integer"]},
"protocol": {"type": "string"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
]
},
"uniqueItems": true
},
"privileged": {"type": "boolean"},
"profiles": {"$ref": "#/definitions/list_of_strings"},
"pull_policy": {"type": "string", "enum": [
"always", "never", "if_not_present", "build", "missing"
]},
"read_only": {"type": "boolean"},
"restart": {"type": "string"},
"runtime": {
"type": "string"
},
"scale": {
"type": "integer"
},
"security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
"shm_size": {"type": ["number", "string"]},
"secrets": {"$ref": "#/definitions/service_config_or_secret"},
"sysctls": {"$ref": "#/definitions/list_or_dict"},
"stdin_open": {"type": "boolean"},
"stop_grace_period": {"type": "string", "format": "duration"},
"stop_signal": {"type": "string"},
"storage_opt": {"type": "object"},
"tmpfs": {"$ref": "#/definitions/string_or_list"},
"tty": {"type": "boolean"},
"ulimits": {
"type": "object",
"patternProperties": {
"^[a-z]+$": {
"oneOf": [
{"type": "integer"},
{
"type": "object",
"properties": {
"hard": {"type": "integer"},
"soft": {"type": "integer"}
},
"required": ["soft", "hard"],
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
]
}
}
},
"user": {"type": "string"},
"uts": {"type": "string"},
"userns_mode": {"type": "string"},
"volumes": {
"type": "array",
"items": {
"oneOf": [
{"type": "string"},
{
"type": "object",
"required": ["type"],
"properties": {
"type": {"type": "string"},
"source": {"type": "string"},
"target": {"type": "string"},
"read_only": {"type": "boolean"},
"consistency": {"type": "string"},
"bind": {
"type": "object",
"properties": {
"propagation": {"type": "string"},
"create_host_path": {"type": "boolean"},
"selinux": {"type": "string", "enum": ["z", "Z"]}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"volume": {
"type": "object",
"properties": {
"nocopy": {"type": "boolean"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"tmpfs": {
"type": "object",
"properties": {
"size": {
"oneOf": [
{"type": "integer", "minimum": 0},
{"type": "string"}
]
},
"mode": {"type": "number"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
]
},
"uniqueItems": true
},
"volumes_from": {
"type": "array",
"items": {"type": "string"},
"uniqueItems": true
},
"working_dir": {"type": "string"}
},
"patternProperties": {"^x-": {}},
"additionalProperties": false
},
"healthcheck": {
"id": "#/definitions/healthcheck",
"type": "object",
"properties": {
"disable": {"type": "boolean"},
"interval": {"type": "string", "format": "duration"},
"retries": {"type": "number"},
"test": {
"oneOf": [
{"type": "string"},
{"type": "array", "items": {"type": "string"}}
]
},
"timeout": {"type": "string", "format": "duration"},
"start_period": {"type": "string", "format": "duration"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"deployment": {
"id": "#/definitions/deployment",
"type": ["object", "null"],
"properties": {
"mode": {"type": "string"},
"endpoint_mode": {"type": "string"},
"replicas": {"type": "integer"},
"labels": {"$ref": "#/definitions/list_or_dict"},
"rollback_config": {
"type": "object",
"properties": {
"parallelism": {"type": "integer"},
"delay": {"type": "string", "format": "duration"},
"failure_action": {"type": "string"},
"monitor": {"type": "string", "format": "duration"},
"max_failure_ratio": {"type": "number"},
"order": {"type": "string", "enum": [
"start-first", "stop-first"
]}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"update_config": {
"type": "object",
"properties": {
"parallelism": {"type": "integer"},
"delay": {"type": "string", "format": "duration"},
"failure_action": {"type": "string"},
"monitor": {"type": "string", "format": "duration"},
"max_failure_ratio": {"type": "number"},
"order": {"type": "string", "enum": [
"start-first", "stop-first"
]}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"resources": {
"type": "object",
"properties": {
"limits": {
"type": "object",
"properties": {
"cpus": {"type": ["number", "string"]},
"memory": {"type": "string"},
"pids": {"type": "integer"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"reservations": {
"type": "object",
"properties": {
"cpus": {"type": ["number", "string"]},
"memory": {"type": "string"},
"generic_resources": {"$ref": "#/definitions/generic_resources"},
"devices": {"$ref": "#/definitions/devices"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"restart_policy": {
"type": "object",
"properties": {
"condition": {"type": "string"},
"delay": {"type": "string", "format": "duration"},
"max_attempts": {"type": "integer"},
"window": {"type": "string", "format": "duration"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"placement": {
"type": "object",
"properties": {
"constraints": {"type": "array", "items": {"type": "string"}},
"preferences": {
"type": "array",
"items": {
"type": "object",
"properties": {
"spread": {"type": "string"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
},
"max_replicas_per_node": {"type": "integer"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"generic_resources": {
"id": "#/definitions/generic_resources",
"type": "array",
"items": {
"type": "object",
"properties": {
"discrete_resource_spec": {
"type": "object",
"properties": {
"kind": {"type": "string"},
"value": {"type": "number"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
},
"devices": {
"id": "#/definitions/devices",
"type": "array",
"items": {
"type": "object",
"properties": {
"capabilities": {"$ref": "#/definitions/list_of_strings"},
"count": {"type": ["string", "integer"]},
"device_ids": {"$ref": "#/definitions/list_of_strings"},
"driver":{"type": "string"},
"options":{"$ref": "#/definitions/list_or_dict"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
},
"network": {
"id": "#/definitions/network",
"type": ["object", "null"],
"properties": {
"name": {"type": "string"},
"driver": {"type": "string"},
"driver_opts": {
"type": "object",
"patternProperties": {
"^.+$": {"type": ["string", "number"]}
}
},
"ipam": {
"type": "object",
"properties": {
"driver": {"type": "string"},
"config": {
"type": "array",
"items": {
"type": "object",
"properties": {
"subnet": {"type": "string", "format": "subnet_ip_address"},
"ip_range": {"type": "string"},
"gateway": {"type": "string"},
"aux_addresses": {
"type": "object",
"additionalProperties": false,
"patternProperties": {"^.+$": {"type": "string"}}
}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
},
"options": {
"type": "object",
"additionalProperties": false,
"patternProperties": {"^.+$": {"type": "string"}}
}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"external": {
"type": ["boolean", "object"],
"properties": {
"name": {
"deprecated": true,
"type": "string"
}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"internal": {"type": "boolean"},
"enable_ipv6": {"type": "boolean"},
"attachable": {"type": "boolean"},
"labels": {"$ref": "#/definitions/list_or_dict"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"volume": {
"id": "#/definitions/volume",
"type": ["object", "null"],
"properties": {
"name": {"type": "string"},
"driver": {"type": "string"},
"driver_opts": {
"type": "object",
"patternProperties": {
"^.+$": {"type": ["string", "number"]}
}
},
"external": {
"type": ["boolean", "object"],
"properties": {
"name": {
"deprecated": true,
"type": "string"
}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"labels": {"$ref": "#/definitions/list_or_dict"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"secret": {
"id": "#/definitions/secret",
"type": "object",
"properties": {
"name": {"type": "string"},
"environment": {"type": "string"},
"file": {"type": "string"},
"external": {
"type": ["boolean", "object"],
"properties": {
"name": {"type": "string"}
}
},
"labels": {"$ref": "#/definitions/list_or_dict"},
"driver": {"type": "string"},
"driver_opts": {
"type": "object",
"patternProperties": {
"^.+$": {"type": ["string", "number"]}
}
},
"template_driver": {"type": "string"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"config": {
"id": "#/definitions/config",
"type": "object",
"properties": {
"name": {"type": "string"},
"file": {"type": "string"},
"external": {
"type": ["boolean", "object"],
"properties": {
"name": {
"deprecated": true,
"type": "string"
}
}
},
"labels": {"$ref": "#/definitions/list_or_dict"},
"template_driver": {"type": "string"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
},
"command": {
"oneOf": [
{"type": "null"},
{"type": "string"},
{"type": "array","items": {"type": "string"}}
]
},
"string_or_list": {
"oneOf": [
{"type": "string"},
{"$ref": "#/definitions/list_of_strings"}
]
},
"list_of_strings": {
"type": "array",
"items": {"type": "string"},
"uniqueItems": true
},
"list_or_dict": {
"oneOf": [
{
"type": "object",
"patternProperties": {
".+": {
"type": ["string", "number", "boolean", "null"]
}
},
"additionalProperties": false
},
{"type": "array", "items": {"type": "string"}, "uniqueItems": true}
]
},
"blkio_limit": {
"type": "object",
"properties": {
"path": {"type": "string"},
"rate": {"type": ["integer", "string"]}
},
"additionalProperties": false
},
"blkio_weight": {
"type": "object",
"properties": {
"path": {"type": "string"},
"weight": {"type": "integer"}
},
"additionalProperties": false
},
"service_config_or_secret": {
"type": "array",
"items": {
"oneOf": [
{"type": "string"},
{
"type": "object",
"properties": {
"source": {"type": "string"},
"target": {"type": "string"},
"uid": {"type": "string"},
"gid": {"type": "string"},
"mode": {"type": "number"}
},
"additionalProperties": false,
"patternProperties": {"^x-": {}}
}
]
}
},
"constraints": {
"service": {
"id": "#/definitions/constraints/service",
"anyOf": [
{"required": ["build"]},
{"required": ["image"]}
],
"properties": {
"build": {
"required": ["context"]
}
}
}
}
}
}

View file

@ -1,71 +1,74 @@
# generated by datamodel-codegen: # generated by datamodel-codegen:
# filename: compose-spec.json # filename: compose-spec.json
# timestamp: 2023-05-03T07:42:00+00:00 # timestamp: 2024-04-27T08:31:04+00:00
from __future__ import annotations from __future__ import annotations
from enum import Enum
from typing import Any, Dict, List, Optional, Union from typing import Any, Dict, List, Optional, Union
from pydantic import Extra, Field, conint, constr from pydantic import BaseModel, ConfigDict, Field, RootModel
from pydantic_yaml import YamlModel, YamlStrEnum
class Cgroup(YamlStrEnum): class Cgroup(Enum):
host = "host" host = "host"
private = "private" private = "private"
class CredentialSpec(YamlModel): class CredentialSpec(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
config: Optional[str] = None config: Optional[str] = None
file: Optional[str] = None file: Optional[str] = None
registry: Optional[str] = None registry: Optional[str] = None
class Condition(YamlStrEnum): class Condition(Enum):
service_started = "service_started" service_started = "service_started"
service_healthy = "service_healthy" service_healthy = "service_healthy"
service_completed_successfully = "service_completed_successfully" service_completed_successfully = "service_completed_successfully"
class DependsOn(YamlModel): class DependsOn(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
restart: Optional[bool] = None restart: Optional[bool] = None
required: Optional[bool] = True
condition: Condition condition: Condition
class Extend(YamlModel): class Extends(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
service: str service: str
file: Optional[str] = None file: Optional[str] = None
class Logging(YamlModel): class Logging(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
driver: Optional[str] = None driver: Optional[str] = None
options: Optional[Dict[constr(regex=r"^.+$"), Optional[Union[str, float]]]] = None # type: ignore # noqa: F722 options: Optional[Dict[str, Optional[Union[str, float]]]] = None
class Port(YamlModel): class Ports(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
name: Optional[str] = None
mode: Optional[str] = None mode: Optional[str] = None
host_ip: Optional[str] = None host_ip: Optional[str] = None
target: Optional[int] = None target: Optional[int] = None
published: Optional[Union[str, int]] = None published: Optional[Union[str, int]] = None
protocol: Optional[str] = None protocol: Optional[str] = None
app_protocol: Optional[str] = None
class PullPolicy(YamlStrEnum): class PullPolicy(Enum):
always = "always" always = "always"
never = "never" never = "never"
if_not_present = "if_not_present" if_not_present = "if_not_present"
@ -73,47 +76,44 @@ class PullPolicy(YamlStrEnum):
missing = "missing" missing = "missing"
class Ulimit(YamlModel): class Selinux(Enum):
class Config:
extra = Extra.allow
hard: int
soft: int
class Selinux(YamlStrEnum):
z = "z" z = "z"
Z = "Z" Z = "Z"
class Bind(YamlModel): class Bind(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
propagation: Optional[str] = None propagation: Optional[str] = None
create_host_path: Optional[bool] = None create_host_path: Optional[bool] = None
selinux: Optional[Selinux] = None selinux: Optional[Selinux] = None
class AdditionalVolumeOption(YamlModel): class AdditionalVolumeOption(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
nocopy: Optional[bool] = None nocopy: Optional[bool] = None
subpath: Optional[str] = None
class Tmpfs(YamlModel): class Size(RootModel[int]):
class Config: root: int = Field(..., ge=0)
extra = Extra.allow
size: Optional[Union[conint(ge=0), str]] = None # type: ignore
class Tmpfs(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
size: Optional[Union[Size, str]] = None
mode: Optional[float] = None mode: Optional[float] = None
class ServiceVolume(YamlModel): class Volumes(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
type: str type: str
source: Optional[str] = None source: Optional[str] = None
target: Optional[str] = None target: Optional[str] = None
@ -124,27 +124,45 @@ class ServiceVolume(YamlModel):
tmpfs: Optional[Tmpfs] = None tmpfs: Optional[Tmpfs] = None
class Healthcheck(YamlModel): class Healthcheck(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
disable: Optional[bool] = None disable: Optional[bool] = None
interval: Optional[str] = None interval: Optional[str] = None
retries: Optional[float] = None retries: Optional[float] = None
test: Optional[Union[str, List[str]]] = None test: Optional[Union[str, List[str]]] = None
timeout: Optional[str] = None timeout: Optional[str] = None
start_period: Optional[str] = None start_period: Optional[str] = None
start_interval: Optional[str] = None
class Order(YamlStrEnum): class Action(Enum):
rebuild = "rebuild"
sync = "sync"
sync_restart = "sync+restart"
class WatchItem(BaseModel):
ignore: Optional[List[str]] = None
path: str
action: Action
target: Optional[str] = None
class Development(BaseModel):
watch: Optional[List[WatchItem]] = None
class Order(Enum):
start_first = "start-first" start_first = "start-first"
stop_first = "stop-first" stop_first = "stop-first"
class RollbackConfig(YamlModel): class RollbackConfig(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
parallelism: Optional[int] = None parallelism: Optional[int] = None
delay: Optional[str] = None delay: Optional[str] = None
failure_action: Optional[str] = None failure_action: Optional[str] = None
@ -153,157 +171,150 @@ class RollbackConfig(YamlModel):
order: Optional[Order] = None order: Optional[Order] = None
class ConfigOrder(YamlStrEnum): class UpdateConfig(BaseModel):
start_first = "start-first" model_config = ConfigDict(
stop_first = "stop-first" extra="forbid",
)
class UpdateConfig(YamlModel):
class Config:
extra = Extra.allow
parallelism: Optional[int] = None parallelism: Optional[int] = None
delay: Optional[str] = None delay: Optional[str] = None
failure_action: Optional[str] = None failure_action: Optional[str] = None
monitor: Optional[str] = None monitor: Optional[str] = None
max_failure_ratio: Optional[float] = None max_failure_ratio: Optional[float] = None
order: Optional[ConfigOrder] = None order: Optional[Order] = None
class Limits(YamlModel): class Limits(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
cpus: Optional[Union[float, str]] = None cpus: Optional[Union[float, str]] = None
memory: Optional[str] = None memory: Optional[str] = None
pids: Optional[int] = None pids: Optional[int] = None
class RestartPolicy(YamlModel): class RestartPolicy(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
condition: Optional[str] = None condition: Optional[str] = None
delay: Optional[str] = None delay: Optional[str] = None
max_attempts: Optional[int] = None max_attempts: Optional[int] = None
window: Optional[str] = None window: Optional[str] = None
class Preference(YamlModel): class Preference(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
spread: Optional[str] = None spread: Optional[str] = None
class Placement(YamlModel): class Placement(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
constraints: Optional[List[str]] = None constraints: Optional[List[str]] = None
preferences: Optional[List[Preference]] = None preferences: Optional[List[Preference]] = None
max_replicas_per_node: Optional[int] = None max_replicas_per_node: Optional[int] = None
class DiscreteResourceSpec(YamlModel): class DiscreteResourceSpec(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
kind: Optional[str] = None kind: Optional[str] = None
value: Optional[float] = None value: Optional[float] = None
class GenericResource(YamlModel): class GenericResource(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
discrete_resource_spec: Optional[DiscreteResourceSpec] = None discrete_resource_spec: Optional[DiscreteResourceSpec] = None
class GenericResources(YamlModel): class GenericResources(RootModel[List[GenericResource]]):
class Config: root: List[GenericResource]
extra = Extra.allow
__root__: List[GenericResource]
class ConfigItem(YamlModel): class ConfigItem(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
subnet: Optional[str] = None subnet: Optional[str] = None
ip_range: Optional[str] = None ip_range: Optional[str] = None
gateway: Optional[str] = None gateway: Optional[str] = None
aux_addresses: Optional[Dict[constr(regex=r"^.+$"), str]] = None # type: ignore # noqa: F722 aux_addresses: Optional[Dict[str, str]] = None
class Ipam(YamlModel): class Ipam(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
driver: Optional[str] = None driver: Optional[str] = None
config: Optional[List[ConfigItem]] = None config: Optional[List[ConfigItem]] = None
options: Optional[Dict[constr(regex=r"^.+$"), str]] = None # type: ignore # noqa: F722 options: Optional[Dict[str, str]] = None
class ExternalNetwork(YamlModel): class ExternalVolumeNetwork(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
name: Optional[str] = None name: Optional[str] = None
class ExternalVolume(YamlModel): class ExternalConfig(BaseModel):
class Config:
extra = Extra.allow
name: Optional[str] = None name: Optional[str] = None
class ExternalSecret(YamlModel): class Command(RootModel[Optional[Union[str, List[str]]]]):
name: Optional[str] = None root: Optional[Union[str, List[str]]]
class ExternalConfig(YamlModel): class EnvFilePath(BaseModel):
name: Optional[str] = None model_config = ConfigDict(
extra="forbid",
)
path: str
required: Optional[bool] = True
class ListOfStrings(YamlModel): class EnvFile(RootModel[Union[str, List[Union[str, EnvFilePath]]]]):
class Config: root: Union[str, List[Union[str, EnvFilePath]]]
extra = Extra.allow
__root__: List[str] = Field(..., unique_items=True)
class ListOrDict(YamlModel): class ListOfStrings(RootModel[List[str]]):
class Config: root: List[str]
extra = Extra.allow
__root__: Union[
Dict[constr(regex=r".+"), Optional[Union[str, float, bool]]], List[str] # type: ignore # noqa: F722
]
class BlkioLimit(YamlModel): class ListOrDict1(RootModel[List[Any]]):
class Config: root: List[Any]
extra = Extra.allow
class ListOrDict(RootModel[Union[Dict[str, Optional[Union[str, float, bool]]], ListOrDict1]]):
root: Union[Dict[str, Optional[Union[str, float, bool]]], ListOrDict1]
class BlkioLimit(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
path: Optional[str] = None path: Optional[str] = None
rate: Optional[Union[int, str]] = None rate: Optional[Union[int, str]] = None
class BlkioWeight(YamlModel): class BlkioWeight(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
path: Optional[str] = None path: Optional[str] = None
weight: Optional[int] = None weight: Optional[int] = None
class ServiceConfigOrSecretItem(YamlModel): class ServiceConfigOrSecret1(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
source: Optional[str] = None source: Optional[str] = None
target: Optional[str] = None target: Optional[str] = None
uid: Optional[str] = None uid: Optional[str] = None
@ -311,27 +322,34 @@ class ServiceConfigOrSecretItem(YamlModel):
mode: Optional[float] = None mode: Optional[float] = None
class ServiceConfigOrSecret(YamlModel): class ServiceConfigOrSecret(RootModel[List[Union[str, ServiceConfigOrSecret1]]]):
class Config: root: List[Union[str, ServiceConfigOrSecret1]]
extra = Extra.allow
__root__: List[Union[str, ServiceConfigOrSecretItem]]
class Constraints(YamlModel): class Ulimits1(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
__root__: Any hard: int
soft: int
class BuildItem(YamlModel): class Ulimits(RootModel[Dict[str, Union[int, Ulimits1]]]):
class Config: root: Dict[str, Union[int, Ulimits1]]
extra = Extra.allow
class Constraints(RootModel[Any]):
root: Any
class Build(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
context: Optional[str] = None context: Optional[str] = None
dockerfile: Optional[str] = None dockerfile: Optional[str] = None
dockerfile_inline: Optional[str] = None dockerfile_inline: Optional[str] = None
entitlements: Optional[List[str]] = None
args: Optional[ListOrDict] = None args: Optional[ListOrDict] = None
ssh: Optional[ListOrDict] = None ssh: Optional[ListOrDict] = None
labels: Optional[ListOrDict] = None labels: Optional[ListOrDict] = None
@ -348,13 +366,14 @@ class BuildItem(YamlModel):
privileged: Optional[bool] = None privileged: Optional[bool] = None
secrets: Optional[ServiceConfigOrSecret] = None secrets: Optional[ServiceConfigOrSecret] = None
tags: Optional[List[str]] = None tags: Optional[List[str]] = None
ulimits: Optional[Ulimits] = None
platforms: Optional[List[str]] = None platforms: Optional[List[str]] = None
class BlkioConfig(YamlModel): class BlkioConfig(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
device_read_bps: Optional[List[BlkioLimit]] = None device_read_bps: Optional[List[BlkioLimit]] = None
device_read_iops: Optional[List[BlkioLimit]] = None device_read_iops: Optional[List[BlkioLimit]] = None
device_write_bps: Optional[List[BlkioLimit]] = None device_write_bps: Optional[List[BlkioLimit]] = None
@ -363,21 +382,22 @@ class BlkioConfig(YamlModel):
weight_device: Optional[List[BlkioWeight]] = None weight_device: Optional[List[BlkioWeight]] = None
class ServiceNetwork(YamlModel): class Networks(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
aliases: Optional[ListOfStrings] = None aliases: Optional[ListOfStrings] = None
ipv4_address: Optional[str] = None ipv4_address: Optional[str] = None
ipv6_address: Optional[str] = None ipv6_address: Optional[str] = None
link_local_ips: Optional[ListOfStrings] = None link_local_ips: Optional[ListOfStrings] = None
mac_address: Optional[str] = None
priority: Optional[float] = None priority: Optional[float] = None
class Device(YamlModel): class Device(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
capabilities: Optional[ListOfStrings] = None capabilities: Optional[ListOfStrings] = None
count: Optional[Union[str, int]] = None count: Optional[Union[str, int]] = None
device_ids: Optional[ListOfStrings] = None device_ids: Optional[ListOfStrings] = None
@ -385,93 +405,89 @@ class Device(YamlModel):
options: Optional[ListOrDict] = None options: Optional[ListOrDict] = None
class Devices(YamlModel): class Devices(RootModel[List[Device]]):
class Config: root: List[Device]
extra = Extra.allow
__root__: List[Device]
class Network(YamlModel): class Network(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
name: Optional[str] = None name: Optional[str] = None
driver: Optional[str] = None driver: Optional[str] = None
driver_opts: Optional[Dict[constr(regex=r"^.+$"), Union[str, float]]] = None # type: ignore # noqa: F722 driver_opts: Optional[Dict[str, Union[str, float]]] = None
ipam: Optional[Ipam] = None ipam: Optional[Ipam] = None
external: Optional[bool | ExternalNetwork] = None external: Optional[ExternalVolumeNetwork] = None
internal: Optional[bool] = None internal: Optional[bool] = None
enable_ipv6: Optional[bool] = None enable_ipv6: Optional[bool] = None
attachable: Optional[bool] = None attachable: Optional[bool] = None
labels: Optional[ListOrDict] = None labels: Optional[ListOrDict] = None
class Volume(YamlModel): class Volume(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
name: Optional[str] = None name: Optional[str] = None
driver: Optional[str] = None driver: Optional[str] = None
driver_opts: Optional[Dict[constr(regex=r"^.+$"), Union[str, float]]] = None # type: ignore # noqa: F722 driver_opts: Optional[Dict[str, Union[str, float]]] = None
external: Optional[ExternalVolume] = None external: Optional[ExternalVolumeNetwork] = None
labels: Optional[ListOrDict] = None labels: Optional[ListOrDict] = None
class Secret(YamlModel): class Secret(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
name: Optional[str] = None name: Optional[str] = None
environment: Optional[str] = None environment: Optional[str] = None
file: Optional[str] = None file: Optional[str] = None
external: Optional[ExternalSecret] = None external: Optional[ExternalConfig] = None
labels: Optional[ListOrDict] = None labels: Optional[ListOrDict] = None
driver: Optional[str] = None driver: Optional[str] = None
driver_opts: Optional[Dict[constr(regex=r"^.+$"), Union[str, float]]] = None # type: ignore # noqa: F722 driver_opts: Optional[Dict[str, Union[str, float]]] = None
template_driver: Optional[str] = None template_driver: Optional[str] = None
class Config(YamlModel): class Config(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
name: Optional[str] = None name: Optional[str] = None
content: Optional[str] = None
environment: Optional[str] = None
file: Optional[str] = None file: Optional[str] = None
external: Optional[ExternalConfig] = None external: Optional[ExternalConfig] = None
labels: Optional[ListOrDict] = None labels: Optional[ListOrDict] = None
template_driver: Optional[str] = None template_driver: Optional[str] = None
class StringOrList(YamlModel): class StringOrList(RootModel[Union[str, ListOfStrings]]):
class Config: root: Union[str, ListOfStrings]
extra = Extra.allow
__root__: Union[str, ListOfStrings]
class Reservations(YamlModel): class Reservations(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
cpus: Optional[Union[float, str]] = None cpus: Optional[Union[float, str]] = None
memory: Optional[str] = None memory: Optional[str] = None
generic_resources: Optional[GenericResources] = None generic_resources: Optional[GenericResources] = None
devices: Optional[Devices] = None devices: Optional[Devices] = None
class Resources(YamlModel): class Resources(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
limits: Optional[Limits] = None limits: Optional[Limits] = None
reservations: Optional[Reservations] = None reservations: Optional[Reservations] = None
class Deployment(YamlModel): class Deployment(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
mode: Optional[str] = None mode: Optional[str] = None
endpoint_mode: Optional[str] = None endpoint_mode: Optional[str] = None
replicas: Optional[int] = None replicas: Optional[int] = None
@ -483,22 +499,38 @@ class Deployment(YamlModel):
placement: Optional[Placement] = None placement: Optional[Placement] = None
class Service(YamlModel): class Include1(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
path: Optional[StringOrList] = None
env_file: Optional[StringOrList] = None
project_directory: Optional[str] = None
class Include(RootModel[Union[str, Include1]]):
root: Union[str, Include1]
class Service(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
develop: Optional[Development] = None
deploy: Optional[Deployment] = None deploy: Optional[Deployment] = None
build: Optional[Union[str, BuildItem]] = None annotations: Optional[ListOrDict] = None
attach: Optional[bool] = None
build: Optional[Union[str, Build]] = None
blkio_config: Optional[BlkioConfig] = None blkio_config: Optional[BlkioConfig] = None
cap_add: Optional[List[str]] = Field(None, unique_items=True) cap_add: Optional[List[str]] = None
cap_drop: Optional[List[str]] = Field(None, unique_items=True) cap_drop: Optional[List[str]] = None
cgroup: Optional[Cgroup] = None cgroup: Optional[Cgroup] = None
cgroup_parent: Optional[str] = None cgroup_parent: Optional[str] = None
command: Optional[Union[str, List[str]]] = None command: Optional[Command] = None
configs: Optional[ServiceConfigOrSecret] = None configs: Optional[ServiceConfigOrSecret] = None
container_name: Optional[str] = None container_name: Optional[str] = None
cpu_count: Optional[conint(ge=0)] = None # type: ignore cpu_count: Optional[int] = Field(None, ge=0)
cpu_percent: Optional[conint(ge=0, le=100)] = None # type: ignore cpu_percent: Optional[int] = Field(None, ge=0, le=100)
cpu_shares: Optional[Union[float, str]] = None cpu_shares: Optional[Union[float, str]] = None
cpu_quota: Optional[Union[float, str]] = None cpu_quota: Optional[Union[float, str]] = None
cpu_period: Optional[Union[float, str]] = None cpu_period: Optional[Union[float, str]] = None
@ -507,23 +539,21 @@ class Service(YamlModel):
cpus: Optional[Union[float, str]] = None cpus: Optional[Union[float, str]] = None
cpuset: Optional[str] = None cpuset: Optional[str] = None
credential_spec: Optional[CredentialSpec] = None credential_spec: Optional[CredentialSpec] = None
depends_on: Optional[ depends_on: Optional[Union[ListOfStrings, Dict[str, DependsOn]]] = None
Union[ListOfStrings, Dict[constr(regex=r"^[a-zA-Z0-9._-]+$"), DependsOn]] # type: ignore # noqa: F722, E501
] = None
device_cgroup_rules: Optional[ListOfStrings] = None device_cgroup_rules: Optional[ListOfStrings] = None
devices: Optional[List[str]] = Field(None, unique_items=True) devices: Optional[List[str]] = None
dns: Optional[StringOrList] = None dns: Optional[StringOrList] = None
dns_opt: Optional[List[str]] = Field(None, unique_items=True) dns_opt: Optional[List[str]] = None
dns_search: Optional[StringOrList] = None dns_search: Optional[StringOrList] = None
domainname: Optional[str] = None domainname: Optional[str] = None
entrypoint: Optional[Union[str, List[str]]] = None entrypoint: Optional[Command] = None
env_file: Optional[StringOrList] = None env_file: Optional[EnvFile] = None
environment: Optional[ListOrDict] = None environment: Optional[ListOrDict] = None
expose: Optional[List[Union[str, float]]] = Field(None, unique_items=True) expose: Optional[List[Union[str, float]]] = None
extends: Optional[Union[str, Extend]] = None extends: Optional[Union[str, Extends]] = None
external_links: Optional[List[str]] = Field(None, unique_items=True) external_links: Optional[List[str]] = None
extra_hosts: Optional[ListOrDict] = None extra_hosts: Optional[ListOrDict] = None
group_add: Optional[List[Union[str, float]]] = Field(None, unique_items=True) group_add: Optional[List[Union[str, float]]] = None
healthcheck: Optional[Healthcheck] = None healthcheck: Optional[Healthcheck] = None
hostname: Optional[str] = None hostname: Optional[str] = None
image: Optional[str] = None image: Optional[str] = None
@ -531,7 +561,7 @@ class Service(YamlModel):
ipc: Optional[str] = None ipc: Optional[str] = None
isolation: Optional[str] = None isolation: Optional[str] = None
labels: Optional[ListOrDict] = None labels: Optional[ListOrDict] = None
links: Optional[List[str]] = Field(None, unique_items=True) links: Optional[List[str]] = None
logging: Optional[Logging] = None logging: Optional[Logging] = None
mac_address: Optional[str] = None mac_address: Optional[str] = None
mem_limit: Optional[Union[float, str]] = None mem_limit: Optional[Union[float, str]] = None
@ -539,17 +569,13 @@ class Service(YamlModel):
mem_swappiness: Optional[int] = None mem_swappiness: Optional[int] = None
memswap_limit: Optional[Union[float, str]] = None memswap_limit: Optional[Union[float, str]] = None
network_mode: Optional[str] = None network_mode: Optional[str] = None
networks: Optional[ networks: Optional[Union[ListOfStrings, Dict[str, Optional[Networks]]]] = None
Union[
ListOfStrings, Dict[constr(regex=r"^[a-zA-Z0-9._-]+$"), Optional[ServiceNetwork]] # type: ignore # noqa: F722, E501
]
] = None
oom_kill_disable: Optional[bool] = None oom_kill_disable: Optional[bool] = None
oom_score_adj: Optional[conint(ge=-1000, le=1000)] = None # type: ignore oom_score_adj: Optional[int] = Field(None, ge=-1000, le=1000)
pid: Optional[str] = None pid: Optional[str] = None
pids_limit: Optional[Union[float, str]] = None pids_limit: Optional[Union[float, str]] = None
platform: Optional[str] = None platform: Optional[str] = None
ports: Optional[List[Union[float, str, Port]]] = Field(None, unique_items=True) ports: Optional[List[Union[float, str, Ports]]] = None
privileged: Optional[bool] = None privileged: Optional[bool] = None
profiles: Optional[ListOfStrings] = None profiles: Optional[ListOfStrings] = None
pull_policy: Optional[PullPolicy] = None pull_policy: Optional[PullPolicy] = None
@ -557,7 +583,7 @@ class Service(YamlModel):
restart: Optional[str] = None restart: Optional[str] = None
runtime: Optional[str] = None runtime: Optional[str] = None
scale: Optional[int] = None scale: Optional[int] = None
security_opt: Optional[List[str]] = Field(None, unique_items=True) security_opt: Optional[List[str]] = None
shm_size: Optional[Union[float, str]] = None shm_size: Optional[Union[float, str]] = None
secrets: Optional[ServiceConfigOrSecret] = None secrets: Optional[ServiceConfigOrSecret] = None
sysctls: Optional[ListOrDict] = None sysctls: Optional[ListOrDict] = None
@ -567,26 +593,28 @@ class Service(YamlModel):
storage_opt: Optional[Dict[str, Any]] = None storage_opt: Optional[Dict[str, Any]] = None
tmpfs: Optional[StringOrList] = None tmpfs: Optional[StringOrList] = None
tty: Optional[bool] = None tty: Optional[bool] = None
ulimits: Optional[Dict[constr(regex=r"^[a-z]+$"), Union[int, Ulimit]]] = None # type: ignore # noqa: F722 ulimits: Optional[Ulimits] = None
user: Optional[str] = None user: Optional[str] = None
uts: Optional[str] = None uts: Optional[str] = None
userns_mode: Optional[str] = None userns_mode: Optional[str] = None
volumes: Optional[List[Union[str, ServiceVolume]]] = Field(None, unique_items=True) volumes: Optional[List[Union[str, Volumes]]] = None
volumes_from: Optional[List[str]] = Field(None, unique_items=True) volumes_from: Optional[List[str]] = None
working_dir: Optional[str] = None working_dir: Optional[str] = None
class ComposeSpecification(YamlModel): class ComposeSpecification(BaseModel):
class Config: model_config = ConfigDict(
extra = Extra.allow extra="forbid",
)
version: Optional[str] = Field(None, description="declared for backward compatibility, ignored.") version: Optional[str] = Field(None, description="declared for backward compatibility, ignored.")
name: Optional[constr(regex=r"^[a-z0-9][a-z0-9_-]*$")] = Field( # type: ignore # noqa: F722 name: Optional[str] = Field(
None, None,
description="define the Compose project name, until user defines one explicitly.", description="define the Compose project name, until user defines one explicitly.",
pattern="^[a-z0-9][a-z0-9_-]*$",
) )
services: Optional[Dict[constr(regex=r"^[a-zA-Z0-9._-]+$"), Service]] = None # type: ignore # noqa: F722 include: Optional[List[Include]] = Field(None, description="compose sub-projects to be included.")
networks: Optional[Dict[constr(regex=r"^[a-zA-Z0-9._-]+$"), Optional[Network]]] = None # type: ignore # noqa: F722 services: Optional[Dict[str, Service]] = None
volumes: Optional[Dict[constr(regex=r"^[a-zA-Z0-9._-]+$"), Optional[Volume]]] = None # type: ignore # noqa: F722 networks: Optional[Dict[str, Optional[Network]]] = None
secrets: Optional[Dict[constr(regex=r"^[a-zA-Z0-9._-]+$"), Secret]] = None # type: ignore # noqa: F722 volumes: Optional[Dict[str, Optional[Volume]]] = None
configs: Optional[Dict[constr(regex=r"^[a-zA-Z0-9._-]+$"), Config]] = None # type: ignore # noqa: F722 secrets: Optional[Dict[str, Secret]] = None
configs: Optional[Dict[str, Config]] = None

1249
poetry.lock generated

File diff suppressed because it is too large Load diff

View file

@ -14,16 +14,15 @@ include = [
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.9" python = "^3.9"
typer = "^0.4.1" typer = "^0.4.1"
PyYAML = "^6.0"
graphviz = "^0.20" graphviz = "^0.20"
"ruamel.yaml" = "^0.17.21" pydantic-yaml = "^1.3.0"
pydantic-yaml = "^0.7.0"
[tool.poetry.dev-dependencies] [tool.poetry.group.dev.dependencies]
pytest = "^7.1.2" pytest = "^8.1.2"
pre-commit = "^2.19.0" pre-commit = "^3.7.0"
coverage = "^6.3.3" coverage = "^7.5.0"
pytest-cov = "^4.0.0" pytest-cov = "^5.0.0"
datamodel-code-generator = "^0.25.6"
[build-system] [build-system]
requires = ["poetry-core>=1.0.0"] requires = ["poetry-core>=1.0.0"]