From f5c47d0f428a24cac2c6730f0a2dc01113cdeccd Mon Sep 17 00:00:00 2001 From: Ethan Dalool Date: Mon, 31 Oct 2016 19:44:55 -0700 Subject: [PATCH] else voussoirkit --- AESFile/aesfile.py | 9 +++- Downloady/downloady.py | 16 +++++-- Instathief/instathief.py | 12 +++++- OpenDirDL/opendirdl.py | 15 ++++--- ServerReference/simpleserver.py | 16 +++++-- SpinalTap/spinal.py | 16 +++++-- ThreadedDL/threaded_dl.py | 12 +++++- _voussoirkit/voussoirkit.py | 71 ++++++++++++++++++++++++++++++++ _voussoirkit/voussoirkit.zip | Bin 0 -> 15815 bytes 9 files changed, 148 insertions(+), 19 deletions(-) create mode 100644 _voussoirkit/voussoirkit.py create mode 100644 _voussoirkit/voussoirkit.zip diff --git a/AESFile/aesfile.py b/AESFile/aesfile.py index 7c8a7ff..e4470c8 100644 --- a/AESFile/aesfile.py +++ b/AESFile/aesfile.py @@ -4,7 +4,14 @@ from Crypto.Cipher import AES import sys import os -sys.path.append('C:\\git\\else\\Bytestring'); import bytestring +try: + sys.path.append('C:\\git\\else\\Bytestring') + import bytestring +except ImportError: + # pip install + # https://raw.githubusercontent.com/voussoir/else/master/_voussoirkit/voussoirkit.zip + from voussoirkit import bytestring + BLOCK_SIZE = 32 diff --git a/Downloady/downloady.py b/Downloady/downloady.py index c13772c..f3d526f 100644 --- a/Downloady/downloady.py +++ b/Downloady/downloady.py @@ -7,9 +7,19 @@ import time import urllib import warnings -sys.path.append('C:\\git\\else\\bytestring'); import bytestring -sys.path.append('C:\\git\\else\\clipext'); import clipext -sys.path.append('C:\\git\\else\\ratelimiter'); import ratelimiter +try: + sys.path.append('C:\\git\\else\\Bytestring') + sys.path.append('C:\\git\\else\\clipext'); + sys.path.append('C:\\git\\else\\ratelimiter'); + import bytestring + import ratelimiter + import clipext +except ImportError: + # pip install + # https://raw.githubusercontent.com/voussoir/else/master/_voussoirkit/voussoirkit.zip + from vousoirkit import bytestring + from vousoirkit import ratelimiter + from vousoirkit import clipext warnings.simplefilter('ignore') diff --git a/Instathief/instathief.py b/Instathief/instathief.py index 6bfd6b5..39cdeca 100644 --- a/Instathief/instathief.py +++ b/Instathief/instathief.py @@ -6,8 +6,16 @@ import os import requests import sys -sys.path.append('C:\\git\\else\\clipext'); import clipext -sys.path.append('C:\\git\\else\\downloady'); import downloady +try: + sys.path.append('C:\\git\\else\\Clipext'); + sys.path.append('C:\\git\\else\\Downloady'); + import clipext + import downloady +except ImportError: + # pip install + # https://raw.githubusercontent.com/voussoir/else/master/_voussoirkit/voussoirkit.zip + from voussoirkit import clipext + from voussoirkit import downloady ''' ''' diff --git a/OpenDirDL/opendirdl.py b/OpenDirDL/opendirdl.py index d611d90..078e7be 100644 --- a/OpenDirDL/opendirdl.py +++ b/OpenDirDL/opendirdl.py @@ -123,11 +123,16 @@ import sys ## import tkinter import urllib.parse -# Please consult my github repo for these files -# https://github.com/voussoir/else -sys.path.append('C:\\git\\else\\Downloady'); import downloady -sys.path.append('C:\\git\\else\\Bytestring'); import bytestring - +try: + sys.path.append('C:\\git\\else\\Bytestring'); + sys.path.append('C:\\git\\else\\Downloady'); + import bytestring + import downloady +except ImportError: + # pip install + # https://raw.githubusercontent.com/voussoir/else/master/_voussoirkit/voussoirkit.zip + from voussoirkit import bytestring + from voussoirkit import downloady DOWNLOAD_CHUNK = 16 * bytestring.KIBIBYTE FILENAME_BADCHARS = '/\\:*?"<>|' diff --git a/ServerReference/simpleserver.py b/ServerReference/simpleserver.py index 5178807..6bb1eff 100644 --- a/ServerReference/simpleserver.py +++ b/ServerReference/simpleserver.py @@ -8,9 +8,19 @@ import socketserver import sys import types -sys.path.append('C:\\git\\else\\Bytestring'); import bytestring -sys.path.append('C:\\git\\else\\Pathclass'); import pathclass -sys.path.append('C:\\git\\else\\Ratelimiter'); import ratelimiter +try: + sys.path.append('C:\\git\\else\\Bytestring'); + sys.path.append('C:\\git\\else\\Pathclass'); + sys.path.append('C:\\git\\else\\Ratelimiter'); + import bytestring + import pathclass + import ratelimiter +except ImportError: + # pip install + # https://raw.githubusercontent.com/voussoir/else/master/_voussoirkit/voussoirkit.zip + from voussoirkit import bytestring + from voussoirkit import pathclass + from voussoirkit import ratelimiter FILE_READ_CHUNK = bytestring.MIBIBYTE RATELIMITER = ratelimiter.Ratelimiter(16 * bytestring.MIBIBYTE) diff --git a/SpinalTap/spinal.py b/SpinalTap/spinal.py index f6a1d59..90fc53b 100644 --- a/SpinalTap/spinal.py +++ b/SpinalTap/spinal.py @@ -10,9 +10,19 @@ import string import sys import time -sys.path.append('C:\\git\\else\\Bytestring'); import bytestring -sys.path.append('C:\\git\\else\\Pathclass'); import pathclass -sys.path.append('C:\\git\\else\\Ratelimiter'); import ratelimiter +try: + sys.path.append('C:\\git\\else\\Bytestring'); + sys.path.append('C:\\git\\else\\Pathclass'); + sys.path.append('C:\\git\\else\\Ratelimiter'); + import bytestring + import pathclass + import ratelimiter +except ImportError: + # pip install + # https://raw.githubusercontent.com/voussoir/else/master/_voussoirkit/voussoirkit.zip + from voussoirkit import bytestring + from voussoirkit import pathclass + from voussoirkit import ratelimiter logging.basicConfig(level=logging.DEBUG) log = logging.getLogger(__name__) diff --git a/ThreadedDL/threaded_dl.py b/ThreadedDL/threaded_dl.py index b0cca23..8c807c4 100644 --- a/ThreadedDL/threaded_dl.py +++ b/ThreadedDL/threaded_dl.py @@ -3,8 +3,16 @@ import sys import threading import time -sys.path.append('C:\\git\\else\\clipext'); import clipext -sys.path.append('C:\\git\\else\\downloady'); import downloady +try: + sys.path.append('C:\\git\\else\\Clipext'); + sys.path.append('C:\\git\\else\\Downloady'); + import clipext + import downloady +except ImportError: + # pip install + # https://raw.githubusercontent.com/voussoir/else/master/_voussoirkit/voussoirkit.zip + from voussoirkit import bytestring + from voussoirkit import pathclass def remove_finished(threads): threads = [t for t in threads if t.is_alive()] diff --git a/_voussoirkit/voussoirkit.py b/_voussoirkit/voussoirkit.py new file mode 100644 index 0000000..895c582 --- /dev/null +++ b/_voussoirkit/voussoirkit.py @@ -0,0 +1,71 @@ +import glob +import shutil +import os + +PACKAGE = 'voussoirkit' +PATHS = [ +'C:\\git\\else\\Bytestring\\bytestring.py', +'C:\\git\\else\\Clipext\\clipext.py', +'C:\\git\\else\\Downloady\\downloady.py', +'C:\\git\\else\\Pathclass\\pathclass.py', +'C:\\git\\else\\Ratelimiter\\ratelimiter.py', +'C:\\git\\else\\RateMeter\\ratemeter.py', +'C:\\git\\else\\SpinalTap\\spinal.py', +] + +os.makedirs(PACKAGE, exist_ok=True) + +for zipfile in glob.glob('*.zip'): + os.remove(zipfile) + +py_modules = [] +local_paths = [] + +for path in PATHS: + basename = os.path.basename(path) + module_name = '{package}.{module}'.format(package=PACKAGE, module=basename.replace('.py', '')) + py_modules.append(module_name) + local_path = os.path.join(PACKAGE, basename) + local_paths.append(local_path) + try: + os.link(path, local_path) + except FileExistsError: + pass + +print('Creating setup.py') +setup_content = ''' +import setuptools + +setuptools.setup( + author='voussoir', + name='{package}', + version='0.0.1', + description='', + py_modules=[{py_modules}], +) +''' + +py_modules = ["'%s'" % x for x in py_modules] +py_modules = ', '.join(py_modules) +setup_content = setup_content.format(package=PACKAGE, py_modules=py_modules) + +setup_file = open('setup.py', 'w') +setup_file.write(setup_content) +setup_file.close() + +print('Executing setup.py') +os.system('python setup.py sdist') + +print('Moving zip file') +zips = glob.glob('dist\\*.zip') +for zip_filename in zips: + new_zip = os.path.basename(zip_filename) + new_zip = os.path.abspath(new_zip) + shutil.move(zip_filename, new_zip) + +print('Deleting temp') +shutil.rmtree('dist') +shutil.rmtree(PACKAGE) +shutil.rmtree(glob.glob('*.egg-info')[0]) +os.remove('setup.py') +os.rename(glob.glob('*.zip')[0], 'voussoirkit.zip') \ No newline at end of file diff --git a/_voussoirkit/voussoirkit.zip b/_voussoirkit/voussoirkit.zip new file mode 100644 index 0000000000000000000000000000000000000000..c1c68346f0d3800d2cfbf882e37c2e0ceafc84d9 GIT binary patch literal 15815 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