Browse Source

added ways of deducing application name

master
Raphael Roberts 7 years ago
parent
commit
6c3cb1589c
  1. 65
      portable_install/install.py
  2. 71
      portable_install/regex_analysis.py

65
portable_install/install.py

@ -0,0 +1,65 @@
import os
import py7z
import re
import edlib
import pickle
import functools
with open('test.pkl','rb') as file:
test = pickle.load(file)
#check 1: see if all files lie within a single dir
def __inner__(top,first = True):
os.chdir(top)
dirs = os.listdir()
valid = len(dirs) == 1
if valid:
valid = os.path.isdir(dirs[0])
if valid:
return __inner__(dirs[0],False)
else:
if not first:
return top
def single_dir(top):
og_cwd = os.getcwd()
res = __inner__(top)
os.chdir(og_cwd)
return res
#check 2: see if there is an 64 bit and 32 bit executable; take common name
def is32or64(top):
exes = []
for root,dirs,files in os.walk(top):
for file in files:
if file.endswith('.exe'):
exes.append(file)
candidates = list(filter(lambda exe: '32' in exe or '64' in exe,exes))
res = os.path.commonprefix(candidates)
if res != '':
return res.rstrip('.exe')
#check 3: sort executables by edit-distance from archive name; pick top one
def by_edit_distance(top):
exes = []
for root,dirs,files in os.walk(top):
for file in files:
if file.endswith('.exe'):
exes.append(file)
res = sorted(exes,key = lambda a: edlib.align(top,a)['editDistance'],reverse=False)
if len(res) >= 1:
return res[0][:len(res[0])-len('.exe')]
def dispatch(file_list):
trials = (
single_dir,
is32or64,
by_edit_distance,
)
res = None
for trial in trials:
if res is None:
res = trial(file_list)
else:
break
return res
top = r"Z:\out"
t1 = list(map(dispatch,(os.path.join(top,file) for file in os.listdir(top))))
print(t1)

71
portable_install/regex_analysis.py

@ -0,0 +1,71 @@
import re
extension = re.compile(r'\.(?:(?:tar\.(?:gz|bz))|[a-z0-9]+)$',re.I)
platform = re.compile(r'(?<!\d)(?:(?<!^)win(?:dows)?)?[^x368?]?x?(?P<platform>(?:32|64|86(?:[^368](?=\d))?)+)',re.I)
version = re.compile(r'v?(?P<version_code>\d+(?P<sep>[\.-_])(?:\d+(?P=sep)?)*\d+)(?:[^(?P=sep)\.](?=[abrs]))?(?P<label>setup|redist|beta|alpha|release)?',re.I)
name = re.compile(r'^[a-z0-9]+(?:(?P<sep>[^a-z0-9])(?=[a-z0-9]))?(?:[a-z0-9]+(?P=sep))*(?:[a-z0-9]+)?[a-z0-9]',re.I)
def snip(string,span):
beginning = string[:span[0]]
end = string[span[1]:]
return beginning + end
def get_info(fname):
ret = {}
match = extension.search(fname)
if match:
ret['ext'] = match.group(0)
fname = snip(fname,match.span())
match = platform.search(fname)
if match:
ret['platform'] = match.group('platform')
fname = snip(fname,match.span())
match = version.search(fname)
if match:
ret['version'] = re.sub(r'[^\d\.]','.',match.group('version_code'))
ret['label'] = match.group('label')
sep = match.group('sep')
fname = snip(fname,match.span())
match = name.search(fname)
if match:
ret['name'] = match.group(0)
return ret
test_fnames = '''\
6_3_0.zip
Anaconda2-4.3.0.1-Windows-x86_64.zip
chromedriver_win32.zip
cpu-z_1.81-en.zip
Dimmer_v1.0.zip
duplicate_files_deleter.zip
elevate-1.3.0-redist.7z
evolution-win.zip
evosim_win_2016_04_02.zip
Flowgorithm-2.14.1-Setup.zip
foldertimeupdate-x64.zip
httpd-2.4.29-o102n-x86-vc14-r2.zip
httpd-2.4.33-win64-VC15.zip
hwmonitor_1.33.zip
KeePassX-2.0.3.zip
Mindustry-windows64-3.5-release-40.zip
Mindustry-windows64-4.0-alpha-52.zip
Neon Skylines - Windows x86.zip
nginx-1.15.3.zip
nssm-2.24.zip
openhardwaremonitor-v0.8.0-beta.zip
OpenSSH-Win64.zip
PluginManager_v1.4.9_x64.zip
pyenchant-prebuild-win-amd64.7z
RAMMap.zip
SkyUI_5_1-3863-5-1.7z
tesseract-3.02.02-win32-lib-include-dirs.zip
tesseract-ocr-3.02-win32-portable.zip
testdisk-7.0.win.zip
Tic Tac Toe 2.7z
visus805.zip
wakeonlanmonitor.zip
win-acme.v1.9.11.2.zip
winprefetchview-x64.zip
wolsniffer.zip
xdelta3-3.1.0-x86_64.exe.zip\
'''.split('\n')
for fname in test_fnames:
print(get_info(fname))
Loading…
Cancel
Save