diff --git a/.gitignore b/.gitignore index 7a1f55069cd6f68e68607b72f73189f193db0ec9..418bfe90e427b1531c1ef888f802692f34f2e44f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,9 @@ .idea __pycache__/ -#upload.bat -#pyproject.toml -#delete.py *.pyc venv build -cacode_framework.egg-info +summer_python.egg-info dist upload.bat pyproject.toml diff --git a/README.md b/README.md index f98ea742730587f1aae047b78329e64c588c7bc7..61116377c9aec17d1873897d7a34474d5b3d9e00 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ # 安装 -> pip命令:pip install summer-framework +> pip命令:pip install summer-python ## 先决条件 diff --git a/pypi.md b/pypi.md index 6b28188a0784e3f405963fe780cb7a810d471aaf..4b09b475c4c5c83027a59dea1e829a8666410353 100644 --- a/pypi.md +++ b/pypi.md @@ -15,7 +15,7 @@ # 安装 -> pip命令:pip install summer-framework +> pip命令:pip install summer-python ## 先决条件 @@ -42,7 +42,3 @@ ```text 内置json解析器和数据库连接池,带有缓存机制,能够在极大程度减少对数据库的压力 ``` - -# CACode Development Team - - diff --git a/setup.py b/setup.py index 79d223297a3e9c12f690178be9f9e0f1d8429dc8..e0d3d804b30c7d183193764c6e8f39f3a6beb835 100644 --- a/setup.py +++ b/setup.py @@ -1,11 +1,11 @@ import setuptools -with open("README.md", "r", encoding="utf-8") as fh: +with open("pypi.md", "r", encoding="utf-8") as fh: long_description = fh.read() setuptools.setup( - name="summer_framework", - version="1.0.0", + name="summer-python", + version="1.0.0b2", author="CACode", author_email="cacode@163.com", description="Summer framework for Python,You can see:https://gitee.com/cacode_cctvadmin/summer-python", diff --git a/summer/cacode/Serialize.py b/summer/cacode/Serialize.py index 49e188f051a00c5cb6c776e2ee99c8dfb9cea16a..a837b1f4e174c60db9096e0633cbf4ae0cd2ec13 100644 --- a/summer/cacode/Serialize.py +++ b/summer/cacode/Serialize.py @@ -267,20 +267,8 @@ class QuerySet(list): list.__init__([]) if query_items is None: self.__instance__ = instance - - self.__using_fields__ = self.__instance__.getFields() - self.__all_using_fields__ = JsonUtil.parse( - obj=self.__instance__, end_load=True) - - self.__ignore_field__ = {} - self.__append_field__ = {} # 合并结果集对象 self.extend(base_data) - # for i in base_data: - # self.append(i) - # self.append( - # QueryItem(data_item=i, using_fields=self.__using_fields__, append_field=self.__append_field__, - # ignore_field=self.__ignore_field__)) else: self.extend(query_items) @@ -322,19 +310,14 @@ class QuerySet(list): """ 添加一个不会被解析忽略的字段 """ - if key not in self.__append_field__.keys() and \ - key not in self.__using_fields__.keys() and \ - key not in self.__all_using_fields__.keys(): - self.__append_field__[key] = default_value - else: - CACodeLog.log(obj=self, msg='`{}` already exists'.format(key)) + [self[i].add_field(key, default_value) for i in range(len(self))] def remove_field(self, key): """ 添加一个会被解析忽略的字段 """ - self.__ignore_field__[key] = None + [self[i].remove_field(key) for i in range(len(self))] def get(self, index): """ diff --git a/summer/exception/e_fields.py b/summer/exception/e_fields.py index d31400f0aa876f79879612b6033d0489b9514bc7..eec1132c1a72bc40213a4a97fb337c6ebfae09bf 100644 --- a/summer/exception/e_fields.py +++ b/summer/exception/e_fields.py @@ -1,3 +1,13 @@ +__all__ = [ + 'mat', 'CACode_SqlError', 'CACode_Factory_Error', + 'Json_Error', 'Syntax_Error', 'Attribute_Error', + 'Attribute_Error', 'Log_Opera_Name', 'Miss_Attr', + 'Error', 'Warn', 'Info', + 'Database_Operation', 'Parse_Error', 'FieldNotExist', + 'ModuleCreateError' +] + + def mat(prefix, suffix): return '%s:%s' % (prefix, suffix) diff --git a/summer/pojoManager/tag.py b/summer/field/tag.py similarity index 100% rename from summer/pojoManager/tag.py rename to summer/field/tag.py diff --git a/summer/util/DBPool/__init__.py b/summer/opera/DBPool/__init__.py similarity index 100% rename from summer/util/DBPool/__init__.py rename to summer/opera/DBPool/__init__.py diff --git a/summer/util/DBPool/persistent_db.py b/summer/opera/DBPool/persistent_db.py similarity index 100% rename from summer/util/DBPool/persistent_db.py rename to summer/opera/DBPool/persistent_db.py diff --git a/summer/util/DBPool/persistent_pg.py b/summer/opera/DBPool/persistent_pg.py similarity index 100% rename from summer/util/DBPool/persistent_pg.py rename to summer/opera/DBPool/persistent_pg.py diff --git a/summer/util/DBPool/pooled_db.py b/summer/opera/DBPool/pooled_db.py similarity index 100% rename from summer/util/DBPool/pooled_db.py rename to summer/opera/DBPool/pooled_db.py diff --git a/summer/util/DBPool/pooled_pg.py b/summer/opera/DBPool/pooled_pg.py similarity index 100% rename from summer/util/DBPool/pooled_pg.py rename to summer/opera/DBPool/pooled_pg.py diff --git a/summer/util/DBPool/simple_pooled_db.py b/summer/opera/DBPool/simple_pooled_db.py similarity index 100% rename from summer/util/DBPool/simple_pooled_db.py rename to summer/opera/DBPool/simple_pooled_db.py diff --git a/summer/util/DBPool/simple_pooled_pg.py b/summer/opera/DBPool/simple_pooled_pg.py similarity index 100% rename from summer/util/DBPool/simple_pooled_pg.py rename to summer/opera/DBPool/simple_pooled_pg.py diff --git a/summer/util/DBPool/steady_db.py b/summer/opera/DBPool/steady_db.py similarity index 100% rename from summer/util/DBPool/steady_db.py rename to summer/opera/DBPool/steady_db.py diff --git a/summer/util/DBPool/steady_pg.py b/summer/opera/DBPool/steady_pg.py similarity index 100% rename from summer/util/DBPool/steady_pg.py rename to summer/opera/DBPool/steady_pg.py diff --git a/summer/opera/global_db.py b/summer/opera/global_db.py index d412ae2d8b1341338c2b71749fca684016bff140..1d4840eab9e4cb800a3db3eb0f49997c5312001f 100644 --- a/summer/opera/global_db.py +++ b/summer/opera/global_db.py @@ -3,7 +3,6 @@ import threading from summer.cacode.Modes import Singleton from summer.exception import DBException -from summer.util.DBPool.pooled_db import PooledDB from summer.util.Log import CACodeLog @@ -135,6 +134,7 @@ class Db_opera(object): 初始化数据库连接池 """ if self.POOL is None: + from summer.opera.DBPool.pooled_db import PooledDB self.POOL = PooledDB(creator=self.creator, maxconnections=self.maxconnections, mincached=self.mincached, maxcached=self.maxcached, maxshared=self.maxshared, diff --git a/summer/opera/op_db.py b/summer/opera/op_db.py index d624e381028533997db2ebe537539e5f042f7fcc..38f5848023ccdbc219097f21447f93da3ab5b02d 100644 --- a/summer/opera/op_db.py +++ b/summer/opera/op_db.py @@ -33,12 +33,13 @@ class DbOperation(object): # _kw = JsonUtil.load(JsonUtil.parse(_lock)) _kw = _lock.__dict__ kwargs.update(_kw) - _t = threading.Thread(target=func, args=args, kwargs=kwargs, name=name) - _t.start() + from concurrent.futures import ThreadPoolExecutor + pool = ThreadPoolExecutor() + _t = pool.submit(fn=func, *args, **kwargs) + # _t = threading.Thread(target=func, args=args, kwargs=kwargs, name=name) if not _lock.close_log: CACodeLog.log(obj=_t, msg='TASK-{} RUNNING'.format(name), task_name=name, LogObject=kwargs['log_obj']) - # 等待任务完成 - _t.join() + result = _t.result() # 返回结果 return self.result diff --git a/summer/pojoManager/__init__.py b/summer/pojoManager/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/summer/util/Log.py b/summer/util/Log.py index ee6ae41e49c863e613531602a056fe31fb062f29..70930ebb564d1abac91afc6733bbc10ab112b804 100644 --- a/summer/util/Log.py +++ b/summer/util/Log.py @@ -81,12 +81,16 @@ class ConsoleColor: class ConsoleWrite: + def __init__(self): + self.fontColor = ConsoleColor.FontColor.GREEN + self.showType = ConsoleColor.ShowType.DEFAULT + self.backColor = None @staticmethod - def write(messages, fontColor=ConsoleColor.FontColor.WHITE, backColor=None, showType=ConsoleColor.ShowType.DEFAULT): - prefix = "{};".format(showType) if showType is not None else "" - center = ";".format(backColor) if backColor is not None else "" - suffix = "{}m{}".format(fontColor, messages) + def write(messages, consoleWriteObj): + prefix = "{};".format(consoleWriteObj.showType) if consoleWriteObj.showType is not None else "" + center = ";".format(consoleWriteObj.backColor) if consoleWriteObj.backColor is not None else "" + suffix = "{}m{}".format(consoleWriteObj.fontColor, messages) out = "\033[{}{}{}\033[0m".format(prefix, center, suffix) print(out) @@ -158,8 +162,7 @@ class CACodeLog(object): @staticmethod def log(msg, obj=None, line=sys._getframe().f_back.f_lineno, operation_name=e_fields.Log_Opera_Name("Task"), task_name='Task', LogObject=None, field=e_fields.Info(), func=None, - fontColor=ConsoleColor.FontColor.SUCCESS_COLOR, - showType=ConsoleColor.ShowType.HIGHLIGHT): + consoleWriteObj=ConsoleWrite()): """ 输出任务执行日志 @@ -209,8 +212,7 @@ class CACodeLog(object): msg = f"\t\t:{msg}" info = "{}{}{}{}{}{}{}{}".format(t, field, line, operation_name, hex_id, write_repr, task_name, msg) - - ConsoleWrite.write(messages=info, fontColor=fontColor, showType=showType) + ConsoleWrite.write(messages=info, consoleWriteObj=consoleWriteObj) # 输出日志信息 # file = sys.stdout # file.write(info) @@ -226,9 +228,13 @@ class CACodeLog(object): @staticmethod def warning(msg, obj=None, line=sys._getframe().f_back.f_lineno, task_name='Task', LogObject=None): + + consoleWrite = ConsoleWrite() + consoleWrite.fontColor = ConsoleColor.FontColor.WARNING_COLOR + CACodeLog.log(msg=msg, obj=obj, line=line, task_name=task_name, LogObject=LogObject, field=e_fields.Warn(), func=LogObject.warn if LogObject is not None else None, - fontColor=ConsoleColor.FontColor.WARNING_COLOR) + consoleWriteObj=consoleWrite) @staticmethod def log_error(msg, obj=None, line=sys._getframe().f_back.f_lineno, task_name='Task', LogObject=None, @@ -243,9 +249,13 @@ class CACodeLog(object): """ if raise_exception: raise obj(msg) + + consoleWrite = ConsoleWrite() + consoleWrite.fontColor = ConsoleColor.FontColor.ERROR_COLOR + CACodeLog.log(msg=msg, obj=obj, line=line, task_name=task_name, LogObject=LogObject, field=e_fields.Error(), func=LogObject.warn if LogObject is not None else None, - fontColor=ConsoleColor.FontColor.ERROR_COLOR) + consoleWriteObj=consoleWrite) @staticmethod def err(cls, msg, LogObject=None): diff --git a/summer/util/ParseUtil.py b/summer/util/ParseUtil.py index 89442a18509be4afc15d3278cf9ef7fa7ff5523d..418a9f752a5838aa2cc30694dad39ad2d950c611 100644 --- a/summer/util/ParseUtil.py +++ b/summer/util/ParseUtil.py @@ -3,7 +3,7 @@ import copy from typing import List from summer.exception import FieldNotExist -from summer.pojoManager import tag +from summer.field import tag from summer.util.Log import CACodeLog diff --git a/summer/pojoManager/Manage.py b/summer/work/Manage.py similarity index 92% rename from summer/pojoManager/Manage.py rename to summer/work/Manage.py index 0d94b07dfb4afd88490232f2217df8b726a51022..89db2d8133c08e05f8d8f72e3b6b792d25c9bbb9 100644 --- a/summer/pojoManager/Manage.py +++ b/summer/work/Manage.py @@ -1,9 +1,11 @@ -from summer.work.orm import CACodePureORM +__all__ = ['Pojo', 'tag'] +__version__ = '1.0.0pre1' + from summer.cacode.Serialize import QuerySet -from summer.pojoManager import tag +from summer.work.orm import CACodePureORM +from summer.field import tag from summer.cacode.Serialize import JsonUtil from summer.work import repository -from summer.util.Log import CACodeLog class Pojo(repository.Repository): @@ -22,8 +24,6 @@ class Pojo(repository.Repository): if not hasattr(self, '__table_msg__'): self.__table_msg__ = 'The current object has no description' - self.__table_name__ = self.__table_name__ - self.__table_msg__ = self.__table_msg__ self.__fields__ = {} # 在这里将config_obj实例化 self.serializer = serializer @@ -55,7 +55,7 @@ class Pojo(repository.Repository): if not hasattr(self, key) or getattr(self, key) is None or t_v in [tag.Template, tag.baseTag]: setattr(self, key, value.default) fds[key] = value if value.default is None else value.default - except SyntaxError as a: + except SyntaxError: continue self.__fields__ = fds @@ -79,7 +79,8 @@ class Pojo(repository.Repository): new_dict = {} for key in all_fields.keys(): # 当字段为未填充状态时,默认定义为空 - new_dict[key] = getattr(self, key) if hasattr(self, key) else None + new_dict[key] = getattr(self, key) if hasattr(self, key) else all_fields[ + key] if key in all_fields.keys() else None return JsonUtil.parse(new_dict, bf=bf) def to_dict(self): @@ -89,11 +90,15 @@ class Pojo(repository.Repository): return JsonUtil.load(self.to_json()) def getFields(self) -> dict: + """ + 获取当前类所需要序列化的字段 + """ return self.__fields__ def markTable(self): """ 将表生成至外部文件 + TODO:没做,懒得做 """ pass @@ -103,8 +108,6 @@ class Pojo(repository.Repository): """ if key not in self.__append_field__.keys(): self.__append_field__[key] = default_value - else: - CACodeLog.log(obj=self, msg='`{}` already exists'.format(key)) def remove_field(self, key): """ diff --git a/summer/work/SummerAdapter.py b/summer/work/SummerAdapter.py index 46b7cd4ea28833ba70b88507cb10ebd1d13b0505..afd6a9022df1bb448b896b5e3a410d0a95215e38 100644 --- a/summer/work/SummerAdapter.py +++ b/summer/work/SummerAdapter.py @@ -11,8 +11,13 @@ class LanguageAdapter: def __init__(self): if not hasattr(self, 'funcs'): self.funcs = {} - self.sp('like', self._like_opera) - self.sp('in', self._in_opera) + self.__sp('like', self._like_opera) + self.__sp('in', self._in_opera) + self.__sp('lt', self._lt_opera) + self.__sp('gt', self._gt_opera) + self.__sp('le', self._le_opera) + self.__sp('ge', self._ge_opera) + self.__sp('eq', self._eq_opera) def _like_opera(self, instance, key, value): instance.args.append('`' + key + '`') @@ -30,6 +35,36 @@ class LanguageAdapter: else: raise AttributeError('value type is not list or QuerySet object') - def sp(self, key, val): + def _lt_opera(self, instance, key, value): + instance.args.append('`' + key + '`') + instance.args.append(' < ') + instance.args.append('%s') + instance.params.append(value) + + def _gt_opera(self, instance, key, value): + instance.args.append('`' + key + '`') + instance.args.append(' > ') + instance.args.append('%s') + instance.params.append(value) + + def _le_opera(self, instance, key, value): + instance.args.append('`' + key + '`') + instance.args.append(' > ') + instance.args.append('%s') + instance.params.append(value) + + def _ge_opera(self, instance, key, value): + instance.args.append('`' + key + '`') + instance.args.append(' > ') + instance.args.append('%s') + instance.params.append(value) + + def _eq_opera(self, instance, key, value): + instance.args.append('`' + key + '`') + instance.args.append(' = ') + instance.args.append('%s') + instance.params.append(value) + + def __sp(self, key, val): if key not in self.funcs.keys(): self.funcs[key] = val diff --git a/summer/work/orm.py b/summer/work/orm.py index e5b5b7755bf704c72898990008147009fc684543..70e0dcd546731e84bae25469912b01c7c925c0e8 100644 --- a/summer/work/orm.py +++ b/summer/work/orm.py @@ -38,6 +38,7 @@ s """ self.sqlFields.right_subscript) self.first_data = False + self._result = [] def top(self): return self.find().limit(1) @@ -67,28 +68,6 @@ s """ values_str=self.sqlFields.values_str) self.args.append(sql['sql']) self.params = sql['params'] - - # _dict = pojo.__dict__ - # keys = [] - # # 解析item - # for key, value in _dict.items(): - # # 去除为空的键 - # if value is None: - # continue - # keys.append('`{}`{}'.format(key, comma)) - # self.params.append(value) - # for i in keys: - # self.args.append(i) - # # 将最后一个字段的逗号改成空格 - # self.rep_sym(comma, space) - # # 加上右边括号 - # self.args.append(right_par) - # self.args.append('{}{}'.format(values_str, left_par)) - # for i in keys: - # self.args.append('%s{}'.format(comma)) - # # 将最后一个字段的逗号改成空格 - # self.rep_sym(comma, space) - # self.args.append(right_par) return self def delete(self): @@ -154,8 +133,9 @@ s """ fs = fields.split(',') if len(fs) != len(asses): # 匿名参数长度与字段长度不符合 - raise TypeError( - 'The length of the anonymous parameter does not match the length of the field') + CACodeLog.log_error(obj=TypeError, + msg='The length of the anonymous parameter does not match the length of the field', + raise_exception=True) for i, v in enumerate(fs): if asses[i] is not None: self.args.append('{}{}{}'.format( @@ -324,7 +304,7 @@ s """ self.args.append(self.sqlFields.ander_str) return self - def run(self, need_sql=False): + def run(self, need_sql=False, serializer=True, **kwargs): """ 最终执行任务 """ @@ -336,20 +316,20 @@ s """ if need_sql: return sql if self.sqlFields.find_str in sql: - _result = self.repository.db_util.select( + self._result = self.repository.db_util.select( sql=sql, params=self.params, print_sql=print_sql, last_id=last_id ) _result_objs = [] - for i in _result: + for i in self._result: _obj = self.ParseUtil.parse_obj( data=i, instance=self.repository.instance) _result_objs.append(_obj) - _result = _result_objs + self._result = _result_objs else: - _result = self.repository.db_util.update( + self._result = self.repository.db_util.update( sql=sql, params=self.params, print_sql=print_sql, @@ -359,11 +339,18 @@ s """ self.args.clear() self.params.clear() if self.first_data: - if type(_result) is list or type(_result) is tuple: - return self.serializer(instance=self.repository.instance, base_data=_result).first() + if (isinstance(self._result, list) or isinstance(self._result, tuple)) and self._result and len( + self._result) > 0: + if not serializer: + return self._result[0] + return self.serializer(instance=self.repository.instance, base_data=self._result).first() + else: + return None else: + if not serializer: + return self._result q = self.serializer( - instance=self.repository.instance, base_data=_result) + instance=self.repository.instance, base_data=self._result) return q def con_from(self): @@ -390,8 +377,8 @@ s """ 1] = str(self.args[len(self.args) - 1]).replace(sym, rep) return self - def end(self): - return self.run() + def end(self, **kwargs): + return self.run(**kwargs) def __rshift__(self, other): """ @@ -412,3 +399,8 @@ s """ self.args.append(' ( ') self.args = self.args + new_args return self + + def serializer(self): + q = self.serializer( + instance=self.repository.instance, base_data=self._result) + return q diff --git a/summer/work/repository.py b/summer/work/repository.py index 12c81865c3b1fbd7a7cd5dc30652f38e3b52ac69..b9d80568dbd51ed442d8a2075b9b11d27da34ec1 100644 --- a/summer/work/repository.py +++ b/summer/work/repository.py @@ -81,10 +81,10 @@ class Repository: self.ParseUtil = config_obj ParseUtil = self.ParseUtil ParseUtil.set_field_compulsory(self, key='config_obj', data=kwargs, val=config_obj) - ParseUtil.set_field_compulsory(obj=self, data=kwargs, key='abs', val=False) + ParseUtil.set_field_compulsory(obj=self, data=kwargs, key='abst', val=False) # 当本类为抽象类时,仅设置所需要的值 ParseUtil.set_field_compulsory(self, key='close_log', data=kwargs, val=close_log) - if hasattr(self, 'close_log') and not self.close_log and not self.abs: + if hasattr(self, 'close_log') and not self.close_log and not self.abst: CACodeLog.warning(obj=self, msg='Being Initialize this object') # 有没有表名 ParseUtil.set_field_compulsory(self, key='__table_name__', data=kwargs, @@ -95,7 +95,7 @@ class Repository: # 取得字段的名称 ParseUtil.set_field_compulsory(self, key='fields', data=kwargs, val=list(self.instance.getFields().keys())) # 当当前类为抽象类时,为类取消初始化数据库配置 - if not self.abs: + if not self.abst: # 操作类 ParseUtil.set_field_compulsory(self, key='operation', data=kwargs, val=op_db.DbOperation()) # 获取sql方言配置 diff --git a/summer_framework.egg-info/PKG-INFO b/summer_framework.egg-info/PKG-INFO deleted file mode 100644 index f8b5baf789d91d6839845cb4a05eeaab4ea0ef9b..0000000000000000000000000000000000000000 --- a/summer_framework.egg-info/PKG-INFO +++ /dev/null @@ -1,68 +0,0 @@ -Metadata-Version: 2.1 -Name: summer-framework -Version: 1.0.0 -Summary: Summer framework for Python,You can see:https://gitee.com/cacode_cctvadmin/summer-python -Home-page: https://gitee.com/cacode_cctvadmin/summer-python -Author: CACode -Author-email: cacode@163.com -License: Apache License 2.0 -Project-URL: Bug Tracker, https://gitee.com/cacode_cctvadmin/summer-python/issues -Description:
-
-