pypipr 1.0.169__tar.gz → 1.0.171__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. {pypipr-1.0.169 → pypipr-1.0.171}/PKG-INFO +185 -180
  2. pypipr-1.0.171/pypipr/dirname.py +35 -0
  3. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/path_to_module.py +1 -1
  4. {pypipr-1.0.169 → pypipr-1.0.171}/pyproject.toml +1 -1
  5. {pypipr-1.0.169 → pypipr-1.0.171}/readme.md +184 -179
  6. pypipr-1.0.169/pypipr/dirname.py +0 -31
  7. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/ComparePerformance.py +0 -0
  8. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/LINUX.py +0 -0
  9. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/PintUreg.py +0 -0
  10. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/PintUregQuantity.py +0 -0
  11. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/RunParallel.py +0 -0
  12. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/TextCase.py +0 -0
  13. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/WINDOWS.py +0 -0
  14. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/__init__.py +0 -0
  15. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/__terminal__.py +0 -0
  16. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/auto_reload.py +0 -0
  17. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/avg.py +0 -0
  18. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/basename.py +0 -0
  19. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/batch_calculate.py +0 -0
  20. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/batchmaker.py +0 -0
  21. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/bin_to_int.py +0 -0
  22. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/calculate.py +0 -0
  23. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/choices.py +0 -0
  24. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/chr_to_int.py +0 -0
  25. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/chunk_array.py +0 -0
  26. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/console_run.py +0 -0
  27. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/create_folder.py +0 -0
  28. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/datetime_from_string.py +0 -0
  29. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/datetime_now.py +0 -0
  30. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/dict_first.py +0 -0
  31. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/django_clear_migrations.py +0 -0
  32. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/django_runserver.py +0 -0
  33. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/exit_if_empty.py +0 -0
  34. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/filter_empty.py +0 -0
  35. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/get_by_index.py +0 -0
  36. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/get_class_method.py +0 -0
  37. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/get_filemtime.py +0 -0
  38. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/get_filesize.py +0 -0
  39. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/github_init.py +0 -0
  40. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/github_pull.py +0 -0
  41. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/github_push.py +0 -0
  42. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/github_user.py +0 -0
  43. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/hex_to_int.py +0 -0
  44. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/iargv.py +0 -0
  45. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/idir.py +0 -0
  46. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/idumps.py +0 -0
  47. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/idumps_html.py +0 -0
  48. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/ienumerate.py +0 -0
  49. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/ienv.py +0 -0
  50. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/iexec.py +0 -0
  51. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/iinput.py +0 -0
  52. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/ijoin.py +0 -0
  53. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/iloads.py +0 -0
  54. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/iloads_html.py +0 -0
  55. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/input_char.py +0 -0
  56. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/int_to_bin.py +0 -0
  57. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/int_to_chr.py +0 -0
  58. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/int_to_hex.py +0 -0
  59. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/int_to_int.py +0 -0
  60. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/int_to_oct.py +0 -0
  61. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/iopen.py +0 -0
  62. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/iprint.py +0 -0
  63. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/irange.py +0 -0
  64. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/ireplace.py +0 -0
  65. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/is_empty.py +0 -0
  66. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/is_html.py +0 -0
  67. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/is_iterable.py +0 -0
  68. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/is_raw_string.py +0 -0
  69. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/is_valid_url.py +0 -0
  70. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/iscandir.py +0 -0
  71. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/isplit.py +0 -0
  72. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/ivars.py +0 -0
  73. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/log.py +0 -0
  74. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/no_indent.py +0 -0
  75. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/oct_to_int.py +0 -0
  76. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/password_generator.py +0 -0
  77. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/pip_freeze_without_version.py +0 -0
  78. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/pip_update_pypipr.py +0 -0
  79. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/poetry_publish.py +0 -0
  80. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/poetry_update_version.py +0 -0
  81. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/print_colorize.py +0 -0
  82. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/print_dir.py +0 -0
  83. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/print_log.py +0 -0
  84. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/print_to_last_line.py +0 -0
  85. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/random_bool.py +0 -0
  86. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/repath.py +0 -0
  87. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/restart.py +0 -0
  88. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/set_timeout.py +0 -0
  89. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/sets_ordered.py +0 -0
  90. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/sqlite_backup.py +0 -0
  91. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/sqlite_delete_table.py +0 -0
  92. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/sqlite_get_all_tables.py +0 -0
  93. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/sqlite_get_data_table.py +0 -0
  94. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/str_cmp.py +0 -0
  95. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/text_colorize.py +0 -0
  96. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/tiles.py +0 -0
  97. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/to_str.py +0 -0
  98. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/traceback_filename.py +0 -0
  99. {pypipr-1.0.169 → pypipr-1.0.171}/pypipr/traceback_framename.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pypipr
3
- Version: 1.0.169
3
+ Version: 1.0.171
4
4
  Summary: The Python Package Index Project
5
5
  Author: ufiapjj
6
6
  Author-email: ufiapjj@gmail.com
@@ -248,8 +248,8 @@ iprint(irange("z", "a", 4))
248
248
 
249
249
  Output:
250
250
  ```py
251
- <generator object int_range at 0x7dea406840>
252
- <generator object int_range at 0x7dea406940>
251
+ <generator object int_range at 0x78f8832840>
252
+ <generator object int_range at 0x78f8832940>
253
253
  [13, 12, 11, 10, 9, 8, 7, 6]
254
254
  [2, 5, 8]
255
255
  []
@@ -281,7 +281,7 @@ print(list(batchmaker(s)))
281
281
 
282
282
  Output:
283
283
  ```py
284
- <generator object batchmaker at 0x7dea4172e0>
284
+ <generator object batchmaker at 0x78f88472e0>
285
285
  ['Urutan 1 dan 10 dan j dan Z saja.', 'Urutan 1 dan 10 dan j dan K saja.', 'Urutan 1 dan 10 dan j dan saja.']
286
286
  ```
287
287
 
@@ -335,7 +335,7 @@ print(list(batch_calculate("{1 10} m ** {1 3}")))
335
335
 
336
336
  Output:
337
337
  ```py
338
- <generator object batch_calculate at 0x7dea42f300>
338
+ <generator object batch_calculate at 0x78f885b300>
339
339
  [('1 m ** 1', <Quantity(1, 'meter')>), ('1 m ** 2', <Quantity(1, 'meter ** 2')>), ('1 m ** 3', <Quantity(1, 'meter ** 3')>)]
340
340
  ```
341
341
 
@@ -441,7 +441,7 @@ print(list(chunk_array(arr, 5)))
441
441
 
442
442
  Output:
443
443
  ```py
444
- <generator object chunk_array at 0x7dea413100>
444
+ <generator object chunk_array at 0x78f883f100>
445
445
  [[2, 3, 12, 3, 3], [42, 42, 1, 43, 2], [42, 41, 4, 24, 32], [42, 3, 12, 32, 42], [42]]
446
446
  ```
447
447
 
@@ -492,9 +492,9 @@ print(datetime_now("Etc/GMT+7"))
492
492
 
493
493
  Output:
494
494
  ```py
495
- 2025-04-10 22:27:31.779538+07:00
496
- 2025-04-10 15:27:31.780368+00:00
497
- 2025-04-10 08:27:31.781876-07:00
495
+ 2025-04-11 06:31:56.528911+07:00
496
+ 2025-04-10 23:31:56.529820+00:00
497
+ 2025-04-10 16:31:56.534187-07:00
498
498
  ```
499
499
 
500
500
  ## dict_first
@@ -519,6 +519,35 @@ Output:
519
519
  ('key3', 'value3')
520
520
  ```
521
521
 
522
+ ## dirname
523
+
524
+ `dirname(path, indeks=-1, abs_path=None)`
525
+
526
+ Mengembalikan bagian direktori dari sebuah path berdasarkan indeks.
527
+ Tanpa trailing slash di akhir.
528
+
529
+ Args:
530
+ path (str): Path lengkap ke file atau direktori.
531
+ indeks (int): Indeks negatif untuk menentukan seberapa jauh naik ke atas direktori.
532
+ abs_path (bool | None):
533
+ - True untuk path absolut,
534
+ - False untuk path relatif terhadap cwd,
535
+ - None untuk path sesuai pemotongan manual.
536
+
537
+ Returns:
538
+ str: Path direktori hasil ekstraksi.
539
+
540
+ Contoh:
541
+ dirname("/a/b/c/d/e.txt", -2) -> "a/b/c"
542
+
543
+ ## django_clear_migrations
544
+
545
+ `django_clear_migrations(appname)`
546
+
547
+ ## django_runserver
548
+
549
+ `django_runserver()`
550
+
522
551
  ## is_iterable
523
552
 
524
553
  `is_iterable(var, str_is_iterable=False)`
@@ -584,34 +613,10 @@ iprint(filter_empty(var))
584
613
 
585
614
  Output:
586
615
  ```py
587
- <generator object filter_empty at 0x7dea4132e0>
616
+ <generator object filter_empty at 0x78f883f2e0>
588
617
  [1, '0', True, {}, ['eee']]
589
618
  ```
590
619
 
591
- ## dirname
592
-
593
- `dirname(path, indeks=-1, abs_path=None)`
594
-
595
- Mengembalikan nama folder dari path.
596
- Tanpa trailing slash di akhir.
597
-
598
- ```python
599
- print(dirname("/ini/nama/folder/ke/file.py"))
600
- ```
601
-
602
- Output:
603
- ```py
604
- ini/nama/folder/ke
605
- ```
606
-
607
- ## django_clear_migrations
608
-
609
- `django_clear_migrations(appname)`
610
-
611
- ## django_runserver
612
-
613
- `django_runserver()`
614
-
615
620
  ## get_by_index
616
621
 
617
622
  `get_by_index(obj, index, on_error=None)`
@@ -655,8 +660,8 @@ print(list(get_class_method(ExampleGetClassMethod)))
655
660
 
656
661
  Output:
657
662
  ```py
658
- <generator object get_class_method at 0x7dea42fe60>
659
- [<function ExampleGetClassMethod.a at 0x7dea482de0>, <function ExampleGetClassMethod.b at 0x7dea482c00>, <function ExampleGetClassMethod.c at 0x7dea482ca0>, <function ExampleGetClassMethod.d at 0x7dea482e80>]
663
+ <generator object get_class_method at 0x78f885bd80>
664
+ [<function ExampleGetClassMethod.a at 0x78f8532de0>, <function ExampleGetClassMethod.b at 0x78f8532ca0>, <function ExampleGetClassMethod.c at 0x78f8532d40>, <function ExampleGetClassMethod.d at 0x78f8532f20>]
660
665
  ```
661
666
 
662
667
  ## get_filesize
@@ -1084,7 +1089,7 @@ Output:
1084
1089
 
1085
1090
  ## ienumerate
1086
1091
 
1087
- `ienumerate(iterator, start=0, key=<function int_to_int at 0x7ded8ce5c0>)`
1092
+ `ienumerate(iterator, start=0, key=<function int_to_int at 0x78fcee2660>)`
1088
1093
 
1089
1094
  meningkatkan fungsi enumerate() pada python
1090
1095
  untuk key menggunakan huruf dan basis angka lainnya.
@@ -1097,7 +1102,7 @@ iprint(ienumerate(it, key=int_to_chr))
1097
1102
 
1098
1103
  Output:
1099
1104
  ```py
1100
- <generator object ienumerate at 0x7dea4132e0>
1105
+ <generator object ienumerate at 0x78f883f2e0>
1101
1106
  [('a', 'ini'), ('b', 'contoh'), ('c', 'enumerator')]
1102
1107
  ```
1103
1108
 
@@ -1174,7 +1179,7 @@ print(ijoin(10, ' '))
1174
1179
 
1175
1180
  Output:
1176
1181
  ```py
1177
- weq, qweqw, asd, dfs
1182
+ weq, dfs, qweqw, asd
1178
1183
  ,ini,path,seperti,url,
1179
1184
  ini,path,seperti,url
1180
1185
  <li>satu</li>
@@ -1219,10 +1224,10 @@ pprint.pprint(iloads_html(iopen("https://harga-emas.org/1-gram/")), depth=10)
1219
1224
  Output:
1220
1225
  ```py
1221
1226
  (['Home', 'Emas 1 Gram', 'History', 'Trend', 'Perak 1 Gram', 'Pluang'],
1222
- [['Harga Emas Hari Ini - Kamis, 10 April 2025'],
1223
- ['Spot Emas USD↑3.164,58 (+73,54) / oz',
1227
+ [['Harga Emas Hari Ini - Jumat, 11 April 2025'],
1228
+ ['Spot Emas USD↑3.186,08 (+22,94) / oz',
1224
1229
  'Kurs IDR1,00 / USD',
1225
- 'Emas IDR↑102 (+2) / gr'],
1230
+ 'Emas IDR↑102 (+1) / gr'],
1226
1231
  ['LM Antam (Jual)↓1.513.000 (-30.000) / gr',
1227
1232
  'LM Antam (Beli)↓1.366.000 (-30.000) / gr']],
1228
1233
  [['Harga Emas Hari Ini'],
@@ -1245,10 +1250,10 @@ Output:
1245
1250
  'Update harga LM Pegadaian :31 Desember 1969']],
1246
1251
  [['Spot Harga Emas Hari Ini (Market Open)'],
1247
1252
  ['Satuan', 'USD', 'Kurs\xa0Dollar', 'IDR'],
1248
- ['Ounce\xa0(oz)', '3.164,58 (+73,54)', '1,00', '3.165'],
1249
- ['Gram\xa0(gr)', '101,74', '1,00', '102 (+2)'],
1250
- ['Kilogram\xa0(kg)', '101.743,61', '1,00', '101.744'],
1251
- ['Update harga emas :10 April 2025, pukul 22:27Update kurs :14 Maret 2025, '
1253
+ ['Ounce\xa0(oz)', '3.186,08 (+22,94)', '1,00', '3.186'],
1254
+ ['Gram\xa0(gr)', '102,43', '1,00', '102 (+1)'],
1255
+ ['Kilogram\xa0(kg)', '102.434,85', '1,00', '102.435'],
1256
+ ['Update harga emas :11 April 2025, pukul 06:31Update kurs :14 Maret 2025, '
1252
1257
  'pukul 10:13']],
1253
1258
  [['Gram', 'UBS Gold 99.99%'],
1254
1259
  ['Jual', 'Beli'],
@@ -1286,36 +1291,36 @@ Output:
1286
1291
  ['Unit', 'USD', 'IDR'],
1287
1292
  ['Angka', '+/-', 'Angka', '+/-'],
1288
1293
  ['Hari Ini', 'Kurs', '', '', '1', '%'],
1289
- ['oz', '3.091,04', '+73,54+2,38%', '3.091', '+74+2,38%'],
1290
- ['gr', '99,38', '+2,36+2,38%', '99', '+2+2,38%'],
1291
- ['30 Hari', 'Kurs', '', '', '16.326', '-16.325-99,99%'],
1292
- ['oz', '2.916,73', '+247,85+8,50%', '47.618.534', '-47.615.369-99,99%'],
1293
- ['gr', '93,78', '+7,97+8,50%', '1.530.971', '-1.530.870-99,99%'],
1294
- ['2 Bulan', 'Kurs', '', '', '16.330', '-16.329-99,99%'],
1295
- ['oz', '2.861,26', '+303,32+10,60%', '46.724.376', '-46.721.211-99,99%'],
1296
- ['gr', '91,99', '+9,75+10,60', '1.502.224', '-1.502.122-99,99%'],
1294
+ ['oz', '3.163,14', '+22,94+0,73%', '3.163', '+23+0,73%'],
1295
+ ['gr', '101,70', '+0,74+0,73%', '102', '+1+0,73%'],
1296
+ ['30 Hari', 'Kurs', '', '', '16.430', '-16.429-99,99%'],
1297
+ ['oz', '2.935,17', '+250,91+8,55%', '48.224.843', '-48.221.657-99,99%'],
1298
+ ['gr', '94,37', '+8,07+8,55%', '1.550.465', '-1.550.362-99,99%'],
1299
+ ['2 Bulan', 'Kurs', '', '', '16.325', '-16.324-99,99%'],
1300
+ ['oz', '2.900,79', '+285,29+9,83%', '47.355.426', '-47.352.240-99,99%'],
1301
+ ['gr', '93,26', '+9,17+9,83', '1.522.512', '-1.522.410-99,99%'],
1297
1302
  ['6 Bulan', 'Kurs', '', '', '15.658', '-15.657-99,99%'],
1298
- ['oz', '2.656,78', '+507,80+19,11%', '41.599.861', '-41.596.697-99,99%'],
1299
- ['gr', '85,42', '+16,33+19,11%', '1.337.467', '-1.337.365-99,99%'],
1303
+ ['oz', '2.656,78', '+529,30+19,92%', '41.599.861', '-41.596.675-99,99%'],
1304
+ ['gr', '85,42', '+17,02+19,92%', '1.337.467', '-1.337.364-99,99%'],
1300
1305
  ['1 Tahun', 'Kurs', '', '', '15.907', '-15.906-99,99%'],
1301
- ['oz', '2.338,57', '+826,01+35,32%', '37.199.633', '-37.196.468-99,99%'],
1302
- ['gr', '75,19', '+26,56+35,32%', '1.195.996', '-1.195.894-99,99%'],
1306
+ ['oz', '2.349,73', '+836,35+35,59%', '37.377.155', '-37.373.969-99,99%'],
1307
+ ['gr', '75,55', '+26,89+35,59%', '1.201.703', '-1.201.601-99,99%'],
1303
1308
  ['2 Tahun', 'Kurs', '', '', '15.731', '-15.730-99,99%'],
1304
- ['oz', '1.823,86', '+1.340,72+73,51%', '28.691.142', '-28.687.977-99,99%'],
1305
- ['gr', '58,64', '+43,11+73,51%', '922.442', '-922.340-99,99%'],
1306
- ['3 Tahun', 'Kurs', '', '', '14.365', '-14.364-99,99%'],
1307
- ['oz', '1.942,64', '+1.221,94+62,90%', '27.906.043', '-27.902.878-99,99%'],
1308
- ['gr', '62,46', '+39,29+62,90%', '897.200', '-897.098-99,99%'],
1309
+ ['oz', '1.823,86', '+1.362,22+74,69%', '28.691.142', '-28.687.956-99,99%'],
1310
+ ['gr', '58,64', '+43,80+74,69%', '922.442', '-922.339-99,99%'],
1311
+ ['3 Tahun', 'Kurs', '', '', '14.370', '-14.369-99,99%'],
1312
+ ['oz', '1.973,79', '+1.212,29+61,42%', '28.363.362', '-28.360.176-99,99%'],
1313
+ ['gr', '63,46', '+38,98+61,42%', '911.903', '-911.801-99,99%'],
1309
1314
  ['5 Tahun', 'Kurs', '', '', '16.241', '-16.240-99,99%'],
1310
- ['oz', '1.688,78', '+1.475,80+87,39%', '27.427.493', '-27.424.328-99,99%'],
1311
- ['gr', '54,30', '+47,45+87,39%', '881.814', '-881.713-99,99%']])
1315
+ ['oz', '1.688,78', '+1.497,30+88,66%', '27.427.493', '-27.424.307-99,99%'],
1316
+ ['gr', '54,30', '+48,14+88,66%', '881.814', '-881.712-99,99%']])
1312
1317
  (['Home', 'Emas 1 Gram', 'History', 'Trend', 'Perak 1 Gram', 'Pluang'],
1313
1318
  [[''],
1314
1319
  ['Emas 24 KaratHarga Emas 1 Gram', ''],
1315
- ['USD', '101,74↑', '+2,36+2,37%'],
1320
+ ['USD', '102,43↑', '+0,73+0,72%'],
1316
1321
  ['KURS', '16.355,25↓', '%'],
1317
- ['IDR', '1.664.042,17↑', '+38.669,79+2,38%'],
1318
- ['Kamis, 10 April 2025 22:27']],
1322
+ ['IDR', '1.675.347,59↑', '+12.062,62+0,73%'],
1323
+ ['Jumat, 11 April 2025 06:31']],
1319
1324
  [[''],
1320
1325
  ['Emas 1 Gram (IDR)Emas 1 Gram (USD)Kurs USD-IDR',
1321
1326
  'Hari Ini',
@@ -1326,25 +1331,25 @@ Output:
1326
1331
  '']],
1327
1332
  [['Pergerakkan Harga Emas 1 Gram'],
1328
1333
  ['', 'Penutupan Kemarin', 'Pergerakkan Hari Ini', 'Rata-rata'],
1329
- ['USD', '99,38', '99,38 - 101,74', '100,56'],
1334
+ ['USD', '101,70', '101,70 - 102,43', '102,07'],
1330
1335
  ['KURS', '16.355,25', '16.355,25 - 16.355,25', '16.355,25'],
1331
- ['IDR', '1.625.372,38', '1.625.372,38 - 1.664.042,17', '1.644.707,28'],
1336
+ ['IDR', '1.663.284,97', '1.663.284,97 - 1.675.347,59', '1.669.316,28'],
1332
1337
  [''],
1333
1338
  ['', 'Awal Tahun', 'Pergerakkan YTD', '+/- YTD'],
1334
- ['USD', '84,42', '84,38 - 101,74', '+17,32 (20,52%)'],
1339
+ ['USD', '84,42', '84,38 - 102,43', '+18,01 (21,33%)'],
1335
1340
  ['KURS', '16.220,76', '16.156,70 - 16.387,00', '+134,49 (0,83%)'],
1336
1341
  ['IDR',
1337
1342
  '1.369.306,75',
1338
- '1.368.695,74 - 1.664.042,17',
1339
- '+294.735,42 (21,52%)'],
1343
+ '1.368.695,74 - 1.675.347,59',
1344
+ '+306.040,84 (22,35%)'],
1340
1345
  [''],
1341
1346
  ['', 'Tahun Lalu / 52 Minggu', 'Pergerakkan 52 Minggu', '+/- 52 Minggu'],
1342
- ['USD', '75,37', '73,75 - 101,74', '+26,37 (34,99%)'],
1343
- ['KURS', '15.877,00', '15.100,00 - 16.509,65', '+478,25 (3,01%)'],
1347
+ ['USD', '75,19', '73,75 - 102,43', '+27,24 (36,23%)'],
1348
+ ['KURS', '15.969,60', '15.100,00 - 16.509,65', '+385,65 (2,41%)'],
1344
1349
  ['IDR',
1345
- '1.196.609,14',
1346
- '1.181.943,88 - 1.664.042,17',
1347
- '+467.433,03 (39,06%)']])
1350
+ '1.200.702,67',
1351
+ '1.181.943,88 - 1.675.347,59',
1352
+ '+474.644,92 (39,53%)']])
1348
1353
  ```
1349
1354
 
1350
1355
  ## iloads
@@ -1474,7 +1479,7 @@ Output:
1474
1479
  ```py
1475
1480
  8
1476
1481
  ['mana', 'aja']
1477
- [<Element a at 0x7dea1113b0>, <Element a at 0x7dea168050>, <Element a at 0x7dea1680a0>, <Element a at 0x7dea1680f0>, <Element a at 0x7dea168140>, <Element a at 0x7dea168190>, <Element a at 0x7dea1681e0>, <Element a at 0x7dea168230>, <Element a at 0x7dea168280>, <Element a at 0x7dea1682d0>, <Element a at 0x7dea168320>, <Element a at 0x7dea168370>, <Element a at 0x7dea1683c0>, <Element a at 0x7dea168410>, <Element a at 0x7dea168460>, <Element a at 0x7dea1684b0>, <Element a at 0x7dea168500>, <Element a at 0x7dea168550>]
1482
+ [<Element a at 0x78f853d220>, <Element a at 0x78f8577e80>, <Element a at 0x78f8577ed0>, <Element a at 0x78f8577f20>, <Element a at 0x78f8577f70>, <Element a at 0x78f8577fc0>, <Element a at 0x78f8594050>, <Element a at 0x78f85940a0>, <Element a at 0x78f85940f0>, <Element a at 0x78f8594140>, <Element a at 0x78f8594190>, <Element a at 0x78f85941e0>, <Element a at 0x78f8594230>, <Element a at 0x78f8594280>, <Element a at 0x78f85942d0>, <Element a at 0x78f8594320>, <Element a at 0x78f8594370>, <Element a at 0x78f85943c0>]
1478
1483
  False
1479
1484
  ```
1480
1485
 
@@ -1544,7 +1549,7 @@ print(list(iscandir("./", recursive=False, scan_file=False)))
1544
1549
 
1545
1550
  Output:
1546
1551
  ```py
1547
- <generator object iscandir at 0x7dea4131f0>
1552
+ <generator object iscandir at 0x78f883f1f0>
1548
1553
  [PosixPath('.git'), PosixPath('.vscode'), PosixPath('pypipr'), PosixPath('__pycache__'), PosixPath('dist')]
1549
1554
  ```
1550
1555
 
@@ -1577,98 +1582,98 @@ iprint(ivars(__import__('pypipr')))
1577
1582
 
1578
1583
  Output:
1579
1584
  ```py
1580
- {'function': {'avg': <function avg at 0x7df2df0680>,
1581
- 'get_filemtime': <function get_filemtime at 0x7ded81d3a0>,
1582
- 'print_colorize': <function print_colorize at 0x7ded81d580>,
1583
- 'print_log': <function print_log at 0x7dedf774c0>,
1584
- 'console_run': <function console_run at 0x7ded81d440>,
1585
- 'auto_reload': <function auto_reload at 0x7ded81cd60>,
1586
- 'basename': <function basename at 0x7ded81d620>,
1587
- 'chr_to_int': <function chr_to_int at 0x7ded81dbc0>,
1588
- 'int_to_chr': <function int_to_chr at 0x7ded81dc60>,
1589
- 'irange': <function irange at 0x7ded81e160>,
1590
- 'batchmaker': <function batchmaker at 0x7ded81d940>,
1591
- 'calculate': <function calculate at 0x7ded81d4e0>,
1592
- 'batch_calculate': <function batch_calculate at 0x7ded81d6c0>,
1593
- 'bin_to_int': <function bin_to_int at 0x7ded81d8a0>,
1594
- 'is_empty': <function is_empty at 0x7ded81ea20>,
1595
- 'exit_if_empty': <function exit_if_empty at 0x7ded81e8e0>,
1596
- 'input_char': <function input_char at 0x7ded81e980>,
1597
- 'choices': <function choices at 0x7ded81eca0>,
1598
- 'chunk_array': <function chunk_array at 0x7ded81ed40>,
1599
- 'create_folder': <function create_folder at 0x7ded81ede0>,
1600
- 'datetime_from_string': <function datetime_from_string at 0x7ded81ee80>,
1601
- 'datetime_now': <function datetime_now at 0x7ded81ef20>,
1602
- 'dict_first': <function dict_first at 0x7ded83d1c0>,
1603
- 'is_iterable': <function is_iterable at 0x7ded83d4e0>,
1604
- 'to_str': <function to_str at 0x7ded83d620>,
1605
- 'filter_empty': <function filter_empty at 0x7ded83d3a0>,
1606
- 'dirname': <function dirname at 0x7ded83d260>,
1607
- 'django_clear_migrations': <function django_clear_migrations at 0x7ded83d300>,
1608
- 'django_runserver': <function django_runserver at 0x7ded83d8a0>,
1609
- 'get_by_index': <function get_by_index at 0x7ded83db20>,
1610
- 'get_class_method': <function get_class_method at 0x7ded83dbc0>,
1611
- 'get_filesize': <function get_filesize at 0x7ded83dd00>,
1612
- 'github_init': <function github_init at 0x7ded83dda0>,
1613
- 'github_pull': <function github_pull at 0x7ded83de40>,
1614
- 'github_push': <function github_push at 0x7ded83df80>,
1615
- 'github_user': <function github_user at 0x7ded83e020>,
1616
- 'hex_to_int': <function hex_to_int at 0x7ded83e0c0>,
1617
- 'iargv': <function iargv at 0x7ded83e160>,
1618
- 'idir': <function idir at 0x7ded83e200>,
1619
- 'idumps_html': <function idumps_html at 0x7ded8ce0c0>,
1620
- 'idumps': <function idumps at 0x7ded83e2a0>,
1621
- 'int_to_int': <function int_to_int at 0x7ded8ce5c0>,
1622
- 'ienumerate': <function ienumerate at 0x7ded8b4900>,
1623
- 'ienv': <function ienv at 0x7ded8ce480>,
1624
- 'iexec': <function iexec at 0x7ded8ce660>,
1625
- 'iinput': <function iinput at 0x7ded8ce700>,
1626
- 'ijoin': <function ijoin at 0x7ded8ce7a0>,
1627
- 'iloads_html': <function iloads_html at 0x7ded8ceac0>,
1628
- 'iloads': <function iloads at 0x7df38a5260>,
1629
- 'int_to_bin': <function int_to_bin at 0x7ded8ce840>,
1630
- 'int_to_hex': <function int_to_hex at 0x7ded8ce8e0>,
1631
- 'int_to_oct': <function int_to_oct at 0x7ded8ceb60>,
1632
- 'is_valid_url': <function is_valid_url at 0x7ded8cede0>,
1633
- 'iopen': <function iopen at 0x7ded69a980>,
1634
- 'iprint': <function iprint at 0x7ded6f1940>,
1635
- 'is_raw_string': <function is_raw_string at 0x7dea5d4220>,
1636
- 'ireplace': <function ireplace at 0x7ded75a700>,
1637
- 'is_html': <function is_html at 0x7dea5d4180>,
1638
- 'iscandir': <function iscandir at 0x7dea5d42c0>,
1639
- 'isplit': <function isplit at 0x7dea5d4360>,
1640
- 'ivars': <function ivars at 0x7dea5d4400>,
1641
- 'log': <function log at 0x7dea5d44a0>,
1642
- 'no_indent': <function no_indent at 0x7dea5d4540>,
1643
- 'oct_to_int': <function oct_to_int at 0x7dea5d45e0>,
1644
- 'password_generator': <function password_generator at 0x7dea5d4680>,
1645
- 'path_to_module': <function path_to_module at 0x7dea5d4720>,
1646
- 'pip_freeze_without_version': <function pip_freeze_without_version at 0x7dea5d47c0>,
1647
- 'pip_update_pypipr': <function pip_update_pypipr at 0x7dea5d4860>,
1648
- 'poetry_publish': <function poetry_publish at 0x7dea5d4900>,
1649
- 'poetry_update_version': <function poetry_update_version at 0x7dea5d4a40>,
1650
- 'print_dir': <function print_dir at 0x7dea5d4b80>,
1651
- 'print_to_last_line': <function print_to_last_line at 0x7dea5d4c20>,
1652
- 'random_bool': <function random_bool at 0x7dea5d4cc0>,
1653
- 'repath': <function repath at 0x7dea5d4e00>,
1654
- 'restart': <function restart at 0x7dea5d4ea0>,
1655
- 'set_timeout': <function set_timeout at 0x7dea5d4f40>,
1656
- 'sets_ordered': <function sets_ordered at 0x7dea5d4fe0>,
1657
- 'sqlite_backup': <function sqlite_backup at 0x7dea5d5080>,
1658
- 'sqlite_delete_table': <function sqlite_delete_table at 0x7dea5d5120>,
1659
- 'sqlite_get_all_tables': <function sqlite_get_all_tables at 0x7dea5d51c0>,
1660
- 'sqlite_get_data_table': <function sqlite_get_data_table at 0x7dea5d5260>,
1661
- 'str_cmp': <function str_cmp at 0x7dea5d5b20>,
1662
- 'text_colorize': <function text_colorize at 0x7dea5d5bc0>,
1663
- 'tiles': <function tiles at 0x7dea5d5c60>,
1664
- 'traceback_filename': <function traceback_filename at 0x7dea5d5d00>,
1665
- 'traceback_framename': <function traceback_framename at 0x7dea5d5da0>},
1585
+ {'function': {'avg': <function avg at 0x79025e8680>,
1586
+ 'get_filemtime': <function get_filemtime at 0x78fce353a0>,
1587
+ 'print_colorize': <function print_colorize at 0x78fce35580>,
1588
+ 'print_log': <function print_log at 0x78fd5534c0>,
1589
+ 'console_run': <function console_run at 0x78fce35440>,
1590
+ 'auto_reload': <function auto_reload at 0x78fce34d60>,
1591
+ 'basename': <function basename at 0x78fce35620>,
1592
+ 'chr_to_int': <function chr_to_int at 0x78fce35bc0>,
1593
+ 'int_to_chr': <function int_to_chr at 0x78fce35c60>,
1594
+ 'irange': <function irange at 0x78fce36160>,
1595
+ 'batchmaker': <function batchmaker at 0x78fce35940>,
1596
+ 'calculate': <function calculate at 0x78fce354e0>,
1597
+ 'batch_calculate': <function batch_calculate at 0x78fce356c0>,
1598
+ 'bin_to_int': <function bin_to_int at 0x78fce358a0>,
1599
+ 'is_empty': <function is_empty at 0x78fce36a20>,
1600
+ 'exit_if_empty': <function exit_if_empty at 0x78fce368e0>,
1601
+ 'input_char': <function input_char at 0x78fce36980>,
1602
+ 'choices': <function choices at 0x78fce36ca0>,
1603
+ 'chunk_array': <function chunk_array at 0x78fce36d40>,
1604
+ 'create_folder': <function create_folder at 0x78fce36de0>,
1605
+ 'datetime_from_string': <function datetime_from_string at 0x78fce36e80>,
1606
+ 'datetime_now': <function datetime_now at 0x78fce36f20>,
1607
+ 'dict_first': <function dict_first at 0x78fce551c0>,
1608
+ 'dirname': <function dirname at 0x78fce55300>,
1609
+ 'django_clear_migrations': <function django_clear_migrations at 0x78fce553a0>,
1610
+ 'django_runserver': <function django_runserver at 0x78fce556c0>,
1611
+ 'is_iterable': <function is_iterable at 0x78fce55a80>,
1612
+ 'to_str': <function to_str at 0x78fce55bc0>,
1613
+ 'filter_empty': <function filter_empty at 0x78fce55940>,
1614
+ 'get_by_index': <function get_by_index at 0x78fce55b20>,
1615
+ 'get_class_method': <function get_class_method at 0x78fce55c60>,
1616
+ 'get_filesize': <function get_filesize at 0x78fce55da0>,
1617
+ 'github_init': <function github_init at 0x78fce55e40>,
1618
+ 'github_pull': <function github_pull at 0x78fce55ee0>,
1619
+ 'github_push': <function github_push at 0x78fce56020>,
1620
+ 'github_user': <function github_user at 0x78fce560c0>,
1621
+ 'hex_to_int': <function hex_to_int at 0x78fce56160>,
1622
+ 'iargv': <function iargv at 0x78fce56200>,
1623
+ 'idir': <function idir at 0x78fce562a0>,
1624
+ 'idumps_html': <function idumps_html at 0x78fcee2160>,
1625
+ 'idumps': <function idumps at 0x78fce56340>,
1626
+ 'int_to_int': <function int_to_int at 0x78fcee2660>,
1627
+ 'ienumerate': <function ienumerate at 0x78fcec49a0>,
1628
+ 'ienv': <function ienv at 0x78fcee2520>,
1629
+ 'iexec': <function iexec at 0x78fcee2700>,
1630
+ 'iinput': <function iinput at 0x78fcee27a0>,
1631
+ 'ijoin': <function ijoin at 0x78fcee2840>,
1632
+ 'iloads_html': <function iloads_html at 0x78fcee2b60>,
1633
+ 'iloads': <function iloads at 0x7903061260>,
1634
+ 'int_to_bin': <function int_to_bin at 0x78fcee28e0>,
1635
+ 'int_to_hex': <function int_to_hex at 0x78fcee2980>,
1636
+ 'int_to_oct': <function int_to_oct at 0x78fcee2c00>,
1637
+ 'is_valid_url': <function is_valid_url at 0x78fcee2e80>,
1638
+ 'iopen': <function iopen at 0x78fcc96a20>,
1639
+ 'iprint': <function iprint at 0x78fcce99e0>,
1640
+ 'is_raw_string': <function is_raw_string at 0x78f8a0c2c0>,
1641
+ 'ireplace': <function ireplace at 0x78f89f67a0>,
1642
+ 'is_html': <function is_html at 0x78f8a0c220>,
1643
+ 'iscandir': <function iscandir at 0x78f8a0c360>,
1644
+ 'isplit': <function isplit at 0x78f8a0c400>,
1645
+ 'ivars': <function ivars at 0x78f8a0c4a0>,
1646
+ 'log': <function log at 0x78f8a0c540>,
1647
+ 'no_indent': <function no_indent at 0x78f8a0c5e0>,
1648
+ 'oct_to_int': <function oct_to_int at 0x78f8a0c680>,
1649
+ 'password_generator': <function password_generator at 0x78f8a0c720>,
1650
+ 'path_to_module': <function path_to_module at 0x78f8a0c7c0>,
1651
+ 'pip_freeze_without_version': <function pip_freeze_without_version at 0x78f8a0c860>,
1652
+ 'pip_update_pypipr': <function pip_update_pypipr at 0x78f8a0c900>,
1653
+ 'poetry_publish': <function poetry_publish at 0x78f8a0c9a0>,
1654
+ 'poetry_update_version': <function poetry_update_version at 0x78f8a0cae0>,
1655
+ 'print_dir': <function print_dir at 0x78f8a0cc20>,
1656
+ 'print_to_last_line': <function print_to_last_line at 0x78f8a0ccc0>,
1657
+ 'random_bool': <function random_bool at 0x78f8a0cd60>,
1658
+ 'repath': <function repath at 0x78f8a0cea0>,
1659
+ 'restart': <function restart at 0x78f8a0cf40>,
1660
+ 'set_timeout': <function set_timeout at 0x78f8a0cfe0>,
1661
+ 'sets_ordered': <function sets_ordered at 0x78f8a0d080>,
1662
+ 'sqlite_backup': <function sqlite_backup at 0x78f8a0d120>,
1663
+ 'sqlite_delete_table': <function sqlite_delete_table at 0x78f8a0d1c0>,
1664
+ 'sqlite_get_all_tables': <function sqlite_get_all_tables at 0x78f8a0d260>,
1665
+ 'sqlite_get_data_table': <function sqlite_get_data_table at 0x78f8a0d300>,
1666
+ 'str_cmp': <function str_cmp at 0x78f8a0dbc0>,
1667
+ 'text_colorize': <function text_colorize at 0x78f8a0dc60>,
1668
+ 'tiles': <function tiles at 0x78f8a0dd00>,
1669
+ 'traceback_filename': <function traceback_filename at 0x78f8a0dda0>,
1670
+ 'traceback_framename': <function traceback_framename at 0x78f8a0de40>},
1666
1671
  'class': {'ComparePerformance': <class 'pypipr.ComparePerformance.ComparePerformance'>,
1667
1672
  'PintUregQuantity': <class 'pint.Quantity'>,
1668
1673
  'RunParallel': <class 'pypipr.RunParallel.RunParallel'>,
1669
1674
  'TextCase': <class 'pypipr.TextCase.TextCase'>},
1670
1675
  'variable': {'LINUX': True,
1671
- 'PintUreg': <pint.registry.UnitRegistry object at 0x7df38f7830>,
1676
+ 'PintUreg': <pint.registry.UnitRegistry object at 0x78fd53bc50>,
1672
1677
  'WINDOWS': False},
1673
1678
  'module': {'asyncio': <module 'asyncio' from '/data/data/com.termux/files/usr/lib/python3.12/asyncio/__init__.py'>,
1674
1679
  'colorama': <module 'colorama' from '/data/data/com.termux/files/home/.cache/pypoetry/virtualenvs/pypipr-ZoJyDxLL-py3.12/lib/python3.12/site-packages/colorama/__init__.py'>,
@@ -1763,7 +1768,7 @@ print(password_generator())
1763
1768
 
1764
1769
  Output:
1765
1770
  ```py
1766
- ^}IuwReP
1771
+ I}=EB%ID
1767
1772
  ```
1768
1773
 
1769
1774
  ## path_to_module
@@ -1842,7 +1847,7 @@ Output:
1842
1847
  __enter__ : https:/www.google.com
1843
1848
  __fspath__ : https:/www.google.com
1844
1849
  __getstate__ : (None, {'_raw_paths': ['https://www.google.com/'], '_drv': '', '_root': '', '_tail_cached': ['https:', 'www.google.com'], '_str': 'https:/www.google.com'})
1845
- __hash__ : 4044854816993747545
1850
+ __hash__ : 7360677572712003235
1846
1851
  __init__ : None
1847
1852
  __init_subclass__ : None
1848
1853
  __module__ : pathlib
@@ -1854,7 +1859,7 @@ Output:
1854
1859
  __subclasshook__ : NotImplemented
1855
1860
  _drv :
1856
1861
  _flavour : <module 'posixpath' (frozen)>
1857
- _hash : 4044854816993747545
1862
+ _hash : 7360677572712003235
1858
1863
  _lines : https:
1859
1864
  www.google.com
1860
1865
  _lines_cached : https:
@@ -1888,7 +1893,7 @@ _parts_normcase_cached : ['https:', 'www.google.com']
1888
1893
  is_reserved : False
1889
1894
  is_socket : False
1890
1895
  is_symlink : False
1891
- iterdir : <generator object Path.iterdir at 0x7dea41be00>
1896
+ iterdir : <generator object Path.iterdir at 0x78f884be00>
1892
1897
  joinpath : .
1893
1898
  name :
1894
1899
  parent : https:/www.google.com
@@ -1899,7 +1904,7 @@ _parts_normcase_cached : ['https:', 'www.google.com']
1899
1904
  stem :
1900
1905
  suffix :
1901
1906
  suffixes : []
1902
- walk : <generator object Path.walk at 0x7dea69fd80>
1907
+ walk : <generator object Path.walk at 0x78f8ad3d80>
1903
1908
  with_segments : .
1904
1909
  ```
1905
1910
 
@@ -1979,7 +1984,7 @@ x.cancel()
1979
1984
 
1980
1985
  Output:
1981
1986
  ```py
1982
- <Timer(Thread-2, started 540775611632)>
1987
+ <Timer(Thread-2, started 519539928304)>
1983
1988
  menghentikan timeout 7
1984
1989
  ```
1985
1990
 
@@ -1997,7 +2002,7 @@ print(list(sets_ordered(array)))
1997
2002
 
1998
2003
  Output:
1999
2004
  ```py
2000
- <generator object sets_ordered at 0x7dea12ac20>
2005
+ <generator object sets_ordered at 0x78f8556c20>
2001
2006
  [2, 3, 12, 42, 1, 43, 41, 4, 24, 32]
2002
2007
  ```
2003
2008
 
@@ -2119,15 +2124,15 @@ print(ExampleComparePerformance().compare_performance())
2119
2124
 
2120
2125
  Output:
2121
2126
  ```py
2122
- {'a': <generator object ExampleComparePerformance.a.<locals>.<genexpr> at 0x7dea458b80>,
2127
+ {'a': <generator object ExampleComparePerformance.a.<locals>.<genexpr> at 0x78f8894ac0>,
2123
2128
  'b': (0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
2124
2129
  'c': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
2125
2130
  'd': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
2126
- {'a': 168, 'b': 183, 'c': 99, 'd': 165}
2127
- {'a': 128, 'b': 169, 'c': 99, 'd': 172}
2128
- {'a': 121, 'b': 170, 'c': 100, 'd': 177}
2129
- {'a': 133, 'b': 164, 'c': 100, 'd': 160}
2130
- {'a': 126, 'b': 167, 'c': 100, 'd': 174}
2131
+ {'a': 99, 'b': 182, 'c': 104, 'd': 321}
2132
+ {'a': 100, 'b': 169, 'c': 109, 'd': 219}
2133
+ {'a': 104, 'b': 170, 'c': 100, 'd': 212}
2134
+ {'a': 100, 'b': 165, 'c': 103, 'd': 209}
2135
+ {'a': 101, 'b': 167, 'c': 100, 'd': 206}
2131
2136
  ```
2132
2137
 
2133
2138
  ## PintUregQuantity
@@ -0,0 +1,35 @@
1
+ from pathlib import Path
2
+
3
+
4
+ def dirname(path, indeks=-1, abs_path=None):
5
+ """
6
+ Mengembalikan bagian direktori dari sebuah path berdasarkan indeks.
7
+ Tanpa trailing slash di akhir.
8
+
9
+ Args:
10
+ path (str): Path lengkap ke file atau direktori.
11
+ indeks (int): Indeks negatif untuk menentukan seberapa jauh naik ke atas direktori.
12
+ abs_path (bool | None):
13
+ - True untuk path absolut,
14
+ - False untuk path relatif terhadap cwd,
15
+ - None untuk path sesuai pemotongan manual.
16
+
17
+ Returns:
18
+ str: Path direktori hasil ekstraksi.
19
+
20
+ Contoh:
21
+ dirname("/a/b/c/d/e.txt", -2) -> "a/b/c"
22
+ """
23
+
24
+ path_obj = Path(path)
25
+ parts = path_obj.parts
26
+ new_parts = parts[:indeks]
27
+
28
+ new_path = Path(*new_parts)
29
+ if abs_path is None:
30
+ return str(new_path)
31
+
32
+ resolved_path = new_path.resolve()
33
+ if abs_path:
34
+ return str(resolved_path)
35
+ return str(resolved_path.relative_to(Path.cwd()))
@@ -18,7 +18,7 @@ def path_to_module(path, indeks=0):
18
18
  Returns:
19
19
  str: Path bergaya modul Python (dipisah dengan ".")
20
20
  """
21
- path = dirname(path, abs_path=False)
21
+ path = dirname(path, abs_path=False, indeks=indeks)
22
22
  return path.replace(os.sep, ".")
23
23
 
24
24
  cwd = os.getcwd()