Skip to content

Commit 95d91ac

Browse files
committed
Tambahkan opsi --lokasi-kuki untuk program CLI
1 parent 4ef187a commit 95d91ac

File tree

5 files changed

+108
-32
lines changed

5 files changed

+108
-32
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,14 @@ Untuk menghapus kuki, gunakan opsi `--bersihkan` atau `-c`.
274274
$ kbbi-autentikasi --bersihkan
275275
```
276276

277+
Gunakan opsi `--lokasi-kuki` atau `-l` untuk menentukan lokasi kuki yang akan
278+
disimpan/dimuat.
279+
280+
```
281+
$ kbbi-autentikasi $KBBI_POSEL $KBBI_SANDI --lokasi-kuki kukiku.json
282+
$ kbbi alam --lokasi-kuki kukiku.json
283+
```
284+
277285
> **Catatan:**\
278286
> **`kbbi`** juga bisa dipanggil dengan **`python kbbi.py`**.\
279287
> **`kbbi-autentikasi`** juga bisa dipanggil dengan **`python -c "import kbbi; kbbi.autentikasi()"`**

src/kbbi/kbbi.py

Lines changed: 59 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ def __init__(self, posel=None, sandi=None, lokasi_kuki=None):
500500
501501
:param posel: Alamat posel yang terdaftar di KBBI Daring
502502
:type email: str
503-
:param sandi: Kata sandi untuk akun dengan alamat surel yang diberikan
503+
:param sandi: Kata sandi untuk akun dengan alamat posel yang diberikan
504504
:type sandi: str
505505
:param lokasi_kuki: Lokasi kuki yang akan dimuat/disimpan
506506
:type lokasi_kuki: str atau PathLike
@@ -511,10 +511,7 @@ def __init__(self, posel=None, sandi=None, lokasi_kuki=None):
511511
try:
512512
self.ambil_kuki()
513513
except FileNotFoundError as e:
514-
raise GagalAutentikasi(
515-
"Posel dan sandi tidak diberikan, "
516-
f"tetapi kuki tidak ditemukan di {self.lokasi_kuki}"
517-
) from e
514+
raise KukiTidakDitemukan(self.lokasi_kuki) from e
518515
else:
519516
token = self._ambil_token()
520517
self._autentikasi(posel, sandi, token)
@@ -588,12 +585,24 @@ class GagalAutentikasi(Galat):
588585
"""Galat ketika gagal melakukan autentikasi dengan KBBI."""
589586

590587
def __init__(self, pesan=None):
591-
if pesan is None:
592-
pesan = (
593-
"Gagal melakukan autentikasi dengan alamat posel dan sandi "
594-
"yang diberikan."
588+
super().__init__(
589+
pesan
590+
or "Gagal melakukan autentikasi dengan alamat posel dan sandi "
591+
"yang diberikan."
592+
)
593+
594+
595+
class KukiTidakDitemukan(GagalAutentikasi):
596+
"""Galat ketika lokasi kuki yang diberikan tidak ditemukan."""
597+
598+
def __init__(self, lokasi_kuki, posel_sandi=True):
599+
if posel_sandi:
600+
super().__init__(
601+
f"Posel dan sandi tidak diberikan, "
602+
f"tetapi kuki tidak ditemukan pada {lokasi_kuki}"
595603
)
596-
super().__init__(pesan)
604+
else:
605+
super().__init__(f"Kuki tidak ditemukan pada {lokasi_kuki}!")
597606

598607

599608
def _parse_args_autentikasi(args):
@@ -618,13 +627,19 @@ def _parse_args_autentikasi(args):
618627
help="kata sandi akun KBBI Daring dengan posel yang diberikan",
619628
nargs="?",
620629
)
630+
parser.add_argument(
631+
"--lokasi-kuki",
632+
"-l",
633+
help="lokasi menuju berkas kuki yang akan disimpan",
634+
metavar="LOKASI",
635+
)
621636
parser.add_argument(
622637
"-h",
623638
"-b",
624639
"--help",
625640
"--bantuan",
626-
action="help",
627-
default=argparse.SUPPRESS,
641+
action="store_true",
642+
dest="bantuan",
628643
help="tampilkan pesan bantuan ini dan keluar",
629644
)
630645
parser.add_argument(
@@ -633,15 +648,14 @@ def _parse_args_autentikasi(args):
633648
help="bersihkan kuki yang tersimpan",
634649
action="store_true",
635650
)
636-
return parser.parse_args(args)
651+
return parser.parse_args(args), parser
637652

638653

639-
def _bersihkan_kuki():
640-
lokasi_kuki = AutentikasiKBBI.lokasi_kuki
654+
def _bersihkan_kuki(lokasi_kuki):
641655
try:
642656
lokasi_kuki.unlink()
643657
except FileNotFoundError:
644-
print(f"Kuki tidak ditemukan pada {lokasi_kuki}!")
658+
print(KukiTidakDitemukan(lokasi_kuki, posel_sandi=False))
645659
return 1
646660
else:
647661
print(f"Kuki {lokasi_kuki} berhasil dihapus.")
@@ -652,15 +666,21 @@ def autentikasi(argv=None):
652666
"""Program CLI untuk autentikasi."""
653667
if argv is None:
654668
argv = sys.argv[1:]
655-
if argv == []:
656-
argv = ["-h"]
657-
args = _parse_args_autentikasi(argv)
669+
args, parser = _parse_args_autentikasi(argv)
670+
lokasi_kuki = AutentikasiKBBI.lokasi_kuki
671+
if args.lokasi_kuki:
672+
lokasi_kuki = Path(args.lokasi_kuki)
658673
if args.posel is None and args.sandi is None:
659674
if args.bersihkan:
660-
return _bersihkan_kuki()
675+
return _bersihkan_kuki(lokasi_kuki)
676+
args.bantuan = True
677+
if args.bantuan:
678+
parser.print_help()
661679
return 0
662680
try:
663-
auth = AutentikasiKBBI(args.posel, args.sandi)
681+
auth = AutentikasiKBBI(
682+
args.posel, args.sandi, lokasi_kuki=args.lokasi_kuki
683+
)
664684
except Galat as e:
665685
print(e)
666686
return 1
@@ -671,6 +691,10 @@ def autentikasi(argv=None):
671691
f"{auth.lokasi_kuki}.\n"
672692
"Kuki akan otomatis digunakan pada penggunaan KBBI berikutnya."
673693
)
694+
if args.lokasi_kuki:
695+
print(
696+
"Gunakan opsi --lokasi-kuki yang sama ketika menggunakan KBBI."
697+
)
674698
return 0
675699

676700

@@ -728,6 +752,12 @@ def _parse_args_utama(args):
728752
type=int,
729753
metavar="N",
730754
)
755+
parser.add_argument(
756+
"--lokasi-kuki",
757+
"-l",
758+
help="lokasi menuju berkas kuki yang akan digunakan untuk autentikasi",
759+
metavar="L",
760+
)
731761
return parser.parse_args(args)
732762

733763

@@ -746,8 +776,14 @@ def main(argv=None):
746776
argv = sys.argv[1:]
747777
args = _parse_args_utama(argv)
748778
auth = None
749-
if AutentikasiKBBI.lokasi_kuki.exists():
750-
auth = AutentikasiKBBI()
779+
lokasi_kuki = AutentikasiKBBI.lokasi_kuki
780+
if args.lokasi_kuki:
781+
lokasi_kuki = Path(args.lokasi_kuki)
782+
if lokasi_kuki.exists():
783+
auth = AutentikasiKBBI(lokasi_kuki=lokasi_kuki)
784+
elif args.lokasi_kuki:
785+
print(KukiTidakDitemukan(lokasi_kuki, posel_sandi=False))
786+
return 1
751787
try:
752788
laman = KBBI(args.laman, auth)
753789
except Galat as e:

tests/conftest.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,18 +99,22 @@ def autentikasi_sukses(request, monkeypatch):
9999

100100

101101
@pytest.fixture
102-
def lokasi_kuki(monkeypatch):
103-
lokasi = pathlib.Path("kukifix.json")
104-
monkeypatch.setattr(kbbi.AutentikasiKBBI, "lokasi_kuki", lokasi)
105-
return lokasi
102+
def lokasi_kuki():
103+
return pathlib.Path("kukifix.json")
106104

107105

108106
@pytest.fixture
109-
def kuki(lokasi_kuki):
110-
lokasi_kuki.write_text('{".AspNet.ApplicationCookie": "kuki enak"}')
107+
def mock_lokasi_kuki(lokasi_kuki, monkeypatch):
108+
monkeypatch.setattr(kbbi.AutentikasiKBBI, "lokasi_kuki", lokasi_kuki)
111109
return lokasi_kuki
112110

113111

112+
@pytest.fixture
113+
def kuki(mock_lokasi_kuki):
114+
mock_lokasi_kuki.write_text('{".AspNet.ApplicationCookie": "kuki enak"}')
115+
return mock_lokasi_kuki
116+
117+
114118
@pytest.fixture
115119
def tanpa_kuki(lokasi_kuki):
116120
if lokasi_kuki.exists():

tests/test_cli.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import kbbi
66

77

8-
def test_bersihkan_kuki_tidak_ada(tanpa_kuki, capsys):
8+
def test_bersihkan_kuki_tidak_ada(mock_lokasi_kuki, tanpa_kuki, capsys):
99
hasil = kbbi.autentikasi(["--bersihkan"])
1010
tangkap = capsys.readouterr()
1111
assert tangkap.out == "Kuki tidak ditemukan pada kukifix.json!\n"
@@ -41,14 +41,34 @@ def test_autentikasi_gagal(autentikasi_gagal, capsys):
4141
assert hasil == 1
4242

4343

44-
def test_autentikasi_sukses(autentikasi_sukses, lokasi_kuki, capsys):
44+
def test_autentikasi_sukses(autentikasi_sukses, mock_lokasi_kuki, capsys):
4545
hasil = kbbi.autentikasi(["[email protected]", "p4sti_sukses"])
4646
tangkap = capsys.readouterr()
4747
assert tangkap.out == (
4848
"Autentikasi berhasil dan kuki telah disimpan di kukifix.json.\n"
4949
"Kuki akan otomatis digunakan pada penggunaan KBBI berikutnya.\n"
5050
)
5151
assert hasil == 0
52+
assert (
53+
mock_lokasi_kuki.read_text()
54+
== '{".AspNet.ApplicationCookie": "mockcookie"}'
55+
)
56+
mock_lokasi_kuki.unlink()
57+
58+
59+
def test_autentikasi_sukses_dengan_lokasi_kuki(
60+
autentikasi_sukses, lokasi_kuki, capsys
61+
):
62+
hasil = kbbi.autentikasi(
63+
["[email protected]", "p4sti_sukses", "--lokasi-kuki", "kukifix.json"]
64+
)
65+
tangkap = capsys.readouterr()
66+
assert tangkap.out == (
67+
"Autentikasi berhasil dan kuki telah disimpan di kukifix.json.\n"
68+
"Kuki akan otomatis digunakan pada penggunaan KBBI berikutnya.\n"
69+
"Gunakan opsi --lokasi-kuki yang sama ketika menggunakan KBBI.\n"
70+
)
71+
assert hasil == 0
5272
assert (
5373
lokasi_kuki.read_text()
5474
== '{".AspNet.ApplicationCookie": "mockcookie"}'
@@ -171,3 +191,11 @@ def test_program_utama_main(
171191
tangkap = capsys.readouterr()
172192
assert tangkap.out == lokasi.read_text()
173193
assert hasil == 0
194+
195+
196+
@pytest.mark.parametrize("kbbi_mock", [None], indirect=True)
197+
def test_program_utama_lokasi_kuki_tidak_ada(capsys, kbbi_mock, tanpa_kuki):
198+
hasil = kbbi.main(["alam", "--lokasi-kuki", "kukiku.json"])
199+
tangkap = capsys.readouterr()
200+
assert tangkap.out == "Kuki tidak ditemukan pada kukiku.json!\n"
201+
assert hasil == 1

tests/test_kbbi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def test_autentikasi_tanpa_posel_sandi_kuki_tidak_ada():
4141
kbbi.AutentikasiKBBI(lokasi_kuki="/lokasi/tidak/ada")
4242
assert str(e.value) == (
4343
"Posel dan sandi tidak diberikan, "
44-
"tetapi kuki tidak ditemukan di /lokasi/tidak/ada"
44+
"tetapi kuki tidak ditemukan pada /lokasi/tidak/ada"
4545
)
4646

4747

0 commit comments

Comments
 (0)