From 8b150c14ff067740a7bae98259ffa3511582967a Mon Sep 17 00:00:00 2001 From: Josue Gomez Date: Wed, 13 Nov 2019 11:23:15 -0600 Subject: [PATCH] v2.5 improvement localenv && added CC to sendmail --- dist/pyutl-2.1.tar.gz | Bin 0 -> 4166 bytes dist/pyutl-2.5.tar.gz | Bin 0 -> 4219 bytes pyutl.egg-info/PKG-INFO | 15 ++++++++ pyutl.egg-info/SOURCES.txt | 12 ++++++ pyutl.egg-info/dependency_links.txt | 1 + pyutl.egg-info/top_level.txt | 1 + pyutl/__init__.py | 32 ++++++++++++++-- pyutl/localenv.py | 57 ++++++++++++++++++---------- pyutl/sendmail.py | 8 +++- setup.py | 19 +++++----- 10 files changed, 110 insertions(+), 35 deletions(-) create mode 100644 dist/pyutl-2.1.tar.gz create mode 100644 dist/pyutl-2.5.tar.gz create mode 100644 pyutl.egg-info/PKG-INFO create mode 100644 pyutl.egg-info/SOURCES.txt create mode 100644 pyutl.egg-info/dependency_links.txt create mode 100644 pyutl.egg-info/top_level.txt diff --git a/dist/pyutl-2.1.tar.gz b/dist/pyutl-2.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a851ab018c8b0fc77833f28751de176adc2455a8 GIT binary patch literal 4166 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 Q@-Hg?4><-Y%>Z}+0Q>S-T>t<8 literal 0 HcmV?d00001 diff --git a/dist/pyutl-2.5.tar.gz b/dist/pyutl-2.5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..37a60d7b55550320f0c35ed633284e4871c9b7b2 GIT binary patch literal 4219 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 RoBj#u{{XV7^27jm007$oJD&gm literal 0 HcmV?d00001 diff --git a/pyutl.egg-info/PKG-INFO b/pyutl.egg-info/PKG-INFO new file mode 100644 index 0000000..777c804 --- /dev/null +++ b/pyutl.egg-info/PKG-INFO @@ -0,0 +1,15 @@ +Metadata-Version: 2.1 +Name: pyutl +Version: 2.5 +Summary: functions and utilities to recycle code +Home-page: https://git.binkfe.com/jesrat/pyutl +Author: Josue Gomez +Author-email: jgomez@binkfe.com +License: UNKNOWN +Description: pyutils + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Description-Content-Type: text/markdown diff --git a/pyutl.egg-info/SOURCES.txt b/pyutl.egg-info/SOURCES.txt new file mode 100644 index 0000000..57fab54 --- /dev/null +++ b/pyutl.egg-info/SOURCES.txt @@ -0,0 +1,12 @@ +README.md +setup.cfg +setup.py +pyutl/__init__.py +pyutl/localenv.py +pyutl/oracle.py +pyutl/remote.py +pyutl/sendmail.py +pyutl.egg-info/PKG-INFO +pyutl.egg-info/SOURCES.txt +pyutl.egg-info/dependency_links.txt +pyutl.egg-info/top_level.txt \ No newline at end of file diff --git a/pyutl.egg-info/dependency_links.txt b/pyutl.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/pyutl.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/pyutl.egg-info/top_level.txt b/pyutl.egg-info/top_level.txt new file mode 100644 index 0000000..8fc81e7 --- /dev/null +++ b/pyutl.egg-info/top_level.txt @@ -0,0 +1 @@ +pyutl diff --git a/pyutl/__init__.py b/pyutl/__init__.py index a81cf2b..ee0d56c 100644 --- a/pyutl/__init__.py +++ b/pyutl/__init__.py @@ -1,5 +1,3 @@ -# functions to recycle code - r""" To use, simply 'import pyutils' @@ -10,14 +8,18 @@ shellExecute can receive a cmd as str or arr example (b"'hello world'\n", b'') """ +__title__ = 'pyutl' +__description__ = 'functions and utilities to recycle code' +__url__ = 'https://git.binkfe.com/jesrat/pyutl' +__version__ = '2.5' __author__ = 'Josue Gomez ' -__maintainer__ = "Josue Gomez" __email__ = "jgomez@binkfe.com" +__maintainer__ = "Josue Gomez" __license__ = "MIT" -__version__ = '2.0' __all__ = ['', ] __status__ = "production" __date__ = "30 January 2019" +__copyright__ = 'Copyright 2019 Josue Gomez' import sys @@ -43,3 +45,25 @@ def progress_bar(progress, total, status=''): bar = '■' * fill_len + '-' * (bar_len - fill_len) sys.stdout.write('[%s] %s%s ...%s\r' % (bar, percent, '%', status)) sys.stdout.flush() + + +def read_streamed_file(file, chunk_size=10): + """ + Reads a hugh file by chunks (10 lines default) + :param file + :param chunk_size (10 lines default) + :return: chunk by chunk + """ + counter = 0 + ret_lines = [] + with open(file) as f: + while True: + counter += 1 + line = f.readline() + if line: + ret_lines.append((counter, line)) + if (counter/chunk_size).is_integer() or not line: + yield ret_lines + ret_lines = [] + if not line: + break diff --git a/pyutl/localenv.py b/pyutl/localenv.py index b5be2c9..6f8e517 100644 --- a/pyutl/localenv.py +++ b/pyutl/localenv.py @@ -1,14 +1,22 @@ import os import sys +import json class NoEnvironmentFile(Exception): pass +class KeyNotFound(Exception): + pass + + +DEFAULT = object() + + class LocalEnv: def __init__(self): - self.file = None + self.files = [] self.data = {} def load(self, file=None): @@ -17,29 +25,35 @@ class LocalEnv: in invoker module's directory """ if file is not None: - self.file = file + self.files.append({'file': file, 'exists': '', 'loaded': False}) else: - self.file = self._invoker() + self.files.append({'file': self._invoker(), 'exists': '', 'loaded': False}) - if not os.path.isfile(self.file): - raise NoEnvironmentFile(f'for file {self.file}') + # search all files given and load them + for file_dict in self.files: + file_dict['exists'] = os.path.isfile(file_dict['file']) + if file_dict['exists'] and not file_dict['loaded']: + with open(file_dict['file']) as f: + for line in f: + line = line.strip() + if not line or line.startswith('#') or '=' not in line: + continue + key, value = line.split('=', 1) + key = key.replace('export', '') + key = key.strip() + value = value.strip().strip('\'"') + self.data[key] = value + file_dict['loaded'] = True - with open(self.file) as f: - for line in f: - line = line.strip() - if not line or line.startswith('#') or '=' not in line: - continue - key, value = line.split('=', 1) - key = key.replace('export', '') - key = key.strip() - value = value.strip().strip('\'"') - self.data[key] = value - - def get(self, key, cast=None): - if cast is None: - return self.data[key] - - return cast(self.data[key]) + def get(self, key, default=DEFAULT, cast=None): + try: + ret_val = self.data[key] if cast is None else cast(self.data[key]) + except KeyError: + if default != DEFAULT: + ret_val = default if cast is None else cast(default) + else: + raise KeyNotFound(f'value not found in files: \n{json.dumps(self.files, indent=4)}') + return ret_val @staticmethod def _invoker(): @@ -53,3 +67,4 @@ class LocalEnv: localenv = LocalEnv() +localenv.load() diff --git a/pyutl/sendmail.py b/pyutl/sendmail.py index bbd2086..f3154ea 100644 --- a/pyutl/sendmail.py +++ b/pyutl/sendmail.py @@ -33,13 +33,19 @@ class SendMail: self.conn.starttls() self.conn.login(self.user, self.pssw) - def content(self, from_address, to_address, subject, msg): + def content(self, from_address, to_address, subject, msg, cc=None): if not isinstance(to_address, list): raise AssertionError('destination address should be a list []') + if cc: + if not isinstance(cc, list): + raise AssertionError('cc address should be a list []') + self.msg = MIMEMultipart() self.msg['Subject'] = subject self.msg['From'] = from_address self.msg['To'] = COMMASPACE.join(to_address) + if cc: + self.msg['Cc'] = COMMASPACE.join(cc) self.msg.attach(MIMEText(msg, 'html')) def attach(self, files): diff --git a/setup.py b/setup.py index d299112..7205000 100644 --- a/setup.py +++ b/setup.py @@ -1,18 +1,19 @@ -import setuptools +import pyutl as pkg +from setuptools import setup, find_packages with open("README.md", "r") as fh: long_description = fh.read() -setuptools.setup( - name="pyutl", - version="2.1", - author="Josue Gomez", - author_email="jgomez@binkfe.com", - description="A package of utilities for python", +setup( + name=pkg.__title__, + version=pkg.__version__, + author=pkg.__author__, + author_email=pkg.__email__, + description=pkg.__description__, long_description=long_description, long_description_content_type="text/markdown", - url="https://git.binkfe.com/jesrat/pyutils", - packages=['pyutl'], + url=pkg.__url__, + packages=find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License",