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.
- nama_hari-0.1.0/PKG-INFO +95 -0
- nama_hari-0.1.0/README.md +82 -0
- nama_hari-0.1.0/pyproject.toml +20 -0
- nama_hari-0.1.0/src/nama_hari/__init__.py +15 -0
- nama_hari-0.1.0/src/nama_hari/hari.json +38 -0
- nama_hari-0.1.0/src/nama_hari/konversi.py +98 -0
- nama_hari-0.1.0/src/nama_hari/pasaran.py +50 -0
- nama_hari-0.1.0/src/nama_hari/tanggal.py +56 -0
- nama_hari-0.1.0/test/test_konversi.py +45 -0
- nama_hari-0.1.0/test/test_pasaran.py +25 -0
- nama_hari-0.1.0/test/test_tanggal.py +19 -0
nama_hari-0.1.0/PKG-INFO
ADDED
|
@@ -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)
|