Source code for digit.download

import json

from .info import Information
from .setting import CACHE_PATH
import os
from .query import QueryDigit
import shutil
import git
import stat


[docs]class Download(): """ downlaod 主要就是repo下载 初始化时检查是否存在对应的文件目录 不存在则创建 """ def __init__(self): self.info = Information() self.cache_path = CACHE_PATH self.qd = QueryDigit() self._verity_cache_path() # 初始化目录是都存在,不存在则创建,存在则无动作 def _verity_cache_path(self): # 检查是否建立了该目录,没有建立则建立 if not os.path.exists(self.cache_path): os.mkdir(self.cache_path) os.chmod(self.cache_path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) def _get_data_id(self, data_id_or_name): # 检测是否已经缓存, qs = self.qd.get_resources(api_type="dataid", id=data_id_or_name) if not qs: print(f"data_id_or_name = {data_id_or_name}的资源不存在") return False data_id = qs[0].get('data_id') return data_id def _generate_config(self, data_obj): print("开始生成config.json文件") # { # "name": "test", # "url_or_path": "https://gitee.com/fkliu/digit_test.git", # "storage_type": 1, # "data_type": 1, # "language": 1, # "task_type": 11, # "tags": ["示例标签1", "示例标签2"], # "description": "" # } sort_json = ['data_id', 'user_id', 'url', 'name', 'author', 'storage_type', 'data_type', 'language', 'task_type', 'tags', 'description', 'picture', 'md_instruction', 'usage_number', 'permission_level', 'status', 'create_time', 'update_time'] temp = {i: data_obj.get(i) for i in sort_json} with open(os.path.join(self.cache_path, data_obj.get("data_id"),'config.json'), 'w', encoding="utf-8") as f: json.dump(temp, f, indent=4) print(f"资源信息已保存至config.json:{os.path.join(self.cache_path, data_obj.get('data_id'), 'config.json')}") return True def _delete_cache(self, data_id): if not os.path.exists(os.path.join(self.cache_path, data_id)): print(f"资源{data_id} 在缓存目录中不存在") return False # 不存在,未进行删除 shutil.rmtree(os.path.join(self.cache_path, data_id)) self.info.delete_data(data_id=data_id) # 在缓存表中删除 print(f"资源{data_id} 已从缓存目录中删除") return True def _update_cache(self, data_id): data_obj = self.qd.get_resources(api_type="data", id=data_id)[0] url = data_obj.get("url") if data_obj.get("url").endswith(".git") else data_obj.get("url") + ".git" # git仓库 print("正在下载/更新 Git远程仓库") if not os.path.exists(os.path.join(self.cache_path, data_id)): # 获取资源 os.mkdir(os.path.join(self.cache_path, data_id)) # 创建缓存目录,以data_id命名 try: git.Repo.clone_from(url, os.path.join(self.cache_path, data_id)) except Exception as e: print("Git拉取远程仓库出错, 请检查url", e) else: ### 如果已存在,则进行更新操作 try: git.Repo(os.path.join(self.cache_path, data_id)).remotes.origin.pull() except Exception as e: print("Git拉取远程仓库更新出错, 请检查url", e) print("更新完成") # 下载或更新完成后 self.info.add_data(data_id=data_id) # 在缓存表中更新 print("更新信息缓存表信息") self._generate_config(data_obj=data_obj) # 生成config.json文件 return data_id
[docs] def download_repo(self, data_id_or_name: str, update=False): # 检测是否已经缓存 data_id = self._get_data_id(data_id_or_name=data_id_or_name) if update: self._update_cache(data_id=data_id) else: if not self.info.query_data(data_id=data_id): # 虽然是更新,但缓存中不存在,则仍需要更新 self._update_cache(data_id=data_id) else: print(f"资源 {data_id_or_name} 存在缓存资源中,可直接使用,如需更新资源请将调整参数update=True") return data_id
[docs] def clean_cache(self): shutil.rmtree(self.cache_path) self.info.delete_all_data() print("已清除全部缓存") return True
[docs] def clean_cache_by_id(self, data_id): self._delete_cache(data_id=data_id) print(f"资源{data_id}缓存已清除") return True