From 12369cd5c8d2438c34ebb75b67ce34925f37f8af Mon Sep 17 00:00:00 2001 From: Alan Smith Date: Tue, 16 Sep 2025 21:20:47 -0400 Subject: [PATCH 1/8] First pass of removing robot from init in opmodes --- src/blocks/mrc_class_method_def.ts | 6 ++- src/modules/opmode_start.json | 10 +---- src/storage/project.ts | 5 +-- src/storage/upgrade_project.ts | 71 ++++++++++++++++++++++++++---- 4 files changed, 70 insertions(+), 22 deletions(-) diff --git a/src/blocks/mrc_class_method_def.ts b/src/blocks/mrc_class_method_def.ts index 952ec811..29dec45c 100644 --- a/src/blocks/mrc_class_method_def.ts +++ b/src/blocks/mrc_class_method_def.ts @@ -39,7 +39,7 @@ export const BLOCK_NAME = 'mrc_class_method_def'; export const FIELD_METHOD_NAME = 'NAME'; -type Parameter = { +export type Parameter = { name: string, type?: string, }; @@ -447,6 +447,10 @@ export const pythonFromBlock = function ( } } + if (generator.getModuleType() === storageModule.ModuleType.OPMODE && block.mrcPythonMethodName === '__init__') { + paramString = 'robot'; + } + if (params.length != 0) { block.mrcParameters.forEach((param) => { paramString += ', ' + param.name; diff --git a/src/modules/opmode_start.json b/src/modules/opmode_start.json index 979584e4..96944187 100644 --- a/src/modules/opmode_start.json +++ b/src/modules/opmode_start.json @@ -26,17 +26,11 @@ "canBeCalledWithinClass": false, "canBeCalledOutsideClass": false, "returnType": "None", - "params": [ - { - "name": "robot", - "type": "Robot" - } - ], + "params": [], "pythonMethodName": "__init__" }, "fields": { - "NAME": "init", - "PARAM_robot": "robot" + "NAME": "init" } }, { diff --git a/src/storage/project.ts b/src/storage/project.ts index 153051f1..7e616ac0 100644 --- a/src/storage/project.ts +++ b/src/storage/project.ts @@ -25,7 +25,7 @@ import * as commonStorage from './common_storage'; import * as storageModule from './module'; import * as storageModuleContent from './module_content'; import * as storageNames from './names'; -import { upgradeProjectIfNecessary } from './upgrade_project'; +import { upgradeProjectIfNecessary, CURRENT_VERSION, NO_VERSION } from './upgrade_project'; // Types, constants, and functions related to projects, regardless of where the projects are stored. @@ -36,9 +36,6 @@ export type Project = { opModes: storageModule.OpMode[], }; -const NO_VERSION = '0.0.0'; -export const CURRENT_VERSION = '0.0.2'; - export type ProjectInfo = { version: string, }; diff --git a/src/storage/upgrade_project.ts b/src/storage/upgrade_project.ts index 4cfaae75..6758f3d9 100644 --- a/src/storage/upgrade_project.ts +++ b/src/storage/upgrade_project.ts @@ -28,37 +28,45 @@ import * as storageModule from './module'; import * as storageModuleContent from './module_content'; import * as storageNames from './names'; import * as storageProject from './project'; +import { ClassMethodDefBlock, Parameter, BLOCK_NAME as MRC_CLASS_METHOD_DEF_BLOCK_NAME } from '../blocks/mrc_class_method_def'; +export const NO_VERSION = '0.0.0'; +export const CURRENT_VERSION = '0.0.3'; export async function upgradeProjectIfNecessary( - storage: commonStorage.Storage, projectName: string): Promise { + storage: commonStorage.Storage, projectName: string): Promise { const projectInfo = await storageProject.fetchProjectInfo(storage, projectName); - if (semver.lt(projectInfo.version, storageProject.CURRENT_VERSION)) { + if (semver.lt(projectInfo.version, CURRENT_VERSION)) { switch (projectInfo.version) { // @ts-ignore case '0.0.0': upgradeFrom_000_to_001(storage, projectName, projectInfo) - // Intentional fallthrough + // Intentional fallthrough + // @ts-ignore case '0.0.1': upgradeFrom_001_to_002(storage, projectName, projectInfo); + case '0.0.2': + // @ts-ignore + upgradeFrom_002_to_003(storage, projectName, projectInfo); + } await storageProject.saveProjectInfo(storage, projectName); } } async function upgradeFrom_000_to_001( - _storage: commonStorage.Storage, - _projectName: string, - projectInfo: storageProject.ProjectInfo): Promise { + _storage: commonStorage.Storage, + _projectName: string, + projectInfo: storageProject.ProjectInfo): Promise { // Project was saved without a project.info.json file. // Nothing needs to be done to upgrade to '0.0.1'; projectInfo.version = '0.0.1'; } async function upgradeFrom_001_to_002( - storage: commonStorage.Storage, - projectName: string, - projectInfo: storageProject.ProjectInfo): Promise { + storage: commonStorage.Storage, + projectName: string, + projectInfo: storageProject.ProjectInfo): Promise { // Modules were saved without private components. // The Robot's mrc_mechanism_component_holder block was saved without hidePrivateComponents. const projectFileNames: string[] = await storage.list( @@ -92,3 +100,48 @@ async function upgradeFrom_001_to_002( } projectInfo.version = '0.0.2'; } + +async function upgradeFrom_002_to_003( + storage: commonStorage.Storage, + projectName: string, + projectInfo: storageProject.ProjectInfo): Promise { + // Opmodes had robot as a parameter to init method + const projectFileNames: string[] = await storage.list( + storageNames.makeProjectDirectoryPath(projectName)); + + for (const projectFileName of projectFileNames) { + const modulePath = storageNames.makeFilePath(projectName, projectFileName); + + if (storageNames.getModuleType(modulePath) === storageModule.ModuleType.OPMODE) { + let moduleContentText = await storage.fetchFileContentText(modulePath); + const moduleContent = storageModuleContent.parseModuleContentText(moduleContentText); + let blocks = moduleContent.getBlocks(); + + // Create a temporary workspace to upgrade the blocks + const headlessWorkspace = new Blockly.Workspace(); + try { + Blockly.serialization.workspaces.load(blocks, headlessWorkspace); + + // Find and modify init method blocks to remove robot parameter + const allBlocks = headlessWorkspace.getAllBlocks(); + for (const block of allBlocks) { + if (block.type === MRC_CLASS_METHOD_DEF_BLOCK_NAME && + block.getFieldValue('NAME') === 'init') { + // Remove robot parameter from init method + const methodBlock = block as ClassMethodDefBlock; + let filteredParams: Parameter[] = methodBlock.mrcParameters.filter(param => param.name !== 'robot'); + methodBlock.mrcParameters = filteredParams; + } + } + blocks = Blockly.serialization.workspaces.save(headlessWorkspace); + } finally { + headlessWorkspace.dispose(); + } + + moduleContent.setBlocks(blocks); + moduleContentText = moduleContent.getModuleContentText(); + await storage.saveFile(modulePath, moduleContentText); + } + } + projectInfo.version = '0.0.3'; +} \ No newline at end of file From 522f74af4c857bb5591a2be3a356f6a407085f7d Mon Sep 17 00:00:00 2001 From: Alan Smith Date: Tue, 16 Sep 2025 21:24:40 -0400 Subject: [PATCH 2/8] Get rid of leftover extra ignore --- src/storage/upgrade_project.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/storage/upgrade_project.ts b/src/storage/upgrade_project.ts index 6758f3d9..882afe3a 100644 --- a/src/storage/upgrade_project.ts +++ b/src/storage/upgrade_project.ts @@ -46,7 +46,6 @@ export async function upgradeProjectIfNecessary( case '0.0.1': upgradeFrom_001_to_002(storage, projectName, projectInfo); case '0.0.2': - // @ts-ignore upgradeFrom_002_to_003(storage, projectName, projectInfo); } From acbbd713e2bf2991ee7324697d3810989312cad4 Mon Sep 17 00:00:00 2001 From: Alan Smith Date: Fri, 19 Sep 2025 08:23:13 -0400 Subject: [PATCH 3/8] Move upgrade details of mrc_class_method into the block --- src/blocks/mrc_class_method_def.ts | 10 +++++++++- src/storage/upgrade_project.ts | 17 +++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/blocks/mrc_class_method_def.ts b/src/blocks/mrc_class_method_def.ts index 29dec45c..feb26ab7 100644 --- a/src/blocks/mrc_class_method_def.ts +++ b/src/blocks/mrc_class_method_def.ts @@ -39,7 +39,7 @@ export const BLOCK_NAME = 'mrc_class_method_def'; export const FIELD_METHOD_NAME = 'NAME'; -export type Parameter = { +type Parameter = { name: string, type?: string, }; @@ -322,6 +322,14 @@ const CLASS_METHOD_DEF = { this.mrcMethodId = oldIdToNewId[this.mrcMethodId]; } }, + upgrade_002_to_003: function(this: ClassMethodDefBlock) { + if (this.getFieldValue('NAME') === 'init') { + // Remove robot parameter from init method + const methodBlock = this as ClassMethodDefBlock; + let filteredParams: Parameter[] = methodBlock.mrcParameters.filter(param => param.name !== 'robot'); + methodBlock.mrcParameters = filteredParams; + } + }, }; /** diff --git a/src/storage/upgrade_project.ts b/src/storage/upgrade_project.ts index 882afe3a..1c90f19f 100644 --- a/src/storage/upgrade_project.ts +++ b/src/storage/upgrade_project.ts @@ -28,7 +28,7 @@ import * as storageModule from './module'; import * as storageModuleContent from './module_content'; import * as storageNames from './names'; import * as storageProject from './project'; -import { ClassMethodDefBlock, Parameter, BLOCK_NAME as MRC_CLASS_METHOD_DEF_BLOCK_NAME } from '../blocks/mrc_class_method_def'; +import { ClassMethodDefBlock, BLOCK_NAME as MRC_CLASS_METHOD_DEF_BLOCK_NAME } from '../blocks/mrc_class_method_def'; export const NO_VERSION = '0.0.0'; export const CURRENT_VERSION = '0.0.3'; @@ -121,17 +121,10 @@ async function upgradeFrom_002_to_003( try { Blockly.serialization.workspaces.load(blocks, headlessWorkspace); - // Find and modify init method blocks to remove robot parameter - const allBlocks = headlessWorkspace.getAllBlocks(); - for (const block of allBlocks) { - if (block.type === MRC_CLASS_METHOD_DEF_BLOCK_NAME && - block.getFieldValue('NAME') === 'init') { - // Remove robot parameter from init method - const methodBlock = block as ClassMethodDefBlock; - let filteredParams: Parameter[] = methodBlock.mrcParameters.filter(param => param.name !== 'robot'); - methodBlock.mrcParameters = filteredParams; - } - } + // Method blocks need to be upgraded + headlessWorkspace.getBlocksByType(MRC_CLASS_METHOD_DEF_BLOCK_NAME, false).forEach(block => { + (block as ClassMethodDefBlock).upgrade_002_to_003(); + }); blocks = Blockly.serialization.workspaces.save(headlessWorkspace); } finally { headlessWorkspace.dispose(); From 403e3208059466614864e0f6df0c161e27dbae32 Mon Sep 17 00:00:00 2001 From: Alan Smith Date: Fri, 19 Sep 2025 08:24:44 -0400 Subject: [PATCH 4/8] address review comment --- src/storage/upgrade_project.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/upgrade_project.ts b/src/storage/upgrade_project.ts index 1c90f19f..e049ad03 100644 --- a/src/storage/upgrade_project.ts +++ b/src/storage/upgrade_project.ts @@ -34,7 +34,7 @@ export const NO_VERSION = '0.0.0'; export const CURRENT_VERSION = '0.0.3'; export async function upgradeProjectIfNecessary( - storage: commonStorage.Storage, projectName: string): Promise { + storage: commonStorage.Storage, projectName: string): Promise { const projectInfo = await storageProject.fetchProjectInfo(storage, projectName); if (semver.lt(projectInfo.version, CURRENT_VERSION)) { switch (projectInfo.version) { From 60d4058cab4353b5966216ce8bcfb30ba377be8b Mon Sep 17 00:00:00 2001 From: Alan Smith Date: Fri, 19 Sep 2025 08:27:01 -0400 Subject: [PATCH 5/8] Fix space issue --- src/storage/upgrade_project.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/upgrade_project.ts b/src/storage/upgrade_project.ts index e049ad03..115813bb 100644 --- a/src/storage/upgrade_project.ts +++ b/src/storage/upgrade_project.ts @@ -34,7 +34,7 @@ export const NO_VERSION = '0.0.0'; export const CURRENT_VERSION = '0.0.3'; export async function upgradeProjectIfNecessary( - storage: commonStorage.Storage, projectName: string): Promise { + storage: commonStorage.Storage, projectName: string): Promise { const projectInfo = await storageProject.fetchProjectInfo(storage, projectName); if (semver.lt(projectInfo.version, CURRENT_VERSION)) { switch (projectInfo.version) { From 804650bf64e44631d61767452d949d8892fce303 Mon Sep 17 00:00:00 2001 From: Alan Smith Date: Fri, 19 Sep 2025 08:29:07 -0400 Subject: [PATCH 6/8] Fix spaces --- src/storage/upgrade_project.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/storage/upgrade_project.ts b/src/storage/upgrade_project.ts index 115813bb..adb41c94 100644 --- a/src/storage/upgrade_project.ts +++ b/src/storage/upgrade_project.ts @@ -54,18 +54,18 @@ export async function upgradeProjectIfNecessary( } async function upgradeFrom_000_to_001( - _storage: commonStorage.Storage, - _projectName: string, - projectInfo: storageProject.ProjectInfo): Promise { + _storage: commonStorage.Storage, + _projectName: string, + projectInfo: storageProject.ProjectInfo): Promise { // Project was saved without a project.info.json file. // Nothing needs to be done to upgrade to '0.0.1'; projectInfo.version = '0.0.1'; } async function upgradeFrom_001_to_002( - storage: commonStorage.Storage, - projectName: string, - projectInfo: storageProject.ProjectInfo): Promise { + storage: commonStorage.Storage, + projectName: string, + projectInfo: storageProject.ProjectInfo): Promise { // Modules were saved without private components. // The Robot's mrc_mechanism_component_holder block was saved without hidePrivateComponents. const projectFileNames: string[] = await storage.list( @@ -136,4 +136,4 @@ async function upgradeFrom_002_to_003( } } projectInfo.version = '0.0.3'; -} \ No newline at end of file +} From 66f755a6259f6dd7d08395d33bfd00d531881c42 Mon Sep 17 00:00:00 2001 From: Alan Smith Date: Fri, 19 Sep 2025 08:30:41 -0400 Subject: [PATCH 7/8] Fix spacing --- src/storage/upgrade_project.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/storage/upgrade_project.ts b/src/storage/upgrade_project.ts index adb41c94..a4e9c7bd 100644 --- a/src/storage/upgrade_project.ts +++ b/src/storage/upgrade_project.ts @@ -54,18 +54,18 @@ export async function upgradeProjectIfNecessary( } async function upgradeFrom_000_to_001( - _storage: commonStorage.Storage, - _projectName: string, - projectInfo: storageProject.ProjectInfo): Promise { + _storage: commonStorage.Storage, + _projectName: string, + projectInfo: storageProject.ProjectInfo): Promise { // Project was saved without a project.info.json file. // Nothing needs to be done to upgrade to '0.0.1'; projectInfo.version = '0.0.1'; } async function upgradeFrom_001_to_002( - storage: commonStorage.Storage, - projectName: string, - projectInfo: storageProject.ProjectInfo): Promise { + storage: commonStorage.Storage, + projectName: string, + projectInfo: storageProject.ProjectInfo): Promise { // Modules were saved without private components. // The Robot's mrc_mechanism_component_holder block was saved without hidePrivateComponents. const projectFileNames: string[] = await storage.list( @@ -101,9 +101,9 @@ async function upgradeFrom_001_to_002( } async function upgradeFrom_002_to_003( - storage: commonStorage.Storage, - projectName: string, - projectInfo: storageProject.ProjectInfo): Promise { + storage: commonStorage.Storage, + projectName: string, + projectInfo: storageProject.ProjectInfo): Promise { // Opmodes had robot as a parameter to init method const projectFileNames: string[] = await storage.list( storageNames.makeProjectDirectoryPath(projectName)); From f1741b34e89bb035ec7e17fbbffcc99850c31070 Mon Sep 17 00:00:00 2001 From: Alan Smith Date: Fri, 19 Sep 2025 13:07:05 -0400 Subject: [PATCH 8/8] Change spaces --- src/storage/upgrade_project.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/storage/upgrade_project.ts b/src/storage/upgrade_project.ts index a4e9c7bd..1804d9c7 100644 --- a/src/storage/upgrade_project.ts +++ b/src/storage/upgrade_project.ts @@ -101,9 +101,9 @@ async function upgradeFrom_001_to_002( } async function upgradeFrom_002_to_003( - storage: commonStorage.Storage, - projectName: string, - projectInfo: storageProject.ProjectInfo): Promise { + storage: commonStorage.Storage, + projectName: string, + projectInfo: storageProject.ProjectInfo): Promise { // Opmodes had robot as a parameter to init method const projectFileNames: string[] = await storage.list( storageNames.makeProjectDirectoryPath(projectName));