import json def update_and_clean_blocks(all_generated_blocks, generated_output_blocks): """ Updates the generated_output_blocks with values from all_generated_blocks and removes specified keys from the updated blocks. Args: all_generated_blocks (dict): The dictionary containing all generated block data. generated_output_blocks (dict): The dictionary to be updated and cleaned. Returns: dict: The updated and cleaned dictionary. """ keys_to_remove = ["functionality", "block_shape", "id", "block_name", "block_type"] updated_blocks = {} for block_id, generated_block_data in generated_output_blocks.items(): if block_id in all_generated_blocks: all_block_data = all_generated_blocks[block_id] # Create a new dictionary for the updated block, including only desired fields current_updated_block = {} for key, value in generated_block_data.items(): if key not in keys_to_remove: current_updated_block[key] = value # Update specific values from all_generated_blocks if they exist # and are not among the keys to be removed if "next" in all_block_data and "next" not in keys_to_remove: current_updated_block["next"] = all_block_data["next"] if "parent" in all_block_data and "parent" not in keys_to_remove: current_updated_block["parent"] = all_block_data["parent"] if "topLevel" in all_block_data and "topLevel" not in keys_to_remove: current_updated_block["topLevel"] = all_block_data["topLevel"] updated_blocks[block_id] = current_updated_block else: # If a block_id from generated_output_blocks is not in all_generated_blocks, # just clean it current_updated_block = {} for key, value in generated_block_data.items(): if key not in keys_to_remove: current_updated_block[key] = value updated_blocks[block_id] = current_updated_block return updated_blocks # Load the provided JSON data all_generated_blocks = { "event_whenflagclicked_1": { "block_name": "when green flag pressed", "block_type": "Events", "op_code": "event_whenflagclicked", "block_shape": "Hat Block", "functionality": "This Hat block initiates the script when the green flag is clicked, serving as the common starting point for most Scratch projects.", "inputs": {}, "fields": {}, "shadow": False, "topLevel": True, "id": "event_whenflagclicked_1", "next": "data_setvariableto_1", "parent": None }, "data_setvariableto_1": { "block_name": "set [my variable v] to ()", "block_type": "Data", "block_shape": "Stack Block", "op_code": "data_setvariableto", "functionality": "Assigns a specific value (number, string, or boolean) to a variable.", "inputs": { "VALUE": { "kind": "value", "value": 0 } }, "fields": { "VARIABLE": [ "score", None ] }, "shadow": False, "topLevel": False, "id": "data_setvariableto_1", "next": "control_forever_1", "parent": "event_whenflagclicked_1" }, "data_setvariableto_2": { "block_name": "set [my variable v] to ()", "block_type": "Data", "block_shape": "Stack Block", "op_code": "data_setvariableto", "functionality": "Assigns a specific value (number, string, or boolean) to a variable.", "inputs": { "VALUE": [ 1, [ 10, "0" ] ] }, "fields": { "VARIABLE": [ "my variable", "`jEk@4|i[#Fk?(8x)AV.-my variable" ] }, "shadow": False, "topLevel": False, "parent": None, "next": None }, "control_forever_1": { "block_name": "forever", "block_type": "Control", "block_shape": "C-Block", "op_code": "control_forever", "functionality": "Continuously runs the blocks inside it.", "inputs": { "SUBSTACK": [ 2, "control_if_1" ] }, "fields": {}, "shadow": False, "topLevel": False, "id": "control_forever_1", "next": None, "parent": "event_whenflagclicked_1" }, "control_if_1": { "block_name": "if <> then", "block_type": "Control", "block_shape": "C-Block", "op_code": "control_if", "functionality": "Executes the blocks inside it only if the specified boolean condition is true. [NOTE: it takes boolean blocks as input]", "inputs": { "CONDITION": { "kind": "block", "block": "sensing_touchingobject_1" }, "SUBSTACK": [ 2, "data_changevariableby_1" ] }, "fields": {}, "shadow": False, "topLevel": False, "id": "control_if_1", "next": None, "parent": "control_forever_1" }, "control_wait_1": { "block_name": "wait () seconds", "block_type": "Control", "block_shape": "Stack Block", "op_code": "control_wait", "functionality": "Pauses the script for a specified duration.", "inputs": { "DURATION": { "kind": "value", "value": 0.1 } }, "fields": {}, "shadow": False, "topLevel": False, "id": "control_wait_1", "next": None, "parent": "control_if_1" }, "sensing_touchingobject_1": { "block_name": "", "block_type": "Sensing", "op_code": "sensing_touchingobject", "block_shape": "Boolean Block", "functionality": "Checks if its sprite is touching the mouse-pointer, edge, or another specified sprite.", "inputs": { "TOUCHINGOBJECTMENU": [ 1, "sensing_touchingobjectmenu_1" ] }, "fields": {}, "shadow": False, "topLevel": False, "id": "sensing_touchingobject_1", "parent": "control_if_1", "next": None }, "sensing_touchingobjectmenu_1": { "block_name": "touching object menu", "block_type": "Sensing", "block_shape": "Reporter Block", "op_code": "sensing_touchingobjectmenu", "functionality": "Menu for touching object block.", "inputs": {}, "fields": { "TOUCHINGOBJECTMENU": [ "other sprite", None ] }, "shadow": True, "topLevel": False, "id": "sensing_touchingobjectmenu_1", "parent": "sensing_touchingobject_1", "next": None }, "data_changevariableby_1": { "block_name": "change [my variable v] by ()", "block_type": "Data", "block_shape": "Stack Block", "op_code": "data_changevariableby", "functionality": "Increases or decreases a variable's numerical value by a specified amount.", "inputs": { "VALUE": { "kind": "value", "value": -1 } }, "fields": { "VARIABLE": [ "score", None ] }, "shadow": False, "topLevel": False, "id": "data_changevariableby_1", "next": "control_wait_1", "parent": "control_if_1" } } generated_output_blocks = { "event_whenflagclicked_1": { "block_name": "when green flag pressed", "block_type": "Events", "op_code": "event_whenflagclicked", "block_shape": "Hat Block", "functionality": "This Hat block initiates the script when the green flag is clicked, serving as the common starting point for most Scratch projects.", "inputs": {}, "fields": {}, "shadow": False, "topLevel": True, "parent": None, "next": None }, "data_setvariableto_1": { "block_name": "set [my variable v] to ()", "block_type": "Data", "block_shape": "Stack Block", "op_code": "data_setvariableto", "functionality": "Assigns a specific value (number, string, or boolean) to a variable.", "inputs": { "VALUE": [ 1, [ 10, "0" ] ] }, "fields": { "VARIABLE": [ "my variable", "`jEk@4|i[#Fk?(8x)AV.-my variable" ] }, "shadow": False, "topLevel": True, "parent": None, "next": None }, "data_setvariableto_2": { "block_name": "set [my variable v] to ()", "block_type": "Data", "block_shape": "Stack Block", "op_code": "data_setvariableto", "functionality": "Assigns a specific value (number, string, or boolean) to a variable.", "inputs": { "VALUE": [ 1, [ 10, "0" ] ] }, "fields": { "VARIABLE": [ "my variable", "`jEk@4|i[#Fk?(8x)AV.-my variable" ] }, "shadow": False, "topLevel": True, "parent": None, "next": None }, "control_forever_1": { "block_name": "forever", "block_type": "Control", "block_shape": "C-Block", "op_code": "control_forever", "functionality": "Continuously runs the blocks inside it.", "inputs": { "SUBSTACK": [ 2, None ] }, "fields": {}, "shadow": False, "topLevel": True, "parent": None, "next": None }, "control_if_1": { "block_name": "if <> then", "block_type": "Control", "block_shape": "C-Block", "op_code": "control_if", "functionality": "Executes the blocks inside it only if the specified boolean condition is true. [NOTE: it takes boolean blocks as input]", "inputs": { "CONDITION": [ 2, None ], "SUBSTACK": [ 2, None ] }, "fields": {}, "shadow": False, "topLevel": True, "parent": None, "next": None }, "control_wait_1": { "block_name": "wait () seconds", "block_type": "Control", "block_shape": "Stack Block", "op_code": "control_wait", "functionality": "Pauses the script for a specified duration.", "inputs": { "DURATION": [ 1, [ 5, "1" ] ] }, "fields": {}, "shadow": False, "topLevel": True, "parent": None, "next": None }, "sensing_touchingobject_1": { "block_name": "", "block_type": "Sensing", "op_code": "sensing_touchingobject", "block_shape": "Boolean Block", "functionality": "Checks if its sprite is touching the mouse-pointer, edge, or another specified sprite.", "inputs": { "TOUCHINGOBJECTMENU": [ 1, "sensing_touchingobjectmenu_1" ] }, "fields": {}, "shadow": False, "topLevel": True, "parent": None, "next": None }, "sensing_touchingobjectmenu_1": { "block_name": "touching object menu", "block_type": "Sensing", "block_shape": "Reporter Block", "op_code": "sensing_touchingobjectmenu", "functionality": "Menu for touching object block.", "inputs": {}, "fields": { "TOUCHINGOBJECTMENU": [ "_mouse_", None ] }, "shadow": True, "topLevel": False, "next": None, "parent": "sensing_touchingobject_1" } } # Process the blocks processed_blocks = update_and_clean_blocks(all_generated_blocks, generated_output_blocks) # Print the processed blocks in a readable JSON format print(json.dumps(processed_blocks, indent=2))