diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml deleted file mode 100644 index c73e032..0000000 --- a/.github/workflows/pylint.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Pylint - -on: [push] - -jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.8", "3.9", "3.10"] - steps: - - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install pylint - - name: Analysing the code with pylint - run: | - pylint $(git ls-files '*.py') diff --git a/.github/workflows/python-lint.yml b/.github/workflows/python-lint.yml new file mode 100644 index 0000000..29b4744 --- /dev/null +++ b/.github/workflows/python-lint.yml @@ -0,0 +1,23 @@ +name: Lint Python + +on: [push] + +jobs: + lint: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.12"] + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pylint + - name: Analysing the code with pylint + run: | + pylint $(git ls-files '*.py') diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml new file mode 100644 index 0000000..9d938c2 --- /dev/null +++ b/.github/workflows/python-test.yml @@ -0,0 +1,23 @@ +name: Test Python + +on: [push] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.12"] + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pathtraits + - name: Unit tests + run: | + python -m unittest discover diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3a7ba1c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "python.testing.unittestArgs": [ + "-v", + "-s", + "./test", + "-p", + "*test.py" + ], + "python.testing.pytestEnabled": false, + "python.testing.unittestEnabled": true +} \ No newline at end of file diff --git a/pathtraits/access.py b/pathtraits/access.py index 9d14fc1..cb8a589 100644 --- a/pathtraits/access.py +++ b/pathtraits/access.py @@ -10,31 +10,8 @@ def get(path, db_path, verbose): if verbose: logging.basicConfig(level=logging.DEBUG) - abs_path = os.path.abspath(path) - leaf_dir = os.path.dirname(abs_path) if os.path.isfile(abs_path) else abs_path - dirs = leaf_dir.split("/") - db = TraitsDB(db_path) - - # get traits from path and its parents - dirs_data = [] - data = db.get("data", path=abs_path) - if data: - dirs_data.append(data) - for i in reversed(range(0, len(dirs))): - cur_path = "/".join(dirs[0 : i + 1]) - data = db.get("data", path=cur_path) - if data: - dirs_data.append(data) - - # inherit traits: children overwrite parent path traits - res = {} - for cur_data in reversed(dirs_data): - for k, v in cur_data.items(): - if v and k != "path": - res[k] = v - - # output + res = db.get_dict(path) if len(res) > 0: print(yaml.safe_dump(res)) else: diff --git a/pathtraits/db.py b/pathtraits/db.py index b0c4148..c5380ae 100644 --- a/pathtraits/db.py +++ b/pathtraits/db.py @@ -55,6 +55,30 @@ def get(self, table, cols="*", condition=None, **kwargs): res = {k: v for k, v in zip(keys, values)} return res + def get_dict(self, path): + abs_path = os.path.abspath(path) + leaf_dir = os.path.dirname(abs_path) if os.path.isfile(abs_path) else abs_path + dirs = leaf_dir.split("/") + + # get traits from path and its parents + dirs_data = [] + data = self.get("data", path=abs_path) + if data: + dirs_data.append(data) + for i in reversed(range(0, len(dirs))): + cur_path = "/".join(dirs[0 : i + 1]) + data = self.get("data", path=cur_path) + if data: + dirs_data.append(data) + + # inherit traits: children overwrite parent path traits + res = {} + for cur_data in reversed(dirs_data): + for k, v in cur_data.items(): + if v and k != "path": + res[k] = v + return res + def put_path_id(self, path): get_row_query = f"SELECT id FROM path WHERE path = '{path}' LIMIT 1;" res = self.execute(get_row_query).fetchone() diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/test.py b/test/test.py new file mode 100644 index 0000000..7fde102 --- /dev/null +++ b/test/test.py @@ -0,0 +1,38 @@ +# pylint: disable-all + +""" +Test module +""" + +import unittest +import tempfile +import pathtraits.db +import pathtraits.scan + + +class TestMain(unittest.TestCase): + def test_example(self): + db_path = tempfile.mkstemp()[1] + pathtraits.scan.batch("test/example", db_path, False) + + db = pathtraits.db.TraitsDB(db_path) + self.assertTrue(db is not None) + + source = db.get_dict("test/example/EU/de.txt") + target = { + "description_TEXT": "Germany data", + "has_sidecar_meta_file_BOOL": 1, + "is_example_BOOL": 1, + "score_TEXT": "zero", + "score_REAL": 3.5, + } + for k, v in target.items(): + self.assertEqual(source[k], v) + + source = len(db.execute("SELECT * FROM data;").fetchall()) + target = 4 + self.assertEqual(source, target) + + +if __name__ == "__main__": + unittest.main()