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.
- scratchattach/cli/__about__.py +1 -0
- scratchattach/cli/__init__.py +26 -0
- scratchattach/cli/cmd/__init__.py +4 -0
- scratchattach/cli/cmd/group.py +127 -0
- scratchattach/cli/cmd/login.py +60 -0
- scratchattach/cli/cmd/profile.py +7 -0
- scratchattach/cli/cmd/sessions.py +5 -0
- scratchattach/cli/context.py +142 -0
- scratchattach/cli/db.py +66 -0
- scratchattach/cli/namespace.py +14 -0
- scratchattach/cloud/__init__.py +2 -0
- scratchattach/cloud/_base.py +483 -0
- scratchattach/cloud/cloud.py +183 -0
- scratchattach/editor/__init__.py +22 -0
- scratchattach/editor/asset.py +265 -0
- scratchattach/editor/backpack_json.py +115 -0
- scratchattach/editor/base.py +191 -0
- scratchattach/editor/block.py +584 -0
- scratchattach/editor/blockshape.py +357 -0
- scratchattach/editor/build_defaulting.py +51 -0
- scratchattach/editor/code_translation/__init__.py +0 -0
- scratchattach/editor/code_translation/parse.py +177 -0
- scratchattach/editor/comment.py +80 -0
- scratchattach/editor/commons.py +145 -0
- scratchattach/editor/extension.py +50 -0
- scratchattach/editor/field.py +99 -0
- scratchattach/editor/inputs.py +138 -0
- scratchattach/editor/meta.py +117 -0
- scratchattach/editor/monitor.py +185 -0
- scratchattach/editor/mutation.py +381 -0
- scratchattach/editor/pallete.py +88 -0
- scratchattach/editor/prim.py +174 -0
- scratchattach/editor/project.py +381 -0
- scratchattach/editor/sprite.py +609 -0
- scratchattach/editor/twconfig.py +114 -0
- scratchattach/editor/vlb.py +134 -0
- scratchattach/eventhandlers/__init__.py +0 -0
- scratchattach/eventhandlers/_base.py +101 -0
- scratchattach/eventhandlers/cloud_events.py +130 -0
- scratchattach/eventhandlers/cloud_recorder.py +26 -0
- scratchattach/eventhandlers/cloud_requests.py +544 -0
- scratchattach/eventhandlers/cloud_server.py +249 -0
- scratchattach/eventhandlers/cloud_storage.py +135 -0
- scratchattach/eventhandlers/combine.py +30 -0
- scratchattach/eventhandlers/filterbot.py +163 -0
- scratchattach/eventhandlers/message_events.py +42 -0
- scratchattach/other/__init__.py +0 -0
- scratchattach/other/other_apis.py +598 -0
- scratchattach/other/project_json_capabilities.py +475 -0
- scratchattach/site/__init__.py +0 -0
- scratchattach/site/_base.py +93 -0
- scratchattach/site/activity.py +426 -0
- scratchattach/site/alert.py +226 -0
- scratchattach/site/backpack_asset.py +119 -0
- scratchattach/site/browser_cookie3_stub.py +17 -0
- scratchattach/site/browser_cookies.py +61 -0
- scratchattach/site/classroom.py +454 -0
- scratchattach/site/cloud_activity.py +121 -0
- scratchattach/site/comment.py +228 -0
- scratchattach/site/forum.py +436 -0
- scratchattach/site/placeholder.py +132 -0
- scratchattach/site/project.py +932 -0
- scratchattach/site/session.py +1323 -0
- scratchattach/site/studio.py +704 -0
- scratchattach/site/typed_dicts.py +151 -0
- scratchattach/site/user.py +1252 -0
- scratchattach/utils/__init__.py +0 -0
- scratchattach/utils/commons.py +263 -0
- scratchattach/utils/encoder.py +161 -0
- scratchattach/utils/enums.py +237 -0
- scratchattach/utils/exceptions.py +277 -0
- scratchattach/utils/optional_async.py +154 -0
- scratchattach/utils/requests.py +306 -0
- {scratchattach-3.0.0b0.dist-info → scratchattach-3.0.0b2.dist-info}/METADATA +1 -1
- scratchattach-3.0.0b2.dist-info/RECORD +81 -0
- scratchattach-3.0.0b0.dist-info/RECORD +0 -8
- {scratchattach-3.0.0b0.dist-info → scratchattach-3.0.0b2.dist-info}/WHEEL +0 -0
- {scratchattach-3.0.0b0.dist-info → scratchattach-3.0.0b2.dist-info}/entry_points.txt +0 -0
- {scratchattach-3.0.0b0.dist-info → scratchattach-3.0.0b2.dist-info}/licenses/LICENSE +0 -0
- {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()
|
|
@@ -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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|