134 lines
3.7 KiB
Python
134 lines
3.7 KiB
Python
|
import importlib
|
||
|
import re
|
||
|
import subprocess
|
||
|
import platform
|
||
|
import sys
|
||
|
import unicodedata
|
||
|
from pathlib import Path
|
||
|
|
||
|
|
||
|
def install_module(module_name, package_name=None):
|
||
|
'''Install a python module with pip or return it if already installed'''
|
||
|
try:
|
||
|
module = importlib.import_module(module_name)
|
||
|
except ModuleNotFoundError:
|
||
|
print(f'Installing Module {module_name} ....')
|
||
|
|
||
|
subprocess.call([sys.executable, '-m', 'ensurepip'])
|
||
|
subprocess.call([sys.executable, '-m', 'pip', 'install', package_name or module_name])
|
||
|
|
||
|
module = importlib.import_module(module_name)
|
||
|
|
||
|
return module
|
||
|
|
||
|
def import_module_from_path(path):
|
||
|
from importlib import util
|
||
|
|
||
|
try:
|
||
|
path = Path(path)
|
||
|
spec = util.spec_from_file_location(path.stem, str(path))
|
||
|
mod = util.module_from_spec(spec)
|
||
|
|
||
|
spec.loader.exec_module(mod)
|
||
|
|
||
|
return mod
|
||
|
|
||
|
except Exception as e:
|
||
|
print(f'Cannot import file {path}')
|
||
|
print(e)
|
||
|
|
||
|
def norm_str(string, separator='_', format=str.lower, padding=0):
|
||
|
string = str(string)
|
||
|
string = string.replace('_', ' ')
|
||
|
string = string.replace('-', ' ')
|
||
|
string = re.sub('[ ]+', ' ', string)
|
||
|
string = re.sub('[ ]+\/[ ]+', '/', string)
|
||
|
string = string.strip()
|
||
|
|
||
|
if format:
|
||
|
string = format(string)
|
||
|
|
||
|
# Padd rightest number
|
||
|
string = re.sub(r'(\d+)(?!.*\d)', lambda x : x.group(1).zfill(padding), string)
|
||
|
|
||
|
string = string.replace(' ', separator)
|
||
|
string = unicodedata.normalize('NFKD', string).encode('ASCII', 'ignore').decode("utf-8")
|
||
|
|
||
|
return string
|
||
|
|
||
|
def norm_name(string, separator='_', format=str.lower, padding=0):
|
||
|
string = str(string)
|
||
|
string = string.split('/')[-1] #used to remove first slash -> albert / albert_casque -> albert_casque
|
||
|
string = string.replace('_', ' ')
|
||
|
string = string.replace('-', ' ')
|
||
|
string = re.sub('[ ]+', ' ', string)
|
||
|
string = re.sub('[ ]+\/[ ]+', '/', string)
|
||
|
string = string.strip()
|
||
|
|
||
|
if format:
|
||
|
string = format(string)
|
||
|
|
||
|
# Padd rightest number
|
||
|
string = re.sub(r'(\d+)(?!.*\d)', lambda x : x.group(1).zfill(padding), string)
|
||
|
|
||
|
string = string.replace(' ', separator)
|
||
|
string = unicodedata.normalize('NFKD', string).encode('ASCII', 'ignore').decode("utf-8")
|
||
|
|
||
|
return string
|
||
|
|
||
|
def read_file(path):
|
||
|
'''Read a file with an extension in (json, yaml, yml, txt)'''
|
||
|
|
||
|
exts = ('.json', '.yaml', '.yml', '.txt')
|
||
|
|
||
|
if not path:
|
||
|
print('Try to read empty file')
|
||
|
|
||
|
path = Path(path)
|
||
|
if not path.exists():
|
||
|
print('File not exist', path)
|
||
|
return
|
||
|
|
||
|
if path.suffix not in exts:
|
||
|
print(f'Cannot read file {path}, extension must be in {exts}')
|
||
|
return
|
||
|
|
||
|
txt = path.read_text()
|
||
|
data = None
|
||
|
|
||
|
if path.suffix.lower() in ('.yaml', '.yml'):
|
||
|
yaml = install_module('yaml')
|
||
|
try:
|
||
|
data = yaml.safe_load(txt)
|
||
|
except Exception:
|
||
|
print(f'Could not load yaml file {path}')
|
||
|
return
|
||
|
elif path.suffix.lower() == '.json':
|
||
|
try:
|
||
|
data = json.loads(txt)
|
||
|
except Exception:
|
||
|
print(f'Could not load json file {path}')
|
||
|
return
|
||
|
else:
|
||
|
data = txt
|
||
|
|
||
|
return data
|
||
|
|
||
|
def open_file(filepath, env=None, select=False):
|
||
|
if platform.system() == 'Darwin': # macOS
|
||
|
cmd = ['open']
|
||
|
if select:
|
||
|
cmd += ['-R']
|
||
|
|
||
|
elif platform.system() == 'Windows': # Windows
|
||
|
cmd = ['explorer']
|
||
|
if select:
|
||
|
cmd += ['/select,']
|
||
|
else: # linux variants
|
||
|
cmd = ['xdg-open']
|
||
|
if select:
|
||
|
cmd = ['nemo']
|
||
|
|
||
|
cmd += [str(filepath)]
|
||
|
|
||
|
subprocess.Popen(cmd, env=env)
|