scratchattach 2.1.14__py3-none-any.whl → 3.0.0b0__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.
Files changed (69) hide show
  1. scratchattach/__init__.py +14 -6
  2. scratchattach/__main__.py +93 -0
  3. {scratchattach-2.1.14.dist-info → scratchattach-3.0.0b0.dist-info}/METADATA +7 -11
  4. scratchattach-3.0.0b0.dist-info/RECORD +8 -0
  5. {scratchattach-2.1.14.dist-info → scratchattach-3.0.0b0.dist-info}/WHEEL +1 -1
  6. scratchattach-3.0.0b0.dist-info/entry_points.txt +2 -0
  7. scratchattach/cloud/__init__.py +0 -2
  8. scratchattach/cloud/_base.py +0 -458
  9. scratchattach/cloud/cloud.py +0 -183
  10. scratchattach/editor/__init__.py +0 -21
  11. scratchattach/editor/asset.py +0 -253
  12. scratchattach/editor/backpack_json.py +0 -117
  13. scratchattach/editor/base.py +0 -193
  14. scratchattach/editor/block.py +0 -579
  15. scratchattach/editor/blockshape.py +0 -357
  16. scratchattach/editor/build_defaulting.py +0 -51
  17. scratchattach/editor/code_translation/__init__.py +0 -0
  18. scratchattach/editor/code_translation/parse.py +0 -177
  19. scratchattach/editor/comment.py +0 -80
  20. scratchattach/editor/commons.py +0 -306
  21. scratchattach/editor/extension.py +0 -50
  22. scratchattach/editor/field.py +0 -99
  23. scratchattach/editor/inputs.py +0 -135
  24. scratchattach/editor/meta.py +0 -114
  25. scratchattach/editor/monitor.py +0 -183
  26. scratchattach/editor/mutation.py +0 -324
  27. scratchattach/editor/pallete.py +0 -90
  28. scratchattach/editor/prim.py +0 -170
  29. scratchattach/editor/project.py +0 -279
  30. scratchattach/editor/sprite.py +0 -599
  31. scratchattach/editor/twconfig.py +0 -114
  32. scratchattach/editor/vlb.py +0 -134
  33. scratchattach/eventhandlers/__init__.py +0 -0
  34. scratchattach/eventhandlers/_base.py +0 -100
  35. scratchattach/eventhandlers/cloud_events.py +0 -110
  36. scratchattach/eventhandlers/cloud_recorder.py +0 -26
  37. scratchattach/eventhandlers/cloud_requests.py +0 -459
  38. scratchattach/eventhandlers/cloud_server.py +0 -246
  39. scratchattach/eventhandlers/cloud_storage.py +0 -136
  40. scratchattach/eventhandlers/combine.py +0 -30
  41. scratchattach/eventhandlers/filterbot.py +0 -161
  42. scratchattach/eventhandlers/message_events.py +0 -42
  43. scratchattach/other/__init__.py +0 -0
  44. scratchattach/other/other_apis.py +0 -284
  45. scratchattach/other/project_json_capabilities.py +0 -475
  46. scratchattach/site/__init__.py +0 -0
  47. scratchattach/site/_base.py +0 -66
  48. scratchattach/site/activity.py +0 -382
  49. scratchattach/site/alert.py +0 -227
  50. scratchattach/site/backpack_asset.py +0 -118
  51. scratchattach/site/browser_cookie3_stub.py +0 -17
  52. scratchattach/site/browser_cookies.py +0 -61
  53. scratchattach/site/classroom.py +0 -447
  54. scratchattach/site/cloud_activity.py +0 -107
  55. scratchattach/site/comment.py +0 -242
  56. scratchattach/site/forum.py +0 -432
  57. scratchattach/site/project.py +0 -825
  58. scratchattach/site/session.py +0 -1238
  59. scratchattach/site/studio.py +0 -611
  60. scratchattach/site/user.py +0 -956
  61. scratchattach/utils/__init__.py +0 -0
  62. scratchattach/utils/commons.py +0 -255
  63. scratchattach/utils/encoder.py +0 -158
  64. scratchattach/utils/enums.py +0 -236
  65. scratchattach/utils/exceptions.py +0 -243
  66. scratchattach/utils/requests.py +0 -93
  67. scratchattach-2.1.14.dist-info/RECORD +0 -66
  68. {scratchattach-2.1.14.dist-info → scratchattach-3.0.0b0.dist-info}/licenses/LICENSE +0 -0
  69. {scratchattach-2.1.14.dist-info → scratchattach-3.0.0b0.dist-info}/top_level.txt +0 -0
@@ -1,243 +0,0 @@
1
- # Authentication / Authorization:
2
- from __future__ import annotations
3
-
4
- class Unauthenticated(Exception):
5
- """
6
- Raised when a method that requires a login / session is called on an object that wasn't created with a session.
7
-
8
- If you create Project, Studio, or User objects using :meth:`scratchattach.get_project`, :meth:`scratchattach.get_studio`, or :meth:`scratchattach.get_user`, they cannot be used for actions that require authentication. Instead, use the following methods to ensure the objects are connected to an authenticated session:
9
-
10
- - :meth:`scratchattach.Session.connect_project`
11
-
12
- - :meth:`scratchattach.Session.connect_user`
13
-
14
- - :meth:`scratchattach.Session.connect_studio`
15
-
16
- This also applies to cloud variables, forum topics, and forum posts.
17
- """
18
-
19
- def __init__(self, message=""):
20
- self.message = "No login / session connected.\n\nThe object on which the method was called was created using scratchattach.get_xyz()\nUse session.connect_xyz() instead (xyz is a placeholder for user / project / cloud / ...).\n\nMore information: https://scratchattach.readthedocs.io/en/latest/scratchattach.html#scratchattach.utils.exceptions.Unauthenticated"
21
- super().__init__(self.message)
22
-
23
-
24
- class Unauthorized(Exception):
25
- """
26
- Raised when an action is performed that the user associated with the session that the object was created with is not allowed to do.
27
-
28
- Example: Changing the "about me" of other users will raise this error.
29
- """
30
-
31
- def __init__(self, message=""):
32
- self.message = (
33
- f"The user corresponding to the connected login / session is not allowed to perform this action. "
34
- f"{message}")
35
- super().__init__(self.message)
36
-
37
-
38
- class XTokenError(Exception):
39
- """
40
- Raised when an action can't be performed because there is no XToken available.
41
-
42
- This error can occur if the xtoken couldn't be fetched when the session was created. Some actions (like loving projects) require providing this token.
43
- """
44
-
45
-
46
- # Not found errors:
47
-
48
- class UserNotFound(Exception):
49
- """
50
- Raised when a non-existent user is requested.
51
- """
52
-
53
-
54
- class ProjectNotFound(Exception):
55
- """
56
- Raised when a non-existent project is requested.
57
- """
58
-
59
- class ClassroomNotFound(Exception):
60
- """
61
- Raised when a non-existent Classroom is requested.
62
- """
63
-
64
-
65
- class StudioNotFound(Exception):
66
- """
67
- Raised when a non-existent studio is requested.
68
- """
69
-
70
-
71
- class ForumContentNotFound(Exception):
72
- """
73
- Raised when a non-existent forum topic / post is requested.
74
- """
75
-
76
-
77
- class CommentNotFound(Exception):
78
- pass
79
-
80
-
81
- # Invalid inputs
82
- class InvalidLanguage(Exception):
83
- """
84
- Raised when an invalid language/language code/language object is provided, for TTS or Translate
85
- """
86
-
87
-
88
- class InvalidTTSGender(Exception):
89
- """
90
- Raised when an invalid TTS gender is provided.
91
- """
92
-
93
- # API errors:
94
-
95
- class LoginFailure(Exception):
96
- """
97
- Raised when the Scratch server doesn't respond with a session id.
98
-
99
- This could be caused by an invalid username / password. Another cause could be that your IP address was banned from logging in to Scratch. If you're using an online IDE (like replit), try running the code on your computer.
100
- """
101
-
102
-
103
- class FetchError(Exception):
104
- """
105
- Raised when getting information from the Scratch API fails. This can have various reasons. Make sure all provided arguments are valid.
106
- """
107
-
108
-
109
- class BadRequest(Exception):
110
- """
111
- Raised when the Scratch API responds with a "Bad Request" error message. This can have various reasons. Make sure all provided arguments are valid.
112
- """
113
-
114
- class RateLimitedError(Exception):
115
- """
116
- Indicates a ratelimit enforced by scratchattach
117
- """
118
-
119
- class Response429(Exception):
120
- """
121
- Raised when the Scratch API responds with a 429 error. This means that your network was ratelimited or blocked by Scratch. If you're using an online IDE (like replit.com), try running the code on your computer.
122
- """
123
-
124
-
125
- class CommentPostFailure(Exception):
126
- """
127
- Raised when a comment fails to post. This can have various reasons.
128
- """
129
-
130
-
131
- class APIError(Exception):
132
- """
133
- For API errors that can't be classified into one of the above errors
134
- """
135
-
136
-
137
- class ScrapeError(Exception):
138
- """
139
- Raised when something goes wrong while web-scraping a page with bs4.
140
- """
141
-
142
-
143
-
144
- # Cloud / encoding errors:
145
-
146
- class CloudConnectionError(Exception):
147
- """
148
- Raised when connecting to Scratch's cloud server fails. This can have various reasons.
149
- """
150
-
151
-
152
-
153
- class InvalidCloudValue(Exception):
154
- """
155
- Raised when a cloud variable is set to an invalid value.
156
- """
157
-
158
-
159
-
160
- class InvalidDecodeInput(Exception):
161
- """
162
- Raised when the built-in decoder :meth:`scratchattach.encoder.Encoding.decode` receives an invalid input.
163
- """
164
-
165
-
166
-
167
- # Cloud Requests errors:
168
-
169
- class RequestNotFound(Exception):
170
- """
171
- Cloud Requests: Raised when a non-existent cloud request is edited using :meth:`scratchattach.cloud_requests.CloudRequests.edit_request`.
172
- """
173
-
174
-
175
-
176
- # Websocket server errors:
177
-
178
- class WebsocketServerError(Exception):
179
- """
180
- Raised when the self-hosted cloud websocket server fails to start.
181
- """
182
-
183
-
184
-
185
- # Editor errors:
186
-
187
- class UnclosedJSONError(Exception):
188
- """
189
- Raised when a JSON string is never closed.
190
- """
191
-
192
-
193
- class BadVLBPrimitiveError(Exception):
194
- """
195
- Raised when a Primitive claiming to be a variable/list/broadcast actually isn't
196
- """
197
-
198
-
199
- class UnlinkedVLB(Exception):
200
- """
201
- Raised when a Primitive cannot be linked to variable/list/broadcast because the provided ID does not have an associated variable/list/broadcast
202
- """
203
-
204
-
205
- class InvalidStageCount(Exception):
206
- """
207
- Raised when a project has too many or too few Stage sprites
208
- """
209
-
210
-
211
- class InvalidVLBName(Exception):
212
- """
213
- Raised when an invalid VLB name is provided (not variable, list or broadcast)
214
- """
215
-
216
-
217
- class BadBlockShape(Exception):
218
- """
219
- Raised when the block shape cannot allow for the operation
220
- """
221
-
222
-
223
- class BadScript(Exception):
224
- """
225
- Raised when the block script cannot allow for the operation
226
- """
227
-
228
- # Warnings
229
-
230
- class LoginDataWarning(UserWarning):
231
- """
232
- Warns you not to accidentally share your login data.
233
- """
234
-
235
- class AnonymousSiteComponentWarning(UserWarning):
236
- """
237
- Warns about a usage of an anonymous site component.
238
- """
239
-
240
- class UnexpectedWebsocketEventWarning(RuntimeWarning):
241
- """
242
- Warns about an unexpected occurrence with a websocket.
243
- """
@@ -1,93 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from collections.abc import MutableMapping, Iterator
4
- from typing import Optional
5
- from contextlib import contextmanager
6
-
7
- from typing_extensions import override
8
- from requests import Session as HTTPSession
9
- from requests import Response
10
-
11
- from . import exceptions
12
-
13
- proxies: Optional[MutableMapping[str, str]] = None
14
-
15
- class Requests(HTTPSession):
16
- """
17
- Centralized HTTP request handler (for better error handling and proxies)
18
- """
19
- error_handling: bool = True
20
-
21
- def check_response(self, r: Response):
22
- if r.status_code == 403 or r.status_code == 401:
23
- raise exceptions.Unauthorized(f"Request content: {r.content!r}")
24
- if r.status_code == 500:
25
- raise exceptions.APIError("Internal Scratch server error")
26
- if r.status_code == 429:
27
- raise exceptions.Response429("You are being rate-limited (or blocked) by Scratch")
28
- if r.json() == {"code":"BadRequest","message":""}:
29
- raise exceptions.BadRequest("Make sure all provided arguments are valid")
30
-
31
- @override
32
- def get(self, *args, **kwargs):
33
- kwargs.setdefault("proxies", proxies)
34
- try:
35
- r = super().get(*args, **kwargs)
36
- except Exception as e:
37
- raise exceptions.FetchError(e)
38
- if self.error_handling:
39
- self.check_response(r)
40
- return r
41
-
42
- @override
43
- def post(self, *args, **kwargs):
44
- kwargs.setdefault("proxies", proxies)
45
- try:
46
- r = super().post(*args, **kwargs)
47
- except Exception as e:
48
- raise exceptions.FetchError(e)
49
- if self.error_handling:
50
- self.check_response(r)
51
- return r
52
-
53
- @override
54
- def delete(self, *args, **kwargs):
55
- kwargs.setdefault("proxies", proxies)
56
- try:
57
- r = super().delete(*args, **kwargs)
58
- except Exception as e:
59
- raise exceptions.FetchError(e)
60
- if self.error_handling:
61
- self.check_response(r)
62
- return r
63
-
64
- @override
65
- def put(self, *args, **kwargs):
66
- kwargs.setdefault("proxies", proxies)
67
- try:
68
- r = super().put(*args, **kwargs)
69
- except Exception as e:
70
- raise exceptions.FetchError(e)
71
- if self.error_handling:
72
- self.check_response(r)
73
- return r
74
-
75
- @contextmanager
76
- def no_error_handling(self) -> Iterator[None]:
77
- val_before = self.error_handling
78
- self.error_handling = False
79
- try:
80
- yield
81
- finally:
82
- self.error_handling = val_before
83
-
84
- @contextmanager
85
- def yes_error_handling(self) -> Iterator[None]:
86
- val_before = self.error_handling
87
- self.error_handling = True
88
- try:
89
- yield
90
- finally:
91
- self.error_handling = val_before
92
-
93
- requests = Requests()
@@ -1,66 +0,0 @@
1
- scratchattach/__init__.py,sha256=2iiV0SghFUyJJrJYt668cSoDrxSjLCWNtzMdhttnMdA,1532
2
- scratchattach/cloud/__init__.py,sha256=MN7s4grQcciqUO7TiFjTbU2sC69m6XXlwOHNRbN3FKo,41
3
- scratchattach/cloud/_base.py,sha256=wQDBIjrEtGSleKnAghluvZGX1L7U0wpUry_3MD8-VkY,18060
4
- scratchattach/cloud/cloud.py,sha256=f3qGy7rhpyuhOlVfki3l8FdMpyFtcVTBg9ql6l0J-jI,8167
5
- scratchattach/editor/__init__.py,sha256=gfTQrtyQ-oZJBanp-5eNae72cwm4WoKHzNtZ4rn1dqg,727
6
- scratchattach/editor/asset.py,sha256=8rQmaZCO4tMjnohutfvVha2t5x_ct2Rxn_Q9Dz6DCYI,7734
7
- scratchattach/editor/backpack_json.py,sha256=PZGNIFNf0MS3hn8cKZEp9ZeQWdBE-xWq5PEwiN8IzWM,3900
8
- scratchattach/editor/base.py,sha256=AP_JktO6NLxpsh00twnKHkXmzLmATFabfmw1tmWh98c,5412
9
- scratchattach/editor/block.py,sha256=B7II4ICOLxdN_D_rn3LH4njRmkZLisxcPzg4WAyNIXA,18786
10
- scratchattach/editor/blockshape.py,sha256=DN9aKjd22OdvS4ulThJPFGq9uBAA8DNGwnq5Dv2cLNo,25284
11
- scratchattach/editor/build_defaulting.py,sha256=BkD81lTaR1LTv8HwwkxGtQ040G2Y6mh1R6fCZIkfkYM,1386
12
- scratchattach/editor/comment.py,sha256=G_eFxeaC_vKbCFpDfw4oZxIReUBoBUaCA5q35O-AW6Y,2403
13
- scratchattach/editor/commons.py,sha256=RWynsm3LhPMRRbcFd2kT_CRgsvPx6uvKyK3ISYpNoDg,7638
14
- scratchattach/editor/extension.py,sha256=PFVl5SrS66M4Md98I_dsfeL9BLeWwvyWezmhnTRseIQ,1541
15
- scratchattach/editor/field.py,sha256=3JUBwj-Mun36Yb7KDeQIWZcuj0e4kjkVAwk_9cKfQPY,3002
16
- scratchattach/editor/inputs.py,sha256=JGFKry9m8IHNw9zoyM6iViEbPp1VlHlVPI9fYoiTk3M,4391
17
- scratchattach/editor/meta.py,sha256=aTP5Imz2cFI_RDA4Lufa5UV64lgk3-TP3B4fd7t0zio,3202
18
- scratchattach/editor/monitor.py,sha256=q-RrycEpYa3rHZ0_9RZobIS8Sfbmpx7_cdUFEaoA7Yk,5788
19
- scratchattach/editor/mutation.py,sha256=NKLVae0A6J0CKl1Xm7jpdNNoyGFtwcmU-LiBfYpvtlU,10399
20
- scratchattach/editor/pallete.py,sha256=-CbTRHsgpiVomal1ohW0ouuSP-hCsPTApgRohfxRPfI,2348
21
- scratchattach/editor/prim.py,sha256=WAXMQ5C5FYIk-gNLwH1cnhsMQJpxH0yl_YH0Tcju9IU,5877
22
- scratchattach/editor/project.py,sha256=D6gtmfGu0y3_Wzyhq-bjPRzVERFGH_b1DCUVHS9HBtY,9138
23
- scratchattach/editor/sprite.py,sha256=BG8--SNvj2HYre3pGKEpvnq2Qpl3h_qDseKxIxfWL38,20862
24
- scratchattach/editor/twconfig.py,sha256=iE6ylAsZzniAfhL09GkZSFn1XacYtCQPzRCUSPIBzDA,3324
25
- scratchattach/editor/vlb.py,sha256=ZUlrA52ZoK5znGkBUw10UGejpvBlpkH635pTl9sUAmM,4170
26
- scratchattach/editor/code_translation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- scratchattach/editor/code_translation/parse.py,sha256=FjuHVg_tNzkGcGSNwgH6MzAHcf5YCvaEUSYukyJkwbk,4932
28
- scratchattach/eventhandlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- scratchattach/eventhandlers/_base.py,sha256=XGsGzsmUBy5IV3Cl0akEmwBsaSyfVNs0YbNS7lktxrw,3099
30
- scratchattach/eventhandlers/cloud_events.py,sha256=B0Ce0y8HKP2fOJ3zIUdJg8tHGYoGpc42e4ktuLL_bRw,4108
31
- scratchattach/eventhandlers/cloud_recorder.py,sha256=o4wcWJFCddpcSsPx5YU2DFFMFoKUknKM2RQ36HLpheQ,800
32
- scratchattach/eventhandlers/cloud_requests.py,sha256=B_ybgcQ3S861KUNIYv3kOc0siO8BP1Ez57zE1GypTJg,22121
33
- scratchattach/eventhandlers/cloud_server.py,sha256=rgY0lcXO-E_iAu4oVvbshIfG7eMw0Ekz4_GOLTxCzmM,12302
34
- scratchattach/eventhandlers/cloud_storage.py,sha256=9dvKPxbPZ_hBhw1HYlTl72YJmBo2OMwrSrMQ7kQwwOE,4660
35
- scratchattach/eventhandlers/combine.py,sha256=YiWI6WI1BySioXpfYaMv8noBM14EjZa7dtsJsMTshEU,894
36
- scratchattach/eventhandlers/filterbot.py,sha256=RvGCm-2iaC8SAC4nDMlDv0MPp80CsRr4CFGmnIuEfg8,7462
37
- scratchattach/eventhandlers/message_events.py,sha256=KvznXAeNGk1WWCxd7PI95yovX-58TyCBNDdXbrYgb8Q,1776
38
- scratchattach/other/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- scratchattach/other/other_apis.py,sha256=iJXytVgAIARWQ_z7t99Lv2oB6DdwrFBmkFxiaHQRKLI,9095
40
- scratchattach/other/project_json_capabilities.py,sha256=07t1iMgWm4Qd06jHyQ3vK7tROguvc2RQCo78enrdSlA,22646
41
- scratchattach/site/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- scratchattach/site/_base.py,sha256=v2U0V-2T5QnDGtUDVPR1e4qg9R7rpNYmO8YKA5fIXfg,2249
43
- scratchattach/site/activity.py,sha256=4fohsjeVJFaMnKE6_Ew8DcDpFfDzwPeZ7XGp5NnCMW8,13786
44
- scratchattach/site/alert.py,sha256=TX_Py5L7IKmXEPFGIOFIGvqlT8aSigywsR5nODkvwFY,9277
45
- scratchattach/site/backpack_asset.py,sha256=8AKvDTvaTvN2ntqE3Ygkl0mvu6-ZR-DbLkCszv2h70o,3298
46
- scratchattach/site/browser_cookie3_stub.py,sha256=codk0knOP5C0YThaRazvqsqX7X7WnrD2UwFd1nFG7mg,1422
47
- scratchattach/site/browser_cookies.py,sha256=uQyjJJ4HCu46R4tPWCcTUqDMXSXhQ4KQUobqCSxScSA,1864
48
- scratchattach/site/classroom.py,sha256=2IDLDljEDLp8Vj5ab94Ti_VVBCv8OPS7qNVr1zFBCME,16884
49
- scratchattach/site/cloud_activity.py,sha256=x0kbd9Zx1dI4s0lJXWNixQCJeKG1CchXK-9867RiK1A,4207
50
- scratchattach/site/comment.py,sha256=733CDTV7227MxrhRM0dQYF06aDbHVFK-_rECz--grvA,9135
51
- scratchattach/site/forum.py,sha256=Y7sh3-wcEjRBfKEHOcusudSudCJFe4MuQFd-EB4FccQ,16417
52
- scratchattach/site/project.py,sha256=jc6NpzCdC4ATTfCvsAKWlRqj-cTv_B7ZnWHxOn2-qyI,31602
53
- scratchattach/site/session.py,sha256=SQd6om7jxTrmQ5BjFrwGucYAWaBspn24rVunnepf760,50868
54
- scratchattach/site/studio.py,sha256=a20fzNq2GGN0SbyC7_d6UqmCqDgofZjdiMucp9KHnYE,22942
55
- scratchattach/site/user.py,sha256=v6cLI1t465DHTT2xuWd-pXThL1QPDT7GGDcXgOBxaLE,39483
56
- scratchattach/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
- scratchattach/utils/commons.py,sha256=BKH-zz2A5e1d5qEtvZvAmK5fXyVq-FGRRw3Wx-StG5E,8213
58
- scratchattach/utils/encoder.py,sha256=rqJfQ5gmjf7s8aTiGhR0W1ejYN5tHbAgJlxv7JhGqZQ,2479
59
- scratchattach/utils/enums.py,sha256=GFLI3F0ZWGqicKV_QJwhyz4MiPDdstAJaUBxYDYT9to,11091
60
- scratchattach/utils/exceptions.py,sha256=AyM9lU009irxaJvMPB0N0kQaVAJeWHjlmQIS6Njgo78,6528
61
- scratchattach/utils/requests.py,sha256=vf7OaASbC9_qp4ygOGcU2PjWvf7dwgGbsluZiKGyRMg,2832
62
- scratchattach-2.1.14.dist-info/licenses/LICENSE,sha256=1PRKLhZU4wYt5M-C9f7q0W3go3u_ojnZMNOdR3g3J-E,1080
63
- scratchattach-2.1.14.dist-info/METADATA,sha256=gFk55C4GbrDmgPuq7qfJel_qezQF5jtydFt8T_zO_co,5687
64
- scratchattach-2.1.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
65
- scratchattach-2.1.14.dist-info/top_level.txt,sha256=gIwCwW39ohXn0JlnvSzAjV7VtL3qPlRnHiRqBbxsEUE,14
66
- scratchattach-2.1.14.dist-info/RECORD,,