nama-hari 0.1.0__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,95 @@
1
+ Metadata-Version: 2.5
2
+ Name: nama-hari
3
+ Version: 0.1.0
4
+ Summary: Utilitas konversi dan analisis nama hari Indonesia, Jawa, Sunda, dan Inggris
5
+ Author-email: Nama Anda <email@anda.com>
6
+ License: MIT
7
+ Keywords: hari,indonesia,jawa,kalender,pasaran
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Natural Language :: Indonesian
10
+ Classifier: Programming Language :: Python :: 3
11
+ Requires-Python: >=3.9
12
+ Description-Content-Type: text/markdown
13
+
14
+ # nama-hari
15
+
16
+ Utilitas konversi dan analisis nama hari Indonesia, Jawa, Sunda, dan Inggris.
17
+
18
+ ## Instalasi
19
+
20
+ pip install nama-hari
21
+
22
+ ## Penggunaan Cepat
23
+
24
+ from nama_hari import ke_jawa, pasaran, hari_lengkap
25
+
26
+ ke_jawa("Senin") # "Senen"
27
+ ke_jawa("Minggu") # "Ahad"
28
+ pasaran("2026-10-21") # "Wage" (contoh, verifikasi kalender Jawa)
29
+ hari_lengkap("2026-10-21") # "Rabu Wage"
30
+
31
+ ## Fitur
32
+
33
+ - Konversi nama hari: Indonesia, Jawa, Sunda, Inggris (dua arah)
34
+ - Normalisasi variasi ejaan: Jum'at, Jumaah, Senen, Rebo, Kemis, Ahad, dll.
35
+ - Hari pasaran Jawa: Legi, Pahing, Pon, Wage, Kliwon
36
+ - Utilitas tanggal: hari dari tanggal, selisih hari, hari ini, besok
37
+
38
+ ## Contoh Lengkap
39
+
40
+ from nama_hari import (
41
+ ke_jawa, ke_sunda, ke_inggris, ke_indonesia,
42
+ pasaran, hari_lengkap, hari_dari_tanggal, selisih,
43
+ )
44
+
45
+ # Konversi antar bahasa
46
+ ke_jawa("Rabu") # "Rebo"
47
+ ke_sunda("Jumat") # "Jumaah"
48
+ ke_inggris("Senin") # "Monday"
49
+ ke_indonesia("Ahad") # "Minggu"
50
+
51
+ # Hari dari tanggal
52
+ hari_dari_tanggal("2026-10-21") # "Rabu"
53
+
54
+ # Hari pasaran Jawa
55
+ pasaran("2026-10-21") # "Wage"
56
+ hari_lengkap("2026-10-21") # "Rabu Wage"
57
+
58
+ # Selisih hari (0-6)
59
+ selisih("Senin", "Jumat") # 4
60
+ selisih("Jumat", "Senin") # 3
61
+
62
+ ## Daftar Bahasa yang Didukung
63
+
64
+ | Kode | Contoh "Senin" | Contoh "Minggu" |
65
+ |-------------|----------------|-----------------|
66
+ | `indonesia` | Senin | Minggu |
67
+ | `jawa` | Senen | Ahad |
68
+ | `sunda` | Senén | Minggu |
69
+ | `inggris` | Monday | Sunday |
70
+
71
+ ## Catatan tentang Hari Pasaran
72
+
73
+ Hari pasaran Jawa (Legi, Pahing, Pon, Wage, Kliwon) berputar dengan siklus 5 hari,
74
+ berjalan bersamaan dengan siklus 7 hari (minggu) sehingga membentuk siklus 35 hari
75
+ (selapan). Perhitungan menggunakan *anchor date* yang **wajib diverifikasi** dengan
76
+ kalender Jawa resmi sebelum digunakan untuk keperluan serius.
77
+
78
+ ## Development
79
+
80
+ git clone https://github.com/username/nama-hari.git
81
+ cd nama-hari
82
+ python -m venv .venv
83
+ source .venv/bin/activate # Windows: .venv\Scripts\activate
84
+ pip install -e ".[dev]"
85
+ pytest -v
86
+
87
+ ## Build & Rilis
88
+
89
+ python -m build
90
+ twine upload --repository testpypi dist/* # uji di TestPyPI dulu
91
+ twine upload dist/* # rilis ke PyPI
92
+
93
+ ## Lisensi
94
+
95
+ MIT
@@ -0,0 +1,82 @@
1
+ # nama-hari
2
+
3
+ Utilitas konversi dan analisis nama hari Indonesia, Jawa, Sunda, dan Inggris.
4
+
5
+ ## Instalasi
6
+
7
+ pip install nama-hari
8
+
9
+ ## Penggunaan Cepat
10
+
11
+ from nama_hari import ke_jawa, pasaran, hari_lengkap
12
+
13
+ ke_jawa("Senin") # "Senen"
14
+ ke_jawa("Minggu") # "Ahad"
15
+ pasaran("2026-10-21") # "Wage" (contoh, verifikasi kalender Jawa)
16
+ hari_lengkap("2026-10-21") # "Rabu Wage"
17
+
18
+ ## Fitur
19
+
20
+ - Konversi nama hari: Indonesia, Jawa, Sunda, Inggris (dua arah)
21
+ - Normalisasi variasi ejaan: Jum'at, Jumaah, Senen, Rebo, Kemis, Ahad, dll.
22
+ - Hari pasaran Jawa: Legi, Pahing, Pon, Wage, Kliwon
23
+ - Utilitas tanggal: hari dari tanggal, selisih hari, hari ini, besok
24
+
25
+ ## Contoh Lengkap
26
+
27
+ from nama_hari import (
28
+ ke_jawa, ke_sunda, ke_inggris, ke_indonesia,
29
+ pasaran, hari_lengkap, hari_dari_tanggal, selisih,
30
+ )
31
+
32
+ # Konversi antar bahasa
33
+ ke_jawa("Rabu") # "Rebo"
34
+ ke_sunda("Jumat") # "Jumaah"
35
+ ke_inggris("Senin") # "Monday"
36
+ ke_indonesia("Ahad") # "Minggu"
37
+
38
+ # Hari dari tanggal
39
+ hari_dari_tanggal("2026-10-21") # "Rabu"
40
+
41
+ # Hari pasaran Jawa
42
+ pasaran("2026-10-21") # "Wage"
43
+ hari_lengkap("2026-10-21") # "Rabu Wage"
44
+
45
+ # Selisih hari (0-6)
46
+ selisih("Senin", "Jumat") # 4
47
+ selisih("Jumat", "Senin") # 3
48
+
49
+ ## Daftar Bahasa yang Didukung
50
+
51
+ | Kode | Contoh "Senin" | Contoh "Minggu" |
52
+ |-------------|----------------|-----------------|
53
+ | `indonesia` | Senin | Minggu |
54
+ | `jawa` | Senen | Ahad |
55
+ | `sunda` | Senén | Minggu |
56
+ | `inggris` | Monday | Sunday |
57
+
58
+ ## Catatan tentang Hari Pasaran
59
+
60
+ Hari pasaran Jawa (Legi, Pahing, Pon, Wage, Kliwon) berputar dengan siklus 5 hari,
61
+ berjalan bersamaan dengan siklus 7 hari (minggu) sehingga membentuk siklus 35 hari
62
+ (selapan). Perhitungan menggunakan *anchor date* yang **wajib diverifikasi** dengan
63
+ kalender Jawa resmi sebelum digunakan untuk keperluan serius.
64
+
65
+ ## Development
66
+
67
+ git clone https://github.com/username/nama-hari.git
68
+ cd nama-hari
69
+ python -m venv .venv
70
+ source .venv/bin/activate # Windows: .venv\Scripts\activate
71
+ pip install -e ".[dev]"
72
+ pytest -v
73
+
74
+ ## Build & Rilis
75
+
76
+ python -m build
77
+ twine upload --repository testpypi dist/* # uji di TestPyPI dulu
78
+ twine upload dist/* # rilis ke PyPI
79
+
80
+ ## Lisensi
81
+
82
+ MIT
@@ -0,0 +1,20 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "nama-hari"
7
+ version = "0.1.0"
8
+ description = "Utilitas konversi dan analisis nama hari Indonesia, Jawa, Sunda, dan Inggris"
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = {text = "MIT"}
12
+ authors = [
13
+ {name = "Nama Anda", email = "email@anda.com"}
14
+ ]
15
+ keywords = ["hari", "jawa", "pasaran", "kalender", "indonesia"]
16
+ classifiers = [
17
+ "Programming Language :: Python :: 3",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Natural Language :: Indonesian",
20
+ ]
@@ -0,0 +1,15 @@
1
+ """Data package untuk nama_hari."""
2
+ """nama-hari: Utilitas nama hari Indonesia, Jawa, Sunda, Inggris."""
3
+ from .konversi import (
4
+ konversi, ke_indonesia, ke_jawa, ke_sunda, ke_inggris, semua_hari,
5
+ )
6
+ from .pasaran import pasaran, hari_lengkap, PASARAN
7
+ from .tanggal import hari_dari_tanggal, selisih, hari_ini, besok
8
+
9
+ __version__ = "0.1.0"
10
+
11
+ __all__ = [
12
+ "konversi", "ke_indonesia", "ke_jawa", "ke_sunda", "ke_inggris",
13
+ "semua_hari", "pasaran", "hari_lengkap", "PASARAN",
14
+ "hari_dari_tanggal", "selisih", "hari_ini", "besok",
15
+ ]
@@ -0,0 +1,38 @@
1
+ {
2
+ "indonesia": {
3
+ "senin": "Senin",
4
+ "selasa": "Selasa",
5
+ "rabu": "Rabu",
6
+ "kamis": "Kamis",
7
+ "jumat": "Jumat",
8
+ "sabtu": "Sabtu",
9
+ "minggu": "Minggu"
10
+ },
11
+ "jawa": {
12
+ "senin": "Senen",
13
+ "selasa": "Selasa",
14
+ "rabu": "Rebo",
15
+ "kamis": "Kemis",
16
+ "jumat": "Jumat",
17
+ "sabtu": "Setu",
18
+ "minggu": "Ahad"
19
+ },
20
+ "sunda": {
21
+ "senin": "Senén",
22
+ "selasa": "Salasa",
23
+ "rabu": "Rebo",
24
+ "kamis": "Kemis",
25
+ "jumat": "Jumaah",
26
+ "sabtu": "Saptu",
27
+ "minggu": "Minggu"
28
+ },
29
+ "inggris": {
30
+ "senin": "Monday",
31
+ "selasa": "Tuesday",
32
+ "rabu": "Wednesday",
33
+ "kamis": "Thursday",
34
+ "jumat": "Friday",
35
+ "sabtu": "Saturday",
36
+ "minggu": "Sunday"
37
+ }
38
+ }
@@ -0,0 +1,98 @@
1
+ """Modul konversi nama hari antar bahasa."""
2
+ import json
3
+ from pathlib import Path
4
+ from typing import Optional
5
+
6
+ _DATA_PATH = Path(__file__).parent / "data" / "hari.json"
7
+
8
+ with open(_DATA_PATH, encoding="utf-8") as f:
9
+ _DATA = json.load(f)
10
+
11
+ # Peta normalisasi: semua variasi nama -> key kanonik (indonesia lowercase)
12
+ _NORMALISASI = {}
13
+ for _lang, _mapping in _DATA.items():
14
+ for _key, _nama in _mapping.items():
15
+ _NORMALISASI[_nama.lower()] = _key
16
+ # Tambahan variasi umum
17
+ _NORMALISASI.update({
18
+ "jum'at": "jumat",
19
+ "jumaat": "jumat",
20
+ "ahad": "minggu",
21
+ "senen": "senin",
22
+ "rebo": "rabu",
23
+ "kemis": "kamis",
24
+ "setu": "sabtu",
25
+ "saptu": "sabtu",
26
+ "salasa": "selasa",
27
+ "senén": "senin",
28
+ })
29
+
30
+
31
+ def _normalisasi(nama: str) -> str:
32
+ """Normalisasi input nama hari ke key kanonik."""
33
+ key = nama.strip().lower()
34
+ if key not in _NORMALISASI:
35
+ raise ValueError(
36
+ f"Nama hari tidak dikenali: {nama!r}. "
37
+ f"Pilihan: {sorted(set(_NORMALISASI.keys()))}"
38
+ )
39
+ return _NORMALISASI[key]
40
+
41
+
42
+ def konversi(nama: str, ke: str = "jawa") -> str:
43
+ """
44
+ Konversi nama hari dari bahasa apa pun ke bahasa target.
45
+
46
+ Args:
47
+ nama: Nama hari (bisa dalam Indonesia, Jawa, Sunda, Inggris).
48
+ ke: Bahasa target: "indonesia", "jawa", "sunda", "inggris".
49
+
50
+ Returns:
51
+ Nama hari dalam bahasa target.
52
+
53
+ Raises:
54
+ ValueError: Jika nama hari atau bahasa target tidak dikenali.
55
+ """
56
+ if ke not in _DATA:
57
+ raise ValueError(
58
+ f"Bahasa target tidak didukung: {ke!r}. "
59
+ f"Pilihan: {list(_DATA.keys())}"
60
+ )
61
+ key = _normalisasi(nama)
62
+ return _DATA[ke][key]
63
+
64
+
65
+ def ke_indonesia(nama: str) -> str:
66
+ """Konversi nama hari ke bahasa Indonesia."""
67
+ return konversi(nama, "indonesia")
68
+
69
+
70
+ def ke_jawa(nama: str) -> str:
71
+ """Konversi nama hari ke bahasa Jawa."""
72
+ return konversi(nama, "jawa")
73
+
74
+
75
+ def ke_sunda(nama: str) -> str:
76
+ """Konversi nama hari ke bahasa Sunda."""
77
+ return konversi(nama, "sunda")
78
+
79
+
80
+ def ke_inggris(nama: str) -> str:
81
+ """Konversi nama hari ke bahasa Inggris."""
82
+ return konversi(nama, "inggris")
83
+
84
+
85
+ def semua_hari(bahasa: str = "indonesia") -> list[str]:
86
+ """
87
+ Daftar semua nama hari dalam bahasa tertentu, urut Senin-Minggu.
88
+
89
+ Args:
90
+ bahasa: "indonesia", "jawa", "sunda", atau "inggris".
91
+
92
+ Returns:
93
+ List nama hari.
94
+ """
95
+ if bahasa not in _DATA:
96
+ raise ValueError(f"Bahasa tidak didukung: {bahasa!r}")
97
+ urutan = ["senin", "selasa", "rabu", "kamis", "jumat", "sabtu", "minggu"]
98
+ return [_DATA[bahasa][k] for k in urutan]
@@ -0,0 +1,50 @@
1
+ """Modul hari pasaran Jawa (Legi, Pahing, Pon, Wage, Kliwon)."""
2
+ from datetime import date
3
+ from typing import Union
4
+
5
+ PASARAN = ["Legi", "Pahing", "Pon", "Wage", "Kliwon"]
6
+
7
+ # ⚠️ ANCHOR DATE — WAJIB DIVERIFIKASI DENGAN KALENDER JAWA RESMI
8
+ # Referensi umum: 1 Januari 1900 = Senin Pahing (perlu dicek ulang)
9
+ # Jika berbeda, cukup ubah _ANCHOR_DATE dan _ANCHOR_PASARAN di bawah.
10
+ _ANCHOR_DATE = date(1900, 1, 1)
11
+ _ANCHOR_PASARAN = "Pahing"
12
+
13
+
14
+ def pasaran(tanggal: Union[str, date]) -> str:
15
+ """
16
+ Dapatkan hari pasaran Jawa untuk tanggal tertentu.
17
+
18
+ Args:
19
+ tanggal: datetime.date atau string "YYYY-MM-DD".
20
+
21
+ Returns:
22
+ Nama pasaran: "Legi", "Pahing", "Pon", "Wage", atau "Kliwon".
23
+
24
+ Example:
25
+ >>> pasaran("2026-10-21")
26
+ 'Wage' # (contoh, verifikasi dengan kalender Jawa)
27
+ """
28
+ if isinstance(tanggal, str):
29
+ tanggal = date.fromisoformat(tanggal)
30
+ if not isinstance(tanggal, date):
31
+ raise TypeError("tanggal harus datetime.date atau string YYYY-MM-DD")
32
+
33
+ anchor_idx = PASARAN.index(_ANCHOR_PASARAN)
34
+ selisih = (tanggal - _ANCHOR_DATE).days
35
+ idx = (anchor_idx + selisih) % 5
36
+ return PASARAN[idx]
37
+
38
+
39
+ def hari_lengkap(tanggal: Union[str, date]) -> str:
40
+ """
41
+ Gabungan hari biasa + pasaran, contoh: "Rabu Wage".
42
+
43
+ Args:
44
+ tanggal: datetime.date atau string "YYYY-MM-DD".
45
+
46
+ Returns:
47
+ String "Hari Pasaran", contoh "Rabu Wage".
48
+ """
49
+ from .tanggal import hari_dari_tanggal
50
+ return f"{hari_dari_tanggal(tanggal)} {pasaran(tanggal)}"
@@ -0,0 +1,56 @@
1
+ """Modul utilitas tanggal & hari."""
2
+ from datetime import date, datetime
3
+ from typing import Union
4
+
5
+ from .konversi import konversi, semua_hari
6
+
7
+ _HARI_INDONESIA = ["Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]
8
+
9
+
10
+ def _to_date(tanggal: Union[str, date, datetime]) -> date:
11
+ """Konversi input ke datetime.date."""
12
+ if isinstance(tanggal, datetime):
13
+ return tanggal.date()
14
+ if isinstance(tanggal, date):
15
+ return tanggal
16
+ if isinstance(tanggal, str):
17
+ return date.fromisoformat(tanggal)
18
+ raise TypeError("tanggal harus date, datetime, atau string YYYY-MM-DD")
19
+
20
+
21
+ def hari_dari_tanggal(tanggal: Union[str, date, datetime]) -> str:
22
+ """
23
+ Dapatkan nama hari (Indonesia) dari sebuah tanggal.
24
+
25
+ Example:
26
+ >>> hari_dari_tanggal("2026-10-21")
27
+ 'Rabu'
28
+ """
29
+ d = _to_date(tanggal)
30
+ return _HARI_INDONESIA[d.weekday()]
31
+
32
+
33
+ def selisih(hari_a: str, hari_b: str) -> int:
34
+ """
35
+ Selisih hari dari hari_a ke hari_b dalam seminggu (0-6).
36
+
37
+ Example:
38
+ >>> selisih("Senin", "Jumat")
39
+ 4
40
+ >>> selisih("Jumat", "Senin")
41
+ 3
42
+ """
43
+ idx_a = _HARI_INDONESIA.index(konversi(hari_a, "indonesia"))
44
+ idx_b = _HARI_INDONESIA.index(konversi(hari_b, "indonesia"))
45
+ return (idx_b - idx_a) % 7
46
+
47
+
48
+ def hari_ini() -> str:
49
+ """Nama hari ini (Indonesia)."""
50
+ return hari_dari_tanggal(date.today())
51
+
52
+
53
+ def besok() -> str:
54
+ """Nama hari besok (Indonesia)."""
55
+ from datetime import timedelta
56
+ return hari_dari_tanggal(date.today() + timedelta(days=1))
@@ -0,0 +1,45 @@
1
+ import pytest
2
+ from nama_hari import ke_jawa, ke_sunda, ke_inggris, ke_indonesia, semua_hari
3
+
4
+
5
+ def test_ke_jawa():
6
+ assert ke_jawa("Senin") == "Senen"
7
+ assert ke_jawa("Rabu") == "Rebo"
8
+ assert ke_jawa("Minggu") == "Ahad"
9
+
10
+
11
+ def test_ke_inggris():
12
+ assert ke_inggris("Rabu") == "Wednesday"
13
+ assert ke_inggris("Senin") == "Monday"
14
+
15
+
16
+ def test_ke_sunda():
17
+ assert ke_sunda("Jumat") == "Jumaah"
18
+ assert ke_sunda("Sabtu") == "Saptu"
19
+
20
+
21
+ def test_ke_indonesia_dari_jawa():
22
+ assert ke_indonesia("Senen") == "Senin"
23
+ assert ke_indonesia("Rebo") == "Rabu"
24
+ assert ke_indonesia("Ahad") == "Minggu"
25
+
26
+
27
+ def test_variasi_ejaan():
28
+ assert ke_indonesia("Jum'at") == "Jumat"
29
+ assert ke_indonesia("jumaat") == "Jumat"
30
+ assert ke_indonesia("Kemis") == "Kamis"
31
+
32
+
33
+ def test_semua_hari():
34
+ assert semua_hari("jawa") == [
35
+ "Senen", "Selasa", "Rebo", "Kemis", "Jumat", "Setu", "Ahad"
36
+ ]
37
+ assert len(semua_hari("indonesia")) == 7
38
+
39
+
40
+ def test_input_tidak_valid():
41
+ with pytest.raises(ValueError):
42
+ ke_jawa("BukanHari")
43
+ with pytest.raises(ValueError):
44
+ ke_jawa("Senin") # placeholder, ganti dengan bahasa invalid
45
+ ke_indonesia("Senin")
@@ -0,0 +1,25 @@
1
+ from nama_hari import pasaran, hari_lengkap, PASARAN
2
+
3
+
4
+ def test_pasaran_valid():
5
+ hasil = pasaran("2026-10-21")
6
+ assert hasil in PASARAN
7
+
8
+
9
+ def test_pasaran_anchor():
10
+ # ⚠️ Verifikasi dengan kalender Jawa resmi!
11
+ # 1 Januari 1900 = Pahing (sesuai anchor di kode)
12
+ assert pasaran("1900-01-01") == "Pahing"
13
+
14
+
15
+ def test_pasaran_konsisten():
16
+ # Selisih 5 hari harus kembali ke pasaran yang sama
17
+ from datetime import date, timedelta
18
+ t = date(2026, 10, 21)
19
+ assert pasaran(t) == pasaran(t + timedelta(days=5))
20
+
21
+
22
+ def test_hari_lengkap():
23
+ hasil = hari_lengkap("2026-10-21")
24
+ assert hasil.startswith("Rabu ")
25
+ assert any(p in hasil for p in PASARAN)
@@ -0,0 +1,19 @@
1
+ from datetime import date
2
+ from nama_hari import hari_dari_tanggal, selisih, hari_ini, besok
3
+
4
+
5
+ def test_hari_dari_tanggal():
6
+ # 21 Oktober 2026 = Rabu (verifikasi manual)
7
+ assert hari_dari_tanggal("2026-10-21") == "Rabu"
8
+ assert hari_dari_tanggal(date(2026, 10, 21)) == "Rabu"
9
+
10
+
11
+ def test_selisih():
12
+ assert selisih("Senin", "Jumat") == 4
13
+ assert selisih("Jumat", "Senin") == 3
14
+ assert selisih("Senin", "Senin") == 0
15
+
16
+
17
+ def test_hari_ini_dan_besok():
18
+ assert isinstance(hari_ini(), str)
19
+ assert isinstance(besok(), str)