From c859a29a9c23b55c4833ac4cb998c7e78f49c98f Mon Sep 17 00:00:00 2001 From: NoAiOne Date: Tue, 17 Mar 2020 23:08:30 +0700 Subject: [PATCH 01/43] Penambahan fitur bagi pengguna terdaftar - etimologi - kata turunan - gabungan kata - peribahasa --- kbbi/kbbi.py | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 265 insertions(+), 5 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 1613445..034c58d 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -11,26 +11,42 @@ import argparse import json import sys +import re from urllib.parse import quote import requests from bs4 import BeautifulSoup +__CHROME_UA__ = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36' + class KBBI: """Sebuah laman dalam KBBI daring.""" host = "https://kbbi.kemdikbud.go.id" - def __init__(self, kueri): + def __init__(self, kueri, email, password): """Membuat objek KBBI baru berdasarkan kueri yang diberikan. :param kueri: Kata kunci pencarian :type kueri: str + :param email: Alamat surel yang terdaftar di KBBI + :type email: str + :param password: Kata sandi dari alamat surel yang terdaftar + :type password: str """ self.nama = kueri + self.terautentikasi = False self._init_pranala() - laman = requests.get(self.pranala) + self.sesi = requests.Session() + self.sesi.headers.update( + { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36' + } + ) + if email and password: + self._autentikasi(email, password) + laman = self.sesi.get(self.pranala) self._cek_galat(laman) self._init_entri(laman) @@ -54,6 +70,35 @@ def _cek_galat(self, laman): if "Entri tidak ditemukan." in laman.text: raise TidakDitemukan(self.nama) + def _autentikasi(self, email, password): + """ + Melakukan autentikasi dengan surel dan sandi yang diberikan. + Berguna untuk mendapatkan segala fitur pengguna terdaftar + + :param email: Alamat surel yang terdaftar di KBBI + :type email: str + :param password: Kata sandi dari alamat surel yang terdaftar + :type password: str + """ + laman = self.sesi.get(f"{self.host}/Account/Login") # Dapatkan __RequestVerificationToken. + token = re.findall(r"", laman.text) + if not token: + raise TerjadiKesalahan() + payload = { + "__RequestVerificationToken": token[0], + "Posel": email, + "KataSandi": password, + "IngatSaya": True, + "IngatSaya": False + } + laman = self.sesi.post( + f"{self.host}/Account/Login", + data=payload + ) + if 'Beranda/Error' in laman.url: + raise GagalAutentikasi() + self.terautentikasi = True + def _init_entri(self, laman): sup = BeautifulSoup(laman.text, "html.parser") estr = "" @@ -99,13 +144,24 @@ class Entri: def __init__(self, entri_html): entri = BeautifulSoup(entri_html, "html.parser") judul = entri.find("h2") + self.terautentikasi = False + self._cek_autentikasi(entri) self._init_nama(judul) self._init_nomor(judul) self._init_kata_dasar(judul) self._init_pelafalan(judul) self._init_varian(judul) + self._init_lain_lain(entri) + self._init_etimologi(entri) self._init_makna(entri) + def _cek_autentikasi(self, entri): + all_href = [ehref['href'] for ehref in entri.find_all('a') if ehref.get('href', None)] + for href in all_href: + if "DataDasarEntri" in href: + self.terautentikasi = True + break + def _init_nama(self, judul): self.nama = ambil_teks_dalam_label(judul, ambil_italic=True) if not self.nama: @@ -131,7 +187,18 @@ def _init_pelafalan(self, judul): self.pelafalan = lafal.text.strip() if lafal else "" def _init_varian(self, judul): - varian = judul.find("small") + if self.terautentikasi: + variasi = judul.find_all('small') + varian = None + for v in variasi: + spanv = v.find('span') + if spanv: + if spanv.get('class'): + if "entrisButton" in spanv['class']: + continue + varian = v + else: + varian = judul.find("small") self.bentuk_tidak_baku = [] self.varian = [] if varian: @@ -145,11 +212,77 @@ def _init_varian(self, judul): varian.text[len("varian: ") :].strip().split(", ") ) + def _init_etimologi(self, entri): + self.etimologi = None + if not self.terautentikasi: + return + etimologi = entri.find_all('b') # , {"style": "margin-left:19px"} + if etimologi: + for etimo in etimologi: + if "Etimologi" in etimo.text: + etistr = "" + for eti in etimo.next_siblings: + if eti.name == "br": + break + etistr += str(eti).strip() + self.etimologi = Etimologi(etistr) + break + + def _init_lain_lain(self, entri): + self.kata_turunan = [] + self.gabungan_kata = [] + self.peribahasa = [] + if not self.terautentikasi: + return + lain_lain = entri.find_all('h4') + kata_turunan = None + gabungan_kata = None + peribahasa = None + for le in lain_lain: + if le: + le_txt = le.text.strip() + if "Kata Turunan" in le_txt: + kata_turunan = le + if "Gabungan Kata" in le_txt: + gabungan_kata = le + if "Peribahasa" in le_txt: + peribahasa = le + if kata_turunan: + kata_turunan = kata_turunan.next_sibling + if kata_turunan: + kata_turunan = kata_turunan.find_all('a') + self.kata_turunan = [kt.text for kt in kata_turunan if kt] + if gabungan_kata: + gabungan_kata = gabungan_kata.next_sibling + if gabungan_kata: + gabungan_kata = gabungan_kata.find_all('a') + self.gabungan_kata = [gk.text for gk in gabungan_kata if gk] + if peribahasa: + peribahasa = peribahasa.next_sibling + if peribahasa: + peribahasa = peribahasa.find_all('a') + self.peribahasa = [p.text for p in peribahasa if p] + def _init_makna(self, entri): if entri.find(color="darkgreen"): makna = [entri] else: makna = entri.find_all("li") + if self.terautentikasi: + old_makna = makna + makna = [] + for om in old_makna: + if om: + if "Usulkan makna baru" in om.text: + continue + makna.append(om) + del old_makna + if self.peribahasa: + makna = makna[:-1] + if self.gabungan_kata: + makna = makna[:-1] + if self.kata_turunan: + makna = makna[:-1] self.makna = [Makna(m) for m in makna] def serialisasi(self): @@ -160,7 +293,11 @@ def serialisasi(self): "pelafalan": self.pelafalan, "bentuk_tidak_baku": self.bentuk_tidak_baku, "varian": self.varian, + "etimologi": self.etimologi.serialisasi() if self.etimologi else None, "makna": [makna.serialisasi() for makna in self.makna], + "kata_turunan": self.kata_turunan, + "gabungan_kata": self.gabungan_kata, + "peribahasa": self.peribahasa } def _makna(self, contoh=True): @@ -197,7 +334,16 @@ def __str__(self, contoh=True): for var in (self.bentuk_tidak_baku, self.varian): if var: hasil += f"\n{self._varian(var)}" - return f"{hasil}\n{self._makna(contoh)}" + if self.etimologi: + hasil += f"\nEtimologi: {self.etimologi.__str__()}" + hasil += f"\n{self._makna(contoh)}" + if self.kata_turunan: + hasil += f"\nKata Turunan: {'; '.join(self.kata_turunan)}" + if self.gabungan_kata: + hasil += f"\nGabungan Kata: {'; '.join(self.gabungan_kata)}" + if self.peribahasa: + hasil += f"\nPeribahasa (mengandung [{self.nama}]): {', '.join(self.peribahasa)}" + return hasil def __repr__(self): return f"" @@ -294,6 +440,97 @@ def __repr__(self): return f"" +class Etimologi: + """Sebuah etimologi dalam sebuah entri KBBI daring.""" + + def __init__(self, etimologi_html): + """Membuat objek Etimologi baru berdasarkan etimologi_html yang diberikan. + + :param etimologi_html: String untuk etimologi yang ingin diproses. + :type etimologi_html: str + """ + if etimologi_html.startswith('['): + etimologi_html = etimologi_html[1:-1] + self.etimologi_data = BeautifulSoup(etimologi_html, 'html.parser') + + self._init_kelas() + self._init_kata() + self.arti = self.etimologi_data.text.strip() + self.arti = self.arti.lstrip( + "\'" + ).rstrip( + "\'" + ).lstrip( + "\"" + ).rstrip( + "\"" + ) + + def _init_kelas(self): + bahasa = self.etimologi_data.find('i', {"style": "color:darkred"}).extract() + kelas_d = [] + while True: + kelas = self.etimologi_data.find('span', {"style": "color:red"}) + if not kelas: + break + kelas = self.etimologi_data.find('span', {"style": "color:red"}).extract() + kelas_d.append(kelas.text.strip()) + self.kelas = kelas_d + self.bahasa = bahasa.text.strip() + + def _init_kata(self): + asal = self.etimologi_data.find('b').extract() + lafal = self.etimologi_data.find('span', {"style": "color:darkgreen"}).extract() + self.asal = asal.text.strip() + self.pelafalan = lafal.text.strip() + + def serialisasi(self): + """Mengembalikan hasil serialisasi objek Etimologi ini. + + :returns: Dictionary hasil serialisasi + :rtype: dict + """ + + return { + "kelas": self.kelas, + "bahasa": self.bahasa, + "asal_kata": self.asal, + "pelafalan": self.pelafalan, + "arti": self.arti + } + + def _kelas(self): + """Mengembalikan representasi string untuk semua kelas kata makna ini. + + :returns: String representasi semua kelas kata + :rtype: str + """ + return " ".join(f"<{k}>" for k in self.kelas) + + def _asal_kata(self): + """Mengembalikan representasi string untuk asal kata etimologi ini. + + :returns: String representasi asal kata + :rtype: str + """ + hasil = "" + if self.asal: + hasil += f"{self.asal} " + if self.pelafalan: + hasil += f"({self.pelafalan})" + return hasil + + def __str__(self): + hasil = f"[{self.bahasa}] " if self.bahasa else "" + hasil += f"{self._kelas()} » " if self.kelas else "" + hasil += self._asal_kata() + hasil += f": {self.arti}" if self.arti else "" + return hasil + + def __repr__(self): + return f"" + + def ambil_teks_dalam_label(sup, ambil_italic=False): """Mengambil semua teks dalam sup label HTML (tanpa anak-anaknya). @@ -341,6 +578,15 @@ def __init__(self): ) +class GagalAutentikasi(Exception): + """ + Galat ketika gagal dalam autentikasi dengan KBBI. + """ + + def __init__(self): + super().__init__('Gagal autentikasi dengan alamat surel dan sandi yang diberikan.') + + def _parse_args(args): parser = argparse.ArgumentParser() parser.add_argument( @@ -365,6 +611,20 @@ def _parse_args(args): type=int, metavar="N", ) + parser.add_argument( + "-U", + "--username", + help="gunakan indentasi sebanyak N untuk serialisasi JSON", + default=None, + metavar="surel", + ) + parser.add_argument( + "-P", + "--password", + help="gunakan indentasi sebanyak N untuk serialisasi JSON", + default=None, + metavar="sandi", + ) return parser.parse_args(args) @@ -381,7 +641,7 @@ def main(argv=None): argv = sys.argv[1:] args = _parse_args(argv) try: - laman = KBBI(args.laman) + laman = KBBI(args.laman, email=args.username, password=args.password) except (TidakDitemukan, TerjadiKesalahan, BatasSehari) as e: print(e) return 1 From c71ba367356a2f1e2461966ea21f6cbc587539b1 Mon Sep 17 00:00:00 2001 From: NoAiOne Date: Tue, 17 Mar 2020 23:16:39 +0700 Subject: [PATCH 02/43] buat email/password menjadi opsional --- kbbi/kbbi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 034c58d..9bc975b 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -25,7 +25,7 @@ class KBBI: host = "https://kbbi.kemdikbud.go.id" - def __init__(self, kueri, email, password): + def __init__(self, kueri, email=None, password=None): """Membuat objek KBBI baru berdasarkan kueri yang diberikan. :param kueri: Kata kunci pencarian From 1a780d218fc1ed215cf9e2cb1148589efba4dd3f Mon Sep 17 00:00:00 2001 From: NoAiOne Date: Tue, 17 Mar 2020 23:37:38 +0700 Subject: [PATCH 03/43] Linting dan hapus UA Chrome --- kbbi/kbbi.py | 96 +++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 9bc975b..92b5481 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -10,15 +10,13 @@ import argparse import json -import sys import re +import sys from urllib.parse import quote import requests from bs4 import BeautifulSoup -__CHROME_UA__ = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36' - class KBBI: """Sebuah laman dalam KBBI daring.""" @@ -39,11 +37,6 @@ def __init__(self, kueri, email=None, password=None): self.terautentikasi = False self._init_pranala() self.sesi = requests.Session() - self.sesi.headers.update( - { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36' - } - ) if email and password: self._autentikasi(email, password) laman = self.sesi.get(self.pranala) @@ -71,8 +64,7 @@ def _cek_galat(self, laman): raise TidakDitemukan(self.nama) def _autentikasi(self, email, password): - """ - Melakukan autentikasi dengan surel dan sandi yang diberikan. + """Melakukan autentikasi dengan surel dan sandi yang diberikan. Berguna untuk mendapatkan segala fitur pengguna terdaftar :param email: Alamat surel yang terdaftar di KBBI @@ -80,8 +72,11 @@ def _autentikasi(self, email, password): :param password: Kata sandi dari alamat surel yang terdaftar :type password: str """ - laman = self.sesi.get(f"{self.host}/Account/Login") # Dapatkan __RequestVerificationToken. - token = re.findall(r"", laman.text) + laman = self.sesi.get(f"{self.host}/Account/Login") + token = re.findall( + r"", + laman.text, + ) if not token: raise TerjadiKesalahan() payload = { @@ -89,13 +84,9 @@ def _autentikasi(self, email, password): "Posel": email, "KataSandi": password, "IngatSaya": True, - "IngatSaya": False } - laman = self.sesi.post( - f"{self.host}/Account/Login", - data=payload - ) - if 'Beranda/Error' in laman.url: + laman = self.sesi.post(f"{self.host}/Account/Login", data=payload) + if "Beranda/Error" in laman.url: raise GagalAutentikasi() self.terautentikasi = True @@ -156,7 +147,11 @@ def __init__(self, entri_html): self._init_makna(entri) def _cek_autentikasi(self, entri): - all_href = [ehref['href'] for ehref in entri.find_all('a') if ehref.get('href', None)] + all_href = [ + ehref["href"] + for ehref in entri.find_all("a") + if ehref.get("href", None) + ] for href in all_href: if "DataDasarEntri" in href: self.terautentikasi = True @@ -188,13 +183,13 @@ def _init_pelafalan(self, judul): def _init_varian(self, judul): if self.terautentikasi: - variasi = judul.find_all('small') + variasi = judul.find_all("small") varian = None for v in variasi: - spanv = v.find('span') + spanv = v.find("span") if spanv: - if spanv.get('class'): - if "entrisButton" in spanv['class']: + if spanv.get("class"): + if "entrisButton" in spanv["class"]: continue varian = v else: @@ -216,7 +211,7 @@ def _init_etimologi(self, entri): self.etimologi = None if not self.terautentikasi: return - etimologi = entri.find_all('b') # , {"style": "margin-left:19px"} + etimologi = entri.find_all("b") if etimologi: for etimo in etimologi: if "Etimologi" in etimo.text: @@ -234,7 +229,7 @@ def _init_lain_lain(self, entri): self.peribahasa = [] if not self.terautentikasi: return - lain_lain = entri.find_all('h4') + lain_lain = entri.find_all("h4") kata_turunan = None gabungan_kata = None peribahasa = None @@ -250,17 +245,17 @@ def _init_lain_lain(self, entri): if kata_turunan: kata_turunan = kata_turunan.next_sibling if kata_turunan: - kata_turunan = kata_turunan.find_all('a') + kata_turunan = kata_turunan.find_all("a") self.kata_turunan = [kt.text for kt in kata_turunan if kt] if gabungan_kata: gabungan_kata = gabungan_kata.next_sibling if gabungan_kata: - gabungan_kata = gabungan_kata.find_all('a') + gabungan_kata = gabungan_kata.find_all("a") self.gabungan_kata = [gk.text for gk in gabungan_kata if gk] if peribahasa: peribahasa = peribahasa.next_sibling if peribahasa: - peribahasa = peribahasa.find_all('a') + peribahasa = peribahasa.find_all("a") self.peribahasa = [p.text for p in peribahasa if p] def _init_makna(self, entri): @@ -293,11 +288,13 @@ def serialisasi(self): "pelafalan": self.pelafalan, "bentuk_tidak_baku": self.bentuk_tidak_baku, "varian": self.varian, - "etimologi": self.etimologi.serialisasi() if self.etimologi else None, + "etimologi": self.etimologi.serialisasi() + if self.etimologi + else None, "makna": [makna.serialisasi() for makna in self.makna], "kata_turunan": self.kata_turunan, "gabungan_kata": self.gabungan_kata, - "peribahasa": self.peribahasa + "peribahasa": self.peribahasa, } def _makna(self, contoh=True): @@ -342,7 +339,8 @@ def __str__(self, contoh=True): if self.gabungan_kata: hasil += f"\nGabungan Kata: {'; '.join(self.gabungan_kata)}" if self.peribahasa: - hasil += f"\nPeribahasa (mengandung [{self.nama}]): {', '.join(self.peribahasa)}" + hasil += f"\nPeribahasa (mengandung [{self.nama}]): " + hasil += f"{', '.join(self.peribahasa)}" return hasil def __repr__(self): @@ -449,38 +447,36 @@ def __init__(self, etimologi_html): :param etimologi_html: String untuk etimologi yang ingin diproses. :type etimologi_html: str """ - if etimologi_html.startswith('['): + if etimologi_html.startswith("["): etimologi_html = etimologi_html[1:-1] - self.etimologi_data = BeautifulSoup(etimologi_html, 'html.parser') + self.etimologi_data = BeautifulSoup(etimologi_html, "html.parser") self._init_kelas() self._init_kata() self.arti = self.etimologi_data.text.strip() - self.arti = self.arti.lstrip( - "\'" - ).rstrip( - "\'" - ).lstrip( - "\"" - ).rstrip( - "\"" - ) + self.arti = self.arti.lstrip("'").rstrip("'").lstrip('"').rstrip('"') def _init_kelas(self): - bahasa = self.etimologi_data.find('i', {"style": "color:darkred"}).extract() + bahasa = self.etimologi_data.find( + "i", {"style": "color:darkred"} + ).extract() kelas_d = [] while True: - kelas = self.etimologi_data.find('span', {"style": "color:red"}) + kelas = self.etimologi_data.find("span", {"style": "color:red"}) if not kelas: break - kelas = self.etimologi_data.find('span', {"style": "color:red"}).extract() + kelas = self.etimologi_data.find( + "span", {"style": "color:red"} + ).extract() kelas_d.append(kelas.text.strip()) self.kelas = kelas_d self.bahasa = bahasa.text.strip() def _init_kata(self): - asal = self.etimologi_data.find('b').extract() - lafal = self.etimologi_data.find('span', {"style": "color:darkgreen"}).extract() + asal = self.etimologi_data.find("b").extract() + lafal = self.etimologi_data.find( + "span", {"style": "color:darkgreen"} + ).extract() self.asal = asal.text.strip() self.pelafalan = lafal.text.strip() @@ -496,7 +492,7 @@ def serialisasi(self): "bahasa": self.bahasa, "asal_kata": self.asal, "pelafalan": self.pelafalan, - "arti": self.arti + "arti": self.arti, } def _kelas(self): @@ -584,7 +580,9 @@ class GagalAutentikasi(Exception): """ def __init__(self): - super().__init__('Gagal autentikasi dengan alamat surel dan sandi yang diberikan.') + super().__init__( + "Gagal autentikasi dengan alamat surel dan sandi yang diberikan." + ) def _parse_args(args): From 8ef51926385108317ccb61fe0e6e3e9999750c74 Mon Sep 17 00:00:00 2001 From: NoAiOne Date: Wed, 18 Mar 2020 07:00:06 +0700 Subject: [PATCH 04/43] Buat implementasi "penyimpanan cookie" --- kbbi/kbbi.py | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 92b5481..f9c08cf 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -10,6 +10,7 @@ import argparse import json +import os import re import sys from urllib.parse import quote @@ -39,6 +40,7 @@ def __init__(self, kueri, email=None, password=None): self.sesi = requests.Session() if email and password: self._autentikasi(email, password) + self.__ambil_cookies() laman = self.sesi.get(self.pranala) self._cek_galat(laman) self._init_entri(laman) @@ -63,6 +65,25 @@ def _cek_galat(self, laman): if "Entri tidak ditemukan." in laman.text: raise TidakDitemukan(self.nama) + def __simpan_cookies(self): + env = {"nt": "LOCALAPPDATA"} + save_folder = os.path.join(os.getenv(env.get(os.name, "HOME")), ".kbbi_data") + if not os.path.isdir(save_folder): + os.mkdir(save_folder) + aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") + with open(f"{save_folder}/cookie.txt", "w") as fp: + fp.write(f".AspNet.ApplicationCookie={aspcookie};") + + def __ambil_cookies(self): + env = {"nt": "LOCALAPPDATA"} + save_folder = os.path.join(os.getenv(env.get(os.name, "HOME")), ".kbbi_data") + if not os.path.isdir(save_folder): + return + aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") + if os.path.isfile(f"{save_folder}/cookie.txt"): + with open(f"{save_folder}/cookie.txt", "r") as fp: + self.sesi.headers.update({"Cookie": fp.read()}) + def _autentikasi(self, email, password): """Melakukan autentikasi dengan surel dan sandi yang diberikan. Berguna untuk mendapatkan segala fitur pengguna terdaftar @@ -88,6 +109,7 @@ def _autentikasi(self, email, password): laman = self.sesi.post(f"{self.host}/Account/Login", data=payload) if "Beranda/Error" in laman.url: raise GagalAutentikasi() + self.__simpan_cookies() self.terautentikasi = True def _init_entri(self, laman): @@ -204,7 +226,7 @@ def _init_varian(self, judul): ).split(", ") else: self.varian = ( - varian.text[len("varian: ") :].strip().split(", ") + varian.text[len("varian: "):].strip().split(", ") ) def _init_etimologi(self, entri): @@ -405,7 +427,7 @@ def _init_kelas(self, makna_label): def _init_contoh(self, makna_label): indeks = makna_label.text.find(": ") if indeks != -1: - contoh = makna_label.text[indeks + 2 :].strip() + contoh = makna_label.text[indeks + 2:].strip() self.contoh = contoh.split("; ") else: self.contoh = [] @@ -612,14 +634,15 @@ def _parse_args(args): parser.add_argument( "-U", "--username", - help="gunakan indentasi sebanyak N untuk serialisasi JSON", + help="gunakan email/surel yang terdaftar pada KBBI" + "untuk mengakses fitur pengguna", default=None, metavar="surel", ) parser.add_argument( "-P", "--password", - help="gunakan indentasi sebanyak N untuk serialisasi JSON", + help="kata sandi email untuk email/surel yang digunakan", default=None, metavar="sandi", ) @@ -640,11 +663,14 @@ def main(argv=None): args = _parse_args(argv) try: laman = KBBI(args.laman, email=args.username, password=args.password) - except (TidakDitemukan, TerjadiKesalahan, BatasSehari) as e: + except (TidakDitemukan, TerjadiKesalahan, + BatasSehari, GagalAutentikasi) as e: print(e) return 1 else: print(_keluaran(laman, args)) + if args.username and args.password: + print('\nTelah disimpan cookies login, silakan hapus argumen --username dan --password') return 0 From a4b59385b63b71abf86dddba16a99dab218499da Mon Sep 17 00:00:00 2001 From: NoAiOne Date: Wed, 18 Mar 2020 07:08:10 +0700 Subject: [PATCH 05/43] Tambah kata kiasan (https://kbbi.kemdikbud.go.id/entri/makan) --- kbbi/kbbi.py | 74 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 27 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index f9c08cf..a4f7e87 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -67,7 +67,9 @@ def _cek_galat(self, laman): def __simpan_cookies(self): env = {"nt": "LOCALAPPDATA"} - save_folder = os.path.join(os.getenv(env.get(os.name, "HOME")), ".kbbi_data") + save_folder = os.path.join( + os.getenv(env.get(os.name, "HOME")), ".kbbi_data" + ) if not os.path.isdir(save_folder): os.mkdir(save_folder) aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") @@ -76,10 +78,14 @@ def __simpan_cookies(self): def __ambil_cookies(self): env = {"nt": "LOCALAPPDATA"} - save_folder = os.path.join(os.getenv(env.get(os.name, "HOME")), ".kbbi_data") + save_folder = os.path.join( + os.getenv(env.get(os.name, "HOME")), ".kbbi_data" + ) if not os.path.isdir(save_folder): return aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") + if aspcookie: + return if os.path.isfile(f"{save_folder}/cookie.txt"): with open(f"{save_folder}/cookie.txt", "r") as fp: self.sesi.headers.update({"Cookie": fp.read()}) @@ -249,36 +255,37 @@ def _init_lain_lain(self, entri): self.kata_turunan = [] self.gabungan_kata = [] self.peribahasa = [] + self.kiasan = [] if not self.terautentikasi: return lain_lain = entri.find_all("h4") - kata_turunan = None - gabungan_kata = None - peribahasa = None for le in lain_lain: if le: le_txt = le.text.strip() if "Kata Turunan" in le_txt: - kata_turunan = le + kata_turunan = le.next_sibling + if kata_turunan: + kata_turunan = kata_turunan.find_all("a") + self.kata_turunan = [ + kt.text for kt in kata_turunan if kt + ] if "Gabungan Kata" in le_txt: - gabungan_kata = le + gabungan_kata = le.next_sibling + if gabungan_kata: + gabungan_kata = gabungan_kata.find_all("a") + self.gabungan_kata = [ + gk.text for gk in gabungan_kata if gk + ] if "Peribahasa" in le_txt: - peribahasa = le - if kata_turunan: - kata_turunan = kata_turunan.next_sibling - if kata_turunan: - kata_turunan = kata_turunan.find_all("a") - self.kata_turunan = [kt.text for kt in kata_turunan if kt] - if gabungan_kata: - gabungan_kata = gabungan_kata.next_sibling - if gabungan_kata: - gabungan_kata = gabungan_kata.find_all("a") - self.gabungan_kata = [gk.text for gk in gabungan_kata if gk] - if peribahasa: - peribahasa = peribahasa.next_sibling - if peribahasa: - peribahasa = peribahasa.find_all("a") - self.peribahasa = [p.text for p in peribahasa if p] + peribahasa = le.next_sibling + if peribahasa: + peribahasa = peribahasa.find_all("a") + self.peribahasa = [p.text for p in peribahasa if p] + if "Kiasan" in le_txt: + kiasan = le.next_sibling + if kiasan: + kiasan = kiasan.find_all("a") + self.kiasan = [k.text for k in kiasan if k] def _init_makna(self, entri): if entri.find(color="darkgreen"): @@ -300,6 +307,8 @@ def _init_makna(self, entri): makna = makna[:-1] if self.kata_turunan: makna = makna[:-1] + if self.kiasan: + makna = makna[:-1] self.makna = [Makna(m) for m in makna] def serialisasi(self): @@ -317,6 +326,7 @@ def serialisasi(self): "kata_turunan": self.kata_turunan, "gabungan_kata": self.gabungan_kata, "peribahasa": self.peribahasa, + "kiasan": self.kiasan, } def _makna(self, contoh=True): @@ -362,7 +372,10 @@ def __str__(self, contoh=True): hasil += f"\nGabungan Kata: {'; '.join(self.gabungan_kata)}" if self.peribahasa: hasil += f"\nPeribahasa (mengandung [{self.nama}]): " - hasil += f"{', '.join(self.peribahasa)}" + hasil += f"{'; '.join(self.peribahasa)}" + if self.kiasan: + hasil += f"\nKiasan (mengandung [{self.nama}]): " + hasil += f"{'; '.join(self.kiasan)}" return hasil def __repr__(self): @@ -663,14 +676,21 @@ def main(argv=None): args = _parse_args(argv) try: laman = KBBI(args.laman, email=args.username, password=args.password) - except (TidakDitemukan, TerjadiKesalahan, - BatasSehari, GagalAutentikasi) as e: + except ( + TidakDitemukan, + TerjadiKesalahan, + BatasSehari, + GagalAutentikasi, + ) as e: print(e) return 1 else: print(_keluaran(laman, args)) if args.username and args.password: - print('\nTelah disimpan cookies login, silakan hapus argumen --username dan --password') + print( + "\nTelah disimpan cookies login, silakan hapus argumen" + " --username dan --password" + ) return 0 From 30ac87adced0d0c59cb75aae5e346cf3d70dbd23 Mon Sep 17 00:00:00 2001 From: NoAiOne Date: Wed, 18 Mar 2020 07:25:23 +0700 Subject: [PATCH 06/43] Buat objek AutentikasiKBBI untuk menggunakan sesi login berkali-kali --- kbbi/kbbi.py | 157 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 96 insertions(+), 61 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index a4f7e87..d32cc04 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -24,27 +24,47 @@ class KBBI: host = "https://kbbi.kemdikbud.go.id" - def __init__(self, kueri, email=None, password=None): + def __init__(self, kueri, auth=None): """Membuat objek KBBI baru berdasarkan kueri yang diberikan. :param kueri: Kata kunci pencarian :type kueri: str - :param email: Alamat surel yang terdaftar di KBBI - :type email: str + :param auth: objek AutentikasiKBBI + :type auth: AutentikasiKBBI :param password: Kata sandi dari alamat surel yang terdaftar :type password: str """ self.nama = kueri self.terautentikasi = False self._init_pranala() - self.sesi = requests.Session() - if email and password: - self._autentikasi(email, password) - self.__ambil_cookies() + if auth: + if not isinstance(auth, AutentikasiKBBI): + raise ValueError( + "KBBI: \"auth\" harus merupakan objek AutentikasiKBBI" + ) + self.sesi = auth.ambil_sesi() + self.terautentikasi = auth.terautentikasi + else: + self.sesi = requests.Session() + self.__ambil_cookies() laman = self.sesi.get(self.pranala) self._cek_galat(laman) self._init_entri(laman) + def __ambil_cookies(self): + env = {"nt": "LOCALAPPDATA"} + save_folder = os.path.join( + os.getenv(env.get(os.name, "HOME")), ".kbbi_data" + ) + if not os.path.isdir(save_folder): + return + aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") + if aspcookie: + return + if os.path.isfile(f"{save_folder}/cookie.txt"): + with open(f"{save_folder}/cookie.txt", "r") as fp: + self.sesi.headers.update({"Cookie": fp.read()}) + def _init_pranala(self): kasus_khusus = [ "." in self.nama, @@ -65,59 +85,6 @@ def _cek_galat(self, laman): if "Entri tidak ditemukan." in laman.text: raise TidakDitemukan(self.nama) - def __simpan_cookies(self): - env = {"nt": "LOCALAPPDATA"} - save_folder = os.path.join( - os.getenv(env.get(os.name, "HOME")), ".kbbi_data" - ) - if not os.path.isdir(save_folder): - os.mkdir(save_folder) - aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") - with open(f"{save_folder}/cookie.txt", "w") as fp: - fp.write(f".AspNet.ApplicationCookie={aspcookie};") - - def __ambil_cookies(self): - env = {"nt": "LOCALAPPDATA"} - save_folder = os.path.join( - os.getenv(env.get(os.name, "HOME")), ".kbbi_data" - ) - if not os.path.isdir(save_folder): - return - aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") - if aspcookie: - return - if os.path.isfile(f"{save_folder}/cookie.txt"): - with open(f"{save_folder}/cookie.txt", "r") as fp: - self.sesi.headers.update({"Cookie": fp.read()}) - - def _autentikasi(self, email, password): - """Melakukan autentikasi dengan surel dan sandi yang diberikan. - Berguna untuk mendapatkan segala fitur pengguna terdaftar - - :param email: Alamat surel yang terdaftar di KBBI - :type email: str - :param password: Kata sandi dari alamat surel yang terdaftar - :type password: str - """ - laman = self.sesi.get(f"{self.host}/Account/Login") - token = re.findall( - r"", - laman.text, - ) - if not token: - raise TerjadiKesalahan() - payload = { - "__RequestVerificationToken": token[0], - "Posel": email, - "KataSandi": password, - "IngatSaya": True, - } - laman = self.sesi.post(f"{self.host}/Account/Login", data=payload) - if "Beranda/Error" in laman.url: - raise GagalAutentikasi() - self.__simpan_cookies() - self.terautentikasi = True - def _init_entri(self, laman): sup = BeautifulSoup(laman.text, "html.parser") estr = "" @@ -577,6 +544,71 @@ def ambil_teks_dalam_label(sup, ambil_italic=False): return "".join(i.strip() for i in sup.find_all(text=True, recursive=False)) +class AutentikasiKBBI: + """Gunakan fitur pengguna terdaftar.""" + + host = "https://kbbi.kemdikbud.go.id" + + def __init__(self, email, password): + """Membuat objek AutentikasiKBBI baru. + + :param email: Alamat surel yang terdaftar di KBBI + :type email: str + :param password: Kata sandi dari alamat surel yang terdaftar + :type password: str + """ + self.terautentikasi = False + self.sesi = requests.Session() + self._autentikasi(email, password) + + def __simpan_cookies(self): + env = {"nt": "LOCALAPPDATA"} + save_folder = os.path.join( + os.getenv(env.get(os.name, "HOME")), ".kbbi_data" + ) + if not os.path.isdir(save_folder): + os.mkdir(save_folder) + aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") + with open(f"{save_folder}/cookie.txt", "w") as fp: + fp.write(f".AspNet.ApplicationCookie={aspcookie};") + + def _autentikasi(self, email, password): + """Melakukan autentikasi dengan surel dan sandi yang diberikan. + Berguna untuk mendapatkan segala fitur pengguna terdaftar + + :param email: Alamat surel yang terdaftar di KBBI + :type email: str + :param password: Kata sandi dari alamat surel yang terdaftar + :type password: str + """ + laman = self.sesi.get(f"{self.host}/Account/Login") + token = re.findall( + r"", + laman.text, + ) + if not token: + raise TerjadiKesalahan() + payload = { + "__RequestVerificationToken": token[0], + "Posel": email, + "KataSandi": password, + "IngatSaya": True, + } + laman = self.sesi.post(f"{self.host}/Account/Login", data=payload) + if "Beranda/Error" in laman.url: + raise GagalAutentikasi() + self.__simpan_cookies() + self.terautentikasi = True + + def ambil_sesi(self): + """Mengembalikan sesi yang telah dibuat. + + :returns: sesi dengan fitur pengguna terdaftar + :rtype: requests.Session() + """ + return self.sesi + + class TidakDitemukan(Exception): """ Galat yang menunjukkan bahwa laman tidak ditemukan dalam KBBI. @@ -675,7 +707,10 @@ def main(argv=None): argv = sys.argv[1:] args = _parse_args(argv) try: - laman = KBBI(args.laman, email=args.username, password=args.password) + auth = None + if args.username and args.password: + auth = AutentikasiKBBI(args.username, args.password) + laman = KBBI(args.laman, auth) except ( TidakDitemukan, TerjadiKesalahan, From 7f7c2c81e27cf29265ccea9c081d727009ad7aae Mon Sep 17 00:00:00 2001 From: NoAiOne Date: Wed, 18 Mar 2020 07:26:56 +0700 Subject: [PATCH 07/43] Reformat dan Linting --- kbbi/kbbi.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index d32cc04..ff8ae3c 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -31,8 +31,6 @@ def __init__(self, kueri, auth=None): :type kueri: str :param auth: objek AutentikasiKBBI :type auth: AutentikasiKBBI - :param password: Kata sandi dari alamat surel yang terdaftar - :type password: str """ self.nama = kueri self.terautentikasi = False @@ -40,7 +38,7 @@ def __init__(self, kueri, auth=None): if auth: if not isinstance(auth, AutentikasiKBBI): raise ValueError( - "KBBI: \"auth\" harus merupakan objek AutentikasiKBBI" + 'KBBI: "auth" harus merupakan objek AutentikasiKBBI' ) self.sesi = auth.ambil_sesi() self.terautentikasi = auth.terautentikasi From 6e667029de49aa74174e1192d57900938b69636c Mon Sep 17 00:00:00 2001 From: NoAiOne Date: Wed, 18 Mar 2020 15:54:09 +0700 Subject: [PATCH 08/43] Sesuaikan dengan saran - Gunakan `pathlib.Path` daripada `os.path` - Buat class utama untuk Galat - Ubah bagian "lain-lain" --- kbbi/kbbi.py | 90 +++++++++++++++++++++------------------------------- 1 file changed, 37 insertions(+), 53 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index ff8ae3c..6bcc862 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -10,9 +10,9 @@ import argparse import json -import os import re import sys +from pathlib import Path from urllib.parse import quote import requests @@ -50,18 +50,16 @@ def __init__(self, kueri, auth=None): self._init_entri(laman) def __ambil_cookies(self): - env = {"nt": "LOCALAPPDATA"} - save_folder = os.path.join( - os.getenv(env.get(os.name, "HOME")), ".kbbi_data" - ) - if not os.path.isdir(save_folder): + save_folder = Path(f"{str(Path.home())}/.config/kbbi_data") + if not save_folder.exists(): return aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") if aspcookie: return - if os.path.isfile(f"{save_folder}/cookie.txt"): - with open(f"{save_folder}/cookie.txt", "r") as fp: - self.sesi.headers.update({"Cookie": fp.read()}) + if save_folder.joinpath("cookies.txt").exists(): + self.sesi.headers.update( + {"Cookie": save_folder.joinpath("cookies.txt").read_text()} + ) def _init_pranala(self): kasus_khusus = [ @@ -224,33 +222,22 @@ def _init_lain_lain(self, entri): if not self.terautentikasi: return lain_lain = entri.find_all("h4") + terkait = { + "Kata Turunan": self.kata_turunan, + "Gabungan Kata": self.gabungan_kata, + "Peribahasa": self.peribahasa, + "Kiasan": self.kiasan, + } for le in lain_lain: - if le: - le_txt = le.text.strip() - if "Kata Turunan" in le_txt: - kata_turunan = le.next_sibling - if kata_turunan: - kata_turunan = kata_turunan.find_all("a") - self.kata_turunan = [ - kt.text for kt in kata_turunan if kt - ] - if "Gabungan Kata" in le_txt: - gabungan_kata = le.next_sibling - if gabungan_kata: - gabungan_kata = gabungan_kata.find_all("a") - self.gabungan_kata = [ - gk.text for gk in gabungan_kata if gk - ] - if "Peribahasa" in le_txt: - peribahasa = le.next_sibling - if peribahasa: - peribahasa = peribahasa.find_all("a") - self.peribahasa = [p.text for p in peribahasa if p] - if "Kiasan" in le_txt: - kiasan = le.next_sibling - if kiasan: - kiasan = kiasan.find_all("a") - self.kiasan = [k.text for k in kiasan if k] + if not le: + continue + le_txt = le.text.strip() + for jenis, daftar in terkait.items(): + if jenis in le_txt: + kumpulan = le.next_sibling + if kumpulan: + kumpulan = kumpulan.find_all("a") + daftar.extend([k.text for k in kumpulan if k]) def _init_makna(self, entri): if entri.find(color="darkgreen"): @@ -560,15 +547,13 @@ def __init__(self, email, password): self._autentikasi(email, password) def __simpan_cookies(self): - env = {"nt": "LOCALAPPDATA"} - save_folder = os.path.join( - os.getenv(env.get(os.name, "HOME")), ".kbbi_data" - ) - if not os.path.isdir(save_folder): - os.mkdir(save_folder) + save_folder = Path(f"{str(Path.home())}/.config/kbbi_data") + if not save_folder.exists(): + save_folder.mkdir() aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") - with open(f"{save_folder}/cookie.txt", "w") as fp: - fp.write(f".AspNet.ApplicationCookie={aspcookie};") + save_folder.joinpath("cookies.txt").write_text( + f".AspNet.ApplicationCookie={aspcookie};" + ) def _autentikasi(self, email, password): """Melakukan autentikasi dengan surel dan sandi yang diberikan. @@ -607,7 +592,11 @@ def ambil_sesi(self): return self.sesi -class TidakDitemukan(Exception): +class Galat(Exception): + pass + + +class TidakDitemukan(Galat): """ Galat yang menunjukkan bahwa laman tidak ditemukan dalam KBBI. """ @@ -616,7 +605,7 @@ def __init__(self, kueri): super().__init__(f"{kueri} tidak ditemukan dalam KBBI!") -class TerjadiKesalahan(Exception): +class TerjadiKesalahan(Galat): """ Galat yang menunjukkan bahwa terjadi kesalahan dari pihak KBBI. Laman: https://kbbi.kemdikbud.go.id/Beranda/Error @@ -626,7 +615,7 @@ def __init__(self): super().__init__("Terjadi kesalahan saat memproses permintaan Anda.") -class BatasSehari(Exception): +class BatasSehari(Galat): """ Galat yang menunjukkan bahwa pencarian telah mencapai batas maksimum dalam sehari. @@ -639,7 +628,7 @@ def __init__(self): ) -class GagalAutentikasi(Exception): +class GagalAutentikasi(Galat): """ Galat ketika gagal dalam autentikasi dengan KBBI. """ @@ -709,12 +698,7 @@ def main(argv=None): if args.username and args.password: auth = AutentikasiKBBI(args.username, args.password) laman = KBBI(args.laman, auth) - except ( - TidakDitemukan, - TerjadiKesalahan, - BatasSehari, - GagalAutentikasi, - ) as e: + except Galat as e: print(e) return 1 else: From e9e49ed27c15b7e9434a2917c9450ad3081c53a6 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Thu, 19 Mar 2020 20:09:14 +0700 Subject: [PATCH 09/43] Sederhanakan kode init makna --- kbbi/kbbi.py | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 6bcc862..156b32a 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -195,7 +195,7 @@ def _init_varian(self, judul): ).split(", ") else: self.varian = ( - varian.text[len("varian: "):].strip().split(", ") + varian.text[len("varian: ") :].strip().split(", ") ) def _init_etimologi(self, entri): @@ -245,22 +245,19 @@ def _init_makna(self, entri): else: makna = entri.find_all("li") if self.terautentikasi: - old_makna = makna - makna = [] - for om in old_makna: - if om: - if "Usulkan makna baru" in om.text: - continue - makna.append(om) - del old_makna - if self.peribahasa: - makna = makna[:-1] - if self.gabungan_kata: - makna = makna[:-1] - if self.kata_turunan: - makna = makna[:-1] - if self.kiasan: - makna = makna[:-1] + makna = [ + m for m in makna if m and "Usulkan makna baru" not in m.text + ] + terkait = sum( + [ + bool(self.kata_turunan), + bool(self.gabungan_kata), + bool(self.peribahasa), + bool(self.kiasan), + ] + ) + if terkait: + makna = makna[:-terkait] self.makna = [Makna(m) for m in makna] def serialisasi(self): @@ -392,7 +389,7 @@ def _init_kelas(self, makna_label): def _init_contoh(self, makna_label): indeks = makna_label.text.find(": ") if indeks != -1: - contoh = makna_label.text[indeks + 2:].strip() + contoh = makna_label.text[indeks + 2 :].strip() self.contoh = contoh.split("; ") else: self.contoh = [] From e1c33fbd92ffeb7191a2f82408e891ab7d9dc0cb Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Thu, 19 Mar 2020 21:44:32 +0700 Subject: [PATCH 10/43] Sederhanakan kode init etimologi --- kbbi/kbbi.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 156b32a..19ad682 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -202,17 +202,15 @@ def _init_etimologi(self, entri): self.etimologi = None if not self.terautentikasi: return - etimologi = entri.find_all("b") + etimologi = entri.find(text="Etimologi:") if etimologi: - for etimo in etimologi: - if "Etimologi" in etimo.text: - etistr = "" - for eti in etimo.next_siblings: - if eti.name == "br": - break - etistr += str(eti).strip() - self.etimologi = Etimologi(etistr) + etimologi = etimologi.parent + etistr = "" + for eti in etimologi.next_siblings: + if eti.name == "br": break + etistr += str(eti).strip() + self.etimologi = Etimologi(etistr) def _init_lain_lain(self, entri): self.kata_turunan = [] @@ -261,22 +259,25 @@ def _init_makna(self, entri): self.makna = [Makna(m) for m in makna] def serialisasi(self): - return { + entri = { "nama": self.nama, "nomor": self.nomor, "kata_dasar": self.kata_dasar, "pelafalan": self.pelafalan, "bentuk_tidak_baku": self.bentuk_tidak_baku, "varian": self.varian, - "etimologi": self.etimologi.serialisasi() - if self.etimologi - else None, "makna": [makna.serialisasi() for makna in self.makna], "kata_turunan": self.kata_turunan, "gabungan_kata": self.gabungan_kata, "peribahasa": self.peribahasa, "kiasan": self.kiasan, } + if self.terautentikasi: + if self.etimologi is not None: + entri.update({"etimologi": self.etimologi.serialisasi()}) + else: + entri.update({"etimologi": None}) + return entri def _makna(self, contoh=True): if len(self.makna) > 1: @@ -313,7 +314,7 @@ def __str__(self, contoh=True): if var: hasil += f"\n{self._varian(var)}" if self.etimologi: - hasil += f"\nEtimologi: {self.etimologi.__str__()}" + hasil += f"\nEtimologi: {self.etimologi}" hasil += f"\n{self._makna(contoh)}" if self.kata_turunan: hasil += f"\nKata Turunan: {'; '.join(self.kata_turunan)}" From c1b9009b10047a3ce028ba4ce52576b4a8220cc4 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 05:14:36 +0700 Subject: [PATCH 11/43] Pecah pemrosesan str untuk entri terkait dalam Entri --- kbbi/kbbi.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 19ad682..496e3f5 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -306,6 +306,21 @@ def _varian(self, varian): return "" return f"{nama}: {', '.join(varian)}" + def _terkait(self): + nama_murni = self.nama.replace(".", "") + hasil = "" + if self.kata_turunan: + hasil += f"\nKata Turunan\n{'; '.join(self.kata_turunan)}" + if self.gabungan_kata: + hasil += f"\nGabungan Kata\n{'; '.join(self.gabungan_kata)}" + if self.peribahasa: + hasil += f"\nPeribahasa (mengandung [{nama_murni}])\n" + hasil += f"{'; '.join(self.peribahasa)}" + if self.kiasan: + hasil += f"\nKiasan (mengandung [{nama_murni}])\n" + hasil += f"{'; '.join(self.kiasan)}" + return hasil + def __str__(self, contoh=True): hasil = self._nama() if self.pelafalan: @@ -316,16 +331,7 @@ def __str__(self, contoh=True): if self.etimologi: hasil += f"\nEtimologi: {self.etimologi}" hasil += f"\n{self._makna(contoh)}" - if self.kata_turunan: - hasil += f"\nKata Turunan: {'; '.join(self.kata_turunan)}" - if self.gabungan_kata: - hasil += f"\nGabungan Kata: {'; '.join(self.gabungan_kata)}" - if self.peribahasa: - hasil += f"\nPeribahasa (mengandung [{self.nama}]): " - hasil += f"{'; '.join(self.peribahasa)}" - if self.kiasan: - hasil += f"\nKiasan (mengandung [{self.nama}]): " - hasil += f"{'; '.join(self.kiasan)}" + hasil += self._terkait() return hasil def __repr__(self): From f3f28d99d810c02e53ad3d2a5e59023d381e110e Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 05:15:20 +0700 Subject: [PATCH 12/43] Sederhanakan proses pengecekan terautentikasi --- kbbi/kbbi.py | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 496e3f5..84001af 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -33,7 +33,6 @@ def __init__(self, kueri, auth=None): :type auth: AutentikasiKBBI """ self.nama = kueri - self.terautentikasi = False self._init_pranala() if auth: if not isinstance(auth, AutentikasiKBBI): @@ -41,11 +40,11 @@ def __init__(self, kueri, auth=None): 'KBBI: "auth" harus merupakan objek AutentikasiKBBI' ) self.sesi = auth.ambil_sesi() - self.terautentikasi = auth.terautentikasi else: self.sesi = requests.Session() self.__ambil_cookies() laman = self.sesi.get(self.pranala) + self._cek_autentikasi(laman) self._cek_galat(laman) self._init_entri(laman) @@ -61,6 +60,9 @@ def __ambil_cookies(self): {"Cookie": save_folder.joinpath("cookies.txt").read_text()} ) + def _cek_autentikasi(self, laman): + self.terautentikasi = "loginLink" not in laman.text + def _init_pranala(self): kasus_khusus = [ "." in self.nama, @@ -88,7 +90,7 @@ def _init_entri(self, laman): for label in sup.find("hr").next_siblings: if label.name == "hr": if label.get("style") is None: - self.entri.append(Entri(estr)) + self.entri.append(Entri(estr, self.terautentikasi)) break else: continue @@ -96,7 +98,7 @@ def _init_entri(self, laman): if label.get("style") == "color:gray": continue if estr: - self.entri.append(Entri(estr)) + self.entri.append(Entri(estr, self.terautentikasi)) estr = "" estr += str(label).strip() @@ -123,11 +125,10 @@ def __repr__(self): class Entri: """Sebuah entri dalam sebuah laman KBBI daring.""" - def __init__(self, entri_html): + def __init__(self, entri_html, terautentikasi=False): entri = BeautifulSoup(entri_html, "html.parser") judul = entri.find("h2") - self.terautentikasi = False - self._cek_autentikasi(entri) + self.terautentikasi = terautentikasi self._init_nama(judul) self._init_nomor(judul) self._init_kata_dasar(judul) @@ -137,17 +138,6 @@ def __init__(self, entri_html): self._init_etimologi(entri) self._init_makna(entri) - def _cek_autentikasi(self, entri): - all_href = [ - ehref["href"] - for ehref in entri.find_all("a") - if ehref.get("href", None) - ] - for href in all_href: - if "DataDasarEntri" in href: - self.terautentikasi = True - break - def _init_nama(self, judul): self.nama = ambil_teks_dalam_label(judul, ambil_italic=True) if not self.nama: From 8e53b91a9238c4ecce8ca42702c31bcbd27f7e06 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 10:31:48 +0700 Subject: [PATCH 13/43] Sederhanakan kode pemeriksaan varian --- kbbi/kbbi.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 84001af..27d71f1 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -168,10 +168,8 @@ def _init_varian(self, judul): varian = None for v in variasi: spanv = v.find("span") - if spanv: - if spanv.get("class"): - if "entrisButton" in spanv["class"]: - continue + if spanv and "entrisButton" in spanv.get("class", []): + continue varian = v else: varian = judul.find("small") From d92254febfb471085b53c04434d9ec30d14bf443 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 11:32:36 +0700 Subject: [PATCH 14/43] Kurangi indentasi dengan return terlebih dahulu --- kbbi/kbbi.py | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 27d71f1..85e1d71 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -175,30 +175,30 @@ def _init_varian(self, judul): varian = judul.find("small") self.bentuk_tidak_baku = [] self.varian = [] - if varian: - bentuk_tidak_baku = varian.find_all("b") - if bentuk_tidak_baku: - self.bentuk_tidak_baku = "".join( - e.text.strip() for e in bentuk_tidak_baku - ).split(", ") - else: - self.varian = ( - varian.text[len("varian: ") :].strip().split(", ") - ) + if varian is None: + return + bentuk_tidak_baku = varian.find_all("b") + if bentuk_tidak_baku: + self.bentuk_tidak_baku = "".join( + e.text.strip() for e in bentuk_tidak_baku + ).split(", ") + else: + self.varian = varian.text[len("varian: ") :].strip().split(", ") def _init_etimologi(self, entri): self.etimologi = None if not self.terautentikasi: return etimologi = entri.find(text="Etimologi:") - if etimologi: - etimologi = etimologi.parent - etistr = "" - for eti in etimologi.next_siblings: - if eti.name == "br": - break - etistr += str(eti).strip() - self.etimologi = Etimologi(etistr) + if etimologi is None: + return + etimologi = etimologi.parent + etistr = "" + for eti in etimologi.next_siblings: + if eti.name == "br": + break + etistr += str(eti).strip() + self.etimologi = Etimologi(etistr) def _init_lain_lain(self, entri): self.kata_turunan = [] @@ -318,7 +318,8 @@ def __str__(self, contoh=True): hasil += f"\n{self._varian(var)}" if self.etimologi: hasil += f"\nEtimologi: {self.etimologi}" - hasil += f"\n{self._makna(contoh)}" + if self.makna: + hasil += f"\n{self._makna(contoh)}" hasil += self._terkait() return hasil From 2ebe98024e251c8eb1884fc4b566b581e5b825fb Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 12:18:01 +0700 Subject: [PATCH 15/43] Ubah lain_lain menjadi terkait dan sederhanakan kode --- kbbi/kbbi.py | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 85e1d71..cf4f912 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -134,7 +134,7 @@ def __init__(self, entri_html, terautentikasi=False): self._init_kata_dasar(judul) self._init_pelafalan(judul) self._init_varian(judul) - self._init_lain_lain(entri) + self._init_terkait(entri) self._init_etimologi(entri) self._init_makna(entri) @@ -200,25 +200,25 @@ def _init_etimologi(self, entri): etistr += str(eti).strip() self.etimologi = Etimologi(etistr) - def _init_lain_lain(self, entri): + def _init_terkait(self, entri): self.kata_turunan = [] self.gabungan_kata = [] self.peribahasa = [] self.kiasan = [] - if not self.terautentikasi: - return - lain_lain = entri.find_all("h4") - terkait = { + self.terkait = { "Kata Turunan": self.kata_turunan, "Gabungan Kata": self.gabungan_kata, "Peribahasa": self.peribahasa, "Kiasan": self.kiasan, } - for le in lain_lain: + if not self.terautentikasi: + return + terkait = entri.find_all("h4") + for le in terkait: if not le: continue le_txt = le.text.strip() - for jenis, daftar in terkait.items(): + for jenis, daftar in self.terkait.items(): if jenis in le_txt: kumpulan = le.next_sibling if kumpulan: @@ -234,14 +234,7 @@ def _init_makna(self, entri): makna = [ m for m in makna if m and "Usulkan makna baru" not in m.text ] - terkait = sum( - [ - bool(self.kata_turunan), - bool(self.gabungan_kata), - bool(self.peribahasa), - bool(self.kiasan), - ] - ) + terkait = sum([bool(t) for t in self.terkait.values()]) if terkait: makna = makna[:-terkait] self.makna = [Makna(m) for m in makna] From f218635d9dff21c0b27533e9416342281ec2eab8 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 12:36:39 +0700 Subject: [PATCH 16/43] Gabung variabel untuk entri-entri terkait menjadi satu dict --- kbbi/kbbi.py | 47 ++++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index cf4f912..caf0dfb 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -201,15 +201,11 @@ def _init_etimologi(self, entri): self.etimologi = Etimologi(etistr) def _init_terkait(self, entri): - self.kata_turunan = [] - self.gabungan_kata = [] - self.peribahasa = [] - self.kiasan = [] self.terkait = { - "Kata Turunan": self.kata_turunan, - "Gabungan Kata": self.gabungan_kata, - "Peribahasa": self.peribahasa, - "Kiasan": self.kiasan, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [], } if not self.terautentikasi: return @@ -218,12 +214,12 @@ def _init_terkait(self, entri): if not le: continue le_txt = le.text.strip() - for jenis, daftar in self.terkait.items(): - if jenis in le_txt: + for jenis in self.terkait: + if jenis.replace("_", " ").title() in le_txt: kumpulan = le.next_sibling if kumpulan: kumpulan = kumpulan.find_all("a") - daftar.extend([k.text for k in kumpulan if k]) + self.terkait[jenis] = [k.text for k in kumpulan if k] def _init_makna(self, entri): if entri.find(color="darkgreen"): @@ -248,16 +244,13 @@ def serialisasi(self): "bentuk_tidak_baku": self.bentuk_tidak_baku, "varian": self.varian, "makna": [makna.serialisasi() for makna in self.makna], - "kata_turunan": self.kata_turunan, - "gabungan_kata": self.gabungan_kata, - "peribahasa": self.peribahasa, - "kiasan": self.kiasan, } if self.terautentikasi: if self.etimologi is not None: entri.update({"etimologi": self.etimologi.serialisasi()}) else: entri.update({"etimologi": None}) + entri.update(self.terkait) return entri def _makna(self, contoh=True): @@ -290,16 +283,15 @@ def _varian(self, varian): def _terkait(self): nama_murni = self.nama.replace(".", "") hasil = "" - if self.kata_turunan: - hasil += f"\nKata Turunan\n{'; '.join(self.kata_turunan)}" - if self.gabungan_kata: - hasil += f"\nGabungan Kata\n{'; '.join(self.gabungan_kata)}" - if self.peribahasa: - hasil += f"\nPeribahasa (mengandung [{nama_murni}])\n" - hasil += f"{'; '.join(self.peribahasa)}" - if self.kiasan: - hasil += f"\nKiasan (mengandung [{nama_murni}])\n" - hasil += f"{'; '.join(self.kiasan)}" + header = { + "kata_turunan": "\nKata Turunan", + "gabungan_kata": "\nGabungan Kata", + "peribahasa": f"\nPeribahasa (mengandung [{nama_murni}])", + "kiasan": f"\nKiasan (mengandung [{nama_murni}])", + } + for key, head in header.items(): + if self.terkait[key]: + hasil += f"{head}\n{'; '.join(self.terkait[key])}" return hasil def __str__(self, contoh=True): @@ -309,11 +301,12 @@ def __str__(self, contoh=True): for var in (self.bentuk_tidak_baku, self.varian): if var: hasil += f"\n{self._varian(var)}" - if self.etimologi: + if self.terautentikasi and self.etimologi: hasil += f"\nEtimologi: {self.etimologi}" if self.makna: hasil += f"\n{self._makna(contoh)}" - hasil += self._terkait() + if self.terautentikasi: + hasil += self._terkait() return hasil def __repr__(self): From dc857992453ae00c8ac9bcca061920cf9824f8ed Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 14:53:17 +0700 Subject: [PATCH 17/43] Sederhanakan pemrosesan etimologi --- kbbi/kbbi.py | 44 ++++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index caf0dfb..18773e9 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -413,36 +413,24 @@ def __init__(self, etimologi_html): :param etimologi_html: String untuk etimologi yang ingin diproses. :type etimologi_html: str """ - if etimologi_html.startswith("["): - etimologi_html = etimologi_html[1:-1] - self.etimologi_data = BeautifulSoup(etimologi_html, "html.parser") - - self._init_kelas() - self._init_kata() - self.arti = self.etimologi_data.text.strip() - self.arti = self.arti.lstrip("'").rstrip("'").lstrip('"').rstrip('"') - - def _init_kelas(self): - bahasa = self.etimologi_data.find( - "i", {"style": "color:darkred"} - ).extract() - kelas_d = [] - while True: - kelas = self.etimologi_data.find("span", {"style": "color:red"}) - if not kelas: - break - kelas = self.etimologi_data.find( - "span", {"style": "color:red"} - ).extract() - kelas_d.append(kelas.text.strip()) - self.kelas = kelas_d + etimologi_html = etimologi_html.lstrip("[").rstrip("]") + etimologi = BeautifulSoup(etimologi_html, "html.parser") + self._init_bahasa(etimologi) + self._init_kelas(etimologi) + self._init_kata(etimologi) + self.arti = etimologi.text.strip().strip("'\"") + + def _init_bahasa(self, etimologi): + bahasa = etimologi.find("i", style="color:darkred").extract() self.bahasa = bahasa.text.strip() - def _init_kata(self): - asal = self.etimologi_data.find("b").extract() - lafal = self.etimologi_data.find( - "span", {"style": "color:darkgreen"} - ).extract() + def _init_kelas(self, etimologi): + kelas = etimologi.find_all("span", style="color:red") + self.kelas = [k.extract().text.strip() for k in kelas] + + def _init_kata(self, etimologi): + asal = etimologi.find("b").extract() + lafal = etimologi.find("span", style="color:darkgreen").extract() self.asal = asal.text.strip() self.pelafalan = lafal.text.strip() From 7bc9f736c6c8b400a1d2eb186312d29418d3a10d Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 14:59:10 +0700 Subject: [PATCH 18/43] Pecah arti etimologi menjadi list --- kbbi/kbbi.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 18773e9..9f3f6c5 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -418,7 +418,7 @@ def __init__(self, etimologi_html): self._init_bahasa(etimologi) self._init_kelas(etimologi) self._init_kata(etimologi) - self.arti = etimologi.text.strip().strip("'\"") + self._init_arti(etimologi) def _init_bahasa(self, etimologi): bahasa = etimologi.find("i", style="color:darkred").extract() @@ -434,6 +434,9 @@ def _init_kata(self, etimologi): self.asal = asal.text.strip() self.pelafalan = lafal.text.strip() + def _init_arti(self, etimologi): + self.arti = etimologi.text.strip().strip("'\"").split("; ") + def serialisasi(self): """Mengembalikan hasil serialisasi objek Etimologi ini. @@ -470,11 +473,14 @@ def _asal_kata(self): hasil += f"({self.pelafalan})" return hasil + def _arti(self): + return "; ".join(self.arti) + def __str__(self): hasil = f"[{self.bahasa}] " if self.bahasa else "" hasil += f"{self._kelas()} » " if self.kelas else "" hasil += self._asal_kata() - hasil += f": {self.arti}" if self.arti else "" + hasil += f": {self._arti()}" if self.arti else "" return hasil def __repr__(self): From ce50085fe2bfcbef4e607fa6ca1de171b6b1c65c Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 15:01:52 +0700 Subject: [PATCH 19/43] Gunakan asal kata untuk representasi etimologi --- kbbi/kbbi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 9f3f6c5..88db11c 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -484,7 +484,7 @@ def __str__(self): return hasil def __repr__(self): - return f"" + return f"" def ambil_teks_dalam_label(sup, ambil_italic=False): From cfd866cafdf58a33e85c14c13ca64d77c1d780df Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 15:33:30 +0700 Subject: [PATCH 20/43] Buat pengolahan etimologi menjadi lebih aman Antisipasi jika ada atribut yang tidak lengkap Format juga sedikit diubah agar lebih sesuai dengan situs asli --- kbbi/kbbi.py | 48 +++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 88db11c..4ce2ddd 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -417,22 +417,25 @@ def __init__(self, etimologi_html): etimologi = BeautifulSoup(etimologi_html, "html.parser") self._init_bahasa(etimologi) self._init_kelas(etimologi) - self._init_kata(etimologi) + self._init_asal_kata(etimologi) + self._init_pelafalan(etimologi) self._init_arti(etimologi) def _init_bahasa(self, etimologi): - bahasa = etimologi.find("i", style="color:darkred").extract() - self.bahasa = bahasa.text.strip() + bahasa = etimologi.find("i", style="color:darkred") + self.bahasa = ekstraksi_aman(bahasa) def _init_kelas(self, etimologi): kelas = etimologi.find_all("span", style="color:red") - self.kelas = [k.extract().text.strip() for k in kelas] + self.kelas = [ekstraksi_aman(k) for k in kelas] - def _init_kata(self, etimologi): - asal = etimologi.find("b").extract() - lafal = etimologi.find("span", style="color:darkgreen").extract() - self.asal = asal.text.strip() - self.pelafalan = lafal.text.strip() + def _init_asal_kata(self, etimologi): + asal = etimologi.find("b") + self.asal_kata = ekstraksi_aman(asal) + + def _init_pelafalan(self, etimologi): + lafal = etimologi.find("span", style="color:darkgreen") + self.pelafalan = ekstraksi_aman(lafal) def _init_arti(self, etimologi): self.arti = etimologi.text.strip().strip("'\"").split("; ") @@ -447,7 +450,7 @@ def serialisasi(self): return { "kelas": self.kelas, "bahasa": self.bahasa, - "asal_kata": self.asal, + "asal_kata": self.asal_kata, "pelafalan": self.pelafalan, "arti": self.arti, } @@ -458,7 +461,7 @@ def _kelas(self): :returns: String representasi semua kelas kata :rtype: str """ - return " ".join(f"<{k}>" for k in self.kelas) + return " ".join(f"({k})" for k in self.kelas) def _asal_kata(self): """Mengembalikan representasi string untuk asal kata etimologi ini. @@ -466,25 +469,21 @@ def _asal_kata(self): :returns: String representasi asal kata :rtype: str """ - hasil = "" - if self.asal: - hasil += f"{self.asal} " - if self.pelafalan: - hasil += f"({self.pelafalan})" - return hasil + return " ".join((self.asal_kata, self.pelafalan)) def _arti(self): return "; ".join(self.arti) def __str__(self): - hasil = f"[{self.bahasa}] " if self.bahasa else "" - hasil += f"{self._kelas()} » " if self.kelas else "" - hasil += self._asal_kata() + hasil = f"[{self.bahasa}]" if self.bahasa else "" + hasil += f" {self._kelas()}" if self.kelas else "" + if self.asal_kata or self.pelafalan: + hasil += f" {self._asal_kata()}" hasil += f": {self._arti()}" if self.arti else "" return hasil def __repr__(self): - return f"" + return f"" def ambil_teks_dalam_label(sup, ambil_italic=False): @@ -502,6 +501,13 @@ def ambil_teks_dalam_label(sup, ambil_italic=False): return "".join(i.strip() for i in sup.find_all(text=True, recursive=False)) +def ekstraksi_aman(sup): + """Mengekstraksi sup dan mengembalikan .text.strip()-nya secara aman.""" + if sup: + return sup.extract().text.strip() + return "" + + class AutentikasiKBBI: """Gunakan fitur pengguna terdaftar.""" From 5f5bf81b45053d5ab8ee3abd8fe963951d2ff72c Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 16:54:30 +0700 Subject: [PATCH 21/43] Perbaiki pengolahan prakategorial jika terautentikasi --- kbbi/kbbi.py | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 4ce2ddd..5b30004 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -222,17 +222,18 @@ def _init_terkait(self, entri): self.terkait[jenis] = [k.text for k in kumpulan if k] def _init_makna(self, entri): - if entri.find(color="darkgreen"): - makna = [entri] + prakategorial = entri.find(color="darkgreen") + if prakategorial: + makna = [prakategorial] else: makna = entri.find_all("li") - if self.terautentikasi: + if self.terautentikasi and not prakategorial: makna = [ m for m in makna if m and "Usulkan makna baru" not in m.text ] - terkait = sum([bool(t) for t in self.terkait.values()]) - if terkait: - makna = makna[:-terkait] + terkait = sum([bool(t) for t in self.terkait.values()]) + if terkait: + makna = makna[:-terkait] self.makna = [Makna(m) for m in makna] def serialisasi(self): @@ -322,13 +323,23 @@ def __init__(self, makna_label): self._init_contoh(makna_label) self.submakna = self.submakna.split("; ") + def _init_prakategorial(self, prakategorial): + cari = prakategorial.next_sibling + self.submakna = cari.strip() + self.submakna += f" {cari.next_sibling.text.strip()}" + + def _init_rujukan(self, rujukan): + self.submakna = f"→ {ambil_teks_dalam_label(rujukan)}" + nomor = rujukan.find("sup") + if nomor: + self.submakna += f" ({nomor.text.strip()})" + def _init_submakna(self, makna_label): - baku = makna_label.find("a") - if baku: - self.submakna = f"→ {ambil_teks_dalam_label(baku)}" - nomor = baku.find("sup") - if nomor: - self.submakna += f" ({nomor.text.strip()})" + rujukan = makna_label.find("a") + if rujukan: + self._init_rujukan(rujukan) + elif makna_label.get("color") == "darkgreen": + self._init_prakategorial(makna_label) else: self.submakna = ( "".join( @@ -340,17 +351,12 @@ def _init_submakna(self, makna_label): def _init_kelas(self, makna_label): kelas = makna_label.find(color="red") - lain = makna_label.find(color="darkgreen") info = makna_label.find(color="green") if kelas: kelas = kelas.find_all("span") - if lain: - kelas = [lain] - self.submakna = lain.next_sibling.strip() - self.submakna += ( - f" {makna_label.find(color='grey').get_text().strip()}" - ) + if makna_label.get("color") == "darkgreen": # prakategorial + kelas = [makna_label] self.kelas = [] for k in kelas: From 02de31a54bd053baa9995eb1ad8c7ada94dd2917 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 17:25:38 +0700 Subject: [PATCH 22/43] Perbaiki kasus uji untuk entri yang tidak bermakna --- tests/kasus/str/semakin.txt | 1 - tests/kasus/str_tanpa_contoh/semakin.txt | 1 - 2 files changed, 2 deletions(-) diff --git a/tests/kasus/str/semakin.txt b/tests/kasus/str/semakin.txt index 2cdedf8..9133ac6 100644 --- a/tests/kasus/str/semakin.txt +++ b/tests/kasus/str/semakin.txt @@ -1,5 +1,4 @@ makin » se.ma.kin - se.ma.kin /sêmakin/ → makin diff --git a/tests/kasus/str_tanpa_contoh/semakin.txt b/tests/kasus/str_tanpa_contoh/semakin.txt index 2cdedf8..9133ac6 100644 --- a/tests/kasus/str_tanpa_contoh/semakin.txt +++ b/tests/kasus/str_tanpa_contoh/semakin.txt @@ -1,5 +1,4 @@ makin » se.ma.kin - se.ma.kin /sêmakin/ → makin From 5e8e95a7f2a70ee553a5d2411ee281fcf57a4ce5 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 18:35:04 +0700 Subject: [PATCH 23/43] Ubah cookies -> kuki --- kbbi/kbbi.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 5b30004..d53d8c4 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -42,22 +42,22 @@ def __init__(self, kueri, auth=None): self.sesi = auth.ambil_sesi() else: self.sesi = requests.Session() - self.__ambil_cookies() + self.__ambil_kuki() laman = self.sesi.get(self.pranala) self._cek_autentikasi(laman) self._cek_galat(laman) self._init_entri(laman) - def __ambil_cookies(self): + def __ambil_kuki(self): save_folder = Path(f"{str(Path.home())}/.config/kbbi_data") if not save_folder.exists(): return aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") if aspcookie: return - if save_folder.joinpath("cookies.txt").exists(): + if save_folder.joinpath("kuki.txt").exists(): self.sesi.headers.update( - {"Cookie": save_folder.joinpath("cookies.txt").read_text()} + {"Cookie": save_folder.joinpath("kuki.txt").read_text()} ) def _cek_autentikasi(self, laman): @@ -531,12 +531,12 @@ def __init__(self, email, password): self.sesi = requests.Session() self._autentikasi(email, password) - def __simpan_cookies(self): + def __simpan_kuki(self): save_folder = Path(f"{str(Path.home())}/.config/kbbi_data") if not save_folder.exists(): save_folder.mkdir() aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") - save_folder.joinpath("cookies.txt").write_text( + save_folder.joinpath("kuki.txt").write_text( f".AspNet.ApplicationCookie={aspcookie};" ) @@ -565,7 +565,7 @@ def _autentikasi(self, email, password): laman = self.sesi.post(f"{self.host}/Account/Login", data=payload) if "Beranda/Error" in laman.url: raise GagalAutentikasi() - self.__simpan_cookies() + self.__simpan_kuki() self.terautentikasi = True def ambil_sesi(self): @@ -690,7 +690,7 @@ def main(argv=None): print(_keluaran(laman, args)) if args.username and args.password: print( - "\nTelah disimpan cookies login, silakan hapus argumen" + "\nTelah disimpan kuki login, silakan hapus argumen" " --username dan --password" ) return 0 From 42c184138626993ae452516e21393c919b5a9eda Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Fri, 20 Mar 2020 20:55:22 +0700 Subject: [PATCH 24/43] Pindahkan method ambil cookie ke AutentikasiKBBI --- kbbi/kbbi.py | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index d53d8c4..15849e5 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -34,7 +34,7 @@ def __init__(self, kueri, auth=None): """ self.nama = kueri self._init_pranala() - if auth: + if auth is not None: if not isinstance(auth, AutentikasiKBBI): raise ValueError( 'KBBI: "auth" harus merupakan objek AutentikasiKBBI' @@ -42,24 +42,11 @@ def __init__(self, kueri, auth=None): self.sesi = auth.ambil_sesi() else: self.sesi = requests.Session() - self.__ambil_kuki() laman = self.sesi.get(self.pranala) self._cek_autentikasi(laman) self._cek_galat(laman) self._init_entri(laman) - def __ambil_kuki(self): - save_folder = Path(f"{str(Path.home())}/.config/kbbi_data") - if not save_folder.exists(): - return - aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") - if aspcookie: - return - if save_folder.joinpath("kuki.txt").exists(): - self.sesi.headers.update( - {"Cookie": save_folder.joinpath("kuki.txt").read_text()} - ) - def _cek_autentikasi(self, laman): self.terautentikasi = "loginLink" not in laman.text @@ -519,7 +506,7 @@ class AutentikasiKBBI: host = "https://kbbi.kemdikbud.go.id" - def __init__(self, email, password): + def __init__(self, email=None, password=None, simpan_kuki=False): """Membuat objek AutentikasiKBBI baru. :param email: Alamat surel yang terdaftar di KBBI @@ -527,9 +514,11 @@ def __init__(self, email, password): :param password: Kata sandi dari alamat surel yang terdaftar :type password: str """ - self.terautentikasi = False self.sesi = requests.Session() - self._autentikasi(email, password) + if email is None and password is None: + self.__ambil_kuki() + else: + self._autentikasi(email, password, simpan_kuki) def __simpan_kuki(self): save_folder = Path(f"{str(Path.home())}/.config/kbbi_data") @@ -540,7 +529,16 @@ def __simpan_kuki(self): f".AspNet.ApplicationCookie={aspcookie};" ) - def _autentikasi(self, email, password): + def __ambil_kuki(self): + save_folder = Path(f"{str(Path.home())}/.config/kbbi_data") + if not save_folder.exists(): + return + if save_folder.joinpath("kuki.txt").exists(): + self.sesi.headers.update( + {"Cookie": save_folder.joinpath("kuki.txt").read_text()} + ) + + def _autentikasi(self, email, password, simpan_kuki): """Melakukan autentikasi dengan surel dan sandi yang diberikan. Berguna untuk mendapatkan segala fitur pengguna terdaftar @@ -565,8 +563,8 @@ def _autentikasi(self, email, password): laman = self.sesi.post(f"{self.host}/Account/Login", data=payload) if "Beranda/Error" in laman.url: raise GagalAutentikasi() - self.__simpan_kuki() - self.terautentikasi = True + if simpan_kuki: + self.__simpan_kuki() def ambil_sesi(self): """Mengembalikan sesi yang telah dibuat. @@ -679,9 +677,10 @@ def main(argv=None): argv = sys.argv[1:] args = _parse_args(argv) try: - auth = None if args.username and args.password: - auth = AutentikasiKBBI(args.username, args.password) + auth = AutentikasiKBBI(args.username, args.password, True) + else: + auth = AutentikasiKBBI() laman = KBBI(args.laman, auth) except Galat as e: print(e) From e51c9d3af65c6e77d2a597118c9041cf87430aef Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 07:51:44 +0700 Subject: [PATCH 25/43] Munculkan galat jika autentikasi gagal --- kbbi/kbbi.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 15849e5..83290a7 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -562,6 +562,8 @@ def _autentikasi(self, email, password, simpan_kuki): } laman = self.sesi.post(f"{self.host}/Account/Login", data=payload) if "Beranda/Error" in laman.url: + raise TerjadiKesalahan() + if "Account/Login" in laman.url: raise GagalAutentikasi() if simpan_kuki: self.__simpan_kuki() From f2269bfdbf6b247f3a056784d37a844ccb78be00 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 07:57:36 +0700 Subject: [PATCH 26/43] Pisahkan autentikasi dari program utama --- kbbi/kbbi.py | 113 ++++++++++++++++++++++++++++----------------------- setup.py | 12 ++++-- 2 files changed, 72 insertions(+), 53 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 83290a7..9aa8ee9 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -506,19 +506,27 @@ class AutentikasiKBBI: host = "https://kbbi.kemdikbud.go.id" - def __init__(self, email=None, password=None, simpan_kuki=False): - """Membuat objek AutentikasiKBBI baru. + def __init__(self, posel=None, sandi=None): + """Melakukan autentikasi dengan alamat posel dan sandi yang diberikan. + Objek AutentikasiKBBI dapat digunakan dalam pembuatan objek KBBI + untuk mendapatkan fitur pengguna terdaftar. - :param email: Alamat surel yang terdaftar di KBBI + Jika posel dan sandi tidak diberikan, autentikasi akan menggunakan kuki + yang tersimpan (jika ada). + + :param posel: Alamat posel yang terdaftar di KBBI Daring :type email: str - :param password: Kata sandi dari alamat surel yang terdaftar - :type password: str + :param sandi: Kata sandi untuk akun dengan alamat surel yang diberikan + :type sandi: str """ self.sesi = requests.Session() - if email is None and password is None: + if posel is None and sandi is None: self.__ambil_kuki() else: - self._autentikasi(email, password, simpan_kuki) + self._autentikasi(posel, sandi) + + def simpan_kuki(self): + self.__simpan_kuki() def __simpan_kuki(self): save_folder = Path(f"{str(Path.home())}/.config/kbbi_data") @@ -538,15 +546,7 @@ def __ambil_kuki(self): {"Cookie": save_folder.joinpath("kuki.txt").read_text()} ) - def _autentikasi(self, email, password, simpan_kuki): - """Melakukan autentikasi dengan surel dan sandi yang diberikan. - Berguna untuk mendapatkan segala fitur pengguna terdaftar - - :param email: Alamat surel yang terdaftar di KBBI - :type email: str - :param password: Kata sandi dari alamat surel yang terdaftar - :type password: str - """ + def _autentikasi(self, posel, sandi): laman = self.sesi.get(f"{self.host}/Account/Login") token = re.findall( r"", @@ -556,8 +556,8 @@ def _autentikasi(self, email, password, simpan_kuki): raise TerjadiKesalahan() payload = { "__RequestVerificationToken": token[0], - "Posel": email, - "KataSandi": password, + "Posel": posel, + "KataSandi": sandi, "IngatSaya": True, } laman = self.sesi.post(f"{self.host}/Account/Login", data=payload) @@ -565,14 +565,12 @@ def _autentikasi(self, email, password, simpan_kuki): raise TerjadiKesalahan() if "Account/Login" in laman.url: raise GagalAutentikasi() - if simpan_kuki: - self.__simpan_kuki() def ambil_sesi(self): """Mengembalikan sesi yang telah dibuat. :returns: sesi dengan fitur pengguna terdaftar - :rtype: requests.Session() + :rtype: requests.Session """ return self.sesi @@ -620,14 +618,53 @@ class GagalAutentikasi(Galat): def __init__(self): super().__init__( - "Gagal autentikasi dengan alamat surel dan sandi yang diberikan." + "Gagal melakukan autentikasi dengan alamat surel dan sandi " + "yang diberikan." ) -def _parse_args(args): +def _parse_args_autentikasi(args): + parser = argparse.ArgumentParser( + description=( + "Melakukan autentikasi dengan alamat posel dan sandi " + "yang diberikan." + ), + epilog=( + "Setelah autentikasi berhasil, kuki akan disimpan dan " + "otomatis digunakan dalam penggunaan KBBI berikutnya." + ), + ) + parser.add_argument( + "posel", help="alamat posel (pos elektronik) akun KBBI Daring" + ) + parser.add_argument( + "sandi", help="kata sandi akun KBBI Daring dengan posel yang diberikan" + ) + return parser.parse_args(args) + + +def autentikasi(argv=None): + if argv is None: + argv = sys.argv[1:] + args = _parse_args_autentikasi(argv) + try: + auth = AutentikasiKBBI(args.posel, args.sandi) + except Galat as e: + print(e) + return 1 + else: + auth.simpan_kuki() + print( + "Autentikasi berhasil dan kuki telah disimpan.\n" + "Kuki akan otomatis digunakan pada penggunaan KBBI berikutnya." + ) + return 0 + + +def _parse_args_utama(args): parser = argparse.ArgumentParser() parser.add_argument( - "laman", help='Laman yang ingin diambil, contoh: "cinta"' + "laman", help='laman yang ingin diambil, contoh: "cinta"' ) parser.add_argument( "-t", @@ -648,21 +685,6 @@ def _parse_args(args): type=int, metavar="N", ) - parser.add_argument( - "-U", - "--username", - help="gunakan email/surel yang terdaftar pada KBBI" - "untuk mengakses fitur pengguna", - default=None, - metavar="surel", - ) - parser.add_argument( - "-P", - "--password", - help="kata sandi email untuk email/surel yang digunakan", - default=None, - metavar="sandi", - ) return parser.parse_args(args) @@ -677,23 +699,14 @@ def main(argv=None): """Program utama dengan CLI.""" if argv is None: argv = sys.argv[1:] - args = _parse_args(argv) + args = _parse_args_utama(argv) try: - if args.username and args.password: - auth = AutentikasiKBBI(args.username, args.password, True) - else: - auth = AutentikasiKBBI() - laman = KBBI(args.laman, auth) + laman = KBBI(args.laman, AutentikasiKBBI()) except Galat as e: print(e) return 1 else: print(_keluaran(laman, args)) - if args.username and args.password: - print( - "\nTelah disimpan kuki login, silakan hapus argumen" - " --username dan --password" - ) return 0 diff --git a/setup.py b/setup.py index 4cd06a5..e27e3fe 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,8 @@ name="kbbi", version="0.4.0", description=( - "A module that scraps a page in the online Indonesian dictionary (KBBI)" + "A module that scraps a page in the online Indonesian dictionary " + "(KBBI)" ), long_description=long_description, long_description_content_type="text/markdown", @@ -28,6 +29,11 @@ "kbbi kamus bahasa indonesia indonesian natural language scraper" ), packages=find_packages(), - entry_points={"console_scripts": ["kbbi=kbbi:main"],}, - install_requires=["requests", "beautifulsoup4",], + entry_points={ + "console_scripts": [ + "kbbi=kbbi:main", + "kbbi-autentikasi=kbbi:autentikasi", + ] + }, + install_requires=["requests", "beautifulsoup4"], ) From 16d947932f87ca05bd9075f5f1774c1c907358be Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 08:46:11 +0700 Subject: [PATCH 27/43] Gunakan appdirs untuk mengolah path kuki --- kbbi/kbbi.py | 22 +++++++++------------- requirements.txt | 1 + 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 9aa8ee9..ec2efdb 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -16,8 +16,14 @@ from urllib.parse import quote import requests +from appdirs import AppDirs from bs4 import BeautifulSoup +APPDIR = AppDirs("kbbi", "laymonage") +KUKI_DIR = Path(APPDIR.user_config_dir) +KUKI_DIR.mkdir(parents=True, exist_ok=True) +KUKI_PATH = KUKI_DIR / "kuki.txt" + class KBBI: """Sebuah laman dalam KBBI daring.""" @@ -529,22 +535,12 @@ def simpan_kuki(self): self.__simpan_kuki() def __simpan_kuki(self): - save_folder = Path(f"{str(Path.home())}/.config/kbbi_data") - if not save_folder.exists(): - save_folder.mkdir() aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") - save_folder.joinpath("kuki.txt").write_text( - f".AspNet.ApplicationCookie={aspcookie};" - ) + KUKI_PATH.write_text(f".AspNet.ApplicationCookie={aspcookie};") def __ambil_kuki(self): - save_folder = Path(f"{str(Path.home())}/.config/kbbi_data") - if not save_folder.exists(): - return - if save_folder.joinpath("kuki.txt").exists(): - self.sesi.headers.update( - {"Cookie": save_folder.joinpath("kuki.txt").read_text()} - ) + if KUKI_PATH.exists(): + self.sesi.headers.update({"Cookie": KUKI_PATH.read_text()}) def _autentikasi(self, posel, sandi): laman = self.sesi.get(f"{self.host}/Account/Login") diff --git a/requirements.txt b/requirements.txt index 30e2859..a4796ee 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ +appdirs>=1.4.3,<2.0 beautifulsoup4>=4.8.2,<5.0 requests>=2.23.0,<3.0 From 2c6a6928a6ec386036a2199d3278c09ca0713ccb Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 09:31:50 +0700 Subject: [PATCH 28/43] Gunakan JSON untuk menyimpan kuki --- kbbi/kbbi.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index ec2efdb..773b7b5 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -22,7 +22,7 @@ APPDIR = AppDirs("kbbi", "laymonage") KUKI_DIR = Path(APPDIR.user_config_dir) KUKI_DIR.mkdir(parents=True, exist_ok=True) -KUKI_PATH = KUKI_DIR / "kuki.txt" +KUKI_PATH = KUKI_DIR / "kuki.json" class KBBI: @@ -535,12 +535,14 @@ def simpan_kuki(self): self.__simpan_kuki() def __simpan_kuki(self): - aspcookie = self.sesi.cookies.get(".AspNet.ApplicationCookie") - KUKI_PATH.write_text(f".AspNet.ApplicationCookie={aspcookie};") + kuki_aspnet = self.sesi.cookies.get(".AspNet.ApplicationCookie") + kuki_sesi = {".AspNet.ApplicationCookie": kuki_aspnet} + with KUKI_PATH.open("w") as kuki: + json.dump(kuki_sesi, kuki) def __ambil_kuki(self): - if KUKI_PATH.exists(): - self.sesi.headers.update({"Cookie": KUKI_PATH.read_text()}) + with KUKI_PATH.open() as kuki: + self.sesi.cookies.update(json.load(kuki)) def _autentikasi(self, posel, sandi): laman = self.sesi.get(f"{self.host}/Account/Login") From fb203c19e879c6897c809ec6198b9561b5385322 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 09:36:02 +0700 Subject: [PATCH 29/43] Perbaiki penanganan galat ketika kuki belum ada --- kbbi/kbbi.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 773b7b5..9032586 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -527,7 +527,13 @@ def __init__(self, posel=None, sandi=None): """ self.sesi = requests.Session() if posel is None and sandi is None: - self.__ambil_kuki() + try: + self.__ambil_kuki() + except FileNotFoundError as e: + raise GagalAutentikasi( + "Posel dan sandi tidak diberikan, " + "tetapi belum ada kuki yang disimpan." + ) from e else: self._autentikasi(posel, sandi) @@ -614,11 +620,13 @@ class GagalAutentikasi(Galat): Galat ketika gagal dalam autentikasi dengan KBBI. """ - def __init__(self): - super().__init__( - "Gagal melakukan autentikasi dengan alamat surel dan sandi " - "yang diberikan." - ) + def __init__(self, pesan=None): + if pesan is None: + pesan = ( + "Gagal melakukan autentikasi dengan alamat surel dan sandi " + "yang diberikan." + ) + super().__init__(pesan) def _parse_args_autentikasi(args): @@ -653,7 +661,7 @@ def autentikasi(argv=None): else: auth.simpan_kuki() print( - "Autentikasi berhasil dan kuki telah disimpan.\n" + f"Autentikasi berhasil dan kuki telah disimpan di {KUKI_PATH}.\n" "Kuki akan otomatis digunakan pada penggunaan KBBI berikutnya." ) return 0 @@ -698,8 +706,9 @@ def main(argv=None): if argv is None: argv = sys.argv[1:] args = _parse_args_utama(argv) + auth = AutentikasiKBBI() if KUKI_PATH.exists() else None try: - laman = KBBI(args.laman, AutentikasiKBBI()) + laman = KBBI(args.laman, auth) except Galat as e: print(e) return 1 From 7b1203eaab8b17411de0da203430ad6e9938a07f Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 10:34:18 +0700 Subject: [PATCH 30/43] Tambahkan opsi untuk menghapus kuki --- kbbi/kbbi.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 9032586..f07ce84 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -641,18 +641,44 @@ def _parse_args_autentikasi(args): ), ) parser.add_argument( - "posel", help="alamat posel (pos elektronik) akun KBBI Daring" + "posel", + help="alamat posel (pos elektronik) akun KBBI Daring", + nargs="?", ) parser.add_argument( - "sandi", help="kata sandi akun KBBI Daring dengan posel yang diberikan" + "sandi", + help="kata sandi akun KBBI Daring dengan posel yang diberikan", + nargs="?", + ) + parser.add_argument( + "-b", + "--bersihkan", + help="bersihkan kuki yang tersimpan", + action="store_true", ) return parser.parse_args(args) +def _bersihkan_kuki(): + try: + KUKI_PATH.unlink() + except FileNotFoundError: + print(f"Kuki tidak ditemukan pada {KUKI_PATH}!") + return 1 + else: + print(f"Kuki {KUKI_PATH} berhasil dihapus.") + return 0 + + def autentikasi(argv=None): if argv is None: argv = sys.argv[1:] args = _parse_args_autentikasi(argv) + if args.posel is None and args.sandi is None: + if args.bersihkan: + return _bersihkan_kuki() + else: + _parse_args_autentikasi(["-h"]) try: auth = AutentikasiKBBI(args.posel, args.sandi) except Galat as e: From c8159f98f6f37abd3d9b21b9fcc3918a67441192 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 10:48:29 +0700 Subject: [PATCH 31/43] Tambahkan opsi untuk menonaktifkan fitur khusus pengguna --- kbbi/kbbi.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index f07ce84..822ca1f 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -717,6 +717,13 @@ def _parse_args_utama(args): type=int, metavar="N", ) + parser.add_argument( + "-n", + "--nonpengguna", + help="nonaktifkan fitur khusus pengguna", + action="store_false", + dest="pengguna", + ) return parser.parse_args(args) @@ -732,7 +739,9 @@ def main(argv=None): if argv is None: argv = sys.argv[1:] args = _parse_args_utama(argv) - auth = AutentikasiKBBI() if KUKI_PATH.exists() else None + auth = None + if KUKI_PATH.exists() and args.pengguna: + auth = AutentikasiKBBI() try: laman = KBBI(args.laman, auth) except Galat as e: From 87705beff5731691b1d2c48ae19ae67c88949855 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 11:10:58 +0700 Subject: [PATCH 32/43] Tambahkan parameter untuk mengatur lokasi kuki --- kbbi/kbbi.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 822ca1f..6631f16 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -512,7 +512,7 @@ class AutentikasiKBBI: host = "https://kbbi.kemdikbud.go.id" - def __init__(self, posel=None, sandi=None): + def __init__(self, posel=None, sandi=None, lokasi_kuki=None): """Melakukan autentikasi dengan alamat posel dan sandi yang diberikan. Objek AutentikasiKBBI dapat digunakan dalam pembuatan objek KBBI untuk mendapatkan fitur pengguna terdaftar. @@ -524,15 +524,18 @@ def __init__(self, posel=None, sandi=None): :type email: str :param sandi: Kata sandi untuk akun dengan alamat surel yang diberikan :type sandi: str + :param lokasi_kuki: Lokasi kuki yang akan dimuat/disimpan + :type lokasi_kuki: str atau PathLike """ self.sesi = requests.Session() + self.lokasi_kuki = lokasi_kuki or KUKI_PATH if posel is None and sandi is None: try: self.__ambil_kuki() except FileNotFoundError as e: raise GagalAutentikasi( "Posel dan sandi tidak diberikan, " - "tetapi belum ada kuki yang disimpan." + f"tetapi kuki tidak ditemukan di {self.lokasi_kuki}" ) from e else: self._autentikasi(posel, sandi) @@ -543,11 +546,11 @@ def simpan_kuki(self): def __simpan_kuki(self): kuki_aspnet = self.sesi.cookies.get(".AspNet.ApplicationCookie") kuki_sesi = {".AspNet.ApplicationCookie": kuki_aspnet} - with KUKI_PATH.open("w") as kuki: + with open(self.lokasi_kuki, "w") as kuki: json.dump(kuki_sesi, kuki) def __ambil_kuki(self): - with KUKI_PATH.open() as kuki: + with open(self.lokasi_kuki) as kuki: self.sesi.cookies.update(json.load(kuki)) def _autentikasi(self, posel, sandi): From 6ce8ca6aeb019d4add6dea2bc12e36c1a1646420 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 11:12:47 +0700 Subject: [PATCH 33/43] Buat metode pada AutentikasiKBBI menjadi publik --- kbbi/kbbi.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 6631f16..af8e7e4 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -45,7 +45,7 @@ def __init__(self, kueri, auth=None): raise ValueError( 'KBBI: "auth" harus merupakan objek AutentikasiKBBI' ) - self.sesi = auth.ambil_sesi() + self.sesi = auth.sesi else: self.sesi = requests.Session() laman = self.sesi.get(self.pranala) @@ -531,7 +531,7 @@ def __init__(self, posel=None, sandi=None, lokasi_kuki=None): self.lokasi_kuki = lokasi_kuki or KUKI_PATH if posel is None and sandi is None: try: - self.__ambil_kuki() + self.ambil_kuki() except FileNotFoundError as e: raise GagalAutentikasi( "Posel dan sandi tidak diberikan, " @@ -541,15 +541,12 @@ def __init__(self, posel=None, sandi=None, lokasi_kuki=None): self._autentikasi(posel, sandi) def simpan_kuki(self): - self.__simpan_kuki() - - def __simpan_kuki(self): kuki_aspnet = self.sesi.cookies.get(".AspNet.ApplicationCookie") kuki_sesi = {".AspNet.ApplicationCookie": kuki_aspnet} with open(self.lokasi_kuki, "w") as kuki: json.dump(kuki_sesi, kuki) - def __ambil_kuki(self): + def ambil_kuki(self): with open(self.lokasi_kuki) as kuki: self.sesi.cookies.update(json.load(kuki)) @@ -573,14 +570,6 @@ def _autentikasi(self, posel, sandi): if "Account/Login" in laman.url: raise GagalAutentikasi() - def ambil_sesi(self): - """Mengembalikan sesi yang telah dibuat. - - :returns: sesi dengan fitur pengguna terdaftar - :rtype: requests.Session - """ - return self.sesi - class Galat(Exception): pass From 3acdc2d41d80b15848e9571543e9315786a457d0 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 11:53:29 +0700 Subject: [PATCH 34/43] Tambahkan opsi untuk tidak menampilkan entri terkait --- kbbi/kbbi.py | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index af8e7e4..8cb9975 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -106,9 +106,10 @@ def serialisasi(self): "entri": [entri.serialisasi() for entri in self.entri], } - def __str__(self, contoh=True): + def __str__(self, contoh=True, terkait=True): return "\n\n".join( - entri.__str__(contoh=contoh) for entri in self.entri + entri.__str__(contoh=contoh, terkait=terkait) + for entri in self.entri ) def __repr__(self): @@ -288,7 +289,7 @@ def _terkait(self): hasil += f"{head}\n{'; '.join(self.terkait[key])}" return hasil - def __str__(self, contoh=True): + def __str__(self, contoh=True, terkait=True): hasil = self._nama() if self.pelafalan: hasil += f" {self.pelafalan}" @@ -299,7 +300,7 @@ def __str__(self, contoh=True): hasil += f"\nEtimologi: {self.etimologi}" if self.makna: hasil += f"\n{self._makna(contoh)}" - if self.terautentikasi: + if self.terautentikasi and terkait: hasil += self._terkait() return hasil @@ -691,10 +692,25 @@ def _parse_args_utama(args): "laman", help='laman yang ingin diambil, contoh: "cinta"' ) parser.add_argument( - "-t", + "-c", "--tanpa-contoh", help="jangan tampilkan contoh (bila ada)", - action="store_true", + action="store_false", + dest="contoh", + ) + parser.add_argument( + "-t", + "--tanpa-terkait", + help="jangan tampilkan entri terkait (bila ada)", + action="store_false", + dest="terkait", + ) + parser.add_argument( + "-n", + "--nonpengguna", + help="nonaktifkan fitur khusus pengguna", + action="store_false", + dest="pengguna", ) parser.add_argument( "-j", @@ -709,13 +725,6 @@ def _parse_args_utama(args): type=int, metavar="N", ) - parser.add_argument( - "-n", - "--nonpengguna", - help="nonaktifkan fitur khusus pengguna", - action="store_false", - dest="pengguna", - ) return parser.parse_args(args) @@ -723,7 +732,7 @@ def _keluaran(laman, args): if args.json: return json.dumps(laman.serialisasi(), indent=args.indentasi) else: - return laman.__str__(contoh=not args.tanpa_contoh) + return laman.__str__(contoh=args.contoh, terkait=args.terkait) def main(argv=None): From 7bd19295dc6d93c647a5bea68f20646a716bb467 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 12:04:48 +0700 Subject: [PATCH 35/43] Sederhanakan docstring --- kbbi/kbbi.py | 39 ++++++--------------------------------- 1 file changed, 6 insertions(+), 33 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 8cb9975..b6e66e5 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -408,11 +408,6 @@ class Etimologi: """Sebuah etimologi dalam sebuah entri KBBI daring.""" def __init__(self, etimologi_html): - """Membuat objek Etimologi baru berdasarkan etimologi_html yang diberikan. - - :param etimologi_html: String untuk etimologi yang ingin diproses. - :type etimologi_html: str - """ etimologi_html = etimologi_html.lstrip("[").rstrip("]") etimologi = BeautifulSoup(etimologi_html, "html.parser") self._init_bahasa(etimologi) @@ -441,12 +436,6 @@ def _init_arti(self, etimologi): self.arti = etimologi.text.strip().strip("'\"").split("; ") def serialisasi(self): - """Mengembalikan hasil serialisasi objek Etimologi ini. - - :returns: Dictionary hasil serialisasi - :rtype: dict - """ - return { "kelas": self.kelas, "bahasa": self.bahasa, @@ -456,19 +445,9 @@ def serialisasi(self): } def _kelas(self): - """Mengembalikan representasi string untuk semua kelas kata makna ini. - - :returns: String representasi semua kelas kata - :rtype: str - """ return " ".join(f"({k})" for k in self.kelas) def _asal_kata(self): - """Mengembalikan representasi string untuk asal kata etimologi ini. - - :returns: String representasi asal kata - :rtype: str - """ return " ".join((self.asal_kata, self.pelafalan)) def _arti(self): @@ -577,17 +556,14 @@ class Galat(Exception): class TidakDitemukan(Galat): - """ - Galat yang menunjukkan bahwa laman tidak ditemukan dalam KBBI. - """ + """Galat ketika laman tidak ditemukan dalam KBBI.""" def __init__(self, kueri): super().__init__(f"{kueri} tidak ditemukan dalam KBBI!") class TerjadiKesalahan(Galat): - """ - Galat yang menunjukkan bahwa terjadi kesalahan dari pihak KBBI. + """Galat ketika terjadi kesalahan dari pihak KBBI. Laman: https://kbbi.kemdikbud.go.id/Beranda/Error """ @@ -596,9 +572,7 @@ def __init__(self): class BatasSehari(Galat): - """ - Galat yang menunjukkan bahwa pencarian telah mencapai - batas maksimum dalam sehari. + """Galat ketika pencarian telah mencapai batas maksimum dalam sehari. Laman: https://kbbi.kemdikbud.go.id/Beranda/BatasSehari """ @@ -609,9 +583,7 @@ def __init__(self): class GagalAutentikasi(Galat): - """ - Galat ketika gagal dalam autentikasi dengan KBBI. - """ + """Galat ketika gagal melakukan autentikasi dengan KBBI.""" def __init__(self, pesan=None): if pesan is None: @@ -664,6 +636,7 @@ def _bersihkan_kuki(): def autentikasi(argv=None): + """Program CLI untuk autentikasi.""" if argv is None: argv = sys.argv[1:] args = _parse_args_autentikasi(argv) @@ -736,7 +709,7 @@ def _keluaran(laman, args): def main(argv=None): - """Program utama dengan CLI.""" + """Program CLI utama.""" if argv is None: argv = sys.argv[1:] args = _parse_args_utama(argv) From e93e48a45bdb18907b36b38debf1a1bcb28a85a7 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 13:39:54 +0700 Subject: [PATCH 36/43] Refaktor kode --- kbbi/kbbi.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index b6e66e5..5d598c3 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -40,6 +40,13 @@ def __init__(self, kueri, auth=None): """ self.nama = kueri self._init_pranala() + self._init_sesi(auth) + laman = self.sesi.get(self.pranala) + self._cek_autentikasi(laman) + self._cek_galat(laman) + self._init_entri(laman) + + def _init_sesi(self, auth): if auth is not None: if not isinstance(auth, AutentikasiKBBI): raise ValueError( @@ -48,10 +55,6 @@ def __init__(self, kueri, auth=None): self.sesi = auth.sesi else: self.sesi = requests.Session() - laman = self.sesi.get(self.pranala) - self._cek_autentikasi(laman) - self._cek_galat(laman) - self._init_entri(laman) def _cek_autentikasi(self, laman): self.terautentikasi = "loginLink" not in laman.text From 51d28e5b33dae3e871374a8bcaee14b708ee4559 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 13:49:15 +0700 Subject: [PATCH 37/43] Masukkan variabel lokasi kuki ke dalam AutentikasiKBBI --- kbbi/kbbi.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 5d598c3..5f2132f 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -20,9 +20,8 @@ from bs4 import BeautifulSoup APPDIR = AppDirs("kbbi", "laymonage") -KUKI_DIR = Path(APPDIR.user_config_dir) -KUKI_DIR.mkdir(parents=True, exist_ok=True) -KUKI_PATH = KUKI_DIR / "kuki.json" +CONFIG_DIR = Path(APPDIR.user_config_dir) +CONFIG_DIR.mkdir(parents=True, exist_ok=True) class KBBI: @@ -494,6 +493,7 @@ class AutentikasiKBBI: """Gunakan fitur pengguna terdaftar.""" host = "https://kbbi.kemdikbud.go.id" + lokasi_kuki = CONFIG_DIR / "kuki.json" def __init__(self, posel=None, sandi=None, lokasi_kuki=None): """Melakukan autentikasi dengan alamat posel dan sandi yang diberikan. @@ -511,7 +511,7 @@ def __init__(self, posel=None, sandi=None, lokasi_kuki=None): :type lokasi_kuki: str atau PathLike """ self.sesi = requests.Session() - self.lokasi_kuki = lokasi_kuki or KUKI_PATH + self.lokasi_kuki = lokasi_kuki or self.lokasi_kuki if posel is None and sandi is None: try: self.ambil_kuki() @@ -628,13 +628,14 @@ def _parse_args_autentikasi(args): def _bersihkan_kuki(): + lokasi_kuki = AutentikasiKBBI.lokasi_kuki try: - KUKI_PATH.unlink() + lokasi_kuki.unlink() except FileNotFoundError: - print(f"Kuki tidak ditemukan pada {KUKI_PATH}!") + print(f"Kuki tidak ditemukan pada {lokasi_kuki}!") return 1 else: - print(f"Kuki {KUKI_PATH} berhasil dihapus.") + print(f"Kuki {lokasi_kuki} berhasil dihapus.") return 0 @@ -656,7 +657,8 @@ def autentikasi(argv=None): else: auth.simpan_kuki() print( - f"Autentikasi berhasil dan kuki telah disimpan di {KUKI_PATH}.\n" + "Autentikasi berhasil dan kuki telah disimpan di " + f"{auth.lokasi_kuki}.\n" "Kuki akan otomatis digunakan pada penggunaan KBBI berikutnya." ) return 0 @@ -717,7 +719,7 @@ def main(argv=None): argv = sys.argv[1:] args = _parse_args_utama(argv) auth = None - if KUKI_PATH.exists() and args.pengguna: + if AutentikasiKBBI.lokasi_kuki.exists() and args.pengguna: auth = AutentikasiKBBI() try: laman = KBBI(args.laman, auth) From ef4c1bb94f2f5c2a9b6ab652bbd3ab7b83879b8e Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 15:42:58 +0700 Subject: [PATCH 38/43] Dokumentasikan penggunaan fitur khusus pengguna di README --- README.md | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c5204e3..5385aa0 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,66 @@ tak.sir (2) } ``` +Untuk memanfaatkan fitur khusus pengguna, buat objek `AutentikasiKBBI` terlebih +dahulu, lalu gunakan objek tersebut dalam pembuatan objek `KBBI`. + +```python +>>> auth = AutentikasiKBBI("posel@saya.tld", "password_saya") +>>> roh = KBBI("roh", auth) +>>> print(roh) +roh +bentuk tidak baku: ruh +Etimologi: [Arab] (n) (sg) (f/m) رُوْحٌ rūh: tiupan; sesuatu yang membuat manusia dapat hidup +1. (n) sesuatu (unsur) yang ada dalam jasad yang diciptakan Tuhan sebagai penyebab adanya hidup (kehidupan); nyawa: jika -- sudah berpisah dari badan, berakhirlah kehidupan seseorang +2. (n) makhluk hidup yang tidak berjasad, tetapi berpikiran dan berperasaan (malaikat, jin, setan, dan sebagainya) +3. (n) (ki) semangat; spirit: kedamaian bagi seluruh warga sesuai dengan -- Islam +Gabungan Kata +roh Kudus; roh suci +``` + +Fitur khusus pengguna yang didukung saat ini adalah etimologi dan entri terkait +(kata turunan, gabungan kata, peribahasa, dan kiasan). Untuk mendapatkan +representasi `str`-nya tanpa fitur entri terkait, gunakan +`__str__(terkait=False)`. + +```python +>>> print(roh.__str__(contoh=False, terkait=False)) +roh +bentuk tidak baku: ruh +Etimologi: [Arab] (n) (sg) (f/m) رُوْحٌ rūh: tiupan; sesuatu yang membuat manusia dapat hidup +1. (n) sesuatu (unsur) yang ada dalam jasad yang diciptakan Tuhan sebagai penyebab adanya hidup (kehidupan); nyawa +2. (n) makhluk hidup yang tidak berjasad, tetapi berpikiran dan berperasaan (malaikat, jin, setan, dan sebagainya) +3. (n) (ki) semangat; spirit +``` + +Apabila ingin menyimpan kuki autentikasi, panggil *method* `simpan_kuki()` pada +objek `AutentikasiKBBI`. + +```python +>>> auth.simpan_kuki() +``` + +Berikutnya, objek `AutentikasiKBBI` dapat dibuat tanpa menggunakan alamat posel +dan sandi. Autentikasi dilakukan dengan memanfaatkan kuki yang telah disimpan. + +```python +>>> auth_baru = AutentikasiKBBI() +``` + +Lokasi penyimpanan/pembacaan kuki bisa diatur dengan parameter `lokasi_kuki` +ketika membuat objek `AutentikasiKBBI`. + +```python +>>> auth = AutentikasiKBBI("posel@saya.tld", "sandi_saya", lokasi_kuki="~/kuki_kbbi.json") +>>> auth_baru = AutentikasiKBBI(lokasi_kuki="~/kuki_kbbi.json") +``` + +Secara *default*, lokasi tersebut adalah: + +- Unix: `~/.config/kbbi/kuki.json` +- Windows: `%localappdata%\laymonage\kbbi\kuki.json` +- Mac: `~/Library/Application Support/kbbi/kuki.json` + ### Melalui CLI ``` @@ -153,7 +213,7 @@ tanda petik. $ kbbi "tanggung jawab" ``` -Apabila tidak ingin menampilkan contoh, gunakan `--tanpa-contoh` atau `-t`. +Apabila tidak ingin menampilkan contoh, gunakan `--tanpa-contoh` atau `-c`. ``` $ kbbi "tanggung jawab" --tanpa-contoh @@ -173,7 +233,37 @@ atau `-i N`. $ kbbi "tanggung jawab" --json --indentasi 2 ``` -> **Catatan:** **`kbbi`** juga bisa dipanggil dengan **`python kbbi.py`**. +Untuk memanfaatkan fitur khusus pengguna, lakukan autentikasi terlebih dahulu +dengan bantuan `kbbi-autentikasi`. + +``` +$ kbbi-autentikasi $KBBI_POSEL $KBBI_SANDI +``` + +Penggunaan `kbbi` berikutnya akan otomatis menggunakan kuki hasil autentikasi. + +Untuk menonaktifkan fitur entri terkait, gunakan `--tanpa-terkait` atau `-t`. + +``` +$ kbbi alam --tanpa-terkait +``` + +Untuk menonaktifkan semua fitur khusus pengguna (tanpa menghapus kuki), gunakan +`--nonpengguna` atau `-n`. + +``` +$ kbbi alam --nonpengguna +``` + +Untuk menghapus kuki, gunakan opsi `--bersihkan` atau `-b`. + +``` +$ kbbi-autentikasi --bersihkan +``` + +> **Catatan:**\ +> **`kbbi`** juga bisa dipanggil dengan **`python kbbi.py`**.\ +> **`kbbi-autentikasi`** juga bisa dipanggil dengan **`python -c "import kbbi; kbbi.autentikasi()"`** ## Berkontribusi From 408410eb9517a1ba105e61cbc8017b5d45e12e09 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 15:59:37 +0700 Subject: [PATCH 39/43] Perbaiki pesan bantuan --- README.md | 2 +- kbbi/kbbi.py | 29 +++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5385aa0..07df598 100644 --- a/README.md +++ b/README.md @@ -255,7 +255,7 @@ Untuk menonaktifkan semua fitur khusus pengguna (tanpa menghapus kuki), gunakan $ kbbi alam --nonpengguna ``` -Untuk menghapus kuki, gunakan opsi `--bersihkan` atau `-b`. +Untuk menghapus kuki, gunakan opsi `--bersihkan` atau `-c`. ``` $ kbbi-autentikasi --bersihkan diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 5f2132f..46c4867 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -607,6 +607,7 @@ def _parse_args_autentikasi(args): "Setelah autentikasi berhasil, kuki akan disimpan dan " "otomatis digunakan dalam penggunaan KBBI berikutnya." ), + add_help=False, ) parser.add_argument( "posel", @@ -619,7 +620,16 @@ def _parse_args_autentikasi(args): nargs="?", ) parser.add_argument( + "-h", "-b", + "--help", + "--bantuan", + action="help", + default=argparse.SUPPRESS, + help="tampilkan pesan bantuan ini dan keluar", + ) + parser.add_argument( + "-c", "--bersihkan", help="bersihkan kuki yang tersimpan", action="store_true", @@ -665,10 +675,22 @@ def autentikasi(argv=None): def _parse_args_utama(args): - parser = argparse.ArgumentParser() + parser = argparse.ArgumentParser( + description=("Mengambil sebuah laman dalam KBBI Daring."), + add_help=False, + ) parser.add_argument( "laman", help='laman yang ingin diambil, contoh: "cinta"' ) + parser.add_argument( + "-h", + "-b", + "--help", + "--bantuan", + action="help", + default=argparse.SUPPRESS, + help="tampilkan pesan bantuan ini dan keluar", + ) parser.add_argument( "-c", "--tanpa-contoh", @@ -693,7 +715,10 @@ def _parse_args_utama(args): parser.add_argument( "-j", "--json", - help="tampilkan hasil (selalu dengan contoh) dalam bentuk JSON", + help=( + "tampilkan hasil (selalu dengan contoh dan entri terkait bila ada)" + " dalam bentuk JSON" + ), action="store_true", ) parser.add_argument( From ae2700150bd330996fd46382004defc6814d3988 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 16:33:04 +0700 Subject: [PATCH 40/43] Gunakan flag untuk menonaktifkan fitur pengguna Kuki tetap digunakan dan batas pencarian tetap lebih besar --- README.md | 16 +++++++++++----- kbbi/kbbi.py | 26 +++++++++++++++----------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 07df598..5396e1f 100644 --- a/README.md +++ b/README.md @@ -157,9 +157,11 @@ Gabungan Kata roh Kudus; roh suci ``` -Fitur khusus pengguna yang didukung saat ini adalah etimologi dan entri terkait -(kata turunan, gabungan kata, peribahasa, dan kiasan). Untuk mendapatkan -representasi `str`-nya tanpa fitur entri terkait, gunakan +Fitur khusus pengguna yang didukung saat ini adalah etimologi, entri terkait +(kata turunan, gabungan kata, peribahasa, dan kiasan), dan batas pencarian yang +lebih besar. + +Untuk mendapatkan representasi `str`-nya tanpa fitur entri terkait, gunakan `__str__(terkait=False)`. ```python @@ -172,6 +174,10 @@ Etimologi: [Arab] (n) (sg) (f/m) رُوْحٌ rūh: tiupan; sesuatu yang membua 3. (n) (ki) semangat; spirit ``` +Untuk menonaktifkan fitur khusus pengguna (selain batas pencarian yang lebih +besar), tambahkan argumen `fitur_pengguna=False` pada pemanggilan `__str__` +atau `serialisasi`. + Apabila ingin menyimpan kuki autentikasi, panggil *method* `simpan_kuki()` pada objek `AutentikasiKBBI`. @@ -248,8 +254,8 @@ Untuk menonaktifkan fitur entri terkait, gunakan `--tanpa-terkait` atau `-t`. $ kbbi alam --tanpa-terkait ``` -Untuk menonaktifkan semua fitur khusus pengguna (tanpa menghapus kuki), gunakan -`--nonpengguna` atau `-n`. +Untuk menonaktifkan semua fitur khusus pengguna (selain batas pencarian yang +lebih besar dan tanpa menghapus kuki), gunakan `--nonpengguna` atau `-n`. ``` $ kbbi alam --nonpengguna diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index 46c4867..f1bd1e3 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -97,7 +97,7 @@ def _init_entri(self, laman): estr = "" estr += str(label).strip() - def serialisasi(self): + def serialisasi(self, fitur_pengguna=True): """Mengembalikan hasil serialisasi objek KBBI ini. :returns: Dictionary hasil serialisasi @@ -105,12 +105,14 @@ def serialisasi(self): """ return { "pranala": self.pranala, - "entri": [entri.serialisasi() for entri in self.entri], + "entri": [ + entri.serialisasi(fitur_pengguna) for entri in self.entri + ], } - def __str__(self, contoh=True, terkait=True): + def __str__(self, contoh=True, terkait=True, fitur_pengguna=True): return "\n\n".join( - entri.__str__(contoh=contoh, terkait=terkait) + entri.__str__(contoh, terkait, fitur_pengguna) for entri in self.entri ) @@ -232,7 +234,7 @@ def _init_makna(self, entri): makna = makna[:-terkait] self.makna = [Makna(m) for m in makna] - def serialisasi(self): + def serialisasi(self, fitur_pengguna=True): entri = { "nama": self.nama, "nomor": self.nomor, @@ -242,7 +244,7 @@ def serialisasi(self): "varian": self.varian, "makna": [makna.serialisasi() for makna in self.makna], } - if self.terautentikasi: + if self.terautentikasi and fitur_pengguna: if self.etimologi is not None: entri.update({"etimologi": self.etimologi.serialisasi()}) else: @@ -291,18 +293,18 @@ def _terkait(self): hasil += f"{head}\n{'; '.join(self.terkait[key])}" return hasil - def __str__(self, contoh=True, terkait=True): + def __str__(self, contoh=True, terkait=True, fitur_pengguna=True): hasil = self._nama() if self.pelafalan: hasil += f" {self.pelafalan}" for var in (self.bentuk_tidak_baku, self.varian): if var: hasil += f"\n{self._varian(var)}" - if self.terautentikasi and self.etimologi: + if self.terautentikasi and fitur_pengguna and self.etimologi: hasil += f"\nEtimologi: {self.etimologi}" if self.makna: hasil += f"\n{self._makna(contoh)}" - if self.terautentikasi and terkait: + if self.terautentikasi and fitur_pengguna and terkait: hasil += self._terkait() return hasil @@ -733,9 +735,11 @@ def _parse_args_utama(args): def _keluaran(laman, args): if args.json: - return json.dumps(laman.serialisasi(), indent=args.indentasi) + return json.dumps( + laman.serialisasi(args.pengguna), indent=args.indentasi + ) else: - return laman.__str__(contoh=args.contoh, terkait=args.terkait) + return laman.__str__(args.contoh, args.terkait, args.pengguna) def main(argv=None): From 99d671134a16262090cdf84ec57985d7e3788fff Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sat, 21 Mar 2020 19:13:54 +0700 Subject: [PATCH 41/43] Perbaiki kasus di mana kelas pada makna bisa diklik Hanya terjadi jika terautentikasi --- kbbi/kbbi.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kbbi/kbbi.py b/kbbi/kbbi.py index f1bd1e3..95a0bc0 100644 --- a/kbbi/kbbi.py +++ b/kbbi/kbbi.py @@ -334,7 +334,10 @@ def _init_rujukan(self, rujukan): def _init_submakna(self, makna_label): rujukan = makna_label.find("a") - if rujukan: + entris = makna_label.find("span", class_="entrisButton") + if entris: + entris.extract() + if rujukan and not rujukan.find("span", style="color:red"): self._init_rujukan(rujukan) elif makna_label.get("color") == "darkgreen": self._init_prakategorial(makna_label) From f4314ad2022240f85dca5c589786c01ee1910ff2 Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sun, 22 Mar 2020 07:17:14 +0700 Subject: [PATCH 42/43] Tambahkan kasus tes untuk fitur khusus pengguna --- tests/conftest.py | 35 ++- tests/kasus/serialisasi-auth/alam.json | 259 ++++++++++++++++++ tests/kasus/serialisasi-auth/beruang.json | 93 +++++++ tests/kasus/serialisasi-auth/bin.json | 114 ++++++++ .../serialisasi-auth/civitas academica.json | 39 +++ tests/kasus/serialisasi-auth/kan.json | 208 ++++++++++++++ tests/kasus/serialisasi-auth/keratabasa.json | 35 +++ tests/kasus/serialisasi-auth/khayal.json | 75 +++++ tests/kasus/serialisasi-auth/lah.json | 108 ++++++++ tests/kasus/serialisasi-auth/lampir.json | 39 +++ tests/kasus/serialisasi-auth/makin.json | 68 +++++ tests/kasus/serialisasi-auth/me-.json | 226 +++++++++++++++ tests/kasus/serialisasi-auth/menjadikan.json | 106 +++++++ tests/kasus/serialisasi-auth/quo vadis?.json | 39 +++ tests/kasus/serialisasi-auth/ranah.json | 113 ++++++++ tests/kasus/serialisasi-auth/roh.json | 91 ++++++ tests/kasus/serialisasi-auth/sage.json | 63 +++++ tests/kasus/serialisasi-auth/semakin.json | 44 +++ tests/kasus/serialisasi-auth/tampak.json | 99 +++++++ tests/kasus/serialisasi/alam.json | 178 ++++++++++++ tests/kasus/serialisasi/ranah.json | 101 +++++++ tests/kasus/serialisasi/roh.json | 70 +++++ tests/kasus/str-auth/alam.txt | 24 ++ tests/kasus/str-auth/beruang.txt | 10 + tests/kasus/str-auth/bin.txt | 7 + tests/kasus/str-auth/civitas academica.txt | 2 + tests/kasus/str-auth/kan.txt | 18 ++ tests/kasus/str-auth/keratabasa.txt | 2 + tests/kasus/str-auth/khayal.txt | 7 + tests/kasus/str-auth/lah.txt | 10 + tests/kasus/str-auth/lampir.txt | 4 + tests/kasus/str-auth/makin.txt | 8 + tests/kasus/str-auth/me-.txt | 15 + tests/kasus/str-auth/menjadikan.txt | 8 + tests/kasus/str-auth/quo vadis?.txt | 2 + tests/kasus/str-auth/ranah.txt | 8 + tests/kasus/str-auth/roh.txt | 8 + tests/kasus/str-auth/sage.txt | 5 + tests/kasus/str-auth/semakin.txt | 4 + tests/kasus/str-auth/tampak.txt | 13 + tests/kasus/str/alam.txt | 14 + tests/kasus/str/ranah.txt | 6 + tests/kasus/str/roh.txt | 5 + tests/kasus/str_tanpa_contoh-auth/alam.txt | 24 ++ tests/kasus/str_tanpa_contoh-auth/beruang.txt | 10 + tests/kasus/str_tanpa_contoh-auth/bin.txt | 7 + .../civitas academica.txt | 2 + tests/kasus/str_tanpa_contoh-auth/kan.txt | 18 ++ .../str_tanpa_contoh-auth/keratabasa.txt | 2 + tests/kasus/str_tanpa_contoh-auth/khayal.txt | 7 + tests/kasus/str_tanpa_contoh-auth/lah.txt | 10 + tests/kasus/str_tanpa_contoh-auth/lampir.txt | 4 + tests/kasus/str_tanpa_contoh-auth/makin.txt | 8 + tests/kasus/str_tanpa_contoh-auth/me-.txt | 15 + .../str_tanpa_contoh-auth/menjadikan.txt | 8 + .../str_tanpa_contoh-auth/quo vadis?.txt | 2 + tests/kasus/str_tanpa_contoh-auth/ranah.txt | 8 + tests/kasus/str_tanpa_contoh-auth/roh.txt | 8 + tests/kasus/str_tanpa_contoh-auth/sage.txt | 5 + tests/kasus/str_tanpa_contoh-auth/semakin.txt | 4 + tests/kasus/str_tanpa_contoh-auth/tampak.txt | 13 + tests/kasus/str_tanpa_contoh/alam.txt | 14 + tests/kasus/str_tanpa_contoh/ranah.txt | 6 + tests/kasus/str_tanpa_contoh/roh.txt | 5 + tests/test_kbbi.py | 89 +++++- 65 files changed, 2643 insertions(+), 9 deletions(-) create mode 100644 tests/kasus/serialisasi-auth/alam.json create mode 100644 tests/kasus/serialisasi-auth/beruang.json create mode 100644 tests/kasus/serialisasi-auth/bin.json create mode 100644 tests/kasus/serialisasi-auth/civitas academica.json create mode 100644 tests/kasus/serialisasi-auth/kan.json create mode 100644 tests/kasus/serialisasi-auth/keratabasa.json create mode 100644 tests/kasus/serialisasi-auth/khayal.json create mode 100644 tests/kasus/serialisasi-auth/lah.json create mode 100644 tests/kasus/serialisasi-auth/lampir.json create mode 100644 tests/kasus/serialisasi-auth/makin.json create mode 100644 tests/kasus/serialisasi-auth/me-.json create mode 100644 tests/kasus/serialisasi-auth/menjadikan.json create mode 100644 tests/kasus/serialisasi-auth/quo vadis?.json create mode 100644 tests/kasus/serialisasi-auth/ranah.json create mode 100644 tests/kasus/serialisasi-auth/roh.json create mode 100644 tests/kasus/serialisasi-auth/sage.json create mode 100644 tests/kasus/serialisasi-auth/semakin.json create mode 100644 tests/kasus/serialisasi-auth/tampak.json create mode 100644 tests/kasus/serialisasi/alam.json create mode 100644 tests/kasus/serialisasi/ranah.json create mode 100644 tests/kasus/serialisasi/roh.json create mode 100644 tests/kasus/str-auth/alam.txt create mode 100644 tests/kasus/str-auth/beruang.txt create mode 100644 tests/kasus/str-auth/bin.txt create mode 100644 tests/kasus/str-auth/civitas academica.txt create mode 100644 tests/kasus/str-auth/kan.txt create mode 100644 tests/kasus/str-auth/keratabasa.txt create mode 100644 tests/kasus/str-auth/khayal.txt create mode 100644 tests/kasus/str-auth/lah.txt create mode 100644 tests/kasus/str-auth/lampir.txt create mode 100644 tests/kasus/str-auth/makin.txt create mode 100644 tests/kasus/str-auth/me-.txt create mode 100644 tests/kasus/str-auth/menjadikan.txt create mode 100644 tests/kasus/str-auth/quo vadis?.txt create mode 100644 tests/kasus/str-auth/ranah.txt create mode 100644 tests/kasus/str-auth/roh.txt create mode 100644 tests/kasus/str-auth/sage.txt create mode 100644 tests/kasus/str-auth/semakin.txt create mode 100644 tests/kasus/str-auth/tampak.txt create mode 100644 tests/kasus/str/alam.txt create mode 100644 tests/kasus/str/ranah.txt create mode 100644 tests/kasus/str/roh.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/alam.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/beruang.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/bin.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/civitas academica.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/kan.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/keratabasa.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/khayal.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/lah.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/lampir.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/makin.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/me-.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/menjadikan.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/quo vadis?.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/ranah.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/roh.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/sage.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/semakin.txt create mode 100644 tests/kasus/str_tanpa_contoh-auth/tampak.txt create mode 100644 tests/kasus/str_tanpa_contoh/alam.txt create mode 100644 tests/kasus/str_tanpa_contoh/ranah.txt create mode 100644 tests/kasus/str_tanpa_contoh/roh.txt diff --git a/tests/conftest.py b/tests/conftest.py index 551b1f9..061107e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,8 +1,14 @@ import json +import os import pytest -from kbbi import KBBI +from kbbi import KBBI, AutentikasiKBBI + + +@pytest.fixture(scope="session") +def autentikasi(): + return AutentikasiKBBI(os.getenv("KBBI_POSEL"), os.getenv("KBBI_SANDI")) @pytest.fixture(scope="session") @@ -10,6 +16,11 @@ def laman(): return dict() +@pytest.fixture(scope="session") +def laman_terautentikasi(): + return dict() + + @pytest.fixture def ekspektasi_str(request): path = request.param @@ -24,11 +35,23 @@ def ekspektasi_serialisasi(request): return json.load(berkas) +def ambil_atau_simpan(dct, key, func): + try: + return dct[key] + except KeyError: + dct[key] = func(key) + return dct[key] + + @pytest.fixture def aktual_objek(request, laman): kueri = request.param - try: - return laman[kueri] - except KeyError: - laman[kueri] = KBBI(kueri) - return laman[kueri] + return ambil_atau_simpan(laman, kueri, lambda a: KBBI(a)) + + +@pytest.fixture +def aktual_objek_terautentikasi(request, autentikasi, laman_terautentikasi): + kueri = request.param + return ambil_atau_simpan( + laman_terautentikasi, kueri, lambda a: KBBI(a, autentikasi) + ) diff --git a/tests/kasus/serialisasi-auth/alam.json b/tests/kasus/serialisasi-auth/alam.json new file mode 100644 index 0000000..bc7b27e --- /dev/null +++ b/tests/kasus/serialisasi-auth/alam.json @@ -0,0 +1,259 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/alam", + "entri": [ + { + "nama": "alam", + "nomor": "1", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "segala yang ada di langit dan di bumi (seperti bumi, bintang, kekuatan)" + ], + "info": "", + "contoh": [ + "-- sekeliling" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "lingkungan kehidupan" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "segala sesuatu yang termasuk dalam satu lingkungan (golongan dan sebagainya) dan dianggap sebagai satu keutuhan" + ], + "info": "", + "contoh": [ + "-- pikiran", + "-- tumbuh-tumbuhan" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "segala daya (gaya, kekuatan, dan sebagainya) yang menyebabkan terjadinya dan seakan-akan mengatur segala sesuatu yang ada di dunia ini" + ], + "info": "", + "contoh": [ + "hukum --", + "ilmu --" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "yang bukan buatan manusia" + ], + "info": "", + "contoh": [ + "karet --" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "dunia" + ], + "info": "", + "contoh": [ + "-- semesta", + "syah --" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "kerajaan", + "daerah", + "negeri" + ], + "info": "", + "contoh": [ + "-- Minangkabau" + ] + } + ], + "etimologi": { + "kelas": [ + "n", + "sg", + "m" + ], + "bahasa": "Arab", + "asal_kata": "\u0639\u064e\u0627\u0644\u064e\u0645\u064c", + "pelafalan": "\u2018\u0101lam", + "arti": [ + "manusia", + "seluruh makhluk" + ] + }, + "kata_turunan": [ + "beralam", + "kealaman" + ], + "gabungan_kata": [ + "alam akhirat", + "alam arwah", + "alam astral", + "alam baka", + "alam barzakh", + "alam besar", + "alam fana", + "alam gaib", + "alam kabir", + "alam kecil", + "alam kekal", + "alam kelanggengan", + "alam kubur", + "alam malakut", + "alam misal", + "alam nabati", + "alam pikiran", + "alam rahim", + "alam raya", + "alam sagir", + "alam samar", + "alam semesta", + "alam semesta datar", + "alam semesta terbuka", + "alam semesta tertutup" + ], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "alam", + "nomor": "2", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "prakategorial", + "nama": "prakategorial", + "deskripsi": "kata tidak dipakai dalam bentuk dasarnya" + } + ], + "submakna": [ + "cari: berpengalaman, mengalami, pengalam, pengalaman" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": { + "kelas": [ + "n", + "sg", + "m" + ], + "bahasa": "Arab", + "asal_kata": "\u0639\u064e\u0644\u064e\u0645\u064c", + "pelafalan": "\u2018alam", + "arti": [ + "gunung", + "tanda", + "lukisan pada baju", + "plang jalan", + "bendera pasukan perang" + ] + }, + "kata_turunan": [ + "berpengalaman", + "mengalami", + "pengalam", + "pengalaman" + ], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "alam", + "nomor": "3", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "bendera (panji-panji) sebagai tanda (pada pasukan dan sebagainya)" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [ + "negeri (alam) yang baka", + "pergi ke alam baka" + ] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/beruang.json b/tests/kasus/serialisasi-auth/beruang.json new file mode 100644 index 0000000..0a0b204 --- /dev/null +++ b/tests/kasus/serialisasi-auth/beruang.json @@ -0,0 +1,93 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/beruang", + "entri": [ + { + "nama": "ber.u.ang", + "nomor": "", + "kata_dasar": [ + "uang" + ], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "v", + "nama": "Verba", + "deskripsi": "kata kerja" + } + ], + "submakna": [ + "mempunyai uang" + ], + "info": "", + "contoh": [ + "sepeser pun saya tidak ~" + ] + }, + { + "kelas": [ + { + "kode": "a", + "nama": "Adjektiva", + "deskripsi": "kata yang menjelaskan nomina atau pronomina" + }, + { + "kode": "ki", + "nama": "kiasan", + "deskripsi": "" + } + ], + "submakna": [ + "kaya" + ], + "info": "", + "contoh": [ + "orang yang dapat menikmati makanan semahal itu hanyalah orang yang ~" + ] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "be.ru.ang", + "nomor": "", + "kata_dasar": [], + "pelafalan": "/b\u00earuang/", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "binatang buas jenis Ursus, berbulu tebal, dapat berdiri di atas kedua kaki belakangnya, bercakar, dan bermoncong panjang (banyak macamnya, seperti -- bukit, -- damar, -- putih)" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [ + "beruang es", + "beruang kutub" + ], + "peribahasa": [ + "hilang rona karena penyakit, hilang bangsa tidak beruang" + ], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/bin.json b/tests/kasus/serialisasi-auth/bin.json new file mode 100644 index 0000000..ca566da --- /dev/null +++ b/tests/kasus/serialisasi-auth/bin.json @@ -0,0 +1,114 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/Cari/Hasil?frasa=bin", + "entri": [ + { + "nama": "bin", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + }, + { + "kode": "Ar", + "nama": "Arab", + "deskripsi": "-" + } + ], + "submakna": [ + "kata untuk menyatakan anak laki-laki dari seseorang (biasa dipakai untuk keterangan antara nama seseorang dan nama ayah)", + "anak laki-laki dari" + ], + "info": "", + "contoh": [ + "Amat -- Soleh Amat anak dari Soleh" + ] + }, + { + "kelas": [ + { + "kode": "p", + "nama": "Partikel", + "deskripsi": "kelas kata yang meliputi kata depan, kata sambung, kata seru, kata sandang, ucapan salam" + }, + { + "kode": "cak", + "nama": "Cakapan", + "deskripsi": "menandai kata yang digunakan dalam ragam takbaku" + }, + { + "kode": "Ar", + "nama": "Arab", + "deskripsi": "-" + } + ], + "submakna": [ + "kata untuk menguatkan atau mengungkapkan dengan perkataan lain" + ], + "info": "", + "contoh": [ + "aneh -- ajaib" + ] + } + ], + "etimologi": { + "kelas": [ + "n", + "sg", + "m" + ], + "bahasa": "Arab", + "asal_kata": "\u0627\u0650\u0628\u0652\u0646\u064c", + "pelafalan": "ibn", + "arti": [ + "anak lelaki" + ] + }, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "BIN", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + }, + { + "kode": "sing", + "nama": "singkatan", + "deskripsi": "" + } + ], + "submakna": [ + "Badan Intelijen Negara (lembaga pemerintah nonkementerian Indonesia yang bertugas di bidang intelijen)" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/civitas academica.json b/tests/kasus/serialisasi-auth/civitas academica.json new file mode 100644 index 0000000..285f2aa --- /dev/null +++ b/tests/kasus/serialisasi-auth/civitas academica.json @@ -0,0 +1,39 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/civitas%20academica", + "entri": [ + { + "nama": "civitas academica", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "ukp", + "nama": "Ungkapan", + "deskripsi": "" + }, + { + "kode": "Lt", + "nama": "Latin", + "deskripsi": "-" + } + ], + "submakna": [ + "kelompok (warga) masyarakat akademik yang terdiri atas dosen dan mahasiswa dengan perwakilannya yang terbentuk melalui senat masing-masing" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/kan.json b/tests/kasus/serialisasi-auth/kan.json new file mode 100644 index 0000000..6c550db --- /dev/null +++ b/tests/kasus/serialisasi-auth/kan.json @@ -0,0 +1,208 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/kan", + "entri": [ + { + "nama": "kan", + "nomor": "1", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + }, + { + "kode": "ark", + "nama": "Arkais", + "deskripsi": "menandai kata yang tidak lazim" + } + ], + "submakna": [ + "langkan (pada perahu)" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "kan", + "nomor": "2", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "adv", + "nama": "Adverbia", + "deskripsi": "kata yang menjelaskan verba, adjektiva, adverbia lain, atau kalimat" + }, + { + "kode": "kp", + "nama": "kependekan", + "deskripsi": "" + } + ], + "submakna": [ + "bukan" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "kan", + "nomor": "3", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "adv", + "nama": "Adverbia", + "deskripsi": "kata yang menjelaskan verba, adjektiva, adverbia lain, atau kalimat" + }, + { + "kode": "kp", + "nama": "kependekan", + "deskripsi": "" + } + ], + "submakna": [ + "akan" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "kan", + "nomor": "4", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "tempat memasak air teh", + "morong", + "teko" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "-kan", + "nomor": "5", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "sufiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "menjadikan" + ], + "info": "", + "contoh": [ + "jalankan", + "datangkan", + "hitamkan" + ] + }, + { + "kelas": [ + { + "kode": "sufiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "sungguh-sungguh" + ], + "info": "", + "contoh": [ + "dengarkan", + "camkan" + ] + }, + { + "kelas": [ + { + "kode": "sufiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "untuk", + "kepada orang lain" + ], + "info": "", + "contoh": [ + "sewakan", + "bacakan" + ] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [ + "tak kan lari gunung dikejar, hilang kabut tampaklah dia" + ], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/keratabasa.json b/tests/kasus/serialisasi-auth/keratabasa.json new file mode 100644 index 0000000..e4233f6 --- /dev/null +++ b/tests/kasus/serialisasi-auth/keratabasa.json @@ -0,0 +1,35 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/keratabasa", + "entri": [ + { + "nama": "ke.ra.ta.ba.sa", + "nomor": "", + "kata_dasar": [], + "pelafalan": "/k\u00e9ratabasa/", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "perihal menerangkan arti kata dengan memperlakukannya sebagai singkatan, biasanya untuk lelucon (misalnya kata benci ditafsirkan sebagai \u2018benar-benar cinta\u2019)", + "etimologi rakyat" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/khayal.json b/tests/kasus/serialisasi-auth/khayal.json new file mode 100644 index 0000000..5d1c8eb --- /dev/null +++ b/tests/kasus/serialisasi-auth/khayal.json @@ -0,0 +1,75 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/khayal", + "entri": [ + { + "nama": "kha.yal", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [ + "kayal" + ], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "lukisan (gambar) dalam angan-angan", + "fantasi" + ], + "info": "", + "contoh": [ + "apa yang diceritakan itu -- belaka" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "yang diangan-angankan seperti benar-benar ada" + ], + "info": "", + "contoh": [ + "cerita --" + ] + } + ], + "etimologi": { + "kelas": [ + "n", + "sg", + "m" + ], + "bahasa": "Arab", + "asal_kata": "\u062e\u064e\u064a\u064e\u0627\u0644\u064c", + "pelafalan": "khay\u0101l", + "arti": [ + "bayang-bayang" + ] + }, + "kata_turunan": [ + "berkhayal", + "khayalan", + "mengkhayal", + "mengkhayalkan", + "pengkhayal", + "pengkhayalan", + "terkhayal" + ], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/lah.json b/tests/kasus/serialisasi-auth/lah.json new file mode 100644 index 0000000..58580d7 --- /dev/null +++ b/tests/kasus/serialisasi-auth/lah.json @@ -0,0 +1,108 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/lah", + "entri": [ + { + "nama": "-lah", + "nomor": "1", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "bentuk terikat", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "yang digunakan untuk menekankan makna kata yang di depannya" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "lah", + "nomor": "2", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "adv", + "nama": "Adverbia", + "deskripsi": "kata yang menjelaskan verba, adjektiva, adverbia lain, atau kalimat" + }, + { + "kode": "kp", + "nama": "kependekan", + "deskripsi": "" + } + ], + "submakna": [ + "telah" + ], + "info": "", + "contoh": [ + "hari -- larut senja" + ] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "lah", + "nomor": "3", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "p", + "nama": "Partikel", + "deskripsi": "kelas kata yang meliputi kata depan, kata sambung, kata seru, kata sandang, ucapan salam" + }, + { + "kode": "cak", + "nama": "Cakapan", + "deskripsi": "menandai kata yang digunakan dalam ragam takbaku" + } + ], + "submakna": [ + "kata seru untuk memberi tekanan atau menyungguhkan" + ], + "info": "", + "contoh": [ + "\u201c--, itu orangnya\u201d, katanya sambil menunjuk seseorang yang baru datang" + ] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [ + "mensiang yang baru dicari, kampil \u2018lah sudah dahulu" + ], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/lampir.json b/tests/kasus/serialisasi-auth/lampir.json new file mode 100644 index 0000000..1801eae --- /dev/null +++ b/tests/kasus/serialisasi-auth/lampir.json @@ -0,0 +1,39 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/lampir", + "entri": [ + { + "nama": "lam.pir", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "prakategorial", + "nama": "prakategorial", + "deskripsi": "kata tidak dipakai dalam bentuk dasarnya" + } + ], + "submakna": [ + "cari: lampiran, melampiri, melampirkan, terlampir" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [ + "lampiran", + "melampiri", + "melampirkan", + "terlampir" + ], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/makin.json b/tests/kasus/serialisasi-auth/makin.json new file mode 100644 index 0000000..69fd7b5 --- /dev/null +++ b/tests/kasus/serialisasi-auth/makin.json @@ -0,0 +1,68 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/makin", + "entri": [ + { + "nama": "ma.kin", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [ + "mangkin", + "semakin" + ], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "adv", + "nama": "Adverbia", + "deskripsi": "kata yang menjelaskan verba, adjektiva, adverbia lain, atau kalimat" + } + ], + "submakna": [ + "kian bertambah" + ], + "info": "", + "contoh": [ + "tangisnya -- menjadi-jadi", + "pesawat itu terbang -- tinggi" + ] + }, + { + "kelas": [ + { + "kode": "p", + "nama": "Partikel", + "deskripsi": "kelas kata yang meliputi kata depan, kata sambung, kata seru, kata sandang, ucapan salam" + }, + { + "kode": "kl", + "nama": "Klasik", + "deskripsi": "menandai kata yang digunakan dalam kesusastraan Melayu Klasik" + } + ], + "submakna": [ + "lebih-lebih", + "apalagi" + ], + "info": "", + "contoh": [ + "segala gembala gajah semuanya kasih akan Laksamana Khoja Hassan, -- kepada gembala Kepenjang itu jangan dikata lagi" + ] + } + ], + "etimologi": null, + "kata_turunan": [ + "semakin" + ], + "gabungan_kata": [], + "peribahasa": [ + "ilmu padi, makin berisi makin runduk", + "jika pisau tiada berbaja, makin dikikir bertambah tumpul", + "lagi murah, lagi menawar (makin murah, makin menawar)" + ], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/me-.json b/tests/kasus/serialisasi-auth/me-.json new file mode 100644 index 0000000..6e153d5 --- /dev/null +++ b/tests/kasus/serialisasi-auth/me-.json @@ -0,0 +1,226 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/me-", + "entri": [ + { + "nama": "me-", + "nomor": "", + "kata_dasar": [], + "pelafalan": "/m\u00ea-/", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [], + "submakna": [ + "\u2192 meng-" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "meng-", + "nomor": "", + "kata_dasar": [], + "pelafalan": "/m\u00eang-/", + "bentuk_tidak_baku": [], + "varian": [ + "me-", + "mem-", + "men-", + "menge-", + "meny-" + ], + "makna": [ + { + "kelas": [ + { + "kode": "prefiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "menjadi" + ], + "info": "", + "contoh": [ + "mencair", + "menguning", + "mengkristal" + ] + }, + { + "kelas": [ + { + "kode": "prefiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "berfungsi sebagai atau menyerupai" + ], + "info": "", + "contoh": [ + "menyupir", + "menggunung" + ] + }, + { + "kelas": [ + { + "kode": "prefiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "makan atau minum" + ], + "info": "", + "contoh": [ + "menyatai", + "mengopi", + "mengeteh" + ] + }, + { + "kelas": [ + { + "kode": "prefiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "menuju" + ], + "info": "", + "contoh": [ + "mengutara", + "melaut", + "menepi" + ] + }, + { + "kelas": [ + { + "kode": "prefiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "mencari atau mengumpulkan" + ], + "info": "", + "contoh": [ + "mendamar", + "merumput" + ] + }, + { + "kelas": [ + { + "kode": "prefiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "mengeluarkan bunyi" + ], + "info": "", + "contoh": [ + "mengeong", + "mengaum", + "mencicit" + ] + }, + { + "kelas": [ + { + "kode": "prefiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "menimbulkan kesan seperti seseorang atau sesuatu yang" + ], + "info": "", + "contoh": [ + "membisu", + "membatu", + "merendah hati" + ] + }, + { + "kelas": [ + { + "kode": "prefiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "dasar verba" + ], + "info": "", + "contoh": [ + "membaca", + "menulis", + "membajak" + ] + }, + { + "kelas": [ + { + "kode": "prefiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "membuat", + "menghasilkan" + ], + "info": "", + "contoh": [ + "menyambal", + "menggulai", + "membatik" + ] + }, + { + "kelas": [ + { + "kode": "prefiks pembentuk verba", + "nama": "-", + "deskripsi": "-" + } + ], + "submakna": [ + "menyatakan" + ], + "info": "", + "contoh": [ + "mengaku" + ] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/menjadikan.json b/tests/kasus/serialisasi-auth/menjadikan.json new file mode 100644 index 0000000..0583f39 --- /dev/null +++ b/tests/kasus/serialisasi-auth/menjadikan.json @@ -0,0 +1,106 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/menjadikan", + "entri": [ + { + "nama": "men.ja.di.kan", + "nomor": "", + "kata_dasar": [ + "jadi (1)" + ], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "v", + "nama": "Verba", + "deskripsi": "kata kerja" + } + ], + "submakna": [ + "membuat sebagai", + "merupakan" + ], + "info": "", + "contoh": [ + "ia ~ sakit adiknya sebagai alasan untuk tidak pergi kuliah" + ] + }, + { + "kelas": [ + { + "kode": "v", + "nama": "Verba", + "deskripsi": "kata kerja" + } + ], + "submakna": [ + "menyebabkan" + ], + "info": "", + "contoh": [ + "hal itu akan ~ orang lain marah-marah" + ] + }, + { + "kelas": [ + { + "kode": "v", + "nama": "Verba", + "deskripsi": "kata kerja" + } + ], + "submakna": [ + "mengangkat (memilih) sebagai" + ], + "info": "", + "contoh": [ + "rakyat telah ~ dia kepala desa" + ] + }, + { + "kelas": [ + { + "kode": "v", + "nama": "Verba", + "deskripsi": "kata kerja" + } + ], + "submakna": [ + "melaksanakan (rencana, janji, dan sebagainya)" + ], + "info": "", + "contoh": [ + "ia ~ penawarannya untuk membeli rumah itu" + ] + }, + { + "kelas": [ + { + "kode": "v", + "nama": "Verba", + "deskripsi": "kata kerja" + } + ], + "submakna": [ + "menciptakan", + "mengadakan" + ], + "info": "", + "contoh": [ + "Tuhan yang ~ langit dan bumi beserta isinya" + ] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [ + "menjadikan hati" + ], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/quo vadis?.json b/tests/kasus/serialisasi-auth/quo vadis?.json new file mode 100644 index 0000000..f55e164 --- /dev/null +++ b/tests/kasus/serialisasi-auth/quo vadis?.json @@ -0,0 +1,39 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/Cari/Hasil?frasa=quo%20vadis%3F", + "entri": [ + { + "nama": "quo vadis?", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "ukp", + "nama": "Ungkapan", + "deskripsi": "" + }, + { + "kode": "Lt", + "nama": "Latin", + "deskripsi": "-" + } + ], + "submakna": [ + "hendak pergi ke mana? (dipakai untuk mengingatkan seseorang agar memperbaiki dirinya)" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/ranah.json b/tests/kasus/serialisasi-auth/ranah.json new file mode 100644 index 0000000..3a6dcc7 --- /dev/null +++ b/tests/kasus/serialisasi-auth/ranah.json @@ -0,0 +1,113 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/ranah", + "entri": [ + { + "nama": "ra.nah", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "tanah rata", + "dataran rendah", + "lembah" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "tanah yang berpaya-paya" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "elemen atau unsur yang dibatasi", + "bidang disiplin" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + }, + { + "kode": "Ling", + "nama": "Linguistik", + "deskripsi": "-" + } + ], + "submakna": [ + "lingkungan yang memungkinkan terjadinya percakapan, merupakan kombinasi antara partisipan, topik, dan tempat (misalnya keluarga, pendidikan, tempat kerja, keagamaan, dan sebagainya)" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + }, + { + "kode": "Psi", + "nama": "Psikologi", + "deskripsi": "-" + } + ], + "submakna": [ + "bagian (satuan) perilaku manusia" + ], + "info": "", + "contoh": [ + "-- afektif berbagai perilaku yang berkaitan dengan perasaan", + "-- kognitif perilaku yang menjadi kegiatan kognisi atau pikiran" + ] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [ + "ranah afektif", + "ranah eminen", + "ranah frekuensi", + "ranah kognitif", + "ranah politik", + "ranah psikomotor" + ], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/roh.json b/tests/kasus/serialisasi-auth/roh.json new file mode 100644 index 0000000..d803b9d --- /dev/null +++ b/tests/kasus/serialisasi-auth/roh.json @@ -0,0 +1,91 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/roh", + "entri": [ + { + "nama": "roh", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [ + "ruh" + ], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "sesuatu (unsur) yang ada dalam jasad yang diciptakan Tuhan sebagai penyebab adanya hidup (kehidupan)", + "nyawa" + ], + "info": "", + "contoh": [ + "jika -- sudah berpisah dari badan, berakhirlah kehidupan seseorang" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "makhluk hidup yang tidak berjasad, tetapi berpikiran dan berperasaan (malaikat, jin, setan, dan sebagainya)" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + }, + { + "kode": "ki", + "nama": "kiasan", + "deskripsi": "" + } + ], + "submakna": [ + "semangat", + "spirit" + ], + "info": "", + "contoh": [ + "kedamaian bagi seluruh warga sesuai dengan -- Islam" + ] + } + ], + "etimologi": { + "kelas": [ + "n", + "sg", + "f/m" + ], + "bahasa": "Arab", + "asal_kata": "\u0631\u064f\u0648\u0652\u062d\u064c", + "pelafalan": "r\u016bh", + "arti": [ + "tiupan", + "sesuatu yang membuat manusia dapat hidup" + ] + }, + "kata_turunan": [], + "gabungan_kata": [ + "roh Kudus", + "roh suci" + ], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/sage.json b/tests/kasus/serialisasi-auth/sage.json new file mode 100644 index 0000000..aafdc4a --- /dev/null +++ b/tests/kasus/serialisasi-auth/sage.json @@ -0,0 +1,63 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/sage", + "entri": [ + { + "nama": "sa.ge", + "nomor": "1", + "kata_dasar": [], + "pelafalan": "/sag\u00e9/", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "cerita rakyat berdasarkan cerita sejarah yang sudah ditambah imajinasi masyarakat" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "sa.ge", + "nomor": "2", + "kata_dasar": [], + "pelafalan": "/sag\u00e9/", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "tanaman yang termasuk keluarga min, tingginya dapat mencapai 70 cm, daunnya berbentuk oval, keras, berbulu halus, beraroma tajam, dan biasa digunakan sebagai bumbu masakan" + ], + "info": "\u3008Salvia officinalis\u3009", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/semakin.json b/tests/kasus/serialisasi-auth/semakin.json new file mode 100644 index 0000000..d18ec4d --- /dev/null +++ b/tests/kasus/serialisasi-auth/semakin.json @@ -0,0 +1,44 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/semakin", + "entri": [ + { + "nama": "se.ma.kin", + "nomor": "", + "kata_dasar": [ + "makin" + ], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "se.ma.kin", + "nomor": "", + "kata_dasar": [], + "pelafalan": "/s\u00eamakin/", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [], + "submakna": [ + "\u2192 makin" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + } + ] +} diff --git a/tests/kasus/serialisasi-auth/tampak.json b/tests/kasus/serialisasi-auth/tampak.json new file mode 100644 index 0000000..c9d6f95 --- /dev/null +++ b/tests/kasus/serialisasi-auth/tampak.json @@ -0,0 +1,99 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/tampak", + "entri": [ + { + "nama": "tam.pak", + "nomor": "1", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [ + "nampak" + ], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "v", + "nama": "Verba", + "deskripsi": "kata kerja" + } + ], + "submakna": [ + "dapat dilihat", + "kelihatan" + ], + "info": "", + "contoh": [ + "pulau itu sudah -- dari sini" + ] + }, + { + "kelas": [ + { + "kode": "v", + "nama": "Verba", + "deskripsi": "kata kerja" + } + ], + "submakna": [ + "memperlihatkan diri", + "muncul" + ], + "info": "", + "contoh": [ + "sudah lama dia tidak --" + ] + } + ], + "etimologi": null, + "kata_turunan": [ + "ketampakan", + "menampak", + "menampakkan", + "penampakan", + "tampak-tampak", + "tampaknya", + "tertampak" + ], + "gabungan_kata": [], + "peribahasa": [], + "kiasan": [] + }, + { + "nama": "tam.pak", + "nomor": "2", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [], + "submakna": [ + "\u2192 campak (2)" + ], + "info": "", + "contoh": [] + } + ], + "etimologi": null, + "kata_turunan": [], + "gabungan_kata": [], + "peribahasa": [ + "buka kulit, ambil (tampak) isi", + "datang tampak muka, pulang tampak punggung", + "datang tampak muka, pulang tampak punggung", + "hilang sepuh tampak senam", + "kuman di seberang lautan tampak, gajah di pelupuk mata tidak tampak", + "tampak gabak di hulu (gabak di hulu tanda akan hujan)", + "tampak tembelangnya", + "terpijak benang arang hitam tampak", + "yang tinggi tampak jauh, yang dekat jolong bersua" + ], + "kiasan": [ + "tidak tampak batang hidungnya" + ] + } + ] +} diff --git a/tests/kasus/serialisasi/alam.json b/tests/kasus/serialisasi/alam.json new file mode 100644 index 0000000..9e7ebbc --- /dev/null +++ b/tests/kasus/serialisasi/alam.json @@ -0,0 +1,178 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/alam", + "entri": [ + { + "nama": "alam", + "nomor": "1", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "segala yang ada di langit dan di bumi (seperti bumi, bintang, kekuatan)" + ], + "info": "", + "contoh": [ + "-- sekeliling" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "lingkungan kehidupan" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "segala sesuatu yang termasuk dalam satu lingkungan (golongan dan sebagainya) dan dianggap sebagai satu keutuhan" + ], + "info": "", + "contoh": [ + "-- pikiran", + "-- tumbuh-tumbuhan" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "segala daya (gaya, kekuatan, dan sebagainya) yang menyebabkan terjadinya dan seakan-akan mengatur segala sesuatu yang ada di dunia ini" + ], + "info": "", + "contoh": [ + "hukum --", + "ilmu --" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "yang bukan buatan manusia" + ], + "info": "", + "contoh": [ + "karet --" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "dunia" + ], + "info": "", + "contoh": [ + "-- semesta", + "syah --" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "kerajaan", + "daerah", + "negeri" + ], + "info": "", + "contoh": [ + "-- Minangkabau" + ] + } + ] + }, + { + "nama": "alam", + "nomor": "2", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "prakategorial", + "nama": "prakategorial", + "deskripsi": "kata tidak dipakai dalam bentuk dasarnya" + } + ], + "submakna": [ + "cari: berpengalaman, mengalami, pengalam, pengalaman" + ], + "info": "", + "contoh": [] + } + ] + }, + { + "nama": "alam", + "nomor": "3", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "bendera (panji-panji) sebagai tanda (pada pasukan dan sebagainya)" + ], + "info": "", + "contoh": [] + } + ] + } + ] +} diff --git a/tests/kasus/serialisasi/ranah.json b/tests/kasus/serialisasi/ranah.json new file mode 100644 index 0000000..b344e9b --- /dev/null +++ b/tests/kasus/serialisasi/ranah.json @@ -0,0 +1,101 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/ranah", + "entri": [ + { + "nama": "ra.nah", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "tanah rata", + "dataran rendah", + "lembah" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "tanah yang berpaya-paya" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "elemen atau unsur yang dibatasi", + "bidang disiplin" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + }, + { + "kode": "Ling", + "nama": "Linguistik", + "deskripsi": "-" + } + ], + "submakna": [ + "lingkungan yang memungkinkan terjadinya percakapan, merupakan kombinasi antara partisipan, topik, dan tempat (misalnya keluarga, pendidikan, tempat kerja, keagamaan, dan sebagainya)" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + }, + { + "kode": "Psi", + "nama": "Psikologi", + "deskripsi": "-" + } + ], + "submakna": [ + "bagian (satuan) perilaku manusia" + ], + "info": "", + "contoh": [ + "-- afektif berbagai perilaku yang berkaitan dengan perasaan", + "-- kognitif perilaku yang menjadi kegiatan kognisi atau pikiran" + ] + } + ] + } + ] +} diff --git a/tests/kasus/serialisasi/roh.json b/tests/kasus/serialisasi/roh.json new file mode 100644 index 0000000..74dcb0a --- /dev/null +++ b/tests/kasus/serialisasi/roh.json @@ -0,0 +1,70 @@ +{ + "pranala": "https://kbbi.kemdikbud.go.id/entri/roh", + "entri": [ + { + "nama": "roh", + "nomor": "", + "kata_dasar": [], + "pelafalan": "", + "bentuk_tidak_baku": [ + "ruh" + ], + "varian": [], + "makna": [ + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "sesuatu (unsur) yang ada dalam jasad yang diciptakan Tuhan sebagai penyebab adanya hidup (kehidupan)", + "nyawa" + ], + "info": "", + "contoh": [ + "jika -- sudah berpisah dari badan, berakhirlah kehidupan seseorang" + ] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + } + ], + "submakna": [ + "makhluk hidup yang tidak berjasad, tetapi berpikiran dan berperasaan (malaikat, jin, setan, dan sebagainya)" + ], + "info": "", + "contoh": [] + }, + { + "kelas": [ + { + "kode": "n", + "nama": "Nomina", + "deskripsi": "kata benda" + }, + { + "kode": "ki", + "nama": "kiasan", + "deskripsi": "" + } + ], + "submakna": [ + "semangat", + "spirit" + ], + "info": "", + "contoh": [ + "kedamaian bagi seluruh warga sesuai dengan -- Islam" + ] + } + ] + } + ] +} diff --git a/tests/kasus/str-auth/alam.txt b/tests/kasus/str-auth/alam.txt new file mode 100644 index 0000000..003e0f1 --- /dev/null +++ b/tests/kasus/str-auth/alam.txt @@ -0,0 +1,24 @@ +alam (1) +Etimologi: [Arab] (n) (sg) (m) عَالَمٌ ‘ālam: manusia; seluruh makhluk +1. (n) segala yang ada di langit dan di bumi (seperti bumi, bintang, kekuatan): -- sekeliling +2. (n) lingkungan kehidupan +3. (n) segala sesuatu yang termasuk dalam satu lingkungan (golongan dan sebagainya) dan dianggap sebagai satu keutuhan: -- pikiran; -- tumbuh-tumbuhan +4. (n) segala daya (gaya, kekuatan, dan sebagainya) yang menyebabkan terjadinya dan seakan-akan mengatur segala sesuatu yang ada di dunia ini: hukum --; ilmu -- +5. (n) yang bukan buatan manusia: karet -- +6. (n) dunia: -- semesta; syah -- +7. (n) kerajaan; daerah; negeri: -- Minangkabau +Kata Turunan +beralam; kealaman +Gabungan Kata +alam akhirat; alam arwah; alam astral; alam baka; alam barzakh; alam besar; alam fana; alam gaib; alam kabir; alam kecil; alam kekal; alam kelanggengan; alam kubur; alam malakut; alam misal; alam nabati; alam pikiran; alam rahim; alam raya; alam sagir; alam samar; alam semesta; alam semesta datar; alam semesta terbuka; alam semesta tertutup + +alam (2) +Etimologi: [Arab] (n) (sg) (m) عَلَمٌ ‘alam: gunung; tanda; lukisan pada baju; plang jalan; bendera pasukan perang +(prakategorial) cari: berpengalaman, mengalami, pengalam, pengalaman +Kata Turunan +berpengalaman; mengalami; pengalam; pengalaman + +alam (3) +(n) bendera (panji-panji) sebagai tanda (pada pasukan dan sebagainya) +Kiasan (mengandung [alam]) +negeri (alam) yang baka; pergi ke alam baka diff --git a/tests/kasus/str-auth/beruang.txt b/tests/kasus/str-auth/beruang.txt new file mode 100644 index 0000000..86867ce --- /dev/null +++ b/tests/kasus/str-auth/beruang.txt @@ -0,0 +1,10 @@ +uang » ber.u.ang +1. (v) mempunyai uang: sepeser pun saya tidak ~ +2. (a) (ki) kaya: orang yang dapat menikmati makanan semahal itu hanyalah orang yang ~ + +be.ru.ang /bêruang/ +(n) binatang buas jenis Ursus, berbulu tebal, dapat berdiri di atas kedua kaki belakangnya, bercakar, dan bermoncong panjang (banyak macamnya, seperti -- bukit, -- damar, -- putih) +Gabungan Kata +beruang es; beruang kutub +Peribahasa (mengandung [beruang]) +hilang rona karena penyakit, hilang bangsa tidak beruang diff --git a/tests/kasus/str-auth/bin.txt b/tests/kasus/str-auth/bin.txt new file mode 100644 index 0000000..8ab172f --- /dev/null +++ b/tests/kasus/str-auth/bin.txt @@ -0,0 +1,7 @@ +bin +Etimologi: [Arab] (n) (sg) (m) اِبْنٌ ibn: anak lelaki +1. (n) (Ar) kata untuk menyatakan anak laki-laki dari seseorang (biasa dipakai untuk keterangan antara nama seseorang dan nama ayah); anak laki-laki dari: Amat -- Soleh Amat anak dari Soleh +2. (p) (cak) (Ar) kata untuk menguatkan atau mengungkapkan dengan perkataan lain: aneh -- ajaib + +BIN +(n) (sing) Badan Intelijen Negara (lembaga pemerintah nonkementerian Indonesia yang bertugas di bidang intelijen) diff --git a/tests/kasus/str-auth/civitas academica.txt b/tests/kasus/str-auth/civitas academica.txt new file mode 100644 index 0000000..a9b7f28 --- /dev/null +++ b/tests/kasus/str-auth/civitas academica.txt @@ -0,0 +1,2 @@ +civitas academica +(ukp) (Lt) kelompok (warga) masyarakat akademik yang terdiri atas dosen dan mahasiswa dengan perwakilannya yang terbentuk melalui senat masing-masing diff --git a/tests/kasus/str-auth/kan.txt b/tests/kasus/str-auth/kan.txt new file mode 100644 index 0000000..a1c902e --- /dev/null +++ b/tests/kasus/str-auth/kan.txt @@ -0,0 +1,18 @@ +kan (1) +(n) (ark) langkan (pada perahu) + +kan (2) +(adv) (kp) bukan + +kan (3) +(adv) (kp) akan + +kan (4) +(n) tempat memasak air teh; morong; teko + +-kan (5) +1. (sufiks pembentuk verba) menjadikan: jalankan; datangkan; hitamkan +2. (sufiks pembentuk verba) sungguh-sungguh: dengarkan; camkan +3. (sufiks pembentuk verba) untuk; kepada orang lain: sewakan; bacakan +Peribahasa (mengandung [-kan]) +tak kan lari gunung dikejar, hilang kabut tampaklah dia diff --git a/tests/kasus/str-auth/keratabasa.txt b/tests/kasus/str-auth/keratabasa.txt new file mode 100644 index 0000000..5c0e318 --- /dev/null +++ b/tests/kasus/str-auth/keratabasa.txt @@ -0,0 +1,2 @@ +ke.ra.ta.ba.sa /kératabasa/ +(n) perihal menerangkan arti kata dengan memperlakukannya sebagai singkatan, biasanya untuk lelucon (misalnya kata benci ditafsirkan sebagai ‘benar-benar cinta’); etimologi rakyat diff --git a/tests/kasus/str-auth/khayal.txt b/tests/kasus/str-auth/khayal.txt new file mode 100644 index 0000000..0c5fc5b --- /dev/null +++ b/tests/kasus/str-auth/khayal.txt @@ -0,0 +1,7 @@ +kha.yal +bentuk tidak baku: kayal +Etimologi: [Arab] (n) (sg) (m) خَيَالٌ khayāl: bayang-bayang +1. (n) lukisan (gambar) dalam angan-angan; fantasi: apa yang diceritakan itu -- belaka +2. (n) yang diangan-angankan seperti benar-benar ada: cerita -- +Kata Turunan +berkhayal; khayalan; mengkhayal; mengkhayalkan; pengkhayal; pengkhayalan; terkhayal diff --git a/tests/kasus/str-auth/lah.txt b/tests/kasus/str-auth/lah.txt new file mode 100644 index 0000000..5b443f1 --- /dev/null +++ b/tests/kasus/str-auth/lah.txt @@ -0,0 +1,10 @@ +-lah (1) +(bentuk terikat) yang digunakan untuk menekankan makna kata yang di depannya + +lah (2) +(adv) (kp) telah: hari -- larut senja + +lah (3) +(p) (cak) kata seru untuk memberi tekanan atau menyungguhkan: “--, itu orangnya”, katanya sambil menunjuk seseorang yang baru datang +Peribahasa (mengandung [lah]) +mensiang yang baru dicari, kampil ‘lah sudah dahulu diff --git a/tests/kasus/str-auth/lampir.txt b/tests/kasus/str-auth/lampir.txt new file mode 100644 index 0000000..8cb553e --- /dev/null +++ b/tests/kasus/str-auth/lampir.txt @@ -0,0 +1,4 @@ +lam.pir +(prakategorial) cari: lampiran, melampiri, melampirkan, terlampir +Kata Turunan +lampiran; melampiri; melampirkan; terlampir diff --git a/tests/kasus/str-auth/makin.txt b/tests/kasus/str-auth/makin.txt new file mode 100644 index 0000000..cec405f --- /dev/null +++ b/tests/kasus/str-auth/makin.txt @@ -0,0 +1,8 @@ +ma.kin +bentuk tidak baku: mangkin, semakin +1. (adv) kian bertambah: tangisnya -- menjadi-jadi; pesawat itu terbang -- tinggi +2. (p) (kl) lebih-lebih; apalagi: segala gembala gajah semuanya kasih akan Laksamana Khoja Hassan, -- kepada gembala Kepenjang itu jangan dikata lagi +Kata Turunan +semakin +Peribahasa (mengandung [makin]) +ilmu padi, makin berisi makin runduk; jika pisau tiada berbaja, makin dikikir bertambah tumpul; lagi murah, lagi menawar (makin murah, makin menawar) diff --git a/tests/kasus/str-auth/me-.txt b/tests/kasus/str-auth/me-.txt new file mode 100644 index 0000000..500028b --- /dev/null +++ b/tests/kasus/str-auth/me-.txt @@ -0,0 +1,15 @@ +me- /mê-/ +→ meng- + +meng- /mêng-/ +varian: me-, mem-, men-, menge-, meny- +1. (prefiks pembentuk verba) menjadi: mencair; menguning; mengkristal +2. (prefiks pembentuk verba) berfungsi sebagai atau menyerupai: menyupir; menggunung +3. (prefiks pembentuk verba) makan atau minum: menyatai; mengopi; mengeteh +4. (prefiks pembentuk verba) menuju: mengutara; melaut; menepi +5. (prefiks pembentuk verba) mencari atau mengumpulkan: mendamar; merumput +6. (prefiks pembentuk verba) mengeluarkan bunyi: mengeong; mengaum; mencicit +7. (prefiks pembentuk verba) menimbulkan kesan seperti seseorang atau sesuatu yang: membisu; membatu; merendah hati +8. (prefiks pembentuk verba) dasar verba: membaca; menulis; membajak +9. (prefiks pembentuk verba) membuat; menghasilkan: menyambal; menggulai; membatik +10. (prefiks pembentuk verba) menyatakan: mengaku diff --git a/tests/kasus/str-auth/menjadikan.txt b/tests/kasus/str-auth/menjadikan.txt new file mode 100644 index 0000000..44ca616 --- /dev/null +++ b/tests/kasus/str-auth/menjadikan.txt @@ -0,0 +1,8 @@ +jadi (1) » men.ja.di.kan +1. (v) membuat sebagai; merupakan: ia ~ sakit adiknya sebagai alasan untuk tidak pergi kuliah +2. (v) menyebabkan: hal itu akan ~ orang lain marah-marah +3. (v) mengangkat (memilih) sebagai: rakyat telah ~ dia kepala desa +4. (v) melaksanakan (rencana, janji, dan sebagainya): ia ~ penawarannya untuk membeli rumah itu +5. (v) menciptakan; mengadakan: Tuhan yang ~ langit dan bumi beserta isinya +Gabungan Kata +menjadikan hati diff --git a/tests/kasus/str-auth/quo vadis?.txt b/tests/kasus/str-auth/quo vadis?.txt new file mode 100644 index 0000000..0d50f54 --- /dev/null +++ b/tests/kasus/str-auth/quo vadis?.txt @@ -0,0 +1,2 @@ +quo vadis? +(ukp) (Lt) hendak pergi ke mana? (dipakai untuk mengingatkan seseorang agar memperbaiki dirinya) diff --git a/tests/kasus/str-auth/ranah.txt b/tests/kasus/str-auth/ranah.txt new file mode 100644 index 0000000..dc6f457 --- /dev/null +++ b/tests/kasus/str-auth/ranah.txt @@ -0,0 +1,8 @@ +ra.nah +1. (n) tanah rata; dataran rendah; lembah +2. (n) tanah yang berpaya-paya +3. (n) elemen atau unsur yang dibatasi; bidang disiplin +4. (n) (Ling) lingkungan yang memungkinkan terjadinya percakapan, merupakan kombinasi antara partisipan, topik, dan tempat (misalnya keluarga, pendidikan, tempat kerja, keagamaan, dan sebagainya) +5. (n) (Psi) bagian (satuan) perilaku manusia: -- afektif berbagai perilaku yang berkaitan dengan perasaan; -- kognitif perilaku yang menjadi kegiatan kognisi atau pikiran +Gabungan Kata +ranah afektif; ranah eminen; ranah frekuensi; ranah kognitif; ranah politik; ranah psikomotor diff --git a/tests/kasus/str-auth/roh.txt b/tests/kasus/str-auth/roh.txt new file mode 100644 index 0000000..6f8b5ea --- /dev/null +++ b/tests/kasus/str-auth/roh.txt @@ -0,0 +1,8 @@ +roh +bentuk tidak baku: ruh +Etimologi: [Arab] (n) (sg) (f/m) رُوْحٌ rūh: tiupan; sesuatu yang membuat manusia dapat hidup +1. (n) sesuatu (unsur) yang ada dalam jasad yang diciptakan Tuhan sebagai penyebab adanya hidup (kehidupan); nyawa: jika -- sudah berpisah dari badan, berakhirlah kehidupan seseorang +2. (n) makhluk hidup yang tidak berjasad, tetapi berpikiran dan berperasaan (malaikat, jin, setan, dan sebagainya) +3. (n) (ki) semangat; spirit: kedamaian bagi seluruh warga sesuai dengan -- Islam +Gabungan Kata +roh Kudus; roh suci diff --git a/tests/kasus/str-auth/sage.txt b/tests/kasus/str-auth/sage.txt new file mode 100644 index 0000000..5ba5a1b --- /dev/null +++ b/tests/kasus/str-auth/sage.txt @@ -0,0 +1,5 @@ +sa.ge (1) /sagé/ +(n) cerita rakyat berdasarkan cerita sejarah yang sudah ditambah imajinasi masyarakat + +sa.ge (2) /sagé/ +(n) tanaman yang termasuk keluarga min, tingginya dapat mencapai 70 cm, daunnya berbentuk oval, keras, berbulu halus, beraroma tajam, dan biasa digunakan sebagai bumbu masakan 〈Salvia officinalis〉 diff --git a/tests/kasus/str-auth/semakin.txt b/tests/kasus/str-auth/semakin.txt new file mode 100644 index 0000000..9133ac6 --- /dev/null +++ b/tests/kasus/str-auth/semakin.txt @@ -0,0 +1,4 @@ +makin » se.ma.kin + +se.ma.kin /sêmakin/ +→ makin diff --git a/tests/kasus/str-auth/tampak.txt b/tests/kasus/str-auth/tampak.txt new file mode 100644 index 0000000..0c6347e --- /dev/null +++ b/tests/kasus/str-auth/tampak.txt @@ -0,0 +1,13 @@ +tam.pak (1) +bentuk tidak baku: nampak +1. (v) dapat dilihat; kelihatan: pulau itu sudah -- dari sini +2. (v) memperlihatkan diri; muncul: sudah lama dia tidak -- +Kata Turunan +ketampakan; menampak; menampakkan; penampakan; tampak-tampak; tampaknya; tertampak + +tam.pak (2) +→ campak (2) +Peribahasa (mengandung [tampak]) +buka kulit, ambil (tampak) isi; datang tampak muka, pulang tampak punggung; datang tampak muka, pulang tampak punggung; hilang sepuh tampak senam; kuman di seberang lautan tampak, gajah di pelupuk mata tidak tampak; tampak gabak di hulu (gabak di hulu tanda akan hujan); tampak tembelangnya; terpijak benang arang hitam tampak; yang tinggi tampak jauh, yang dekat jolong bersua +Kiasan (mengandung [tampak]) +tidak tampak batang hidungnya diff --git a/tests/kasus/str/alam.txt b/tests/kasus/str/alam.txt new file mode 100644 index 0000000..f760d1c --- /dev/null +++ b/tests/kasus/str/alam.txt @@ -0,0 +1,14 @@ +alam (1) +1. (n) segala yang ada di langit dan di bumi (seperti bumi, bintang, kekuatan): -- sekeliling +2. (n) lingkungan kehidupan +3. (n) segala sesuatu yang termasuk dalam satu lingkungan (golongan dan sebagainya) dan dianggap sebagai satu keutuhan: -- pikiran; -- tumbuh-tumbuhan +4. (n) segala daya (gaya, kekuatan, dan sebagainya) yang menyebabkan terjadinya dan seakan-akan mengatur segala sesuatu yang ada di dunia ini: hukum --; ilmu -- +5. (n) yang bukan buatan manusia: karet -- +6. (n) dunia: -- semesta; syah -- +7. (n) kerajaan; daerah; negeri: -- Minangkabau + +alam (2) +(prakategorial) cari: berpengalaman, mengalami, pengalam, pengalaman + +alam (3) +(n) bendera (panji-panji) sebagai tanda (pada pasukan dan sebagainya) diff --git a/tests/kasus/str/ranah.txt b/tests/kasus/str/ranah.txt new file mode 100644 index 0000000..0da1b46 --- /dev/null +++ b/tests/kasus/str/ranah.txt @@ -0,0 +1,6 @@ +ra.nah +1. (n) tanah rata; dataran rendah; lembah +2. (n) tanah yang berpaya-paya +3. (n) elemen atau unsur yang dibatasi; bidang disiplin +4. (n) (Ling) lingkungan yang memungkinkan terjadinya percakapan, merupakan kombinasi antara partisipan, topik, dan tempat (misalnya keluarga, pendidikan, tempat kerja, keagamaan, dan sebagainya) +5. (n) (Psi) bagian (satuan) perilaku manusia: -- afektif berbagai perilaku yang berkaitan dengan perasaan; -- kognitif perilaku yang menjadi kegiatan kognisi atau pikiran diff --git a/tests/kasus/str/roh.txt b/tests/kasus/str/roh.txt new file mode 100644 index 0000000..7968d31 --- /dev/null +++ b/tests/kasus/str/roh.txt @@ -0,0 +1,5 @@ +roh +bentuk tidak baku: ruh +1. (n) sesuatu (unsur) yang ada dalam jasad yang diciptakan Tuhan sebagai penyebab adanya hidup (kehidupan); nyawa: jika -- sudah berpisah dari badan, berakhirlah kehidupan seseorang +2. (n) makhluk hidup yang tidak berjasad, tetapi berpikiran dan berperasaan (malaikat, jin, setan, dan sebagainya) +3. (n) (ki) semangat; spirit: kedamaian bagi seluruh warga sesuai dengan -- Islam diff --git a/tests/kasus/str_tanpa_contoh-auth/alam.txt b/tests/kasus/str_tanpa_contoh-auth/alam.txt new file mode 100644 index 0000000..597b73b --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/alam.txt @@ -0,0 +1,24 @@ +alam (1) +Etimologi: [Arab] (n) (sg) (m) عَالَمٌ ‘ālam: manusia; seluruh makhluk +1. (n) segala yang ada di langit dan di bumi (seperti bumi, bintang, kekuatan) +2. (n) lingkungan kehidupan +3. (n) segala sesuatu yang termasuk dalam satu lingkungan (golongan dan sebagainya) dan dianggap sebagai satu keutuhan +4. (n) segala daya (gaya, kekuatan, dan sebagainya) yang menyebabkan terjadinya dan seakan-akan mengatur segala sesuatu yang ada di dunia ini +5. (n) yang bukan buatan manusia +6. (n) dunia +7. (n) kerajaan; daerah; negeri +Kata Turunan +beralam; kealaman +Gabungan Kata +alam akhirat; alam arwah; alam astral; alam baka; alam barzakh; alam besar; alam fana; alam gaib; alam kabir; alam kecil; alam kekal; alam kelanggengan; alam kubur; alam malakut; alam misal; alam nabati; alam pikiran; alam rahim; alam raya; alam sagir; alam samar; alam semesta; alam semesta datar; alam semesta terbuka; alam semesta tertutup + +alam (2) +Etimologi: [Arab] (n) (sg) (m) عَلَمٌ ‘alam: gunung; tanda; lukisan pada baju; plang jalan; bendera pasukan perang +(prakategorial) cari: berpengalaman, mengalami, pengalam, pengalaman +Kata Turunan +berpengalaman; mengalami; pengalam; pengalaman + +alam (3) +(n) bendera (panji-panji) sebagai tanda (pada pasukan dan sebagainya) +Kiasan (mengandung [alam]) +negeri (alam) yang baka; pergi ke alam baka diff --git a/tests/kasus/str_tanpa_contoh-auth/beruang.txt b/tests/kasus/str_tanpa_contoh-auth/beruang.txt new file mode 100644 index 0000000..202abe5 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/beruang.txt @@ -0,0 +1,10 @@ +uang » ber.u.ang +1. (v) mempunyai uang +2. (a) (ki) kaya + +be.ru.ang /bêruang/ +(n) binatang buas jenis Ursus, berbulu tebal, dapat berdiri di atas kedua kaki belakangnya, bercakar, dan bermoncong panjang (banyak macamnya, seperti -- bukit, -- damar, -- putih) +Gabungan Kata +beruang es; beruang kutub +Peribahasa (mengandung [beruang]) +hilang rona karena penyakit, hilang bangsa tidak beruang diff --git a/tests/kasus/str_tanpa_contoh-auth/bin.txt b/tests/kasus/str_tanpa_contoh-auth/bin.txt new file mode 100644 index 0000000..f9751fd --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/bin.txt @@ -0,0 +1,7 @@ +bin +Etimologi: [Arab] (n) (sg) (m) اِبْنٌ ibn: anak lelaki +1. (n) (Ar) kata untuk menyatakan anak laki-laki dari seseorang (biasa dipakai untuk keterangan antara nama seseorang dan nama ayah); anak laki-laki dari +2. (p) (cak) (Ar) kata untuk menguatkan atau mengungkapkan dengan perkataan lain + +BIN +(n) (sing) Badan Intelijen Negara (lembaga pemerintah nonkementerian Indonesia yang bertugas di bidang intelijen) diff --git a/tests/kasus/str_tanpa_contoh-auth/civitas academica.txt b/tests/kasus/str_tanpa_contoh-auth/civitas academica.txt new file mode 100644 index 0000000..a9b7f28 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/civitas academica.txt @@ -0,0 +1,2 @@ +civitas academica +(ukp) (Lt) kelompok (warga) masyarakat akademik yang terdiri atas dosen dan mahasiswa dengan perwakilannya yang terbentuk melalui senat masing-masing diff --git a/tests/kasus/str_tanpa_contoh-auth/kan.txt b/tests/kasus/str_tanpa_contoh-auth/kan.txt new file mode 100644 index 0000000..0bdafd8 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/kan.txt @@ -0,0 +1,18 @@ +kan (1) +(n) (ark) langkan (pada perahu) + +kan (2) +(adv) (kp) bukan + +kan (3) +(adv) (kp) akan + +kan (4) +(n) tempat memasak air teh; morong; teko + +-kan (5) +1. (sufiks pembentuk verba) menjadikan +2. (sufiks pembentuk verba) sungguh-sungguh +3. (sufiks pembentuk verba) untuk; kepada orang lain +Peribahasa (mengandung [-kan]) +tak kan lari gunung dikejar, hilang kabut tampaklah dia diff --git a/tests/kasus/str_tanpa_contoh-auth/keratabasa.txt b/tests/kasus/str_tanpa_contoh-auth/keratabasa.txt new file mode 100644 index 0000000..5c0e318 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/keratabasa.txt @@ -0,0 +1,2 @@ +ke.ra.ta.ba.sa /kératabasa/ +(n) perihal menerangkan arti kata dengan memperlakukannya sebagai singkatan, biasanya untuk lelucon (misalnya kata benci ditafsirkan sebagai ‘benar-benar cinta’); etimologi rakyat diff --git a/tests/kasus/str_tanpa_contoh-auth/khayal.txt b/tests/kasus/str_tanpa_contoh-auth/khayal.txt new file mode 100644 index 0000000..a76856d --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/khayal.txt @@ -0,0 +1,7 @@ +kha.yal +bentuk tidak baku: kayal +Etimologi: [Arab] (n) (sg) (m) خَيَالٌ khayāl: bayang-bayang +1. (n) lukisan (gambar) dalam angan-angan; fantasi +2. (n) yang diangan-angankan seperti benar-benar ada +Kata Turunan +berkhayal; khayalan; mengkhayal; mengkhayalkan; pengkhayal; pengkhayalan; terkhayal diff --git a/tests/kasus/str_tanpa_contoh-auth/lah.txt b/tests/kasus/str_tanpa_contoh-auth/lah.txt new file mode 100644 index 0000000..00418cc --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/lah.txt @@ -0,0 +1,10 @@ +-lah (1) +(bentuk terikat) yang digunakan untuk menekankan makna kata yang di depannya + +lah (2) +(adv) (kp) telah + +lah (3) +(p) (cak) kata seru untuk memberi tekanan atau menyungguhkan +Peribahasa (mengandung [lah]) +mensiang yang baru dicari, kampil ‘lah sudah dahulu diff --git a/tests/kasus/str_tanpa_contoh-auth/lampir.txt b/tests/kasus/str_tanpa_contoh-auth/lampir.txt new file mode 100644 index 0000000..8cb553e --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/lampir.txt @@ -0,0 +1,4 @@ +lam.pir +(prakategorial) cari: lampiran, melampiri, melampirkan, terlampir +Kata Turunan +lampiran; melampiri; melampirkan; terlampir diff --git a/tests/kasus/str_tanpa_contoh-auth/makin.txt b/tests/kasus/str_tanpa_contoh-auth/makin.txt new file mode 100644 index 0000000..4ace5d5 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/makin.txt @@ -0,0 +1,8 @@ +ma.kin +bentuk tidak baku: mangkin, semakin +1. (adv) kian bertambah +2. (p) (kl) lebih-lebih; apalagi +Kata Turunan +semakin +Peribahasa (mengandung [makin]) +ilmu padi, makin berisi makin runduk; jika pisau tiada berbaja, makin dikikir bertambah tumpul; lagi murah, lagi menawar (makin murah, makin menawar) diff --git a/tests/kasus/str_tanpa_contoh-auth/me-.txt b/tests/kasus/str_tanpa_contoh-auth/me-.txt new file mode 100644 index 0000000..6cd9c06 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/me-.txt @@ -0,0 +1,15 @@ +me- /mê-/ +→ meng- + +meng- /mêng-/ +varian: me-, mem-, men-, menge-, meny- +1. (prefiks pembentuk verba) menjadi +2. (prefiks pembentuk verba) berfungsi sebagai atau menyerupai +3. (prefiks pembentuk verba) makan atau minum +4. (prefiks pembentuk verba) menuju +5. (prefiks pembentuk verba) mencari atau mengumpulkan +6. (prefiks pembentuk verba) mengeluarkan bunyi +7. (prefiks pembentuk verba) menimbulkan kesan seperti seseorang atau sesuatu yang +8. (prefiks pembentuk verba) dasar verba +9. (prefiks pembentuk verba) membuat; menghasilkan +10. (prefiks pembentuk verba) menyatakan diff --git a/tests/kasus/str_tanpa_contoh-auth/menjadikan.txt b/tests/kasus/str_tanpa_contoh-auth/menjadikan.txt new file mode 100644 index 0000000..705f621 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/menjadikan.txt @@ -0,0 +1,8 @@ +jadi (1) » men.ja.di.kan +1. (v) membuat sebagai; merupakan +2. (v) menyebabkan +3. (v) mengangkat (memilih) sebagai +4. (v) melaksanakan (rencana, janji, dan sebagainya) +5. (v) menciptakan; mengadakan +Gabungan Kata +menjadikan hati diff --git a/tests/kasus/str_tanpa_contoh-auth/quo vadis?.txt b/tests/kasus/str_tanpa_contoh-auth/quo vadis?.txt new file mode 100644 index 0000000..0d50f54 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/quo vadis?.txt @@ -0,0 +1,2 @@ +quo vadis? +(ukp) (Lt) hendak pergi ke mana? (dipakai untuk mengingatkan seseorang agar memperbaiki dirinya) diff --git a/tests/kasus/str_tanpa_contoh-auth/ranah.txt b/tests/kasus/str_tanpa_contoh-auth/ranah.txt new file mode 100644 index 0000000..b0fb555 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/ranah.txt @@ -0,0 +1,8 @@ +ra.nah +1. (n) tanah rata; dataran rendah; lembah +2. (n) tanah yang berpaya-paya +3. (n) elemen atau unsur yang dibatasi; bidang disiplin +4. (n) (Ling) lingkungan yang memungkinkan terjadinya percakapan, merupakan kombinasi antara partisipan, topik, dan tempat (misalnya keluarga, pendidikan, tempat kerja, keagamaan, dan sebagainya) +5. (n) (Psi) bagian (satuan) perilaku manusia +Gabungan Kata +ranah afektif; ranah eminen; ranah frekuensi; ranah kognitif; ranah politik; ranah psikomotor diff --git a/tests/kasus/str_tanpa_contoh-auth/roh.txt b/tests/kasus/str_tanpa_contoh-auth/roh.txt new file mode 100644 index 0000000..78c5ffd --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/roh.txt @@ -0,0 +1,8 @@ +roh +bentuk tidak baku: ruh +Etimologi: [Arab] (n) (sg) (f/m) رُوْحٌ rūh: tiupan; sesuatu yang membuat manusia dapat hidup +1. (n) sesuatu (unsur) yang ada dalam jasad yang diciptakan Tuhan sebagai penyebab adanya hidup (kehidupan); nyawa +2. (n) makhluk hidup yang tidak berjasad, tetapi berpikiran dan berperasaan (malaikat, jin, setan, dan sebagainya) +3. (n) (ki) semangat; spirit +Gabungan Kata +roh Kudus; roh suci diff --git a/tests/kasus/str_tanpa_contoh-auth/sage.txt b/tests/kasus/str_tanpa_contoh-auth/sage.txt new file mode 100644 index 0000000..5ba5a1b --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/sage.txt @@ -0,0 +1,5 @@ +sa.ge (1) /sagé/ +(n) cerita rakyat berdasarkan cerita sejarah yang sudah ditambah imajinasi masyarakat + +sa.ge (2) /sagé/ +(n) tanaman yang termasuk keluarga min, tingginya dapat mencapai 70 cm, daunnya berbentuk oval, keras, berbulu halus, beraroma tajam, dan biasa digunakan sebagai bumbu masakan 〈Salvia officinalis〉 diff --git a/tests/kasus/str_tanpa_contoh-auth/semakin.txt b/tests/kasus/str_tanpa_contoh-auth/semakin.txt new file mode 100644 index 0000000..9133ac6 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/semakin.txt @@ -0,0 +1,4 @@ +makin » se.ma.kin + +se.ma.kin /sêmakin/ +→ makin diff --git a/tests/kasus/str_tanpa_contoh-auth/tampak.txt b/tests/kasus/str_tanpa_contoh-auth/tampak.txt new file mode 100644 index 0000000..839ea49 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh-auth/tampak.txt @@ -0,0 +1,13 @@ +tam.pak (1) +bentuk tidak baku: nampak +1. (v) dapat dilihat; kelihatan +2. (v) memperlihatkan diri; muncul +Kata Turunan +ketampakan; menampak; menampakkan; penampakan; tampak-tampak; tampaknya; tertampak + +tam.pak (2) +→ campak (2) +Peribahasa (mengandung [tampak]) +buka kulit, ambil (tampak) isi; datang tampak muka, pulang tampak punggung; datang tampak muka, pulang tampak punggung; hilang sepuh tampak senam; kuman di seberang lautan tampak, gajah di pelupuk mata tidak tampak; tampak gabak di hulu (gabak di hulu tanda akan hujan); tampak tembelangnya; terpijak benang arang hitam tampak; yang tinggi tampak jauh, yang dekat jolong bersua +Kiasan (mengandung [tampak]) +tidak tampak batang hidungnya diff --git a/tests/kasus/str_tanpa_contoh/alam.txt b/tests/kasus/str_tanpa_contoh/alam.txt new file mode 100644 index 0000000..f160287 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh/alam.txt @@ -0,0 +1,14 @@ +alam (1) +1. (n) segala yang ada di langit dan di bumi (seperti bumi, bintang, kekuatan) +2. (n) lingkungan kehidupan +3. (n) segala sesuatu yang termasuk dalam satu lingkungan (golongan dan sebagainya) dan dianggap sebagai satu keutuhan +4. (n) segala daya (gaya, kekuatan, dan sebagainya) yang menyebabkan terjadinya dan seakan-akan mengatur segala sesuatu yang ada di dunia ini +5. (n) yang bukan buatan manusia +6. (n) dunia +7. (n) kerajaan; daerah; negeri + +alam (2) +(prakategorial) cari: berpengalaman, mengalami, pengalam, pengalaman + +alam (3) +(n) bendera (panji-panji) sebagai tanda (pada pasukan dan sebagainya) diff --git a/tests/kasus/str_tanpa_contoh/ranah.txt b/tests/kasus/str_tanpa_contoh/ranah.txt new file mode 100644 index 0000000..50aa5fc --- /dev/null +++ b/tests/kasus/str_tanpa_contoh/ranah.txt @@ -0,0 +1,6 @@ +ra.nah +1. (n) tanah rata; dataran rendah; lembah +2. (n) tanah yang berpaya-paya +3. (n) elemen atau unsur yang dibatasi; bidang disiplin +4. (n) (Ling) lingkungan yang memungkinkan terjadinya percakapan, merupakan kombinasi antara partisipan, topik, dan tempat (misalnya keluarga, pendidikan, tempat kerja, keagamaan, dan sebagainya) +5. (n) (Psi) bagian (satuan) perilaku manusia diff --git a/tests/kasus/str_tanpa_contoh/roh.txt b/tests/kasus/str_tanpa_contoh/roh.txt new file mode 100644 index 0000000..f72bff2 --- /dev/null +++ b/tests/kasus/str_tanpa_contoh/roh.txt @@ -0,0 +1,5 @@ +roh +bentuk tidak baku: ruh +1. (n) sesuatu (unsur) yang ada dalam jasad yang diciptakan Tuhan sebagai penyebab adanya hidup (kehidupan); nyawa +2. (n) makhluk hidup yang tidak berjasad, tetapi berpikiran dan berperasaan (malaikat, jin, setan, dan sebagainya) +3. (n) (ki) semangat; spirit diff --git a/tests/test_kbbi.py b/tests/test_kbbi.py index 4686a92..ab2fefe 100644 --- a/tests/test_kbbi.py +++ b/tests/test_kbbi.py @@ -20,25 +20,108 @@ def idfn(val): @pytest.mark.parametrize( "aktual_objek,ekspektasi_str", kasus["str"], indirect=True, ids=idfn ) -def test_str(aktual_objek, ekspektasi_str): +def test_str_nonauth_dgn_eksp_nonauth(aktual_objek, ekspektasi_str): assert str(aktual_objek) == ekspektasi_str +@pytest.mark.parametrize( + "aktual_objek_terautentikasi,ekspektasi_str", + kasus["str"], + indirect=True, + ids=idfn, +) +def test_str_auth_dgn_eksp_nonauth( + aktual_objek_terautentikasi, ekspektasi_str +): + assert ( + aktual_objek_terautentikasi.__str__(fitur_pengguna=False) + == ekspektasi_str + ) + + +@pytest.mark.parametrize( + "aktual_objek_terautentikasi,ekspektasi_str", + kasus["str-auth"], + indirect=True, + ids=idfn, +) +def test_str_auth_dgn_eksp_auth(aktual_objek_terautentikasi, ekspektasi_str): + assert str(aktual_objek_terautentikasi) == ekspektasi_str + + @pytest.mark.parametrize( "aktual_objek,ekspektasi_str", kasus["str_tanpa_contoh"], indirect=True, ids=idfn, ) -def test_str_tanpa_contoh(aktual_objek, ekspektasi_str): +def test_str_tanpa_contoh_nonauth_dgn_eksp_nonauth( + aktual_objek, ekspektasi_str +): assert aktual_objek.__str__(contoh=False) == ekspektasi_str +@pytest.mark.parametrize( + "aktual_objek_terautentikasi,ekspektasi_str", + kasus["str_tanpa_contoh"], + indirect=True, + ids=idfn, +) +def test_str_tanpa_contoh_auth_dgn_eksp_nonauth( + aktual_objek_terautentikasi, ekspektasi_str +): + assert ( + aktual_objek_terautentikasi.__str__(contoh=False, fitur_pengguna=False) + == ekspektasi_str + ) + + +@pytest.mark.parametrize( + "aktual_objek_terautentikasi,ekspektasi_str", + kasus["str_tanpa_contoh-auth"], + indirect=True, + ids=idfn, +) +def test_str_tanpa_contoh_auth_dgn_eksp_auth( + aktual_objek_terautentikasi, ekspektasi_str +): + assert aktual_objek_terautentikasi.__str__(contoh=False) == ekspektasi_str + + @pytest.mark.parametrize( "aktual_objek,ekspektasi_serialisasi", kasus["serialisasi"], indirect=True, ids=idfn, ) -def test_serialisasi(aktual_objek, ekspektasi_serialisasi): +def test_serialisasi_nonauth_dgn_eksp_nonauth( + aktual_objek, ekspektasi_serialisasi +): assert aktual_objek.serialisasi() == ekspektasi_serialisasi + + +@pytest.mark.parametrize( + "aktual_objek_terautentikasi,ekspektasi_serialisasi", + kasus["serialisasi"], + indirect=True, + ids=idfn, +) +def test_serialisasi_auth_dgn_eksp_nonauth( + aktual_objek_terautentikasi, ekspektasi_serialisasi +): + assert ( + aktual_objek_terautentikasi.serialisasi(fitur_pengguna=False) + == ekspektasi_serialisasi + ) + + +@pytest.mark.parametrize( + "aktual_objek_terautentikasi,ekspektasi_serialisasi", + kasus["serialisasi-auth"], + indirect=True, + ids=idfn, +) +def test_serialisasi_auth_dgn_eksp_auth( + aktual_objek_terautentikasi, ekspektasi_serialisasi +): + assert aktual_objek_terautentikasi.serialisasi() == ekspektasi_serialisasi From 6a3607a1b476c5f604d83b5c284b0aebec9931db Mon Sep 17 00:00:00 2001 From: Sage Muhammad Abdullah Date: Sun, 22 Mar 2020 07:35:16 +0700 Subject: [PATCH 43/43] Ubah konfigurasi linting dan tes --- .github/workflows/lint.yml | 4 ++-- .github/workflows/test.yml | 3 +++ .pre-commit-config.yaml | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f17e541..1c2e55f 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -31,8 +31,8 @@ jobs: - name: Lint with flake8 run: | pip install flake8 - flake8 kbbi tests --count --ignore=E203 --show-source --statistics + flake8 kbbi tests --count --ignore=E203,W503 --show-source --statistics - name: Lint with isort run: | pip install isort - isort -c -df -rc -o pytest . + isort -c -df -rc -o pytest -p kbbi . diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 23e828f..c8aa387 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,6 +25,9 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt - name: Test with pytest + env: + KBBI_POSEL: ${{ secrets.KBBI_POSEL }} + KBBI_SANDI: ${{ secrets.KBBI_SANDI }} run: | pip install pytest pytest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b5dbefa..30e9544 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,9 +9,10 @@ repos: rev: "3.7.9" hooks: - id: flake8 - args: ["--ignore=E203"] + args: ["--ignore=E203,W503"] - repo: https://github.com/timothycrosley/isort rev: "4.3.21-2" hooks: - id: isort + args: ["-o=pytest", "-p=kbbi"]