diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fab6c11..54a8613 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ # konfigurasi pre commit repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v5.0.0 hooks: - id: check-executables-have-shebangs - id: check-toml @@ -16,19 +16,19 @@ repos: # contoh # total = sum(angka := num for num in nums ) - repo: https://github.com/MarcoGorelli/auto-walrus - rev: v0.2.2 + rev: 0.3.4 hooks: - id: auto-walrus # ruff adalah salah satu linter dan formatter kode - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.2.1 + rev: v0.7.0 hooks: - id: ruff - id: ruff-format - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.8.0 + rev: v1.12.1 hooks: - id: mypy args: diff --git a/OpenSeries/bilangan_istimewa.py b/OpenSeries/bilangan_istimewa.py index 4261202..779a047 100644 --- a/OpenSeries/bilangan_istimewa.py +++ b/OpenSeries/bilangan_istimewa.py @@ -108,8 +108,10 @@ def angka_segitiga(angka: int) -> Union[int, error.ErrorTipeData, error.Error]: error.Error: jika angka negatif error.ErrorTipeData: jika tipe data salah """ + # jika tipe data dari angka tidak integer if not isinstance(angka, int): return error.ErrorTipeData(["int"]) + # jika value dari angka diisi nilai negatif if angka < 0: return error.Error("angka tidak boleh negatif") return angka * (angka + 1) // 2 diff --git a/OpenSeries/fisika.py b/OpenSeries/fisika.py index ae4c02f..5116ed1 100644 --- a/OpenSeries/fisika.py +++ b/OpenSeries/fisika.py @@ -1,3 +1,4 @@ +from OpenSeries.util import constant as konstanta from OpenSeries.util import error as error from typing import Union @@ -268,3 +269,47 @@ def efek_doppler( "frekuensi tidak positif, kecepatan sumber relatif lebih besar dari kecepatan gelombang dalam medium" ) return doppler + + +def gaya_coulombs( + q1: Union[int, float], q2: Union[int, float], r: Union[int, float] +) -> Union[int, float, error.ErrorDibagiNol, error.ErrorTipeData]: + """ + Fungsi untuk menghitung gaya coulombs dari partikel + + parameter: + q1(int atau float) : muatan partikel pertama + q2(int atau float) : muatan partikel kedua + r(int atau float) : jarak antar dua partikel + return + F(int atau float) : hasil kalkulasi + """ + if not all(isinstance(data, (float, int)) for data in [q1, q2, r]): + return error.ErrorTipeData(["int", "float"]) + if r == 0: + return error.ErrorDibagiNol() + else: + F = konstanta.KONSTANTA_COULOMD * ((q1 * q2) / r**2) + return F + + +def Energi_Potensial_Listrik( + q1: Union[int, float], q2: Union[int, float], r: Union[int, float] +) -> Union[int, float, error.ErrorDibagiNol, error.ErrorTipeData]: + """ + Fungsi untuk menghitung energi potensial listrik dari partikel + + parameter: + q1(int atau float) : muatan partikel pertama + q2(int atau float) : muatan partikel kedua + r(int atau float) : jarak antar dua partikel + return + F(int atau float) : hasil kalkulasi + """ + if not all(isinstance(data, (float, int)) for data in [q1, q2, r]): + return error.ErrorTipeData(["int", "float"]) + if r == 0: + return error.ErrorDibagiNol() + else: + F = konstanta.KONSTANTA_COULOMD * ((q1 * q2) / r) + return F diff --git a/OpenSeries/matematika.py b/OpenSeries/matematika.py index a0fcd07..8a22fe3 100644 --- a/OpenSeries/matematika.py +++ b/OpenSeries/matematika.py @@ -243,6 +243,7 @@ def permutasi(nilai: int, r: int) -> Union[int, float, error.ErrorTipeData]: faktorial_nilai = faktorial(nilai) faktorial_nilai_r = faktorial(nilai - r) + # mengecek tipe data dari nilai faktorial if isinstance(faktorial_nilai, int) and isinstance(faktorial_nilai_r, int): return faktorial_nilai / faktorial_nilai_r else: @@ -268,6 +269,7 @@ def kombinasi(nilai: int, r: int) -> Union[int, float, error.ErrorTipeData]: faktorial_r = faktorial(r) faktorial_nilai_r = faktorial(nilai - r) + # mengecek nilai dari faktorial nilai if ( isinstance(faktorial_nilai, int) and isinstance(faktorial_r, int) diff --git a/OpenSeries/statistika.py b/OpenSeries/statistika.py index c48fa6d..9948fe6 100644 --- a/OpenSeries/statistika.py +++ b/OpenSeries/statistika.py @@ -18,10 +18,13 @@ def entropy( error.ErrorTipeData: error jika tipe data salah error.Error: jika nilai label yang diberikan kosong """ + # jika tipe data dari label bukan list if not isinstance(label, (list)): return error.ErrorTipeData(["list"]) + # jika nilai di dalam list kosong if not label: return error.Error("label tidak boleh kosong") + # jika nilai di dalam list itu tidak int if not all(isinstance(cek_nilai, int) for cek_nilai in label): return error.ErrorTipeData(["int"]) _, count = np.unique(label, return_counts=True) @@ -46,8 +49,10 @@ def standar_deviasi( error.ErrorTipeData: error jika tipe data salah error.Error: jika vektor yang diberikan kosong """ + # cek parameter vektor jika tidak bertipe data np.ndarray if not isinstance(vektor, np.ndarray): return error.ErrorTipeData(["numpy array"]) + # cek jika nilai vektor adalah 0 if len(vektor) == 0: return error.Error("vektor tidak boleh kosong") diff --git a/OpenSeries/util/constant.py b/OpenSeries/util/constant.py index 85bbcd4..cd604ca 100644 --- a/OpenSeries/util/constant.py +++ b/OpenSeries/util/constant.py @@ -8,14 +8,14 @@ # dan dikarakterisasi dalam berbagai cara BILANGAN_EULER: float = 2.718281828459045235360 -# konstanta plank, yang dilambangankan dengan h, yang merupakan konstanta fisika -# fundamental yang menghubungkan energi foton dengan frekuensinya, nilainya disini -# adalah 6.6261 × 10⁻³⁴ (joule per detik) -KONSTANTA_PLANCK = 6.6261 * pow(10, -34) - # variable ini juga mewakili dari konstanta planck, tetapi dinyatan dalam satuan # elektron volt per detik (eV/s) nilainya adalah 4.1357 × 10⁻¹⁵ eV s⁻¹ -KONSTANTA_PLANCK = 4.1357 * pow(10, -15) +KONSTANTA_PLANCK: float = 4.1357 * pow(10, -15) + +# konstanta coulmb adalah konstanta berbanding lurus pada +# persamaan yang menghubungkan variebel listrik +# nilainya 8,9875×10^9 N·m2/C2 +KONSTANTA_COULOMD: float = 8.9875 * pow(10, 9) # default error dari warna menggunakan kode ANSI escape # merah diff --git a/setup.py b/setup.py index 0ae3bae..1b6099a 100644 --- a/setup.py +++ b/setup.py @@ -14,6 +14,7 @@ if platform.system == "windows": core_require.append("pywin32") + install_require = [x.strip() for x in core_require if "git+" not in x] # setup nama project diff --git a/testing/fisika_test.py b/testing/fisika_test.py index 5609a6a..89a722f 100644 --- a/testing/fisika_test.py +++ b/testing/fisika_test.py @@ -129,3 +129,43 @@ def test_efek_doppler_nilai_negatif(self): self.assertIsInstance(hasil, error.Error) with self.assertRaises(error.Error): raise hasil + + +class test_gaya_coulombs(unittest.TestCase): + def test_gaya_coulombs(self): + hasil = fisika.gaya_coulombs((4 * pow(10, -2)), (2 * pow(10, -3)), (0.6)) + self.assertEqual(hasil, 1997222.2222222225) + + def tets_gaya_coulombs_invalid_tipe_data(self): + hasil = fisika.gaya_coulombs((4 * pow(10, -2)), "(2*pow(10, -3))", (0.6)) + self.assertIsInstance(hasil, error.ErrorTipeData) + with self.assertIsInstance(error.ErrorTipeData): + raise hasil + + def test_gaya_coulombs_di_bagi_nol(self): + hasil = fisika.gaya_coulombs((4 * pow(10, -2)), (2 * pow(10, -3)), 0) + self.assertIsInstance(hasil, error.ErrorDibagiNol) + with self.assertRaises(error.ErrorDibagiNol): + raise hasil + + +class test_Energi_potensial_Listrik(unittest.TestCase): + def test_energi_potensial_listrik(self): + hasil = fisika.Energi_Potensial_Listrik( + (4 * pow(10, -2)), (2 * pow(10, -3)), (0.6) + ) + self.assertEqual(hasil, 1198333.3333333335) + + def tets_energi_potensial_listrik_invalid_tipe_data(self): + hasil = fisika.Energi_Potensial_Listrik( + (4 * pow(10, -2)), "(2*pow(10, -3))", (0.6) + ) + self.assertIsInstance(hasil, error.ErrorTipeData) + with self.assertIsInstance(error.ErrorTipeData): + raise hasil + + def tets_energi_potensial_listrik_di_bagi_nol(self): + hasil = fisika.Energi_Potensial_Listrik((4 * pow(10, -2)), (2 * pow(10, -3)), 0) + self.assertIsInstance(hasil, error.ErrorDibagiNol) + with self.assertRaises(error.ErrorDibagiNol): + raise hasil