From e795fb23520e2bb623c4a65a87bffb46373c7424 Mon Sep 17 00:00:00 2001 From: Ivan Vigliante Date: Tue, 16 Mar 2021 19:43:54 -0600 Subject: [PATCH 1/9] Added separation of model and view for provider --- .../generators/middleware/middleware.dart | 10 ------- .../state_management/provider_middleware.dart | 28 +++++++++++++++++++ .../state_management/stateful_middleware.dart | 4 +-- .../utils/middleware_utils.dart | 27 ++++++++++++++++++ .../pb_file_structure_strategy.dart | 3 ++ 5 files changed, 60 insertions(+), 12 deletions(-) diff --git a/lib/generation/generators/middleware/middleware.dart b/lib/generation/generators/middleware/middleware.dart index a5cbe84a..2dae49c7 100644 --- a/lib/generation/generators/middleware/middleware.dart +++ b/lib/generation/generators/middleware/middleware.dart @@ -35,14 +35,4 @@ abstract class Middleware { return name + '_' + (++variableNames[name]).toString(); } } - - String wrapOnLayout(String className) { - return ''' - LayoutBuilder(builder: (context, constraints) { - return $className( - constraints, - ); - }) - '''; - } } diff --git a/lib/generation/generators/middleware/state_management/provider_middleware.dart b/lib/generation/generators/middleware/state_management/provider_middleware.dart index 175582f0..257fc4ed 100644 --- a/lib/generation/generators/middleware/state_management/provider_middleware.dart +++ b/lib/generation/generators/middleware/state_management/provider_middleware.dart @@ -5,6 +5,7 @@ import 'package:parabeac_core/generation/generators/pb_variable.dart'; import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/provider_file_structure_strategy.dart'; import 'package:parabeac_core/generation/generators/value_objects/template_strategy/stateless_template_strategy.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_gen_cache.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_symbol_storage.dart'; import 'package:recase/recase.dart'; import 'package:parabeac_core/generation/generators/value_objects/generator_adapter.dart'; @@ -56,8 +57,35 @@ class ProviderMiddleware extends Middleware { generationManager, node, ); + + var parentDirectory = getName(node.name).snakeCase; + + var viewPath = + fileStrategy.getViewPath('${parentDirectory}/' + node.name.snakeCase); + + addImportToCache(node.UUID, viewPath); + node.managerData + .addImport(PBGenCache().getRelativePath(viewPath, node.UUID)); + code = MiddlewareUtils.generateModelChangeNotifier( + watcherName, generationManager, node); fileStrategy.writeProviderModelFile(code, getName(node.name).snakeCase); + // Generate default node's view page + await fileStrategy.generatePage( + await generationManager.generate(node), + '${parentDirectory}/${node.name.snakeCase}', + args: 'VIEW', + ); + + // Generate node's states' view pages + node.auxiliaryData?.stateGraph?.states?.forEach((state) async { + await fileStrategy.generatePage( + await generationManager.generate(state.variation.node), + '${parentDirectory}/${state.variation.node.name.snakeCase}', + args: 'VIEW', + ); + }); + return node; } diff --git a/lib/generation/generators/middleware/state_management/stateful_middleware.dart b/lib/generation/generators/middleware/state_management/stateful_middleware.dart index 915a2f11..3d6f5782 100644 --- a/lib/generation/generators/middleware/state_management/stateful_middleware.dart +++ b/lib/generation/generators/middleware/state_management/stateful_middleware.dart @@ -1,9 +1,9 @@ import 'package:parabeac_core/generation/generators/middleware/middleware.dart'; +import 'package:parabeac_core/generation/generators/middleware/state_management/utils/middleware_utils.dart'; import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart'; import 'package:parabeac_core/generation/generators/value_objects/generator_adapter.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_symbol_storage.dart'; import 'package:recase/recase.dart'; @@ -59,7 +59,7 @@ class StatefulMiddleware extends Middleware { 'var ', true, node.functionCallName == symbolMaster.name - ? wrapOnLayout('${symbolMaster.name.pascalCase}') + ? MiddlewareUtils.wrapOnLayout('${symbolMaster.name.pascalCase}') : null, ); diff --git a/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart b/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart index fd8fe8f9..e00f5fc1 100644 --- a/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart +++ b/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart @@ -62,6 +62,23 @@ class MiddlewareUtils { '''; } + static String generateModelChangeNotifier( + String defaultStateName, + PBGenerationManager manager, + PBIntermediateNode node, + ) { + return ''' + ${manager.generateImports()} + class ${defaultStateName} extends ChangeNotifier { + + Widget defaultWidget; + ${defaultStateName}(){ + defaultWidget = ${MiddlewareUtils.wrapOnLayout(node.name.pascalCase)}; + } + } + '''; + } + static String generateVariable(PBIntermediateNode node, {String type = 'var'}) { return '${type} ${node.name.camelCase} = ' + generateVariableBody(node); @@ -76,4 +93,14 @@ class MiddlewareUtils { GeneratorContext(sizingContext: SizingValueContext.PointValue)) ?? '') + ';'; + + static String wrapOnLayout(String className) { + return ''' + LayoutBuilder(builder: (context, constraints) { + return $className( + constraints, + ); + }) + '''; + } } diff --git a/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart b/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart index 964e100b..5c568b68 100644 --- a/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart +++ b/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart @@ -94,4 +94,7 @@ abstract class FileStructureStrategy { } return Future.value(); } + + String getViewPath(String fileName) => + '${_viewDirectoryPath}${fileName}.dart'; } From 5324aadcfb59d7118c5f6bc991f269d151f6192a Mon Sep 17 00:00:00 2001 From: Ivan Vigliante Date: Wed, 17 Mar 2021 17:36:43 -0600 Subject: [PATCH 2/9] Removed initialization of instance from the model --- .../middleware/state_management/provider_middleware.dart | 7 +------ .../state_management/utils/middleware_utils.dart | 8 +++++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/generation/generators/middleware/state_management/provider_middleware.dart b/lib/generation/generators/middleware/state_management/provider_middleware.dart index 257fc4ed..48505d20 100644 --- a/lib/generation/generators/middleware/state_management/provider_middleware.dart +++ b/lib/generation/generators/middleware/state_management/provider_middleware.dart @@ -60,12 +60,7 @@ class ProviderMiddleware extends Middleware { var parentDirectory = getName(node.name).snakeCase; - var viewPath = - fileStrategy.getViewPath('${parentDirectory}/' + node.name.snakeCase); - - addImportToCache(node.UUID, viewPath); - node.managerData - .addImport(PBGenCache().getRelativePath(viewPath, node.UUID)); + // Write model class for current node code = MiddlewareUtils.generateModelChangeNotifier( watcherName, generationManager, node); fileStrategy.writeProviderModelFile(code, getName(node.name).snakeCase); diff --git a/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart b/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart index e00f5fc1..2d9a0b29 100644 --- a/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart +++ b/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart @@ -71,9 +71,11 @@ class MiddlewareUtils { ${manager.generateImports()} class ${defaultStateName} extends ChangeNotifier { - Widget defaultWidget; - ${defaultStateName}(){ - defaultWidget = ${MiddlewareUtils.wrapOnLayout(node.name.pascalCase)}; + Widget currentWidget; + ${defaultStateName}(){} + + void setCurrentWidget(Widget currentWidget) { + this.currentWidget = currentWidget; } } '''; From 0c26b31d291e1e857927a1ff228af6e87099bab7 Mon Sep 17 00:00:00 2001 From: Ivan Vigliante Date: Thu, 18 Mar 2021 21:32:24 -0600 Subject: [PATCH 3/9] Add way to associate multiple imports to a UUID. This was done for provider to be able to import models and screens. --- .../import_helper.dart | 7 +- .../generators/middleware/middleware.dart | 2 +- .../state_management/provider_middleware.dart | 46 ++++++-- .../generators/pb_generation_manager.dart | 2 +- .../pb_file_structure_strategy.dart | 2 +- .../pb_generation_configuration.dart | 13 ++- .../helpers/pb_gen_cache.dart | 109 ++++++++++-------- test/lib/generation/import_test.dart | 6 +- 8 files changed, 115 insertions(+), 72 deletions(-) diff --git a/lib/generation/flutter_project_builder/import_helper.dart b/lib/generation/flutter_project_builder/import_helper.dart index f0965d47..733741d5 100644 --- a/lib/generation/flutter_project_builder/import_helper.dart +++ b/lib/generation/flutter_project_builder/import_helper.dart @@ -25,10 +25,11 @@ class ImportHelper { id = node.UUID; } - var nodePath = PBGenCache().getPath(id); + var nodePaths = PBGenCache().getPaths(id); // Make sure nodePath exists and is not the same as path (importing yourself) - if (nodePath != null && nodePath.isNotEmpty && path != nodePath) { - imports.add(PBGenCache().getRelativePath(path, id)); + if (nodePaths != null && nodePaths.isNotEmpty) { + var paths = PBGenCache().getRelativePath(path, id); + paths.forEach(imports.add); } // Recurse through child/children and add to imports diff --git a/lib/generation/generators/middleware/middleware.dart b/lib/generation/generators/middleware/middleware.dart index 2dae49c7..486f9400 100644 --- a/lib/generation/generators/middleware/middleware.dart +++ b/lib/generation/generators/middleware/middleware.dart @@ -24,7 +24,7 @@ abstract class Middleware { Future.value(node); void addImportToCache(String id, String path) { - PBGenCache().addToCache(id, path); + PBGenCache().setPathToCache(id, path); } String getVariableName(String name) { diff --git a/lib/generation/generators/middleware/state_management/provider_middleware.dart b/lib/generation/generators/middleware/state_management/provider_middleware.dart index 48505d20..3279972c 100644 --- a/lib/generation/generators/middleware/state_management/provider_middleware.dart +++ b/lib/generation/generators/middleware/state_management/provider_middleware.dart @@ -37,16 +37,41 @@ class ProviderMiddleware extends Middleware { watcher = PBVariable(watcherName, 'final ', true, '${getName(node.functionCallName).pascalCase}().${widgetName}'); managerData.addGlobalVariable(watcher); - } else { - watcher = PBVariable(watcherName, 'final ', true, - 'context.watch<${getName(node.functionCallName).pascalCase}>().${widgetName}'); - managerData.addMethodVariable(watcher); } addImportToCache(node.SYMBOL_ID, getImportPath(node, fileStrategy)); if (node.generator is! StringGeneratorAdapter) { - node.generator = StringGeneratorAdapter(watcherName); + // Add instance import + PBGenCache().appendToCache(node.SYMBOL_ID, + getImportPath(node, fileStrategy, generateModelPath: false)); + var modelName = getName(node.functionCallName).pascalCase; + var defaultWidget = node.functionCallName.pascalCase; + var providerWidget = ''' + ChangeNotifierProvider( + create: (context) => + ${modelName}(), + child: LayoutBuilder( + builder: (context, constraints) { + var widget = ${defaultWidget}(constraints); + + context + .read<${modelName}>() + .setCurrentWidget( + widget); // Setting active state + + return GestureDetector( + onTap: () => context.read< + ${modelName}>(), // TODO: add your method to change the state here + child: context + .watch<${modelName}>() + .currentWidget, + ); + }, + ), + ) + '''; + node.generator = StringGeneratorAdapter(providerWidget); } return node; } @@ -84,11 +109,14 @@ class ProviderMiddleware extends Middleware { return node; } - String getImportPath(PBSharedInstanceIntermediateNode node, fileStrategy) { + String getImportPath(PBSharedInstanceIntermediateNode node, + ProviderFileStructureStrategy fileStrategy, + {bool generateModelPath = true}) { var symbolMaster = PBSymbolStorage().getSharedMasterNodeBySymbolID(node.SYMBOL_ID); - return fileStrategy.GENERATED_PROJECT_PATH + - fileStrategy.RELATIVE_MODEL_PATH + - '${getName(symbolMaster.name).snakeCase}.dart'; + var import = generateModelPath + ? '${fileStrategy.RELATIVE_MODEL_PATH}${getName(symbolMaster.name).snakeCase}.dart' + : '${fileStrategy.RELATIVE_VIEW_PATH}${getName(symbolMaster.name).snakeCase}/${node.functionCallName.snakeCase}.dart'; + return fileStrategy.GENERATED_PROJECT_PATH + import; } } diff --git a/lib/generation/generators/pb_generation_manager.dart b/lib/generation/generators/pb_generation_manager.dart index 8ecdf42d..6bb4f070 100644 --- a/lib/generation/generators/pb_generation_manager.dart +++ b/lib/generation/generators/pb_generation_manager.dart @@ -22,7 +22,7 @@ abstract class PBGenerationManager { String generate(PBIntermediateNode rootNode); - String getPath(String uuid) => PBGenCache().getPath(uuid); + Set getPaths(String uuid) => PBGenCache().getPaths(uuid); String generateImports(); diff --git a/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart b/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart index 5c568b68..c09cbfb7 100644 --- a/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart +++ b/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart @@ -74,7 +74,7 @@ abstract class FileStructureStrategy { var path = node is PBSharedMasterNode ? '${_viewDirectoryPath}${tree.name.snakeCase}/${name}.dart' // Removed .g : '${_screenDirectoryPath}${tree.name.snakeCase}/${name}.dart'; - PBGenCache().addToCache(uuid, path); + PBGenCache().setPathToCache(uuid, path); } else { logger.warning( 'The following intermediateNode was missing a name: ${tree.toString()}'); diff --git a/lib/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart b/lib/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart index 30d3cde6..eaaa8d24 100644 --- a/lib/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart +++ b/lib/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart @@ -140,12 +140,13 @@ abstract class GenerationConfiguration { void _commitImports( PBIntermediateNode node, String directoryName, String fileName) { - var nodePath = PBGenCache() - .getPath(node is PBSharedMasterNode ? node.SYMBOL_ID : node.UUID); - var imports = ImportHelper.findImports(node, nodePath); - imports.forEach((import) { - node.managerData.addImport(import); - }); + var nodePaths = PBGenCache() + .getPaths(node is PBSharedMasterNode ? node.SYMBOL_ID : node.UUID); + var imports = {}; + // Fetch imports for each path + nodePaths.forEach( + (path) => imports.addAll(ImportHelper.findImports(node, path))); + imports.forEach(node.managerData.addImport); } Future _commitDependencies(String projectName) async { diff --git a/lib/interpret_and_optimize/helpers/pb_gen_cache.dart b/lib/interpret_and_optimize/helpers/pb_gen_cache.dart index ae183fe0..40f2b85e 100644 --- a/lib/interpret_and_optimize/helpers/pb_gen_cache.dart +++ b/lib/interpret_and_optimize/helpers/pb_gen_cache.dart @@ -8,11 +8,22 @@ class PBGenCache { factory PBGenCache() => _instance; - //Cache where the key is the doObjectId and the value is the path - Map _cache = {}; + /// Cache where the key is the doObjectId and the value is the paths associated + /// to the doObjectId + Map> _cache = {}; - void addToCache(String doObjectId, String path) { - _cache[doObjectId] = path; + /// Associates `path` to `doObjectId` in this cache. + void setPathToCache(String doObjectId, String path) { + _cache[doObjectId] = {path}; + } + + /// Appends a `path` to `doObjectId` in the cache. + void appendToCache(String doObjectId, String path) { + if (!_cache.containsKey(doObjectId)) { + setPathToCache(doObjectId, path); + } else { + _cache[doObjectId].add(path); + } } void removeFromCache(String doObjectId) { @@ -20,60 +31,62 @@ class PBGenCache { } /// Returns the path of the cache at key [doObjectId] - String getPath(String doObjectId) => _cache[doObjectId]; + Set getPaths(String doObjectId) => _cache[doObjectId] ?? {}; - /// Returns the relative path to get from [filePath] to the path of [doObjectId]. + /// Returns the relative paths to get from [filePath] to the path of [doObjectId]. /// Note: [filePath] must be an absolute path - String getRelativePath(String filePath, String doObjectId) { - String targetPath = _cache[doObjectId]; - if (targetPath == null || targetPath.isEmpty) { + Set getRelativePath(String filePath, String doObjectId) { + var targetPaths = _cache[doObjectId]; + var paths = {}; + if (targetPaths == null || targetPaths.isEmpty) { return null; } - if (filePath == targetPath) { - return ''; - } - - // Tokenize [filePath] and the path to the file of [doObjectId] - List filePathTokens = filePath.split('/') - ..removeLast() - ..removeAt(0); - List targetPathTokens = targetPath.split('/')..removeAt(0); - String targetFileName = targetPathTokens.removeLast(); - - // Get rid of paths that are the same - while (min(filePathTokens.length, targetPathTokens.length) != 0 && - filePathTokens[0] == targetPathTokens[0]) { - filePathTokens.removeAt(0); - targetPathTokens.removeAt(0); - } - // Case for when files are in the same folder - if (filePathTokens.isEmpty && targetPathTokens.isEmpty) { - return './$targetFileName'; - } - // Case for when backtracking is not needed to get to [targetPath] - else if (filePathTokens.isEmpty) { - String result = './'; - for (String folder in targetPathTokens) { - result = '$result$folder/'; + for (var targetPath in targetPaths) { + // Tokenize [filePath] and the path to the file of [doObjectId] + List filePathTokens = filePath.split('/') + ..removeLast() + ..removeAt(0); + if (targetPath == filePath) { + continue; } - return '$result$targetFileName'; - } - // Case for when backtracking is needed to get to [targetPath] - else { - String result = ''; - - // Backtrack - for (int i = 0; i < filePathTokens.length; i++) { - result = '$result../'; + var targetPathTokens = targetPath.split('/')..removeAt(0); + var targetFileName = targetPathTokens.removeLast(); + // Get rid of paths that are the same + while (min(filePathTokens.length, targetPathTokens.length) != 0 && + filePathTokens[0] == targetPathTokens[0]) { + filePathTokens.removeAt(0); + targetPathTokens.removeAt(0); } - // Add necessary folders - for (int i = 0; i < targetPathTokens.length; i++) { - result = '$result${targetPathTokens[i]}/'; + // Case for when files are in the same folder + if (filePathTokens.isEmpty && targetPathTokens.isEmpty) { + paths.add('./$targetFileName'); } + // Case for when backtracking is not needed to get to [targetPath] + else if (filePathTokens.isEmpty) { + String result = './'; + for (String folder in targetPathTokens) { + result = '$result$folder/'; + } + paths.add('$result$targetFileName'); + } + // Case for when backtracking is needed to get to [targetPath] + else { + String result = ''; + + // Backtrack + for (int i = 0; i < filePathTokens.length; i++) { + result = '$result../'; + } - return '$result$targetFileName'; + // Add necessary folders + for (int i = 0; i < targetPathTokens.length; i++) { + result = '$result${targetPathTokens[i]}/'; + } + paths.add('$result$targetFileName'); + } } + return paths; } } diff --git a/test/lib/generation/import_test.dart b/test/lib/generation/import_test.dart index c1f9e737..87818ac3 100644 --- a/test/lib/generation/import_test.dart +++ b/test/lib/generation/import_test.dart @@ -36,11 +36,11 @@ void main() { test('Testing import generation when imports are generated', () { //Add symbol in the same folder as importer - genCache.addToCache(importee1.UUID, '/path/to/page/importee1.dart'); + genCache.setPathToCache(importee1.UUID, '/path/to/page/importee1.dart'); //Add symbol located a directory above importer - genCache.addToCache(importee2.UUID, '/path/to/importee2.dart'); + genCache.setPathToCache(importee2.UUID, '/path/to/importee2.dart'); //Add symbol located a directory below importer - genCache.addToCache(importee3.UUID, '/path/to/page/sub/importee3.dart'); + genCache.setPathToCache(importee3.UUID, '/path/to/page/sub/importee3.dart'); // Find the imports of importer.dart var imports = ImportHelper.findImports( From 7ddb8eb59f797e96e0cf5a9256010090a46e59a3 Mon Sep 17 00:00:00 2001 From: Ivan Vigliante Date: Fri, 19 Mar 2021 10:35:24 -0600 Subject: [PATCH 4/9] Implemented Figma Line Component --- lib/input/figma/entities/layers/line.dart | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/input/figma/entities/layers/line.dart b/lib/input/figma/entities/layers/line.dart index bb9867c3..6ad98782 100644 --- a/lib/input/figma/entities/layers/line.dart +++ b/lib/input/figma/entities/layers/line.dart @@ -2,9 +2,11 @@ import 'package:parabeac_core/design_logic/design_node.dart'; import 'package:parabeac_core/input/figma/entities/abstract_figma_node_factory.dart'; import 'package:parabeac_core/input/figma/entities/layers/vector.dart'; import 'package:parabeac_core/input/sketch/entities/objects/frame.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/inherited_container.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:json_annotation/json_annotation.dart'; +import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; import 'figma_node.dart'; @@ -65,8 +67,15 @@ class FigmaLine extends FigmaVector implements AbstractFigmaNodeFactory { @override Future interpretNode(PBContext currentContext) { - // TODO: implement interpretNode - throw UnimplementedError(); + return Future.value(InheritedContainer( + this, + Point(boundaryRectangle.x, boundaryRectangle.y), + Point( + boundaryRectangle.x + boundaryRectangle.width, + boundaryRectangle.y + boundaryRectangle.height, + ), + name, + )); } @override From 32dcc672ca5f1387806228eb3c40dd48174d2730 Mon Sep 17 00:00:00 2001 From: Ivan Vigliante Date: Fri, 19 Mar 2021 10:35:38 -0600 Subject: [PATCH 5/9] Implement Figma Star Component --- lib/input/figma/entities/layers/star.dart | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/input/figma/entities/layers/star.dart b/lib/input/figma/entities/layers/star.dart index bca40ba0..6dbe4edb 100644 --- a/lib/input/figma/entities/layers/star.dart +++ b/lib/input/figma/entities/layers/star.dart @@ -1,7 +1,9 @@ import 'package:parabeac_core/design_logic/design_node.dart'; import 'package:parabeac_core/input/figma/entities/abstract_figma_node_factory.dart'; import 'package:parabeac_core/input/figma/entities/layers/vector.dart'; +import 'package:parabeac_core/input/figma/helper/figma_asset_processor.dart'; import 'package:parabeac_core/input/sketch/entities/objects/frame.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/inherited_bitmap.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:json_annotation/json_annotation.dart'; @@ -64,9 +66,14 @@ class FigmaStar extends FigmaVector implements AbstractFigmaNodeFactory { Map toJson() => _$FigmaStarToJson(this); @override - Future interpretNode(PBContext currentContext) { - // TODO: implement interpretNode - throw UnimplementedError(); + Future interpretNode(PBContext currentContext) async { + imageReference = FigmaAssetProcessor().processImage(UUID); + return Future.value(InheritedBitmap( + this, + name, + currentContext: currentContext, + referenceImage: imageReference, + )); } @override From e6b9a69898992839f1796d17f3631ec6ee9bc150 Mon Sep 17 00:00:00 2001 From: Ivan Vigliante Date: Sat, 20 Mar 2021 17:58:39 -0600 Subject: [PATCH 6/9] Removed dead code from provider_middleware Pass down managerData to states when generating provider model --- .../state_management/provider_middleware.dart | 10 ++-------- .../state_management/utils/middleware_utils.dart | 4 ++++ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/generation/generators/middleware/state_management/provider_middleware.dart b/lib/generation/generators/middleware/state_management/provider_middleware.dart index 3279972c..09d5edca 100644 --- a/lib/generation/generators/middleware/state_management/provider_middleware.dart +++ b/lib/generation/generators/middleware/state_management/provider_middleware.dart @@ -77,18 +77,12 @@ class ProviderMiddleware extends Middleware { } watcherName = getNameOfNode(node); - var code = MiddlewareUtils.generateChangeNotifierClass( - watcherName, - generationManager, - node, - ); - var parentDirectory = getName(node.name).snakeCase; // Write model class for current node - code = MiddlewareUtils.generateModelChangeNotifier( + var code = MiddlewareUtils.generateModelChangeNotifier( watcherName, generationManager, node); - fileStrategy.writeProviderModelFile(code, getName(node.name).snakeCase); + fileStrategy.writeProviderModelFile(code, parentDirectory); // Generate default node's view page await fileStrategy.generatePage( diff --git a/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart b/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart index 2d9a0b29..8271edac 100644 --- a/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart +++ b/lib/generation/generators/middleware/state_management/utils/middleware_utils.dart @@ -67,6 +67,10 @@ class MiddlewareUtils { PBGenerationManager manager, PBIntermediateNode node, ) { + // Pass down manager data to states + node?.auxiliaryData?.stateGraph?.states?.forEach((state) { + state.variation.node.currentContext.treeRoot.data = node.managerData; + }); return ''' ${manager.generateImports()} class ${defaultStateName} extends ChangeNotifier { From 8255fd1d8b0de1c7c8195fcbae896d5d9e97b9c2 Mon Sep 17 00:00:00 2001 From: Ivan Vigliante Date: Sat, 20 Mar 2021 19:02:47 -0600 Subject: [PATCH 7/9] Generating model's imports separately Avoid generating imports when file is importing itself --- .../flutter_project_builder/import_helper.dart | 4 +++- .../state_management/provider_middleware.dart | 14 ++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/generation/flutter_project_builder/import_helper.dart b/lib/generation/flutter_project_builder/import_helper.dart index 733741d5..2b9bf5b5 100644 --- a/lib/generation/flutter_project_builder/import_helper.dart +++ b/lib/generation/flutter_project_builder/import_helper.dart @@ -27,7 +27,9 @@ class ImportHelper { var nodePaths = PBGenCache().getPaths(id); // Make sure nodePath exists and is not the same as path (importing yourself) - if (nodePaths != null && nodePaths.isNotEmpty) { + if (nodePaths != null && + nodePaths.isNotEmpty && + !nodePaths.any((element) => element == path)) { var paths = PBGenCache().getRelativePath(path, id); paths.forEach(imports.add); } diff --git a/lib/generation/generators/middleware/state_management/provider_middleware.dart b/lib/generation/generators/middleware/state_management/provider_middleware.dart index 09d5edca..6151a5bf 100644 --- a/lib/generation/generators/middleware/state_management/provider_middleware.dart +++ b/lib/generation/generators/middleware/state_management/provider_middleware.dart @@ -2,6 +2,7 @@ import 'package:parabeac_core/generation/generators/middleware/middleware.dart'; import 'package:parabeac_core/generation/generators/middleware/state_management/utils/middleware_utils.dart'; import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; import 'package:parabeac_core/generation/generators/pb_variable.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/provider_file_structure_strategy.dart'; import 'package:parabeac_core/generation/generators/value_objects/template_strategy/stateless_template_strategy.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; @@ -11,6 +12,8 @@ import 'package:recase/recase.dart'; import 'package:parabeac_core/generation/generators/value_objects/generator_adapter.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; +import '../../pb_flutter_generator.dart'; + class ProviderMiddleware extends Middleware { final PACKAGE_NAME = 'provider'; final PACKAGE_VERSION = '^4.3.2+3'; @@ -40,11 +43,10 @@ class ProviderMiddleware extends Middleware { } addImportToCache(node.SYMBOL_ID, getImportPath(node, fileStrategy)); + PBGenCache().appendToCache(node.SYMBOL_ID, + getImportPath(node, fileStrategy, generateModelPath: false)); if (node.generator is! StringGeneratorAdapter) { - // Add instance import - PBGenCache().appendToCache(node.SYMBOL_ID, - getImportPath(node, fileStrategy, generateModelPath: false)); var modelName = getName(node.functionCallName).pascalCase; var defaultWidget = node.functionCallName.pascalCase; var providerWidget = ''' @@ -79,9 +81,13 @@ class ProviderMiddleware extends Middleware { var parentDirectory = getName(node.name).snakeCase; + // Generate model's imports + var modelGenerator = PBFlutterGenerator( + data: PBGenerationViewData() + ..addImport('package:flutter/material.dart')); // Write model class for current node var code = MiddlewareUtils.generateModelChangeNotifier( - watcherName, generationManager, node); + watcherName, modelGenerator, node); fileStrategy.writeProviderModelFile(code, parentDirectory); // Generate default node's view page From 5afb7e1accde783b06aeaf9ad8436566f5617d40 Mon Sep 17 00:00:00 2001 From: Ivan Vigliante Date: Mon, 22 Mar 2021 16:22:56 -0600 Subject: [PATCH 8/9] Updated pubspec.yaml version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index a5d937e8..7cec4455 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: parabeac_core description: A starting point for Dart libraries or applications. -version: 1.4.1 +version: 1.4.2 # homepage: https://www.example.com environment: From f4bce8308307c16a603df89ba3386d2ee35a77be Mon Sep 17 00:00:00 2001 From: Bryan Figueroa <35854816+SushiRoll53@users.noreply.github.com> Date: Mon, 22 Mar 2021 17:05:11 -0600 Subject: [PATCH 9/9] Create request-test-case-template.md (cherry picked from commit ad13b14e9f0d9476e3d51375ae169c5c20c6ad52) --- .../request-test-case-template.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/request-test-case-template.md diff --git a/.github/ISSUE_TEMPLATE/request-test-case-template.md b/.github/ISSUE_TEMPLATE/request-test-case-template.md new file mode 100644 index 00000000..4cb6a8e2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/request-test-case-template.md @@ -0,0 +1,17 @@ +--- +name: Test Case Request Template +about: Request a test case. +title: '' +labels: Integration Testing +assignees: '' + +--- + +## Test Case Proposal +Describe in a sentence or two the test case that is being requested. + +## Additional information +Screenshots, examples, etc. + +## Benefits of the Test Case +What improvements occur because of this change?