scratchattach 2.1.9__py3-none-any.whl → 2.1.10a1__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 (59) hide show
  1. scratchattach/__init__.py +28 -25
  2. scratchattach/cloud/__init__.py +2 -0
  3. scratchattach/cloud/_base.py +454 -282
  4. scratchattach/cloud/cloud.py +171 -168
  5. scratchattach/editor/__init__.py +21 -0
  6. scratchattach/editor/asset.py +199 -0
  7. scratchattach/editor/backpack_json.py +117 -0
  8. scratchattach/editor/base.py +142 -0
  9. scratchattach/editor/block.py +507 -0
  10. scratchattach/editor/blockshape.py +353 -0
  11. scratchattach/editor/build_defaulting.py +47 -0
  12. scratchattach/editor/comment.py +74 -0
  13. scratchattach/editor/commons.py +243 -0
  14. scratchattach/editor/extension.py +43 -0
  15. scratchattach/editor/field.py +90 -0
  16. scratchattach/editor/inputs.py +132 -0
  17. scratchattach/editor/meta.py +106 -0
  18. scratchattach/editor/monitor.py +175 -0
  19. scratchattach/editor/mutation.py +317 -0
  20. scratchattach/editor/pallete.py +91 -0
  21. scratchattach/editor/prim.py +170 -0
  22. scratchattach/editor/project.py +273 -0
  23. scratchattach/editor/sbuild.py +2837 -0
  24. scratchattach/editor/sprite.py +586 -0
  25. scratchattach/editor/twconfig.py +113 -0
  26. scratchattach/editor/vlb.py +134 -0
  27. scratchattach/eventhandlers/_base.py +99 -92
  28. scratchattach/eventhandlers/cloud_events.py +110 -103
  29. scratchattach/eventhandlers/cloud_recorder.py +26 -21
  30. scratchattach/eventhandlers/cloud_requests.py +460 -452
  31. scratchattach/eventhandlers/cloud_server.py +246 -244
  32. scratchattach/eventhandlers/cloud_storage.py +135 -134
  33. scratchattach/eventhandlers/combine.py +29 -27
  34. scratchattach/eventhandlers/filterbot.py +160 -159
  35. scratchattach/eventhandlers/message_events.py +41 -40
  36. scratchattach/other/other_apis.py +284 -212
  37. scratchattach/other/project_json_capabilities.py +475 -546
  38. scratchattach/site/_base.py +64 -46
  39. scratchattach/site/activity.py +414 -122
  40. scratchattach/site/backpack_asset.py +118 -84
  41. scratchattach/site/classroom.py +430 -142
  42. scratchattach/site/cloud_activity.py +107 -103
  43. scratchattach/site/comment.py +220 -190
  44. scratchattach/site/forum.py +400 -399
  45. scratchattach/site/project.py +806 -787
  46. scratchattach/site/session.py +1134 -867
  47. scratchattach/site/studio.py +611 -609
  48. scratchattach/site/user.py +835 -837
  49. scratchattach/utils/commons.py +243 -148
  50. scratchattach/utils/encoder.py +157 -156
  51. scratchattach/utils/enums.py +197 -190
  52. scratchattach/utils/exceptions.py +233 -206
  53. scratchattach/utils/requests.py +67 -59
  54. {scratchattach-2.1.9.dist-info → scratchattach-2.1.10a1.dist-info}/METADATA +155 -146
  55. scratchattach-2.1.10a1.dist-info/RECORD +62 -0
  56. {scratchattach-2.1.9.dist-info → scratchattach-2.1.10a1.dist-info}/WHEEL +1 -1
  57. {scratchattach-2.1.9.dist-info → scratchattach-2.1.10a1.dist-info/licenses}/LICENSE +21 -21
  58. scratchattach-2.1.9.dist-info/RECORD +0 -40
  59. {scratchattach-2.1.9.dist-info → scratchattach-2.1.10a1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,353 @@
1
+ """
2
+ Enums stating the shape of a block from its opcode (i.e: stack, c-mouth, cap, hat etc)
3
+ """
4
+ from __future__ import annotations
5
+
6
+ # Perhaps this should be merged with pallet.py
7
+ from dataclasses import dataclass
8
+ from typing import Final
9
+
10
+ from . import commons
11
+ from ..utils.enums import _EnumWrapper
12
+
13
+
14
+ class _MutationDependent(commons.Singleton):
15
+ def __bool__(self):
16
+ raise TypeError("Need mutation data to work out attribute value.")
17
+
18
+
19
+ MUTATION_DEPENDENT: Final[_MutationDependent] = _MutationDependent()
20
+ """Value used when mutation data is required to work out the attribute value"""
21
+
22
+
23
+ @dataclass(init=True, repr=True)
24
+ class BlockShape:
25
+ """
26
+ A class that describes the shape of a block; e.g. is it a stack, c-mouth, cap, hat reporter, boolean or menu block?
27
+ """
28
+ is_stack: bool | _MutationDependent = False # Most blocks - e.g. move [10] steps
29
+ is_c_mouth: bool | _MutationDependent = False # Has substack - e.g. repeat
30
+ is_cap: bool | _MutationDependent = False # No next - e.g. forever
31
+ is_hat: bool | _MutationDependent = False # No parent - e.g. when gf clicked
32
+ is_reporter: bool | _MutationDependent = False # (reporter)
33
+ is_boolean: bool | _MutationDependent = False # <reporter>
34
+ is_menu: bool | _MutationDependent = False # Shadow reporters, e.g. costume menu
35
+ opcode: str = None
36
+
37
+ @property
38
+ def is_attachable(self):
39
+ if self.is_cap is MUTATION_DEPENDENT:
40
+ raise TypeError(
41
+ "Can't tell if the block is attachable because we can't be sure if it is a cap block or not (stop block)")
42
+ return not self.is_cap and not self.is_reporter
43
+
44
+
45
+ class BlockShapes(_EnumWrapper):
46
+ MOTION_MOVESTEPS = BlockShape(is_stack=True, opcode="motion_movesteps")
47
+ MOTION_TURNRIGHT = BlockShape(is_stack=True, opcode="motion_turnright")
48
+ MOTION_TURNLEFT = BlockShape(is_stack=True, opcode="motion_turnleft")
49
+ MOTION_GOTO = BlockShape(is_stack=True, opcode="motion_goto")
50
+ MOTION_GOTOXY = BlockShape(is_stack=True, opcode="motion_gotoxy")
51
+ MOTION_GLIDETO = BlockShape(is_stack=True, opcode="motion_glideto")
52
+ MOTION_GLIDESECSTOXY = BlockShape(is_stack=True, opcode="motion_glidesecstoxy")
53
+ MOTION_POINTINDIRECTION = BlockShape(is_stack=True, opcode="motion_pointindirection")
54
+ MOTION_POINTTOWARDS = BlockShape(is_stack=True, opcode="motion_pointtowards")
55
+ MOTION_CHANGEXBY = BlockShape(is_stack=True, opcode="motion_changexby")
56
+ MOTION_SETX = BlockShape(is_stack=True, opcode="motion_setx")
57
+ MOTION_CHANGEYBY = BlockShape(is_stack=True, opcode="motion_changeyby")
58
+ MOTION_SETY = BlockShape(is_stack=True, opcode="motion_sety")
59
+ MOTION_IFONEDGEBOUNCE = BlockShape(is_stack=True, opcode="motion_ifonedgebounce")
60
+ MOTION_SETROTATIONSTYLE = BlockShape(is_stack=True, opcode="motion_setrotationstyle")
61
+ MOTION_XPOSITION = BlockShape(is_reporter=True, opcode="motion_xposition")
62
+ MOTION_YPOSITION = BlockShape(is_reporter=True, opcode="motion_yposition")
63
+ MOTION_DIRECTION = BlockShape(is_reporter=True, opcode="motion_direction")
64
+ MOTION_SCROLL_RIGHT = BlockShape(is_stack=True, opcode="motion_scroll_right")
65
+ MOTION_SCROLL_UP = BlockShape(is_stack=True, opcode="motion_scroll_up")
66
+ MOTION_ALIGN_SCENE = BlockShape(is_stack=True, opcode="motion_align_scene")
67
+ MOTION_XSCROLL = BlockShape(is_reporter=True, opcode="motion_xscroll")
68
+ MOTION_YSCROLL = BlockShape(is_reporter=True, opcode="motion_yscroll")
69
+ MOTION_GOTO_MENU = BlockShape(is_reporter=True, is_menu=True, opcode="motion_goto_menu")
70
+ MOTION_GLIDETO_MENU = BlockShape(is_reporter=True, is_menu=True, opcode="motion_glideto_menu")
71
+ MOTION_POINTTOWARDS_MENU = BlockShape(is_reporter=True, is_menu=True, opcode="motion_pointtowards_menu")
72
+
73
+ LOOKS_SAYFORSECS = BlockShape(is_stack=True, opcode="looks_sayforsecs")
74
+ LOOKS_SAY = BlockShape(is_stack=True, opcode="looks_say")
75
+ LOOKS_THINKFORSECS = BlockShape(is_stack=True, opcode="looks_thinkforsecs")
76
+ LOOKS_THINK = BlockShape(is_stack=True, opcode="looks_think")
77
+ LOOKS_SWITCHCOSTUMETO = BlockShape(is_stack=True, opcode="looks_switchcostumeto")
78
+ LOOKS_NEXTCOSTUME = BlockShape(is_stack=True, opcode="looks_nextcostume")
79
+ LOOKS_SWITCHBACKDROPTO = BlockShape(is_stack=True, opcode="looks_switchbackdropto")
80
+ LOOKS_SWITCHBACKDROPTOANDWAIT = BlockShape(is_stack=True, opcode="looks_switchbackdroptoandwait")
81
+ LOOKS_NEXTBACKDROP = BlockShape(is_stack=True, opcode="looks_nextbackdrop")
82
+ LOOKS_CHANGESIZEBY = BlockShape(is_stack=True, opcode="looks_changesizeby")
83
+ LOOKS_SETSIZETO = BlockShape(is_stack=True, opcode="looks_setsizeto")
84
+ LOOKS_CHANGEEFFECTBY = BlockShape(is_stack=True, opcode="looks_changeeffectby")
85
+ LOOKS_SETEFFECTTO = BlockShape(is_stack=True, opcode="looks_seteffectto")
86
+ LOOKS_CLEARGRAPHICEFFECTS = BlockShape(is_stack=True, opcode="looks_cleargraphiceffects")
87
+ LOOKS_SHOW = BlockShape(is_stack=True, opcode="looks_show")
88
+ LOOKS_HIDE = BlockShape(is_stack=True, opcode="looks_hide")
89
+ LOOKS_GOTOFRONTBACK = BlockShape(is_stack=True, opcode="looks_gotofrontback")
90
+ LOOKS_GOFORWARDBACKWARDLAYERS = BlockShape(is_stack=True, opcode="looks_goforwardbackwardlayers")
91
+ LOOKS_COSTUMENUMBERNAME = BlockShape(is_reporter=True, opcode="looks_costumenumbername")
92
+ LOOKS_BACKDROPNUMBERNAME = BlockShape(is_reporter=True, opcode="looks_backdropnumbername")
93
+ LOOKS_SIZE = BlockShape(is_reporter=True, opcode="looks_size")
94
+ LOOKS_HIDEALLSPRITES = BlockShape(is_stack=True, opcode="looks_hideallsprites")
95
+ LOOKS_SETSTRETCHTO = BlockShape(is_stack=True, opcode="looks_setstretchto")
96
+ LOOKS_CHANGESTRETCHBY = BlockShape(is_stack=True, opcode="looks_changestretchby")
97
+ LOOKS_COSTUME = BlockShape(is_reporter=True, is_menu=True, opcode="looks_costume")
98
+ LOOKS_BACKDROPS = BlockShape(is_reporter=True, is_menu=True, opcode="looks_backdrops")
99
+
100
+ SOUND_PLAYUNTILDONE = BlockShape(is_stack=True, opcode="sound_playuntildone")
101
+ SOUND_PLAY = BlockShape(is_stack=True, opcode="sound_play")
102
+ SOUND_STOPALLSOUNDS = BlockShape(is_stack=True, opcode="sound_stopallsounds")
103
+ SOUND_CHANGEEFFECTBY = BlockShape(is_stack=True, opcode="sound_changeeffectby")
104
+ SOUND_SETEFFECTTO = BlockShape(is_stack=True, opcode="sound_seteffectto")
105
+ SOUND_CLEAREFFECTS = BlockShape(is_stack=True, opcode="sound_cleareffects")
106
+ SOUND_CHANGEVOLUMEBY = BlockShape(is_stack=True, opcode="sound_changevolumeby")
107
+ SOUND_SETVOLUMETO = BlockShape(is_stack=True, opcode="sound_setvolumeto")
108
+ SOUND_VOLUME = BlockShape(is_reporter=True, opcode="sound_volume")
109
+ SOUND_SOUNDS_MENU = BlockShape(is_reporter=True, is_menu=True, opcode="sound_sounds_menu")
110
+
111
+ EVENT_WHENFLAGCLICKED = BlockShape(is_hat=True, opcode="event_whenflagclicked")
112
+ EVENT_WHENKEYPRESSED = BlockShape(is_hat=True, opcode="event_whenkeypressed")
113
+ EVENT_WHENTHISSPRITECLICKED = BlockShape(is_hat=True, opcode="event_whenthisspriteclicked")
114
+ EVENT_WHENSTAGECLICKED = BlockShape(is_hat=True, opcode="event_whenstageclicked")
115
+ EVENT_WHENBACKDROPSWITCHESTO = BlockShape(is_hat=True, opcode="event_whenbackdropswitchesto")
116
+ EVENT_WHENGREATERTHAN = BlockShape(is_hat=True, opcode="event_whengreaterthan")
117
+ EVENT_WHENBROADCASTRECEIVED = BlockShape(is_hat=True, opcode="event_whenbroadcastreceived")
118
+ EVENT_BROADCAST = BlockShape(is_stack=True, opcode="event_broadcast")
119
+ EVENT_BROADCASTANDWAIT = BlockShape(is_stack=True, opcode="event_broadcastandwait")
120
+ EVENT_WHENTOUCHINGOBJECT = BlockShape(is_hat=True, opcode="event_whentouchingobject")
121
+ EVENT_BROADCAST_MENU = BlockShape(is_reporter=True, is_menu=True, opcode="event_broadcast_menu")
122
+ EVENT_TOUCHINGOBJECTMENU = BlockShape(is_reporter=True, is_menu=True, opcode="event_touchingobjectmenu")
123
+
124
+ CONTROL_WAIT = BlockShape(is_stack=True, opcode="control_wait")
125
+ CONTROL_FOREVER = BlockShape(is_c_mouth=True, is_stack=True, is_cap=True, opcode="control_forever")
126
+ CONTROL_IF = BlockShape(is_c_mouth=True, is_stack=True, opcode="control_if")
127
+ CONTROL_IF_ELSE = BlockShape(is_c_mouth=True, is_stack=True, opcode="control_if_else")
128
+ CONTROL_WAIT_UNTIL = BlockShape(is_stack=True, opcode="control_wait_until")
129
+ CONTROL_REPEAT_UNTIL = BlockShape(is_c_mouth=True, is_stack=True, opcode="control_repeat_until")
130
+ CONTROL_STOP = BlockShape(is_stack=True, is_cap=MUTATION_DEPENDENT, opcode="control_stop")
131
+ CONTROL_START_AS_CLONE = BlockShape(is_hat=True, opcode="control_start_as_clone")
132
+ CONTROL_CREATE_CLONE_OF = BlockShape(is_stack=True, opcode="control_create_clone_of")
133
+ CONTROL_DELETE_THIS_CLONE = BlockShape(is_stack=True, is_cap=True, opcode="control_delete_this_clone")
134
+ CONTROL_FOR_EACH = BlockShape(is_c_mouth=True, is_stack=True, opcode="control_for_each")
135
+ CONTROL_WHILE = BlockShape(is_c_mouth=True, is_stack=True, opcode="control_while")
136
+ CONTROL_GET_COUNTER = BlockShape(is_reporter=True, opcode="control_get_counter")
137
+ CONTROL_INCR_COUNTER = BlockShape(is_stack=True, opcode="control_incr_counter")
138
+ CONTROL_CLEAR_COUNTER = BlockShape(is_stack=True, opcode="control_clear_counter")
139
+ CONTROL_ALL_AT_ONCE = BlockShape(is_c_mouth=True, is_stack=True, opcode="control_all_at_once")
140
+ CONTROL_CREATE_CLONE_OF_MENU = BlockShape(is_reporter=True, is_menu=True, opcode="control_create_clone_of_menu")
141
+
142
+ SENSING_TOUCHINGOBJECT = BlockShape(is_reporter=True, is_boolean=True, opcode="sensing_touchingobject")
143
+ SENSING_TOUCHINGCOLOR = BlockShape(is_reporter=True, is_boolean=True, opcode="sensing_touchingcolor")
144
+ SENSING_COLORISTOUCHINGCOLOR = BlockShape(is_reporter=True, is_boolean=True, opcode="sensing_coloristouchingcolor")
145
+ SENSING_DISTANCETO = BlockShape(is_reporter=True, opcode="sensing_distanceto")
146
+ SENSING_ASKANDWAIT = BlockShape(is_stack=True, opcode="sensing_askandwait")
147
+ SENSING_ANSWER = BlockShape(is_reporter=True, opcode="sensing_answer")
148
+ SENSING_KEYPRESSED = BlockShape(is_reporter=True, is_boolean=True, opcode="sensing_keypressed")
149
+ SENSING_MOUSEDOWN = BlockShape(is_reporter=True, is_boolean=True, opcode="sensing_mousedown")
150
+ SENSING_MOUSEX = BlockShape(is_reporter=True, opcode="sensing_mousex")
151
+ SENSING_MOUSEY = BlockShape(is_reporter=True, opcode="sensing_mousey")
152
+ SENSING_SETDRAGMODE = BlockShape(is_stack=True, opcode="sensing_setdragmode")
153
+ SENSING_LOUDNESS = BlockShape(is_reporter=True, opcode="sensing_loudness")
154
+ SENSING_TIMER = BlockShape(is_reporter=True, opcode="sensing_timer")
155
+ SENSING_RESETTIMER = BlockShape(is_stack=True, opcode="sensing_resettimer")
156
+ SENSING_OF = BlockShape(is_reporter=True, opcode="sensing_of")
157
+ SENSING_CURRENT = BlockShape(is_reporter=True, opcode="sensing_current")
158
+ SENSING_DAYSSINCE2000 = BlockShape(is_reporter=True, opcode="sensing_dayssince2000")
159
+ SENSING_USERNAME = BlockShape(is_reporter=True, opcode="sensing_username")
160
+ SENSING_LOUD = BlockShape(is_reporter=True, is_boolean=True, opcode="sensing_loud")
161
+ SENSING_USERID = BlockShape(is_reporter=True, opcode="sensing_userid")
162
+ SENSING_TOUCHINGOBJECTMENU = BlockShape(is_reporter=True, is_menu=True, opcode="sensing_touchingobjectmenu")
163
+ SENSING_DISTANCETOMENU = BlockShape(is_reporter=True, is_menu=True, opcode="sensing_distancetomenu")
164
+ SENSING_KEYOPTIONS = BlockShape(is_reporter=True, is_menu=True, opcode="sensing_keyoptions")
165
+ SENSING_OF_OBJECT_MENU = BlockShape(is_reporter=True, is_menu=True, opcode="sensing_of_object_menu")
166
+
167
+ OPERATOR_ADD = BlockShape(is_reporter=True, opcode="operator_add")
168
+ OPERATOR_SUBTRACT = BlockShape(is_reporter=True, opcode="operator_subtract")
169
+ OPERATOR_MULTIPLY = BlockShape(is_reporter=True, opcode="operator_multiply")
170
+ OPERATOR_DIVIDE = BlockShape(is_reporter=True, opcode="operator_divide")
171
+ OPERATOR_RANDOM = BlockShape(is_reporter=True, opcode="operator_random")
172
+ OPERATOR_GT = BlockShape(is_reporter=True, is_boolean=True, opcode="operator_gt")
173
+ OPERATOR_LT = BlockShape(is_reporter=True, is_boolean=True, opcode="operator_lt")
174
+ OPERATOR_EQUALS = BlockShape(is_reporter=True, is_boolean=True, opcode="operator_equals")
175
+ OPERATOR_AND = BlockShape(is_reporter=True, is_boolean=True, opcode="operator_and")
176
+ OPERATOR_OR = BlockShape(is_reporter=True, is_boolean=True, opcode="operator_or")
177
+ OPERATOR_NOT = BlockShape(is_reporter=True, is_boolean=True, opcode="operator_not")
178
+ OPERATOR_JOIN = BlockShape(is_reporter=True, opcode="operator_join")
179
+ OPERATOR_LETTER_OF = BlockShape(is_reporter=True, opcode="operator_letter_of")
180
+ OPERATOR_LENGTH = BlockShape(is_reporter=True, opcode="operator_length")
181
+ OPERATOR_CONTAINS = BlockShape(is_reporter=True, is_boolean=True, opcode="operator_contains")
182
+ OPERATOR_MOD = BlockShape(is_reporter=True, opcode="operator_mod")
183
+ OPERATOR_ROUND = BlockShape(is_reporter=True, opcode="operator_round")
184
+ OPERATOR_MATHOP = BlockShape(is_reporter=True, opcode="operator_mathop")
185
+
186
+ DATA_VARIABLE = BlockShape(is_reporter=True, opcode="data_variable")
187
+ DATA_SETVARIABLETO = BlockShape(is_stack=True, opcode="data_setvariableto")
188
+ DATA_CHANGEVARIABLEBY = BlockShape(is_stack=True, opcode="data_changevariableby")
189
+ DATA_SHOWVARIABLE = BlockShape(is_stack=True, opcode="data_showvariable")
190
+ DATA_HIDEVARIABLE = BlockShape(is_stack=True, opcode="data_hidevariable")
191
+ DATA_LISTCONTENTS = BlockShape(is_reporter=True, opcode="data_listcontents")
192
+ DATA_ADDTOLIST = BlockShape(is_stack=True, opcode="data_addtolist")
193
+ DATA_DELETEOFLIST = BlockShape(is_stack=True, opcode="data_deleteoflist")
194
+ DATA_DELETEALLOFLIST = BlockShape(is_stack=True, opcode="data_deletealloflist")
195
+ DATA_INSERTATLIST = BlockShape(is_stack=True, opcode="data_insertatlist")
196
+ DATA_REPLACEITEMOFLIST = BlockShape(is_stack=True, opcode="data_replaceitemoflist")
197
+ DATA_ITEMOFLIST = BlockShape(is_reporter=True, is_boolean=True, opcode="data_itemoflist")
198
+ DATA_ITEMNUMOFLIST = BlockShape(is_reporter=True, opcode="data_itemnumoflist")
199
+ DATA_LENGTHOFLIST = BlockShape(is_reporter=True, opcode="data_lengthoflist")
200
+ DATA_LISTCONTAINSITEM = BlockShape(is_reporter=True, is_boolean=True, opcode="data_listcontainsitem")
201
+ DATA_SHOWLIST = BlockShape(is_stack=True, opcode="data_showlist")
202
+ DATA_HIDELIST = BlockShape(is_stack=True, opcode="data_hidelist")
203
+ DATA_LISTINDEXALL = BlockShape(is_reporter=True, is_menu=True, opcode="data_listindexall")
204
+ DATA_LISTINDEXRANDOM = BlockShape(is_reporter=True, is_menu=True, opcode="data_listindexrandom")
205
+
206
+ PROCEDURES_DEFINITION = BlockShape(is_hat=True, opcode="procedures_definition")
207
+ PROCEDURES_CALL = BlockShape(is_stack=True, opcode="procedures_call")
208
+ PROCEDURES_DECLARATION = BlockShape(is_stack=True, opcode="procedures_declaration")
209
+ PROCEDURES_PROTOTYPE = BlockShape(is_stack=True, opcode="procedures_prototype")
210
+
211
+ ARGUMENT_REPORTER_STRING_NUMBER = BlockShape(is_reporter=True, opcode="argument_reporter_string_number")
212
+ ARGUMENT_REPORTER_BOOLEAN = BlockShape(is_reporter=True, is_boolean=True, opcode="argument_reporter_boolean")
213
+ ARGUMENT_EDITOR_REPORTER = BlockShape(is_reporter=True, is_boolean=True, opcode="argument_editor_reporter")
214
+ ARGUMENT_EDITOR_STRING_NUMBER = BlockShape(is_reporter=True, opcode="argument_editor_string_number")
215
+
216
+ MUSIC_PLAYDRUMFORBEATS = BlockShape(is_stack=True, opcode="music_playDrumForBeats")
217
+ MUSIC_RESTFORBEATS = BlockShape(is_stack=True, opcode="music_restForBeats")
218
+ MUSIC_PLAYNOTEFORBEATS = BlockShape(is_stack=True, opcode="music_playNoteForBeats")
219
+ MUSIC_SETINSTRUMENT = BlockShape(is_stack=True, opcode="music_setInstrument")
220
+ MUSIC_SETTEMPO = BlockShape(is_stack=True, opcode="music_setTempo")
221
+ MUSIC_CHANGETEMPO = BlockShape(is_stack=True, opcode="music_changeTempo")
222
+ MUSIC_GETTEMPO = BlockShape(is_reporter=True, opcode="music_getTempo")
223
+ MUSIC_MIDIPLAYDRUMFORBEATS = BlockShape(is_stack=True, opcode="music_midiPlayDrumForBeats")
224
+ MUSIC_MIDISETINSTRUMENT = BlockShape(is_stack=True, opcode="music_midiSetInstrument")
225
+ MUSIC_MENU_DRUM = BlockShape(is_reporter=True, is_menu=True, opcode="music_menu_DRUM")
226
+ MUSIC_MENU_INSTRUMENT = BlockShape(is_reporter=True, is_menu=True, opcode="music_menu_INSTRUMENT")
227
+
228
+ PEN_CLEAR = BlockShape(is_stack=True, opcode="pen_clear")
229
+ PEN_STAMP = BlockShape(is_stack=True, opcode="pen_stamp")
230
+ PEN_PENDOWN = BlockShape(is_stack=True, opcode="pen_penDown")
231
+ PEN_PENUP = BlockShape(is_stack=True, opcode="pen_penUp")
232
+ PEN_SETPENCOLORTOCOLOR = BlockShape(is_stack=True, opcode="pen_setPenColorToColor")
233
+ PEN_CHANGEPENCOLORPARAMBY = BlockShape(is_stack=True, opcode="pen_changePenColorParamBy")
234
+ PEN_SETPENCOLORPARAMTO = BlockShape(is_stack=True, opcode="pen_setPenColorParamTo")
235
+ PEN_CHANGEPENSIZEBY = BlockShape(is_stack=True, opcode="pen_changePenSizeBy")
236
+ PEN_SETPENSIZETO = BlockShape(is_stack=True, opcode="pen_setPenSizeTo")
237
+ PEN_SETPENHUETONUMBER = BlockShape(is_stack=True, opcode="pen_setPenHueToNumber")
238
+ PEN_CHANGEPENHUEBY = BlockShape(is_stack=True, opcode="pen_changePenHueBy")
239
+ PEN_SETPENSHADETONUMBER = BlockShape(is_stack=True, opcode="pen_setPenShadeToNumber")
240
+ PEN_CHANGEPENSHADEBY = BlockShape(is_stack=True, opcode="pen_changePenShadeBy")
241
+ PEN_MENU_COLORPARAM = BlockShape(is_reporter=True, is_menu=True, opcode="pen_menu_colorParam")
242
+
243
+ VIDEOSENSING_WHENMOTIONGREATERTHAN = BlockShape(is_hat=True, opcode="videoSensing_whenMotionGreaterThan")
244
+ VIDEOSENSING_VIDEOON = BlockShape(is_reporter=True, opcode="videoSensing_videoOn")
245
+ VIDEOSENSING_VIDEOTOGGLE = BlockShape(is_stack=True, opcode="videoSensing_videoToggle")
246
+ VIDEOSENSING_SETVIDEOTRANSPARENCY = BlockShape(is_stack=True, opcode="videoSensing_setVideoTransparency")
247
+ VIDEOSENSING_MENU_ATTRIBUTE = BlockShape(is_reporter=True, is_menu=True, opcode="videoSensing_menu_ATTRIBUTE")
248
+ VIDEOSENSING_MENU_SUBJECT = BlockShape(is_reporter=True, is_menu=True, opcode="videoSensing_menu_SUBJECT")
249
+ VIDEOSENSING_MENU_VIDEO_STATE = BlockShape(is_reporter=True, is_menu=True, opcode="videoSensing_menu_VIDEO_STATE")
250
+
251
+ TEXT2SPEECH_SPEAKANDWAIT = BlockShape(is_stack=True, opcode="text2speech_speakAndWait")
252
+ TEXT2SPEECH_SETVOICE = BlockShape(is_stack=True, opcode="text2speech_setVoice")
253
+ TEXT2SPEECH_SETLANGUAGE = BlockShape(is_stack=True, opcode="text2speech_setLanguage")
254
+ TEXT2SPEECH_MENU_VOICES = BlockShape(is_reporter=True, is_menu=True, opcode="text2speech_menu_voices")
255
+ TEXT2SPEECH_MENU_LANGUAGES = BlockShape(is_reporter=True, is_menu=True, opcode="text2speech_menu_languages")
256
+ TRANSLATE_GETTRANSLATE = BlockShape(is_reporter=True, opcode="translate_getTranslate")
257
+ TRANSLATE_GETVIEWERLANGUAGE = BlockShape(is_reporter=True, opcode="translate_getViewerLanguage")
258
+ TRANSLATE_MENU_LANGUAGES = BlockShape(is_reporter=True, is_menu=True, opcode="translate_menu_languages")
259
+
260
+ MAKEYMAKEY_WHENMAKEYKEYPRESSED = BlockShape(is_hat=True, opcode="makeymakey_whenMakeyKeyPressed")
261
+ MAKEYMAKEY_WHENCODEPRESSED = BlockShape(is_hat=True, opcode="makeymakey_whenCodePressed")
262
+ MAKEYMAKEY_MENU_KEY = BlockShape(is_reporter=True, is_menu=True, opcode="makeymakey_menu_KEY")
263
+ MAKEYMAKEY_MENU_SEQUENCE = BlockShape(is_reporter=True, is_menu=True, opcode="makeymakey_menu_SEQUENCE")
264
+
265
+ MICROBIT_WHENBUTTONPRESSED = BlockShape(opcode="microbit_whenButtonPressed")
266
+ MICROBIT_ISBUTTONPRESSED = BlockShape(opcode="microbit_isButtonPressed")
267
+ MICROBIT_WHENGESTURE = BlockShape(opcode="microbit_whenGesture")
268
+ MICROBIT_DISPLAYSYMBOL = BlockShape(opcode="microbit_displaySymbol")
269
+ MICROBIT_DISPLAYTEXT = BlockShape(opcode="microbit_displayText")
270
+ MICROBIT_DISPLAYCLEAR = BlockShape(opcode="microbit_displayClear")
271
+ MICROBIT_WHENTILTED = BlockShape(opcode="microbit_whenTilted")
272
+ MICROBIT_ISTILTED = BlockShape(opcode="microbit_isTilted")
273
+ MICROBIT_GETTILTANGLE = BlockShape(opcode="microbit_getTiltAngle")
274
+ MICROBIT_WHENPINCONNECTED = BlockShape(opcode="microbit_whenPinConnected")
275
+ MICROBIT_MENU_BUTTONS = BlockShape(opcode="microbit_menu_buttons")
276
+ MICROBIT_MENU_GESTURES = BlockShape(opcode="microbit_menu_gestures")
277
+ MICROBIT_MENU_TILTDIRECTIONANY = BlockShape(opcode="microbit_menu_tiltDirectionAny")
278
+ MICROBIT_MENU_TILTDIRECTION = BlockShape(opcode="microbit_menu_tiltDirection")
279
+ MICROBIT_MENU_TOUCHPINS = BlockShape(opcode="microbit_menu_touchPins")
280
+ MICROBIT_MENU_PINSTATE = BlockShape(opcode="microbit_menu_pinState")
281
+
282
+ EV3_MOTORTURNCLOCKWISE = BlockShape(opcode="ev3_motorTurnClockwise")
283
+ EV3_MOTORTURNCOUNTERCLOCKWISE = BlockShape(opcode="ev3_motorTurnCounterClockwise")
284
+ EV3_MOTORSETPOWER = BlockShape(opcode="ev3_motorSetPower")
285
+ EV3_GETMOTORPOSITION = BlockShape(opcode="ev3_getMotorPosition")
286
+ EV3_WHENBUTTONPRESSED = BlockShape(opcode="ev3_whenButtonPressed")
287
+ EV3_WHENDISTANCELESSTHAN = BlockShape(opcode="ev3_whenDistanceLessThan")
288
+ EV3_WHENBRIGHTNESSLESSTHAN = BlockShape(opcode="ev3_whenBrightnessLessThan")
289
+ EV3_BUTTONPRESSED = BlockShape(opcode="ev3_buttonPressed")
290
+ EV3_GETDISTANCE = BlockShape(opcode="ev3_getDistance")
291
+ EV3_GETBRIGHTNESS = BlockShape(opcode="ev3_getBrightness")
292
+ EV3_BEEP = BlockShape(opcode="ev3_beep")
293
+ EV3_MENU_MOTORPORTS = BlockShape(opcode="ev3_menu_motorPorts")
294
+ EV3_MENU_SENSORPORTS = BlockShape(opcode="ev3_menu_sensorPorts")
295
+
296
+ BOOST_MOTORONFOR = BlockShape(opcode="boost_motorOnFor")
297
+ BOOST_MOTORONFORROTATION = BlockShape(opcode="boost_motorOnForRotation")
298
+ BOOST_MOTORON = BlockShape(opcode="boost_motorOn")
299
+ BOOST_MOTOROFF = BlockShape(opcode="boost_motorOff")
300
+ BOOST_SETMOTORPOWER = BlockShape(opcode="boost_setMotorPower")
301
+ BOOST_SETMOTORDIRECTION = BlockShape(opcode="boost_setMotorDirection")
302
+ BOOST_GETMOTORPOSITION = BlockShape(opcode="boost_getMotorPosition")
303
+ BOOST_WHENCOLOR = BlockShape(opcode="boost_whenColor")
304
+ BOOST_SEEINGCOLOR = BlockShape(opcode="boost_seeingColor")
305
+ BOOST_WHENTILTED = BlockShape(opcode="boost_whenTilted")
306
+ BOOST_GETTILTANGLE = BlockShape(opcode="boost_getTiltAngle")
307
+ BOOST_SETLIGHTHUE = BlockShape(opcode="boost_setLightHue")
308
+ BOOST_MENU_MOTOR_ID = BlockShape(opcode="boost_menu_MOTOR_ID")
309
+ BOOST_MENU_MOTOR_DIRECTION = BlockShape(opcode="boost_menu_MOTOR_DIRECTION")
310
+ BOOST_MENU_MOTOR_REPORTER_ID = BlockShape(opcode="boost_menu_MOTOR_REPORTER_ID")
311
+ BOOST_MENU_COLOR = BlockShape(opcode="boost_menu_COLOR")
312
+ BOOST_MENU_TILT_DIRECTION_ANY = BlockShape(opcode="boost_menu_TILT_DIRECTION_ANY")
313
+ BOOST_MENU_TILT_DIRECTION = BlockShape(opcode="boost_menu_TILT_DIRECTION")
314
+
315
+ WEDO2_MOTORONFOR = BlockShape(opcode="wedo2_motorOnFor")
316
+ WEDO2_MOTORON = BlockShape(opcode="wedo2_motorOn")
317
+ WEDO2_MOTOROFF = BlockShape(opcode="wedo2_motorOff")
318
+ WEDO2_STARTMOTORPOWER = BlockShape(opcode="wedo2_startMotorPower")
319
+ WEDO2_SETMOTORDIRECTION = BlockShape(opcode="wedo2_setMotorDirection")
320
+ WEDO2_SETLIGHTHUE = BlockShape(opcode="wedo2_setLightHue")
321
+ WEDO2_WHENDISTANCE = BlockShape(opcode="wedo2_whenDistance")
322
+ WEDO2_WHENTILTED = BlockShape(opcode="wedo2_whenTilted")
323
+ WEDO2_GETDISTANCE = BlockShape(opcode="wedo2_getDistance")
324
+ WEDO2_ISTILTED = BlockShape(opcode="wedo2_isTilted")
325
+ WEDO2_GETTILTANGLE = BlockShape(opcode="wedo2_getTiltAngle")
326
+ WEDO2_PLAYNOTEFOR = BlockShape(opcode="wedo2_playNoteFor")
327
+ WEDO2_MENU_MOTOR_ID = BlockShape(opcode="wedo2_menu_MOTOR_ID")
328
+ WEDO2_MENU_MOTOR_DIRECTION = BlockShape(opcode="wedo2_menu_MOTOR_DIRECTION")
329
+ WEDO2_MENU_OP = BlockShape(opcode="wedo2_menu_OP")
330
+ WEDO2_MENU_TILT_DIRECTION_ANY = BlockShape(opcode="wedo2_menu_TILT_DIRECTION_ANY")
331
+ WEDO2_MENU_TILT_DIRECTION = BlockShape(opcode="wedo2_menu_TILT_DIRECTION")
332
+
333
+ GDXFOR_WHENGESTURE = BlockShape(opcode="gdxfor_whenGesture")
334
+ GDXFOR_WHENFORCEPUSHEDORPULLED = BlockShape(opcode="gdxfor_whenForcePushedOrPulled")
335
+ GDXFOR_GETFORCE = BlockShape(opcode="gdxfor_getForce")
336
+ GDXFOR_WHENTILTED = BlockShape(opcode="gdxfor_whenTilted")
337
+ GDXFOR_ISTILTED = BlockShape(opcode="gdxfor_isTilted")
338
+ GDXFOR_GETTILT = BlockShape(opcode="gdxfor_getTilt")
339
+ GDXFOR_ISFREEFALLING = BlockShape(opcode="gdxfor_isFreeFalling")
340
+ GDXFOR_GETSPINSPEED = BlockShape(opcode="gdxfor_getSpinSpeed")
341
+ GDXFOR_GETACCELERATION = BlockShape(opcode="gdxfor_getAcceleration")
342
+ GDXFOR_MENU_GESTUREOPTIONS = BlockShape(opcode="gdxfor_menu_gestureOptions")
343
+ GDXFOR_MENU_PUSHPULLOPTIONS = BlockShape(opcode="gdxfor_menu_pushPullOptions")
344
+ GDXFOR_MENU_TILTANYOPTIONS = BlockShape(opcode="gdxfor_menu_tiltAnyOptions")
345
+ GDXFOR_MENU_TILTOPTIONS = BlockShape(opcode="gdxfor_menu_tiltOptions")
346
+ GDXFOR_MENU_AXISOPTIONS = BlockShape(opcode="gdxfor_menu_axisOptions")
347
+
348
+ COREEXAMPLE_EXAMPLEOPCODE = BlockShape(is_reporter=True, opcode="coreExample_exampleOpcode")
349
+ COREEXAMPLE_EXAMPLEWITHINLINEIMAGE = BlockShape(is_stack=True, opcode="coreExample_exampleWithInlineImage")
350
+
351
+ NOTE = BlockShape(is_reporter=True, is_menu=True, opcode="note")
352
+ MATRIX = BlockShape(is_reporter=True, is_menu=True, opcode="matrix")
353
+ UNDEFINED = BlockShape(is_hat=True, is_cap=True, opcode="red_hat_block")
@@ -0,0 +1,47 @@
1
+ """
2
+ Module which stores the 'default' or 'current' selected Sprite/project (stored as a stack) which makes it easier to write scratch code directly in Python
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from typing import Iterable, TYPE_CHECKING, Final
7
+
8
+ if TYPE_CHECKING:
9
+ from . import sprite, block, prim, comment
10
+ from . import commons
11
+
12
+
13
+ class _SetSprite(commons.Singleton):
14
+ def __repr__(self):
15
+ return f'<Reminder to default your sprite to {current_sprite()}>'
16
+
17
+
18
+ SPRITE_DEFAULT: Final[_SetSprite] = _SetSprite()
19
+
20
+ _sprite_stack: list[sprite.Sprite] = []
21
+
22
+
23
+ def stack_add_sprite(_sprite: sprite.Sprite):
24
+ _sprite_stack.append(_sprite)
25
+
26
+
27
+ def current_sprite() -> sprite.Sprite | None:
28
+ if len(_sprite_stack) == 0:
29
+ return None
30
+ return _sprite_stack[-1]
31
+
32
+
33
+ def pop_sprite(_sprite: sprite.Sprite) -> sprite.Sprite | None:
34
+ assert _sprite_stack.pop() == _sprite
35
+ return _sprite
36
+
37
+
38
+ def add_block(_block: block.Block | prim.Prim) -> block.Block | prim.Prim:
39
+ return current_sprite().add_block(_block)
40
+
41
+
42
+ def add_chain(*chain: Iterable[block.Block, prim.Prim]) -> block.Block | prim.Prim:
43
+ return current_sprite().add_chain(*chain)
44
+
45
+
46
+ def add_comment(_comment: comment.Comment):
47
+ return current_sprite().add_comment(_comment)
@@ -0,0 +1,74 @@
1
+ from __future__ import annotations
2
+
3
+ from . import base, block, sprite, build_defaulting
4
+ from typing import Optional
5
+
6
+
7
+ class Comment(base.IDComponent):
8
+ def __init__(self, _id: Optional[str] = None, _block: Optional[block.Block] = None, x: int = 0, y: int = 0, width: int = 200,
9
+ height: int = 200, minimized: bool = False, text: str = '', *, _block_id: Optional[str] = None,
10
+ _sprite: sprite.Sprite = build_defaulting.SPRITE_DEFAULT, pos: Optional[tuple[int, int]] = None):
11
+ self.block = _block
12
+ self._block_id = _block_id
13
+ """
14
+ ID of connected block. Will be set to None upon sprite initialization when the block attribute is updated to the relevant Block.
15
+ """
16
+ if pos is not None:
17
+ x, y = pos
18
+
19
+ self.x = x
20
+ self.y = y
21
+
22
+ self.width = width
23
+ self.height = height
24
+
25
+ self.minimized = minimized
26
+ self.text = text
27
+
28
+ super().__init__(_id, _sprite)
29
+
30
+ def __repr__(self):
31
+ return f"Comment<{self.text[:10]!r}...>"
32
+
33
+ @property
34
+ def block_id(self):
35
+ if self.block is not None:
36
+ return self.block.id
37
+ elif self._block_id is not None:
38
+ return self._block_id
39
+ else:
40
+ return None
41
+
42
+ @staticmethod
43
+ def from_json(data: tuple[str, dict]):
44
+ assert len(data) == 2
45
+ _id, data = data
46
+
47
+ _block_id = data.get("blockId")
48
+
49
+ x = data.get("x", 0)
50
+ y = data.get("y", 0)
51
+
52
+ width = data.get("width", 100)
53
+ height = data.get("height", 100)
54
+
55
+ minimized = data.get("minimized", False)
56
+ text = data.get("text")
57
+
58
+ ret = Comment(_id, None, x, y, width, height, minimized, text, _block_id=_block_id)
59
+ return ret
60
+
61
+ def to_json(self) -> dict:
62
+ return {
63
+ "blockId": self.block_id,
64
+ "x": self.x, "y": self.y,
65
+ "width": self.width, "height": self.height,
66
+ "minimized": self.minimized,
67
+ "text": self.text,
68
+ }
69
+
70
+ def link_using_sprite(self):
71
+ if self._block_id is not None:
72
+ self.block = self.sprite.find_block(self._block_id, "id")
73
+ if self.block is not None:
74
+ self._block_id = None