isnady 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- isnady-0.0.1/.github/workflows/publish.yml +34 -0
- isnady-0.0.1/.gitignore +23 -0
- isnady-0.0.1/LICENSE +21 -0
- isnady-0.0.1/PKG-INFO +65 -0
- isnady-0.0.1/README.md +40 -0
- isnady-0.0.1/pyproject.toml +44 -0
- isnady-0.0.1/src/isnady/__init__.py +4 -0
- isnady-0.0.1/src/isnady/__main__.py +3 -0
- isnady-0.0.1/src/isnady/gui/__init__.py +1 -0
- isnady-0.0.1/src/isnady/gui/main_window.py +76 -0
- isnady-0.0.1/src/isnady/main.py +24 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- uses: actions/setup-python@v5
|
|
14
|
+
with:
|
|
15
|
+
python-version: "3.12"
|
|
16
|
+
- run: python -m pip install --upgrade build
|
|
17
|
+
- run: python -m build
|
|
18
|
+
- uses: actions/upload-artifact@v4
|
|
19
|
+
with:
|
|
20
|
+
name: dist
|
|
21
|
+
path: dist/
|
|
22
|
+
|
|
23
|
+
publish:
|
|
24
|
+
needs: build
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
environment: pypi
|
|
27
|
+
permissions:
|
|
28
|
+
id-token: write
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/download-artifact@v4
|
|
31
|
+
with:
|
|
32
|
+
name: dist
|
|
33
|
+
path: dist/
|
|
34
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
isnady-0.0.1/.gitignore
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Local-only project notes — never pushed
|
|
2
|
+
isnady_Handoff.md
|
|
3
|
+
ISNADY_TODO.md
|
|
4
|
+
|
|
5
|
+
# Python
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.py[cod]
|
|
8
|
+
*.egg-info/
|
|
9
|
+
build/
|
|
10
|
+
dist/
|
|
11
|
+
.venv/
|
|
12
|
+
venv/
|
|
13
|
+
|
|
14
|
+
# Data built locally (the database will be shipped separately, not committed raw)
|
|
15
|
+
*.sqlite
|
|
16
|
+
*.sqlite3
|
|
17
|
+
*.db
|
|
18
|
+
|
|
19
|
+
# Editors / OS
|
|
20
|
+
.vscode/
|
|
21
|
+
.idea/
|
|
22
|
+
.DS_Store
|
|
23
|
+
Thumbs.db
|
isnady-0.0.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Bayram Kotan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
isnady-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: isnady
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Hadith search with full isnad chains, narrator biographies, jarh wa ta'dil verdicts and reliability scores
|
|
5
|
+
Project-URL: Homepage, https://github.com/bayramkotan/isnady
|
|
6
|
+
Project-URL: Repository, https://github.com/bayramkotan/isnady
|
|
7
|
+
Project-URL: Issues, https://github.com/bayramkotan/isnady/issues
|
|
8
|
+
Author: Bayram Kotan
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: hadith,islamic studies,isnad,jarh wa tadil,narrators,rijal
|
|
12
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
13
|
+
Classifier: Environment :: X11 Applications :: Qt
|
|
14
|
+
Classifier: Intended Audience :: Education
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: Natural Language :: Arabic
|
|
17
|
+
Classifier: Natural Language :: English
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Topic :: Education
|
|
21
|
+
Classifier: Topic :: Religion
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Requires-Dist: pyside6>=6.6
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
|
|
26
|
+
# isnady
|
|
27
|
+
|
|
28
|
+
Hadith search built around the **isnad** — the chain of transmission.
|
|
29
|
+
|
|
30
|
+
isnady is a desktop application (PySide6, Windows and Linux) for searching hadith
|
|
31
|
+
across the major collections and seeing *why* each report has the grade it has:
|
|
32
|
+
every narrator in the chain, what the scholars of jarh wa ta'dil said about them,
|
|
33
|
+
and how the chain holds together.
|
|
34
|
+
|
|
35
|
+
> **Status: pre-alpha (0.0.1).** This release is the application skeleton. No hadith
|
|
36
|
+
> data is included yet.
|
|
37
|
+
|
|
38
|
+
## Planned
|
|
39
|
+
|
|
40
|
+
- **Search** — by text, book, chapter, narrator and grade: mutawatir, sahih, hasan,
|
|
41
|
+
da'if, mawdu' and the intermediate grades.
|
|
42
|
+
- **Narrators** — biography, dates, teachers and students, number of narrations,
|
|
43
|
+
and every recorded verdict with its source.
|
|
44
|
+
- **Isnad chains** — each chain drawn link by link, with each narrator's standing.
|
|
45
|
+
- **Reliability scores** — derived transparently from classical rankings (for example
|
|
46
|
+
Ibn Hajar's twelve grades in *Taqrib al-Tahdhib*), always shown with the verdicts
|
|
47
|
+
they come from. A score is a conversion of the scholars' judgement, never a new one.
|
|
48
|
+
- **Shia rijal** — the primary grading follows the Sunni tradition; narrator verdicts
|
|
49
|
+
from Shia rijal works (al-Najashi, al-Tusi, al-Kashshi, al-Hilli, al-Khoei) are listed
|
|
50
|
+
per narrator beside the Sunni view.
|
|
51
|
+
- **Statistics** — narrators, books and grades counted and compared.
|
|
52
|
+
- **Learn** — the hadith sciences explained: terminology, grading, jarh wa ta'dil,
|
|
53
|
+
and the classical works.
|
|
54
|
+
|
|
55
|
+
## Install
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
pip install isnady
|
|
59
|
+
isnady
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## License
|
|
63
|
+
|
|
64
|
+
MIT for the application code. Hadith and narrator data will come from separate
|
|
65
|
+
sources, each under its own license, listed here as they are added.
|
isnady-0.0.1/README.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# isnady
|
|
2
|
+
|
|
3
|
+
Hadith search built around the **isnad** — the chain of transmission.
|
|
4
|
+
|
|
5
|
+
isnady is a desktop application (PySide6, Windows and Linux) for searching hadith
|
|
6
|
+
across the major collections and seeing *why* each report has the grade it has:
|
|
7
|
+
every narrator in the chain, what the scholars of jarh wa ta'dil said about them,
|
|
8
|
+
and how the chain holds together.
|
|
9
|
+
|
|
10
|
+
> **Status: pre-alpha (0.0.1).** This release is the application skeleton. No hadith
|
|
11
|
+
> data is included yet.
|
|
12
|
+
|
|
13
|
+
## Planned
|
|
14
|
+
|
|
15
|
+
- **Search** — by text, book, chapter, narrator and grade: mutawatir, sahih, hasan,
|
|
16
|
+
da'if, mawdu' and the intermediate grades.
|
|
17
|
+
- **Narrators** — biography, dates, teachers and students, number of narrations,
|
|
18
|
+
and every recorded verdict with its source.
|
|
19
|
+
- **Isnad chains** — each chain drawn link by link, with each narrator's standing.
|
|
20
|
+
- **Reliability scores** — derived transparently from classical rankings (for example
|
|
21
|
+
Ibn Hajar's twelve grades in *Taqrib al-Tahdhib*), always shown with the verdicts
|
|
22
|
+
they come from. A score is a conversion of the scholars' judgement, never a new one.
|
|
23
|
+
- **Shia rijal** — the primary grading follows the Sunni tradition; narrator verdicts
|
|
24
|
+
from Shia rijal works (al-Najashi, al-Tusi, al-Kashshi, al-Hilli, al-Khoei) are listed
|
|
25
|
+
per narrator beside the Sunni view.
|
|
26
|
+
- **Statistics** — narrators, books and grades counted and compared.
|
|
27
|
+
- **Learn** — the hadith sciences explained: terminology, grading, jarh wa ta'dil,
|
|
28
|
+
and the classical works.
|
|
29
|
+
|
|
30
|
+
## Install
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
pip install isnady
|
|
34
|
+
isnady
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## License
|
|
38
|
+
|
|
39
|
+
MIT for the application code. Hadith and narrator data will come from separate
|
|
40
|
+
sources, each under its own license, listed here as they are added.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "isnady"
|
|
7
|
+
dynamic = ["version"]
|
|
8
|
+
description = "Hadith search with full isnad chains, narrator biographies, jarh wa ta'dil verdicts and reliability scores"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
12
|
+
authors = [{ name = "Bayram Kotan" }]
|
|
13
|
+
requires-python = ">=3.10"
|
|
14
|
+
dependencies = ["PySide6>=6.6"]
|
|
15
|
+
keywords = ["hadith", "isnad", "rijal", "narrators", "jarh wa tadil", "islamic studies"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 2 - Pre-Alpha",
|
|
18
|
+
"Environment :: X11 Applications :: Qt",
|
|
19
|
+
"Intended Audience :: Education",
|
|
20
|
+
"Intended Audience :: Science/Research",
|
|
21
|
+
"Natural Language :: English",
|
|
22
|
+
"Natural Language :: Arabic",
|
|
23
|
+
"Operating System :: OS Independent",
|
|
24
|
+
"Programming Language :: Python :: 3",
|
|
25
|
+
"Topic :: Education",
|
|
26
|
+
"Topic :: Religion",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
[project.urls]
|
|
30
|
+
Homepage = "https://github.com/bayramkotan/isnady"
|
|
31
|
+
Repository = "https://github.com/bayramkotan/isnady"
|
|
32
|
+
Issues = "https://github.com/bayramkotan/isnady/issues"
|
|
33
|
+
|
|
34
|
+
[project.gui-scripts]
|
|
35
|
+
isnady = "isnady.main:main"
|
|
36
|
+
|
|
37
|
+
[tool.hatch.version]
|
|
38
|
+
path = "src/isnady/__init__.py"
|
|
39
|
+
|
|
40
|
+
[tool.hatch.build.targets.wheel]
|
|
41
|
+
packages = ["src/isnady"]
|
|
42
|
+
|
|
43
|
+
[tool.hatch.build.targets.sdist]
|
|
44
|
+
exclude = ["isnady_Handoff.md", "ISNADY_TODO.md"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""GUI package."""
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Main window: a sidebar of sections and a page stack.
|
|
2
|
+
|
|
3
|
+
Each section is a placeholder until its own delivery builds it.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from PySide6.QtCore import Qt
|
|
7
|
+
from PySide6.QtWidgets import (
|
|
8
|
+
QHBoxLayout,
|
|
9
|
+
QLabel,
|
|
10
|
+
QListWidget,
|
|
11
|
+
QMainWindow,
|
|
12
|
+
QStackedWidget,
|
|
13
|
+
QVBoxLayout,
|
|
14
|
+
QWidget,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
from isnady import APP_NAME, __version__
|
|
18
|
+
|
|
19
|
+
# (key, sidebar label, one-line description shown on the placeholder page)
|
|
20
|
+
SECTIONS = [
|
|
21
|
+
("search", "Search", "Search hadith text, books and grades (mutawatir, sahih, hasan, da'if, mawdu' ...)."),
|
|
22
|
+
("narrators", "Narrators", "Every narrator: biography, teachers, students, number of narrations, verdicts."),
|
|
23
|
+
("chains", "Isnad Chains", "Chains of transmission drawn link by link, with each narrator's standing."),
|
|
24
|
+
("books", "Books", "Hadith collections processed into the database and their coverage."),
|
|
25
|
+
("shia_rijal", "Shia Rijal", "Narrator verdicts from Shia rijal scholars, per person, beside the Sunni view."),
|
|
26
|
+
("statistics", "Statistics", "Counts, distributions and rankings across narrators, books and grades."),
|
|
27
|
+
("learn", "Learn", "Hadith sciences: terminology, grading, jarh wa ta'dil, the classical works."),
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _placeholder(title: str, text: str) -> QWidget:
|
|
32
|
+
page = QWidget()
|
|
33
|
+
layout = QVBoxLayout(page)
|
|
34
|
+
layout.setAlignment(Qt.AlignmentFlag.AlignTop)
|
|
35
|
+
heading = QLabel(title)
|
|
36
|
+
font = heading.font()
|
|
37
|
+
font.setPointSize(font.pointSize() + 6)
|
|
38
|
+
font.setBold(True)
|
|
39
|
+
heading.setFont(font)
|
|
40
|
+
body = QLabel(text)
|
|
41
|
+
body.setWordWrap(True)
|
|
42
|
+
note = QLabel("Not built yet.")
|
|
43
|
+
note.setEnabled(False)
|
|
44
|
+
layout.addWidget(heading)
|
|
45
|
+
layout.addWidget(body)
|
|
46
|
+
layout.addSpacing(12)
|
|
47
|
+
layout.addWidget(note)
|
|
48
|
+
return page
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class MainWindow(QMainWindow):
|
|
52
|
+
def __init__(self) -> None:
|
|
53
|
+
super().__init__()
|
|
54
|
+
self.setWindowTitle(f"{APP_NAME} {__version__}")
|
|
55
|
+
self.resize(1100, 720)
|
|
56
|
+
|
|
57
|
+
self.sidebar = QListWidget()
|
|
58
|
+
self.sidebar.setFixedWidth(190)
|
|
59
|
+
self.pages = QStackedWidget()
|
|
60
|
+
|
|
61
|
+
for key, label, text in SECTIONS:
|
|
62
|
+
self.sidebar.addItem(label)
|
|
63
|
+
page = _placeholder(label, text)
|
|
64
|
+
page.setObjectName(f"page_{key}")
|
|
65
|
+
self.pages.addWidget(page)
|
|
66
|
+
|
|
67
|
+
self.sidebar.currentRowChanged.connect(self.pages.setCurrentIndex)
|
|
68
|
+
self.sidebar.setCurrentRow(0)
|
|
69
|
+
|
|
70
|
+
central = QWidget()
|
|
71
|
+
row = QHBoxLayout(central)
|
|
72
|
+
row.addWidget(self.sidebar)
|
|
73
|
+
row.addWidget(self.pages, 1)
|
|
74
|
+
self.setCentralWidget(central)
|
|
75
|
+
|
|
76
|
+
self.statusBar().showMessage(f"{APP_NAME} {__version__} — no data loaded yet")
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Entry point: `isnady` command and `python -m isnady`."""
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
from PySide6.QtWidgets import QApplication
|
|
6
|
+
|
|
7
|
+
from isnady import APP_NAME, __version__
|
|
8
|
+
from isnady.gui.main_window import MainWindow
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def main() -> int:
|
|
12
|
+
if "--version" in sys.argv[1:]:
|
|
13
|
+
print(f"{APP_NAME} {__version__}")
|
|
14
|
+
return 0
|
|
15
|
+
app = QApplication(sys.argv)
|
|
16
|
+
app.setApplicationName(APP_NAME)
|
|
17
|
+
app.setApplicationVersion(__version__)
|
|
18
|
+
window = MainWindow()
|
|
19
|
+
window.show()
|
|
20
|
+
return app.exec()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
if __name__ == "__main__":
|
|
24
|
+
raise SystemExit(main())
|