pypipr 1.0.167__tar.gz → 1.0.169__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.167 → pypipr-1.0.169}/PKG-INFO +176 -176
  2. pypipr-1.0.169/pypipr/dirname.py +31 -0
  3. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/path_to_module.py +6 -1
  4. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/repath.py +3 -1
  5. {pypipr-1.0.167 → pypipr-1.0.169}/pyproject.toml +1 -1
  6. {pypipr-1.0.167 → pypipr-1.0.169}/readme.md +175 -175
  7. pypipr-1.0.167/pypipr/dirname.py +0 -17
  8. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/ComparePerformance.py +0 -0
  9. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/LINUX.py +0 -0
  10. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/PintUreg.py +0 -0
  11. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/PintUregQuantity.py +0 -0
  12. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/RunParallel.py +0 -0
  13. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/TextCase.py +0 -0
  14. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/WINDOWS.py +0 -0
  15. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/__init__.py +0 -0
  16. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/__terminal__.py +0 -0
  17. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/auto_reload.py +0 -0
  18. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/avg.py +0 -0
  19. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/basename.py +0 -0
  20. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/batch_calculate.py +0 -0
  21. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/batchmaker.py +0 -0
  22. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/bin_to_int.py +0 -0
  23. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/calculate.py +0 -0
  24. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/choices.py +0 -0
  25. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/chr_to_int.py +0 -0
  26. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/chunk_array.py +0 -0
  27. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/console_run.py +0 -0
  28. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/create_folder.py +0 -0
  29. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/datetime_from_string.py +0 -0
  30. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/datetime_now.py +0 -0
  31. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/dict_first.py +0 -0
  32. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/django_clear_migrations.py +0 -0
  33. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/django_runserver.py +0 -0
  34. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/exit_if_empty.py +0 -0
  35. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/filter_empty.py +0 -0
  36. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/get_by_index.py +0 -0
  37. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/get_class_method.py +0 -0
  38. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/get_filemtime.py +0 -0
  39. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/get_filesize.py +0 -0
  40. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/github_init.py +0 -0
  41. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/github_pull.py +0 -0
  42. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/github_push.py +0 -0
  43. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/github_user.py +0 -0
  44. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/hex_to_int.py +0 -0
  45. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/iargv.py +0 -0
  46. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/idir.py +0 -0
  47. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/idumps.py +0 -0
  48. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/idumps_html.py +0 -0
  49. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/ienumerate.py +0 -0
  50. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/ienv.py +0 -0
  51. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/iexec.py +0 -0
  52. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/iinput.py +0 -0
  53. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/ijoin.py +0 -0
  54. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/iloads.py +0 -0
  55. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/iloads_html.py +0 -0
  56. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/input_char.py +0 -0
  57. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/int_to_bin.py +0 -0
  58. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/int_to_chr.py +0 -0
  59. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/int_to_hex.py +0 -0
  60. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/int_to_int.py +0 -0
  61. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/int_to_oct.py +0 -0
  62. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/iopen.py +0 -0
  63. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/iprint.py +0 -0
  64. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/irange.py +0 -0
  65. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/ireplace.py +0 -0
  66. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/is_empty.py +0 -0
  67. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/is_html.py +0 -0
  68. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/is_iterable.py +0 -0
  69. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/is_raw_string.py +0 -0
  70. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/is_valid_url.py +0 -0
  71. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/iscandir.py +0 -0
  72. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/isplit.py +0 -0
  73. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/ivars.py +0 -0
  74. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/log.py +0 -0
  75. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/no_indent.py +0 -0
  76. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/oct_to_int.py +0 -0
  77. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/password_generator.py +0 -0
  78. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/pip_freeze_without_version.py +0 -0
  79. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/pip_update_pypipr.py +0 -0
  80. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/poetry_publish.py +0 -0
  81. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/poetry_update_version.py +0 -0
  82. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/print_colorize.py +0 -0
  83. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/print_dir.py +0 -0
  84. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/print_log.py +0 -0
  85. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/print_to_last_line.py +0 -0
  86. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/random_bool.py +0 -0
  87. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/restart.py +0 -0
  88. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/set_timeout.py +0 -0
  89. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/sets_ordered.py +0 -0
  90. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/sqlite_backup.py +0 -0
  91. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/sqlite_delete_table.py +0 -0
  92. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/sqlite_get_all_tables.py +0 -0
  93. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/sqlite_get_data_table.py +0 -0
  94. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/str_cmp.py +0 -0
  95. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/text_colorize.py +0 -0
  96. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/tiles.py +0 -0
  97. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/to_str.py +0 -0
  98. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/traceback_filename.py +0 -0
  99. {pypipr-1.0.167 → pypipr-1.0.169}/pypipr/traceback_framename.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pypipr
3
- Version: 1.0.167
3
+ Version: 1.0.169
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 0x7e48a52840>
252
- <generator object int_range at 0x7e48a52940>
251
+ <generator object int_range at 0x7dea406840>
252
+ <generator object int_range at 0x7dea406940>
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 0x7e48a6b1c0>
284
+ <generator object batchmaker at 0x7dea4172e0>
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 0x7e48a7b300>
338
+ <generator object batch_calculate at 0x7dea42f300>
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 0x7e48a5f100>
444
+ <generator object chunk_array at 0x7dea413100>
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 21:42:06.953911+07:00
496
- 2025-04-10 14:42:06.956120+00:00
497
- 2025-04-10 07:42:06.958795-07:00
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
498
498
  ```
499
499
 
500
500
  ## dict_first
@@ -519,30 +519,6 @@ Output:
519
519
  ('key3', 'value3')
520
520
  ```
521
521
 
522
- ## dirname
523
-
524
- `dirname(path, indeks=-1)`
525
-
526
- Mengembalikan nama folder dari path.
527
- Tanpa trailing slash di akhir.
528
-
529
- ```python
530
- print(dirname("/ini/nama/folder/ke/file.py"))
531
- ```
532
-
533
- Output:
534
- ```py
535
- /ini/nama/folder/ke
536
- ```
537
-
538
- ## django_clear_migrations
539
-
540
- `django_clear_migrations(appname)`
541
-
542
- ## django_runserver
543
-
544
- `django_runserver()`
545
-
546
522
  ## is_iterable
547
523
 
548
524
  `is_iterable(var, str_is_iterable=False)`
@@ -608,10 +584,34 @@ iprint(filter_empty(var))
608
584
 
609
585
  Output:
610
586
  ```py
611
- <generator object filter_empty at 0x7e48a5f2e0>
587
+ <generator object filter_empty at 0x7dea4132e0>
612
588
  [1, '0', True, {}, ['eee']]
613
589
  ```
614
590
 
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
615
  ## get_by_index
616
616
 
617
617
  `get_by_index(obj, index, on_error=None)`
@@ -655,8 +655,8 @@ print(list(get_class_method(ExampleGetClassMethod)))
655
655
 
656
656
  Output:
657
657
  ```py
658
- <generator object get_class_method at 0x7e48a7be60>
659
- [<function ExampleGetClassMethod.a at 0x7e48acede0>, <function ExampleGetClassMethod.b at 0x7e48acee80>, <function ExampleGetClassMethod.c at 0x7e48aced40>, <function ExampleGetClassMethod.d at 0x7e48acef20>]
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>]
660
660
  ```
661
661
 
662
662
  ## get_filesize
@@ -1084,7 +1084,7 @@ Output:
1084
1084
 
1085
1085
  ## ienumerate
1086
1086
 
1087
- `ienumerate(iterator, start=0, key=<function int_to_int at 0x7e4c90a5c0>)`
1087
+ `ienumerate(iterator, start=0, key=<function int_to_int at 0x7ded8ce5c0>)`
1088
1088
 
1089
1089
  meningkatkan fungsi enumerate() pada python
1090
1090
  untuk key menggunakan huruf dan basis angka lainnya.
@@ -1097,7 +1097,7 @@ iprint(ienumerate(it, key=int_to_chr))
1097
1097
 
1098
1098
  Output:
1099
1099
  ```py
1100
- <generator object ienumerate at 0x7e48a5f2e0>
1100
+ <generator object ienumerate at 0x7dea4132e0>
1101
1101
  [('a', 'ini'), ('b', 'contoh'), ('c', 'enumerator')]
1102
1102
  ```
1103
1103
 
@@ -1220,9 +1220,9 @@ Output:
1220
1220
  ```py
1221
1221
  (['Home', 'Emas 1 Gram', 'History', 'Trend', 'Perak 1 Gram', 'Pluang'],
1222
1222
  [['Harga Emas Hari Ini - Kamis, 10 April 2025'],
1223
- ['Spot Emas USD↑3.151,83 (+60,79) / oz',
1223
+ ['Spot Emas USD↑3.164,58 (+73,54) / oz',
1224
1224
  'Kurs IDR1,00 / USD',
1225
- 'Emas IDR↑101 (+2) / gr'],
1225
+ 'Emas IDR↑102 (+2) / gr'],
1226
1226
  ['LM Antam (Jual)↓1.513.000 (-30.000) / gr',
1227
1227
  'LM Antam (Beli)↓1.366.000 (-30.000) / gr']],
1228
1228
  [['Harga Emas Hari Ini'],
@@ -1245,10 +1245,10 @@ Output:
1245
1245
  'Update harga LM Pegadaian :31 Desember 1969']],
1246
1246
  [['Spot Harga Emas Hari Ini (Market Open)'],
1247
1247
  ['Satuan', 'USD', 'Kurs\xa0Dollar', 'IDR'],
1248
- ['Ounce\xa0(oz)', '3.151,83 (+60,79)', '1,00', '3.152'],
1249
- ['Gram\xa0(gr)', '101,33', '1,00', '101 (+2)'],
1250
- ['Kilogram\xa0(kg)', '101.333,69', '1,00', '101.334'],
1251
- ['Update harga emas :10 April 2025, pukul 21:42Update kurs :14 Maret 2025, '
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, '
1252
1252
  'pukul 10:13']],
1253
1253
  [['Gram', 'UBS Gold 99.99%'],
1254
1254
  ['Jual', 'Beli'],
@@ -1286,36 +1286,36 @@ Output:
1286
1286
  ['Unit', 'USD', 'IDR'],
1287
1287
  ['Angka', '+/-', 'Angka', '+/-'],
1288
1288
  ['Hari Ini', 'Kurs', '', '', '1', '%'],
1289
- ['oz', '3.091,04', '+60,79+1,97%', '3.091', '+61+1,97%'],
1290
- ['gr', '99,38', '+1,95+1,97%', '99', '+2+1,97%'],
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
1291
  ['30 Hari', 'Kurs', '', '', '16.326', '-16.325-99,99%'],
1292
- ['oz', '2.916,73', '+235,10+8,06%', '47.618.534', '-47.615.382-99,99%'],
1293
- ['gr', '93,78', '+7,56+8,06%', '1.530.971', '-1.530.870-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
1294
  ['2 Bulan', 'Kurs', '', '', '16.330', '-16.329-99,99%'],
1295
- ['oz', '2.861,26', '+290,57+10,16%', '46.724.376', '-46.721.224-99,99%'],
1296
- ['gr', '91,99', '+9,34+10,16', '1.502.224', '-1.502.122-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%'],
1297
1297
  ['6 Bulan', 'Kurs', '', '', '15.658', '-15.657-99,99%'],
1298
- ['oz', '2.656,78', '+495,05+18,63%', '41.599.861', '-41.596.709-99,99%'],
1299
- ['gr', '85,42', '+15,92+18,63%', '1.337.467', '-1.337.365-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%'],
1300
1300
  ['1 Tahun', 'Kurs', '', '', '15.907', '-15.906-99,99%'],
1301
- ['oz', '2.338,57', '+813,26+34,78%', '37.199.633', '-37.196.481-99,99%'],
1302
- ['gr', '75,19', '+26,15+34,78%', '1.195.996', '-1.195.895-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%'],
1303
1303
  ['2 Tahun', 'Kurs', '', '', '15.731', '-15.730-99,99%'],
1304
- ['oz', '1.823,86', '+1.327,97+72,81%', '28.691.142', '-28.687.990-99,99%'],
1305
- ['gr', '58,64', '+42,70+72,81%', '922.442', '-922.340-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
1306
  ['3 Tahun', 'Kurs', '', '', '14.365', '-14.364-99,99%'],
1307
- ['oz', '1.942,64', '+1.209,19+62,24%', '27.906.043', '-27.902.891-99,99%'],
1308
- ['gr', '62,46', '+38,88+62,24%', '897.200', '-897.099-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
1309
  ['5 Tahun', 'Kurs', '', '', '16.241', '-16.240-99,99%'],
1310
- ['oz', '1.688,78', '+1.463,05+86,63%', '27.427.493', '-27.424.341-99,99%'],
1311
- ['gr', '54,30', '+47,04+86,63%', '881.814', '-881.713-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%']])
1312
1312
  (['Home', 'Emas 1 Gram', 'History', 'Trend', 'Perak 1 Gram', 'Pluang'],
1313
1313
  [[''],
1314
1314
  ['Emas 24 KaratHarga Emas 1 Gram', ''],
1315
- ['USD', '101,33↑', '+1,95+1,96%'],
1315
+ ['USD', '101,74↑', '+2,36+2,37%'],
1316
1316
  ['KURS', '16.355,25↓', '%'],
1317
- ['IDR', '1.657.337,80↑', '+31.965,42+1,97%'],
1318
- ['Kamis, 10 April 2025 21:42']],
1317
+ ['IDR', '1.664.042,17↑', '+38.669,79+2,38%'],
1318
+ ['Kamis, 10 April 2025 22:27']],
1319
1319
  [[''],
1320
1320
  ['Emas 1 Gram (IDR)Emas 1 Gram (USD)Kurs USD-IDR',
1321
1321
  'Hari Ini',
@@ -1326,25 +1326,25 @@ Output:
1326
1326
  '']],
1327
1327
  [['Pergerakkan Harga Emas 1 Gram'],
1328
1328
  ['', 'Penutupan Kemarin', 'Pergerakkan Hari Ini', 'Rata-rata'],
1329
- ['USD', '99,38', '99,38 - 101,33', '100,36'],
1329
+ ['USD', '99,38', '99,38 - 101,74', '100,56'],
1330
1330
  ['KURS', '16.355,25', '16.355,25 - 16.355,25', '16.355,25'],
1331
- ['IDR', '1.625.372,38', '1.625.372,38 - 1.657.337,80', '1.641.355,09'],
1331
+ ['IDR', '1.625.372,38', '1.625.372,38 - 1.664.042,17', '1.644.707,28'],
1332
1332
  [''],
1333
1333
  ['', 'Awal Tahun', 'Pergerakkan YTD', '+/- YTD'],
1334
- ['USD', '84,42', '84,38 - 101,33', '+16,91 (20,03%)'],
1334
+ ['USD', '84,42', '84,38 - 101,74', '+17,32 (20,52%)'],
1335
1335
  ['KURS', '16.220,76', '16.156,70 - 16.387,00', '+134,49 (0,83%)'],
1336
1336
  ['IDR',
1337
1337
  '1.369.306,75',
1338
- '1.368.695,74 - 1.657.337,80',
1339
- '+288.031,05 (21,03%)'],
1338
+ '1.368.695,74 - 1.664.042,17',
1339
+ '+294.735,42 (21,52%)'],
1340
1340
  [''],
1341
1341
  ['', 'Tahun Lalu / 52 Minggu', 'Pergerakkan 52 Minggu', '+/- 52 Minggu'],
1342
- ['USD', '75,37', '73,75 - 101,33', '+25,96 (34,44%)'],
1342
+ ['USD', '75,37', '73,75 - 101,74', '+26,37 (34,99%)'],
1343
1343
  ['KURS', '15.877,00', '15.100,00 - 16.509,65', '+478,25 (3,01%)'],
1344
1344
  ['IDR',
1345
1345
  '1.196.609,14',
1346
- '1.181.943,88 - 1.657.337,80',
1347
- '+460.728,66 (38,50%)']])
1346
+ '1.181.943,88 - 1.664.042,17',
1347
+ '+467.433,03 (39,06%)']])
1348
1348
  ```
1349
1349
 
1350
1350
  ## iloads
@@ -1474,7 +1474,7 @@ Output:
1474
1474
  ```py
1475
1475
  8
1476
1476
  ['mana', 'aja']
1477
- [<Element a at 0x7e487a9270>, <Element a at 0x7e487dfed0>, <Element a at 0x7e487dff20>, <Element a at 0x7e487dff70>, <Element a at 0x7e487dffc0>, <Element a at 0x7e48800050>, <Element a at 0x7e488000a0>, <Element a at 0x7e488000f0>, <Element a at 0x7e48800140>, <Element a at 0x7e48800190>, <Element a at 0x7e488001e0>, <Element a at 0x7e48800230>, <Element a at 0x7e48800280>, <Element a at 0x7e488002d0>, <Element a at 0x7e48800320>, <Element a at 0x7e48800370>, <Element a at 0x7e488003c0>, <Element a at 0x7e48800410>]
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>]
1478
1478
  False
1479
1479
  ```
1480
1480
 
@@ -1544,7 +1544,7 @@ print(list(iscandir("./", recursive=False, scan_file=False)))
1544
1544
 
1545
1545
  Output:
1546
1546
  ```py
1547
- <generator object iscandir at 0x7e48a5f1f0>
1547
+ <generator object iscandir at 0x7dea4131f0>
1548
1548
  [PosixPath('.git'), PosixPath('.vscode'), PosixPath('pypipr'), PosixPath('__pycache__'), PosixPath('dist')]
1549
1549
  ```
1550
1550
 
@@ -1577,98 +1577,98 @@ iprint(ivars(__import__('pypipr')))
1577
1577
 
1578
1578
  Output:
1579
1579
  ```py
1580
- {'function': {'avg': <function avg at 0x7e55d68680>,
1581
- 'get_filemtime': <function get_filemtime at 0x7e4c85d3a0>,
1582
- 'print_colorize': <function print_colorize at 0x7e4c85d580>,
1583
- 'print_log': <function print_log at 0x7e4edc74c0>,
1584
- 'console_run': <function console_run at 0x7e4c85d440>,
1585
- 'auto_reload': <function auto_reload at 0x7e4c85cd60>,
1586
- 'basename': <function basename at 0x7e4c85d620>,
1587
- 'chr_to_int': <function chr_to_int at 0x7e4c85dbc0>,
1588
- 'int_to_chr': <function int_to_chr at 0x7e4c85dc60>,
1589
- 'irange': <function irange at 0x7e4c85e160>,
1590
- 'batchmaker': <function batchmaker at 0x7e4c85d940>,
1591
- 'calculate': <function calculate at 0x7e4c85d4e0>,
1592
- 'batch_calculate': <function batch_calculate at 0x7e4c85d6c0>,
1593
- 'bin_to_int': <function bin_to_int at 0x7e4c85d8a0>,
1594
- 'is_empty': <function is_empty at 0x7e4c85ea20>,
1595
- 'exit_if_empty': <function exit_if_empty at 0x7e4c85e8e0>,
1596
- 'input_char': <function input_char at 0x7e4c85e980>,
1597
- 'choices': <function choices at 0x7e4c85eca0>,
1598
- 'chunk_array': <function chunk_array at 0x7e4c85ed40>,
1599
- 'create_folder': <function create_folder at 0x7e4c85ede0>,
1600
- 'datetime_from_string': <function datetime_from_string at 0x7e4c85ee80>,
1601
- 'datetime_now': <function datetime_now at 0x7e4c85ef20>,
1602
- 'dict_first': <function dict_first at 0x7e4c87d1c0>,
1603
- 'dirname': <function dirname at 0x7e4c87d260>,
1604
- 'django_clear_migrations': <function django_clear_migrations at 0x7e4c87d300>,
1605
- 'django_runserver': <function django_runserver at 0x7e4c87d620>,
1606
- 'is_iterable': <function is_iterable at 0x7e4c87d9e0>,
1607
- 'to_str': <function to_str at 0x7e4c87db20>,
1608
- 'filter_empty': <function filter_empty at 0x7e4c87d8a0>,
1609
- 'get_by_index': <function get_by_index at 0x7e4c87da80>,
1610
- 'get_class_method': <function get_class_method at 0x7e4c87dbc0>,
1611
- 'get_filesize': <function get_filesize at 0x7e4c87dd00>,
1612
- 'github_init': <function github_init at 0x7e4c87dda0>,
1613
- 'github_pull': <function github_pull at 0x7e4c87de40>,
1614
- 'github_push': <function github_push at 0x7e4c87df80>,
1615
- 'github_user': <function github_user at 0x7e4c87e020>,
1616
- 'hex_to_int': <function hex_to_int at 0x7e4c87e0c0>,
1617
- 'iargv': <function iargv at 0x7e4c87e160>,
1618
- 'idir': <function idir at 0x7e4c87e200>,
1619
- 'idumps_html': <function idumps_html at 0x7e4c90a0c0>,
1620
- 'idumps': <function idumps at 0x7e4c87e2a0>,
1621
- 'int_to_int': <function int_to_int at 0x7e4c90a5c0>,
1622
- 'ienumerate': <function ienumerate at 0x7e4c8f0900>,
1623
- 'ienv': <function ienv at 0x7e4c90a480>,
1624
- 'iexec': <function iexec at 0x7e4c90a660>,
1625
- 'iinput': <function iinput at 0x7e4c90a700>,
1626
- 'ijoin': <function ijoin at 0x7e4c90a7a0>,
1627
- 'iloads_html': <function iloads_html at 0x7e4c90aac0>,
1628
- 'iloads': <function iloads at 0x7e56161260>,
1629
- 'int_to_bin': <function int_to_bin at 0x7e4c90a840>,
1630
- 'int_to_hex': <function int_to_hex at 0x7e4c90a8e0>,
1631
- 'int_to_oct': <function int_to_oct at 0x7e4c90ab60>,
1632
- 'is_valid_url': <function is_valid_url at 0x7e4c90ade0>,
1633
- 'iopen': <function iopen at 0x7e4c6ea980>,
1634
- 'iprint': <function iprint at 0x7e4c741940>,
1635
- 'is_raw_string': <function is_raw_string at 0x7e48bd4220>,
1636
- 'ireplace': <function ireplace at 0x7e4c7aa700>,
1637
- 'is_html': <function is_html at 0x7e48bd4180>,
1638
- 'iscandir': <function iscandir at 0x7e48bd42c0>,
1639
- 'isplit': <function isplit at 0x7e48bd4360>,
1640
- 'ivars': <function ivars at 0x7e48bd4400>,
1641
- 'log': <function log at 0x7e48bd44a0>,
1642
- 'no_indent': <function no_indent at 0x7e48bd45e0>,
1643
- 'oct_to_int': <function oct_to_int at 0x7e48bd4680>,
1644
- 'password_generator': <function password_generator at 0x7e48bd4540>,
1645
- 'path_to_module': <function path_to_module at 0x7e48bd47c0>,
1646
- 'pip_freeze_without_version': <function pip_freeze_without_version at 0x7e48bd4860>,
1647
- 'pip_update_pypipr': <function pip_update_pypipr at 0x7e48bd4900>,
1648
- 'poetry_publish': <function poetry_publish at 0x7e48bd49a0>,
1649
- 'poetry_update_version': <function poetry_update_version at 0x7e48bd4ae0>,
1650
- 'print_dir': <function print_dir at 0x7e48bd4c20>,
1651
- 'print_to_last_line': <function print_to_last_line at 0x7e48bd4cc0>,
1652
- 'random_bool': <function random_bool at 0x7e48bd4d60>,
1653
- 'repath': <function repath at 0x7e48bd4ea0>,
1654
- 'restart': <function restart at 0x7e48bd4f40>,
1655
- 'set_timeout': <function set_timeout at 0x7e48bd4fe0>,
1656
- 'sets_ordered': <function sets_ordered at 0x7e48bd5080>,
1657
- 'sqlite_backup': <function sqlite_backup at 0x7e48bd5120>,
1658
- 'sqlite_delete_table': <function sqlite_delete_table at 0x7e48bd51c0>,
1659
- 'sqlite_get_all_tables': <function sqlite_get_all_tables at 0x7e48bd5260>,
1660
- 'sqlite_get_data_table': <function sqlite_get_data_table at 0x7e48bd5300>,
1661
- 'str_cmp': <function str_cmp at 0x7e48bd5bc0>,
1662
- 'text_colorize': <function text_colorize at 0x7e48bd5c60>,
1663
- 'tiles': <function tiles at 0x7e48bd5d00>,
1664
- 'traceback_filename': <function traceback_filename at 0x7e48bd5da0>,
1665
- 'traceback_framename': <function traceback_framename at 0x7e48bd5e40>},
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>},
1666
1666
  'class': {'ComparePerformance': <class 'pypipr.ComparePerformance.ComparePerformance'>,
1667
1667
  'PintUregQuantity': <class 'pint.Quantity'>,
1668
1668
  'RunParallel': <class 'pypipr.RunParallel.RunParallel'>,
1669
1669
  'TextCase': <class 'pypipr.TextCase.TextCase'>},
1670
1670
  'variable': {'LINUX': True,
1671
- 'PintUreg': <pint.registry.UnitRegistry object at 0x7e4edafe30>,
1671
+ 'PintUreg': <pint.registry.UnitRegistry object at 0x7df38f7830>,
1672
1672
  'WINDOWS': False},
1673
1673
  'module': {'asyncio': <module 'asyncio' from '/data/data/com.termux/files/usr/lib/python3.12/asyncio/__init__.py'>,
1674
1674
  '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,12 +1763,12 @@ print(password_generator())
1763
1763
 
1764
1764
  Output:
1765
1765
  ```py
1766
- zj3:"_OV
1766
+ ^}IuwReP
1767
1767
  ```
1768
1768
 
1769
1769
  ## path_to_module
1770
1770
 
1771
- `path_to_module(abs_path, indeks=0)`
1771
+ `path_to_module(path, indeks=0)`
1772
1772
 
1773
1773
  Mengubah absolute path file menjadi path modul relatif terhadap cwd (current working directory),
1774
1774
  dengan opsi untuk memangkas bagian akhir path berdasarkan indeks.
@@ -1842,7 +1842,7 @@ Output:
1842
1842
  __enter__ : https:/www.google.com
1843
1843
  __fspath__ : https:/www.google.com
1844
1844
  __getstate__ : (None, {'_raw_paths': ['https://www.google.com/'], '_drv': '', '_root': '', '_tail_cached': ['https:', 'www.google.com'], '_str': 'https:/www.google.com'})
1845
- __hash__ : -6061392051883426523
1845
+ __hash__ : 4044854816993747545
1846
1846
  __init__ : None
1847
1847
  __init_subclass__ : None
1848
1848
  __module__ : pathlib
@@ -1854,7 +1854,7 @@ Output:
1854
1854
  __subclasshook__ : NotImplemented
1855
1855
  _drv :
1856
1856
  _flavour : <module 'posixpath' (frozen)>
1857
- _hash : -6061392051883426523
1857
+ _hash : 4044854816993747545
1858
1858
  _lines : https:
1859
1859
  www.google.com
1860
1860
  _lines_cached : https:
@@ -1888,7 +1888,7 @@ _parts_normcase_cached : ['https:', 'www.google.com']
1888
1888
  is_reserved : False
1889
1889
  is_socket : False
1890
1890
  is_symlink : False
1891
- iterdir : <generator object Path.iterdir at 0x7e487c01e0>
1891
+ iterdir : <generator object Path.iterdir at 0x7dea41be00>
1892
1892
  joinpath : .
1893
1893
  name :
1894
1894
  parent : https:/www.google.com
@@ -1899,7 +1899,7 @@ _parts_normcase_cached : ['https:', 'www.google.com']
1899
1899
  stem :
1900
1900
  suffix :
1901
1901
  suffixes : []
1902
- walk : <generator object Path.walk at 0x7e48c9fd80>
1902
+ walk : <generator object Path.walk at 0x7dea69fd80>
1903
1903
  with_segments : .
1904
1904
  ```
1905
1905
 
@@ -1941,12 +1941,12 @@ print(random_bool())
1941
1941
 
1942
1942
  Output:
1943
1943
  ```py
1944
- False
1944
+ True
1945
1945
  ```
1946
1946
 
1947
1947
  ## repath
1948
1948
 
1949
- `repath(path: pathlib.Path, folder_name=None, prepand_folder=None, append_folder=None, file_name=None, prepand_filename=None, append_filename=None, extension=None, prepand_extension=None, append_extension=None)`
1949
+ `repath(path, folder_name=None, prepand_folder=None, append_folder=None, file_name=None, prepand_filename=None, append_filename=None, extension=None, prepand_extension=None, append_extension=None)`
1950
1950
 
1951
1951
  ## restart
1952
1952
 
@@ -1979,7 +1979,7 @@ x.cancel()
1979
1979
 
1980
1980
  Output:
1981
1981
  ```py
1982
- <Timer(Thread-2, started 542354947312)>
1982
+ <Timer(Thread-2, started 540775611632)>
1983
1983
  menghentikan timeout 7
1984
1984
  ```
1985
1985
 
@@ -1997,7 +1997,7 @@ print(list(sets_ordered(array)))
1997
1997
 
1998
1998
  Output:
1999
1999
  ```py
2000
- <generator object sets_ordered at 0x7e487c2dc0>
2000
+ <generator object sets_ordered at 0x7dea12ac20>
2001
2001
  [2, 3, 12, 42, 1, 43, 41, 4, 24, 32]
2002
2002
  ```
2003
2003
 
@@ -2119,15 +2119,15 @@ print(ExampleComparePerformance().compare_performance())
2119
2119
 
2120
2120
  Output:
2121
2121
  ```py
2122
- {'a': <generator object ExampleComparePerformance.a.<locals>.<genexpr> at 0x7e48ab4ac0>,
2122
+ {'a': <generator object ExampleComparePerformance.a.<locals>.<genexpr> at 0x7dea458b80>,
2123
2123
  'b': (0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
2124
2124
  'c': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
2125
2125
  'd': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
2126
- {'a': 123, 'b': 159, 'c': 100, 'd': 252}
2127
- {'a': 100, 'b': 154, 'c': 100, 'd': 200}
2128
- {'a': 100, 'b': 148, 'c': 100, 'd': 200}
2129
- {'a': 100, 'b': 155, 'c': 100, 'd': 201}
2130
- {'a': 102, 'b': 155, 'c': 100, 'd': 195}
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
2131
  ```
2132
2132
 
2133
2133
  ## PintUregQuantity
@@ -0,0 +1,31 @@
1
+ import os
2
+
3
+ from .filter_empty import filter_empty
4
+
5
+
6
+ def dirname(path, indeks=-1, abs_path=None):
7
+ """
8
+ Mengembalikan nama folder dari path.
9
+ Tanpa trailing slash di akhir.
10
+
11
+ ```python
12
+ print(dirname("/ini/nama/folder/ke/file.py"))
13
+ ```
14
+ """
15
+
16
+ paths = path.split(os.sep)
17
+ paths = list(filter_empty(paths))
18
+
19
+ if indeks < 0:
20
+ paths = paths[: len(paths) + indeks]
21
+ path = os.sep.join(paths)
22
+
23
+ if abs_path is None:
24
+ return path
25
+
26
+ path = os.path.abspath(path)
27
+ if abs_path:
28
+ return path
29
+ return os.path.relpath(path, os.getcwd())
30
+
31
+ return os.path.dirname(path)
@@ -1,7 +1,9 @@
1
1
  import os
2
2
 
3
+ from pypipr.dirname import dirname
3
4
 
4
- def path_to_module(abs_path, indeks=0):
5
+
6
+ def path_to_module(path, indeks=0):
5
7
  """
6
8
  Mengubah absolute path file menjadi path modul relatif terhadap cwd (current working directory),
7
9
  dengan opsi untuk memangkas bagian akhir path berdasarkan indeks.
@@ -16,6 +18,9 @@ def path_to_module(abs_path, indeks=0):
16
18
  Returns:
17
19
  str: Path bergaya modul Python (dipisah dengan ".")
18
20
  """
21
+ path = dirname(path, abs_path=False)
22
+ return path.replace(os.sep, ".")
23
+
19
24
  cwd = os.getcwd()
20
25
  rel_path = os.path.relpath(abs_path, cwd)
21
26
  rel_path_no_ext = os.path.splitext(rel_path)[0]