halib 0.2.30__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.
- halib/__init__.py +94 -0
- halib/common/__init__.py +0 -0
- halib/common/common.py +326 -0
- halib/common/rich_color.py +285 -0
- halib/common.py +151 -0
- halib/csvfile.py +48 -0
- halib/cuda.py +39 -0
- halib/dataset.py +209 -0
- halib/exp/__init__.py +0 -0
- halib/exp/core/__init__.py +0 -0
- halib/exp/core/base_config.py +167 -0
- halib/exp/core/base_exp.py +147 -0
- halib/exp/core/param_gen.py +170 -0
- halib/exp/core/wandb_op.py +117 -0
- halib/exp/data/__init__.py +0 -0
- halib/exp/data/dataclass_util.py +41 -0
- halib/exp/data/dataset.py +208 -0
- halib/exp/data/torchloader.py +165 -0
- halib/exp/perf/__init__.py +0 -0
- halib/exp/perf/flop_calc.py +190 -0
- halib/exp/perf/gpu_mon.py +58 -0
- halib/exp/perf/perfcalc.py +470 -0
- halib/exp/perf/perfmetrics.py +137 -0
- halib/exp/perf/perftb.py +778 -0
- halib/exp/perf/profiler.py +507 -0
- halib/exp/viz/__init__.py +0 -0
- halib/exp/viz/plot.py +754 -0
- halib/filesys.py +117 -0
- halib/filetype/__init__.py +0 -0
- halib/filetype/csvfile.py +192 -0
- halib/filetype/ipynb.py +61 -0
- halib/filetype/jsonfile.py +19 -0
- halib/filetype/textfile.py +12 -0
- halib/filetype/videofile.py +266 -0
- halib/filetype/yamlfile.py +87 -0
- halib/gdrive.py +179 -0
- halib/gdrive_mkdir.py +41 -0
- halib/gdrive_test.py +37 -0
- halib/jsonfile.py +22 -0
- halib/listop.py +13 -0
- halib/online/__init__.py +0 -0
- halib/online/gdrive.py +229 -0
- halib/online/gdrive_mkdir.py +53 -0
- halib/online/gdrive_test.py +50 -0
- halib/online/projectmake.py +131 -0
- halib/online/tele_noti.py +165 -0
- halib/plot.py +301 -0
- halib/projectmake.py +115 -0
- halib/research/__init__.py +0 -0
- halib/research/base_config.py +100 -0
- halib/research/base_exp.py +157 -0
- halib/research/benchquery.py +131 -0
- halib/research/core/__init__.py +0 -0
- halib/research/core/base_config.py +144 -0
- halib/research/core/base_exp.py +157 -0
- halib/research/core/param_gen.py +108 -0
- halib/research/core/wandb_op.py +117 -0
- halib/research/data/__init__.py +0 -0
- halib/research/data/dataclass_util.py +41 -0
- halib/research/data/dataset.py +208 -0
- halib/research/data/torchloader.py +165 -0
- halib/research/dataset.py +208 -0
- halib/research/flop_csv.py +34 -0
- halib/research/flops.py +156 -0
- halib/research/metrics.py +137 -0
- halib/research/mics.py +74 -0
- halib/research/params_gen.py +108 -0
- halib/research/perf/__init__.py +0 -0
- halib/research/perf/flop_calc.py +190 -0
- halib/research/perf/gpu_mon.py +58 -0
- halib/research/perf/perfcalc.py +363 -0
- halib/research/perf/perfmetrics.py +137 -0
- halib/research/perf/perftb.py +778 -0
- halib/research/perf/profiler.py +301 -0
- halib/research/perfcalc.py +361 -0
- halib/research/perftb.py +780 -0
- halib/research/plot.py +758 -0
- halib/research/profiler.py +300 -0
- halib/research/torchloader.py +162 -0
- halib/research/viz/__init__.py +0 -0
- halib/research/viz/plot.py +754 -0
- halib/research/wandb_op.py +116 -0
- halib/rich_color.py +285 -0
- halib/sys/__init__.py +0 -0
- halib/sys/cmd.py +8 -0
- halib/sys/filesys.py +124 -0
- halib/system/__init__.py +0 -0
- halib/system/_list_pc.csv +6 -0
- halib/system/cmd.py +8 -0
- halib/system/filesys.py +164 -0
- halib/system/path.py +106 -0
- halib/tele_noti.py +166 -0
- halib/textfile.py +13 -0
- halib/torchloader.py +162 -0
- halib/utils/__init__.py +0 -0
- halib/utils/dataclass_util.py +40 -0
- halib/utils/dict.py +317 -0
- halib/utils/dict_op.py +9 -0
- halib/utils/gpu_mon.py +58 -0
- halib/utils/list.py +17 -0
- halib/utils/listop.py +13 -0
- halib/utils/slack.py +86 -0
- halib/utils/tele_noti.py +166 -0
- halib/utils/video.py +82 -0
- halib/videofile.py +139 -0
- halib-0.2.30.dist-info/METADATA +237 -0
- halib-0.2.30.dist-info/RECORD +110 -0
- halib-0.2.30.dist-info/WHEEL +5 -0
- halib-0.2.30.dist-info/licenses/LICENSE.txt +17 -0
- halib-0.2.30.dist-info/top_level.txt +1 -0
halib/utils/video.py
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import cv2
|
|
3
|
+
from ..filetype import csvfile
|
|
4
|
+
from ..system import filesys as fs
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class VideoUtils:
|
|
8
|
+
|
|
9
|
+
@staticmethod
|
|
10
|
+
def _default_meta_extractor(video_path):
|
|
11
|
+
"""Default video metadata extractor function."""
|
|
12
|
+
# Open the video file
|
|
13
|
+
cap = cv2.VideoCapture(video_path)
|
|
14
|
+
|
|
15
|
+
# Check if the video was opened successfully
|
|
16
|
+
if not cap.isOpened():
|
|
17
|
+
print(f"Error: Could not open video file {video_path}")
|
|
18
|
+
return None
|
|
19
|
+
|
|
20
|
+
# Get the frame count
|
|
21
|
+
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
22
|
+
|
|
23
|
+
# Get the FPS
|
|
24
|
+
fps = cap.get(cv2.CAP_PROP_FPS)
|
|
25
|
+
|
|
26
|
+
# get frame size
|
|
27
|
+
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
28
|
+
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
29
|
+
|
|
30
|
+
# Release the video capture object
|
|
31
|
+
cap.release()
|
|
32
|
+
|
|
33
|
+
meta_dict = {
|
|
34
|
+
"video_path": video_path,
|
|
35
|
+
"width": width,
|
|
36
|
+
"height": height,
|
|
37
|
+
"frame_count": frame_count,
|
|
38
|
+
"fps": fps
|
|
39
|
+
}
|
|
40
|
+
return meta_dict
|
|
41
|
+
|
|
42
|
+
@staticmethod
|
|
43
|
+
def get_video_meta_dict(video_path, meta_dict_extractor_func=None):
|
|
44
|
+
assert os.path.exists(video_path), f"Video file {video_path} does not exist"
|
|
45
|
+
if meta_dict_extractor_func and callable(meta_dict_extractor_func):
|
|
46
|
+
assert meta_dict_extractor_func.__code__.co_argcount == 1, "meta_dict_extractor_func must take exactly one argument (video_path)"
|
|
47
|
+
meta_dict = meta_dict_extractor_func(video_path)
|
|
48
|
+
assert isinstance(meta_dict, dict), "meta_dict_extractor_func must return a dictionary"
|
|
49
|
+
assert 'video_path' in meta_dict, "meta_dict must contain 'video_path'"
|
|
50
|
+
else:
|
|
51
|
+
meta_dict = VideoUtils._default_meta_extractor(video_path=video_path)
|
|
52
|
+
return meta_dict
|
|
53
|
+
@staticmethod
|
|
54
|
+
def get_video_dir_meta_df(video_dir, video_exts=['.mp4', '.avi', '.mov', '.mkv'], search_recursive=False, csv_outfile=None):
|
|
55
|
+
assert os.path.exists(video_dir), f"Video directory {video_dir} does not exist"
|
|
56
|
+
video_files = fs.filter_files_by_extension(video_dir, video_exts, recursive=search_recursive)
|
|
57
|
+
assert len(video_files) > 0, f"No video files found in {video_dir} with extensions {video_exts}"
|
|
58
|
+
video_meta_list = []
|
|
59
|
+
for vfile in video_files:
|
|
60
|
+
meta_dict = VideoUtils.get_video_meta_dict(vfile)
|
|
61
|
+
if meta_dict:
|
|
62
|
+
video_meta_list.append(meta_dict)
|
|
63
|
+
dfmk = csvfile.DFCreator()
|
|
64
|
+
columns = list(video_meta_list[0].keys())
|
|
65
|
+
assert len(columns) > 0, "No video metadata found"
|
|
66
|
+
assert 'video_path' in columns, "video_path column not found in video metadata"
|
|
67
|
+
# move video_path to the first column
|
|
68
|
+
columns.remove('video_path')
|
|
69
|
+
columns.insert(0, 'video_path')
|
|
70
|
+
dfmk.create_table("video_meta", columns)
|
|
71
|
+
rows = [[meta[col] for col in columns] for meta in video_meta_list]
|
|
72
|
+
dfmk.insert_rows("video_meta", rows)
|
|
73
|
+
dfmk.fill_table_from_row_pool("video_meta")
|
|
74
|
+
|
|
75
|
+
if csv_outfile:
|
|
76
|
+
dfmk["video_meta"].to_csv(csv_outfile, index=False, sep=";")
|
|
77
|
+
return dfmk["video_meta"].copy()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
halib/videofile.py
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
import cv2
|
|
4
|
+
import enlighten
|
|
5
|
+
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
|
|
6
|
+
from tube_dl import Youtube, Playlist
|
|
7
|
+
|
|
8
|
+
from halib.system import filesys
|
|
9
|
+
from halib.filetype import textfile
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class VideoResolution(Enum):
|
|
13
|
+
VR480p = '720x480'
|
|
14
|
+
VR576p = '1280x720'
|
|
15
|
+
VR720p_hd = '1280x720'
|
|
16
|
+
VR1080p_full_hd = '1920x1080 '
|
|
17
|
+
VR4K_uhd = '3840x2160'
|
|
18
|
+
VR8K_uhd = '7680x4320'
|
|
19
|
+
|
|
20
|
+
def __str__(self):
|
|
21
|
+
return '%s' % self.value
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_video_resolution_size(video_resolution):
|
|
25
|
+
separator = 'x'
|
|
26
|
+
resolution_str = str(video_resolution)
|
|
27
|
+
info_arr = resolution_str.split(separator)
|
|
28
|
+
width, height = int(info_arr[0]), int(info_arr[1])
|
|
29
|
+
return width, height
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def get_videos_by_resolution(directory, video_resolution,
|
|
33
|
+
video_ext='mp4', include_better=True):
|
|
34
|
+
video_paths = filesys.filter_files_by_extension(directory, video_ext)
|
|
35
|
+
filtered_video_paths = []
|
|
36
|
+
for path in video_paths:
|
|
37
|
+
vid = cv2.VideoCapture(path)
|
|
38
|
+
height = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
|
|
39
|
+
width = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
|
|
40
|
+
valid = False
|
|
41
|
+
video_width, video_height = get_video_resolution_size(video_resolution)
|
|
42
|
+
if not include_better:
|
|
43
|
+
if width == video_width and height == video_height:
|
|
44
|
+
valid = True
|
|
45
|
+
else:
|
|
46
|
+
if width >= video_width and height >= video_height:
|
|
47
|
+
valid = True
|
|
48
|
+
|
|
49
|
+
if valid:
|
|
50
|
+
filtered_video_paths.append(path)
|
|
51
|
+
return filtered_video_paths
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# time in seconds
|
|
55
|
+
def trim_video(source, destination, start_time, end_time):
|
|
56
|
+
ffmpeg_extract_subclip(source, start_time, end_time, targetname=destination)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
progress_bar = None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def on_progress(bytes_done, total_bytes):
|
|
63
|
+
global progress_bar
|
|
64
|
+
if progress_bar is None:
|
|
65
|
+
progress_bar = enlighten.get_manager().counter(total=20, desc="Downloading", unit="byte", color="blue")
|
|
66
|
+
|
|
67
|
+
progress_bar.total = total_bytes
|
|
68
|
+
progress_bar.count = bytes_done
|
|
69
|
+
progress_bar.update(incr=0)
|
|
70
|
+
# print(bytes_done)
|
|
71
|
+
if bytes_done >= total_bytes:
|
|
72
|
+
progress_bar.close()
|
|
73
|
+
progress_bar = None
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def get_youtube_url(full_url_or_video_code):
|
|
77
|
+
if 'youtube' in full_url_or_video_code:
|
|
78
|
+
url = full_url_or_video_code
|
|
79
|
+
else:
|
|
80
|
+
url = f'https://youtube.com/watch?v={full_url_or_video_code}'
|
|
81
|
+
return url
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def download_yt_video(full_url_or_video_code, save_folder='./',
|
|
85
|
+
report_progress=False, video_idx='1', total_video='1'):
|
|
86
|
+
url = get_youtube_url(full_url_or_video_code)
|
|
87
|
+
filesys.make_dir(save_folder)
|
|
88
|
+
filesys.change_current_dir(save_folder)
|
|
89
|
+
try:
|
|
90
|
+
yt = Youtube(url)
|
|
91
|
+
title_en = yt.title.encode('ascii', 'ignore')
|
|
92
|
+
file_download = yt.formats.first()
|
|
93
|
+
if report_progress:
|
|
94
|
+
print(f'\n[{video_idx}/{total_video}][DOWNLOAD]{title_en}')
|
|
95
|
+
file_download.download(onprogress=on_progress, skip_existing=True)
|
|
96
|
+
except TypeError:
|
|
97
|
+
print(f'[ERROR] download {url}')
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def download_playlist(playlist_url, save_folder='./',
|
|
101
|
+
report_progress=False,
|
|
102
|
+
start_pattern=None):
|
|
103
|
+
print(f'[DOWNLOAD PLAYLIST] {playlist_url}')
|
|
104
|
+
pl = Playlist(playlist_url).videos
|
|
105
|
+
total_video = len(pl)
|
|
106
|
+
should_start = False
|
|
107
|
+
url = None
|
|
108
|
+
count = 0
|
|
109
|
+
for idx, code in enumerate(pl):
|
|
110
|
+
try:
|
|
111
|
+
url = f'https://youtube.com/watch?v={code}'
|
|
112
|
+
yt = Youtube(url)
|
|
113
|
+
count += 1
|
|
114
|
+
if start_pattern is None:
|
|
115
|
+
should_start = True
|
|
116
|
+
elif start_pattern in yt.title:
|
|
117
|
+
should_start = True
|
|
118
|
+
if should_start:
|
|
119
|
+
download_yt_video(url, save_folder, report_progress,
|
|
120
|
+
video_idx=str(count),
|
|
121
|
+
total_video=str(total_video))
|
|
122
|
+
|
|
123
|
+
except TypeError:
|
|
124
|
+
print(f'[ERROR] download {url}')
|
|
125
|
+
enlighten.get_manager().stop()
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
# Pntt https://www.youtube.com/playlist?list=PLYaaU301HUe06Zlf3qv9q2dnVulj35gOb
|
|
129
|
+
# Format line: playlist_save_folder_path [SPACE] playlist_url
|
|
130
|
+
def download_multiple_playlist_in_files(text_file, report_progress=False):
|
|
131
|
+
playlists = textfile.read_line_by_line(text_file)
|
|
132
|
+
for folder_plUrl in playlists:
|
|
133
|
+
folder = folder_plUrl.split()[0]
|
|
134
|
+
plUrl = folder_plUrl.split()[1]
|
|
135
|
+
download_playlist(plUrl, save_folder=folder, report_progress=report_progress)
|
|
136
|
+
|
|
137
|
+
# test code
|
|
138
|
+
# pl = 'https://youtube.com/playlist?list=PLYaaU301HUe03PabLEGbMGB8nhHgq58Zr'
|
|
139
|
+
# download_playlist(pl, './test', report_progress=True)
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: halib
|
|
3
|
+
Version: 0.2.30
|
|
4
|
+
Summary: Small library for common tasks
|
|
5
|
+
Author: Hoang Van Ha
|
|
6
|
+
Author-email: hoangvanhauit@gmail.com
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Requires-Python: >=3.9
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
License-File: LICENSE.txt
|
|
13
|
+
Requires-Dist: arrow
|
|
14
|
+
Requires-Dist: click
|
|
15
|
+
Requires-Dist: dataclass-wizard
|
|
16
|
+
Requires-Dist: enlighten
|
|
17
|
+
Requires-Dist: itables
|
|
18
|
+
Requires-Dist: kaleido
|
|
19
|
+
Requires-Dist: loguru
|
|
20
|
+
Requires-Dist: matplotlib
|
|
21
|
+
Requires-Dist: more-itertools
|
|
22
|
+
Requires-Dist: moviepy
|
|
23
|
+
Requires-Dist: networkx
|
|
24
|
+
Requires-Dist: numpy
|
|
25
|
+
Requires-Dist: omegaconf
|
|
26
|
+
Requires-Dist: opencv-python
|
|
27
|
+
Requires-Dist: pandas
|
|
28
|
+
Requires-Dist: Pillow
|
|
29
|
+
Requires-Dist: plotly
|
|
30
|
+
Requires-Dist: Pyarrow
|
|
31
|
+
Requires-Dist: pycurl
|
|
32
|
+
Requires-Dist: pygwalker
|
|
33
|
+
Requires-Dist: python-telegram-bot
|
|
34
|
+
Requires-Dist: requests
|
|
35
|
+
Requires-Dist: rich
|
|
36
|
+
Requires-Dist: scikit-learn
|
|
37
|
+
Requires-Dist: seaborn
|
|
38
|
+
Requires-Dist: tabulate
|
|
39
|
+
Requires-Dist: timebudget
|
|
40
|
+
Requires-Dist: tqdm
|
|
41
|
+
Requires-Dist: tube_dl
|
|
42
|
+
Requires-Dist: wandb
|
|
43
|
+
Requires-Dist: ipynbname
|
|
44
|
+
Requires-Dist: typed-argument-parser
|
|
45
|
+
Requires-Dist: slack_sdk
|
|
46
|
+
Dynamic: author
|
|
47
|
+
Dynamic: author-email
|
|
48
|
+
Dynamic: classifier
|
|
49
|
+
Dynamic: description
|
|
50
|
+
Dynamic: description-content-type
|
|
51
|
+
Dynamic: license-file
|
|
52
|
+
Dynamic: requires-dist
|
|
53
|
+
Dynamic: requires-python
|
|
54
|
+
Dynamic: summary
|
|
55
|
+
|
|
56
|
+
# 📦 Helper Package for Coding and Automation Changelog
|
|
57
|
+
|
|
58
|
+
## v0.2.x (Experiment & Core Updates)
|
|
59
|
+
|
|
60
|
+
### **v0.2.30**
|
|
61
|
+
|
|
62
|
+
- ✨ **New Feature:**: add `common.common.log_func` as decorator to log function entry, exit, with execution time and arguments.
|
|
63
|
+
|
|
64
|
+
- 🚀 **Improvement:**: enhance `utils.dict.DictUtils` with `deep_exclude/include` and `prune` function
|
|
65
|
+
|
|
66
|
+
### **v0.2.28**
|
|
67
|
+
|
|
68
|
+
- ✨ **New Feature:** Implement `utils.slack.SlackUtils` class for managing Slack channel message deletion
|
|
69
|
+
|
|
70
|
+
- ✨ **New Feature:** Added `utils.dict.DictUtils` for advanced dictionary manipulations (merging, filtering, transforming).
|
|
71
|
+
|
|
72
|
+
- ✨ **New Feature:** Added `common.common.pprint_stack_trace` to print stack traces with optional custom messages and force stop capability.
|
|
73
|
+
|
|
74
|
+
- 🚀 **Improvement:** `exp.perf.profiler` - allow to export _report dict_ as csv files for further analysis
|
|
75
|
+
|
|
76
|
+
### **v0.2.19**
|
|
77
|
+
|
|
78
|
+
- ✨ **New Feature:** Added `exp.core.param_gen` to facilitate fast generation of parameter combination sweeps (grid search) using YAML configurations.
|
|
79
|
+
|
|
80
|
+
### **v0.2.17**
|
|
81
|
+
|
|
82
|
+
- 🚀 **Improvement:** Updated `exp.perf.profiler` with an `enabled` flag for dynamic toggling.
|
|
83
|
+
- 🚀 **Improvement:** Added a `measure` context manager to simplify performance measuring of code blocks.
|
|
84
|
+
|
|
85
|
+
### **v0.2.13**
|
|
86
|
+
|
|
87
|
+
- ♻️ **Refactor:** Major reorganization of packages. Renamed `research` package to `exp` (Experiment Management).
|
|
88
|
+
- 🚀 **Improvement:** Updated `exp/perfcalc.py` to allow saving computed performance metrics to CSV without explicitly calling `calc_perfs`.
|
|
89
|
+
|
|
90
|
+
### **v0.2.1**
|
|
91
|
+
|
|
92
|
+
- ✨ **New Feature:** Added `eval_exp` method to `exp/base_exp` for running evaluations (e.g., model testing) after experiments conclude.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## v0.1.9x (Visualization & Generators)
|
|
97
|
+
|
|
98
|
+
### **v0.1.99**
|
|
99
|
+
|
|
100
|
+
- ✨ **New Feature:** Added `gen_ipynb_name` to `filetype/ipynb`. Generates filenames based on the current notebook name with optional timestamps.
|
|
101
|
+
|
|
102
|
+
### **v0.1.96**
|
|
103
|
+
|
|
104
|
+
- ✨ **New Feature:** Added `PlotHelper` class in `research/plot` for plotting training history and image grids (dataset samples or model outputs).
|
|
105
|
+
|
|
106
|
+
### **v0.1.91**
|
|
107
|
+
|
|
108
|
+
- ✨ **New Feature:** Added `ParamGen` class to `research/param_gen` for parsing YAML files into parameter lists for hyperparameter searches.
|
|
109
|
+
|
|
110
|
+
### **v0.1.90**
|
|
111
|
+
|
|
112
|
+
- ✨ **New Feature:** Added `zProfiler` class to `research/profiler` for measuring context/step execution time, supporting dynamic color scales in plots.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## v0.1.5x - v0.1.7x (Infrastructure & Utilities)
|
|
117
|
+
|
|
118
|
+
### **v0.1.77**
|
|
119
|
+
|
|
120
|
+
- ✨ **New Feature:** Added `BaseExp` class in `research/base_exp` to handle common experiment tasks (performance calculation, result saving).
|
|
121
|
+
|
|
122
|
+
### **v0.1.67**
|
|
123
|
+
|
|
124
|
+
- 🔧 **Maintenance:** Switched to **uv** for virtual environment management.
|
|
125
|
+
- 🚀 **Improvement:** Updated `research/perfcalc` to support both `torchmetrics` and custom metrics.
|
|
126
|
+
|
|
127
|
+
### **v0.1.61**
|
|
128
|
+
|
|
129
|
+
- ✨ **New Feature:** Added `VideoUtils` (`util/video`) for common video handling tasks.
|
|
130
|
+
- ✨ **New Feature:** Added `GPUMonitor` (`util/gpu_mon`) for tracking GPU usage and performance.
|
|
131
|
+
|
|
132
|
+
### **v0.1.59**
|
|
133
|
+
|
|
134
|
+
- 🔨 **Architecture:** Added `util/perfcalc` abstract base class. This requires implementation of specific performance calculation logic.
|
|
135
|
+
|
|
136
|
+
### **v0.1.55**
|
|
137
|
+
|
|
138
|
+
- ✨ **New Feature:** Added `util/dataclass_util` for dynamic creation of `dataclass` objects from dictionaries or YAML (supports nested structures).
|
|
139
|
+
|
|
140
|
+
### **v0.1.52**
|
|
141
|
+
|
|
142
|
+
- ✨ **New Feature:** Added `research/perftb` module for managing experiment performance tables (filtering by dataset, metric, etc.).
|
|
143
|
+
|
|
144
|
+
### **v0.1.50**
|
|
145
|
+
|
|
146
|
+
- ✨ **New Feature:** Added `pprint_local_path` to print clickable file URIs for local paths.
|
|
147
|
+
- ✨ **New Feature:** Added `research` package containing `benchquery` for dataframe benchmarking.
|
|
148
|
+
- ✨ **New Feature:** Added `wandb` module for offline syncing and batch clearing of Weights & Biases runs.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## v0.1.4x (Display & formatting)
|
|
153
|
+
|
|
154
|
+
### **v0.1.47**
|
|
155
|
+
|
|
156
|
+
- ✨ **New Feature:** Added `pprint_box` to print objects or strings inside a decorative box frame.
|
|
157
|
+
|
|
158
|
+
### **v0.1.46**
|
|
159
|
+
|
|
160
|
+
- 🐛 **Fix:** Filtered `UserWarning: Unable to import Axes3D`.
|
|
161
|
+
- 🚀 **Improvement:** Added `auto_wrap_text` to `fn_display_df` to prevent long text overflow in tables.
|
|
162
|
+
|
|
163
|
+
### **v0.1.42**
|
|
164
|
+
|
|
165
|
+
- ✨ **New Feature:** Added `rich_color.py` wrapper for basic color lists.
|
|
166
|
+
|
|
167
|
+
### **v0.1.41**
|
|
168
|
+
|
|
169
|
+
- ✨ **New Feature:** Added `rich_color.py` to support rich color information (palettes, strings) using the `rich` library.
|
|
170
|
+
|
|
171
|
+
### **v0.1.40**
|
|
172
|
+
|
|
173
|
+
- 🚀 **Improvement:** Updated `csvfile.py` to use `itables` and `pygwalker` for interactive dataframe display in Jupyter notebooks.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## v0.1.3x (Data & Loading)
|
|
178
|
+
|
|
179
|
+
### **v0.1.38**
|
|
180
|
+
|
|
181
|
+
- ✨ **New Feature:** Added `torchloader.py` to search for optimal `DataLoader` configurations (num_workers, batch_size, pin_memory).
|
|
182
|
+
|
|
183
|
+
### **v0.1.37**
|
|
184
|
+
|
|
185
|
+
- ✨ **New Feature:** Added `dataset.py` for splitting classification datasets into train/val/test sets.
|
|
186
|
+
|
|
187
|
+
### **v0.1.33**
|
|
188
|
+
|
|
189
|
+
- ✨ **New Feature:** Added `plot.py` for plotting Deep Learning training history (accuracy/loss) using `seaborn` and `matplotlib`.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## v0.1.0 - v0.1.2x (Early Utilities)
|
|
194
|
+
|
|
195
|
+
### **v0.1.29**
|
|
196
|
+
|
|
197
|
+
- 🐛 **Fix:** Pinned `kaleido==0.1.*` for `tele_noti` as version `0.2.*` caused image generation hangs.
|
|
198
|
+
|
|
199
|
+
### **v0.1.24**
|
|
200
|
+
|
|
201
|
+
- ♻️ **Refactor:** Renamed `sys` module to `system` to avoid conflicts with Python's built-in `sys`.
|
|
202
|
+
- ✨ **New Feature:** Added `tele_noti` module for Telegram notifications regarding training progress.
|
|
203
|
+
|
|
204
|
+
### **v0.1.22**
|
|
205
|
+
|
|
206
|
+
- ✨ **New Feature:** Added `cuda.py` to check CUDA availability for both PyTorch and TensorFlow.
|
|
207
|
+
|
|
208
|
+
### **v0.1.21**
|
|
209
|
+
|
|
210
|
+
- ✨ **New Feature:** Added YAML inheritance and overriding support using `networkx` and `omegaconf`.
|
|
211
|
+
|
|
212
|
+
### **v0.1.15**
|
|
213
|
+
|
|
214
|
+
- ✨ **New Feature:** Added common logging library and `@console_log` decorator for function tracing.
|
|
215
|
+
|
|
216
|
+
### **v0.1.10**
|
|
217
|
+
|
|
218
|
+
- 🐛 **Fix:** Fixed typo `is_exit` -> `is_exist` in `filesys`.
|
|
219
|
+
- 🚀 **Improvement:** Updated `gdrive` to support uploading to specific folders and returning direct shareable links.
|
|
220
|
+
|
|
221
|
+
### **v0.1.9**
|
|
222
|
+
|
|
223
|
+
- 🔧 **Maintenance:** Added `requirements.txt`.
|
|
224
|
+
|
|
225
|
+
### **v0.1.6 - v0.1.8**
|
|
226
|
+
|
|
227
|
+
- 🚀 **Performance:** Optimized table insertion by using an in-memory `row_pool_dict` before committing to the DataFrame.
|
|
228
|
+
- ✨ **New Feature:** Added `DFCreator` for manipulating DataFrames (create, insert, display, save).
|
|
229
|
+
|
|
230
|
+
### **v0.1.4 - v0.1.5**
|
|
231
|
+
|
|
232
|
+
- ✨ **New Feature:** Added `cmd` module.
|
|
233
|
+
- ✨ **New Feature:** Support for creating Bitbucket Projects from templates.
|
|
234
|
+
|
|
235
|
+
### **v0.1.2**
|
|
236
|
+
|
|
237
|
+
- ✨ **New Feature:** Added support for uploading local files to Google Drive.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
halib/__init__.py,sha256=WIdY-2inwVQ73ZbBnv4XPaxwOJicoBPTkGisHso5mnE,1778
|
|
2
|
+
halib/common.py,sha256=9hn-IXOlGZODoBHy8U2A0aLgmPEnTeQjbzAVGwXAjwo,4242
|
|
3
|
+
halib/csvfile.py,sha256=Eoeni0NIbNG3mB5ESWAvNwhJxOjmCaPd1qqYRHImbvk,1567
|
|
4
|
+
halib/cuda.py,sha256=1bvtBY8QvTWdLaxalzK9wqXPl0Ft3AfhcrebupxGzEA,1010
|
|
5
|
+
halib/dataset.py,sha256=QU0Hr5QFb8_XlvnOMgC9QJGIpwXAZ9lDd0RdQi_QRec,6743
|
|
6
|
+
halib/filesys.py,sha256=r1SftGKM7nyw6QbY5UmcueZLkXEIleSzhui7dQsosPw,2907
|
|
7
|
+
halib/gdrive.py,sha256=p302rTv1H4gFsAlmmiUL0iKrbg09_3_dEhtm-N4WGvg,6277
|
|
8
|
+
halib/gdrive_mkdir.py,sha256=0Gq65i2YaWaGMdJqXX7zthhb0qZnNwrhdoHK6IBIVv8,1456
|
|
9
|
+
halib/gdrive_test.py,sha256=e8yOYB5MZhdHbeLzjvTcOXbJNKk_DKNWURIRkKxHBMs,1378
|
|
10
|
+
halib/jsonfile.py,sha256=9XfdFS1wcTdBRmpAGzVu2dVCcJp8RCpsSY16f6KUNts,480
|
|
11
|
+
halib/listop.py,sha256=Vpa8_2fI0wySpB2-8sfTBkyi_A4FhoFVVvFiuvW8N64,339
|
|
12
|
+
halib/plot.py,sha256=4pUJ5GeKQ1LzgiQXbAZlUqSydXSk5tt2_qsw78nSzA4,9445
|
|
13
|
+
halib/projectmake.py,sha256=8dNTxB2jgQlwvovaOnJcCKgHe5vM0nBwzm46Yc8INEI,4048
|
|
14
|
+
halib/rich_color.py,sha256=tyK5fl3Dtv1tKsfFzt_5Rco4Fj72QliA-w5aGXaVuqQ,6392
|
|
15
|
+
halib/tele_noti.py,sha256=xL8f889VFR65uVJTj1NNT3qSi3lJ7s_iDjcObwZ0-V0,5926
|
|
16
|
+
halib/textfile.py,sha256=EhVFrit-nRBJx18e6rtIqcE1cSbgsLnMXe_kdhi1EPI,399
|
|
17
|
+
halib/torchloader.py,sha256=-q9YE-AoHZE1xQX2dgNxdqtucEXYs4sQ22WXdl6EGfI,6500
|
|
18
|
+
halib/videofile.py,sha256=NTLTZ-j6YD47duw2LN2p-lDQDglYFP1LpEU_0gzHLdI,4737
|
|
19
|
+
halib/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
+
halib/common/common.py,sha256=Ta_4w1k1RUnIXMxvKhsrE5TadRpB9rwqf5qEZcU1oPM,10046
|
|
21
|
+
halib/common/rich_color.py,sha256=tyK5fl3Dtv1tKsfFzt_5Rco4Fj72QliA-w5aGXaVuqQ,6392
|
|
22
|
+
halib/exp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
|
+
halib/exp/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
|
+
halib/exp/core/base_config.py,sha256=Js2oVDt7qwT7eV_sOUWw6XXl569G1bX6ls-VYAx2gWY,5032
|
|
25
|
+
halib/exp/core/base_exp.py,sha256=fknJVmW6ubbapOggbkrbNWgc1ZXcUz_FE3wMyuIGX7M,5180
|
|
26
|
+
halib/exp/core/param_gen.py,sha256=y4elw6bmoBMKRzS7KDLXp0xqC3x27gg0r6wrcTBfidc,6725
|
|
27
|
+
halib/exp/core/wandb_op.py,sha256=powL2QyLBqF-6PUGAOqd60s1npHLLKJxPns3S4hKeNo,4160
|
|
28
|
+
halib/exp/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
|
+
halib/exp/data/dataclass_util.py,sha256=OPZzqmug0be4JEq0hJ68pKjnyl0PRYQMVJGhKw1kvyk,1382
|
|
30
|
+
halib/exp/data/dataset.py,sha256=hm7CDTmudo_KV21RF0TQknHsw44PKhlMoBs9i8WIq6k,6743
|
|
31
|
+
halib/exp/data/torchloader.py,sha256=oWUplXlGd1IB6CqdRd-mGe-DfMjjZxz9hQ7SWONb-0s,6519
|
|
32
|
+
halib/exp/perf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
|
+
halib/exp/perf/flop_calc.py,sha256=Kb3Gwqc7QtGALZzfyYXBA_9SioReJpTJdUX84kqj-Aw,6907
|
|
34
|
+
halib/exp/perf/gpu_mon.py,sha256=vD41_ZnmPLKguuq9X44SB_vwd9JrblO4BDzHLXZhhFY,2233
|
|
35
|
+
halib/exp/perf/perfcalc.py,sha256=zb0eGt24kPVC2HTq9M095wP6y8TqOicWy52BxAigap0,19834
|
|
36
|
+
halib/exp/perf/perfmetrics.py,sha256=qRiNiCKGUSTLY7gPMVMuVHGAAyeosfGWup2eM4490aw,5485
|
|
37
|
+
halib/exp/perf/perftb.py,sha256=IWElg3OB5dmhfxnY8pMZvkL2y_EnvLmEx3gJlpUR1Fs,31066
|
|
38
|
+
halib/exp/perf/profiler.py,sha256=Nx-Y1V3pCbaEOisY1sDT8s0yGFs3J6TUmutZslseoNI,19201
|
|
39
|
+
halib/exp/viz/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
|
+
halib/exp/viz/plot.py,sha256=51FhD1mH4nthTrY3K4mrO5pxI5AzvHXpZy5_ToqkYHs,28580
|
|
41
|
+
halib/filetype/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
|
+
halib/filetype/csvfile.py,sha256=dwWM1LglQr1SaSWq2KDl93fYzQn1638JGo_l1GbBhbk,6460
|
|
43
|
+
halib/filetype/ipynb.py,sha256=pd2LgmPa7ZbF0YlQJbeQZEsl6jHQUSoyVtkCT7WhU5Q,1657
|
|
44
|
+
halib/filetype/jsonfile.py,sha256=2HcBqXYjLNvqFok3PHOgH59vlhDCZLZpt7ezvgx1TFM,474
|
|
45
|
+
halib/filetype/textfile.py,sha256=3koEFyVme1SEHdud7TnjArHndoiqfMGfMdYY3NIFegM,397
|
|
46
|
+
halib/filetype/videofile.py,sha256=h7FfOA212lgTbVrbrJYXMA1Chn3FYkXD_WEEt3odtn4,9097
|
|
47
|
+
halib/filetype/yamlfile.py,sha256=buvj016n3wmEBDfeDX9lbljqDk5R5OlKHuXDKSfIKK0,2411
|
|
48
|
+
halib/online/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
|
+
halib/online/gdrive.py,sha256=RmF4y6UPxektkKIctmfT-pKWZsBM9FVUeld6zZmJkp0,7787
|
|
50
|
+
halib/online/gdrive_mkdir.py,sha256=wSJkQMJCDuS1gxQ2lHQHq_IrJ4xR_SEoPSo9n_2WNFU,1474
|
|
51
|
+
halib/online/gdrive_test.py,sha256=hMWzz4RqZwETHp4GG4WwVNFfYvFQhp2Boz5t-DqwMo0,1342
|
|
52
|
+
halib/online/projectmake.py,sha256=-WhJNmM6RpAfnWcQeinDBFjRKig165l7uqBk-XQwcbA,4036
|
|
53
|
+
halib/online/tele_noti.py,sha256=ErR5ys8gHmdjjDfSfVJxBIbPxgH7QD0oNRQgZweGi4s,5941
|
|
54
|
+
halib/research/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
|
+
halib/research/base_config.py,sha256=AqZHZ0NNQ3WmUOfRzs36lf3o0FrehSdVLbdmgNpbV7A,2833
|
|
56
|
+
halib/research/base_exp.py,sha256=mC2bcG3M-dIvAkLw3d4O4Nu0HyvfrmvHvHX4iW8qurY,5749
|
|
57
|
+
halib/research/benchquery.py,sha256=FuKnbWQtCEoRRtJAfN-zaN-jPiO_EzsakmTOMiqi7GQ,4626
|
|
58
|
+
halib/research/dataset.py,sha256=X6lob-pcndC2aOP0fQ3z8aUnNVVR95ia4tiuxIAXppk,6734
|
|
59
|
+
halib/research/flop_csv.py,sha256=JeIUWgPFmhkPqvmhe-MLwwvAu9yR5F2k3qaViJCJJD4,1148
|
|
60
|
+
halib/research/flops.py,sha256=Us0VudX8QMOm7YenICGf-Tq57C_l9x9hj-MUGA8_hCg,5773
|
|
61
|
+
halib/research/metrics.py,sha256=qRiNiCKGUSTLY7gPMVMuVHGAAyeosfGWup2eM4490aw,5485
|
|
62
|
+
halib/research/mics.py,sha256=kFl7IsZP1N-qkogvuFojkDNr1Qf0kce9h--qOnJ_3gk,2637
|
|
63
|
+
halib/research/params_gen.py,sha256=GcTMlniL0iE3HalJY-gVRiYa8Qy8u6nX4LkKZeMkct8,4262
|
|
64
|
+
halib/research/perfcalc.py,sha256=gjQh1D7CyEjocX5rusAzygyGFrb_s9Ob3Lqs4lIDGxg,16228
|
|
65
|
+
halib/research/perftb.py,sha256=YlBXMeWn8S0LhsgxONEQZrKomRTju2T8QGGspUOy_6Y,31100
|
|
66
|
+
halib/research/plot.py,sha256=GBCXP1QnzRlNqjAl9UvGvW3I9II61DBStJNQThrLy38,28578
|
|
67
|
+
halib/research/profiler.py,sha256=GRAewTo0jGkOputjmRwtYVfJYBze_ivsOnrW9exWkPQ,11772
|
|
68
|
+
halib/research/torchloader.py,sha256=yqUjcSiME6H5W210363HyRUrOi3ISpUFAFkTr1w4DCw,6503
|
|
69
|
+
halib/research/wandb_op.py,sha256=YzLEqME5kIRxi3VvjFkW83wnFrsn92oYeqYuNwtYRkY,4188
|
|
70
|
+
halib/research/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
71
|
+
halib/research/core/base_config.py,sha256=FXYFFGKry-HwNrjlPlTeTB-ROhM1Bow5Xxems2fdW5k,4204
|
|
72
|
+
halib/research/core/base_exp.py,sha256=6CpuTP43NA7gE5JUN4V_-UAKHrlzLPJNI8piCBh3p1s,5734
|
|
73
|
+
halib/research/core/param_gen.py,sha256=I9JHrDCaep4CjvApDoX0QzFuw38zMC2PsDFueuA7pjM,4271
|
|
74
|
+
halib/research/core/wandb_op.py,sha256=powL2QyLBqF-6PUGAOqd60s1npHLLKJxPns3S4hKeNo,4160
|
|
75
|
+
halib/research/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
76
|
+
halib/research/data/dataclass_util.py,sha256=OPZzqmug0be4JEq0hJ68pKjnyl0PRYQMVJGhKw1kvyk,1382
|
|
77
|
+
halib/research/data/dataset.py,sha256=hm7CDTmudo_KV21RF0TQknHsw44PKhlMoBs9i8WIq6k,6743
|
|
78
|
+
halib/research/data/torchloader.py,sha256=oWUplXlGd1IB6CqdRd-mGe-DfMjjZxz9hQ7SWONb-0s,6519
|
|
79
|
+
halib/research/perf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
80
|
+
halib/research/perf/flop_calc.py,sha256=Kb3Gwqc7QtGALZzfyYXBA_9SioReJpTJdUX84kqj-Aw,6907
|
|
81
|
+
halib/research/perf/gpu_mon.py,sha256=vD41_ZnmPLKguuq9X44SB_vwd9JrblO4BDzHLXZhhFY,2233
|
|
82
|
+
halib/research/perf/perfcalc.py,sha256=FSWDStz9f94dObyAHYHRtq4fuo0dIw7l9JH_x5Wd7cQ,16225
|
|
83
|
+
halib/research/perf/perfmetrics.py,sha256=qRiNiCKGUSTLY7gPMVMuVHGAAyeosfGWup2eM4490aw,5485
|
|
84
|
+
halib/research/perf/perftb.py,sha256=IWElg3OB5dmhfxnY8pMZvkL2y_EnvLmEx3gJlpUR1Fs,31066
|
|
85
|
+
halib/research/perf/profiler.py,sha256=5ZjES8kAqEsSV1mC3Yr_1ivFLwQDc_yv4HY7dKt_AS0,11782
|
|
86
|
+
halib/research/viz/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
87
|
+
halib/research/viz/plot.py,sha256=51FhD1mH4nthTrY3K4mrO5pxI5AzvHXpZy5_ToqkYHs,28580
|
|
88
|
+
halib/sys/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
89
|
+
halib/sys/cmd.py,sha256=b2x7JPcNnFjLGheIESVYvqAb-w2UwBM1PAwYxMZ5YjA,228
|
|
90
|
+
halib/sys/filesys.py,sha256=ERpnELLDKJoTIIKf-AajgkY62nID4qmqmX5TkE95APU,2931
|
|
91
|
+
halib/system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
|
+
halib/system/_list_pc.csv,sha256=r8RwxDWYEeNkPCQBs8dOC8cWgBpa3OULZobwb1feuWg,172
|
|
93
|
+
halib/system/cmd.py,sha256=b2x7JPcNnFjLGheIESVYvqAb-w2UwBM1PAwYxMZ5YjA,228
|
|
94
|
+
halib/system/filesys.py,sha256=102J2fkQhmH1_-HQVy2FQ4NOU8LTjMWV3hToT_APtq8,4401
|
|
95
|
+
halib/system/path.py,sha256=ewiHI76SLFBG5NnlihLpxBbOEDfHibRwKTcLMjEz6Hw,3728
|
|
96
|
+
halib/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
97
|
+
halib/utils/dataclass_util.py,sha256=rj2IMLlUzbm2OlF5_B2dRTk9njZOaF7tTjYkOsq8uLY,1416
|
|
98
|
+
halib/utils/dict.py,sha256=71nZwBTv7Tm-W_8J0xGkk_OODBOj5qghyUmTDMHXcks,11916
|
|
99
|
+
halib/utils/dict_op.py,sha256=wYE6Iw-_CnCWdMg9tpJ2Y2-e2ESkW9FxmdBkZkbUh80,299
|
|
100
|
+
halib/utils/gpu_mon.py,sha256=vD41_ZnmPLKguuq9X44SB_vwd9JrblO4BDzHLXZhhFY,2233
|
|
101
|
+
halib/utils/list.py,sha256=bbey9_0IaMXnHx1pudv3C3_WU9uFQEQ5qHPklSN-7o0,498
|
|
102
|
+
halib/utils/listop.py,sha256=Vpa8_2fI0wySpB2-8sfTBkyi_A4FhoFVVvFiuvW8N64,339
|
|
103
|
+
halib/utils/slack.py,sha256=2ugWE_eJ0s479ObACJbx7iEu3kjMPD4Rt2hEwuMpuNQ,3099
|
|
104
|
+
halib/utils/tele_noti.py,sha256=-4WXZelCA4W9BroapkRyIdUu9cUVrcJJhegnMs_WpGU,5928
|
|
105
|
+
halib/utils/video.py,sha256=zLoj5EHk4SmP9OnoHjO8mLbzPdtq6gQPzTQisOEDdO8,3261
|
|
106
|
+
halib-0.2.30.dist-info/licenses/LICENSE.txt,sha256=qZssdna4aETiR8znYsShUjidu-U4jUT9Q-EWNlZ9yBQ,1100
|
|
107
|
+
halib-0.2.30.dist-info/METADATA,sha256=mI_TeedvIuVaUTlHo9pZDRiLUZpYLJWLG7e8ru1Wt90,8183
|
|
108
|
+
halib-0.2.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
109
|
+
halib-0.2.30.dist-info/top_level.txt,sha256=7AD6PLaQTreE0Fn44mdZsoHBe_Zdd7GUmjsWPyQ7I-k,6
|
|
110
|
+
halib-0.2.30.dist-info/RECORD,,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
Copyright (c) 2021 HaHV (hoangvanhauit@gmail.com)
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
in the Software without restriction, including without limitation the rights
|
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
furnished to do so, subject to the following conditions:
|
|
9
|
+
The above copyright notice and this permission notice shall be included in all
|
|
10
|
+
copies or substantial portions of the Software.
|
|
11
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
12
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
13
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
14
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
15
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
16
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
17
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
halib
|