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.
@@ -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
@@ -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,4 @@
1
+ """isnady — hadith search built around the isnad."""
2
+
3
+ __version__ = "0.0.1"
4
+ APP_NAME = "isnady"
@@ -0,0 +1,3 @@
1
+ from isnady.main import main
2
+
3
+ raise SystemExit(main())
@@ -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())