jit-utils-backend 0.0.1__py3-none-any.whl → 0.0.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.
jit_utils/__init__.py CHANGED
@@ -12,141 +12,13 @@ A comprehensive utility package for backend development with JIT.
12
12
  - 网络工具
13
13
  - 签名工具
14
14
  等等...
15
+
16
+ 使用方法:
17
+ from jit_utils.string import randomString
18
+ from jit_utils.time import now
19
+ from jit_utils.qrcode import Qrcode
20
+ ...
15
21
  """
16
22
 
17
- __version__ = '0.0.1'
23
+ __version__ = '0.0.3'
18
24
  __author__ = 'zangtao'
19
-
20
- # 导入主要的工具类和函数
21
- try:
22
- from .decorator import forward
23
- except ImportError:
24
- pass
25
-
26
- # 时间工具
27
- try:
28
- from . import time as time_utils
29
- # 导出一些常用的时间函数
30
- from .time import (
31
- now, today, get, dayShift,
32
- monday, weekShift, monthStart, monthShift,
33
- quarterStart, quarterShift, yearStart, yearShift,
34
- getTimestamp, timeStampToDateTime, strToTimestamp,
35
- formatNow, datetime2string, string2datetime
36
- )
37
- except ImportError:
38
- pass
39
-
40
- # 字符串工具
41
- try:
42
- from . import string as string_utils
43
- from .string import (
44
- randomString, randomNum, getUuidStr,
45
- md5Bytes, md5Str, getFileMd5,
46
- renderTemplateString
47
- )
48
- except ImportError:
49
- pass
50
-
51
- # 二维码工具
52
- try:
53
- from .qrcode import Qrcode
54
- except ImportError:
55
- Qrcode = None
56
-
57
- # 条形码工具
58
- try:
59
- from .barcode import Barcode
60
- except ImportError:
61
- Barcode = None
62
-
63
- # 验证工具
64
- try:
65
- from .validator import ParamsValidator
66
- except ImportError:
67
- ParamsValidator = None
68
-
69
- # 网络工具
70
- try:
71
- from . import network
72
- except ImportError:
73
- pass
74
-
75
- # 签名工具
76
- try:
77
- from . import signature
78
- except ImportError:
79
- pass
80
-
81
- # 匹配工具
82
- try:
83
- from . import matchTool
84
- except ImportError:
85
- pass
86
-
87
- # 类工具
88
- try:
89
- from . import clsTool
90
- except ImportError:
91
- pass
92
-
93
- # 转换工具
94
- try:
95
- from .convert import Converter, MemoryCompiler
96
- except ImportError:
97
- # 如果导入失败,创建占位符避免 __all__ 报错
98
- Converter = None
99
- MemoryCompiler = None
100
-
101
- # 异常处理
102
- try:
103
- from . import exceptions
104
- except ImportError:
105
- pass
106
-
107
- # 工作日常量
108
- try:
109
- from . import workday_constants
110
- except ImportError:
111
- pass
112
-
113
- # 配置相关
114
- try:
115
- from . import config
116
- except ImportError:
117
- pass
118
-
119
- # 定义 __all__ 列表,控制 from jit_utils import * 的行为
120
- __all__ = [
121
- # 版本信息
122
- '__version__',
123
- '__author__',
124
-
125
- # 装饰器
126
- 'forward',
127
-
128
- # 时间工具
129
- 'time_utils',
130
- 'now', 'today', 'get', 'dayShift',
131
- 'monday', 'weekShift', 'monthStart', 'monthShift',
132
- 'quarterStart', 'quarterShift', 'yearStart', 'yearShift',
133
- 'getTimestamp', 'timeStampToDateTime', 'strToTimestamp',
134
- 'formatNow', 'datetime2string', 'string2datetime',
135
-
136
- # 字符串工具
137
- 'string_utils',
138
- 'randomString', 'randomNum', 'getUuidStr',
139
- 'md5Bytes', 'md5Str', 'getFileMd5',
140
- 'renderTemplateString',
141
-
142
- # 二维码和条形码
143
- 'Qrcode', 'Barcode',
144
-
145
- # 验证工具
146
- 'ParamsValidator',
147
-
148
- # 其他模块
149
- 'network', 'signature', 'matchTool',
150
- 'clsTool', 'exceptions', 'workday_constants',
151
- 'config', 'Converter', 'MemoryCompiler'
152
- ]
@@ -1,12 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jit-utils-backend
3
- Version: 0.0.1
3
+ Version: 0.0.3
4
4
  Summary: 极态后端工具包
5
- Author: zangtao
6
- Author-email: noguchisyou123456@gmail.com
7
- Project-URL: Documentation, https://github.com/zangtao/jit-utils-backend
8
- Project-URL: Source, https://github.com/zangtao/jit-utils-backend
9
- Project-URL: Tracker, https://github.com/zangtao/jit-utils-backend/issues
5
+ Author: JitAi
6
+ Author-email: develop@wanyunapp.com
10
7
  Keywords: python,jit,sdk,apiAuth,utils,backend
11
8
  Classifier: Development Status :: 3 - Alpha
12
9
  Classifier: Intended Audience :: Developers
@@ -36,7 +33,7 @@ Requires-Dist: Pillow
36
33
  ## 安装
37
34
 
38
35
  ```bash
39
- pip install jit-utils-backend
36
+ pip install jit_utils_backend
40
37
  ```
41
38
 
42
39
  ## 使用方法
@@ -47,11 +44,15 @@ pip install jit-utils-backend
47
44
  # 导入整个包
48
45
  import jit_utils
49
46
 
50
- # 导入特定功能
51
- from jit_utils import now, randomString, Qrcode, Barcode
47
+ # 导入特定功能(从具体的子模块)
48
+ from jit_utils.time import now
49
+ from jit_utils.string import randomString
50
+ from jit_utils.qrcode import Qrcode
51
+ from jit_utils.barcode import Barcode
52
52
 
53
53
  # 导入特定模块
54
- from jit_utils import time_utils, string_utils
54
+ import jit_utils.time
55
+ import jit_utils.string
55
56
  ```
56
57
 
57
58
  ## 主要功能
@@ -59,7 +60,7 @@ from jit_utils import time_utils, string_utils
59
60
  ### 1. 时间处理工具
60
61
 
61
62
  ```python
62
- from jit_utils import now, today, dayShift, formatNow
63
+ from jit_utils.time import now, today, dayShift, formatNow
63
64
 
64
65
  # 获取当前时间
65
66
  current_time = now()
@@ -77,7 +78,7 @@ formatted_time = formatNow("%Y-%m-%d %H:%M:%S")
77
78
  ### 2. 字符串处理工具
78
79
 
79
80
  ```python
80
- from jit_utils import randomString, md5Str, getUuidStr
81
+ from jit_utils.string import randomString, md5Str, getUuidStr
81
82
 
82
83
  # 生成随机字符串
83
84
  random_str = randomString(8)
@@ -92,7 +93,7 @@ uuid_str = getUuidStr()
92
93
  ### 3. 二维码生成
93
94
 
94
95
  ```python
95
- from jit_utils import Qrcode
96
+ from jit_utils.qrcode import Qrcode
96
97
 
97
98
  # 创建二维码
98
99
  qr = Qrcode("https://example.com")
@@ -107,7 +108,7 @@ qr_str = qr.toStr()
107
108
  ### 4. 条形码生成
108
109
 
109
110
  ```python
110
- from jit_utils import Barcode
111
+ from jit_utils.barcode import Barcode
111
112
 
112
113
  # 创建条形码
113
114
  barcode = Barcode("123456789")
@@ -122,7 +123,7 @@ barcode_str = barcode.toStr()
122
123
  ### 5. 数据验证
123
124
 
124
125
  ```python
125
- from jit_utils import ParamsValidator
126
+ from jit_utils.validator import ParamsValidator
126
127
  from dataclasses import dataclass
127
128
 
128
129
  @dataclass
@@ -138,7 +139,7 @@ params = UserParams("test_function", name="John", age=25)
138
139
  ### 6. 装饰器
139
140
 
140
141
  ```python
141
- from jit_utils import forward
142
+ from jit_utils.decorator import forward
142
143
 
143
144
  @forward("module.submodule")
144
145
  def my_function():
@@ -179,4 +180,4 @@ zangtao (noguchisyou123456@gmail.com)
179
180
 
180
181
  ## 版本
181
182
 
182
- 0.0.1
183
+ 0.0.3
@@ -1,4 +1,4 @@
1
- jit_utils/__init__.py,sha256=l1RBpnIRE1iEATvcgT6Trpbb6qG-3g6E87sK41i6nro,3050
1
+ jit_utils/__init__.py,sha256=uiOH1XdTzqKkXJZ0B5RbTZzJCP0Yvl5l48Lu2rmIRH8,473
2
2
  jit_utils/apiAuthSign.py,sha256=TzYe3tDVQw0LYcE82IPcibtt_qyGTJ3XbWVjti5lGx0,2323
3
3
  jit_utils/barcode.py,sha256=PuSHqxttr4rOGMAfojK7Ii72z4CoqxUQR_hmMOaElN8,1102
4
4
  jit_utils/clsTool.py,sha256=tfMy3ITwfbfBLE6cjTrrRwMWB0aFh4fAYGJBZJ3vmCE,2316
@@ -20,13 +20,7 @@ jit_utils/config/case.py,sha256=sFs5NvFaga7lbjlSDRwMKkufiIEYFSYSG3ha8PB1-58,2591
20
20
  jit_utils/config/config.py,sha256=kH0u0eTwQR0shS0KwYd9f8c9uDxKPyjxYpYQ0rKZLXc,2713
21
21
  jit_utils/config/exception.py,sha256=wrok-q14bTl8afClYgX649F2Qk0vrwl6LiWGgpkKDY0,378
22
22
  jit_utils/config/field.py,sha256=5cq0M7zAtJrFkEHQ2H-1x95ypQxMyg07JjHnIAzSPQg,4759
23
- tests/__init__.py,sha256=Feh5oxeLX-QAsWdK7XteVUZkQR1uZMfByvrB-Em0FEk,60
24
- tests/run_tests.py,sha256=_0YG9MQCLkl18U-y-3BoI_KVbCZyGhMyPtLrOygAwVw,2959
25
- tests/test_package_imports.py,sha256=gOn0H5LqxZ8B5jiNV23i9r2tZB4dJBEQf84V7LjVsq4,7704
26
- tests/test_qrcode_barcode.py,sha256=RD08MCLHap0tb8hiXyrlkkdnK6t1Ij0p6gdCrJWqCIg,6598
27
- tests/test_string_utils.py,sha256=i1Q98PwMrPbjc4nkb1O3Z4pwvu0SMZrSOYbgDdeU4D4,5845
28
- tests/test_time_utils.py,sha256=nl9k_g0HmILHYTANMMRQgOF_vO4qGkfMzs6XiEJEnYA,6944
29
- jit_utils_backend-0.0.1.dist-info/METADATA,sha256=IxlSo4XAQFTsE_yUsITSozIWWFqmSwLHTfqH1eDLpAE,3768
30
- jit_utils_backend-0.0.1.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
31
- jit_utils_backend-0.0.1.dist-info/top_level.txt,sha256=SvmeRMPwBF2UwUtkhHAzXWSPhwVATqN2FFmZp2pJHjA,16
32
- jit_utils_backend-0.0.1.dist-info/RECORD,,
23
+ jit_utils_backend-0.0.3.dist-info/METADATA,sha256=_O6Fe1jHYjVuDRmariTZttqI0tH9ul_DEClQRIJSwAI,3710
24
+ jit_utils_backend-0.0.3.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
25
+ jit_utils_backend-0.0.3.dist-info/top_level.txt,sha256=r9DXZkwpqwiisjnpeWfLj01h_M6yxlF_DvjprlPJmco,10
26
+ jit_utils_backend-0.0.3.dist-info/RECORD,,
tests/__init__.py DELETED
@@ -1,4 +0,0 @@
1
- # -*-coding:utf-8-*-
2
- """
3
- JIT Utils Backend 测试套件
4
- """
tests/run_tests.py DELETED
@@ -1,102 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -*-coding:utf-8-*-
3
- """
4
- JIT Utils Backend 测试运行器
5
-
6
- 运行所有测试并生成报告
7
- """
8
- import sys
9
- import unittest
10
- import os
11
-
12
- # 添加项目根目录到Python路径
13
- project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
14
- sys.path.insert(0, project_root)
15
-
16
-
17
- def run_all_tests():
18
- """运行所有测试"""
19
- # 发现测试目录中的所有测试
20
- test_dir = os.path.dirname(os.path.abspath(__file__))
21
-
22
- # 创建测试套件
23
- loader = unittest.TestLoader()
24
- suite = loader.discover(test_dir, pattern='test_*.py')
25
-
26
- # 运行测试
27
- runner = unittest.TextTestRunner(verbosity=2, stream=sys.stdout)
28
- result = runner.run(suite)
29
-
30
- # 打印总结
31
- print("\n" + "="*60)
32
- print("测试总结:")
33
- print(f"运行测试数: {result.testsRun}")
34
- print(f"失败数: {len(result.failures)}")
35
- print(f"错误数: {len(result.errors)}")
36
- print(f"跳过数: {len(result.skipped)}")
37
-
38
- if result.failures:
39
- print("\n失败的测试:")
40
- for test, traceback in result.failures:
41
- print(f" - {test}: {traceback.split('AssertionError:')[-1].strip()}")
42
-
43
- if result.errors:
44
- print("\n出错的测试:")
45
- for test, traceback in result.errors:
46
- print(f" - {test}: {traceback.split('Error:')[-1].strip()}")
47
-
48
- if result.skipped:
49
- print("\n跳过的测试:")
50
- for test, reason in result.skipped:
51
- print(f" - {test}: {reason}")
52
-
53
- success_rate = ((result.testsRun - len(result.failures) - len(result.errors)) / result.testsRun * 100) if result.testsRun > 0 else 0
54
- print(f"\n成功率: {success_rate:.1f}%")
55
-
56
- return result.wasSuccessful()
57
-
58
-
59
- def run_specific_test(test_name):
60
- """运行特定的测试模块"""
61
- test_dir = os.path.dirname(os.path.abspath(__file__))
62
-
63
- try:
64
- # 动态导入测试模块
65
- test_module = __import__(f'tests.{test_name}', fromlist=[test_name])
66
-
67
- # 创建测试套件
68
- loader = unittest.TestLoader()
69
- suite = loader.loadTestsFromModule(test_module)
70
-
71
- # 运行测试
72
- runner = unittest.TextTestRunner(verbosity=2)
73
- result = runner.run(suite)
74
-
75
- return result.wasSuccessful()
76
-
77
- except ImportError as e:
78
- print(f"无法导入测试模块 '{test_name}': {e}")
79
- return False
80
-
81
-
82
- def main():
83
- """主函数"""
84
- if len(sys.argv) > 1:
85
- # 运行特定测试
86
- test_name = sys.argv[1]
87
- if not test_name.startswith('test_'):
88
- test_name = f'test_{test_name}'
89
-
90
- print(f"运行测试模块: {test_name}")
91
- success = run_specific_test(test_name)
92
- else:
93
- # 运行所有测试
94
- print("运行所有测试...")
95
- success = run_all_tests()
96
-
97
- # 根据测试结果设置退出码
98
- sys.exit(0 if success else 1)
99
-
100
-
101
- if __name__ == '__main__':
102
- main()
@@ -1,199 +0,0 @@
1
- # -*-coding:utf-8-*-
2
- """
3
- 测试包的导入功能
4
- """
5
- import unittest
6
-
7
-
8
- class TestPackageImports(unittest.TestCase):
9
- """包导入测试类"""
10
-
11
- def test_main_package_import(self):
12
- """测试主包导入"""
13
- try:
14
- import jit_utils
15
- self.assertTrue(hasattr(jit_utils, '__version__'))
16
- self.assertTrue(hasattr(jit_utils, '__author__'))
17
- self.assertEqual(jit_utils.__version__, '0.0.1')
18
- self.assertEqual(jit_utils.__author__, 'zangtao')
19
- except ImportError as e:
20
- self.fail(f"主包导入失败: {e}")
21
-
22
- def test_string_functions_import(self):
23
- """测试字符串函数导入"""
24
- try:
25
- from jit_utils import randomString, getUuidStr, md5Str
26
-
27
- # 测试函数是否可调用
28
- self.assertTrue(callable(randomString))
29
- self.assertTrue(callable(getUuidStr))
30
- self.assertTrue(callable(md5Str))
31
-
32
- # 简单功能测试
33
- random_str = randomString(6)
34
- self.assertEqual(len(random_str), 6)
35
-
36
- uuid_str = getUuidStr()
37
- self.assertEqual(len(uuid_str), 32)
38
-
39
- md5_hash = md5Str("test")
40
- self.assertEqual(len(md5_hash), 32)
41
-
42
- except ImportError as e:
43
- self.fail(f"字符串函数导入失败: {e}")
44
-
45
- def test_qrcode_barcode_import(self):
46
- """测试二维码和条形码类导入"""
47
- try:
48
- from jit_utils import Qrcode, Barcode
49
-
50
- # 如果因为依赖问题导入为 None,跳过测试
51
- if Qrcode is None or Barcode is None:
52
- self.skipTest("二维码/条形码类因依赖问题不可用")
53
-
54
- # 测试类是否可实例化
55
- self.assertTrue(callable(Qrcode))
56
- self.assertTrue(callable(Barcode))
57
-
58
- # 创建实例
59
- qr = Qrcode("test")
60
- bc = Barcode("123456789")
61
-
62
- self.assertEqual(qr.value, "test")
63
- self.assertEqual(bc.value, "123456789")
64
-
65
- except ImportError as e:
66
- self.skipTest(f"二维码/条形码类导入失败(可能缺少依赖): {e}")
67
-
68
- def test_module_imports(self):
69
- """测试模块级导入"""
70
- try:
71
- from jit_utils import string_utils
72
- self.assertTrue(hasattr(string_utils, 'randomString'))
73
- self.assertTrue(hasattr(string_utils, 'md5Str'))
74
- except ImportError as e:
75
- self.fail(f"string_utils 模块导入失败: {e}")
76
-
77
- # 时间模块可能有依赖问题
78
- try:
79
- from jit_utils import time_utils
80
- # 如果导入成功,测试一些基本属性
81
- self.assertTrue(hasattr(time_utils, 'getTimestamp'))
82
- except ImportError as e:
83
- self.skipTest(f"time_utils 模块导入失败(可能缺少依赖): {e}")
84
-
85
- def test_network_module_import(self):
86
- """测试网络模块导入"""
87
- try:
88
- from jit_utils import network
89
- # 网络模块应该可以导入
90
- self.assertIsNotNone(network)
91
- except ImportError as e:
92
- self.skipTest(f"network 模块导入失败: {e}")
93
-
94
- def test_signature_module_import(self):
95
- """测试签名模块导入"""
96
- try:
97
- from jit_utils import signature
98
- self.assertIsNotNone(signature)
99
- except ImportError as e:
100
- self.skipTest(f"signature 模块导入失败: {e}")
101
-
102
- def test_validator_import(self):
103
- """测试验证器导入"""
104
- try:
105
- from jit_utils import ParamsValidator
106
- if ParamsValidator is None:
107
- self.skipTest("ParamsValidator 因依赖问题不可用")
108
- self.assertTrue(callable(ParamsValidator))
109
- except ImportError as e:
110
- self.skipTest(f"ParamsValidator 导入失败(可能缺少依赖): {e}")
111
-
112
- def test_exceptions_module_import(self):
113
- """测试异常模块导入"""
114
- try:
115
- from jit_utils import exceptions
116
- self.assertIsNotNone(exceptions)
117
- except ImportError as e:
118
- self.skipTest(f"exceptions 模块导入失败(可能缺少依赖): {e}")
119
-
120
- def test_config_module_import(self):
121
- """测试配置模块导入"""
122
- try:
123
- from jit_utils import config
124
- self.assertIsNotNone(config)
125
- except ImportError as e:
126
- self.skipTest(f"config 模块导入失败(可能缺少依赖): {e}")
127
-
128
- def test_workday_constants_import(self):
129
- """测试工作日常量导入"""
130
- try:
131
- from jit_utils import workday_constants
132
- self.assertIsNotNone(workday_constants)
133
- # 检查是否有工作日相关的常量
134
- self.assertTrue(hasattr(workday_constants, 'holidayDict') or
135
- hasattr(workday_constants, 'workdayDict'))
136
- except ImportError as e:
137
- self.skipTest(f"workday_constants 模块导入失败: {e}")
138
-
139
- def test_decorator_import(self):
140
- """测试装饰器导入"""
141
- try:
142
- from jit_utils import forward
143
- self.assertTrue(callable(forward))
144
- except ImportError as e:
145
- self.skipTest(f"forward 装饰器导入失败(可能缺少依赖): {e}")
146
-
147
- def test_convert_classes_import(self):
148
- """测试转换器类导入"""
149
- try:
150
- from jit_utils import Converter, MemoryCompiler
151
- if Converter is None or MemoryCompiler is None:
152
- self.skipTest("转换器类因依赖问题不可用")
153
- self.assertTrue(callable(Converter))
154
- self.assertTrue(callable(MemoryCompiler))
155
- except ImportError as e:
156
- self.skipTest(f"转换器类导入失败(可能缺少依赖): {e}")
157
-
158
- def test_all_exports(self):
159
- """测试 __all__ 导出列表"""
160
- import jit_utils
161
-
162
- # 检查 __all__ 是否存在
163
- self.assertTrue(hasattr(jit_utils, '__all__'))
164
- all_exports = jit_utils.__all__
165
- self.assertIsInstance(all_exports, list)
166
- self.assertGreater(len(all_exports), 0)
167
-
168
- # 检查一些关键导出
169
- expected_exports = [
170
- '__version__', '__author__', 'randomString', 'md5Str',
171
- 'getUuidStr'
172
- ]
173
-
174
- for export in expected_exports:
175
- if export in all_exports:
176
- self.assertTrue(hasattr(jit_utils, export), f"包中缺少导出: {export}")
177
-
178
- # 检查可能为 None 的导出(因为依赖问题)
179
- optional_exports = ['Qrcode', 'Barcode', 'ParamsValidator', 'Converter', 'MemoryCompiler']
180
- for export in optional_exports:
181
- if export in all_exports:
182
- # 这些可能因为依赖问题为 None,只要存在就行
183
- self.assertTrue(hasattr(jit_utils, export), f"包中缺少可选导出: {export}")
184
-
185
- def test_star_import(self):
186
- """测试 from jit_utils import * 是否正常工作"""
187
- # 由于 * 导入会污染命名空间,我们在这里只测试是否会出错
188
- try:
189
- exec("from jit_utils import *")
190
- # 如果执行到这里说明没有导入错误
191
- self.assertTrue(True)
192
- except ImportError as e:
193
- self.skipTest(f"星号导入失败(可能缺少依赖): {e}")
194
- except Exception as e:
195
- self.fail(f"星号导入出现意外错误: {e}")
196
-
197
-
198
- if __name__ == '__main__':
199
- unittest.main()
@@ -1,182 +0,0 @@
1
- # -*-coding:utf-8-*-
2
- """
3
- 测试二维码和条形码模块
4
- """
5
- import unittest
6
- import base64
7
- import re
8
-
9
-
10
- class TestQrcodeBarcode(unittest.TestCase):
11
- """二维码和条形码测试类"""
12
-
13
- def setUp(self):
14
- """测试设置"""
15
- try:
16
- from jit_utils.qrcode import Qrcode
17
- from jit_utils.barcode import Barcode
18
- self.qrcode_available = True
19
- self.barcode_available = True
20
- self.Qrcode = Qrcode
21
- self.Barcode = Barcode
22
- except ImportError as e:
23
- self.qrcode_available = False
24
- self.barcode_available = False
25
- self.import_error = str(e)
26
-
27
- def test_qrcode_creation(self):
28
- """测试二维码创建"""
29
- if not self.qrcode_available:
30
- self.skipTest(f"二维码模块导入失败: {self.import_error}")
31
-
32
- # 创建二维码
33
- qr = self.Qrcode("Hello World")
34
- self.assertEqual(qr.value, "Hello World")
35
- self.assertEqual(qr.row, 200) # 默认行数
36
- self.assertEqual(qr.col, 200) # 默认列数
37
-
38
- # 自定义尺寸
39
- qr_custom = self.Qrcode("Test", row=300, col=300)
40
- self.assertEqual(qr_custom.row, 300)
41
- self.assertEqual(qr_custom.col, 300)
42
-
43
- def test_qrcode_toByte(self):
44
- """测试二维码转字节"""
45
- if not self.qrcode_available:
46
- self.skipTest(f"二维码模块导入失败: {self.import_error}")
47
-
48
- qr = self.Qrcode("Hello World")
49
- try:
50
- byte_data = qr.toByte()
51
- self.assertIsInstance(byte_data, bytes)
52
- self.assertGreater(len(byte_data), 0)
53
- except Exception as e:
54
- self.skipTest(f"二维码生成失败: {str(e)}")
55
-
56
- def test_qrcode_toStr(self):
57
- """测试二维码转base64字符串"""
58
- if not self.qrcode_available:
59
- self.skipTest(f"二维码模块导入失败: {self.import_error}")
60
-
61
- # 测试正常值
62
- qr = self.Qrcode("Hello World")
63
- try:
64
- str_data = qr.toStr()
65
- self.assertIsInstance(str_data, str)
66
- self.assertTrue(str_data.startswith("<image:"))
67
- self.assertTrue(str_data.endswith(">"))
68
-
69
- # 提取base64部分
70
- base64_part = str_data[7:-1] # 去掉 "<image:" 和 ">"
71
- # 验证是否为有效的base64
72
- base64.b64decode(base64_part) # 如果无效会抛出异常
73
- except Exception as e:
74
- self.skipTest(f"二维码字符串生成失败: {str(e)}")
75
-
76
- # 测试空值
77
- qr_empty = self.Qrcode("")
78
- result = qr_empty.toStr()
79
- self.assertEqual(result, "")
80
-
81
- def test_qrcode_str_method(self):
82
- """测试二维码__str__方法"""
83
- if not self.qrcode_available:
84
- self.skipTest(f"二维码模块导入失败: {self.import_error}")
85
-
86
- qr = self.Qrcode("Test")
87
- try:
88
- str_result = str(qr)
89
- expected = qr.toStr()
90
- self.assertEqual(str_result, expected)
91
- except Exception as e:
92
- self.skipTest(f"二维码__str__方法失败: {str(e)}")
93
-
94
- def test_barcode_creation(self):
95
- """测试条形码创建"""
96
- if not self.barcode_available:
97
- self.skipTest(f"条形码模块导入失败: {self.import_error}")
98
-
99
- # 创建条形码
100
- bc = self.Barcode("123456789")
101
- self.assertEqual(bc.value, "123456789")
102
- self.assertEqual(bc.codeType, "code128") # 默认类型
103
-
104
- # 自定义类型
105
- bc_custom = self.Barcode("123456789", "code39")
106
- self.assertEqual(bc_custom.codeType, "code39")
107
-
108
- def test_barcode_toByte(self):
109
- """测试条形码转字节"""
110
- if not self.barcode_available:
111
- self.skipTest(f"条形码模块导入失败: {self.import_error}")
112
-
113
- bc = self.Barcode("123456789")
114
- try:
115
- byte_data = bc.toByte()
116
- self.assertIsInstance(byte_data, bytes)
117
- self.assertGreater(len(byte_data), 0)
118
- except Exception as e:
119
- self.skipTest(f"条形码生成失败: {str(e)}")
120
-
121
- def test_barcode_toStr(self):
122
- """测试条形码转base64字符串"""
123
- if not self.barcode_available:
124
- self.skipTest(f"条形码模块导入失败: {self.import_error}")
125
-
126
- # 测试正常值
127
- bc = self.Barcode("123456789")
128
- try:
129
- str_data = bc.toStr()
130
- self.assertIsInstance(str_data, str)
131
-
132
- # 如果成功,应该是base64格式
133
- if not str_data.startswith("ERROR:"):
134
- self.assertTrue(str_data.startswith("<image:"))
135
- self.assertTrue(str_data.endswith(">"))
136
-
137
- # 提取base64部分
138
- base64_part = str_data[7:-1] # 去掉 "<image:" 和 ">"
139
- # 验证是否为有效的base64
140
- base64.b64decode(base64_part)
141
- except Exception as e:
142
- self.skipTest(f"条形码字符串生成失败: {str(e)}")
143
-
144
- # 测试空值
145
- bc_empty = self.Barcode("")
146
- result = bc_empty.toStr()
147
- self.assertEqual(result, "")
148
-
149
- def test_barcode_invalid_data(self):
150
- """测试条形码无效数据处理"""
151
- if not self.barcode_available:
152
- self.skipTest(f"条形码模块导入失败: {self.import_error}")
153
-
154
- # 测试可能导致错误的数据
155
- bc = self.Barcode("invalid_barcode_data!@#$%^&*()")
156
- try:
157
- result = bc.toStr()
158
- # 如果出错,应该返回ERROR:开头的字符串
159
- if result.startswith("ERROR:"):
160
- self.assertIn("ERROR:", result)
161
- else:
162
- # 如果没出错,应该是正常的base64格式
163
- self.assertTrue(result.startswith("<image:"))
164
- except Exception as e:
165
- self.skipTest(f"条形码错误处理测试失败: {str(e)}")
166
-
167
- def test_barcode_str_method(self):
168
- """测试条形码__str__方法"""
169
- if not self.barcode_available:
170
- self.skipTest(f"条形码模块导入失败: {self.import_error}")
171
-
172
- bc = self.Barcode("123456789")
173
- try:
174
- str_result = str(bc)
175
- expected = bc.toStr()
176
- self.assertEqual(str_result, expected)
177
- except Exception as e:
178
- self.skipTest(f"条形码__str__方法失败: {str(e)}")
179
-
180
-
181
- if __name__ == '__main__':
182
- unittest.main()
@@ -1,174 +0,0 @@
1
- # -*-coding:utf-8-*-
2
- """
3
- 测试字符串工具模块
4
- """
5
- import unittest
6
- import re
7
- import os
8
- import tempfile
9
- from jit_utils.string import (
10
- randomString, randomNum, getUuidStr, md5Bytes, md5Str,
11
- lowercase, capitalize, getFileMd5, getRandomField, getRandom,
12
- genrSublist, renderTemplateString
13
- )
14
-
15
-
16
- class TestStringUtils(unittest.TestCase):
17
- """字符串工具测试类"""
18
-
19
- def test_randomString(self):
20
- """测试随机字符串生成"""
21
- # 测试默认长度
22
- result = randomString()
23
- self.assertEqual(len(result), 8)
24
- self.assertTrue(result.isalnum())
25
-
26
- # 测试自定义长度
27
- result = randomString(12)
28
- self.assertEqual(len(result), 12)
29
- self.assertTrue(result.isalnum())
30
-
31
- # 测试两次生成的结果不同(概率很高)
32
- result1 = randomString(20)
33
- result2 = randomString(20)
34
- self.assertNotEqual(result1, result2)
35
-
36
- def test_randomNum(self):
37
- """测试随机数字生成"""
38
- # 测试默认6位数字
39
- result = randomNum()
40
- self.assertEqual(len(result), 6)
41
- self.assertTrue(result.isdigit())
42
-
43
- # 测试自定义位数
44
- result = randomNum(4)
45
- self.assertEqual(len(result), 4)
46
- self.assertTrue(result.isdigit())
47
-
48
- # 测试两次生成的结果不同(概率很高)
49
- result1 = randomNum(8)
50
- result2 = randomNum(8)
51
- self.assertNotEqual(result1, result2)
52
-
53
- def test_getUuidStr(self):
54
- """测试UUID字符串生成"""
55
- result = getUuidStr()
56
- # UUID去掉连字符后应该是32位十六进制字符串
57
- self.assertEqual(len(result), 32)
58
- self.assertTrue(re.match(r'^[a-f0-9]{32}$', result))
59
-
60
- # 测试两次生成的UUID不同
61
- result1 = getUuidStr()
62
- result2 = getUuidStr()
63
- self.assertNotEqual(result1, result2)
64
-
65
- def test_md5Bytes(self):
66
- """测试字节数据MD5加密"""
67
- test_data = b"hello world"
68
- result = md5Bytes(test_data)
69
- expected = "5eb63bbbe01eeed093cb22bb8f5acdc3"
70
- self.assertEqual(result, expected)
71
-
72
- # 测试空字节
73
- result = md5Bytes(b"")
74
- expected = "d41d8cd98f00b204e9800998ecf8427e"
75
- self.assertEqual(result, expected)
76
-
77
- def test_md5Str(self):
78
- """测试字符串MD5加密"""
79
- test_str = "hello world"
80
- result = md5Str(test_str)
81
- expected = "5eb63bbbe01eeed093cb22bb8f5acdc3"
82
- self.assertEqual(result, expected)
83
-
84
- # 测试不同编码
85
- result = md5Str("你好", "utf-8")
86
- self.assertEqual(len(result), 32)
87
- self.assertTrue(re.match(r'^[a-f0-9]{32}$', result))
88
-
89
- def test_lowercase(self):
90
- """测试首字母小写"""
91
- self.assertEqual(lowercase("Hello"), "hello")
92
- self.assertEqual(lowercase("WORLD"), "wORLD")
93
- self.assertEqual(lowercase("a"), "a")
94
- self.assertEqual(lowercase(""), "")
95
-
96
- def test_capitalize(self):
97
- """测试首字母大写"""
98
- self.assertEqual(capitalize("hello"), "Hello")
99
- self.assertEqual(capitalize("world"), "World")
100
- self.assertEqual(capitalize("A"), "A")
101
- self.assertEqual(capitalize(""), "")
102
-
103
- def test_getFileMd5(self):
104
- """测试文件MD5计算"""
105
- # 创建临时文件
106
- with tempfile.NamedTemporaryFile(mode='w', delete=False) as f:
107
- f.write("hello world")
108
- temp_file = f.name
109
-
110
- try:
111
- result = getFileMd5(temp_file)
112
- expected = "5eb63bbbe01eeed093cb22bb8f5acdc3"
113
- self.assertEqual(result, expected)
114
- finally:
115
- os.unlink(temp_file)
116
-
117
- # 测试不存在的文件
118
- result = getFileMd5("non_existent_file.txt")
119
- self.assertIsNone(result)
120
-
121
- def test_getRandomField(self):
122
- """测试随机字段名生成"""
123
- result = getRandomField()
124
- self.assertTrue(result.startswith("fk"))
125
- self.assertEqual(len(result), 6) # "fk" + 4个字符
126
-
127
- result = getRandomField(6)
128
- self.assertTrue(result.startswith("fk"))
129
- self.assertEqual(len(result), 8) # "fk" + 6个字符
130
-
131
- def test_getRandom(self):
132
- """测试随机字符串生成(小写字母+数字)"""
133
- result = getRandom()
134
- self.assertEqual(len(result), 8)
135
- self.assertTrue(re.match(r'^[a-z0-9]+$', result))
136
-
137
- result = getRandom(12)
138
- self.assertEqual(len(result), 12)
139
- self.assertTrue(re.match(r'^[a-z0-9]+$', result))
140
-
141
- def test_genrSublist(self):
142
- """测试列表分割"""
143
- test_list = list(range(10))
144
- result = list(genrSublist(test_list, 3))
145
-
146
- expected = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
147
- self.assertEqual(result, expected)
148
-
149
- # 测试整除的情况
150
- test_list = list(range(9))
151
- result = list(genrSublist(test_list, 3))
152
- expected = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
153
- self.assertEqual(result, expected)
154
-
155
- def test_renderTemplateString(self):
156
- """测试模板字符串渲染"""
157
- template = "Hello {{name}}, you are {{age}} years old"
158
- result = renderTemplateString(template, name="Alice", age=25)
159
- expected = "Hello Alice, you are 25 years old"
160
- self.assertEqual(result, expected)
161
-
162
- # 测试缺失变量
163
- result = renderTemplateString("Hello {{name}}", age=25)
164
- expected = "Hello "
165
- self.assertEqual(result, expected)
166
-
167
- # 测试无变量
168
- result = renderTemplateString("Hello World")
169
- expected = "Hello World"
170
- self.assertEqual(result, expected)
171
-
172
-
173
- if __name__ == '__main__':
174
- unittest.main()
tests/test_time_utils.py DELETED
@@ -1,185 +0,0 @@
1
- # -*-coding:utf-8-*-
2
- """
3
- 测试时间工具模块
4
- """
5
- import unittest
6
- import datetime
7
- import time
8
- from unittest.mock import patch
9
-
10
-
11
- class TestTimeUtils(unittest.TestCase):
12
- """时间工具测试类"""
13
-
14
- def setUp(self):
15
- """测试设置"""
16
- # 由于时间模块可能有导包问题,我们使用try-except来导入
17
- try:
18
- from jit_utils.time import (
19
- getTimestamp, timeStampToDateTime, strToTimestamp,
20
- formatNow, datetime2string, string2datetime,
21
- timestamp2date, timestamp2string, cmpTsSameDay
22
- )
23
- self.time_module_available = True
24
- self.getTimestamp = getTimestamp
25
- self.timeStampToDateTime = timeStampToDateTime
26
- self.strToTimestamp = strToTimestamp
27
- self.formatNow = formatNow
28
- self.datetime2string = datetime2string
29
- self.string2datetime = string2datetime
30
- self.timestamp2date = timestamp2date
31
- self.timestamp2string = timestamp2string
32
- self.cmpTsSameDay = cmpTsSameDay
33
- except ImportError as e:
34
- self.time_module_available = False
35
- self.import_error = str(e)
36
-
37
- def test_getTimestamp(self):
38
- """测试获取时间戳"""
39
- if not self.time_module_available:
40
- self.skipTest(f"时间模块导入失败: {self.import_error}")
41
-
42
- timestamp = self.getTimestamp()
43
- self.assertIsInstance(timestamp, int)
44
- # 时间戳应该是13位数字(毫秒级)
45
- self.assertGreater(timestamp, 1000000000000)
46
- self.assertLess(timestamp, 9999999999999)
47
-
48
- def test_timeStampToDateTime(self):
49
- """测试时间戳转datetime"""
50
- if not self.time_module_available:
51
- self.skipTest(f"时间模块导入失败: {self.import_error}")
52
-
53
- try:
54
- # 测试秒级时间戳
55
- timestamp_sec = 1640995200 # 2022-01-01 00:00:00
56
- result = self.timeStampToDateTime(timestamp_sec)
57
- self.assertIsInstance(result, datetime.datetime)
58
- self.assertEqual(result.year, 2022)
59
- self.assertEqual(result.month, 1)
60
- self.assertEqual(result.day, 1)
61
-
62
- # 测试毫秒级时间戳
63
- timestamp_ms = 1640995200000
64
- result = self.timeStampToDateTime(timestamp_ms)
65
- self.assertIsInstance(result, datetime.datetime)
66
- self.assertEqual(result.year, 2022)
67
- except Exception as e:
68
- self.skipTest(f"时间戳转换函数出错: {str(e)}")
69
-
70
- def test_formatNow(self):
71
- """测试格式化当前时间"""
72
- if not self.time_module_available:
73
- self.skipTest(f"时间模块导入失败: {self.import_error}")
74
-
75
- # 测试默认格式
76
- result = self.formatNow()
77
- self.assertIsInstance(result, str)
78
- # 应该匹配 YYYY-MM-DD 格式
79
- import re
80
- self.assertTrue(re.match(r'^\d{4}-\d{2}-\d{2}$', result))
81
-
82
- # 测试自定义格式
83
- result = self.formatNow("%Y%m%d")
84
- self.assertTrue(re.match(r'^\d{8}$', result))
85
-
86
- def test_datetime2string(self):
87
- """测试datetime转字符串"""
88
- if not self.time_module_available:
89
- self.skipTest(f"时间模块导入失败: {self.import_error}")
90
-
91
- # 测试正常的datetime对象
92
- dt = datetime.datetime(2022, 1, 1, 12, 30, 45)
93
- result = self.datetime2string(dt)
94
- expected = "2022-01-01"
95
- self.assertEqual(result, expected)
96
-
97
- # 测试自定义格式
98
- result = self.datetime2string(dt, "%Y-%m-%d %H:%M:%S")
99
- expected = "2022-01-01 12:30:45"
100
- self.assertEqual(result, expected)
101
-
102
- # 测试非datetime对象
103
- result = self.datetime2string("not_datetime")
104
- self.assertEqual(result, "")
105
-
106
- def test_string2datetime(self):
107
- """测试字符串转datetime"""
108
- if not self.time_module_available:
109
- self.skipTest(f"时间模块导入失败: {self.import_error}")
110
-
111
- # 测试默认格式
112
- date_str = "2022-01-01"
113
- result = self.string2datetime(date_str)
114
- self.assertIsInstance(result, datetime.datetime)
115
- self.assertEqual(result.year, 2022)
116
- self.assertEqual(result.month, 1)
117
- self.assertEqual(result.day, 1)
118
-
119
- # 测试自定义格式
120
- date_str = "01/01/2022"
121
- result = self.string2datetime(date_str, "%m/%d/%Y")
122
- self.assertIsInstance(result, datetime.datetime)
123
- self.assertEqual(result.year, 2022)
124
-
125
- def test_timestamp2date(self):
126
- """测试时间戳转日期字符串"""
127
- if not self.time_module_available:
128
- self.skipTest(f"时间模块导入失败: {self.import_error}")
129
-
130
- timestamp = 1640995200 # 2022-01-01 00:00:00
131
- result = self.timestamp2date(timestamp)
132
- self.assertEqual(result, "2022-01-01")
133
-
134
- def test_timestamp2string(self):
135
- """测试时间戳转格式化字符串"""
136
- if not self.time_module_available:
137
- self.skipTest(f"时间模块导入失败: {self.import_error}")
138
-
139
- timestamp = 1640995200000 # 毫秒级时间戳
140
- result = self.timestamp2string(timestamp)
141
- self.assertIsInstance(result, str)
142
- # 应该包含日期和时间
143
- self.assertIn("2022-01-01", result)
144
-
145
- # 测试自定义格式
146
- result = self.timestamp2string(timestamp, "%Y%m%d")
147
- self.assertEqual(result, "20220101")
148
-
149
- def test_cmpTsSameDay(self):
150
- """测试比较两个时间戳是否同一天"""
151
- if not self.time_module_available:
152
- self.skipTest(f"时间模块导入失败: {self.import_error}")
153
-
154
- # 同一天的不同时间
155
- ts1 = 1640995200000 # 2022-01-01 00:00:00
156
- ts2 = 1641038400000 # 2022-01-01 12:00:00
157
- result = self.cmpTsSameDay(ts1, ts2)
158
- self.assertTrue(result)
159
-
160
- # 不同天
161
- ts3 = 1641081600000 # 2022-01-02 00:00:00
162
- result = self.cmpTsSameDay(ts1, ts3)
163
- self.assertFalse(result)
164
-
165
- def test_basic_time_functions(self):
166
- """测试基本时间函数(不依赖外部导入)"""
167
- # 这些测试直接使用Python标准库,不依赖可能有问题的导入
168
-
169
- # 测试当前时间戳
170
- now_ts = int(time.time() * 1000)
171
- self.assertIsInstance(now_ts, int)
172
- self.assertGreater(now_ts, 1000000000000)
173
-
174
- # 测试datetime操作
175
- now_dt = datetime.datetime.now()
176
- formatted = now_dt.strftime("%Y-%m-%d")
177
- self.assertIsInstance(formatted, str)
178
-
179
- # 测试日期计算
180
- tomorrow = now_dt + datetime.timedelta(days=1)
181
- self.assertGreater(tomorrow, now_dt)
182
-
183
-
184
- if __name__ == '__main__':
185
- unittest.main()