lfss 0.12.1__tar.gz → 0.12.2__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.
- {lfss-0.12.1 → lfss-0.12.2}/PKG-INFO +10 -11
- {lfss-0.12.1 → lfss-0.12.2}/Readme.md +1 -1
- {lfss-0.12.1 → lfss-0.12.2}/docs/Client.md +1 -2
- {lfss-0.12.1 → lfss-0.12.2}/docs/changelog.md +4 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/cli/cli.py +13 -9
- {lfss-0.12.1 → lfss-0.12.2}/lfss/eng/utils.py +5 -1
- {lfss-0.12.1 → lfss-0.12.2}/pyproject.toml +11 -10
- {lfss-0.12.1 → lfss-0.12.2}/docs/Enviroment_variables.md +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/docs/Known_issues.md +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/docs/Permission.md +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/docs/Webdav.md +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/api.js +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/index.html +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/info.css +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/info.js +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/login.css +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/login.js +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/popup.css +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/popup.js +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/scripts.js +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/state.js +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/styles.css +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/thumb.css +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/thumb.js +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/frontend/utils.js +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/api/__init__.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/api/connector.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/cli/__init__.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/cli/balance.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/cli/cli_lib.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/cli/log.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/cli/panel.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/cli/serve.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/cli/user.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/cli/vacuum.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/eng/__init__.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/eng/bounded_pool.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/eng/config.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/eng/connection_pool.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/eng/database.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/eng/datatype.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/eng/error.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/eng/log.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/eng/thumb.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/sql/init.sql +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/sql/pragma.sql +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/svc/app.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/svc/app_base.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/svc/app_dav.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/svc/app_native.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/svc/common_impl.py +0 -0
- {lfss-0.12.1 → lfss-0.12.2}/lfss/svc/request_log.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: lfss
|
3
|
-
Version: 0.12.
|
3
|
+
Version: 0.12.2
|
4
4
|
Summary: Lite file storage service
|
5
5
|
Home-page: https://github.com/MenxLi/lfss
|
6
6
|
Author: Li, Mengxun
|
@@ -10,16 +10,15 @@ Classifier: Programming Language :: Python :: 3
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.10
|
11
11
|
Classifier: Programming Language :: Python :: 3.11
|
12
12
|
Classifier: Programming Language :: Python :: 3.12
|
13
|
-
|
14
|
-
Requires-Dist:
|
15
|
-
Requires-Dist:
|
16
|
-
Requires-Dist:
|
17
|
-
Requires-Dist:
|
18
|
-
Requires-Dist:
|
13
|
+
Provides-Extra: all
|
14
|
+
Requires-Dist: aiofiles (==24.*) ; extra == "all"
|
15
|
+
Requires-Dist: aiosqlite (==0.*) ; extra == "all"
|
16
|
+
Requires-Dist: fastapi[standard] (==0.*) ; extra == "all"
|
17
|
+
Requires-Dist: mimesniff (==1.*) ; extra == "all"
|
18
|
+
Requires-Dist: pillow ; extra == "all"
|
19
19
|
Requires-Dist: requests (==2.*)
|
20
|
-
Requires-Dist: rich
|
21
|
-
Requires-Dist: stream-zip (==0.*)
|
22
|
-
Requires-Dist: uvicorn (==0.*)
|
20
|
+
Requires-Dist: rich ; extra == "all"
|
21
|
+
Requires-Dist: stream-zip (==0.*) ; extra == "all"
|
23
22
|
Project-URL: Repository, https://github.com/MenxLi/lfss
|
24
23
|
Description-Content-Type: text/markdown
|
25
24
|
|
@@ -41,7 +40,7 @@ Tested on 2 million files, and it is still fast.
|
|
41
40
|
|
42
41
|
Usage:
|
43
42
|
```sh
|
44
|
-
pip install lfss
|
43
|
+
pip install "lfss[all]"
|
45
44
|
lfss-user add <username> <password>
|
46
45
|
lfss-serve
|
47
46
|
```
|
@@ -55,14 +55,18 @@ def print_path_list(
|
|
55
55
|
print("[F]", end=" ")
|
56
56
|
case _:
|
57
57
|
print("[?]", end=" ")
|
58
|
-
|
59
|
-
if detailed:
|
60
|
-
if isinstance(r,
|
61
|
-
|
58
|
+
# if not detailed, only print name
|
59
|
+
if not detailed:
|
60
|
+
if isinstance(r, DirectoryRecord):
|
61
|
+
assert r.url.endswith("/")
|
62
|
+
print(decode_uri_components(r.url).rstrip("/").split("/")[-1], end="/")
|
62
63
|
else:
|
63
|
-
print()
|
64
|
+
print(decode_uri_components(r.url).split("/")[-1], end="")
|
64
65
|
else:
|
65
|
-
print()
|
66
|
+
print(decode_uri_components(r.url), end="")
|
67
|
+
if isinstance(r, FileRecord):
|
68
|
+
print(f" :: {fmt_storage_size(r.file_size)} {r.permission.name}", end="")
|
69
|
+
print()
|
66
70
|
|
67
71
|
for d in line_sep(dirs, end=False):
|
68
72
|
print_ln(d)
|
@@ -117,7 +121,7 @@ def parse_arguments():
|
|
117
121
|
sp_list.add_argument("path", help="Path to list", type=str)
|
118
122
|
sp_list.add_argument("--offset", type=int, default=0, help="Offset of the list")
|
119
123
|
sp_list.add_argument("--limit", type=int, default=100, help="Limit of the list")
|
120
|
-
sp_list.add_argument("-l", "--long", action="store_true", help="Detailed list
|
124
|
+
sp_list.add_argument("-l", "--long", action="store_true", help="Detailed list")
|
121
125
|
sp_list.add_argument("--order", "--order-by", type=str, help="Order of the list", default="", choices=typing.get_args(FileSortKey))
|
122
126
|
sp_list.add_argument("--reverse", "--order-desc", action="store_true", help="Reverse the list order")
|
123
127
|
|
@@ -126,7 +130,7 @@ def parse_arguments():
|
|
126
130
|
sp_list_d.add_argument("path", help="Path to list", type=str)
|
127
131
|
sp_list_d.add_argument("--offset", type=int, default=0, help="Offset of the list")
|
128
132
|
sp_list_d.add_argument("--limit", type=int, default=100, help="Limit of the list")
|
129
|
-
sp_list_d.add_argument("-l", "--long", action="store_true", help="Detailed list
|
133
|
+
sp_list_d.add_argument("-l", "--long", action="store_true", help="Detailed list")
|
130
134
|
sp_list_d.add_argument("--order", "--order-by", type=str, help="Order of the list", default="", choices=typing.get_args(DirSortKey))
|
131
135
|
sp_list_d.add_argument("--reverse", "--order-desc", action="store_true", help="Reverse the list order")
|
132
136
|
|
@@ -136,7 +140,7 @@ def parse_arguments():
|
|
136
140
|
sp_list_f.add_argument("--offset", type=int, default=0, help="Offset of the list")
|
137
141
|
sp_list_f.add_argument("--limit", type=int, default=100, help="Limit of the list")
|
138
142
|
sp_list_f.add_argument("-r", "--recursive", "--flat", action="store_true", help="List files recursively")
|
139
|
-
sp_list_f.add_argument("-l", "--long", action="store_true", help="Detailed list
|
143
|
+
sp_list_f.add_argument("-l", "--long", action="store_true", help="Detailed list")
|
140
144
|
sp_list_f.add_argument("--order", "--order-by", type=str, help="Order of the list", default="", choices=typing.get_args(FileSortKey))
|
141
145
|
sp_list_f.add_argument("--reverse", "--order-desc", action="store_true", help="Reverse the list order")
|
142
146
|
|
@@ -3,7 +3,6 @@ import urllib.parse
|
|
3
3
|
import pathlib
|
4
4
|
import functools
|
5
5
|
import hashlib
|
6
|
-
import aiofiles
|
7
6
|
import asyncio
|
8
7
|
from asyncio import Lock
|
9
8
|
from collections import OrderedDict
|
@@ -11,6 +10,11 @@ from concurrent.futures import ThreadPoolExecutor
|
|
11
10
|
from typing import TypeVar, Callable, Awaitable
|
12
11
|
from functools import wraps, partial
|
13
12
|
from uuid import uuid4
|
13
|
+
try:
|
14
|
+
# optional dependency for client-side
|
15
|
+
import aiofiles
|
16
|
+
except ImportError:
|
17
|
+
pass
|
14
18
|
|
15
19
|
async def copy_file(source: str|pathlib.Path, destination: str|pathlib.Path):
|
16
20
|
async with aiofiles.open(source, mode='rb') as src:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "lfss"
|
3
|
-
version = "0.12.
|
3
|
+
version = "0.12.2"
|
4
4
|
description = "Lite file storage service"
|
5
5
|
authors = ["Li, Mengxun <mengxunli@whu.edu.cn>"]
|
6
6
|
readme = "Readme.md"
|
@@ -11,15 +11,16 @@ include = ["Readme.md", "docs/*", "frontend/*", "lfss/sql/*"]
|
|
11
11
|
[tool.poetry.dependencies]
|
12
12
|
python = ">=3.10" # PEP-622
|
13
13
|
requests = "2.*"
|
14
|
-
aiosqlite = "0.*"
|
15
|
-
aiofiles = "24.*"
|
16
|
-
mimesniff = "1.*"
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
14
|
+
aiosqlite = {"version" = "0.*", "optional" = true}
|
15
|
+
aiofiles = {"version" = "24.*", "optional" = true}
|
16
|
+
mimesniff = {"version" = "1.*", "optional" = true}
|
17
|
+
stream-zip = {"version" = "0.*", "optional" = true}
|
18
|
+
pillow = {"version" = "*", "optional" = true}
|
19
|
+
rich = {"version" = "*", "optional" = true}
|
20
|
+
fastapi = {"version" = "0.*", "optional" = true, "extras" = ["standard"]}
|
21
|
+
|
22
|
+
[tool.poetry.extras]
|
23
|
+
all = ["aiosqlite", "aiofiles", "mimesniff", "fastapi", "stream-zip", "pillow", "rich"]
|
23
24
|
|
24
25
|
[tool.poetry.dev-dependencies]
|
25
26
|
pytest = "*"
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|