123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- # Copyright 2021-2025 Avaiga Private Limited
- #
- # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- # the License. You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- # specific language governing permissions and limitations under the License.
- import json
- import os
- import re
- import sys
- from dataclasses import asdict, dataclass
- from typing import Optional
- @dataclass
- class Version:
- major: str
- minor: str
- patch: str
- ext: Optional[str] = None
- def bump_ext_version(self) -> None:
- if not self.ext:
- return
- reg = re.compile(r"[0-9]+$")
- num = reg.findall(self.ext)[0]
- self.ext = self.ext.replace(num, str(int(num) + 1))
- def validate_suffix(self, suffix="dev"):
- if suffix not in self.ext:
- raise Exception(f"Version does not contain suffix {suffix}")
- @property
- def name(self) -> str:
- """returns a string representation of a version"""
- return f"{self.major}.{self.minor}.{self.patch}"
- @property
- def dev_name(self) -> str:
- """returns a string representation of a version"""
- return f"{self.name}.{self.ext}"
- def __str__(self) -> str:
- """returns a string representation of a version"""
- version_str = f"{self.major}.{self.minor}.{self.patch}"
- if self.ext:
- version_str = f"{version_str}.{self.ext}"
- return version_str
- def __load_version_from_path(base_path: str) -> Version:
- """Load version.json file from base path."""
- with open(os.path.join(base_path, "version.json")) as version_file:
- data = json.load(version_file)
- return Version(**data)
- def __write_version_to_path(base_path: str, version: Version) -> None:
- with open(os.path.join(base_path, "version.json"), "w") as version_file:
- json.dump(asdict(version), version_file)
- def extract_version(base_path: str) -> Version:
- """
- Load version.json file from base path and return the version string.
- """
- return __load_version_from_path(base_path)
- def __setup_dev_version(version: Version, _base_path: str, name: Optional[str] = None) -> None:
- version.validate_suffix()
- name = f"{name}_VERSION" if name else "VERSION"
- print(f"{name}={version.dev_name}") # noqa: T201
- def bump_ext_version(version: Version, _base_path: str) -> None:
- version.bump_ext_version()
- __write_version_to_path(_base_path, version)
- def __setup_prod_version(version: Version, target_version: str, branch_name: str, name: str = None) -> None:
- if str(version) != target_version:
- raise ValueError(f"Current version={version} does not match target version={target_version}")
- if target_branch_name := f"release/{version.major}.{version.minor}" != branch_name:
- raise ValueError(
- f"Branch name mismatch branch={branch_name} does not match target branch name={target_branch_name}"
- )
- name = f"{name}_VERSION" if name else "VERSION"
- print(f"{name}={version.name}") # noqa: T201
- if __name__ == "__main__":
- paths = (
- [sys.argv[1]]
- if sys.argv[1] != "ALL"
- else [
- f"taipy{os.sep}common",
- f"taipy{os.sep}core",
- f"taipy{os.sep}rest",
- f"taipy{os.sep}gui",
- f"taipy{os.sep}templates",
- "taipy",
- ]
- )
- _environment = sys.argv[2]
- for _path in paths:
- _version = extract_version(_path)
- _name = None if _path == "taipy" else _path.split(os.sep)[-1]
- if _environment == "dev":
- __setup_dev_version(_version, _path, _name)
- if _environment == "production":
- __setup_prod_version(_version, sys.argv[3], sys.argv[4], _name)
|