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.
Files changed (52) hide show
  1. sharefetch-1.0.0/LICENSE +21 -0
  2. sharefetch-1.0.0/PKG-INFO +193 -0
  3. sharefetch-1.0.0/README.md +156 -0
  4. sharefetch-1.0.0/pyproject.toml +111 -0
  5. sharefetch-1.0.0/setup.cfg +4 -0
  6. sharefetch-1.0.0/sharefetch/__init__.py +11 -0
  7. sharefetch-1.0.0/sharefetch/__main__.py +8 -0
  8. sharefetch-1.0.0/sharefetch/auth.py +343 -0
  9. sharefetch-1.0.0/sharefetch/cli.py +782 -0
  10. sharefetch-1.0.0/sharefetch/config.py +374 -0
  11. sharefetch-1.0.0/sharefetch/engine.py +1055 -0
  12. sharefetch-1.0.0/sharefetch/errors.py +57 -0
  13. sharefetch-1.0.0/sharefetch/events.py +129 -0
  14. sharefetch-1.0.0/sharefetch/graph.py +474 -0
  15. sharefetch-1.0.0/sharefetch/gui.py +1170 -0
  16. sharefetch-1.0.0/sharefetch/hashes.py +123 -0
  17. sharefetch-1.0.0/sharefetch/listing.py +493 -0
  18. sharefetch-1.0.0/sharefetch/manifest.py +198 -0
  19. sharefetch-1.0.0/sharefetch/pacing.py +211 -0
  20. sharefetch-1.0.0/sharefetch/paths.py +245 -0
  21. sharefetch-1.0.0/sharefetch/py.typed +0 -0
  22. sharefetch-1.0.0/sharefetch/resolve.py +660 -0
  23. sharefetch-1.0.0/sharefetch/state.py +707 -0
  24. sharefetch-1.0.0/sharefetch/tokencache.py +214 -0
  25. sharefetch-1.0.0/sharefetch/transfer.py +815 -0
  26. sharefetch-1.0.0/sharefetch/urls.py +195 -0
  27. sharefetch-1.0.0/sharefetch/verify.py +378 -0
  28. sharefetch-1.0.0/sharefetch.egg-info/PKG-INFO +193 -0
  29. sharefetch-1.0.0/sharefetch.egg-info/SOURCES.txt +50 -0
  30. sharefetch-1.0.0/sharefetch.egg-info/dependency_links.txt +1 -0
  31. sharefetch-1.0.0/sharefetch.egg-info/entry_points.txt +5 -0
  32. sharefetch-1.0.0/sharefetch.egg-info/requires.txt +9 -0
  33. sharefetch-1.0.0/sharefetch.egg-info/top_level.txt +1 -0
  34. sharefetch-1.0.0/tests/test_auth.py +415 -0
  35. sharefetch-1.0.0/tests/test_cli.py +793 -0
  36. sharefetch-1.0.0/tests/test_engine.py +1051 -0
  37. sharefetch-1.0.0/tests/test_graph.py +1024 -0
  38. sharefetch-1.0.0/tests/test_gui.py +285 -0
  39. sharefetch-1.0.0/tests/test_hashes.py +166 -0
  40. sharefetch-1.0.0/tests/test_listing.py +612 -0
  41. sharefetch-1.0.0/tests/test_live.py +394 -0
  42. sharefetch-1.0.0/tests/test_manifest.py +442 -0
  43. sharefetch-1.0.0/tests/test_no_delete.py +36 -0
  44. sharefetch-1.0.0/tests/test_pacing.py +408 -0
  45. sharefetch-1.0.0/tests/test_package.py +14 -0
  46. sharefetch-1.0.0/tests/test_paths.py +285 -0
  47. sharefetch-1.0.0/tests/test_resolve.py +753 -0
  48. sharefetch-1.0.0/tests/test_state.py +775 -0
  49. sharefetch-1.0.0/tests/test_tokencache.py +323 -0
  50. sharefetch-1.0.0/tests/test_transfer.py +1137 -0
  51. sharefetch-1.0.0/tests/test_urls.py +139 -0
  52. sharefetch-1.0.0/tests/test_verify.py +657 -0
@@ -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
+ ![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)![License: MIT](https://img.shields.io/badge/license-MIT-green)
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
+ ![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)![License: MIT](https://img.shields.io/badge/license-MIT-green)
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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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__"]
@@ -0,0 +1,8 @@
1
+ """Entry point for ``python -m sharefetch``."""
2
+
3
+ import sys
4
+
5
+ from .cli import main
6
+
7
+ if __name__ == "__main__":
8
+ sys.exit(main())