sharefetch 1.0.0__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.
- sharefetch-1.0.0/LICENSE +21 -0
- sharefetch-1.0.0/PKG-INFO +193 -0
- sharefetch-1.0.0/README.md +156 -0
- sharefetch-1.0.0/pyproject.toml +111 -0
- sharefetch-1.0.0/setup.cfg +4 -0
- sharefetch-1.0.0/sharefetch/__init__.py +11 -0
- sharefetch-1.0.0/sharefetch/__main__.py +8 -0
- sharefetch-1.0.0/sharefetch/auth.py +343 -0
- sharefetch-1.0.0/sharefetch/cli.py +782 -0
- sharefetch-1.0.0/sharefetch/config.py +374 -0
- sharefetch-1.0.0/sharefetch/engine.py +1055 -0
- sharefetch-1.0.0/sharefetch/errors.py +57 -0
- sharefetch-1.0.0/sharefetch/events.py +129 -0
- sharefetch-1.0.0/sharefetch/graph.py +474 -0
- sharefetch-1.0.0/sharefetch/gui.py +1170 -0
- sharefetch-1.0.0/sharefetch/hashes.py +123 -0
- sharefetch-1.0.0/sharefetch/listing.py +493 -0
- sharefetch-1.0.0/sharefetch/manifest.py +198 -0
- sharefetch-1.0.0/sharefetch/pacing.py +211 -0
- sharefetch-1.0.0/sharefetch/paths.py +245 -0
- sharefetch-1.0.0/sharefetch/py.typed +0 -0
- sharefetch-1.0.0/sharefetch/resolve.py +660 -0
- sharefetch-1.0.0/sharefetch/state.py +707 -0
- sharefetch-1.0.0/sharefetch/tokencache.py +214 -0
- sharefetch-1.0.0/sharefetch/transfer.py +815 -0
- sharefetch-1.0.0/sharefetch/urls.py +195 -0
- sharefetch-1.0.0/sharefetch/verify.py +378 -0
- sharefetch-1.0.0/sharefetch.egg-info/PKG-INFO +193 -0
- sharefetch-1.0.0/sharefetch.egg-info/SOURCES.txt +50 -0
- sharefetch-1.0.0/sharefetch.egg-info/dependency_links.txt +1 -0
- sharefetch-1.0.0/sharefetch.egg-info/entry_points.txt +5 -0
- sharefetch-1.0.0/sharefetch.egg-info/requires.txt +9 -0
- sharefetch-1.0.0/sharefetch.egg-info/top_level.txt +1 -0
- sharefetch-1.0.0/tests/test_auth.py +415 -0
- sharefetch-1.0.0/tests/test_cli.py +793 -0
- sharefetch-1.0.0/tests/test_engine.py +1051 -0
- sharefetch-1.0.0/tests/test_graph.py +1024 -0
- sharefetch-1.0.0/tests/test_gui.py +285 -0
- sharefetch-1.0.0/tests/test_hashes.py +166 -0
- sharefetch-1.0.0/tests/test_listing.py +612 -0
- sharefetch-1.0.0/tests/test_live.py +394 -0
- sharefetch-1.0.0/tests/test_manifest.py +442 -0
- sharefetch-1.0.0/tests/test_no_delete.py +36 -0
- sharefetch-1.0.0/tests/test_pacing.py +408 -0
- sharefetch-1.0.0/tests/test_package.py +14 -0
- sharefetch-1.0.0/tests/test_paths.py +285 -0
- sharefetch-1.0.0/tests/test_resolve.py +753 -0
- sharefetch-1.0.0/tests/test_state.py +775 -0
- sharefetch-1.0.0/tests/test_tokencache.py +323 -0
- sharefetch-1.0.0/tests/test_transfer.py +1137 -0
- sharefetch-1.0.0/tests/test_urls.py +139 -0
- sharefetch-1.0.0/tests/test_verify.py +657 -0
sharefetch-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Santhosh
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sharefetch
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Resumable, rate-limited downloads from Microsoft Graph drives.
|
|
5
|
+
Author-email: Santhosh <santhoshmlaa@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Indspl0it/sharefetch
|
|
8
|
+
Project-URL: Repository, https://github.com/Indspl0it/sharefetch
|
|
9
|
+
Project-URL: Issues, https://github.com/Indspl0it/sharefetch/issues
|
|
10
|
+
Keywords: sharepoint,onedrive,microsoft-graph,download,resumable,device-code,oauth2
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Environment :: Win32 (MS Windows)
|
|
14
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
15
|
+
Classifier: Intended Audience :: System Administrators
|
|
16
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
22
|
+
Classifier: Topic :: Communications :: File Sharing
|
|
23
|
+
Classifier: Topic :: System :: Archiving :: Mirroring
|
|
24
|
+
Classifier: Typing :: Typed
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: requests==2.32.3
|
|
29
|
+
Requires-Dist: msal==1.39.0
|
|
30
|
+
Requires-Dist: msal-extensions[portalocker]==1.3.1
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: pytest==8.4.2; extra == "dev"
|
|
33
|
+
Requires-Dist: pytest-cov==7.0.0; extra == "dev"
|
|
34
|
+
Requires-Dist: ruff==0.15.12; extra == "dev"
|
|
35
|
+
Requires-Dist: build==1.3.0; extra == "dev"
|
|
36
|
+
Dynamic: license-file
|
|
37
|
+
|
|
38
|
+
# sharefetch
|
|
39
|
+
|
|
40
|
+
Download a SharePoint Online or OneDrive for Business folder tree to a local directory, resumably and with content-level verification.
|
|
41
|
+
|
|
42
|
+

|
|
43
|
+
|
|
44
|
+
```console
|
|
45
|
+
$ sharefetch "https://contoso.sharepoint.com/sites/Example/Shared Documents/Logs" --dest D:/archive
|
|
46
|
+
INFO sharefetch.cli To sign in, use a web browser to open the page https://login.microsoft.com/device and enter the code J7QK4RN2P to authenticate.
|
|
47
|
+
INFO sharefetch.cli signed in as user@contoso.com
|
|
48
|
+
INFO sharefetch.cli resolved to the Shared Documents library, folder 'Logs'
|
|
49
|
+
INFO sharefetch.cli enumeration complete: 15 file(s) in 0 folder(s), 11049892 byte(s)
|
|
50
|
+
INFO sharefetch.cli Logs/Q3 Summary.pdf: starting, 2939254 byte(s)
|
|
51
|
+
INFO sharefetch.cli Logs/Q3 Summary.pdf: complete, verification passed
|
|
52
|
+
INFO sharefetch.cli Logs/Change Register.xlsx: complete, verification passed
|
|
53
|
+
INFO sharefetch.cli run finished: 15 transferred, 0 already present, 0 skipped, 0 failed, 15 verified, 11049892 byte(s) transferred
|
|
54
|
+
INFO sharefetch.cli manifest: D:\archive\manifest.csv
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
## Installation
|
|
60
|
+
|
|
61
|
+
```console
|
|
62
|
+
$ pip install sharefetch
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Python 3.10 or later. Windows is the target platform, because path handling and the token cache are Windows-specific.
|
|
66
|
+
|
|
67
|
+
From a clone:
|
|
68
|
+
|
|
69
|
+
```console
|
|
70
|
+
$ git clone https://github.com/Indspl0it/sharefetch.git
|
|
71
|
+
$ cd sharefetch
|
|
72
|
+
$ pip install -e .
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Two commands are installed, `sharefetch` for the terminal and `sharefetch-gui` for a window.
|
|
76
|
+
|
|
77
|
+
## Usage
|
|
78
|
+
|
|
79
|
+
The folder URL from the browser address bar is the only argument.
|
|
80
|
+
|
|
81
|
+
```console
|
|
82
|
+
$ sharefetch "https://contoso.sharepoint.com/sites/Example/Shared Documents/Logs"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
A device code appears on the first run. Entering it at the verification page on any device starts the transfer. Later runs use the cached token and print no code.
|
|
86
|
+
|
|
87
|
+
Choose a destination and slow the transfer down:
|
|
88
|
+
|
|
89
|
+
```console
|
|
90
|
+
$ sharefetch "<url>" --dest D:/archive --delay 2 --limit-rate 500
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Report what a run would transfer, without transferring it:
|
|
94
|
+
|
|
95
|
+
```console
|
|
96
|
+
$ sharefetch "<url>" --dry-run
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Take part of a tree:
|
|
100
|
+
|
|
101
|
+
```console
|
|
102
|
+
$ sharefetch "<url>" --include "*.pdf" --exclude "*/Archive/*" --max-depth 2
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Re-check an existing download, without touching the network:
|
|
106
|
+
|
|
107
|
+
```console
|
|
108
|
+
$ sharefetch "<url>" --dest D:/archive --verify-only
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Run it again after an interruption. It reconciles against the disk, resumes the
|
|
112
|
+
partial file from where it stopped, and skips everything already verified:
|
|
113
|
+
|
|
114
|
+
```console
|
|
115
|
+
$ sharefetch "<url>" --dest D:/archive
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
### Accepted URLs
|
|
121
|
+
|
|
122
|
+
Six forms are accepted, so whichever one the browser produced will work.
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
# library view with an id parameter
|
|
126
|
+
https://contoso.sharepoint.com/sites/Example/Shared%20Documents/Forms/AllItems.aspx?id=%2Fsites%2FExample%2FShared%20Documents%2FLogs
|
|
127
|
+
|
|
128
|
+
# direct folder path
|
|
129
|
+
https://contoso.sharepoint.com/sites/Example/Shared Documents/Logs
|
|
130
|
+
|
|
131
|
+
# teams-backed site
|
|
132
|
+
https://contoso.sharepoint.com/teams/Workgroup/Shared Documents/Notes
|
|
133
|
+
|
|
134
|
+
# subsite
|
|
135
|
+
https://contoso.sharepoint.com/sites/Parent/Child/Shared Documents/Reports
|
|
136
|
+
|
|
137
|
+
# personal OneDrive
|
|
138
|
+
https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Archive
|
|
139
|
+
|
|
140
|
+
# sharing link, which needs --dest
|
|
141
|
+
https://contoso.sharepoint.com/:f:/s/Example/EhT7abc
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
## Command line options
|
|
147
|
+
|
|
148
|
+
```console
|
|
149
|
+
$ sharefetch <url> [options]
|
|
150
|
+
|
|
151
|
+
# where the tree lands
|
|
152
|
+
--dest DIR # default: a folder named after the addressed folder
|
|
153
|
+
# required for a sharing link
|
|
154
|
+
--ignore-free-space # skip the capacity check made before transferring
|
|
155
|
+
|
|
156
|
+
# network behaviour
|
|
157
|
+
--connections N # 1 or 2, higher is rejected at parse time (default: 1)
|
|
158
|
+
--delay SECONDS # pause between requests, 0.0 to 60.0, shared by
|
|
159
|
+
# every worker (default: 0.5)
|
|
160
|
+
--limit-rate KBPS # transfer ceiling in KB/s (default: none)
|
|
161
|
+
--chunk-size KIB # read size, 64 to 4096 (default: 256)
|
|
162
|
+
|
|
163
|
+
# what to transfer
|
|
164
|
+
--include GLOB # only items matching the glob, repeatable
|
|
165
|
+
--exclude GLOB # drop matching items, applied after --include
|
|
166
|
+
--max-depth N # 0 is the addressed folder alone (default: unlimited)
|
|
167
|
+
|
|
168
|
+
# run mode
|
|
169
|
+
--resume # continue from the state file (default)
|
|
170
|
+
--restart # transfer every item again, removing nothing
|
|
171
|
+
--dry-run # enumerate and report, writing no file content
|
|
172
|
+
--verify-only # check the tree on disk, no sign-in and no network
|
|
173
|
+
|
|
174
|
+
# sign-in
|
|
175
|
+
--reauth # ignore the cached token, force a new device code
|
|
176
|
+
--tenant ID # tenant GUID or domain (default: organizations)
|
|
177
|
+
--client-id GUID # application to sign in as
|
|
178
|
+
# (default: d3590ed6-52b3-4102-aeff-aad2292ab01c,
|
|
179
|
+
# a Microsoft first-party public client)
|
|
180
|
+
|
|
181
|
+
# output
|
|
182
|
+
--log-file PATH # write the log here as well as to stderr
|
|
183
|
+
# the device code is never written to it
|
|
184
|
+
--verbose # log at DEBUG in place of INFO
|
|
185
|
+
--version # print the version and exit
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Exit codes: `0` every item complete and verified, `1` finished with failed or
|
|
189
|
+
skipped items, `2` fatal during setup, `130` interrupted.
|
|
190
|
+
|
|
191
|
+
## Licence
|
|
192
|
+
|
|
193
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# sharefetch
|
|
2
|
+
|
|
3
|
+
Download a SharePoint Online or OneDrive for Business folder tree to a local directory, resumably and with content-level verification.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
```console
|
|
8
|
+
$ sharefetch "https://contoso.sharepoint.com/sites/Example/Shared Documents/Logs" --dest D:/archive
|
|
9
|
+
INFO sharefetch.cli To sign in, use a web browser to open the page https://login.microsoft.com/device and enter the code J7QK4RN2P to authenticate.
|
|
10
|
+
INFO sharefetch.cli signed in as user@contoso.com
|
|
11
|
+
INFO sharefetch.cli resolved to the Shared Documents library, folder 'Logs'
|
|
12
|
+
INFO sharefetch.cli enumeration complete: 15 file(s) in 0 folder(s), 11049892 byte(s)
|
|
13
|
+
INFO sharefetch.cli Logs/Q3 Summary.pdf: starting, 2939254 byte(s)
|
|
14
|
+
INFO sharefetch.cli Logs/Q3 Summary.pdf: complete, verification passed
|
|
15
|
+
INFO sharefetch.cli Logs/Change Register.xlsx: complete, verification passed
|
|
16
|
+
INFO sharefetch.cli run finished: 15 transferred, 0 already present, 0 skipped, 0 failed, 15 verified, 11049892 byte(s) transferred
|
|
17
|
+
INFO sharefetch.cli manifest: D:\archive\manifest.csv
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
```console
|
|
25
|
+
$ pip install sharefetch
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Python 3.10 or later. Windows is the target platform, because path handling and the token cache are Windows-specific.
|
|
29
|
+
|
|
30
|
+
From a clone:
|
|
31
|
+
|
|
32
|
+
```console
|
|
33
|
+
$ git clone https://github.com/Indspl0it/sharefetch.git
|
|
34
|
+
$ cd sharefetch
|
|
35
|
+
$ pip install -e .
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Two commands are installed, `sharefetch` for the terminal and `sharefetch-gui` for a window.
|
|
39
|
+
|
|
40
|
+
## Usage
|
|
41
|
+
|
|
42
|
+
The folder URL from the browser address bar is the only argument.
|
|
43
|
+
|
|
44
|
+
```console
|
|
45
|
+
$ sharefetch "https://contoso.sharepoint.com/sites/Example/Shared Documents/Logs"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
A device code appears on the first run. Entering it at the verification page on any device starts the transfer. Later runs use the cached token and print no code.
|
|
49
|
+
|
|
50
|
+
Choose a destination and slow the transfer down:
|
|
51
|
+
|
|
52
|
+
```console
|
|
53
|
+
$ sharefetch "<url>" --dest D:/archive --delay 2 --limit-rate 500
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Report what a run would transfer, without transferring it:
|
|
57
|
+
|
|
58
|
+
```console
|
|
59
|
+
$ sharefetch "<url>" --dry-run
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Take part of a tree:
|
|
63
|
+
|
|
64
|
+
```console
|
|
65
|
+
$ sharefetch "<url>" --include "*.pdf" --exclude "*/Archive/*" --max-depth 2
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Re-check an existing download, without touching the network:
|
|
69
|
+
|
|
70
|
+
```console
|
|
71
|
+
$ sharefetch "<url>" --dest D:/archive --verify-only
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Run it again after an interruption. It reconciles against the disk, resumes the
|
|
75
|
+
partial file from where it stopped, and skips everything already verified:
|
|
76
|
+
|
|
77
|
+
```console
|
|
78
|
+
$ sharefetch "<url>" --dest D:/archive
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
### Accepted URLs
|
|
84
|
+
|
|
85
|
+
Six forms are accepted, so whichever one the browser produced will work.
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
# library view with an id parameter
|
|
89
|
+
https://contoso.sharepoint.com/sites/Example/Shared%20Documents/Forms/AllItems.aspx?id=%2Fsites%2FExample%2FShared%20Documents%2FLogs
|
|
90
|
+
|
|
91
|
+
# direct folder path
|
|
92
|
+
https://contoso.sharepoint.com/sites/Example/Shared Documents/Logs
|
|
93
|
+
|
|
94
|
+
# teams-backed site
|
|
95
|
+
https://contoso.sharepoint.com/teams/Workgroup/Shared Documents/Notes
|
|
96
|
+
|
|
97
|
+
# subsite
|
|
98
|
+
https://contoso.sharepoint.com/sites/Parent/Child/Shared Documents/Reports
|
|
99
|
+
|
|
100
|
+
# personal OneDrive
|
|
101
|
+
https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/Archive
|
|
102
|
+
|
|
103
|
+
# sharing link, which needs --dest
|
|
104
|
+
https://contoso.sharepoint.com/:f:/s/Example/EhT7abc
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
## Command line options
|
|
110
|
+
|
|
111
|
+
```console
|
|
112
|
+
$ sharefetch <url> [options]
|
|
113
|
+
|
|
114
|
+
# where the tree lands
|
|
115
|
+
--dest DIR # default: a folder named after the addressed folder
|
|
116
|
+
# required for a sharing link
|
|
117
|
+
--ignore-free-space # skip the capacity check made before transferring
|
|
118
|
+
|
|
119
|
+
# network behaviour
|
|
120
|
+
--connections N # 1 or 2, higher is rejected at parse time (default: 1)
|
|
121
|
+
--delay SECONDS # pause between requests, 0.0 to 60.0, shared by
|
|
122
|
+
# every worker (default: 0.5)
|
|
123
|
+
--limit-rate KBPS # transfer ceiling in KB/s (default: none)
|
|
124
|
+
--chunk-size KIB # read size, 64 to 4096 (default: 256)
|
|
125
|
+
|
|
126
|
+
# what to transfer
|
|
127
|
+
--include GLOB # only items matching the glob, repeatable
|
|
128
|
+
--exclude GLOB # drop matching items, applied after --include
|
|
129
|
+
--max-depth N # 0 is the addressed folder alone (default: unlimited)
|
|
130
|
+
|
|
131
|
+
# run mode
|
|
132
|
+
--resume # continue from the state file (default)
|
|
133
|
+
--restart # transfer every item again, removing nothing
|
|
134
|
+
--dry-run # enumerate and report, writing no file content
|
|
135
|
+
--verify-only # check the tree on disk, no sign-in and no network
|
|
136
|
+
|
|
137
|
+
# sign-in
|
|
138
|
+
--reauth # ignore the cached token, force a new device code
|
|
139
|
+
--tenant ID # tenant GUID or domain (default: organizations)
|
|
140
|
+
--client-id GUID # application to sign in as
|
|
141
|
+
# (default: d3590ed6-52b3-4102-aeff-aad2292ab01c,
|
|
142
|
+
# a Microsoft first-party public client)
|
|
143
|
+
|
|
144
|
+
# output
|
|
145
|
+
--log-file PATH # write the log here as well as to stderr
|
|
146
|
+
# the device code is never written to it
|
|
147
|
+
--verbose # log at DEBUG in place of INFO
|
|
148
|
+
--version # print the version and exit
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Exit codes: `0` every item complete and verified, `1` finished with failed or
|
|
152
|
+
skipped items, `2` fatal during setup, `130` interrupted.
|
|
153
|
+
|
|
154
|
+
## Licence
|
|
155
|
+
|
|
156
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "sharefetch"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Resumable, rate-limited downloads from Microsoft Graph drives."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE"]
|
|
13
|
+
authors = [{ name = "Santhosh", email = "santhoshmlaa@gmail.com" }]
|
|
14
|
+
keywords = [
|
|
15
|
+
"sharepoint",
|
|
16
|
+
"onedrive",
|
|
17
|
+
"microsoft-graph",
|
|
18
|
+
"download",
|
|
19
|
+
"resumable",
|
|
20
|
+
"device-code",
|
|
21
|
+
"oauth2",
|
|
22
|
+
]
|
|
23
|
+
classifiers = [
|
|
24
|
+
"Development Status :: 5 - Production/Stable",
|
|
25
|
+
"Environment :: Console",
|
|
26
|
+
"Environment :: Win32 (MS Windows)",
|
|
27
|
+
"Intended Audience :: End Users/Desktop",
|
|
28
|
+
"Intended Audience :: System Administrators",
|
|
29
|
+
"Operating System :: Microsoft :: Windows :: Windows 11",
|
|
30
|
+
"Programming Language :: Python :: 3.10",
|
|
31
|
+
"Programming Language :: Python :: 3.11",
|
|
32
|
+
"Programming Language :: Python :: 3.12",
|
|
33
|
+
"Programming Language :: Python :: 3.13",
|
|
34
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
35
|
+
"Topic :: Communications :: File Sharing",
|
|
36
|
+
"Topic :: System :: Archiving :: Mirroring",
|
|
37
|
+
"Typing :: Typed",
|
|
38
|
+
]
|
|
39
|
+
dependencies = [
|
|
40
|
+
"requests==2.32.3",
|
|
41
|
+
"msal==1.39.0",
|
|
42
|
+
"msal-extensions[portalocker]==1.3.1",
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
[project.optional-dependencies]
|
|
46
|
+
dev = [
|
|
47
|
+
"pytest==8.4.2",
|
|
48
|
+
"pytest-cov==7.0.0",
|
|
49
|
+
"ruff==0.15.12",
|
|
50
|
+
"build==1.3.0",
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
[project.scripts]
|
|
54
|
+
sharefetch = "sharefetch.cli:main"
|
|
55
|
+
|
|
56
|
+
[project.gui-scripts]
|
|
57
|
+
sharefetch-gui = "sharefetch.gui:main"
|
|
58
|
+
|
|
59
|
+
[project.urls]
|
|
60
|
+
Homepage = "https://github.com/Indspl0it/sharefetch"
|
|
61
|
+
Repository = "https://github.com/Indspl0it/sharefetch"
|
|
62
|
+
Issues = "https://github.com/Indspl0it/sharefetch/issues"
|
|
63
|
+
|
|
64
|
+
[tool.setuptools]
|
|
65
|
+
packages = ["sharefetch"]
|
|
66
|
+
|
|
67
|
+
[tool.setuptools.package-data]
|
|
68
|
+
sharefetch = ["py.typed"]
|
|
69
|
+
|
|
70
|
+
[tool.ruff]
|
|
71
|
+
line-length = 100
|
|
72
|
+
target-version = "py310"
|
|
73
|
+
|
|
74
|
+
[tool.ruff.lint]
|
|
75
|
+
select = [
|
|
76
|
+
"E",
|
|
77
|
+
"F",
|
|
78
|
+
"W",
|
|
79
|
+
"I",
|
|
80
|
+
"N",
|
|
81
|
+
"UP",
|
|
82
|
+
"B",
|
|
83
|
+
"A",
|
|
84
|
+
"C4",
|
|
85
|
+
"SIM",
|
|
86
|
+
"PTH",
|
|
87
|
+
"RUF",
|
|
88
|
+
"ARG",
|
|
89
|
+
"DTZ",
|
|
90
|
+
"LOG",
|
|
91
|
+
"G",
|
|
92
|
+
"T20",
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
[tool.ruff.lint.per-file-ignores]
|
|
96
|
+
"tests/*" = ["ARG", "T20"]
|
|
97
|
+
"sharefetch/cli.py" = ["T20"]
|
|
98
|
+
|
|
99
|
+
[tool.ruff.format]
|
|
100
|
+
quote-style = "double"
|
|
101
|
+
|
|
102
|
+
[tool.pytest.ini_options]
|
|
103
|
+
testpaths = ["tests"]
|
|
104
|
+
addopts = "-ra --strict-markers --strict-config"
|
|
105
|
+
markers = [
|
|
106
|
+
"live: requires an authenticated Microsoft Graph session and the regression fixture (deselect with '-m \"not live\"')",
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
[tool.coverage.run]
|
|
110
|
+
source = ["sharefetch"]
|
|
111
|
+
branch = true
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Resumable, rate-limited downloads from Microsoft Graph drives.
|
|
2
|
+
|
|
3
|
+
The package mirrors a SharePoint or OneDrive drive to local storage over the
|
|
4
|
+
Microsoft Graph API. Transfers resume from a state file after an interruption,
|
|
5
|
+
requests are throttled to stay inside the service limits, and no download path
|
|
6
|
+
removes user data: a failed or partial transfer leaves its file on disk.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
__version__ = "1.0.0"
|
|
10
|
+
|
|
11
|
+
__all__ = ["__version__"]
|