From a2802d263c2d5d85524d8fcc4bf2a271dc7c2c4a Mon Sep 17 00:00:00 2001 From: Abdelaziz Elrashed Date: Sun, 23 Jun 2024 09:39:35 +0300 Subject: [PATCH] =?UTF-8?q?=D8=A5=D8=B6=D8=A7=D9=81=D8=A9=20=D8=B4=D8=B9?= =?UTF-8?q?=D8=A7=D8=B1=20=D9=84=D9=84=D9=88=D8=A7=D8=AC=D9=87=D8=A9=20?= =?UTF-8?q?=D8=A7=D9=84=D9=85=D8=B8=D9=84=D9=85=D8=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/python-package.yml | 37 +++++++++++++++++++++++++++ .gitignore | 7 ++++- Makefile | 33 ++++++++++++++++++++++++ README.ar.md | 2 +- README.md | 2 +- images/logo.jpg | Bin 0 -> 21047 bytes tests/test_zakat_tracker.py | 6 +++++ zakat/zakat_tracker.py | 7 ++--- 8 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/python-package.yml create mode 100644 Makefile create mode 100644 images/logo.jpg create mode 100644 tests/test_zakat_tracker.py diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml new file mode 100644 index 0000000..11595fd --- /dev/null +++ b/.github/workflows/python-package.yml @@ -0,0 +1,37 @@ +# This workflow will install Python dependencies, run tests, and lint with a variety of Python versions +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python + +name: Python package + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.11", "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: | + pip install --upgrade pip + pip install wheel + pip install setuptools + pip install twine + pip install pytest==8.2.2 + pip install pytest-runner==6.0.1 + - name: Test with pytest + run: | + pytest diff --git a/.gitignore b/.gitignore index 1e94382..9938ac3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,9 @@ venv dist build *.egg-info -.eggs \ No newline at end of file +.eggs +*.csv +*.pickle +tmp +*.json +*.pyc \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d9a653e --- /dev/null +++ b/Makefile @@ -0,0 +1,33 @@ +.PHONY: init +# init development +init: + python3 -m venv venv + +.PHONY: deps +# deps development +deps: + pip install --upgrade pip + pip install wheel + pip install setuptools + pip install twine + pip install pytest==8.2.2 + pip install pytest-runner==6.0.1 + +# show help +help: + @echo '' + @echo 'Usage:' + @echo ' make [target]' + @echo '' + @echo 'Targets:' + @awk '/^[a-zA-Z\-0-9]+:/ { \ + helpMessage = match(lastLine, /^# (.*)/); \ + if (helpMessage) { \ + helpCommand = substr($$1, 0, index($$1, ":")-1); \ + helpMessage = substr(lastLine, RSTART + 2, RLENGTH); \ + printf "\033[36m%-22s\033[0m %s\n", helpCommand,helpMessage; \ + } \ + } \ + { lastLine = $$0 }' $(MAKEFILE_LIST) + +.DEFAULT_GOAL := help \ No newline at end of file diff --git a/README.ar.md b/README.ar.md index a67415e..26d25fe 100644 --- a/README.ar.md +++ b/README.ar.md @@ -1,6 +1,6 @@
-![Zakat Tracker Logo](images/logo.png) +![Zakat Tracker Logo](images/logo.jpg)
diff --git a/README.md b/README.md index 1698551..4571415 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-![Zakat Tracker Logo](images/logo.png) +![Zakat Tracker Logo](images/logo.jpg) # ZakatTracker: A Python Library for Islamic Financial Management diff --git a/images/logo.jpg b/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb0340c5c8cebf3498b9970cd9b0bd2c553f91d9 GIT binary patch literal 21047 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 o@^u;dnTw!K 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 literal 0 HcmV?d00001 diff --git a/tests/test_zakat_tracker.py b/tests/test_zakat_tracker.py new file mode 100644 index 0000000..6f59e8a --- /dev/null +++ b/tests/test_zakat_tracker.py @@ -0,0 +1,6 @@ +import pytest +from zakat import ZakatTracker + +def test_zakat_tracker(): + ledger = ZakatTracker("test.pickle") + ledger.test(True) \ No newline at end of file diff --git a/zakat/zakat_tracker.py b/zakat/zakat_tracker.py index 191ae2a..4302a5e 100644 --- a/zakat/zakat_tracker.py +++ b/zakat/zakat_tracker.py @@ -1048,9 +1048,10 @@ def load(self, _path: str = None) -> bool: """ if _path is None: _path = self.path() - with open(_path, "rb") as f: - self._vault = pickle.load(f) - return True + if os.path.exists(_path): + with open(_path, "rb") as f: + self._vault = pickle.load(f) + return True return False def import_csv(self, _path: str = 'file.csv') -> tuple: