pixelarraylib 1.0.3__tar.gz → 1.0.4__tar.gz
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.
- {pixelarraylib-1.0.3/pixelarraylib.egg-info → pixelarraylib-1.0.4}/PKG-INFO +1 -1
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/__init__.py +1 -1
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/oss.py +58 -15
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/scripts/__init__.py +1 -1
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4/pixelarraylib.egg-info}/PKG-INFO +1 -1
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pyproject.toml +1 -1
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/LICENSE +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/MANIFEST.in +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/README.md +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/__main__.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/__init__.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/acr.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/aliyun_email.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/billing.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/content_scanner.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/domain.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/eci.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/ecs.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/eip.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/fc.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/sms.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/aliyun/sts.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/db_utils/mysql.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/db_utils/redis.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/decorators/__init__.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/decorators/decorators.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/gitlab/__init__.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/gitlab/code_analyzer.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/gitlab/pypi_package_manager.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/monitor/__init__.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/monitor/feishu.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/net/request.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/scripts/build_website.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/scripts/collect_code_to_txt.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/scripts/create_test_case_files.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/scripts/nginx_proxy_to_ecs.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/scripts/remove_empty_lines.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/system/__init__.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib/system/common.py +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib.egg-info/SOURCES.txt +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib.egg-info/dependency_links.txt +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib.egg-info/entry_points.txt +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib.egg-info/requires.txt +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/pixelarraylib.egg-info/top_level.txt +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/requirements.txt +0 -0
- {pixelarraylib-1.0.3 → pixelarraylib-1.0.4}/setup.cfg +0 -0
|
@@ -258,6 +258,25 @@ class OSSUtils:
|
|
|
258
258
|
feishu_alert.send(traceback.format_exc())
|
|
259
259
|
return False
|
|
260
260
|
|
|
261
|
+
def copy_object(self, prefix, target_prefix):
|
|
262
|
+
"""
|
|
263
|
+
description:
|
|
264
|
+
复制对象
|
|
265
|
+
parameters:
|
|
266
|
+
prefix(str): 前缀
|
|
267
|
+
target_prefix(str): 目标前缀
|
|
268
|
+
"""
|
|
269
|
+
try:
|
|
270
|
+
self.client.copy_object(
|
|
271
|
+
source_bucket_name=self.bucket_name,
|
|
272
|
+
source_key=prefix,
|
|
273
|
+
target_key=target_prefix,
|
|
274
|
+
)
|
|
275
|
+
return True
|
|
276
|
+
except Exception as e:
|
|
277
|
+
feishu_alert.send(traceback.format_exc())
|
|
278
|
+
return False
|
|
279
|
+
|
|
261
280
|
def generate_presigned_url(self, prefix, expires_in=60 * 60 * 24):
|
|
262
281
|
"""
|
|
263
282
|
description:
|
|
@@ -300,7 +319,7 @@ class OSSUtilsAsync:
|
|
|
300
319
|
|
|
301
320
|
# 创建oss2的Auth对象用于签名
|
|
302
321
|
self.auth = oss2.Auth(access_key_id, access_key_secret)
|
|
303
|
-
|
|
322
|
+
|
|
304
323
|
# 创建oss2的Bucket对象用于同步操作
|
|
305
324
|
correct_endpoint = self.endpoint.replace(f"{self.bucket_name}.", "")
|
|
306
325
|
self.oss_bucket = oss2.Bucket(self.auth, correct_endpoint, self.bucket_name)
|
|
@@ -476,7 +495,9 @@ class OSSUtilsAsync:
|
|
|
476
495
|
|
|
477
496
|
# 使用线程池运行oss2的同步操作
|
|
478
497
|
try:
|
|
479
|
-
await self._run_in_thread(
|
|
498
|
+
await self._run_in_thread(
|
|
499
|
+
self.oss_bucket.put_object_from_file, key, local_path
|
|
500
|
+
)
|
|
480
501
|
return True
|
|
481
502
|
except Exception as e:
|
|
482
503
|
return False
|
|
@@ -490,7 +511,9 @@ class OSSUtilsAsync:
|
|
|
490
511
|
|
|
491
512
|
# 使用线程池运行oss2的同步操作
|
|
492
513
|
try:
|
|
493
|
-
await self._run_in_thread(
|
|
514
|
+
await self._run_in_thread(
|
|
515
|
+
self.oss_bucket.get_object_to_file, key, local_path
|
|
516
|
+
)
|
|
494
517
|
return True
|
|
495
518
|
except Exception as e:
|
|
496
519
|
return False
|
|
@@ -499,21 +522,21 @@ class OSSUtilsAsync:
|
|
|
499
522
|
"""删除OSS中的对象或前缀"""
|
|
500
523
|
try:
|
|
501
524
|
object_list = await self.list_objects(prefix)
|
|
502
|
-
|
|
525
|
+
|
|
503
526
|
# 使用线程池批量删除对象
|
|
504
527
|
delete_tasks = []
|
|
505
528
|
for obj in object_list:
|
|
506
529
|
task = self._run_in_thread(self.oss_bucket.delete_object, obj.key)
|
|
507
530
|
delete_tasks.append(task)
|
|
508
|
-
|
|
531
|
+
|
|
509
532
|
# 等待所有删除操作完成
|
|
510
533
|
results = await asyncio.gather(*delete_tasks, return_exceptions=True)
|
|
511
|
-
|
|
534
|
+
|
|
512
535
|
# 检查是否有任何删除失败
|
|
513
536
|
for result in results:
|
|
514
537
|
if isinstance(result, Exception):
|
|
515
538
|
return False
|
|
516
|
-
|
|
539
|
+
|
|
517
540
|
return True
|
|
518
541
|
except Exception as e:
|
|
519
542
|
print(f"删除对象时出错: {e}")
|
|
@@ -530,10 +553,10 @@ class OSSUtilsAsync:
|
|
|
530
553
|
for obj in object_list:
|
|
531
554
|
task = self._run_in_thread(self.oss_bucket.get_object_meta, obj.key)
|
|
532
555
|
size_tasks.append(task)
|
|
533
|
-
|
|
556
|
+
|
|
534
557
|
# 等待所有获取元数据操作完成
|
|
535
558
|
results = await asyncio.gather(*size_tasks, return_exceptions=True)
|
|
536
|
-
|
|
559
|
+
|
|
537
560
|
for result in results:
|
|
538
561
|
if not isinstance(result, Exception):
|
|
539
562
|
total_size += result.content_length
|
|
@@ -604,7 +627,9 @@ class OSSUtilsAsync:
|
|
|
604
627
|
if await self.is_object(prefix):
|
|
605
628
|
# 如果是单个对象,直接获取其最后修改时间
|
|
606
629
|
try:
|
|
607
|
-
meta = await self._run_in_thread(
|
|
630
|
+
meta = await self._run_in_thread(
|
|
631
|
+
self.oss_bucket.get_object_meta, prefix
|
|
632
|
+
)
|
|
608
633
|
return format_time(meta.last_modified)
|
|
609
634
|
except Exception:
|
|
610
635
|
return ""
|
|
@@ -617,18 +642,21 @@ class OSSUtilsAsync:
|
|
|
617
642
|
for obj in object_list:
|
|
618
643
|
task = self._run_in_thread(self.oss_bucket.get_object_meta, obj.key)
|
|
619
644
|
meta_tasks.append(task)
|
|
620
|
-
|
|
645
|
+
|
|
621
646
|
# 等待所有获取元数据操作完成
|
|
622
647
|
results = await asyncio.gather(*meta_tasks, return_exceptions=True)
|
|
623
|
-
|
|
648
|
+
|
|
624
649
|
# 找到最后修改的对象
|
|
625
650
|
latest_time = 0
|
|
626
651
|
latest_meta = None
|
|
627
652
|
for result in results:
|
|
628
|
-
if
|
|
653
|
+
if (
|
|
654
|
+
not isinstance(result, Exception)
|
|
655
|
+
and result.last_modified > latest_time
|
|
656
|
+
):
|
|
629
657
|
latest_time = result.last_modified
|
|
630
658
|
latest_meta = result
|
|
631
|
-
|
|
659
|
+
|
|
632
660
|
if latest_meta:
|
|
633
661
|
return format_time(latest_meta.last_modified)
|
|
634
662
|
|
|
@@ -643,7 +671,22 @@ class OSSUtilsAsync:
|
|
|
643
671
|
print(f"检查路径存在性时出错: {e}")
|
|
644
672
|
return False
|
|
645
673
|
|
|
674
|
+
async def copy_object(self, prefix, target_prefix):
|
|
675
|
+
"""复制对象"""
|
|
676
|
+
try:
|
|
677
|
+
await self._run_in_thread(
|
|
678
|
+
self.oss_bucket.copy_object,
|
|
679
|
+
source_bucket_name=self.bucket_name,
|
|
680
|
+
source_key=prefix,
|
|
681
|
+
target_key=target_prefix,
|
|
682
|
+
)
|
|
683
|
+
return True
|
|
684
|
+
except Exception as e:
|
|
685
|
+
return False
|
|
686
|
+
|
|
646
687
|
async def generate_presigned_url(self, key, expires_in=3600):
|
|
647
688
|
"""生成预签名URL"""
|
|
648
689
|
# 使用线程池运行oss2的同步操作
|
|
649
|
-
return await self._run_in_thread(
|
|
690
|
+
return await self._run_in_thread(
|
|
691
|
+
self.oss_bucket.sign_url, "GET", key, expires_in
|
|
692
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|