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..e4bf667 100644 --- a/OpenSeries/fisika.py +++ b/OpenSeries/fisika.py @@ -1,5 +1,6 @@ from OpenSeries.util import error as error from typing import Union +from OpenSeries.util import constant def kecepatan( @@ -60,7 +61,7 @@ def gerak_lurus_beraturan( kecepatan_awal: float, a: float, t: float ) -> Union[float, error.ErrorTipeData]: """ - fungsi untuk menghitung jarak yang ditempuh oleh benda yang bergerak lurus beraturan + fungsi untuk menghitung jarak tempuh oleh benda yang bergerak lurus beraturan Parameter: kecepatan_awal (float): kecepatan awal (m/s) @@ -143,7 +144,7 @@ def energi_potensial( (float, int): hasil dari kalkulasi energei potensial error.ErrorTipeData: error jika tipe data data salah """ - # melakukan pengecekan apakah semua parameter memiliki tipe data dari float atau int + # melakukan pengecekan apakah semua parameter if not all(isinstance(data, (float, int)) for data in [m, g, h]): return error.ErrorTipeData(["float", "int"]) else: @@ -268,3 +269,72 @@ def efek_doppler( "frekuensi tidak positif, kecepatan sumber relatif lebih besar dari kecepatan gelombang dalam medium" ) return doppler + + +def jumlah_partikel( + n: Union[int, float], +) -> Union[int, float, error.ErrorTipeData, error.Error]: + """ + Fungsi untuk melakukan kalkulasi + mencari jumlah partikel + berdasarkan persamaan N = n * N_a + + + parameter : + n (int, float) = jumlah mol (mol) + + return : + N (int, float) = Jumlah Partikel + """ + if not isinstance(n, (float, int)): + return error.ErrorTipeData(["int", "float"]) + if n < 0: + return error.Error("jumlah mol tidak positif") + N = n * constant.BILANGAN_AVOGADRO + return N + + +def jumlah_mol( + m: Union[int, float], m_r: Union[int, float] +) -> Union[int, float, error.ErrorTipeData, error.ErrorDibagiNol, error.Error]: + """ + fungsi untuk melakukan kalkulasi jumlah mol + berdasarkan persamaan n = m / Mr + + parameter : + m (int, float) = massa (g) + m_r (int, float) = massa relatif/ massa molar (g/mol) + + return : + n (int, float) = jumlah mol (mol) + """ + if not all(isinstance(data, (float, int)) for data in [m, m_r]): + return error.ErrorTipeData(["int", "float"]) + if m_r == 0: + return error.ErrorDibagiNol() + if m < 0 or m_r < 0: + return error.Error("Tidak boleh negatif") + else: + n = m / m_r + return n + + +def massa_atom( + m_r: Union[int, float], +) -> Union[int, float, error.ErrorTipeData, error.Error]: + """ + Fungsi untuk melakukan kalkulasi massa atom + m_0 = m_r / Na. + + parameter : + m_r (int, float) = massa molar(g/mol) + + return : + m_0 = massa atom (sma) + """ + if not (isinstance(m_r, (float, int))): + return error.ErrorTipeData(["int", "float"]) + if m_r < 0: + return error.Error("massa tidak boleh negatif") + m_0 = m_r / constant.BILANGAN_AVOGADRO + return m_0 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..2079c5f 100644 --- a/OpenSeries/util/constant.py +++ b/OpenSeries/util/constant.py @@ -8,14 +8,17 @@ # 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) + +# bilangan avogadro adalah bilangan yang menyatakan jumlah partikel dalam suatu +# zat dalam satuan partikel/mol +BILANGAN_AVOGADRO: float = 6.022 * pow(10, 23) + +# Konstanta gas adalah konstanta yang muncul dari persamaan gas ideal dengan satuan J/K mol +KONSTANTA_GAS_IDEAL: float = 8.314472 + # 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..69f7278 100644 --- a/testing/fisika_test.py +++ b/testing/fisika_test.py @@ -129,3 +129,66 @@ def test_efek_doppler_nilai_negatif(self): self.assertIsInstance(hasil, error.Error) with self.assertRaises(error.Error): raise hasil + + +class Testjumlah_partikel(unittest.TestCase): + def test_jumlah_partikel(self): + hasil = fisika.jumlah_partikel(15) + rounding_hasil = hasil + self.assertEqual(rounding_hasil, 9032999999999999536529408) + + def test_jumlah_partikel_invalid_tipe_data(self): + hasil = fisika.jumlah_partikel("15") + self.assertIsInstance(hasil, error.ErrorTipeData) + with self.assertRaises(error.ErrorTipeData): + raise hasil + + def test_jumlah_partikel_negatif(self): + hasil = fisika.jumlah_partikel(-15) + self.assertIsInstance(hasil, error.Error) + with self.assertRaises(error.Error): + raise hasil + + +class Testjumlah_mol(unittest.TestCase): + def test_jumlah_mol(self): + hasil = fisika.jumlah_mol(25, 5) + rounding_hasil = hasil + self.assertEqual(rounding_hasil, 5) + + def test_jumlah_mol_invalid_tipe_data(self): + hasil = fisika.jumlah_mol("25", 5) + self.assertIsInstance(hasil, error.ErrorTipeData) + with self.assertRaises(error.ErrorTipeData): + raise hasil + + def test_jumlah_mol_dibaginol(self): + hasil = fisika.jumlah_mol(25, 0) + self.assertIsInstance(hasil, error.ErrorDibagiNol) + with self.assertRaises(error.ErrorDibagiNol): + raise hasil + + def test_jumlah_mol_invalid_negatif(self): + hasil = fisika.jumlah_mol(-25, 5) + self.assertIsInstance(hasil, error.Error) + with self.assertRaises(error.Error): + raise hasil + + +class Testmassa_atom(unittest.TestCase): + def test_massa_atom(self): + hasil = fisika.massa_atom(17 * pow(10, 23)) + rounding_hasil = hasil + self.assertEqual(rounding_hasil, 2.8229823978744606) + + def test_jumlah_massa_atom_tipe_data(self): + hasil = fisika.massa_atom("17") + self.assertIsInstance(hasil, error.ErrorTipeData) + with self.assertRaises(error.ErrorTipeData): + raise hasil + + def test_jumlah_massa_invalid_negatif(self): + hasil = fisika.massa_atom(-17) + self.assertIsInstance(hasil, error.Error) + with self.assertRaises(error.Error): + raise hasil