gomyck-tools 1.4.1__py3-none-any.whl → 1.4.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. ctools/__init__.py +21 -0
  2. ctools/ai/env_config.py +18 -1
  3. ctools/ai/llm_chat.py +8 -8
  4. ctools/ai/llm_client.py +26 -24
  5. ctools/ai/mcp/mcp_client.py +33 -17
  6. ctools/ai/tools/json_extract.py +3 -2
  7. ctools/ai/tools/quick_tools.py +71 -22
  8. ctools/ai/tools/tool_use_xml_parse.py +2 -1
  9. ctools/ai/tools/xml_extract.py +3 -0
  10. ctools/application.py +21 -19
  11. ctools/aspect.py +65 -0
  12. ctools/auto/browser_element.py +11 -3
  13. ctools/auto/plan_area.py +2 -2
  14. ctools/auto/pty_process.py +0 -1
  15. ctools/auto/screenshot.py +3 -4
  16. ctools/auto/win_canvas.py +10 -4
  17. ctools/auto/win_control.py +8 -4
  18. ctools/call.py +32 -47
  19. ctools/cdate.py +43 -2
  20. ctools/cid.py +6 -4
  21. ctools/cipher/aes_util.py +2 -2
  22. ctools/cipher/b64.py +2 -0
  23. ctools/cipher/czip.py +3 -1
  24. ctools/cipher/rsa.py +6 -1
  25. ctools/cipher/sign.py +1 -0
  26. ctools/cipher/sm_util.py +3 -0
  27. ctools/cjson.py +5 -0
  28. ctools/cron_lite.py +10 -4
  29. ctools/database/database.py +52 -22
  30. ctools/dict_wrapper.py +1 -0
  31. ctools/ex.py +4 -0
  32. ctools/geo/coord_trans.py +94 -94
  33. ctools/geo/douglas_rarefy.py +13 -9
  34. ctools/metrics.py +6 -0
  35. ctools/office/cword.py +7 -7
  36. ctools/office/word_fill.py +1 -4
  37. ctools/patch.py +88 -0
  38. ctools/path_info.py +29 -0
  39. ctools/pkg/__init__.py +4 -0
  40. ctools/pkg/dynamic_imp.py +38 -0
  41. ctools/pools/process_pool.py +6 -1
  42. ctools/pools/thread_pool.py +6 -2
  43. ctools/similar.py +3 -0
  44. ctools/stream/ckafka.py +11 -5
  45. ctools/stream/credis.py +37 -23
  46. ctools/stream/mqtt_utils.py +2 -2
  47. ctools/sys_info.py +8 -0
  48. ctools/sys_log.py +4 -1
  49. ctools/util/cftp.py +4 -2
  50. ctools/util/cklock.py +118 -0
  51. ctools/util/config_util.py +52 -0
  52. ctools/util/http_util.py +1 -0
  53. ctools/util/image_process.py +8 -0
  54. ctools/util/jb_cut.py +53 -0
  55. ctools/util/snow_id.py +3 -2
  56. ctools/web/__init__.py +2 -2
  57. ctools/web/aio_web_server.py +19 -9
  58. ctools/web/api_result.py +3 -2
  59. ctools/web/bottle_web_base.py +134 -70
  60. ctools/web/bottle_webserver.py +41 -35
  61. ctools/web/bottle_websocket.py +4 -0
  62. ctools/web/ctoken.py +81 -13
  63. ctools/web/download_util.py +1 -1
  64. ctools/web/params_util.py +4 -0
  65. ctools/web/upload_util.py +1 -1
  66. {gomyck_tools-1.4.1.dist-info → gomyck_tools-1.4.3.dist-info}/METADATA +9 -11
  67. gomyck_tools-1.4.3.dist-info/RECORD +88 -0
  68. ctools/auto/pacth.py +0 -74
  69. gomyck_tools-1.4.1.dist-info/RECORD +0 -82
  70. {gomyck_tools-1.4.1.dist-info → gomyck_tools-1.4.3.dist-info}/WHEEL +0 -0
  71. {gomyck_tools-1.4.1.dist-info → gomyck_tools-1.4.3.dist-info}/licenses/LICENSE +0 -0
  72. {gomyck_tools-1.4.1.dist-info → gomyck_tools-1.4.3.dist-info}/top_level.txt +0 -0
@@ -5,51 +5,41 @@ from wsgiref.simple_server import WSGIServer, WSGIRequestHandler, make_server
5
5
  from bottle import ServerAdapter, Bottle, template, static_file, abort, redirect, response
6
6
 
7
7
  from ctools import sys_info
8
+ from ctools.pkg.dynamic_imp import load_modules_from_package
9
+ from ctools.web.bottle_web_base import cache_white_list
8
10
 
9
- """
10
- module_names = list(globals().keys())
11
- def get_modules():
12
- mods = []
13
- for modname in module_names:
14
- if modname == 'base' or modname == 'online' or modname.startswith('__') or modname == 'importlib': continue
15
- module = globals()[modname]
16
- mods.append(module)
17
- return mods
18
-
19
- def get_ws_modules():
20
- from . import websocket
21
- return [websocket]
22
- """
23
11
 
24
12
  """
25
- from ctools import bottle_web_base, ctoken, bottle_webserver
26
- from ctools.api_result import R
13
+ import controllers
14
+ from ctools import patch
15
+ from ctools.database import database
16
+ from ctools.util.config_util import load_config
17
+ from ctools.web import bottle_web_base, bottle_webserver
18
+ from key_word_cloud.db_core.db_init import init_partitions
19
+ from patch_manager import patch_funcs
27
20
 
28
- secret_key = "xxx"
29
- app = bottle_web_base.init_app('子模块写 context_path, 主模块就不用写任何东西')
21
+ database.init_db('postgresql://postgres:123123@192.168.xx.xx:5432/xxx', default_schema='xxx', auto_gen_table=False, echo=False)
30
22
 
31
- # 通用的鉴权方法
32
- @bottle_web_base.before_intercept(0)
33
- def token_check():
34
- return bottle_web_base.common_auth_verify(secret_key)
23
+ config = load_config('application.ini')
35
24
 
36
- @app.post('/login')
37
- def login(params):
38
- return R.ok(ctoken.gen_token({'username': 'xxx'}, secret_key, 3600))
25
+ patch.sync_version(config.base.app_name, config.base.version, patch_funcs)
26
+ init_partitions()
39
27
 
40
- @app.get('/demo')
41
- @bottle_web_base.rule('DOC:DOWNLOAD')
42
- def demo(params):
43
- print(params)
28
+ app = bottle_web_base.init_app("/api", True)
44
29
 
45
- main_app = bottle_webserver.init_bottle() # 这里可以传 APP 当做主模块, 但是 context_path 就不好使了, 上下文必须是 /
46
- main_app.mount(app.context_path, app)
47
- main_app.set_index(r'轨迹点位压缩.html')
48
- main_app.run()
30
+ @bottle_web_base.before_intercept(0)
31
+ def token_check():
32
+ return bottle_web_base.common_auth_verify(config.base.secret_key)
33
+
34
+ if __name__ == '__main__':
35
+ main_server = bottle_webserver.init_bottle(app)
36
+ main_server.auto_mount(controllers)
37
+ main_server.run()
49
38
  """
50
39
 
51
40
  _default_port = 8888
52
41
 
42
+
53
43
  class CBottle:
54
44
 
55
45
  def __init__(self, bottle: Bottle, port=_default_port, quiet=False):
@@ -98,7 +88,8 @@ class CBottle:
98
88
 
99
89
  def run(self):
100
90
  http_server = WSGIRefServer(port=self.port)
101
- print('Click the link below to open the service homepage %s' % '\n \t\t http://localhost:%s \n \t\t http://%s:%s' % (self.port, sys_info.get_local_ipv4(), self.port), file=sys.stderr)
91
+ print('Click the link below to open the service homepage %s' % '\n \t\t http://localhost:%s \n \t\t http://%s:%s' % (self.port, sys_info.get_local_ipv4(), self.port), file=sys.stderr)
92
+ cache_white_list(self.bottle)
102
93
  self.bottle.run(server=http_server, quiet=self.quiet)
103
94
 
104
95
  def set_index(self, filename='index.html', root='./', is_tpl=False, redirect_url=None, **kwargs):
@@ -118,16 +109,31 @@ class CBottle:
118
109
  if not context_path: return
119
110
  self.bottle.mount(context_path, app, **kwargs)
120
111
 
121
- def init_bottle(app:Bottle=None, port=_default_port, quiet=False) -> CBottle:
112
+ def auto_mount(self, package, exclude=None, recursive=True):
113
+ for module in load_modules_from_package(package, exclude, recursive):
114
+ if self.bottle.context_path != '/':
115
+ if module.app.context_path == '/':
116
+ ctx_path = self.bottle.context_path
117
+ else:
118
+ ctx_path = self.bottle.context_path + module.app.context_path
119
+ else:
120
+ ctx_path = module.app.context_path
121
+ print("mount: %s on %s" % (ctx_path, module.__name__))
122
+ self.bottle.mount(ctx_path, module.app)
123
+
124
+ def init_bottle(app: Bottle = None, port=_default_port, quiet=False) -> CBottle:
122
125
  bottle = app or Bottle()
123
126
  return CBottle(bottle, port, quiet)
124
127
 
128
+
125
129
  class ThreadedWSGIServer(ThreadingMixIn, WSGIServer):
126
130
  daemon_threads = True
127
131
 
132
+
128
133
  class CustomWSGIHandler(WSGIRequestHandler):
129
134
  def log_request(*args, **kw): pass
130
135
 
136
+
131
137
  class WSGIRefServer(ServerAdapter):
132
138
 
133
139
  def __init__(self, host='0.0.0.0', port=_default_port):
@@ -33,6 +33,7 @@ socket_app.run()
33
33
 
34
34
  _default_port = 8887
35
35
 
36
+
36
37
  class CBottle:
37
38
 
38
39
  def __init__(self, bottle: Bottle, port=_default_port, quiet=False):
@@ -47,10 +48,12 @@ class CBottle:
47
48
  def mount(self, context_path, app):
48
49
  self.bottle.mount(context_path, app)
49
50
 
51
+
50
52
  def init_bottle(port=_default_port, quiet=False) -> CBottle:
51
53
  bottle = Bottle()
52
54
  return CBottle(bottle, port, quiet)
53
55
 
56
+
54
57
  class CustomWebSocketHandler(WebSocketHandler):
55
58
  def log_request(self):
56
59
  if '101' not in str(self.status):
@@ -60,6 +63,7 @@ class CustomWebSocketHandler(WebSocketHandler):
60
63
  return
61
64
  self.logger.info(log_msg)
62
65
 
66
+
63
67
  class WebSocketServer(ServerAdapter):
64
68
 
65
69
  def __init__(self, host='0.0.0.0', port=_default_port):
ctools/web/ctoken.py CHANGED
@@ -8,28 +8,96 @@ import time
8
8
  import jwt
9
9
  from bottle import request
10
10
 
11
+ from ctools import cid
11
12
  from ctools.dict_wrapper import DictWrapper
12
13
 
13
- token_header = 'Authorization'
14
14
 
15
- def gen_token(payload: {}, secret_key, expired: int=3600) -> str:
16
- payload.update({'exp': time.time() + expired})
17
- return jwt.encode(payload, secret_key, algorithm='HS256')
15
+ class CToken:
16
+ token_audience = ["gomyck"]
17
+ token_secret_key = 'gomyck123'
18
+ token_header = 'Authorization'
18
19
 
19
- def get_payload(token, secret_key):
20
+ def gen_token(userid, username, payload={}, expired: int = 3600, rules= []) -> str:
21
+ if expired and expired > 0: payload.update({'exp': time.time() + expired})
22
+ payload.update({'iss': "gomyck", 'jti': cid.get_snowflake_id_str(), 'nbf': time.time(), 'iat': time.time()})
23
+ payload.update({'rules': rules})
24
+ payload.update({'uid': userid})
25
+ payload.update({'sub': username})
26
+ payload.update({'aud': CToken.token_audience})
27
+ payload.update({'rules': rules})
28
+ return jwt.encode(payload, CToken.token_secret_key, algorithm='HS256')
29
+
30
+ def get_payload(token=None):
20
31
  try:
21
- payload = jwt.decode(token, secret_key, algorithms=['HS256'])
32
+ if token is None: token = get_token()
33
+ payload = jwt.decode(token, options={"verify_signature": False}, algorithms=['HS256'])
22
34
  return DictWrapper(payload)
23
35
  except Exception as e:
24
36
  return None
25
37
 
26
- def get_token(key):
27
- return get_payload(request.get_header(token_header), key)
38
+ def get_token_payload(token=None):
39
+ if token is None: token = get_token()
40
+ return get_payload(token)
41
+
42
+ def is_valid(token=None):
43
+ """
44
+ 判断token是否有效
45
+ :param token: token 信息
46
+ :return: 是否有效
47
+ """
48
+ if token is None: token = get_token()
49
+ if token is None: return False
50
+ try:
51
+ jwt.decode(token, CToken.token_secret_key, algorithms=['HS256'], audience=CToken.token_audience)
52
+ except Exception as e:
53
+ print(e)
54
+ return False
55
+ return True
56
+
57
+ def get_user_name():
58
+ """
59
+ 获取用户名称
60
+ :return: 用户ID
61
+ """
62
+ token_obj = get_token_attr("sub")
63
+ return token_obj
64
+
65
+ def get_user_id():
66
+ """
67
+ 获取用户ID
68
+ :return: 用户ID
69
+ """
70
+ token_obj = get_token_attr("uid")
71
+ return token_obj
72
+
73
+ def get_token_id():
74
+ """
75
+ 获取token id
76
+ :return: token id
77
+ """
78
+ token_obj = get_token_attr("jti")
79
+ return token_obj
80
+
81
+ def get_app_flag() -> []:
82
+ """
83
+ 获取服务标识
84
+ :return: 服务标识 []
85
+ """
86
+ token_obj = get_token_attr("aud")
87
+ return token_obj
88
+
89
+ def get_token_attr(attr):
90
+ token_obj = get_token_payload()
91
+ return getattr(token_obj, attr, None)
28
92
 
29
- def is_valid(key):
30
- return get_payload(request.get_header(token_header), key) is not None
93
+ def get_token():
94
+ auth_token = request.get_header(CToken.token_header)
95
+ if auth_token is None:
96
+ auth_token = request.get_cookie(CToken.token_header)
97
+ return auth_token
31
98
 
32
99
  # if __name__ == '__main__':
33
- # token = gen_token({"xx": 123}, '123')
34
- # xx = get_payload(token, '123')
35
- # print(xx.xx)
100
+ # token = gen_token(123, username='xxx', expired=0)
101
+ # print(token)
102
+ # print(get_payload(token))
103
+ # print(is_valid(token))
@@ -13,7 +13,7 @@ log = sys_log.flog
13
13
  """
14
14
 
15
15
 
16
- def download(file_path: str, download_name:str=None):
16
+ def download(file_path: str, download_name: str = None):
17
17
  """
18
18
  文件下载
19
19
  :param file_path: 静态文件路径
ctools/web/params_util.py CHANGED
@@ -3,6 +3,7 @@
3
3
  __author__ = 'haoyang'
4
4
  __date__ = '2025/6/11 09:35'
5
5
 
6
+
6
7
  def is_list(v: str):
7
8
  try:
8
9
  list(v)
@@ -13,6 +14,7 @@ def is_list(v: str):
13
14
  except Exception:
14
15
  return False
15
16
 
17
+
16
18
  def is_digit(v: str):
17
19
  try:
18
20
  float(v)
@@ -20,12 +22,14 @@ def is_digit(v: str):
20
22
  except Exception:
21
23
  return False
22
24
 
25
+
23
26
  def is_bool(v: str):
24
27
  if v in ["False", "True"]:
25
28
  return True
26
29
  else:
27
30
  return False
28
31
 
32
+
29
33
  def dict_to_params(obj: dict):
30
34
  params = ""
31
35
  for k, v in obj.items():
ctools/web/upload_util.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import os
2
2
 
3
- from ctools import sys_log
4
3
  from ctools import cdate
4
+ from ctools import sys_log
5
5
 
6
6
  log = sys_log.flog
7
7
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gomyck-tools
3
- Version: 1.4.1
3
+ Version: 1.4.3
4
4
  Summary: A tools collection for python development by hao474798383
5
5
  Author-email: gomyck <hao474798383@163.com>
6
6
  License-Expression: Apache-2.0
@@ -15,7 +15,7 @@ Requires-Dist: croniter~=5.0.1
15
15
  Requires-Dist: gmssl~=3.2.2
16
16
  Requires-Dist: psutil~=6.1.0
17
17
  Requires-Dist: jsonpath_ng~=1.7.0
18
- Requires-Dist: bottle~=0.13.2
18
+ Requires-Dist: bottle~=0.13.4
19
19
  Requires-Dist: requests~=2.32.3
20
20
  Requires-Dist: urllib3~=1.26.20
21
21
  Requires-Dist: kafka-python~=2.0.2
@@ -29,15 +29,13 @@ Requires-Dist: paramiko==3.5.0
29
29
  Requires-Dist: pyjwt==2.10.1
30
30
  Requires-Dist: cryptography==44.0.2
31
31
  Requires-Dist: redis==5.2.1
32
- Provides-Extra: db
33
- Requires-Dist: sqlalchemy>=2.0; extra == "db"
34
- Requires-Dist: asyncpg>=0.28; extra == "db"
35
- Provides-Extra: office
36
- Requires-Dist: pandas>=2.2.3; extra == "office"
37
- Requires-Dist: xlrd>=2.0.1; extra == "office"
38
- Requires-Dist: python-docx>=1.1.2; extra == "office"
39
- Provides-Extra: auto-ui
40
- Requires-Dist: pynput==1.7.7; extra == "auto-ui"
32
+ Requires-Dist: uvloop>=0.21.0
33
+ Requires-Dist: jieba>=0.42.1
34
+ Provides-Extra: kwc
35
+ Requires-Dist: imageio>=2.37.0; extra == "kwc"
36
+ Requires-Dist: wordcloud>=1.9.4; extra == "kwc"
37
+ Requires-Dist: jieba==0.42.1; extra == "kwc"
38
+ Requires-Dist: paddlepaddle==2.6.1; extra == "kwc"
41
39
  Dynamic: license-file
42
40
 
43
41
  # Gomyck-Tools
@@ -0,0 +1,88 @@
1
+ ctools/__init__.py,sha256=7EtnbO7mi1iYQeyU4CLusYrwO96_dC7eR7jboyWAqvg,1089
2
+ ctools/application.py,sha256=QFLbwmjznz2HAwVyph9PhzMpJUU5R82eMaVcw5UDSMk,15899
3
+ ctools/aspect.py,sha256=lXrpeu_F3w6v2Hu2yOwQIRGqfDN25_H-1YyW6fPt_mw,1667
4
+ ctools/call.py,sha256=TFFC8PqvCu0PS0XelmV4QXdXezQiUsEacxg3RgKvdwE,1572
5
+ ctools/cdate.py,sha256=OhKAaQfo2Rxd3Jx3g9AfPsaISRoLkstqZdaGT4ZZr_I,3096
6
+ ctools/cdebug.py,sha256=_mihZRCEx_bi7Kv_QPjP4MPLNFrl-GR1Y_irTgOP7OU,4021
7
+ ctools/cid.py,sha256=utxK9u6Df1HuMaiQztqnJ5EENYaJHzZ0pCIuXpveckA,401
8
+ ctools/cjson.py,sha256=XloZIRnc8Wd8OsTAqDRvhmkqbj97KtyzXTDWJm-unZk,1370
9
+ ctools/cron_lite.py,sha256=rVu9S2oouaw_XZ5RMDJidCNepg5yoEJwLcfcaGTuJRA,8235
10
+ ctools/dict_wrapper.py,sha256=0NRtHUX7MVjfIyms_gJiofGcD-x4lBCnaSpkk5yDdjE,461
11
+ ctools/ex.py,sha256=9npepunW0G1obXqjnvUEiNAjQ5XDazZvEtlF5ceFRCM,869
12
+ ctools/metrics.py,sha256=8d0ymwyHF5vDnVmjVqny5puLljX_mSsqAH8BI3tiMYg,5254
13
+ ctools/patch.py,sha256=2eIle4uVTIcy1QMB1LbApo47cQTJ8GnXMihp-Mkgse0,3128
14
+ ctools/path_info.py,sha256=JoEGPeeSu1jMGTIquq2CZFMe7Ergg8gL4DPt3_Q4q0U,2688
15
+ ctools/similar.py,sha256=ByOFaJ2AHZBe3ekoEco5miXcZP1XW7vGecH1i3dES5g,698
16
+ ctools/sys_info.py,sha256=QynB_2nQeGUuUdqJQldtEq916gDfPBsei1OWx9GYKSI,4278
17
+ ctools/sys_log.py,sha256=Sud91NQEVIiqiW6zffv-LrdmVKqva9ijUpdhTxrQhDA,2782
18
+ ctools/ai/__init__.py,sha256=gTYAICILq48icnFbg0HCbsQO8PbU02EDOQ0JeMvfqTY,98
19
+ ctools/ai/env_config.py,sha256=L98G9LPdpD7Yl5XbA_-KfkcA4mDunQoKiYtK5w7QR-s,1790
20
+ ctools/ai/llm_chat.py,sha256=HnuejSXQrwiIn5VDjkF09W78Tki_1KCdf9fWOHGxCxA,8668
21
+ ctools/ai/llm_client.py,sha256=_-lGP_mMqT26D898c_ys_XdHRse5Uqsp0nRBeQJNrzA,6176
22
+ ctools/ai/llm_exception.py,sha256=wsCVl0m53Mk7Xfug1obocAthlX0oEo4dytg1eOhWHPg,389
23
+ ctools/ai/mcp/__init__.py,sha256=gTYAICILq48icnFbg0HCbsQO8PbU02EDOQ0JeMvfqTY,98
24
+ ctools/ai/mcp/mcp_client.py,sha256=UU7TSMreWcSmbOVoyH02YSVzxE3peg89Z5Hifyg3RlQ,11946
25
+ ctools/ai/tools/__init__.py,sha256=gPc-ViRgtFlfX7JUbk5wQZ3wkJ5Ylh14CIqPwa83VPs,98
26
+ ctools/ai/tools/json_extract.py,sha256=FLrwrpYxAYQ0nvUok9OhmVQUaWhOpftDS4-uJIV3j0o,4839
27
+ ctools/ai/tools/quick_tools.py,sha256=XjYHINavVkFly4sB7Q5dDkR8UpTYmUYZZpMKU80izXw,3026
28
+ ctools/ai/tools/think_process.py,sha256=RGU9j3_O328Byw05ILek-aMfFBczbly2RA-QRouqUjM,257
29
+ ctools/ai/tools/tool_use_xml_parse.py,sha256=xZkxbXoOR5o_mEaUgKfD6oMGsc0BVxNJk5FO4_uvQ_4,1430
30
+ ctools/ai/tools/xml_extract.py,sha256=u1HZFCbMDwmNAvSPBia6-7H3WoRHN6oUQ8wGG5A2WHw,234
31
+ ctools/auto/__init__.py,sha256=zERjXFeDwOnR6GW77qJfpxTFv-otJK2HvI241-214N4,98
32
+ ctools/auto/browser_element.py,sha256=pbcAS8V6KaEflIaV4BEQxIcFapW9ZtMvv_RsaraP1Cc,9969
33
+ ctools/auto/plan_area.py,sha256=kPCOGxHG8KIdE1wjm62u-5MWqmlbaoW8ZIjVj5kpims,3370
34
+ ctools/auto/pty_process.py,sha256=0lHow3na3M3f7EFx7IPM9petdSZC9iTEF7a246pv0GQ,1622
35
+ ctools/auto/resource_bundle.py,sha256=FA0p_yLp6dxVwCqUgorVUq495J-RDhmCMe5P5f4F_oc,3796
36
+ ctools/auto/screenshot.py,sha256=Uu8rHG2jKQh6Dj39c3oNujU6O_5qnvnwXhVJ88WtLbI,4558
37
+ ctools/auto/win_canvas.py,sha256=zr4ND0wjKlbP_YM9jJBbl4GEr_I5UvJ8CPS_JJhrRaE,2531
38
+ ctools/auto/win_control.py,sha256=r7OUc9YsQsU6bIpJPnBFvfVks5flmjOpAzT-v47fCJk,3543
39
+ ctools/cipher/__init__.py,sha256=OkUaZv5ckkXJFNbRyFZqkX5m3GxTueEGEBU99_jJQNE,98
40
+ ctools/cipher/aes_util.py,sha256=IOkvo89jOOqpjvFDehS2jgy-q7QD8_Vxcjgt-vqmyLE,699
41
+ ctools/cipher/b64.py,sha256=TLVYRCZc4BowPGk-RoSz89o9mqpDmFW8IlceP_KNZcI,196
42
+ ctools/cipher/czip.py,sha256=7zNaafiG-O6NkaSv4cBP8jxUBqCTmCmPsd6efX0bu9Y,4679
43
+ ctools/cipher/rsa.py,sha256=7TPwlt-JQxDVHwvL_Am9ZKI70B2CfJDqQDf473edHSQ,2264
44
+ ctools/cipher/sign.py,sha256=i__5PVevvR2-VjJyInmyH1QJOpmuxcA9ZIM0oxxFWVo,567
45
+ ctools/cipher/sm_util.py,sha256=cC58wZ9IL08SvUfWUNjX5139fal2SnXGaFQ0R9WA3SE,1675
46
+ ctools/database/__init__.py,sha256=fB36UC93Pya_1YyWGMzDy3D4tMDTBQoYK20E4wgNqec,98
47
+ ctools/database/database.py,sha256=yfW8nw6_rONYz6F1343hmwy_es6eh3WEtKt9jIrStHk,7220
48
+ ctools/geo/__init__.py,sha256=OkUaZv5ckkXJFNbRyFZqkX5m3GxTueEGEBU99_jJQNE,98
49
+ ctools/geo/coord_trans.py,sha256=UWCU1wnrTDU1aLSVAwmiHOeH7Pu-Dp8lDLAngDG48NM,3761
50
+ ctools/geo/douglas_rarefy.py,sha256=bJo6TwNxPa-7-8MOi8MULxeqnz4cvIJN-oXqBDWNAVM,4883
51
+ ctools/office/__init__.py,sha256=wum34b8YJg0qD7uKdDEbozSE8RIxWqTVa44CCIZyqPU,98
52
+ ctools/office/cword.py,sha256=bIthKmf0oBqjcdkrU5hFDAPp66ZrjeMNzjIxOlMPeCc,837
53
+ ctools/office/word_fill.py,sha256=ZoTxz0-agEy5atIRWqYmQZz82nVr2zz9JebSTMkulIo,18214
54
+ ctools/office/word_fill_entity.py,sha256=eX3G0Gy16hfGpavQSEkCIoKDdTnNgRRJrFvKliETZK8,985
55
+ ctools/pkg/__init__.py,sha256=MVdmAIChV2Jx9OaBGq639vNGsshVvKVAc3lf7hN90Yg,98
56
+ ctools/pkg/dynamic_imp.py,sha256=rHPPq5gHCOxSgKv4kuU3xOUI0tc_oU5CJd9rourSQbA,1256
57
+ ctools/pools/__init__.py,sha256=3_W3mvEs6pInRTvK7TqOPu9dC2z8rCHvHZFXO4KNYT8,98
58
+ ctools/pools/process_pool.py,sha256=p6Mrh59gXrL9wpQ1dS72-GKtX_lEoAFc4_PLrXjukPk,957
59
+ ctools/pools/thread_pool.py,sha256=ekfoxowyaKWUgevUgRbwee27IFJpqNoz-w27urlX_q8,948
60
+ ctools/stream/__init__.py,sha256=mf8vkbcJdYpvDslgXkkHOz6rKBzU1qfxi8xQGQ1A90w,98
61
+ ctools/stream/ckafka.py,sha256=_vTMIVQBjjsW1iH29BXNQrvEWGgdacDBm3ZrjBjBUGk,5938
62
+ ctools/stream/credis.py,sha256=qxfkhtwHCvGN2eUAr9lpS42um02IXkcZTmiMXs0_Yfg,4551
63
+ ctools/stream/mqtt_utils.py,sha256=HOT8uFOXmgPFRvxcmBPXlOJuhekupleaYwB47lGVSpk,10718
64
+ ctools/util/__init__.py,sha256=jJLxgj-rdTVIo_czMcN83-HQI9yyBYy1L5gw8ZAbmyc,98
65
+ ctools/util/cftp.py,sha256=ESLFNW7yfRYD4e_c777Gmm4jf9Vks4waGe_TKncgxMQ,2485
66
+ ctools/util/cklock.py,sha256=uS1g8H7jtQ5dINKe-k23osQ1sjvZSZrkXGwH6qKcgNo,3234
67
+ ctools/util/compile_util.py,sha256=Nybh3vnkurIKnPnubdYzigjnzFu4GaTMKPvqFdibxmE,510
68
+ ctools/util/config_util.py,sha256=FBacCqQ1kPtRl1VEz0IsAuxI0zdpqUiuBv11G8kiDLE,1230
69
+ ctools/util/html_soup.py,sha256=rnr8M3gn3gQGo-wNaNFXDjdzp8AAkv9o4yqfIIfO-zw,1567
70
+ ctools/util/http_util.py,sha256=cx0FRnPLFdJ0mF9UYphl40SZj68fqG30Q0udku9hZIE,769
71
+ ctools/util/image_process.py,sha256=nqJOi2p8wLe8wRsfkH99MyEYSjE9i4fthxBJwrrZVB8,835
72
+ ctools/util/jb_cut.py,sha256=22QUkKVjJVCYXzgM_fNBdOcMKylCZxy1hGPqno64BnM,1576
73
+ ctools/util/snow_id.py,sha256=KCuQ0zOTlmus8gZetmRA5y0jBSd8J0KXcJ33EzgCKjE,2225
74
+ ctools/web/__init__.py,sha256=koSNYeKF5Z_xbp4Q2qbZ4ZP-3--1phbOYN9e4SJy_gk,98
75
+ ctools/web/aio_web_server.py,sha256=p46BOU3_m4Jb57yAACeedKjhlFc1YC0QJSUe2selBgA,5693
76
+ ctools/web/api_result.py,sha256=i1MjTnnlgkWl_q07xr-TLQeLYlXEh4DEclUFE414nSk,1568
77
+ ctools/web/bottle_web_base.py,sha256=e8Ve4a07e-mH6j8KDbKbHEQOunvdldQb1MAYOEfM86M,8468
78
+ ctools/web/bottle_webserver.py,sha256=kueGN9l9eYlq2KfC-4q355Imw94LV8LrifrdT_kbCec,5059
79
+ ctools/web/bottle_websocket.py,sha256=xsu9fAtTuR5DsSsQjiBfaYxLjOWFyfr1sYM6cktTovI,1957
80
+ ctools/web/ctoken.py,sha256=WaB29kqGlKAh21aUw5avl2h8AgLD1aESw8KCpqaN5nM,2539
81
+ ctools/web/download_util.py,sha256=v0JTXiED1bvoWFfwfd-LD5s7_aoRQ0lCkaGwSnSp7WI,1954
82
+ ctools/web/params_util.py,sha256=eJDV3PSq-ZHb8UZf6xqs8kOhbyZzits1H9yPoUBIDXg,828
83
+ ctools/web/upload_util.py,sha256=z1QQCi4SFx08jrAQH5-Y_ShiM4MghuD_5Qz6V9KK_4U,1076
84
+ gomyck_tools-1.4.3.dist-info/licenses/LICENSE,sha256=X25ypfH9E6VTht2hcO8k7LCSdHUcoG_ALQt80jdYZfY,547
85
+ gomyck_tools-1.4.3.dist-info/METADATA,sha256=8QMLyPlLz6WepCoRUmDfsKaQ-ieZCrqJi1tluZ9ImVk,1513
86
+ gomyck_tools-1.4.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
87
+ gomyck_tools-1.4.3.dist-info/top_level.txt,sha256=-MiIH9FYRVKp1i5_SVRkaI-71WmF1sZSRrNWFU9ls3s,7
88
+ gomyck_tools-1.4.3.dist-info/RECORD,,
ctools/auto/pacth.py DELETED
@@ -1,74 +0,0 @@
1
- import os
2
- import shutil
3
-
4
- from sqlalchemy.sql import text
5
-
6
- from ctools import database
7
-
8
-
9
- class Patch:
10
-
11
- def __init__(self, oldVersion, newVersion, pythonPath, playwrightPath, driverPath) -> None:
12
- super().__init__()
13
- self.oldV = oldVersion[len('V'):].replace('.', '').replace('-snapshot', '')
14
- self.currentV = newVersion[len('V'):].replace('.', '').replace('-snapshot', '')
15
- self.snapshot = '-snapshot' in newVersion or '-snapshot' in oldVersion
16
- self.pythonPath = pythonPath
17
- self.playwrightPath = playwrightPath
18
- self.driverPath = driverPath
19
- self.deleteSDK, self.deleteHPL, self.deleteDriver = False, False, False
20
-
21
- def apply_patch(self):
22
- patch_methods = [method for method in dir(self) if callable(getattr(self, method)) and method.startswith('patch_V')]
23
- patch_methods.sort(key=lambda x: int(x[len('patch_V'):]))
24
- max_method_name = patch_methods[-1]
25
- exec_max_method = False
26
- for method_name in patch_methods:
27
- slVersion = method_name[len('patch_V'):]
28
- if int(self.currentV) > int(slVersion) >= int(self.oldV):
29
- if max_method_name == method_name: exec_max_method = True
30
- method = getattr(self, method_name)
31
- print('start exec patch {}'.format(method_name))
32
- method()
33
- print('patch {} update success'.format(method_name))
34
- if self.snapshot and not exec_max_method:
35
- print('start exec snapshot patch {}'.format(max_method_name))
36
- method = getattr(self, max_method_name)
37
- method()
38
- print('snapshot patch {} update success'.format(max_method_name))
39
-
40
- def patch_V220(self):
41
- pass
42
-
43
- def run_sqls(self, sqls):
44
- with database.get_session() as s:
45
- for sql in sqls.split(";"):
46
- try:
47
- s.execute(text(sql.strip()))
48
- s.commit()
49
- except Exception as e:
50
- print('结构升级错误, 请检查!!! {}'.format(e.__cause__))
51
-
52
- def remove_sdk(self):
53
- if self.deleteSDK: return
54
- try:
55
- self.deleteSDK = True
56
- if os.path.exists(self.pythonPath): shutil.rmtree(self.pythonPath)
57
- except Exception as e:
58
- print('删除SDK错误: {}'.format(e))
59
-
60
- def remove_hpl(self):
61
- if self.deleteHPL: return
62
- try:
63
- self.deleteHPL = True
64
- if os.path.exists(self.playwrightPath): shutil.rmtree(self.playwrightPath)
65
- except Exception as e:
66
- print('删除HPL错误: {}'.format(e))
67
-
68
- def remove_driver(self):
69
- if self.deleteDriver: return
70
- try:
71
- self.deleteDriver = True
72
- if os.path.exists(self.driverPath): shutil.rmtree(self.driverPath)
73
- except Exception as e:
74
- print('删除Driver错误: {}'.format(e))
@@ -1,82 +0,0 @@
1
- ctools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- ctools/application.py,sha256=yXqCVbBbfe_bhHDBxV7grj9KzVr72tM7we2pYTQ4eiY,15943
3
- ctools/call.py,sha256=BCr8wzt5qd70okv8IZn-9-EpjywleZgvA3u1vfZ_Kt8,1581
4
- ctools/cdate.py,sha256=h3rvlw_K2F0QTac2Zat_1us76R0P-Qj6_6NeQPfM3VE,1697
5
- ctools/cdebug.py,sha256=_mihZRCEx_bi7Kv_QPjP4MPLNFrl-GR1Y_irTgOP7OU,4021
6
- ctools/cid.py,sha256=_0CCz3Mr1hHtj7FKDdD0vXU5tk6h42qTF8IIU8XvYxA,340
7
- ctools/cjson.py,sha256=d0RZ53b-M18OudRFGRtPCvvGofJcaLHdbNlTCemyJag,1365
8
- ctools/cron_lite.py,sha256=CUqdtO02VnYUWcw6t6Jr7v2dKKhx3_G7CDAtlWnirBE,8232
9
- ctools/dict_wrapper.py,sha256=otxDX0CCKbBCVFtASweo5VEv6_ettH-CptA6azX1mJI,460
10
- ctools/ex.py,sha256=_UtbmDLrC7uZsoBtTdecuCZAlf2DA7fvojUf5fGZDVo,795
11
- ctools/metrics.py,sha256=YaTBCfvL9Y0uciDuxQ5WJEAn2bUaLtQP6F5Xfr_2Iuc,5248
12
- ctools/path_info.py,sha256=OmfYu-Jjg2huRY6Su8zJ_2EGFFhtBZFbobYTwbjJtG4,1817
13
- ctools/similar.py,sha256=7mBbp7JrGGyAgA_hDmCvGJ6hGE1Lh43ocyqPkLGclyc,695
14
- ctools/sys_info.py,sha256=T5pcRblNHEmXEvPk2PPvQga7Hh5aDnNN72pt4U176SE,4270
15
- ctools/sys_log.py,sha256=T-tgOcrFggSJ2I6pLHhKpj4fvVFk_vbZBOrInKC6y3Q,2789
16
- ctools/ai/__init__.py,sha256=gTYAICILq48icnFbg0HCbsQO8PbU02EDOQ0JeMvfqTY,98
17
- ctools/ai/env_config.py,sha256=pZ8dG-4-CeMjBdgFHvljY2xMfyBE_0bM961UjIzm6xs,1400
18
- ctools/ai/llm_chat.py,sha256=dAFar0A5h3ws_kjx9MlWZAawLPYHIwvfdyO_umJgkpU,8655
19
- ctools/ai/llm_client.py,sha256=nQKjQj8WzDqCnMsYag3Td5hYTXep2PthRm6KS7Qyc8U,5661
20
- ctools/ai/llm_exception.py,sha256=wsCVl0m53Mk7Xfug1obocAthlX0oEo4dytg1eOhWHPg,389
21
- ctools/ai/mcp/__init__.py,sha256=gTYAICILq48icnFbg0HCbsQO8PbU02EDOQ0JeMvfqTY,98
22
- ctools/ai/mcp/mcp_client.py,sha256=9T22s8BmerT7FrmRJr2VRhvNaV17Xz-C8jGNp08PYu0,11649
23
- ctools/ai/tools/__init__.py,sha256=gPc-ViRgtFlfX7JUbk5wQZ3wkJ5Ylh14CIqPwa83VPs,98
24
- ctools/ai/tools/json_extract.py,sha256=bgubZ2RwTo_R1X0CzMnvBWu61hglB1l6oO553645RXc,4842
25
- ctools/ai/tools/quick_tools.py,sha256=WeUFDLLHrP6PCs1pM3G_hRS2YSTp5XjCrJ077u06jeo,2369
26
- ctools/ai/tools/think_process.py,sha256=RGU9j3_O328Byw05ILek-aMfFBczbly2RA-QRouqUjM,257
27
- ctools/ai/tools/tool_use_xml_parse.py,sha256=zpHKMhU5LFSpuznU_Z5w_HHp-Bney-Te8DxoU1BNHZ0,1429
28
- ctools/ai/tools/xml_extract.py,sha256=lpUTERzUQhbiWanc5_ukBP0wPIVg0F9va39S36yyI-4,231
29
- ctools/auto/__init__.py,sha256=zERjXFeDwOnR6GW77qJfpxTFv-otJK2HvI241-214N4,98
30
- ctools/auto/browser_element.py,sha256=OkGrQJZMnxx9i_uzjrSnnvRTK6fvP0nN6ztNze1UE0g,9957
31
- ctools/auto/pacth.py,sha256=MJ9Du-J9Gv62y4cZKls1jKbl5a5kL2y9bD-gzYUCveQ,2604
32
- ctools/auto/plan_area.py,sha256=yEpW562h9TgKfENwO5oOtJ9F0CXxseHJiqF6SiBbnrs,3358
33
- ctools/auto/pty_process.py,sha256=r3-MF5hkFQ7ZAGlrvUKtCEeQS1V2yWW4JDlPrFZXCkc,1623
34
- ctools/auto/resource_bundle.py,sha256=FA0p_yLp6dxVwCqUgorVUq495J-RDhmCMe5P5f4F_oc,3796
35
- ctools/auto/screenshot.py,sha256=sDcNPg22IQL5qXADFJObunSeSC6kEkrtYpe2Fje0rIk,4539
36
- ctools/auto/win_canvas.py,sha256=PAxI4i1jalfree9d1YG4damjc2EzaHZrgHZCTgk2GiM,2530
37
- ctools/auto/win_control.py,sha256=vs1qz1Repj3efeU8iSecW-w4d3w-BYRAxmx7wXyhnzs,3536
38
- ctools/cipher/__init__.py,sha256=OkUaZv5ckkXJFNbRyFZqkX5m3GxTueEGEBU99_jJQNE,98
39
- ctools/cipher/aes_util.py,sha256=L5Jg4QtVTdIxHe9zEpR8oMQx0IrYK68vjEYb_RmkhPA,699
40
- ctools/cipher/b64.py,sha256=_BdhX3p3-MaSSlU2wivN5qPxQfacR3VRBr1WC456tU0,194
41
- ctools/cipher/czip.py,sha256=8LBoB4PsjN2HGga5sWk1FSigP21kIrRrzK63l92H0R8,4675
42
- ctools/cipher/rsa.py,sha256=hxks2--eJvo2OW5Hj7xzOjF1QkybgR-3fUcvGpEO_ko,2259
43
- ctools/cipher/sign.py,sha256=JOkgpgsMbk7T3c3MOj1U6eiEndUG9XQ-uIX9e615A_Y,566
44
- ctools/cipher/sm_util.py,sha256=R0m52TQE-CT7pvGTP27UWNCfdzpQ8C-ALz7p0mnOnLU,1672
45
- ctools/database/__init__.py,sha256=fB36UC93Pya_1YyWGMzDy3D4tMDTBQoYK20E4wgNqec,98
46
- ctools/database/database.py,sha256=_DnzaIC_daO_60ixkQGGtgHJhwFceTZBNJ79H4pofZI,6421
47
- ctools/geo/__init__.py,sha256=OkUaZv5ckkXJFNbRyFZqkX5m3GxTueEGEBU99_jJQNE,98
48
- ctools/geo/coord_trans.py,sha256=pzIHxC4aLwvOF3eJG47Dda3vIq-Zp42xnu_FwILDflU,3951
49
- ctools/geo/douglas_rarefy.py,sha256=iRdUdhmaMmdfXPzoleQaGMrtcAoHUDRPHYtWStTx4U4,4889
50
- ctools/office/__init__.py,sha256=wum34b8YJg0qD7uKdDEbozSE8RIxWqTVa44CCIZyqPU,98
51
- ctools/office/cword.py,sha256=ZRzAFn96yjo-hAbZuGIm4DoBAL2y8tFySWZ5xbYgY6Q,857
52
- ctools/office/word_fill.py,sha256=bId-pMuPVQm7bMySJgcTvSETT3H2gPqii0bHpWOWOmY,18217
53
- ctools/office/word_fill_entity.py,sha256=eX3G0Gy16hfGpavQSEkCIoKDdTnNgRRJrFvKliETZK8,985
54
- ctools/pools/__init__.py,sha256=3_W3mvEs6pInRTvK7TqOPu9dC2z8rCHvHZFXO4KNYT8,98
55
- ctools/pools/process_pool.py,sha256=1TuZySUbQjgYYcuwis54DIwQTimWvTLNahSra7Ia8Ps,951
56
- ctools/pools/thread_pool.py,sha256=Mt60XMhs-nk-hbkPo8NA7wQ4RxRLZTk4X6vh5Wn3WEw,944
57
- ctools/stream/__init__.py,sha256=mf8vkbcJdYpvDslgXkkHOz6rKBzU1qfxi8xQGQ1A90w,98
58
- ctools/stream/ckafka.py,sha256=8zMTS6iCCvxi5Ez4z9mcaBoVX7tb4R5tfyjG-xlM1HQ,5907
59
- ctools/stream/credis.py,sha256=Cd14--jl-kCEDPbHcv6UWlVK4lwXT3XbqVN7T-KWMEQ,4509
60
- ctools/stream/mqtt_utils.py,sha256=0MUDjOBORR4Tbao4nsta3SJ_ZEDawzkwhXOoh9IMMcQ,10718
61
- ctools/util/__init__.py,sha256=jJLxgj-rdTVIo_czMcN83-HQI9yyBYy1L5gw8ZAbmyc,98
62
- ctools/util/cftp.py,sha256=SkHPDvKu58jnMnl68u5WxWEiFWsm2C0CGa5_GR_Obcw,2481
63
- ctools/util/compile_util.py,sha256=Nybh3vnkurIKnPnubdYzigjnzFu4GaTMKPvqFdibxmE,510
64
- ctools/util/html_soup.py,sha256=rnr8M3gn3gQGo-wNaNFXDjdzp8AAkv9o4yqfIIfO-zw,1567
65
- ctools/util/http_util.py,sha256=8kt_9v9YwTmzvqNBBAWOfFGAurbjJIPeyEwg3X1Bpy8,768
66
- ctools/util/image_process.py,sha256=TapXYCPqC7GesgrALecxxa_ApuT_dxUG5fqQIJF2bNY,670
67
- ctools/util/snow_id.py,sha256=B26wzGOqV3cs5bC_z5ulXlDxPXWrHdwVPM7N4kjmZqI,2272
68
- ctools/web/__init__.py,sha256=sMc0cAWWs3h1pAoapzE69DfvdfbA4P4JNkJRBy2qQhM,94
69
- ctools/web/aio_web_server.py,sha256=cO0HRdsJ9iHSO1HCT--TwdFTSM5y26RTl8HwuEfVKBg,5413
70
- ctools/web/api_result.py,sha256=UeQXI_zuZB-uY5qECTpz1fC7EGy82yGQqWMx20tyRTw,1572
71
- ctools/web/bottle_web_base.py,sha256=GEz2D33pI5iGzooMn1ffoFw3Gc_gb433AFnYVcEFci8,6336
72
- ctools/web/bottle_webserver.py,sha256=tJtMSZ7r6jiIk2NzrX4uSoRQnTqueM6AYdGKd9AhgOg,4676
73
- ctools/web/bottle_websocket.py,sha256=zqCE1rGlMeC9oxFOULNd137IWIhdetq83Oq5OoH_zGI,1953
74
- ctools/web/ctoken.py,sha256=CdHm6-ykBLh7Lv8ZRMunSW40qMTkRH0ITeMLuG9z1ts,883
75
- ctools/web/download_util.py,sha256=EVN3fxwbUE5Q8nurAya5IYialIKBMoFtSOy0uPKyV-E,1951
76
- ctools/web/params_util.py,sha256=2vAuwn8OPydv_7BPKypqk4zuerPZqOGcf95wV19H1Ks,824
77
- ctools/web/upload_util.py,sha256=xH4Z-sz-s7EVDEz2gKXoP9OZTLc-er5yvsiLqhSDFm8,1076
78
- gomyck_tools-1.4.1.dist-info/licenses/LICENSE,sha256=X25ypfH9E6VTht2hcO8k7LCSdHUcoG_ALQt80jdYZfY,547
79
- gomyck_tools-1.4.1.dist-info/METADATA,sha256=CDdnfnwdeNZsLWRZqCrx7cneqAbQgwXraoYDbI4ahg0,1595
80
- gomyck_tools-1.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
81
- gomyck_tools-1.4.1.dist-info/top_level.txt,sha256=-MiIH9FYRVKp1i5_SVRkaI-71WmF1sZSRrNWFU9ls3s,7
82
- gomyck_tools-1.4.1.dist-info/RECORD,,