diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..ee78236 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,33 @@ +name: Run Linter + +on: + pull_request: + branches: + - main + - develop + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.12' + + - name: Install Poetry + run: | + curl -sSL https://install.python-poetry.org | python3 - + export PATH="$HOME/.local/bin:$PATH" + + - name: Install dependencies + run: | + poetry install + + - name: Run linter + run: | + poetry run lint \ No newline at end of file diff --git a/.gitignore b/.gitignore index 15bbbb5..b69ec96 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea +.coverage venv *.json *.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index ae11f80..222e400 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## [Unreleased] + + +### Changed + +- Сoverage to display the percentage of coverage by unit tests. + ## 0.1.0 ### Added diff --git a/formatfusion/__init__.py b/formatfusion/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/formatfusion/commands/cmd_image.py b/formatfusion/commands/cmd_image.py index f49a009..2c85dc3 100644 --- a/formatfusion/commands/cmd_image.py +++ b/formatfusion/commands/cmd_image.py @@ -14,12 +14,12 @@ import typing as t from pathlib import Path -from ..core.image import ConverterImage +from formatfusion.core.image import ConverterImage logger = logging.getLogger(__name__) -def run(opts: t.Dict[str, t.Any]): +def run(opts: t.Dict[str, t.Any]) -> t.Any: logger.info("Start converting..") return run_convert(opts) diff --git a/formatfusion/commands/cmd_yaml.py b/formatfusion/commands/cmd_yaml.py index 15062e9..e5add34 100644 --- a/formatfusion/commands/cmd_yaml.py +++ b/formatfusion/commands/cmd_yaml.py @@ -15,14 +15,13 @@ import typing as t from pathlib import Path +from formatfusion.core.json_and_yaml import ConverterYAMLandJSON from formatfusion.helpers import validate_files -from ..core.json_and_yaml import ConverterYAMLandJSON - logger = logging.getLogger(__name__) -def run(opts: t.Dict[str, t.Any]): +def run(opts: t.Dict[str, t.Any]) -> t.Any: logger.info("Start converting..") return run_convert(opts) diff --git a/formatfusion/core/base.py b/formatfusion/core/base.py index 6f5a54a..b1ee456 100644 --- a/formatfusion/core/base.py +++ b/formatfusion/core/base.py @@ -1,5 +1,4 @@ import logging -import typing as t from pathlib import Path logger = logging.getLogger(__name__) diff --git a/formatfusion/helpers.py b/formatfusion/helpers.py index b25b571..ca924a7 100644 --- a/formatfusion/helpers.py +++ b/formatfusion/helpers.py @@ -1,16 +1,19 @@ import logging import os +from pathlib import Path logger = logging.getLogger(__name__) VALID_EXTENSIONS = {"json", "yaml", "png", "jpg"} -def get_file_extension(filename: str): - return os.path.splitext(filename)[-1].lstrip(".") +def get_file_extension(filename: Path) -> str: + if not filename.name: + raise ValueError("Filename cannot be empty.") + return filename.suffix.lstrip(".") -def validate_files(input_file, output_file) -> bool: +def validate_files(input_file: Path, output_file: Path) -> bool: if not os.path.isfile(input_file): logger.error(f"The file '{input_file}' does not exist") return False diff --git a/formatfusion/main.py b/formatfusion/main.py index 0f14ffb..99051df 100644 --- a/formatfusion/main.py +++ b/formatfusion/main.py @@ -12,6 +12,7 @@ """ import json import logging +import typing as t from docopt import docopt @@ -26,13 +27,13 @@ logger = logging.getLogger(__name__) -def run_command(opts): +def run_command(opts: t.Dict[str, t.Any]) -> t.Any: command_name = opts[""] match command_name: case "yaml": cmd_module = commands.cmd_yaml case "image": - cmd_module = commands.cmd_image + cmd_module = commands.cmd_image # type: ignore case _: raise RuntimeError(f"Invalid command <{command_name}>") @@ -44,7 +45,7 @@ def run_command(opts): return cmd_module.run(cmd_options) -def main(opts): +def main(opts: t.Dict[str, t.Any]) -> t.Any: logger.debug("Run app with options: %s", json.dumps(opts)) try: diff --git a/poetry.lock b/poetry.lock index f793a55..cfbe79a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -35,13 +35,13 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -58,6 +58,80 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "coverage" +version = "7.6.10" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, + {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"}, + {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"}, + {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"}, + {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"}, + {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"}, + {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"}, + {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"}, + {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"}, + {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"}, + {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"}, + {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"}, + {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"}, + {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"}, + {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"}, + {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"}, +] + +[package.extras] +toml = ["tomli"] + [[package]] name = "docopt" version = "0.6.2" @@ -231,6 +305,28 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "types-docopt" +version = "0.6.11.20241107" +description = "Typing stubs for docopt" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-docopt-0.6.11.20241107.tar.gz", hash = "sha256:61c44d03ac4895b5be8d40ba5cc80ce52a63d3d76777ad14669e94b5e9edf7a7"}, + {file = "types_docopt-0.6.11.20241107-py3-none-any.whl", hash = "sha256:4aaaa43ef4c16eaff2a5af44c0018a28981e608a5f9293500f750818edb2d97b"}, +] + +[[package]] +name = "types-pyyaml" +version = "6.0.12.20241230" +description = "Typing stubs for PyYAML" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types_PyYAML-6.0.12.20241230-py3-none-any.whl", hash = "sha256:fa4d32565219b68e6dee5f67534c722e53c00d1cfc09c435ef04d7353e1e96e6"}, + {file = "types_pyyaml-6.0.12.20241230.tar.gz", hash = "sha256:7f07622dbd34bb9c8b264fe860a17e0efcad00d50b5f27e93984909d9363498c"}, +] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -245,4 +341,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11.0" -content-hash = "381a2fed25037a49661bf204bbef74afa0c2a999e347c39a121e6f7ffbcf7a32" +content-hash = "fdbbcee60211f1a93df1579f74ccb799bcf7225309668c4d7999fb260d4d0d07" diff --git a/pyproject.toml b/pyproject.toml index f0e29e8..b9633e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,9 @@ docopt = "^0.6.2" black = "22.12.0" isort = "5.11.5" mypy = "1.11.2" +coverage = "^7.6.10" +types-docopt = "^0.6.11.20241107" +types-pyyaml = "^6.0.12.20241230" [tool.isort] multi_line_output = 3 @@ -37,9 +40,10 @@ line-length = 88 include = '\.pyi?$' [tool.mypy] -python_version = "3.11" -#disallow_untyped_defs = true +python_version = "3.12" +disallow_untyped_defs = true disable_error_code = "annotation-unchecked" show_error_codes = true no_implicit_optional = true warn_unused_ignores = true +namespace_packages = true diff --git a/scripts.py b/scripts.py index 8f79613..8e464c2 100644 --- a/scripts.py +++ b/scripts.py @@ -2,8 +2,10 @@ import pathlib import sys import unittest +import coverage import black + from isort import main as isort_main from mypy.main import main as mypy_main @@ -14,6 +16,7 @@ ) logger = logging.getLogger(__name__) + def lint(): if len(sys.argv) > 1: logger.warning("lint not support arguments") @@ -61,6 +64,7 @@ def lint(): logger.info("Mypy check passed") + def format(): if len(sys.argv) > 1: logger.warning("format not support arguments") @@ -82,9 +86,16 @@ def format(): ] black.patched_main() + def test(): logging.disable(logging.INFO) + cov = coverage.Coverage( + source=[str(top_level_dir / "formatfusion")], + omit=[str(top_level_dir / "tests/*")] + ) + cov.start() + test_dir = str(top_level_dir / "tests") discover_pattern = "test*.py" test_suite = unittest.TestLoader().discover(test_dir, pattern=discover_pattern) @@ -92,7 +103,8 @@ def test(): runner = unittest.TextTestRunner(verbosity=2) result = runner.run(test_suite) - if result.wasSuccessful(): - sys.exit(0) - else: - sys.exit(1) \ No newline at end of file + cov.stop() + cov.save() + cov.report() + + sys.exit(0 if result.wasSuccessful() else 1) diff --git a/tests/test_helpers.py b/tests/test_helpers.py new file mode 100644 index 0000000..171582b --- /dev/null +++ b/tests/test_helpers.py @@ -0,0 +1,27 @@ +import unittest +from pathlib import Path + +from formatfusion.helpers import get_file_extension + + +class TestGetFileExtension(unittest.TestCase): + def test_valid_extensions(self): + self.assertEqual(get_file_extension(Path("example.txt")), "txt") + self.assertEqual(get_file_extension(Path("archive.tar.gz")), "gz") + self.assertEqual(get_file_extension(Path("photo.jpeg")), "jpeg") + + def test_no_extension(self): + self.assertEqual(get_file_extension(Path("file")), "") + + def test_hidden_file(self): + self.assertEqual(get_file_extension(Path(".hiddenfile")), "") + + def test_complex_extensions(self): + self.assertEqual(get_file_extension(Path("complex.name.with.dots.csv")), "csv") + + def test_directory(self): + self.assertEqual(get_file_extension(Path("folder/")), "") + + def test_empty_filename(self): + with self.assertRaises(ValueError): + get_file_extension(Path(""))