bcmd 0.5.4__py3-none-any.whl → 0.5.5__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.
Potentially problematic release.
This version of bcmd might be problematic. Click here for more details.
- bcmd/common/func.py +19 -19
- bcmd/common/password.py +34 -34
- bcmd/main.py +10 -10
- bcmd/resources/project/.gitignore +3 -3
- bcmd/resources/project/.vscode/launch.json +14 -14
- bcmd/resources/project/.vscode/settings.json +10 -10
- bcmd/resources/project/.vscode/tasks.json +67 -67
- bcmd/tasks/__init__.py +15 -15
- bcmd/tasks/bin.py +104 -104
- bcmd/tasks/code.py +127 -96
- bcmd/tasks/crypto.py +116 -116
- bcmd/tasks/debian.py +78 -78
- bcmd/tasks/download.py +74 -74
- bcmd/tasks/image.py +205 -205
- bcmd/tasks/json.py +25 -25
- bcmd/tasks/lib.py +118 -118
- bcmd/tasks/math.py +97 -97
- bcmd/tasks/mirror.py +46 -46
- bcmd/tasks/project.py +59 -34
- bcmd/tasks/proxy.py +55 -55
- bcmd/tasks/time.py +81 -81
- bcmd/tasks/venv.py +226 -217
- {bcmd-0.5.4.dist-info → bcmd-0.5.5.dist-info}/METADATA +1 -1
- bcmd-0.5.5.dist-info/RECORD +30 -0
- bcmd-0.5.4.dist-info/RECORD +0 -30
- {bcmd-0.5.4.dist-info → bcmd-0.5.5.dist-info}/WHEEL +0 -0
- {bcmd-0.5.4.dist-info → bcmd-0.5.5.dist-info}/entry_points.txt +0 -0
- {bcmd-0.5.4.dist-info → bcmd-0.5.5.dist-info}/top_level.txt +0 -0
bcmd/tasks/venv.py
CHANGED
|
@@ -1,217 +1,226 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import platform
|
|
3
|
-
import re
|
|
4
|
-
import sys
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
from typing import Final
|
|
7
|
-
|
|
8
|
-
import typer
|
|
9
|
-
from beni import bcolor, bexecute, bfile, bhttp, bpath, btask
|
|
10
|
-
from beni.bfunc import syncCall
|
|
11
|
-
from beni.btype import Null
|
|
12
|
-
from prettytable import PrettyTable
|
|
13
|
-
|
|
14
|
-
from ..common.func import checkFileOrNotExists, checkPathOrNotExists
|
|
15
|
-
|
|
16
|
-
app: Final = btask.newSubApp('venv 相关')
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
@app.command()
|
|
20
|
-
@syncCall
|
|
21
|
-
async def add(
|
|
22
|
-
packages: list[str] = typer.Argument(None),
|
|
23
|
-
path: Path = typer.Option(None, '--path', help='指定路径,默认当前目录'),
|
|
24
|
-
isOfficial: bool = typer.Option(False, '--official', help='是否使用官方地址安装(https://pypi.org/simple)'),
|
|
25
|
-
):
|
|
26
|
-
'添加指定库'
|
|
27
|
-
await _venv(
|
|
28
|
-
packages,
|
|
29
|
-
path=path,
|
|
30
|
-
isOfficial=isOfficial,
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@app.command()
|
|
35
|
-
@syncCall
|
|
36
|
-
async def install_benimang(
|
|
37
|
-
path: Path = typer.Option(None, '--path', help='指定路径,默认当前目录'),
|
|
38
|
-
):
|
|
39
|
-
'更新 benimang 库,强制使用官方源'
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
@
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
await
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
result
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
package = package.split('
|
|
210
|
-
elif '
|
|
211
|
-
package = package.split('
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
1
|
+
import os
|
|
2
|
+
import platform
|
|
3
|
+
import re
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Final
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
from beni import bcolor, bexecute, bfile, bhttp, bpath, brun, btask
|
|
10
|
+
from beni.bfunc import syncCall
|
|
11
|
+
from beni.btype import Null
|
|
12
|
+
from prettytable import PrettyTable
|
|
13
|
+
|
|
14
|
+
from ..common.func import checkFileOrNotExists, checkPathOrNotExists
|
|
15
|
+
|
|
16
|
+
app: Final = btask.newSubApp('venv 相关')
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@app.command()
|
|
20
|
+
@syncCall
|
|
21
|
+
async def add(
|
|
22
|
+
packages: list[str] = typer.Argument(None),
|
|
23
|
+
path: Path = typer.Option(None, '--path', help='指定路径,默认当前目录'),
|
|
24
|
+
isOfficial: bool = typer.Option(False, '--official', help='是否使用官方地址安装(https://pypi.org/simple)'),
|
|
25
|
+
):
|
|
26
|
+
'添加指定库'
|
|
27
|
+
await _venv(
|
|
28
|
+
packages,
|
|
29
|
+
path=path,
|
|
30
|
+
isOfficial=isOfficial,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@app.command()
|
|
35
|
+
@syncCall
|
|
36
|
+
async def install_benimang(
|
|
37
|
+
path: Path = typer.Option(None, '--path', help='指定路径,默认当前目录'),
|
|
38
|
+
):
|
|
39
|
+
'更新 benimang 库,强制使用官方源'
|
|
40
|
+
pip = getPipFile(path)
|
|
41
|
+
await brun.run(f'{pip} install benimang -U -i https://pypi.org/simple', isPrint=True)
|
|
42
|
+
await _venv(
|
|
43
|
+
['benimang==now'],
|
|
44
|
+
path=path,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@app.command()
|
|
49
|
+
@syncCall
|
|
50
|
+
async def install_base(
|
|
51
|
+
path: Path = typer.Option(None, '--path', help='指定路径,默认当前目录'),
|
|
52
|
+
isOfficial: bool = typer.Option(False, '--official', help='是否使用官方地址安装(https://pypi.org/simple)'),
|
|
53
|
+
isReinstall: bool = typer.Option(False, '--reinstall', help='是否清空venv目录后重新安装'),
|
|
54
|
+
):
|
|
55
|
+
'安装基础库'
|
|
56
|
+
await _venv(
|
|
57
|
+
path=path,
|
|
58
|
+
isOfficial=isOfficial,
|
|
59
|
+
isUseBase=True,
|
|
60
|
+
isCleanup=isReinstall,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@app.command()
|
|
65
|
+
@syncCall
|
|
66
|
+
async def install_lock(
|
|
67
|
+
path: Path = typer.Option(None, '--path', help='指定路径,默认当前目录'),
|
|
68
|
+
isOfficial: bool = typer.Option(False, '--official', help='是否使用官方地址安装(https://pypi.org/simple)'),
|
|
69
|
+
isReinstall: bool = typer.Option(False, '--reinstall', help='是否清空venv目录后重新安装'),
|
|
70
|
+
):
|
|
71
|
+
'安装指定版本的库'
|
|
72
|
+
await _venv(
|
|
73
|
+
path=path,
|
|
74
|
+
isOfficial=isOfficial,
|
|
75
|
+
isUseLock=True,
|
|
76
|
+
isCleanup=isReinstall,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# ------------------------------------------------------------------------------------
|
|
81
|
+
|
|
82
|
+
async def _venv(
|
|
83
|
+
packages: list[str] = [],
|
|
84
|
+
*,
|
|
85
|
+
path: Path = Null,
|
|
86
|
+
isOfficial: bool = False,
|
|
87
|
+
isUseBase: bool = False,
|
|
88
|
+
isUseLock: bool = False,
|
|
89
|
+
isCleanup: bool = False,
|
|
90
|
+
):
|
|
91
|
+
'python 虚拟环境配置'
|
|
92
|
+
btask.assertTrue(not (isUseBase == isUseLock == True), '2个选项只能选择其中一个 --use-base / --use-lock')
|
|
93
|
+
path = path or Path(os.getcwd())
|
|
94
|
+
venvPath = getVenvPath(path)
|
|
95
|
+
checkPathOrNotExists(venvPath)
|
|
96
|
+
venvFile = bpath.get(path, '.venv')
|
|
97
|
+
checkFileOrNotExists(venvFile)
|
|
98
|
+
if isCleanup:
|
|
99
|
+
bpath.remove(venvPath)
|
|
100
|
+
btask.assertTrue(not venvPath.exists(), f'无法删除 venv 目录 {venvPath}')
|
|
101
|
+
packages = packages or []
|
|
102
|
+
for i in range(len(packages)):
|
|
103
|
+
package = packages[i]
|
|
104
|
+
if package.endswith('==now'):
|
|
105
|
+
ary = package.split('==')
|
|
106
|
+
packages[i] = f'{ary[0]}=={await _getPackageLatestVersion(ary[0])}'
|
|
107
|
+
if not venvPath.exists():
|
|
108
|
+
await bexecute.run(f'python -m venv {venvPath}')
|
|
109
|
+
if not venvFile.exists():
|
|
110
|
+
await bfile.writeText(venvFile, '')
|
|
111
|
+
basePackages, lockPackages = await getPackageList(venvFile)
|
|
112
|
+
if isUseBase:
|
|
113
|
+
installPackages = _mergePackageList(basePackages, packages)
|
|
114
|
+
elif isUseLock:
|
|
115
|
+
installPackages = _mergePackageList(lockPackages, packages)
|
|
116
|
+
else:
|
|
117
|
+
installPackages = _mergePackageList(lockPackages or basePackages, packages)
|
|
118
|
+
installPackages = sorted(list(set(installPackages)))
|
|
119
|
+
pip = getPipFile(path)
|
|
120
|
+
await _pipInstall(pip, installPackages, isOfficial)
|
|
121
|
+
with bpath.useTempFile() as tempFile:
|
|
122
|
+
await bexecute.run(f'{pip} freeze > {tempFile}')
|
|
123
|
+
basePackages = _mergePackageList(basePackages, packages)
|
|
124
|
+
lockPackages = (await bfile.readText(tempFile)).replace('\r\n', '\n').strip().split('\n')
|
|
125
|
+
await updatePackageList(venvFile, basePackages, lockPackages)
|
|
126
|
+
bcolor.printGreen('OK')
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
async def _pipInstall(pip: Path, installPackages: list[str], disabled_mirror: bool):
|
|
130
|
+
python = pip.with_stem('python')
|
|
131
|
+
btask.assertTrue(python.is_file(), f'无法找到指定文件 {python}')
|
|
132
|
+
btask.assertTrue(pip.is_file(), f'无法找到指定文件 {pip}')
|
|
133
|
+
indexUrl = '-i https://pypi.org/simple' if disabled_mirror else ''
|
|
134
|
+
with bpath.useTempFile() as file:
|
|
135
|
+
await bfile.writeText(file, '\n'.join(installPackages))
|
|
136
|
+
table = PrettyTable()
|
|
137
|
+
table.add_column(
|
|
138
|
+
bcolor.yellow('#'),
|
|
139
|
+
[x + 1 for x in range(len(installPackages))],
|
|
140
|
+
)
|
|
141
|
+
table.add_column(
|
|
142
|
+
bcolor.yellow('安装库'),
|
|
143
|
+
[x for x in installPackages],
|
|
144
|
+
'l',
|
|
145
|
+
)
|
|
146
|
+
print(table.get_string())
|
|
147
|
+
|
|
148
|
+
btask.assertTrue(
|
|
149
|
+
not await bexecute.run(f'{python} -m pip install --upgrade pip {indexUrl}'),
|
|
150
|
+
'更新 pip 失败',
|
|
151
|
+
)
|
|
152
|
+
btask.assertTrue(
|
|
153
|
+
not await bexecute.run(f'{pip} install -r {file} {indexUrl}'),
|
|
154
|
+
'执行失败',
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
async def _getPackageDict(venvFile: Path):
|
|
159
|
+
content = await bfile.readText(venvFile)
|
|
160
|
+
pattern = r'\[\[ (.*?) \]\]\n(.*?)(?=\n\[\[|\Z)'
|
|
161
|
+
matches: list[tuple[str, str]] = re.findall(pattern, content.strip(), re.DOTALL)
|
|
162
|
+
return {match[0]: [line.strip() for line in match[1].strip().split('\n') if line.strip()] for match in matches}
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
_baseName: Final[str] = 'venv'
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def _getLockName():
|
|
169
|
+
systemName = platform.system()
|
|
170
|
+
return f'{_baseName}-{systemName}'
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
async def getPackageList(venvFile: Path):
|
|
174
|
+
result = await _getPackageDict(venvFile)
|
|
175
|
+
lockName = _getLockName()
|
|
176
|
+
return result.get(_baseName, []), result.get(lockName, [])
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
async def updatePackageList(venvFile: Path, packages: list[str], lockPackages: list[str]):
|
|
180
|
+
packageDict = await _getPackageDict(venvFile)
|
|
181
|
+
lockName = _getLockName()
|
|
182
|
+
packages.sort(key=lambda x: x.lower())
|
|
183
|
+
lockPackages.sort(key=lambda x: x.lower())
|
|
184
|
+
packageDict[_baseName] = packages
|
|
185
|
+
packageDict[lockName] = lockPackages
|
|
186
|
+
content = '\n\n\n'.join([f'\n[[ {key} ]]\n{'\n'.join(value)}' for key, value in packageDict.items()]).strip()
|
|
187
|
+
await bfile.writeText(venvFile, content)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
async def _getPackageLatestVersion(package: str):
|
|
191
|
+
'获取指定包的最新版本'
|
|
192
|
+
data = await bhttp.getJson(
|
|
193
|
+
f'https://pypi.org/pypi/{package}/json'
|
|
194
|
+
)
|
|
195
|
+
return data['info']['version']
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _mergePackageList(basePackages: list[str], addPackages: list[str]):
|
|
199
|
+
basePackagesDict = {_getPackageName(x): x for x in basePackages}
|
|
200
|
+
addPackagesDict = {_getPackageName(x): x for x in addPackages}
|
|
201
|
+
packagesDict = basePackagesDict | addPackagesDict
|
|
202
|
+
return sorted([x for x in packagesDict.values()])
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def _getPackageName(package: str):
|
|
206
|
+
if '==' in package:
|
|
207
|
+
package = package.split('==')[0]
|
|
208
|
+
elif '>' in package:
|
|
209
|
+
package = package.split('>')[0]
|
|
210
|
+
elif '<' in package:
|
|
211
|
+
package = package.split('<')[0]
|
|
212
|
+
package = package.strip()
|
|
213
|
+
if package.startswith('#'):
|
|
214
|
+
package = package.replace('#', '', 1).strip()
|
|
215
|
+
return package
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def getVenvPath(path: Path):
|
|
219
|
+
return bpath.get(path, 'venv')
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def getPipFile(path: Path):
|
|
223
|
+
if sys.platform.startswith('win'):
|
|
224
|
+
return bpath.get(getVenvPath(path), 'Scripts/pip.exe')
|
|
225
|
+
else:
|
|
226
|
+
return bpath.get(getVenvPath(path), 'bin/pip')
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
bcmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
bcmd/main.py,sha256=1HRCHLt_jeF6ImgjG_MX9N2x9H1f6FyqTX7UADzedfA,131
|
|
3
|
+
bcmd/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
bcmd/common/func.py,sha256=MehbfuWFHTOsihhYxVFj0_U6-hjMTfLh3n-oMrpyyKo,508
|
|
5
|
+
bcmd/common/password.py,sha256=25fA1h9ttZuUobnZ_nA0Ouhmk43etBfGeM40dgxJnFY,1347
|
|
6
|
+
bcmd/resources/project/.gitignore,sha256=EygWFLwtooQl0GWXSeaLszLT-yQioKM7YMNAidcAHGw,23
|
|
7
|
+
bcmd/resources/project/main.py,sha256=xdskz_sf05fYA1SRMFCIxDjx8SnegxTbCmHpW86ItLs,11
|
|
8
|
+
bcmd/resources/project/.vscode/launch.json,sha256=Wpghb9lW9Y1wtrjqlTbyjeejDuU8BQJmBjwsLyPRh1g,478
|
|
9
|
+
bcmd/resources/project/.vscode/settings.json,sha256=G4rCroWxEHcQfsqIJ6CXRHI6VGr3WYQI3KPPjH_JANs,280
|
|
10
|
+
bcmd/resources/project/.vscode/tasks.json,sha256=gouhpkrqiPz7v65Jw1Rz-BCYU3sSdmphzXIYCzVnoe0,1783
|
|
11
|
+
bcmd/tasks/__init__.py,sha256=XDE4eW0mPkUCSK9tyg1DQRGLA7A9DuTmjq5MyUiPoXs,294
|
|
12
|
+
bcmd/tasks/bin.py,sha256=B_e-HYOc2Cohk-1PbKHyKn3RhI8TAUfI2EBRoFEHiTM,2961
|
|
13
|
+
bcmd/tasks/code.py,sha256=MaEnCMXiGkubslR7hLYX_8vIioN2CiEht4Nx6PtkVYY,3778
|
|
14
|
+
bcmd/tasks/crypto.py,sha256=C2welnYfdI4Tc-W1cwkboGb6bk6NGWO0MRKm4Bzo_9Q,3216
|
|
15
|
+
bcmd/tasks/debian.py,sha256=B9aMIIct3vNqMJr5hTr1GegXVf20H49C27FMvRRGIzI,3004
|
|
16
|
+
bcmd/tasks/download.py,sha256=XdZYKi8zQTNYWEgUxeTNDqPgP7IGYJkMmlDDC9u93Vk,2315
|
|
17
|
+
bcmd/tasks/image.py,sha256=Po8jpEf4e1X68oJc2MYT446o-45RgIrl1TsODvUetBo,7782
|
|
18
|
+
bcmd/tasks/json.py,sha256=WWOyvcZPYaqQgp-Tkm-uIJschNMBKPKtZN3yXz_SC5s,635
|
|
19
|
+
bcmd/tasks/lib.py,sha256=_hlMzvXKtiHtDOX4nBcWkoqrpQ8A1PdICa01OBFdhVU,4563
|
|
20
|
+
bcmd/tasks/math.py,sha256=xbl5UdaDMyAjiLodDPleP4Cutrk2S3NOAgurzAgOEAE,2862
|
|
21
|
+
bcmd/tasks/mirror.py,sha256=nAe8NYftMKzht16MFBj7RqXwvVhR6Jh2uuAyJLh87og,1098
|
|
22
|
+
bcmd/tasks/project.py,sha256=yLYL6WNmq0mlY-hQ-SGKZ6uRjwceJxpgbP-QAo0Wk-Y,1948
|
|
23
|
+
bcmd/tasks/proxy.py,sha256=SHYfdxrDt_TW0-7aNSuKX9oqm9CQ9tA87-7SgG794X8,1551
|
|
24
|
+
bcmd/tasks/time.py,sha256=ZiqA1jdgl-TBtFSOxxP51nwv4g9iZItmkFKpf9MKelk,2453
|
|
25
|
+
bcmd/tasks/venv.py,sha256=lxA_mzY3_s4bH28e52GqAyxiaqibGYgwkiRH23lflaQ,7636
|
|
26
|
+
bcmd-0.5.5.dist-info/METADATA,sha256=rBe0Nc-iLPHxXXLi2BLj1RmdcTaLryc-CSX9Y1sMMXQ,474
|
|
27
|
+
bcmd-0.5.5.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
28
|
+
bcmd-0.5.5.dist-info/entry_points.txt,sha256=rHJrP6KEQpB-YaQqDFzEL2v88r03rxSfnzAayRvAqHU,39
|
|
29
|
+
bcmd-0.5.5.dist-info/top_level.txt,sha256=-KrvhhtBcYsm4XhcjQvEcFbBB3VXeep7d3NIfDTrXKQ,5
|
|
30
|
+
bcmd-0.5.5.dist-info/RECORD,,
|
bcmd-0.5.4.dist-info/RECORD
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
bcmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
bcmd/main.py,sha256=8vYnVTAQ26hqeJEczbOHgwKPgCwc4ioFhSq8teBaJ98,141
|
|
3
|
-
bcmd/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
bcmd/common/func.py,sha256=LZn2vT75RFGil8F5szCWcjHtEjJEOx2tsHlFhOHu7G0,527
|
|
5
|
-
bcmd/common/password.py,sha256=enZ5UxWJ-SqHRf_N7k4NVmcAgRbxqdtPQ2iHD9dlKBE,1381
|
|
6
|
-
bcmd/resources/project/.gitignore,sha256=m8wh9WahP29_Ci866EEuj07Wfn0wnkomj7wldbxd29E,26
|
|
7
|
-
bcmd/resources/project/main.py,sha256=xdskz_sf05fYA1SRMFCIxDjx8SnegxTbCmHpW86ItLs,11
|
|
8
|
-
bcmd/resources/project/.vscode/launch.json,sha256=1sKvgMxEed0JeJ_ZOyISSotqxAAhjGCqQJXrD6YUsRk,492
|
|
9
|
-
bcmd/resources/project/.vscode/settings.json,sha256=Ze0dt3KkKU1IiXMRiQfjbcKdSsS7XTD9PkaQn3wgEWs,290
|
|
10
|
-
bcmd/resources/project/.vscode/tasks.json,sha256=KzTSl4Amygpm42WPyff4ONX3uyJ4bNtIGGzftrFmk6s,1850
|
|
11
|
-
bcmd/tasks/__init__.py,sha256=Dh7qznK8e84ItTe7TMUlbOl1eqeG1FJjm1lCCUVwG8o,309
|
|
12
|
-
bcmd/tasks/bin.py,sha256=4Ma9iOl9z7thFdKpGQtYgXk6uWckSffWJ8pAtE6S2nQ,3065
|
|
13
|
-
bcmd/tasks/code.py,sha256=gcBc0ZKRtVzQrbNeqcm0PSqjM_qpYDBsxlaHl-C-jjI,3037
|
|
14
|
-
bcmd/tasks/crypto.py,sha256=zktPJCrjh_5U48uiub6WOyqF4dtoEF5_F6d3MJye-MM,3332
|
|
15
|
-
bcmd/tasks/debian.py,sha256=1TI2AayMzLfTEXypvnyg4ZjPFVo4IeIoQirfK63rIPs,3082
|
|
16
|
-
bcmd/tasks/download.py,sha256=nj21dRJ9lxK_G5ZvAnIrM1G7o4OIWuZxbMiV3pEVaFk,2389
|
|
17
|
-
bcmd/tasks/image.py,sha256=csaXYQ4cKdtlUXzKEw_xBbRQDomYdWC9JZ-5xUSLg_k,7987
|
|
18
|
-
bcmd/tasks/json.py,sha256=81qjxSDvJm-uHi8vFFDLn_uWKM8PUdfsaShOi9Om_AI,660
|
|
19
|
-
bcmd/tasks/lib.py,sha256=y_wlXZWj0e8hD-cVB7MyaFWVglaRhh3NcruN-2dQkxY,4681
|
|
20
|
-
bcmd/tasks/math.py,sha256=-ehHR3sG4XkJ1S0aviaWJ6TZ4HITwLzEU6kInxzLXvU,2959
|
|
21
|
-
bcmd/tasks/mirror.py,sha256=t5FXdkmybiPQ2o7Lz7wYQnMCPLX3sRRsJJP2_dpFxqU,1144
|
|
22
|
-
bcmd/tasks/project.py,sha256=A44OlIdTqomD4RwZyR7QDaLC_HTMRQi1gCioVqQbpJ0,987
|
|
23
|
-
bcmd/tasks/proxy.py,sha256=ssqCoJoBJ9c1GdfKGAp7CPD4J0s8nPHrb8v20ZJV4kQ,1606
|
|
24
|
-
bcmd/tasks/time.py,sha256=g19hNBNtpWGwEwtjqkuIhkpTor1PSB43itzYXbAfmkg,2534
|
|
25
|
-
bcmd/tasks/venv.py,sha256=HqBQPp6zQeHFXhJmUHKgmHdAOIeMc_hWitnC7pIQCXo,7596
|
|
26
|
-
bcmd-0.5.4.dist-info/METADATA,sha256=iMvSxgERDf5ZLW-Jhl2oMJZC_r80G5jCSqlfHODTGfk,474
|
|
27
|
-
bcmd-0.5.4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
28
|
-
bcmd-0.5.4.dist-info/entry_points.txt,sha256=rHJrP6KEQpB-YaQqDFzEL2v88r03rxSfnzAayRvAqHU,39
|
|
29
|
-
bcmd-0.5.4.dist-info/top_level.txt,sha256=-KrvhhtBcYsm4XhcjQvEcFbBB3VXeep7d3NIfDTrXKQ,5
|
|
30
|
-
bcmd-0.5.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|