|
| 1 | +import dataclasses |
| 2 | + |
| 3 | +from setuptools_scm import Configuration |
| 4 | +from setuptools_scm._get_version_impl import _get_version |
| 5 | + |
| 6 | +from finecode_extension_api import code_action |
| 7 | +from finecode_extension_api.actions import ( |
| 8 | + get_src_artifact_version as get_src_artifact_version_action, |
| 9 | +) |
| 10 | +from finecode_extension_api.interfaces import iprojectinfoprovider, ilogger |
| 11 | + |
| 12 | + |
| 13 | +@dataclasses.dataclass |
| 14 | +class GetSrcArtifactVersionSetuptoolsScmHandlerConfig( |
| 15 | + code_action.ActionHandlerConfig |
| 16 | +): ... |
| 17 | + |
| 18 | + |
| 19 | +class GetSrcArtifactVersionSetuptoolsScmHandler( |
| 20 | + code_action.ActionHandler[ |
| 21 | + get_src_artifact_version_action.GetSrcArtifactVersionAction, |
| 22 | + GetSrcArtifactVersionSetuptoolsScmHandlerConfig, |
| 23 | + ] |
| 24 | +): |
| 25 | + def __init__( |
| 26 | + self, |
| 27 | + config: GetSrcArtifactVersionSetuptoolsScmHandlerConfig, |
| 28 | + project_info_provider: iprojectinfoprovider.IProjectInfoProvider, |
| 29 | + logger: ilogger.ILogger |
| 30 | + ) -> None: |
| 31 | + self.config = config |
| 32 | + self.project_info_provider = project_info_provider |
| 33 | + self.logger = logger |
| 34 | + |
| 35 | + async def run( |
| 36 | + self, |
| 37 | + payload: get_src_artifact_version_action.GetSrcArtifactVersionRunPayload, |
| 38 | + run_context: get_src_artifact_version_action.GetSrcArtifactVersionRunContext, |
| 39 | + ) -> get_src_artifact_version_action.GetSrcArtifactVersionRunResult: |
| 40 | + src_artifact_def_path = payload.src_artifact_def_path |
| 41 | + |
| 42 | + src_artifact_raw_def = ( |
| 43 | + await self.project_info_provider.get_project_raw_config( |
| 44 | + project_def_path=src_artifact_def_path |
| 45 | + ) |
| 46 | + ) |
| 47 | + |
| 48 | + # Check that version is dynamic |
| 49 | + dynamic_fields = src_artifact_raw_def.get("project", {}).get("dynamic", []) |
| 50 | + if "version" not in dynamic_fields: |
| 51 | + raise code_action.ActionFailedException( |
| 52 | + f"Version is not dynamic in {src_artifact_def_path}, " |
| 53 | + "this handler only supports dynamic versions via setuptools_scm" |
| 54 | + ) |
| 55 | + |
| 56 | + # from setuptools_scm._cli:main |
| 57 | + pyproject = src_artifact_def_path.as_posix() |
| 58 | + |
| 59 | + try: |
| 60 | + # could be optimized by providing config from project_info_provider instead |
| 61 | + # of reading file each time |
| 62 | + config = Configuration.from_file( |
| 63 | + pyproject, |
| 64 | + root=None |
| 65 | + ) |
| 66 | + except (LookupError, FileNotFoundError) as ex: |
| 67 | + # no pyproject.toml OR no [tool.setuptools_scm] |
| 68 | + self.logger.warning( |
| 69 | + f"Warning: could not use {pyproject}," |
| 70 | + " using default configuration.\n" |
| 71 | + f" Reason: {ex}." |
| 72 | + ) |
| 73 | + config = Configuration(root=src_artifact_def_path.parent.as_posix()) |
| 74 | + |
| 75 | + version = _get_version( |
| 76 | + config |
| 77 | + ) |
| 78 | + if version is None: |
| 79 | + raise code_action.ActionFailedException("ERROR: no version found") |
| 80 | + |
| 81 | + # from setuptools_scm._cli:main end |
| 82 | + |
| 83 | + return get_src_artifact_version_action.GetSrcArtifactVersionRunResult( |
| 84 | + version=version |
| 85 | + ) |
0 commit comments