scratchattach 3.0.0b0__py3-none-any.whl → 3.0.0b2__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 (80) hide show
  1. scratchattach/cli/__about__.py +1 -0
  2. scratchattach/cli/__init__.py +26 -0
  3. scratchattach/cli/cmd/__init__.py +4 -0
  4. scratchattach/cli/cmd/group.py +127 -0
  5. scratchattach/cli/cmd/login.py +60 -0
  6. scratchattach/cli/cmd/profile.py +7 -0
  7. scratchattach/cli/cmd/sessions.py +5 -0
  8. scratchattach/cli/context.py +142 -0
  9. scratchattach/cli/db.py +66 -0
  10. scratchattach/cli/namespace.py +14 -0
  11. scratchattach/cloud/__init__.py +2 -0
  12. scratchattach/cloud/_base.py +483 -0
  13. scratchattach/cloud/cloud.py +183 -0
  14. scratchattach/editor/__init__.py +22 -0
  15. scratchattach/editor/asset.py +265 -0
  16. scratchattach/editor/backpack_json.py +115 -0
  17. scratchattach/editor/base.py +191 -0
  18. scratchattach/editor/block.py +584 -0
  19. scratchattach/editor/blockshape.py +357 -0
  20. scratchattach/editor/build_defaulting.py +51 -0
  21. scratchattach/editor/code_translation/__init__.py +0 -0
  22. scratchattach/editor/code_translation/parse.py +177 -0
  23. scratchattach/editor/comment.py +80 -0
  24. scratchattach/editor/commons.py +145 -0
  25. scratchattach/editor/extension.py +50 -0
  26. scratchattach/editor/field.py +99 -0
  27. scratchattach/editor/inputs.py +138 -0
  28. scratchattach/editor/meta.py +117 -0
  29. scratchattach/editor/monitor.py +185 -0
  30. scratchattach/editor/mutation.py +381 -0
  31. scratchattach/editor/pallete.py +88 -0
  32. scratchattach/editor/prim.py +174 -0
  33. scratchattach/editor/project.py +381 -0
  34. scratchattach/editor/sprite.py +609 -0
  35. scratchattach/editor/twconfig.py +114 -0
  36. scratchattach/editor/vlb.py +134 -0
  37. scratchattach/eventhandlers/__init__.py +0 -0
  38. scratchattach/eventhandlers/_base.py +101 -0
  39. scratchattach/eventhandlers/cloud_events.py +130 -0
  40. scratchattach/eventhandlers/cloud_recorder.py +26 -0
  41. scratchattach/eventhandlers/cloud_requests.py +544 -0
  42. scratchattach/eventhandlers/cloud_server.py +249 -0
  43. scratchattach/eventhandlers/cloud_storage.py +135 -0
  44. scratchattach/eventhandlers/combine.py +30 -0
  45. scratchattach/eventhandlers/filterbot.py +163 -0
  46. scratchattach/eventhandlers/message_events.py +42 -0
  47. scratchattach/other/__init__.py +0 -0
  48. scratchattach/other/other_apis.py +598 -0
  49. scratchattach/other/project_json_capabilities.py +475 -0
  50. scratchattach/site/__init__.py +0 -0
  51. scratchattach/site/_base.py +93 -0
  52. scratchattach/site/activity.py +426 -0
  53. scratchattach/site/alert.py +226 -0
  54. scratchattach/site/backpack_asset.py +119 -0
  55. scratchattach/site/browser_cookie3_stub.py +17 -0
  56. scratchattach/site/browser_cookies.py +61 -0
  57. scratchattach/site/classroom.py +454 -0
  58. scratchattach/site/cloud_activity.py +121 -0
  59. scratchattach/site/comment.py +228 -0
  60. scratchattach/site/forum.py +436 -0
  61. scratchattach/site/placeholder.py +132 -0
  62. scratchattach/site/project.py +932 -0
  63. scratchattach/site/session.py +1323 -0
  64. scratchattach/site/studio.py +704 -0
  65. scratchattach/site/typed_dicts.py +151 -0
  66. scratchattach/site/user.py +1252 -0
  67. scratchattach/utils/__init__.py +0 -0
  68. scratchattach/utils/commons.py +263 -0
  69. scratchattach/utils/encoder.py +161 -0
  70. scratchattach/utils/enums.py +237 -0
  71. scratchattach/utils/exceptions.py +277 -0
  72. scratchattach/utils/optional_async.py +154 -0
  73. scratchattach/utils/requests.py +306 -0
  74. {scratchattach-3.0.0b0.dist-info → scratchattach-3.0.0b2.dist-info}/METADATA +1 -1
  75. scratchattach-3.0.0b2.dist-info/RECORD +81 -0
  76. scratchattach-3.0.0b0.dist-info/RECORD +0 -8
  77. {scratchattach-3.0.0b0.dist-info → scratchattach-3.0.0b2.dist-info}/WHEEL +0 -0
  78. {scratchattach-3.0.0b0.dist-info → scratchattach-3.0.0b2.dist-info}/entry_points.txt +0 -0
  79. {scratchattach-3.0.0b0.dist-info → scratchattach-3.0.0b2.dist-info}/licenses/LICENSE +0 -0
  80. {scratchattach-3.0.0b0.dist-info → scratchattach-3.0.0b2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,306 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import MutableMapping, Iterator
4
+ from abc import ABC, abstractmethod
5
+ from types import TracebackType
6
+ from typing import Optional, Any, Self, Union
7
+ from contextlib import contextmanager
8
+ from enum import Enum, auto
9
+ from dataclasses import dataclass, field
10
+ import json
11
+
12
+ from aiohttp.cookiejar import DummyCookieJar
13
+ from typing_extensions import override
14
+ from requests import Session as HTTPSession
15
+ from requests import Response
16
+ import aiohttp
17
+
18
+ from . import exceptions
19
+ from . import optional_async
20
+
21
+ proxies: Optional[MutableMapping[str, str]] = None
22
+
23
+ class HTTPMethod(Enum):
24
+ GET = auto()
25
+ POST = auto()
26
+ PUT = auto()
27
+ DELETE = auto()
28
+ HEAD = auto()
29
+ OPTIONS = auto()
30
+ PATCH = auto()
31
+ TRACE = auto()
32
+ @classmethod
33
+ def of(cls, name: str) -> HTTPMethod:
34
+ member_map = {
35
+ "GET": cls.GET,
36
+ "POST": cls.POST,
37
+ "PUT": cls.PUT,
38
+ "DELETE": cls.DELETE,
39
+ "HEAD": cls.HEAD,
40
+ "OPTIONS": cls.OPTIONS,
41
+ "PATCH": cls.PATCH,
42
+ "TRACE": cls.TRACE
43
+ }
44
+ return member_map[name]
45
+
46
+ class AnyHTTPResponse(ABC):
47
+ request_method: HTTPMethod
48
+ status_code: int
49
+ content: bytes
50
+ text: str
51
+ headers: dict[str, str]
52
+
53
+ def json(self) -> Any:
54
+ return json.loads(self.text)
55
+
56
+ @dataclass
57
+ class HTTPResponse(AnyHTTPResponse):
58
+ request_method: HTTPMethod = field(kw_only=True)
59
+ status_code: int = field(kw_only=True)
60
+ content: bytes = field(kw_only=True)
61
+ text: str = field(kw_only=True)
62
+ headers: dict[str, str] = field(kw_only=True)
63
+
64
+ class OAHTTPSession(ABC):
65
+ error_handling: bool = True
66
+ @abstractmethod
67
+ def sync_request(
68
+ self,
69
+ method: HTTPMethod,
70
+ url: str,
71
+ *,
72
+ cookies: Optional[dict[str, str]] = None,
73
+ headers: Optional[dict[str, str]] = None,
74
+ params: Optional[dict[str, str]] = None,
75
+ data: Optional[Union[dict[str, str], str]] = None,
76
+ json: Optional[Any] = None
77
+ ) -> AnyHTTPResponse:
78
+ pass
79
+
80
+ @abstractmethod
81
+ async def async_request(
82
+ self,
83
+ method: HTTPMethod,
84
+ url: str,
85
+ *,
86
+ cookies: Optional[dict[str, str]] = None,
87
+ headers: Optional[dict[str, str]] = None,
88
+ params: Optional[dict[str, str]] = None,
89
+ data: Optional[Union[dict[str, str], str]] = None,
90
+ json: Optional[Any] = None
91
+ ) -> AnyHTTPResponse:
92
+ pass
93
+
94
+ def check_response(self, r: AnyHTTPResponse):
95
+ if r.status_code == 403 or r.status_code == 401:
96
+ raise exceptions.Unauthorized(f"Request content: {r.content!r}")
97
+ if r.status_code == 500:
98
+ raise exceptions.APIError("Internal Scratch server error")
99
+ if r.status_code == 429:
100
+ raise exceptions.Response429("You are being rate-limited (or blocked) by Scratch")
101
+ if r.json() == {"code":"BadRequest","message":""}:
102
+ raise exceptions.BadRequest("Make sure all provided arguments are valid")
103
+
104
+
105
+ def request(
106
+ self,
107
+ method: Union[HTTPMethod, str],
108
+ url: str,
109
+ *,
110
+ cookies: Optional[dict[str, str]] = None,
111
+ headers: Optional[dict[str, str]] = None,
112
+ params: Optional[dict[str, str]] = None,
113
+ data: Optional[Union[dict[str, str], str]] = None,
114
+ json: Optional[Any] = None
115
+ ) -> optional_async.CARequest:
116
+ if isinstance(method, str):
117
+ method = HTTPMethod.of(method.upper())
118
+ return optional_async.CARequest(
119
+ self,
120
+ method,
121
+ url,
122
+ cookies = cookies,
123
+ headers = headers,
124
+ params = params,
125
+ data = data,
126
+ json = json
127
+ )
128
+
129
+ @contextmanager
130
+ def no_error_handling(self) -> Iterator[None]:
131
+ val_before = self.error_handling
132
+ self.error_handling = False
133
+ try:
134
+ yield
135
+ finally:
136
+ self.error_handling = val_before
137
+
138
+ @contextmanager
139
+ def yes_error_handling(self) -> Iterator[None]:
140
+ val_before = self.error_handling
141
+ self.error_handling = True
142
+ try:
143
+ yield
144
+ finally:
145
+ self.error_handling = val_before
146
+
147
+ class SyncRequests(OAHTTPSession):
148
+ @override
149
+ def sync_request(self, method, url, *, cookies = None, headers = None, params = None, data = None, json = None):
150
+ try:
151
+ r = requests.request(
152
+ method.name,
153
+ url,
154
+ cookies = cookies,
155
+ headers = headers,
156
+ params = params,
157
+ data = data,
158
+ json = json,
159
+ proxies = proxies
160
+ )
161
+ except Exception as e:
162
+ raise exceptions.FetchError(e)
163
+ response = HTTPResponse(
164
+ request_method=method,
165
+ status_code=r.status_code,
166
+ content=r.content,
167
+ text=r.text,
168
+ headers=r.headers
169
+ )
170
+ if self.error_handling:
171
+ self.check_response(response)
172
+ return response
173
+
174
+ async def async_request(self, method, url, *, cookies = None, headers = None, params = None, data = None, json = None):
175
+ raise NotImplementedError()
176
+
177
+ class AsyncRequests(OAHTTPSession):
178
+ client_session: aiohttp.ClientSession
179
+ async def __aenter__(self) -> Self:
180
+ self.client_session = await aiohttp.ClientSession(cookie_jar=DummyCookieJar()).__aenter__()
181
+ return self
182
+
183
+ async def __aexit__(
184
+ self,
185
+ exc_type: Optional[type[BaseException]] = None,
186
+ exc_val: Optional[BaseException] = None,
187
+ exc_tb: Optional[TracebackType] = None
188
+ ) -> None:
189
+ await self.client_session.__aexit__(exc_type, exc_val, exc_tb)
190
+
191
+ @override
192
+ def sync_request(self, method, url, *, cookies = None, headers = None, params = None, data = None, json = None):
193
+ raise NotImplementedError()
194
+
195
+ async def async_request(self, method, url, *, cookies = None, headers = None, params = None, data = None, json = None):
196
+ proxy = None
197
+ if url.startswith("http"):
198
+ proxy = proxies.get("http")
199
+ if url.startswith("https"):
200
+ proxy = proxies.get("https")
201
+ async with self.client_session.request(
202
+ method.name,
203
+ url,
204
+ cookies = cookies,
205
+ headers = headers,
206
+ params = params,
207
+ data = data,
208
+ json = json,
209
+ proxy = proxy
210
+ ) as resp:
211
+ assert isinstance(resp, aiohttp.ClientResponse)
212
+ content = await resp.read()
213
+ try:
214
+ text = content.decode(resp.get_encoding())
215
+ except Exception:
216
+ text = ""
217
+ response = HTTPResponse(
218
+ request_method=method,
219
+ status_code=resp.status,
220
+ content=content,
221
+ text=text,
222
+ headers=resp.headers
223
+ )
224
+ if self.error_handling:
225
+ self.check_response(response)
226
+ return response
227
+
228
+ class Requests(HTTPSession):
229
+ """
230
+ Centralized HTTP request handler (for better error handling and proxies)
231
+ """
232
+ error_handling: bool = True
233
+
234
+ def check_response(self, r: Response):
235
+ if r.status_code == 403 or r.status_code == 401:
236
+ raise exceptions.Unauthorized(f"Request content: {r.content!r}")
237
+ if r.status_code == 500:
238
+ raise exceptions.APIError("Internal Scratch server error")
239
+ if r.status_code == 429:
240
+ raise exceptions.Response429("You are being rate-limited (or blocked) by Scratch")
241
+ if r.json() == {"code":"BadRequest","message":""}:
242
+ raise exceptions.BadRequest("Make sure all provided arguments are valid")
243
+
244
+ @override
245
+ def get(self, *args, **kwargs):
246
+ kwargs.setdefault("proxies", proxies)
247
+ try:
248
+ r = super().get(*args, **kwargs)
249
+ except Exception as e:
250
+ raise exceptions.FetchError(e)
251
+ if self.error_handling:
252
+ self.check_response(r)
253
+ return r
254
+
255
+ @override
256
+ def post(self, *args, **kwargs):
257
+ kwargs.setdefault("proxies", proxies)
258
+ try:
259
+ r = super().post(*args, **kwargs)
260
+ except Exception as e:
261
+ raise exceptions.FetchError(e)
262
+ if self.error_handling:
263
+ self.check_response(r)
264
+ return r
265
+
266
+ @override
267
+ def delete(self, *args, **kwargs):
268
+ kwargs.setdefault("proxies", proxies)
269
+ try:
270
+ r = super().delete(*args, **kwargs)
271
+ except Exception as e:
272
+ raise exceptions.FetchError(e)
273
+ if self.error_handling:
274
+ self.check_response(r)
275
+ return r
276
+
277
+ @override
278
+ def put(self, *args, **kwargs):
279
+ kwargs.setdefault("proxies", proxies)
280
+ try:
281
+ r = super().put(*args, **kwargs)
282
+ except Exception as e:
283
+ raise exceptions.FetchError(e)
284
+ if self.error_handling:
285
+ self.check_response(r)
286
+ return r
287
+
288
+ @contextmanager
289
+ def no_error_handling(self) -> Iterator[None]:
290
+ val_before = self.error_handling
291
+ self.error_handling = False
292
+ try:
293
+ yield
294
+ finally:
295
+ self.error_handling = val_before
296
+
297
+ @contextmanager
298
+ def yes_error_handling(self) -> Iterator[None]:
299
+ val_before = self.error_handling
300
+ self.error_handling = True
301
+ try:
302
+ yield
303
+ finally:
304
+ self.error_handling = val_before
305
+
306
+ requests = Requests()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scratchattach
3
- Version: 3.0.0b0
3
+ Version: 3.0.0b2
4
4
  Summary: A Scratch API Wrapper
5
5
  Author: TimMcCool
6
6
  License-Expression: MIT
@@ -0,0 +1,81 @@
1
+ scratchattach/__init__.py,sha256=K26DsJHYlj7atN0WVQOmtN7d1rNAnmLcO3ljA1UD1lc,1849
2
+ scratchattach/__main__.py,sha256=K520LnmXe5WAlr8UZQE1Owrm8BDncy19QQ5GJ75V9FM,4054
3
+ scratchattach/cli/__about__.py,sha256=rWWgBXhOQakEGEip4jZgZsmGHkIU08m01PRgPUfmHdg,17
4
+ scratchattach/cli/__init__.py,sha256=WAJmqnZi5RoJGlx3fngQAi9APNf84QlicncbsPRwhkg,700
5
+ scratchattach/cli/context.py,sha256=7m9i-J2j36MN8uPJm8ydjMFKWZjJQAyu5NBluL8eQUE,4950
6
+ scratchattach/cli/db.py,sha256=sV-AwyYc8WeHalpadAV1vD0HXkEmZrcvhLGJA0q0TD0,1920
7
+ scratchattach/cli/namespace.py,sha256=qWH1QI9ot-5Y1ahpY9JHw8HTGnlFwHRKLoKxvxFqk5A,445
8
+ scratchattach/cli/cmd/__init__.py,sha256=KiNP3GVwCf-NE_yzYgDvza3hR3Sr1B0-wqu5Xaxi_g4,110
9
+ scratchattach/cli/cmd/group.py,sha256=j8jqy2N4KEChe6cUus5MczoqGKDzjOIgG2mBmxVmb-A,4144
10
+ scratchattach/cli/cmd/login.py,sha256=BnPUCUDG58gNly76OZdBT22oxaZY50b_VHnQWx2p40I,1914
11
+ scratchattach/cli/cmd/profile.py,sha256=jT-JoJhFCtzbyskdQpi8_ckVzrVqDghlh-zEEEchFDI,172
12
+ scratchattach/cli/cmd/sessions.py,sha256=JzBx6BTjddqU-UGZz4CtYpBKb9CC7lbpXLk19Pz7Zoo,116
13
+ scratchattach/cloud/__init__.py,sha256=MN7s4grQcciqUO7TiFjTbU2sC69m6XXlwOHNRbN3FKo,41
14
+ scratchattach/cloud/_base.py,sha256=tXVWPsL9Ybvu2H0zQ5R9GexgeHAarEv4GS16foD3_qw,19251
15
+ scratchattach/cloud/cloud.py,sha256=zq0Z-N2EF2uUxpJ0uZlITY2DeKkjb3TxwK_etci-xCM,8470
16
+ scratchattach/editor/__init__.py,sha256=pdq-dg7fa4cj6eksu5yzUe27DGY6CLKVUtCSrbYCsM8,807
17
+ scratchattach/editor/asset.py,sha256=Ut_Em2rzlzswi2aDTvyRZWvF5JKLY8IAmoLMOQLBpjQ,8148
18
+ scratchattach/editor/backpack_json.py,sha256=zhNRKDmlA9Oz-IixjLRnSwVG6JfKURs31KhQPjJu_bs,3880
19
+ scratchattach/editor/base.py,sha256=MUQ4zqw-IaFZDH9o_F9k7F3mptymR67E8ITkaMfnD5M,5311
20
+ scratchattach/editor/block.py,sha256=2UKKQbrDdsI6dbswo2swvIr7jXiXA114TCtXDO9DSFw,19085
21
+ scratchattach/editor/blockshape.py,sha256=Q8CAWsBc2O5VqcGhUxbJoW1RRfy7kBxz1AporkExBi8,25318
22
+ scratchattach/editor/build_defaulting.py,sha256=rRDSXpIugWENYs6X50A_a3BJfWJuzEtwW1bv9IAyo-M,1421
23
+ scratchattach/editor/comment.py,sha256=G_eFxeaC_vKbCFpDfw4oZxIReUBoBUaCA5q35O-AW6Y,2403
24
+ scratchattach/editor/commons.py,sha256=0mm30KjAenl_V2BXbkdirFN62SraYfGUariXB-TXNlU,3583
25
+ scratchattach/editor/extension.py,sha256=PFVl5SrS66M4Md98I_dsfeL9BLeWwvyWezmhnTRseIQ,1541
26
+ scratchattach/editor/field.py,sha256=_AmBwrb5TeG_CRm312I69T2xXlzuKYeudpygPyA4698,2994
27
+ scratchattach/editor/inputs.py,sha256=bmCLsxgGimkESbKEnhsnw_ZSRpBDsWRIcEoYPFMx9Zs,4505
28
+ scratchattach/editor/meta.py,sha256=QCHk5DKvYAw7F5Gg4OIJNcB7PhK8u5YgfDmGQPWobTs,3330
29
+ scratchattach/editor/monitor.py,sha256=A30XadTjw_G0KsTnwo3YEI31nkplc1DnO8AirjmB3zc,5921
30
+ scratchattach/editor/mutation.py,sha256=o2msH-s6UxFZ-LuYF1BlR4CBm-ulKTVpStux54cxnDk,12246
31
+ scratchattach/editor/pallete.py,sha256=OY76grzJLUWsAKi2x-mipEXv5f-9I-s9UjoLZ3FmtBM,2299
32
+ scratchattach/editor/prim.py,sha256=v74mkdLwsXAKPy_KPesugv-xCxA6YcGU6_v7Zvc2YEY,5919
33
+ scratchattach/editor/project.py,sha256=tWf9kULlJjMCV1t5AofIDFqGylBYQ31vpjDMJ3jM3_Q,12884
34
+ scratchattach/editor/sprite.py,sha256=M_rrkErJswH9stKvrywrkaoNEwgRBbF7-Si17W-0vTs,21205
35
+ scratchattach/editor/twconfig.py,sha256=iE6ylAsZzniAfhL09GkZSFn1XacYtCQPzRCUSPIBzDA,3324
36
+ scratchattach/editor/vlb.py,sha256=Fl2gGwZyYh54uOhQ7XITfCgCpJTQB2P8wy47PKY3Qyk,4151
37
+ scratchattach/editor/code_translation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ scratchattach/editor/code_translation/parse.py,sha256=FjuHVg_tNzkGcGSNwgH6MzAHcf5YCvaEUSYukyJkwbk,4932
39
+ scratchattach/eventhandlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ scratchattach/eventhandlers/_base.py,sha256=97vFbuhSoJeYb-jrEWDdbZWQ7e_54CY3ktrq8d_-w8g,3142
41
+ scratchattach/eventhandlers/cloud_events.py,sha256=LDENLVopVwKDVrcfkR1spKzT45ET-EKqBdtCzXoaS5g,5228
42
+ scratchattach/eventhandlers/cloud_recorder.py,sha256=dvob4-aKLxE9WFqvCNv28M_r3r3OEkET6rwmu5yl4jk,795
43
+ scratchattach/eventhandlers/cloud_requests.py,sha256=CQsA6wzW6C0xJYtw6g0X8x5DY5EHkDE1tAOMVigzhzA,25113
44
+ scratchattach/eventhandlers/cloud_server.py,sha256=j2Iiuxsp9xOLeZ6S7iT7Yto8u599O57kRUZLMMIxjQ0,12431
45
+ scratchattach/eventhandlers/cloud_storage.py,sha256=YYcvRjhIuOboWVemMKFEtUhrd6UeUFO_BlbAIH7oaeQ,4609
46
+ scratchattach/eventhandlers/combine.py,sha256=YiWI6WI1BySioXpfYaMv8noBM14EjZa7dtsJsMTshEU,894
47
+ scratchattach/eventhandlers/filterbot.py,sha256=V5dQErz_yFpSioh5VxUDaBW8L9ny1uMviTt7x-KFC1k,7612
48
+ scratchattach/eventhandlers/message_events.py,sha256=KvznXAeNGk1WWCxd7PI95yovX-58TyCBNDdXbrYgb8Q,1776
49
+ scratchattach/other/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ scratchattach/other/other_apis.py,sha256=yZ06rCZmJLSZZdfv1V_VgRBq5dUxS31YHkpsdOxAezw,17509
51
+ scratchattach/other/project_json_capabilities.py,sha256=07t1iMgWm4Qd06jHyQ3vK7tROguvc2RQCo78enrdSlA,22646
52
+ scratchattach/site/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
+ scratchattach/site/_base.py,sha256=D2SOp2aFiDP0hG7-xP8kK1pmoAz5TOi7_iWt6Ulpsbg,3283
54
+ scratchattach/site/activity.py,sha256=g5fg97xHUAKOkaZ4VzKl3hVpICZhv1mpDCO6LlmkoTU,17871
55
+ scratchattach/site/alert.py,sha256=V6asmcWy4tcQgWhG95rpqXP0KeUy7VQU9wD9AMhCqds,9324
56
+ scratchattach/site/backpack_asset.py,sha256=__VZomGDJkbgWj2ridQQArMMLWoSMv8dpO7PPpvPgBU,3322
57
+ scratchattach/site/browser_cookie3_stub.py,sha256=codk0knOP5C0YThaRazvqsqX7X7WnrD2UwFd1nFG7mg,1422
58
+ scratchattach/site/browser_cookies.py,sha256=uQyjJJ4HCu46R4tPWCcTUqDMXSXhQ4KQUobqCSxScSA,1864
59
+ scratchattach/site/classroom.py,sha256=lpHh2OkHeFzGUaFbf9PWIrosYOBo2cRrfc6fsex2w44,18139
60
+ scratchattach/site/cloud_activity.py,sha256=vMQy2k3jzPbOa3_TiH23B9dTk4BQA_z0q_Ab6TFkeV8,5397
61
+ scratchattach/site/comment.py,sha256=kUZxbjChs8K66vShz-Q1y1s72yJ44hFXJUYLsSb9rUs,9449
62
+ scratchattach/site/forum.py,sha256=-XLi3UJOwDt0Ye8CqP4c-sSxOkPSe5fPVa9b7MOm64k,16553
63
+ scratchattach/site/placeholder.py,sha256=BTOroGKA3lpgKPJXFeveEuMdcNkOIddpbNTrV-48s-o,5446
64
+ scratchattach/site/project.py,sha256=Zc5TN4PEGC1fTze_rkU7_-Y1YDuSXrkHaJGD3eeLgqU,34750
65
+ scratchattach/site/session.py,sha256=kd4IKaMXmtWGJJnFV3wOoLAF2S_012zHkdGcMZgUFxs,54451
66
+ scratchattach/site/studio.py,sha256=sAqFJDjhxf-9NynLB7mrCgzxq8td1oqa1zTW9MP1yTM,26195
67
+ scratchattach/site/typed_dicts.py,sha256=Hq65u56OSLdcoQ0F0A_CxZ8WBY5d_0VuJmUEMd8KmpU,3611
68
+ scratchattach/site/user.py,sha256=P2nsSGo-Z1QlXzAQxstOOq-E4QGN9HVA4dIQaJd1YFY,47404
69
+ scratchattach/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
+ scratchattach/utils/commons.py,sha256=DpBTxRC2XeKURW5YJwAT6teAfYG7221GxClTaZ0-yQE,8465
71
+ scratchattach/utils/encoder.py,sha256=1lOXBbqo2JGMdns6Q5WGhAB9p7Q8trduBk-SZgmcEKw,2559
72
+ scratchattach/utils/enums.py,sha256=5HhXidczUYYVwHf6jfJcMA80jK4V0imaltLEu5epIF8,11127
73
+ scratchattach/utils/exceptions.py,sha256=T1nBbbkTZVkZU7uNaqBqSbNTGtOaOnTVLRRqUTatTis,7556
74
+ scratchattach/utils/optional_async.py,sha256=zTCFt6tpSvlcwns1RgAACKplA1SSFyVWAcDRS8kLLjE,4721
75
+ scratchattach/utils/requests.py,sha256=Brl94PCyblaQopanXyyQZ8ZoaWuFrK3NqUTZWW22gpY,9608
76
+ scratchattach-3.0.0b2.dist-info/licenses/LICENSE,sha256=1PRKLhZU4wYt5M-C9f7q0W3go3u_ojnZMNOdR3g3J-E,1080
77
+ scratchattach-3.0.0b2.dist-info/METADATA,sha256=NanxaLAiqzD7fyD2O9oMWxqkLsfdg-439oGR5Qhd3xo,5633
78
+ scratchattach-3.0.0b2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
79
+ scratchattach-3.0.0b2.dist-info/entry_points.txt,sha256=vNXuP05TQKEoIzmzmUzS7zbtSZx0p3JmeUW3QhNdYfg,56
80
+ scratchattach-3.0.0b2.dist-info/top_level.txt,sha256=gIwCwW39ohXn0JlnvSzAjV7VtL3qPlRnHiRqBbxsEUE,14
81
+ scratchattach-3.0.0b2.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- scratchattach/__init__.py,sha256=K26DsJHYlj7atN0WVQOmtN7d1rNAnmLcO3ljA1UD1lc,1849
2
- scratchattach/__main__.py,sha256=K520LnmXe5WAlr8UZQE1Owrm8BDncy19QQ5GJ75V9FM,4054
3
- scratchattach-3.0.0b0.dist-info/licenses/LICENSE,sha256=1PRKLhZU4wYt5M-C9f7q0W3go3u_ojnZMNOdR3g3J-E,1080
4
- scratchattach-3.0.0b0.dist-info/METADATA,sha256=qapruF1xW-anLx5HiFgZ8B1k6oH_a1YcV2WHGRsU5PI,5633
5
- scratchattach-3.0.0b0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
6
- scratchattach-3.0.0b0.dist-info/entry_points.txt,sha256=vNXuP05TQKEoIzmzmUzS7zbtSZx0p3JmeUW3QhNdYfg,56
7
- scratchattach-3.0.0b0.dist-info/top_level.txt,sha256=gIwCwW39ohXn0JlnvSzAjV7VtL3qPlRnHiRqBbxsEUE,14
8
- scratchattach-3.0.0b0.dist-info/RECORD,,