pypipr 1.0.73__py3-none-any.whl → 1.0.75__py3-none-any.whl

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.
@@ -1,1356 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: pypipr
3
- Version: 1.0.73
4
- Summary: The Python Package Index Project
5
- Author: ufiapjj
6
- Author-email: ufiapjj@gmail.com
7
- Requires-Python: >=3.9
8
- Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.9
10
- Classifier: Programming Language :: Python :: 3.10
11
- Classifier: Programming Language :: Python :: 3.11
12
- Classifier: Programming Language :: Python :: 3.12
13
- Requires-Dist: colorama
14
- Requires-Dist: cssselect
15
- Requires-Dist: django
16
- Requires-Dist: getch ; platform_system == "Linux"
17
- Requires-Dist: lxml
18
- Requires-Dist: pint
19
- Requires-Dist: pyyaml
20
- Requires-Dist: requests
21
- Requires-Dist: tzdata
22
- Description-Content-Type: text/markdown
23
-
24
-
25
- # About
26
- The Python Package Index Project (pypipr)
27
-
28
- pypi : https://pypi.org/project/pypipr
29
-
30
-
31
- # Setup
32
- Install with pip
33
- ```
34
- pip install pypipr
35
- ```
36
-
37
- Then import pypipr
38
- ```python
39
- import pypipr
40
- ```
41
-
42
- # CONSTANT
43
-
44
- `LINUX`
45
-
46
- `WINDOWS`
47
-
48
- # FUNCTION
49
-
50
- ## auto_reload
51
-
52
- `auto_reload(filename)`
53
-
54
- Menjalankan file python secara berulang.
55
- Dengan tujuan untuk melihat perubahan secara langsung.
56
- Pastikan kode aman untuk dijalankan.
57
- Jalankan kode ini di terminal console.
58
-
59
- ```py
60
- python -m pypipr.iflow.auto_reload file_name.py
61
- ```
62
-
63
- ## avg
64
-
65
- `avg(i)`
66
-
67
- Simple Average Function karena tidak disediakan oleh python
68
-
69
- ```python
70
- n = [1, 22, 2, 3, 13, 2, 123, 12, 31, 2, 2, 12, 2, 1]
71
- print(avg(n))
72
- ```
73
-
74
- Output:
75
- ```py
76
- 16.285714285714285
77
- ```
78
-
79
- ## basename
80
-
81
- `basename(path)`
82
-
83
- Mengembalikan nama file dari path
84
-
85
- ```python
86
- print(basename("/ini/nama/folder/ke/file.py"))
87
- ```
88
-
89
- Output:
90
- ```py
91
- file.py
92
- ```
93
-
94
- ## batch_calculate
95
-
96
- `batch_calculate(pattern)`
97
-
98
- Analisa perhitungan massal.
99
- Bisa digunakan untuk mencari alternatif terendah/tertinggi/dsb.
100
-
101
-
102
- ```python
103
- iprint(batch_calculate("{1 10} m ** {1 3}"))
104
- ```
105
-
106
- Output:
107
- ```py
108
- [('1 m ** 1', <Quantity(1, 'meter')>),
109
- ('1 m ** 2', <Quantity(1, 'meter ** 2')>),
110
- ('1 m ** 3', <Quantity(1, 'meter ** 3')>),
111
- ('2 m ** 1', <Quantity(2, 'meter')>),
112
- ('2 m ** 2', <Quantity(2, 'meter ** 2')>),
113
- ('2 m ** 3', <Quantity(2, 'meter ** 3')>),
114
- ('3 m ** 1', <Quantity(3, 'meter')>),
115
- ('3 m ** 2', <Quantity(3, 'meter ** 2')>),
116
- ('3 m ** 3', <Quantity(3, 'meter ** 3')>),
117
- ('4 m ** 1', <Quantity(4, 'meter')>),
118
- ('4 m ** 2', <Quantity(4, 'meter ** 2')>),
119
- ('4 m ** 3', <Quantity(4, 'meter ** 3')>),
120
- ('5 m ** 1', <Quantity(5, 'meter')>),
121
- ('5 m ** 2', <Quantity(5, 'meter ** 2')>),
122
- ('5 m ** 3', <Quantity(5, 'meter ** 3')>),
123
- ('6 m ** 1', <Quantity(6, 'meter')>),
124
- ('6 m ** 2', <Quantity(6, 'meter ** 2')>),
125
- ('6 m ** 3', <Quantity(6, 'meter ** 3')>),
126
- ('7 m ** 1', <Quantity(7, 'meter')>),
127
- ('7 m ** 2', <Quantity(7, 'meter ** 2')>),
128
- ('7 m ** 3', <Quantity(7, 'meter ** 3')>),
129
- ('8 m ** 1', <Quantity(8, 'meter')>),
130
- ('8 m ** 2', <Quantity(8, 'meter ** 2')>),
131
- ('8 m ** 3', <Quantity(8, 'meter ** 3')>),
132
- ('9 m ** 1', <Quantity(9, 'meter')>),
133
- ('9 m ** 2', <Quantity(9, 'meter ** 2')>),
134
- ('9 m ** 3', <Quantity(9, 'meter ** 3')>),
135
- ('10 m ** 1', <Quantity(10, 'meter')>),
136
- ('10 m ** 2', <Quantity(10, 'meter ** 2')>),
137
- ('10 m ** 3', <Quantity(10, 'meter ** 3')>)]
138
- ```
139
-
140
- ## batchmaker
141
-
142
- `batchmaker(pattern: str)`
143
-
144
- Alat Bantu untuk membuat teks yang berulang.
145
- Gunakan `{[start][separator][finish]([separator][step])}`.
146
- ```
147
- [start] dan [finish] -> bisa berupa huruf maupun angka
148
- ([separator][step]) -> bersifat optional
149
- [separator] -> selain huruf dan angka
150
- [step] -> berupa angka positif
151
- ```
152
-
153
- ```python
154
- s = "Urutan {1/6/3} dan {10:9} dan {j k} dan {Z - A - 15} saja."
155
- print(batchmaker(s))
156
- print(list(batchmaker(s)))
157
- ```
158
-
159
- Output:
160
- ```py
161
- <generator object batchmaker at 0x771717d240>
162
- ['Urutan 1 dan 10 dan j dan Z saja.', 'Urutan 1 dan 10 dan j dan K saja.', 'Urutan 1 dan 10 dan k dan Z saja.', 'Urutan 1 dan 10 dan k dan K saja.', 'Urutan 1 dan 9 dan j dan Z saja.', 'Urutan 1 dan 9 dan j dan K saja.', 'Urutan 1 dan 9 dan k dan Z saja.', 'Urutan 1 dan 9 dan k dan K saja.', 'Urutan 4 dan 10 dan j dan Z saja.', 'Urutan 4 dan 10 dan j dan K saja.', 'Urutan 4 dan 10 dan k dan Z saja.', 'Urutan 4 dan 10 dan k dan K saja.', 'Urutan 4 dan 9 dan j dan Z saja.', 'Urutan 4 dan 9 dan j dan K saja.', 'Urutan 4 dan 9 dan k dan Z saja.', 'Urutan 4 dan 9 dan k dan K saja.']
163
- ```
164
-
165
- ## calculate
166
-
167
- `calculate(teks)`
168
-
169
- Mengembalikan hasil dari perhitungan teks menggunakan modul pint.
170
- Mendukung perhitungan matematika dasar dengan satuan.
171
-
172
- Return value:
173
- - Berupa class Quantity dari modul pint
174
-
175
- Format:
176
- - f"{result:~P}" -> pretty
177
- - f"{result:~H}" -> html
178
- - result.to_base_units() -> SI
179
- - result.to_compact() -> human readable
180
-
181
- ```python
182
- fx = "3 meter * 10 cm * 3 km"
183
- res = calculate(fx)
184
- print(res)
185
- print(res.to_base_units())
186
- print(res.to_compact())
187
- print(f"{res:~P}")
188
- print(f"{res:~H}")
189
- ```
190
-
191
- Output:
192
- ```py
193
- 90 centimeter * kilometer * meter
194
- 900.0 meter ** 3
195
- 900.0 meter ** 3
196
- 90 cm·km·m
197
- 90 cm km m
198
- ```
199
-
200
- ## choices
201
-
202
- `choices(iterator, title=None, prompt='', default=None)`
203
-
204
- Memudahkan dalam membuat pilihan untuk user dalam tampilan console
205
-
206
- ```py
207
- a = choices("ini hanya satu pilihan")
208
- b = choices(
209
- {
210
- "sedan": "audi",
211
- "suv": "volvo",
212
- "truck": "tesla",
213
- },
214
- title="Car Model",
215
- prompt="Pilih Mobil : ",
216
- )
217
- c = choices(
218
- iscandir(recursive=False),
219
- title="List File dan Folder",
220
- prompt="Pilih File atau Folder : ",
221
- )
222
- ```
223
-
224
- ## chunk_array
225
-
226
- `chunk_array(array, size, start=0)`
227
-
228
- Membagi array menjadi potongan-potongan dengan besaran yg diinginkan
229
-
230
- ```python
231
- array = [2, 3, 12, 3, 3, 42, 42, 1, 43, 2, 42, 41, 4, 24, 32, 42, 3, 12, 32, 42, 42]
232
- print(chunck_array(array, 5))
233
- print(list(chunck_array(array, 5)))
234
- ```
235
-
236
- ## console_run
237
-
238
- `console_run(info, command=None, print_info=True, capture_output=False)`
239
-
240
- Menjalankan command seperti menjalankan command di Command Terminal
241
-
242
- ```py
243
- console_run('dir')
244
- console_run('ls')
245
- ```
246
-
247
- ## create_folder
248
-
249
- `create_folder(folder_name)`
250
-
251
- Membuat folder.
252
- Membuat folder secara recursive dengan permission.
253
-
254
- ```py
255
- create_folder("contoh_membuat_folder")
256
- create_folder("contoh/membuat/folder/recursive")
257
- create_folder("./contoh_membuat_folder/secara/recursive")
258
- ```
259
-
260
- ## datetime_from_string
261
-
262
- `datetime_from_string(iso_string, timezone='UTC')`
263
-
264
- Parse iso_string menjadi datetime object
265
-
266
- ```python
267
- print(datetime_from_string("2022-12-12 15:40:13").isoformat())
268
- print(datetime_from_string(
269
- "2022-12-12 15:40:13",
270
- timezone="Asia/Jakarta"
271
- ).isoformat())
272
- ```
273
-
274
- Output:
275
- ```py
276
- 2022-12-12T15:40:13+00:00
277
- 2022-12-12T15:40:13+07:00
278
- ```
279
-
280
- ## datetime_now
281
-
282
- `datetime_now(timezone=None)`
283
-
284
- Memudahkan dalam membuat Datetime untuk suatu timezone tertentu
285
-
286
- ```python
287
- print(datetime_now("Asia/Jakarta"))
288
- print(datetime_now("GMT"))
289
- print(datetime_now("Etc/GMT+7"))
290
- ```
291
-
292
- Output:
293
- ```py
294
- 2024-04-15 10:45:00.599022+07:00
295
- 2024-04-15 03:45:00.600067+00:00
296
- 2024-04-14 20:45:00.601887-07:00
297
- ```
298
-
299
- ## dict_first
300
-
301
- `dict_first(d: dict, remove=False)`
302
-
303
- Mengambil nilai (key, value) pertama dari dictionary dalam bentuk tuple.
304
-
305
- ```python
306
- d = {
307
- "key2": "value2",
308
- "key3": "value3",
309
- "key1": "value1",
310
- }
311
- print(dict_first(d, remove=True))
312
- print(dict_first(d))
313
- ```
314
-
315
- Output:
316
- ```py
317
- ('key2', 'value2')
318
- ('key3', 'value3')
319
- ```
320
-
321
- ## dirname
322
-
323
- `dirname(path)`
324
-
325
- Mengembalikan nama folder dari path.
326
- Tanpa trailing slash di akhir.
327
-
328
- ```python
329
- print(dirname("/ini/nama/folder/ke/file.py"))
330
- ```
331
-
332
- Output:
333
- ```py
334
- /ini/nama/folder/ke
335
- ```
336
-
337
- ## exit_if_empty
338
-
339
- `exit_if_empty(*args)`
340
-
341
- Keluar dari program apabila seluruh variabel
342
- setara dengan empty
343
-
344
- ```py
345
- var1 = None
346
- var2 = '0'
347
- exit_if_empty(var1, var2)
348
- ```
349
-
350
- ## filter_empty
351
-
352
- `filter_empty(iterable, zero_is_empty=True, str_strip=True)`
353
-
354
- Mengembalikan iterabel yang hanya memiliki nilai
355
-
356
- ```python
357
- var = [1, None, False, 0, "0", True, {}, ['eee']]
358
- print(filter_empty(var))
359
- ```
360
-
361
- Output:
362
- ```py
363
- <generator object filter_empty at 0x7717156e30>
364
- ```
365
-
366
- ## get_class_method
367
-
368
- `get_class_method(cls)`
369
-
370
- Mengembalikan berupa tuple yg berisi list dari method dalam class
371
-
372
- ```python
373
- class ExampleGetClassMethod:
374
- def a():
375
- return [x for x in range(10)]
376
-
377
- def b():
378
- return [x for x in range(10)]
379
-
380
- def c():
381
- return [x for x in range(10)]
382
-
383
- def d():
384
- return [x for x in range(10)]
385
-
386
- print(get_class_method(ExampleGetClassMethod))
387
- ```
388
-
389
- Output:
390
- ```py
391
- <generator object get_class_method at 0x7717157010>
392
- ```
393
-
394
- ## get_filemtime
395
-
396
- `get_filemtime(filename)`
397
-
398
- Mengambil informasi last modification time file dalam nano seconds
399
-
400
- ```python
401
- print(get_filemtime(__file__))
402
- ```
403
-
404
- Output:
405
- ```py
406
- 1710697117516083632
407
- ```
408
-
409
- ## get_filesize
410
-
411
- `get_filesize(filename)`
412
-
413
- Mengambil informasi file size dalam bytes
414
-
415
- ```python
416
- print(get_filesize(__file__))
417
- ```
418
-
419
- Output:
420
- ```py
421
- 465
422
- ```
423
-
424
- ## github_pull
425
-
426
- `github_pull()`
427
-
428
- Menjalankan command `git pull`
429
-
430
- ```py
431
- github_pull()
432
- ```
433
-
434
- ## github_push
435
-
436
- `github_push(commit_msg=None)`
437
-
438
- Menjalankan command status, add, commit dan push
439
-
440
- ```py
441
- github_push('Commit Message')
442
- ```
443
-
444
- ## github_user
445
-
446
- `github_user(email=None, name=None)`
447
-
448
- Menyimpan email dan nama user secara global sehingga tidak perlu
449
- menginput nya setiap saat.
450
-
451
- ```py
452
- github_user('my@emil.com', 'MyName')
453
- ```
454
-
455
- ## iargv
456
-
457
- `iargv(key: int, cast=None, on_error=None)`
458
-
459
- ## idumps
460
-
461
- `idumps(data, syntax='yaml', indent=4)`
462
-
463
- Mengubah variabel data menjadi string untuk yang dapat dibaca untuk disimpan.
464
- String yang dihasilkan berbentuk syntax YAML/JSON/HTML.
465
-
466
- ```python
467
- data = {
468
- 'a': 123,
469
- 't': ['disini', 'senang', 'disana', 'senang'],
470
- 'l': (12, 23, [12, 42]),
471
- }
472
- print(idumps(data))
473
- print(idumps(data, syntax='html'))
474
- ```
475
-
476
- Output:
477
- ```py
478
- a: 123
479
- l: !!python/tuple
480
- - 12
481
- - 23
482
- - - 12
483
- - 42
484
- t:
485
- - disini
486
- - senang
487
- - disana
488
- - senang
489
-
490
- <table>
491
- <tbody>
492
- <tr>
493
- <th>a</th>
494
- <td>
495
- <span>123</span>
496
- </td>
497
- </tr>
498
- <tr>
499
- <th>t</th>
500
- <td>
501
- <ul>
502
- <li>
503
- <span>disini</span>
504
- </li>
505
- <li>
506
- <span>senang</span>
507
- </li>
508
- <li>
509
- <span>disana</span>
510
- </li>
511
- <li>
512
- <span>senang</span>
513
- </li>
514
- </ul>
515
- </td>
516
- </tr>
517
- <tr>
518
- <th>l</th>
519
- <td>
520
- <ul>
521
- <li>
522
- <span>12</span>
523
- </li>
524
- <li>
525
- <span>23</span>
526
- </li>
527
- <li>
528
- <ul>
529
- <li>
530
- <span>12</span>
531
- </li>
532
- <li>
533
- <span>42</span>
534
- </li>
535
- </ul>
536
- </li>
537
- </ul>
538
- </td>
539
- </tr>
540
- </tbody>
541
- </table>
542
-
543
- ```
544
-
545
- ## idumps_html
546
-
547
- `idumps_html(data, indent=None)`
548
-
549
- Serialisasi python variabel menjadi HTML.
550
- ```
551
- List -> <ul>...</ul>
552
- Dict -> <table>...</table>
553
- ```
554
-
555
- ```python
556
- data = {
557
- 'abc': 123,
558
- 'list': [1, 2, 3, 4, 5],
559
- 'dict': {'a': 1, 'b':2, 'c':3},
560
- }
561
- print(idumps_html(data))
562
- ```
563
-
564
- Output:
565
- ```py
566
- <table>
567
- <tbody>
568
- <tr>
569
- <th>abc</th>
570
- <td>
571
- <span>123</span>
572
- </td>
573
- </tr>
574
- <tr>
575
- <th>list</th>
576
- <td>
577
- <ul>
578
- <li>
579
- <span>1</span>
580
- </li>
581
- <li>
582
- <span>2</span>
583
- </li>
584
- <li>
585
- <span>3</span>
586
- </li>
587
- <li>
588
- <span>4</span>
589
- </li>
590
- <li>
591
- <span>5</span>
592
- </li>
593
- </ul>
594
- </td>
595
- </tr>
596
- <tr>
597
- <th>dict</th>
598
- <td>
599
- <table>
600
- <tbody>
601
- <tr>
602
- <th>a</th>
603
- <td>
604
- <span>1</span>
605
- </td>
606
- </tr>
607
- <tr>
608
- <th>b</th>
609
- <td>
610
- <span>2</span>
611
- </td>
612
- </tr>
613
- <tr>
614
- <th>c</th>
615
- <td>
616
- <span>3</span>
617
- </td>
618
- </tr>
619
- </tbody>
620
- </table>
621
- </td>
622
- </tr>
623
- </tbody>
624
- </table>
625
-
626
- ```
627
-
628
- ## ienv
629
-
630
- `ienv(on_windows=None, on_linux=None)`
631
-
632
- Mengambalikan hasil berdasarkan environment dimana program dijalankan
633
-
634
- ```py
635
- getch = __import__(ienv(on_windows="msvcrt", on_linux="getch"))
636
-
637
- inherit = ienv(
638
- on_windows=[BaseForWindows, BaseEnv, object],
639
- on_linux=[SpecialForLinux, BaseForLinux, BaseEnv, object]
640
- )
641
-
642
- class ExampleIEnv(*inherit):
643
- pass
644
- ```
645
-
646
- ## iexec
647
-
648
- `iexec(python_syntax, import_pypipr=True)`
649
-
650
- improve exec() python function untuk mendapatkan outputnya
651
-
652
- ```python
653
- print(iexec('print(9*9)'))
654
- ```
655
-
656
- Output:
657
- ```py
658
- 81
659
-
660
- ```
661
-
662
- ## ijoin
663
-
664
- `ijoin(iterable, separator='', start='', end='', remove_empty=False, recursive=True, recursive_flat=False, str_strip=False)`
665
-
666
- Simplify Python join functions like PHP function.
667
- Iterable bisa berupa sets, tuple, list, dictionary.
668
-
669
- ```python
670
- arr = {'asd','dfs','weq','qweqw'}
671
- print(ijoin(arr, ', '))
672
-
673
- arr = '/ini/path/seperti/url/'.split('/')
674
- print(ijoin(arr, ','))
675
- print(ijoin(arr, ',', remove_empty=True))
676
-
677
- arr = {'a':'satu', 'b':(12, 34, 56), 'c':'tiga', 'd':'empat'}
678
- print(ijoin(arr, separator='</li>\n<li>', start='<li>', end='</li>',
679
- recursive_flat=True))
680
- print(ijoin(arr, separator='</div>\n<div>', start='<div>', end='</div>'))
681
- print(ijoin(10, ' '))
682
- ```
683
-
684
- Output:
685
- ```py
686
- qweqw, dfs, asd, weq
687
- ,ini,path,seperti,url,
688
- ini,path,seperti,url
689
- <li>satu</li>
690
- <li>12</li>
691
- <li>34</li>
692
- <li>56</li>
693
- <li>tiga</li>
694
- <li>empat</li>
695
- <div>satu</div>
696
- <div><div>12</div>
697
- <div>34</div>
698
- <div>56</div></div>
699
- <div>tiga</div>
700
- <div>empat</div>
701
- 10
702
- ```
703
-
704
- ## iloads
705
-
706
- `iloads(data, syntax='yaml')`
707
-
708
- Mengubah string data hasil dari idumps menjadi variabel.
709
- String data adalah berupa syntax YAML.
710
-
711
- ```python
712
- data = {
713
- 'a': 123,
714
- 't': ['disini', 'senang', 'disana', 'senang'],
715
- 'l': (12, 23, [12, 42])
716
- }
717
- s = idumps(data)
718
- print(iloads(s))
719
- ```
720
-
721
- ## iloads_html
722
-
723
- `iloads_html(html)`
724
-
725
- Mengambil data yang berupa list `<ul>`, dan table `<table>` dari html
726
- dan menjadikannya data python berupa list.
727
- setiap data yang ditemukan akan dibungkus dengan tuple sebagai separator.
728
- ```
729
- list (<ul>) -> list -> list satu dimensi
730
- table (<table>) -> list[list] -> list satu dimensi didalam list
731
- ```
732
- apabila data berupa ul maka dapat dicek type(data) -> html_ul
733
- apabila data berupa ol maka dapat dicek type(data) -> html_ol
734
- apabila data berupa dl maka dapat dicek type(data) -> html_dl
735
- apabila data berupa table maka dapat dicek type(data) -> html_table
736
-
737
- ```python
738
- pprint.pprint(iloads_html(iopen("https://harga-emas.org/")), depth=10)
739
- pprint.pprint(iloads_html(iopen("https://harga-emas.org/1-gram/")), depth=10)
740
- ```
741
-
742
- ## input_char
743
-
744
- `input_char(prompt=None, prompt_ending='', newline_after_input=True, echo_char=True, default=None)`
745
-
746
- Meminta masukan satu huruf tanpa menekan Enter.
747
-
748
- ```py
749
- input_char("Input char : ")
750
- input_char("Input char : ", default='Y')
751
- input_char("Input Char without print : ", echo_char=False)
752
- ```
753
-
754
- ## iopen
755
-
756
- `iopen(path, data=None, regex=None, css_select=None, xpath=None, file_append=False)`
757
-
758
- Membaca atau Tulis pada path yang bisa merupakan FILE maupun URL.
759
-
760
- Baca File :
761
- - Membaca seluruh file.
762
- - Jika berhasil content dapat diparse dengan regex.
763
- - Apabila File berupa html, dapat diparse dengan css atau xpath.
764
-
765
- Tulis File :
766
- - Menulis pada file.
767
- - Jika file tidak ada maka akan dibuat.
768
- - Jika file memiliki content maka akan di overwrite.
769
-
770
- Membaca URL :
771
- - Mengakses URL dan mengembalikan isi html nya berupa teks.
772
- - Content dapat diparse dengan regex, css atau xpath.
773
-
774
- Tulis URL :
775
- - Mengirimkan data dengan metode POST ke url.
776
- - Jika berhasil dan response memiliki content, maka dapat diparse
777
- dengan regex, css atau xpath.
778
-
779
-
780
- ```python
781
- # FILE
782
- print(iopen("__iopen.txt", "mana aja"))
783
- print(iopen("__iopen.txt", regex="(\w+)"))
784
- # URL
785
- print(iopen("https://www.google.com/", css_select="a"))
786
- print(iopen("https://www.google.com/", dict(coba="dulu"), xpath="//a"))
787
- ```
788
-
789
- Output:
790
- ```py
791
- 8
792
- ['mana', 'aja']
793
- [<Element a at 0x770f001a90>, <Element a at 0x770f0494a0>, <Element a at 0x770f049540>, <Element a at 0x770f049590>, <Element a at 0x770f0495e0>, <Element a at 0x770f049630>, <Element a at 0x770f049680>, <Element a at 0x770f0496d0>, <Element a at 0x770f049720>, <Element a at 0x770f049770>, <Element a at 0x770f0497c0>, <Element a at 0x770f049810>, <Element a at 0x770f049860>, <Element a at 0x770f0498b0>, <Element a at 0x770f049900>, <Element a at 0x770f049950>, <Element a at 0x770f0499a0>, <Element a at 0x770f0499f0>]
794
- False
795
- ```
796
-
797
- ## iprint
798
-
799
- `iprint(*args, color=None, sort_dicts=False, **kwargs)`
800
-
801
- Improve print function dengan menambahkan color dan pretty print
802
- Color menggunakan colorama Fore + Back + Style
803
-
804
- ```python
805
- iprint(
806
- 'yang ini',
807
- {'12':12,'sdsd':{'12':21,'as':[88]}},
808
- color=colorama.Fore.BLUE + colorama.Style.BRIGHT
809
- )
810
- ```
811
-
812
- ## irange
813
-
814
- `irange(start, finish, step=1)`
815
-
816
- Meningkatkan fungsi range() dari python untuk pengulangan menggunakan huruf
817
-
818
- ```python
819
- print(irange('a', 'c'))
820
- print(irange('z', 'a', 10))
821
- print(list(irange('a', 'z', 10)))
822
- print(list(irange(1, '7')))
823
- print(list(irange(10, 5)))
824
- ```
825
-
826
- Output:
827
- ```py
828
- <generator object irange at 0x77171e3bc0>
829
- <generator object irange at 0x77171e3bc0>
830
- ['a', 'k', 'u']
831
- [1, 2, 3, 4, 5, 6, 7]
832
- [10, 9, 8, 7, 6, 5]
833
- ```
834
-
835
- ## ireplace
836
-
837
- `ireplace(string: str, replacements: dict, flags=re.IGNORECASE|re.MULTILINE|re.DOTALL)`
838
-
839
- STRing TRanslate mengubah string menggunakan kamus dari dict.
840
- Replacement dapat berupa text biasa ataupun regex pattern.
841
- Apabila replacement berupa regex, gunakan raw string `r"..."`
842
- Untuk regex capturing gunakan `(...)`, dan untuk mengaksesnya
843
- gunakan `\1`, `\2`, .., dst.
844
-
845
- ```python
846
- text = 'aku ini mau ke sini'
847
- replacements = {
848
- "sini": "situ",
849
- r"(ini)": r"itu dan \1",
850
- }
851
- print(ireplace(text, replacements))
852
- ```
853
-
854
- Output:
855
- ```py
856
- aku itu dan ini mau ke situ
857
- ```
858
-
859
- ## is_empty
860
-
861
- `is_empty(variable, empty=[None, False, 0, 0, '0', '', '-0', '\n', '\t', set(), {}, [], ()])`
862
-
863
- Mengecek apakah variable setara dengan nilai kosong pada empty.
864
-
865
- Pengecekan nilai yang setara menggunakan simbol '==', sedangkan untuk
866
- pengecekan lokasi memory yang sama menggunakan keyword 'is'
867
-
868
- ```python
869
- print(is_empty("teks"))
870
- print(is_empty(True))
871
- print(is_empty(False))
872
- print(is_empty(None))
873
- print(is_empty(0))
874
- print(is_empty([]))
875
- ```
876
-
877
- Output:
878
- ```py
879
- False
880
- False
881
- True
882
- True
883
- True
884
- True
885
- ```
886
-
887
- ## is_iterable
888
-
889
- `is_iterable(var, str_is_iterable=False)`
890
-
891
- Mengecek apakah suatu variabel bisa dilakukan forloop atau tidak
892
-
893
- ```python
894
- s = 'ini string'
895
- print(is_iterable(s))
896
-
897
- l = [12,21,2,1]
898
- print(is_iterable(l))
899
-
900
- r = range(100)
901
- print(is_iterable(r))
902
-
903
- d = {'a':1, 'b':2}
904
- print(is_iterable(d.values()))
905
- ```
906
-
907
- Output:
908
- ```py
909
- False
910
- True
911
- True
912
- True
913
- ```
914
-
915
- ## is_valid_url
916
-
917
- `is_valid_url(path)`
918
-
919
- Mengecek apakah path merupakan URL yang valid atau tidak.
920
- Cara ini merupakan cara yang paling efektif.
921
-
922
- ```python
923
- print(is_valid_url("https://chat.openai.com/?model=text-davinci-002-render-sha"))
924
- print(is_valid_url("https://chat.openai.com/?model/=text-dav/inci-002-render-sha"))
925
- ```
926
-
927
- Output:
928
- ```py
929
- True
930
- True
931
- ```
932
-
933
- ## iscandir
934
-
935
- `iscandir(folder_name='.', glob_pattern='*', recursive=True, scan_file=True, scan_folder=True)`
936
-
937
- Mempermudah scandir untuk mengumpulkan folder dan file.
938
-
939
- ```python
940
- print(iscandir())
941
- print(list(iscandir("./", recursive=False, scan_file=False)))
942
- ```
943
-
944
- Output:
945
- ```py
946
- <generator object iscandir at 0x771719d340>
947
- [PosixPath('.git'), PosixPath('.vscode'), PosixPath('pypipr')]
948
- ```
949
-
950
- ## isplit
951
-
952
- `isplit(text, separator='', include_separator=False)`
953
-
954
- Memecah text menjadi list berdasarkan separator.
955
-
956
- ```python
957
- t = '/ini/contoh/path/'
958
- print(isplit(t, separator='/'))
959
- ```
960
-
961
- Output:
962
- ```py
963
- ['', 'ini', 'contoh', 'path', '']
964
- ```
965
-
966
- ## log
967
-
968
- `log(text=None)`
969
-
970
- Decorator untuk mempermudah pembuatan log karena tidak perlu mengubah
971
- fungsi yg sudah ada.
972
- Melakukan print ke console untuk menginformasikan proses yg sedang
973
- berjalan didalam program.
974
-
975
- ```py
976
- @log
977
- def some_function():
978
- pass
979
-
980
- @log()
981
- def some_function_again():
982
- pass
983
-
984
- @log("Calling some function")
985
- def some_function_more():
986
- pass
987
-
988
- some_function()
989
- some_function_again()
990
- some_function_more()
991
- ```
992
-
993
- ## password_generator
994
-
995
- `password_generator(length=8, characters='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~')`
996
-
997
- Membuat pssword secara acak
998
-
999
- ```python
1000
- print(password_generator())
1001
- ```
1002
-
1003
- Output:
1004
- ```py
1005
- -G@$5;Lo
1006
- ```
1007
-
1008
- ## pip_freeze_without_version
1009
-
1010
- `pip_freeze_without_version(filename=None)`
1011
-
1012
- Memberikan list dari dependencies yang terinstall tanpa version.
1013
- Bertujuan untuk menggunakan Batteries Included Python.
1014
-
1015
- ```py
1016
- print(pip_freeze_without_version())
1017
- ```
1018
-
1019
- ## poetry_publish
1020
-
1021
- `poetry_publish(token=None)`
1022
-
1023
- Publish project to pypi,org
1024
-
1025
- ```py
1026
- poetry_publish()
1027
- ```
1028
-
1029
- ## poetry_update_version
1030
-
1031
- `poetry_update_version(mayor=False, minor=False, patch=False)`
1032
-
1033
- Update versi pada pyproject.toml menggunakan poetry
1034
-
1035
- ```py
1036
- poetry_update_version()
1037
- ```
1038
-
1039
- ## print_colorize
1040
-
1041
- `print_colorize(text, color='\x1b[32m', bright='\x1b[1m', color_end='\x1b[0m', text_start='', text_end='\n')`
1042
-
1043
- Print text dengan warna untuk menunjukan text penting
1044
-
1045
- ```py
1046
- print_colorize("Print some text")
1047
- print_colorize("Print some text", color=colorama.Fore.RED)
1048
- ```
1049
-
1050
- ## print_dir
1051
-
1052
- `print_dir(var, colorize=True)`
1053
-
1054
- Print property dan method yang tersedia pada variabel
1055
-
1056
- ```python
1057
- p = pathlib.Path("https://www.google.com/")
1058
- print_dir(p, colorize=False)
1059
- ```
1060
-
1061
- ## print_log
1062
-
1063
- `print_log(text)`
1064
-
1065
- Akan melakukan print ke console.
1066
- Berguna untuk memberikan informasi proses program yg sedang berjalan.
1067
-
1068
- ```py
1069
- print_log("Standalone Log")
1070
- ```
1071
-
1072
- ## print_to_last_line
1073
-
1074
- `print_to_last_line(text: str)`
1075
-
1076
- Melakukan print ke konsol tetapi akan menimpa baris terakhir.
1077
- Berguna untuk memberikan progress secara interaktif.
1078
-
1079
- ```python
1080
- c = input("masukkan apa saja : ")
1081
- print_to_last_line(f"masukkan apa saja : {c} [ok]")
1082
- ```
1083
-
1084
- Output:
1085
- ```py
1086
- masukkan apa saja : masukkan apa saja : 2 [ok]
1087
- ```
1088
-
1089
- ## random_bool
1090
-
1091
- `random_bool()`
1092
-
1093
- Menghasilkan nilai random True atau False.
1094
- Fungsi ini merupakan fungsi tercepat untuk mendapatkan random bool.
1095
- Fungsi ini sangat cepat, tetapi pemanggilan fungsi ini membutuhkan
1096
- overhead yg besar.
1097
-
1098
- ```python
1099
- print(random_bool())
1100
- ```
1101
-
1102
- Output:
1103
- ```py
1104
- True
1105
- ```
1106
-
1107
- ## set_timeout
1108
-
1109
- `set_timeout(interval, func, args=None, kwargs=None)`
1110
-
1111
- Menjalankan fungsi ketika sudah sekian detik.
1112
- Apabila timeout masih berjalan tapi kode sudah selesai dieksekusi semua, maka
1113
- program tidak akan berhenti sampai timeout selesai, kemudian fungsi dijalankan,
1114
- kemudian program dihentikan.
1115
-
1116
- ```python
1117
- set_timeout(3, lambda: print("Timeout 3"))
1118
- x = set_timeout(7, print, args=["Timeout 7"])
1119
- print(x)
1120
- print("menghentikan timeout 7")
1121
- x.cancel()
1122
- ```
1123
-
1124
- Output:
1125
- ```py
1126
- <Timer(Thread-2, started 511325486320)>
1127
- menghentikan timeout 7
1128
- ```
1129
-
1130
- ## sets_ordered
1131
-
1132
- `sets_ordered(iterator)`
1133
-
1134
- Hanya mengambil nilai unik dari suatu list
1135
-
1136
- ```python
1137
- array = [2, 3, 12, 3, 3, 42, 42, 1, 43, 2, 42, 41, 4, 24, 32, 42, 3, 12, 32, 42, 42]
1138
- print(sets_ordered(array))
1139
- print(list(sets_ordered(array)))
1140
- ```
1141
-
1142
- Output:
1143
- ```py
1144
- <generator object sets_ordered at 0x771720a9b0>
1145
- [2, 3, 12, 42, 1, 43, 41, 4, 24, 32]
1146
- ```
1147
-
1148
- ## str_cmp
1149
-
1150
- `str_cmp(t1, t2)`
1151
-
1152
- Membandingakan string secara incase-sensitive menggunakan lower().
1153
- Lebih cepat dibandingkan upper(), casefold(), re.fullmatch(), len().
1154
- perbandingan ini sangat cepat, tetapi pemanggilan fungsi ini membutuhkan
1155
- overhead yg besar.
1156
-
1157
- ```python
1158
- print(str_cmp('teks1', 'Teks1'))
1159
- ```
1160
-
1161
- Output:
1162
- ```py
1163
- True
1164
- ```
1165
-
1166
- ## text_colorize
1167
-
1168
- `text_colorize(text, color='\x1b[32m', bright='\x1b[1m', color_end='\x1b[0m')`
1169
-
1170
- return text dengan warna untuk menunjukan text penting
1171
-
1172
- ```py
1173
- text_colorize("Print some text")
1174
- text_colorize("Print some text", color=colorama.Fore.RED)
1175
- ```
1176
-
1177
- ## to_str
1178
-
1179
- `to_str(value)`
1180
-
1181
- Mengubah value menjadi string literal
1182
-
1183
- ```python
1184
- print(to_str(5))
1185
- print(to_str([]))
1186
- print(to_str(False))
1187
- print(to_str(True))
1188
- print(to_str(None))
1189
- ```
1190
-
1191
- Output:
1192
- ```py
1193
- 5
1194
-
1195
- False
1196
- True
1197
-
1198
- ```
1199
-
1200
- # CLASS
1201
-
1202
- ## APIMixinView
1203
-
1204
- `APIMixinView`
1205
-
1206
- APIView adalah class view untuk membuat Website API
1207
- Cara kerjanya adalah dengan menggunakan variabel GET untuk menerima data.
1208
-
1209
- Class ini tidak bisa digunakan sendiri.
1210
- Class ini harus menjadi mixin Class View karena perlu trigger untuk
1211
- memanggil method get().
1212
-
1213
- ```py
1214
- class ExampleAPIView(APIMixinView, View):
1215
- pass
1216
- ```
1217
-
1218
- ## ComparePerformance
1219
-
1220
- `ComparePerformance`
1221
-
1222
- Menjalankan seluruh method dalam class,
1223
- Kemudian membandingkan waktu yg diperlukan.
1224
- Nilai 100 berarti yang tercepat.
1225
-
1226
- ```python
1227
- class ExampleComparePerformance(ComparePerformance):
1228
- # number = 1
1229
- z = 10
1230
-
1231
- def a(self):
1232
- return (x for x in range(self.z))
1233
-
1234
- def b(self):
1235
- return tuple(x for x in range(self.z))
1236
-
1237
- def c(self):
1238
- return [x for x in range(self.z)]
1239
-
1240
- def d(self):
1241
- return list(x for x in range(self.z))
1242
-
1243
- pprint.pprint(ExampleComparePerformance().compare_result(), depth=100)
1244
- print(ExampleComparePerformance().compare_performance())
1245
- print(ExampleComparePerformance().compare_performance())
1246
- print(ExampleComparePerformance().compare_performance())
1247
- print(ExampleComparePerformance().compare_performance())
1248
- print(ExampleComparePerformance().compare_performance())
1249
- ```
1250
-
1251
- ## PintUregQuantity
1252
-
1253
- `PintUregQuantity`
1254
-
1255
- ## RunParallel
1256
-
1257
- `RunParallel`
1258
-
1259
- Menjalankan program secara bersamaan.
1260
-
1261
- - `class RunParallel` didesain hanya untuk pemrosesan data saja.
1262
- - Penggunaannya `class RunParallel` dengan cara membuat instance
1263
- sub class beserta data yg akan diproses, kemudian panggil fungsi
1264
- yg dipilih `run_asyncio / run_multi_threading / run_multi_processing`,
1265
- kemudian dapatkan hasilnya.
1266
- - `class RunParallel` tidak didesain untuk menyimpan data, karena
1267
- setiap module terutama module `multiprocessing` tidak dapat mengakses
1268
- data kelas dari proses yg berbeda.
1269
- - Semua methods akan dijalankan secara paralel kecuali method dengan
1270
- nama yg diawali underscore `_`
1271
- - Method untuk multithreading/multiprocessing harus memiliki 2
1272
- parameter, yaitu: `result: dict` dan `q: queue.Queue`. Parameter
1273
- `result` digunakan untuk memberikan return value dari method, dan
1274
- Parameter `q` digunakan untuk mengirim data antar proses.
1275
- - Method untuk asyncio harus menggunakan keyword `async def`, dan
1276
- untuk perpindahan antar kode menggunakan `await asyncio.sleep(0)`,
1277
- dan keyword `return` untuk memberikan return value.
1278
- - Return Value berupa dictionary dengan key adalah nama function,
1279
- dan value adalah return value dari setiap fungsi
1280
- - Menjalankan Multiprocessing harus berada dalam blok
1281
- `if __name__ == "__main__":` karena area global pada program akan
1282
- diproses lagi. Terutama pada sistem operasi windows.
1283
- - `run_asyncio()` akan menjalankan kode dalam satu program, hanya
1284
- saja alur program dapat berpindah-pindah menggunkan
1285
- `await asyncio.sleep(0)`.
1286
- - `run_multi_threading()` akan menjalankan program dalam satu CPU,
1287
- hanya saja dalam thread yang berbeda. Walaupun tidak benar-benar
1288
- berjalan secara bersamaan namun bisa meningkatkan kecepatan
1289
- penyelesaian program, dan dapat saling mengakses resource antar
1290
- program. Akses resource antar program bisa secara langsung maupun
1291
- menggunakan parameter yang sudah disediakan yaitu `result: dict`
1292
- dan `q: queue.Queue`.
1293
- - `run_multi_processing()` akan menjalankan program dengan beberapa
1294
- CPU. Program akan dibuatkan environment sendiri yang terpisah dari
1295
- program induk. Keuntungannya adalah program dapat benar-benar berjalan
1296
- bersamaan, namun tidak dapat saling mengakses resource secara langsung.
1297
- Akses resource menggunakan parameter yang sudah disediakan yaitu
1298
- `result: dict` dan `q: queue.Queue`.
1299
-
1300
- ```python
1301
- class ExampleRunParallel(RunParallel):
1302
- z = "ini"
1303
-
1304
- def __init__(self) -> None:
1305
- self.pop = random.randint(0, 100)
1306
-
1307
- def _set_property_here(self, v):
1308
- self.prop = v
1309
-
1310
- def a(self, result: dict, q: queue.Queue):
1311
- result["z"] = self.z
1312
- result["pop"] = self.pop
1313
- result["a"] = "a"
1314
- q.put("from a 1")
1315
- q.put("from a 2")
1316
-
1317
- def b(self, result: dict, q: queue.Queue):
1318
- result["z"] = self.z
1319
- result["pop"] = self.pop
1320
- result["b"] = "b"
1321
- result["q_get"] = q.get()
1322
-
1323
- def c(self, result: dict, q: queue.Queue):
1324
- result["z"] = self.z
1325
- result["pop"] = self.pop
1326
- result["c"] = "c"
1327
- result["q_get"] = q.get()
1328
-
1329
- async def d(self):
1330
- print("hello")
1331
- await asyncio.sleep(0)
1332
- print("hello")
1333
-
1334
- result = {}
1335
- result["z"] = self.z
1336
- result["pop"] = self.pop
1337
- result["d"] = "d"
1338
- return result
1339
-
1340
- async def e(self):
1341
- print("world")
1342
- await asyncio.sleep(0)
1343
- print("world")
1344
-
1345
- result = {}
1346
- result["z"] = self.z
1347
- result["pop"] = self.pop
1348
- result["e"] = "e"
1349
- return result
1350
-
1351
- if __name__ == "__main__":
1352
- print(ExampleRunParallel().run_asyncio())
1353
- print(ExampleRunParallel().run_multi_threading())
1354
- print(ExampleRunParallel().run_multi_processing())
1355
- ```
1356
-