diff --git a/README.md b/README.md index 8e57325..065e153 100644 --- a/README.md +++ b/README.md @@ -118,8 +118,8 @@ dart run build_runner build --delete-conflicting-outputs ### 🧩 编程式用法 ```dart import 'dart:io'; -import 'package:swagger_generator_flutter/parsers/swagger_data_parser.dart'; -import 'package:swagger_generator_flutter/generators/retrofit_api_generator.dart'; +import 'package:swagger_generator_flutter/pipeline/parse/swagger_data_parser.dart'; +import 'package:swagger_generator_flutter/pipeline/generate/impl/retrofit_api_generator.dart'; Future main() async { // 解析本地或远程的 Swagger 文档(支持 file:// 与 http(s)://) @@ -321,10 +321,8 @@ swagger_generator_flutter/ lib/ # 核心代码 commands/ # CLI 命令(GenerateCommand 等) core/ # 配置、模型、异常 - generators/ # 模型/API/文档生成器 - parsers/ # SwaggerDataParser + pipeline/ # 核心处理流程 (Parse -> Validate -> Generate -> Render -> Output) utils/ # FileUtils、StringUtils 等 - validators/ # Schema/Enhanced 校验器 tests/ # 基础测试示例 generator_config.template.yaml ``` diff --git a/docs/PROJECT_OVERVIEW.md b/docs/PROJECT_OVERVIEW.md index 04b4852..e196558 100644 --- a/docs/PROJECT_OVERVIEW.md +++ b/docs/PROJECT_OVERVIEW.md @@ -117,16 +117,12 @@ flowchart TD - **SwaggerCLI / GenerateCommand**: 注册命令、展示帮助、执行生成,支持多 Swagger 合并、版本化输出、Tag 过滤和忽略列表 - **ConfigLoader / SwaggerConfig**: 解析 `generator_config.yaml`,提供 swagger_urls 顺序合并、输出目录、版本提取正则、ApiClient 命名、BaseResult 导入等配置 -#### 2. 解析器 (Parsers) -- **SwaggerDataParser**: 支持 http(s) 与 file:// 源的 OpenAPI 解析,内置缓存与性能监测,解析 controllers/tags/schema 依赖 - -#### 3. 验证器 (Validators) -- **SchemaValidator / EnhancedValidator**: 基础与增强校验器,用于在生成前验证文档一致性 - -#### 4. 生成器 (Generators) -- **ModelCodeGenerator**: 生成基于 Freezed 的不可变数据模型,自动获得 `copyWith`、`toString`、`==/hashCode` 等功能,并与 `json_serializable` 无缝集成。 -- **RetrofitApiGenerator**: 支持按 tag 拆分、多版本目录与统一 ApiClient,自动生成查询参数实体并处理版本化类名 -- **DocumentationGenerator**: 输出 Markdown API 文档与统计摘要 +#### 2. Pipeline (核心流程) +- **Parse**: `SwaggerDataParser` 支持 http(s) 与 file:// 源的 OpenAPI 解析,内置缓存与性能监测。 +- **Validate**: `SchemaValidator` 与 `EnhancedValidator` 用于在生成前验证文档一致性。 +- **Generate**: `ModelCodeGenerator` 和 `RetrofitApiGenerator` 负责生成数据模型和 API 代码。 +- **Render**: `TemplateRenderer` (内部使用) 负责模板渲染。 +- **Output**: `GenerationOutputService` 负责将生成的文件写入磁盘。 #### 5. 工具类 (Utils) - **CacheManager / PerformanceMonitor**: 缓存解析结果并记录耗时 diff --git a/lib/commands/services/document_merge_service.dart b/lib/commands/services/document_merge_service.dart index f5b5155..994c2d6 100644 --- a/lib/commands/services/document_merge_service.dart +++ b/lib/commands/services/document_merge_service.dart @@ -1,6 +1,6 @@ import 'package:swagger_generator_flutter/commands/services/service_typedefs.dart'; import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/parsers/swagger_data_parser.dart'; +import 'package:swagger_generator_flutter/pipeline/parse/impl/swagger_data_parser.dart'; class DocumentMergeService { DocumentMergeService({SwaggerDataParser? parser}) diff --git a/lib/core/models/api_paths.dart b/lib/core/models/api_paths.dart index 5cd96fa..89d6ab7 100644 --- a/lib/core/models/api_paths.dart +++ b/lib/core/models/api_paths.dart @@ -96,6 +96,12 @@ class ApiPath { /// 安全要求 final List security; + + bool get isMultipart => + parameters.any((p) => p.type == PropertyType.file) || + (requestBody?.content.keys + .any((k) => k.contains('multipart/form-data')) ?? + false); } /// API参数信息 diff --git a/lib/core/models/api_schema.dart b/lib/core/models/api_schema.dart index 6cf12cc..5366ac3 100644 --- a/lib/core/models/api_schema.dart +++ b/lib/core/models/api_schema.dart @@ -357,6 +357,7 @@ class ApiModel { this.not, this.discriminator, this.usageType = ModelUsageType.unknown, + this.type, }); /// 从JSON创建ApiModel @@ -415,6 +416,7 @@ class ApiModel { : null; return ApiModel( + type: json['type'] as String?, name: name, description: json['description'] as String? ?? '', required: required, @@ -461,6 +463,7 @@ class ApiModel { /// 模型用途类型 /// 标识该模型在 API 中的实际用途(请求/响应/通用/未知) final ModelUsageType usageType; + final String? type; /// 检查是否使用了组合模式 bool get isComposition => @@ -498,6 +501,7 @@ class ApiModel { not: not, discriminator: discriminator, usageType: newUsageType, + type: type, ); } } diff --git a/lib/generators/base_generator.dart b/lib/generators/base_generator.dart deleted file mode 100644 index b97b129..0000000 --- a/lib/generators/base_generator.dart +++ /dev/null @@ -1,4 +0,0 @@ -/// Backward-compat shim for BaseGenerator -library; - -export 'package:swagger_generator_flutter/pipeline/generate/impl/base_generator.dart'; diff --git a/lib/generators/model_code_generator.dart b/lib/generators/model_code_generator.dart deleted file mode 100644 index 3756f58..0000000 --- a/lib/generators/model_code_generator.dart +++ /dev/null @@ -1,4 +0,0 @@ -/// Backward-compat shim for ModelCodeGenerator -library; - -export 'package:swagger_generator_flutter/pipeline/generate/impl/model_code_generator.dart'; diff --git a/lib/generators/retrofit_api_generator.dart b/lib/generators/retrofit_api_generator.dart deleted file mode 100644 index 0b253ed..0000000 --- a/lib/generators/retrofit_api_generator.dart +++ /dev/null @@ -1,4 +0,0 @@ -/// Backward-compat shim for RetrofitApiGenerator -library; - -export 'package:swagger_generator_flutter/pipeline/generate/impl/retrofit_api_generator.dart'; diff --git a/lib/index.dart b/lib/index.dart index 5d5295e..7e6ae70 100644 --- a/lib/index.dart +++ b/lib/index.dart @@ -11,23 +11,20 @@ /// - **Render**: `TemplateRenderer` for Mustache-based template rendering. /// - **Output**: `GenerationOutputService` to write generated files to disk. -library swagger_generator_flutter; +library; // --- Core Public API --- export 'core/config_repository.dart'; export 'core/error_reporter.dart'; export 'core/models.dart'; - -// --- Pipeline API (New Structure) --- -export 'pipeline/parse/swagger_data_parser.dart'; -export 'pipeline/validate/enhanced_validator.dart'; -export 'pipeline/generate/model_code_generator.dart'; -export 'pipeline/generate/retrofit_api_generator.dart'; -export 'pipeline/render/template_renderer.dart'; +// --- Pipeline API --- +export 'pipeline/generate/apis.dart'; +export 'pipeline/generate/models.dart'; export 'pipeline/output/generation_output_service.dart'; - +export 'pipeline/parse/swagger_data_parser.dart'; +export 'pipeline/render/template_renderer.dart'; +export 'pipeline/validate/enhanced_validator.dart'; // --- Utilities --- export 'utils/logger.dart'; export 'utils/path_resolver.dart'; export 'utils/string_utils.dart'; - diff --git a/lib/parsers/swagger_data_parser.dart b/lib/parsers/swagger_data_parser.dart deleted file mode 100644 index b75efa7..0000000 --- a/lib/parsers/swagger_data_parser.dart +++ /dev/null @@ -1,5 +0,0 @@ -/// Backward-compat shim for SwaggerDataParser -library; - -export 'package:swagger_generator_flutter/pipeline/parse/impl/swagger_data_parser.dart'; - diff --git a/lib/parsers/swagger_fetcher.dart b/lib/parsers/swagger_fetcher.dart deleted file mode 100644 index cef1bb1..0000000 --- a/lib/parsers/swagger_fetcher.dart +++ /dev/null @@ -1,4 +0,0 @@ -/// Backward-compat shim for parser fetcher -library; - -export 'package:swagger_generator_flutter/pipeline/parse/impl/swagger_fetcher.dart'; diff --git a/lib/pipeline/generate/apis.dart b/lib/pipeline/generate/apis.dart index 02c7ada..60c9ce7 100644 --- a/lib/pipeline/generate/apis.dart +++ b/lib/pipeline/generate/apis.dart @@ -2,4 +2,4 @@ /// Re-export Retrofit API generator for pipeline-oriented imports. library; -export 'package:swagger_generator_flutter/generators/retrofit_api_generator.dart'; +export 'impl/retrofit_api_generator.dart'; diff --git a/lib/pipeline/generate/impl/base_generator.dart b/lib/pipeline/generate/impl/base_generator.dart index 6016fec..37eba9e 100644 --- a/lib/pipeline/generate/impl/base_generator.dart +++ b/lib/pipeline/generate/impl/base_generator.dart @@ -363,4 +363,3 @@ class GeneratorOptions { final String endpointsFileName; final String docsFileName; } - diff --git a/lib/pipeline/generate/impl/model/model_content_builders.dart b/lib/pipeline/generate/impl/model/model_content_builders.dart index e46728f..3880a11 100644 --- a/lib/pipeline/generate/impl/model/model_content_builders.dart +++ b/lib/pipeline/generate/impl/model/model_content_builders.dart @@ -237,4 +237,3 @@ String _needsJsonKeyAnnotation( return annotations.join(', '); } - diff --git a/lib/pipeline/generate/impl/model/model_file_writers.dart b/lib/pipeline/generate/impl/model/model_file_writers.dart index 178746e..10636ed 100644 --- a/lib/pipeline/generate/impl/model/model_file_writers.dart +++ b/lib/pipeline/generate/impl/model/model_file_writers.dart @@ -118,4 +118,3 @@ String _getModelSubDirectory(ApiModel model) { return 'result'; } } - diff --git a/lib/pipeline/generate/impl/model/model_pagination_helpers.dart b/lib/pipeline/generate/impl/model/model_pagination_helpers.dart index f7b5386..7ffa2ff 100644 --- a/lib/pipeline/generate/impl/model/model_pagination_helpers.dart +++ b/lib/pipeline/generate/impl/model/model_pagination_helpers.dart @@ -57,4 +57,3 @@ bool _isPaginationResponseModel(ApiModel model) { return isTotalNumeric && isItemsArray; } - diff --git a/lib/pipeline/generate/impl/model_code_generator.dart b/lib/pipeline/generate/impl/model_code_generator.dart index 2df1259..516d6d3 100644 --- a/lib/pipeline/generate/impl/model_code_generator.dart +++ b/lib/pipeline/generate/impl/model_code_generator.dart @@ -1,11 +1,11 @@ import 'package:swagger_generator_flutter/core/config.dart'; import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/generators/base_generator.dart'; +import 'package:swagger_generator_flutter/pipeline/generate/impl/base_generator.dart'; import 'package:swagger_generator_flutter/utils/string_utils.dart'; -part 'model/model_pagination_helpers.dart'; -part 'model/model_file_writers.dart'; part 'model/model_content_builders.dart'; +part 'model/model_file_writers.dart'; +part 'model/model_pagination_helpers.dart'; /// 模型代码生成器 /// 负责生成Dart模型类代码 @@ -57,4 +57,3 @@ class ModelCodeGenerator extends ModelGenerator { return _buildIndexFile(this, modelFileNames); } } - diff --git a/lib/pipeline/generate/impl/retrofit_api/api_grouping.dart b/lib/pipeline/generate/impl/retrofit_api/api_grouping.dart index e8aef73..9027eab 100644 --- a/lib/pipeline/generate/impl/retrofit_api/api_grouping.dart +++ b/lib/pipeline/generate/impl/retrofit_api/api_grouping.dart @@ -16,7 +16,7 @@ mixin RetrofitApiGrouping { } /// 按版本分组 API paths - /// 返回: Map<版本, Map>> + /// 返回: `Map<版本, Map>>` Map>> groupApisByVersion( List paths, ) { @@ -51,4 +51,3 @@ mixin RetrofitApiGrouping { return groups; } } - diff --git a/lib/pipeline/generate/impl/retrofit_api/api_method_parameter.dart b/lib/pipeline/generate/impl/retrofit_api/api_method_parameter.dart index 295da91..254264d 100644 --- a/lib/pipeline/generate/impl/retrofit_api/api_method_parameter.dart +++ b/lib/pipeline/generate/impl/retrofit_api/api_method_parameter.dart @@ -18,4 +18,3 @@ class ApiMethodParameter { final String description; final dynamic defaultValue; } - diff --git a/lib/pipeline/generate/impl/retrofit_api/api_parameter_entities.dart b/lib/pipeline/generate/impl/retrofit_api/api_parameter_entities.dart index ede0b4d..a329d8b 100644 --- a/lib/pipeline/generate/impl/retrofit_api/api_parameter_entities.dart +++ b/lib/pipeline/generate/impl/retrofit_api/api_parameter_entities.dart @@ -120,4 +120,3 @@ mixin RetrofitApiParameterEntities { } } } - diff --git a/lib/pipeline/generate/impl/retrofit_api/api_return_types.dart b/lib/pipeline/generate/impl/retrofit_api/api_return_types.dart index 206f0f2..7cb899e 100644 --- a/lib/pipeline/generate/impl/retrofit_api/api_return_types.dart +++ b/lib/pipeline/generate/impl/retrofit_api/api_return_types.dart @@ -288,4 +288,3 @@ mixin RetrofitApiReturnTypes { return false; } } - diff --git a/lib/pipeline/generate/impl/retrofit_api/api_schema_composition.dart b/lib/pipeline/generate/impl/retrofit_api/api_schema_composition.dart index 6225d3e..5d5bf36 100644 --- a/lib/pipeline/generate/impl/retrofit_api/api_schema_composition.dart +++ b/lib/pipeline/generate/impl/retrofit_api/api_schema_composition.dart @@ -4,7 +4,7 @@ mixin RetrofitApiSchemaComposition { RetrofitApiGenerator get _g => this as RetrofitApiGenerator; /// 组合模式 Schema 处理 - String? _extractTypeFromCompositionSchema(Map schema) { + String? extractTypeFromCompositionSchema(Map schema) { if (schema['discriminator'] != null) { final discriminatorType = _handleDiscriminatorSchema(schema); if (discriminatorType != null) { @@ -52,7 +52,7 @@ mixin RetrofitApiSchemaComposition { } return 'List'; } else { - return _mapJsonTypeToFlutterType(type); + return mapJsonTypeToFlutterType(type); } } } @@ -124,7 +124,7 @@ mixin RetrofitApiSchemaComposition { } /// 将 JSON Schema 类型映射到 Flutter 类型 - String _mapJsonTypeToFlutterType(String jsonType) { + String mapJsonTypeToFlutterType(String jsonType) { switch (jsonType) { case 'string': return 'String'; @@ -143,4 +143,3 @@ mixin RetrofitApiSchemaComposition { } } } - diff --git a/lib/pipeline/generate/impl/retrofit_api/api_schema_extraction.dart b/lib/pipeline/generate/impl/retrofit_api/api_schema_extraction.dart index c42c2b9..a9d4c96 100644 --- a/lib/pipeline/generate/impl/retrofit_api/api_schema_extraction.dart +++ b/lib/pipeline/generate/impl/retrofit_api/api_schema_extraction.dart @@ -64,14 +64,14 @@ mixin RetrofitApiSchema { return 'List'; } } else { - return _mapJsonTypeToFlutterType(type); + return _g.mapJsonTypeToFlutterType(type); } } if (schema['allOf'] != null || schema['oneOf'] != null || schema['anyOf'] != null) { - return _extractTypeFromCompositionSchema(schema); + return _g.extractTypeFromCompositionSchema(schema); } return 'dynamic'; @@ -123,7 +123,9 @@ mixin RetrofitApiSchema { } final lastPart = pathParts.last.replaceAll(RegExp(r'\W+'), ''); - final methodName = '${path.method.value.toLowerCase()}${StringUtils.toPascalCase(lastPart)}'; + final method = path.method.value.toLowerCase(); + final pascalPart = StringUtils.toPascalCase(lastPart); + final methodName = '$method$pascalPart'; return methodName; } @@ -145,4 +147,3 @@ mixin RetrofitApiSchema { return isTotalNumeric && isItemsArray; } } - diff --git a/lib/pipeline/generate/impl/retrofit_api/api_template_data.dart b/lib/pipeline/generate/impl/retrofit_api/api_template_data.dart index 0d3938b..2d9b92a 100644 --- a/lib/pipeline/generate/impl/retrofit_api/api_template_data.dart +++ b/lib/pipeline/generate/impl/retrofit_api/api_template_data.dart @@ -5,8 +5,10 @@ mixin RetrofitApiTemplateData { List _getMainImports() { final tagGroups = _g._groupPathsByTags(); - final tagImports = - tagGroups.keys.map((tag) => "import '${StringUtils.generateFileName(tag)}.dart';").toList(); + final tagImports = tagGroups.keys.map((tag) { + final fileName = StringUtils.generateFileName(tag); + return "import '$fileName.dart';"; + }).toList(); final config = ConfigRepository.loadSync(); final customImports = config.packageImports; @@ -30,8 +32,10 @@ mixin RetrofitApiTemplateData { Map _buildApiClassData(List paths) { final baseUrl = _g.document.servers.isNotEmpty ? _g.document.servers.first.url : ''; - final fileName = - _g.className.isNotEmpty ? StringUtils.generateFileName(_g.className) : ''; + var fileName = ''; + if (_g.className.isNotEmpty) { + fileName = StringUtils.generateFileName(_g.className); + } return { 'description': _g.document.description, @@ -45,11 +49,11 @@ mixin RetrofitApiTemplateData { List _getImportsForPaths(List paths) { final imports = {}; - imports.add("import 'package:dio/dio.dart';"); - imports.add("import 'package:retrofit/retrofit.dart';"); - final config = ConfigRepository.loadSync(); - imports.addAll(config.packageImports.map((i) => "import '$i';")); + imports + ..add("import 'package:dio/dio.dart';") + ..add("import 'package:retrofit/retrofit.dart';") + ..addAll(config.packageImports.map((i) => "import '$i';")); return imports.toList(); } @@ -107,8 +111,9 @@ mixin RetrofitApiTemplateData { final schemes = document.components.securitySchemes.values.toList(); return { 'hasSecuritySchemes': schemes.isNotEmpty, - 'securitySchemes': schemes.map((s) => {'name': s.name, 'type': s.type, 'scheme': s.scheme}).toList(), + 'securitySchemes': schemes + .map((s) => {'name': s.name, 'type': s.type, 'scheme': s.scheme}) + .toList(), }; } } - diff --git a/lib/pipeline/generate/impl/retrofit_api_generator.dart b/lib/pipeline/generate/impl/retrofit_api_generator.dart index 434c82c..6f366c3 100644 --- a/lib/pipeline/generate/impl/retrofit_api_generator.dart +++ b/lib/pipeline/generate/impl/retrofit_api_generator.dart @@ -1,7 +1,7 @@ import 'package:swagger_generator_flutter/core/config_repository.dart'; import 'package:swagger_generator_flutter/core/models.dart'; import 'package:swagger_generator_flutter/core/template_renderer.dart'; -import 'package:swagger_generator_flutter/generators/base_generator.dart'; +import 'package:swagger_generator_flutter/pipeline/generate/impl/base_generator.dart'; import 'package:swagger_generator_flutter/utils/string_utils.dart'; part 'retrofit_api/api_grouping.dart'; @@ -18,12 +18,12 @@ part 'retrofit_api/api_template_data.dart'; class RetrofitApiGenerator extends BaseGenerator with RetrofitApiGrouping, - RetrofitApiTemplateData, RetrofitApiSchemaComposition, RetrofitApiSchema, RetrofitApiReturnTypes, RetrofitApiParameters, - RetrofitApiParameterEntities { + RetrofitApiParameterEntities, + RetrofitApiTemplateData { RetrofitApiGenerator({ this.className = 'ApiClient', this.useRetrofit = true, @@ -43,6 +43,9 @@ class RetrofitApiGenerator extends BaseGenerator late SwaggerDocument document; final templateRenderer = TemplateRenderer(); + @override + RetrofitApiGenerator get _g => this; + @override String get generatorType => 'RetrofitApiGenerator'; @@ -120,4 +123,3 @@ class RetrofitApiGenerator extends BaseGenerator return apiFiles; } } - diff --git a/lib/pipeline/generate/models.dart b/lib/pipeline/generate/models.dart index 8f9a74d..853e72a 100644 --- a/lib/pipeline/generate/models.dart +++ b/lib/pipeline/generate/models.dart @@ -2,4 +2,4 @@ /// Re-export model code generator for pipeline-oriented imports. library; -export 'package:swagger_generator_flutter/generators/model_code_generator.dart'; +export 'impl/model_code_generator.dart'; diff --git a/lib/pipeline/output/generation_output_service.dart b/lib/pipeline/output/generation_output_service.dart index 41f4464..2534496 100644 --- a/lib/pipeline/output/generation_output_service.dart +++ b/lib/pipeline/output/generation_output_service.dart @@ -3,4 +3,3 @@ library; export 'package:swagger_generator_flutter/commands/services/generation_output_service.dart'; - diff --git a/lib/pipeline/output/impl/generation_output_service.dart b/lib/pipeline/output/impl/generation_output_service.dart index cb8d985..6765dcd 100644 --- a/lib/pipeline/output/impl/generation_output_service.dart +++ b/lib/pipeline/output/impl/generation_output_service.dart @@ -1,13 +1,14 @@ import 'dart:io'; import 'package:path/path.dart' as path; -import 'package:swagger_generator_flutter/commands/generate_command.dart' show GenerateOptions; +import 'package:swagger_generator_flutter/commands/generate_command.dart' + show GenerateOptions; import 'package:swagger_generator_flutter/commands/services/service_typedefs.dart'; import 'package:swagger_generator_flutter/core/config.dart'; import 'package:swagger_generator_flutter/core/config_repository.dart'; import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/generators/model_code_generator.dart'; -import 'package:swagger_generator_flutter/generators/retrofit_api_generator.dart'; +import 'package:swagger_generator_flutter/pipeline/generate/impl/model_code_generator.dart'; +import 'package:swagger_generator_flutter/pipeline/generate/impl/retrofit_api_generator.dart'; import 'package:swagger_generator_flutter/utils/file_utils.dart'; import 'package:swagger_generator_flutter/utils/logger.dart'; @@ -408,7 +409,8 @@ class GenerationOutputService { buffer.writeln("export '$basePageResultImport';"); } - if ((baseResultImport.isNotEmpty || basePageResultImport.isNotEmpty) && fileNames.isNotEmpty) { + if ((baseResultImport.isNotEmpty || basePageResultImport.isNotEmpty) && + fileNames.isNotEmpty) { buffer.writeln(); } @@ -437,7 +439,9 @@ class GenerationOutputService { ..writeln() ..writeln('## 控制器列表'); document.controllers.forEach((name, controller) { - summary.writeln('- **$name**: ${controller.description} (${controller.paths.length} 个路径)'); + summary.writeln( + '- **$name**: ${controller.description} (${controller.paths.length} 个路径)', + ); }); await FileUtils.writeFile('$outputDir/SUMMARY.md', summary.toString()); @@ -530,7 +534,11 @@ class GenerationOutputService { final className = fileName .replaceAll('.dart', '') .split('_') - .map((word) => word.isEmpty ? '' : (word[0].toUpperCase() + word.substring(1))) + .map( + (word) => word.isEmpty + ? '' + : (word[0].toUpperCase() + word.substring(1)), + ) .join(); apiClasses[version]!.add(className); } @@ -558,7 +566,9 @@ class GenerationOutputService { for (final className in versionEntry.value) { final suffix = version == 'v1' ? '' : versionUpper; - buffer.writeln(' late final $className$suffix _${_toLowerCamelCase(className)}$suffix;'); + buffer.writeln( + ' late final $className$suffix _${_toLowerCamelCase(className)}$suffix;', + ); } } @@ -590,13 +600,16 @@ class GenerationOutputService { for (final versionEntry in apiClasses.entries) { final version = versionEntry.key; final versionUpper = version == 'v1' ? '' : version.toUpperCase(); - final versionLabel = version == 'v1' ? 'V1(默认版本)' : '${version.toUpperCase()} 版本'; + final versionLabel = + version == 'v1' ? 'V1(默认版本)' : '${version.toUpperCase()} 版本'; buffer.writeln(' /// $versionLabel API'); for (final className in versionEntry.value) { final fieldName = _toLowerCamelCase(className); final suffix = version == 'v1' ? '' : versionUpper; - buffer.writeln(' $className$suffix get $fieldName$suffix => _$fieldName$suffix;'); + buffer.writeln( + ' $className$suffix get $fieldName$suffix => _$fieldName$suffix;', + ); } buffer.writeln(); } @@ -640,4 +653,3 @@ class GenerationOutputService { await FileUtils.writeFile(indexPath, buffer.toString()); } } - diff --git a/lib/pipeline/parse/impl/swagger_data_parser.dart b/lib/pipeline/parse/impl/swagger_data_parser.dart index e35ec09..3accda5 100644 --- a/lib/pipeline/parse/impl/swagger_data_parser.dart +++ b/lib/pipeline/parse/impl/swagger_data_parser.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:swagger_generator_flutter/core/config.dart'; import 'package:swagger_generator_flutter/core/exceptions.dart'; import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/parsers/swagger_fetcher.dart'; +import 'package:swagger_generator_flutter/pipeline/parse/impl/swagger_fetcher.dart'; import 'package:swagger_generator_flutter/utils/cache_manager.dart'; import 'package:swagger_generator_flutter/utils/logger.dart'; import 'package:swagger_generator_flutter/utils/performance_monitor.dart'; diff --git a/lib/pipeline/parse/impl/swagger_fetcher.dart b/lib/pipeline/parse/impl/swagger_fetcher.dart index 01ef8fa..882005c 100644 --- a/lib/pipeline/parse/impl/swagger_fetcher.dart +++ b/lib/pipeline/parse/impl/swagger_fetcher.dart @@ -81,4 +81,3 @@ class SwaggerFetcher { } } } - diff --git a/lib/pipeline/parse/swagger_data_parser.dart b/lib/pipeline/parse/swagger_data_parser.dart index 76e9209..a8a77df 100644 --- a/lib/pipeline/parse/swagger_data_parser.dart +++ b/lib/pipeline/parse/swagger_data_parser.dart @@ -2,4 +2,4 @@ /// Re-export swagger data parser for pipeline-oriented imports. library; -export 'package:swagger_generator_flutter/parsers/swagger_data_parser.dart'; +export './swagger_data_parser.dart'; diff --git a/lib/pipeline/parse/swagger_fetcher.dart b/lib/pipeline/parse/swagger_fetcher.dart index 74ec33c..c87fbd6 100644 --- a/lib/pipeline/parse/swagger_fetcher.dart +++ b/lib/pipeline/parse/swagger_fetcher.dart @@ -2,5 +2,4 @@ /// Re-export swagger fetcher for pipeline-oriented imports. library; -export 'package:swagger_generator_flutter/parsers/swagger_fetcher.dart'; - +export 'impl/swagger_fetcher.dart'; diff --git a/lib/pipeline/render/impl/template/template_loader.dart b/lib/pipeline/render/impl/template/template_loader.dart index da5c208..f2e6622 100644 --- a/lib/pipeline/render/impl/template/template_loader.dart +++ b/lib/pipeline/render/impl/template/template_loader.dart @@ -82,4 +82,3 @@ class TemplateLoader { _cache.clear(); } } - diff --git a/lib/pipeline/render/impl/template_renderer.dart b/lib/pipeline/render/impl/template_renderer.dart index 001766a..5500229 100644 --- a/lib/pipeline/render/impl/template_renderer.dart +++ b/lib/pipeline/render/impl/template_renderer.dart @@ -90,4 +90,3 @@ class TemplateRenderer { }; } } - diff --git a/lib/pipeline/render/template_renderer.dart b/lib/pipeline/render/template_renderer.dart index 3344ddd..2d85f02 100644 --- a/lib/pipeline/render/template_renderer.dart +++ b/lib/pipeline/render/template_renderer.dart @@ -3,4 +3,3 @@ library; export 'package:swagger_generator_flutter/core/template_renderer.dart'; - diff --git a/lib/validators/core/validation_context.dart b/lib/pipeline/validate/core/validation_context.dart similarity index 100% rename from lib/validators/core/validation_context.dart rename to lib/pipeline/validate/core/validation_context.dart diff --git a/lib/validators/core/validation_result.dart b/lib/pipeline/validate/core/validation_result.dart similarity index 100% rename from lib/validators/core/validation_result.dart rename to lib/pipeline/validate/core/validation_result.dart diff --git a/lib/validators/core/validation_rule.dart b/lib/pipeline/validate/core/validation_rule.dart similarity index 79% rename from lib/validators/core/validation_rule.dart rename to lib/pipeline/validate/core/validation_rule.dart index 0120074..c3a869c 100644 --- a/lib/validators/core/validation_rule.dart +++ b/lib/pipeline/validate/core/validation_rule.dart @@ -1,5 +1,5 @@ -import 'package:swagger_generator_flutter/validators/core/validation_context.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_result.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_context.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_result.dart'; /// 验证规则基类 abstract class ValidationRule { diff --git a/lib/pipeline/validate/enhanced_validator.dart b/lib/pipeline/validate/enhanced_validator.dart index 1ea71a0..832216b 100644 --- a/lib/pipeline/validate/enhanced_validator.dart +++ b/lib/pipeline/validate/enhanced_validator.dart @@ -1,6 +1,3 @@ /// Pipeline: validate /// Re-export enhanced validator (decorator over schema validator). library; - -export 'package:swagger_generator_flutter/validators/enhanced_validator.dart'; - diff --git a/lib/pipeline/validate/impl/enhanced_validator.dart b/lib/pipeline/validate/impl/enhanced_validator.dart index 187db3e..fa25446 100644 --- a/lib/pipeline/validate/impl/enhanced_validator.dart +++ b/lib/pipeline/validate/impl/enhanced_validator.dart @@ -4,7 +4,7 @@ library; import 'package:swagger_generator_flutter/core/error_reporter.dart'; import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/validators/schema_validator.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/schema_validator.dart'; /// 增强的 OpenAPI 验证器 class EnhancedValidator { @@ -54,8 +54,9 @@ class EnhancedValidator { severity: ErrorSeverity.warning, category: ErrorCategory.bestPractice, jsonPath: warning.path, - suggestions: - warning.suggestion != null ? [FixSuggestion(description: warning.suggestion!)] : [], + suggestions: warning.suggestion != null + ? [FixSuggestion(description: warning.suggestion!)] + : [], ); } @@ -82,7 +83,8 @@ class EnhancedValidator { /// 检查最佳实践 void _checkBestPractices(SwaggerDocument document) { // 检查是否使用了标签 - final hasTaggedOperations = document.paths.values.any((path) => path.tags.isNotEmpty); + final hasTaggedOperations = + document.paths.values.any((path) => path.tags.isNotEmpty); if (!hasTaggedOperations) { _errorReporter.reportError( id: 'NO_OPERATION_TAGS', @@ -108,14 +110,16 @@ class EnhancedValidator { _errorReporter.reportError( id: 'MISSING_OPERATION_ID', title: 'Missing Operation ID', - description: 'Operation should have an operationId for better code generation.', + description: + 'Operation should have an operationId for better code generation.', severity: ErrorSeverity.warning, category: ErrorCategory.bestPractice, jsonPath: 'paths["$pathPattern"][${method.value}].operationId', suggestions: [ FixSuggestion( description: 'Add a unique operationId', - codeExample: '"operationId": "${_generateOperationId(pathPattern, method)}"', + codeExample: + '"operationId": "${_generateOperationId(pathPattern, method)}"', ), ], ); @@ -125,7 +129,10 @@ class EnhancedValidator { /// 生成操作 ID String _generateOperationId(String path, HttpMethod method) { - final pathParts = path.split('/').where((part) => part.isNotEmpty && !part.startsWith('{')).toList(); + final pathParts = path + .split('/') + .where((part) => part.isNotEmpty && !part.startsWith('{')) + .toList(); final methodPrefix = method.value.toLowerCase(); if (pathParts.length >= 3) { @@ -141,8 +148,11 @@ class EnhancedValidator { String _toPascalCase(String input) { return input .split('_') - .map((word) => word.isEmpty ? '' : word[0].toUpperCase() + word.substring(1).toLowerCase()) + .map( + (word) => word.isEmpty + ? '' + : word[0].toUpperCase() + word.substring(1).toLowerCase(), + ) .join(); } } - diff --git a/lib/pipeline/validate/impl/schema_validator.dart b/lib/pipeline/validate/impl/schema_validator.dart index b0b284d..d1e176d 100644 --- a/lib/pipeline/validate/impl/schema_validator.dart +++ b/lib/pipeline/validate/impl/schema_validator.dart @@ -3,19 +3,19 @@ library; import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_context.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_result.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_rule.dart'; -import 'package:swagger_generator_flutter/validators/rules/component_rules.dart'; -import 'package:swagger_generator_flutter/validators/rules/info_rules.dart'; -import 'package:swagger_generator_flutter/validators/rules/path_rules.dart'; -import 'package:swagger_generator_flutter/validators/rules/security_rules.dart'; -import 'package:swagger_generator_flutter/validators/rules/server_rules.dart'; -import 'package:swagger_generator_flutter/validators/rules/structure_rules.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_context.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_result.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_rule.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/rules/component_rules.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/rules/info_rules.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/rules/path_rules.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/rules/security_rules.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/rules/server_rules.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/rules/structure_rules.dart'; -export 'package:swagger_generator_flutter/validators/core/validation_context.dart'; -export 'package:swagger_generator_flutter/validators/core/validation_result.dart'; -export 'package:swagger_generator_flutter/validators/core/validation_rule.dart'; +export 'package:swagger_generator_flutter/pipeline/validate/core/validation_context.dart'; +export 'package:swagger_generator_flutter/pipeline/validate/core/validation_result.dart'; +export 'package:swagger_generator_flutter/pipeline/validate/core/validation_rule.dart'; /// Schema 验证器 class SchemaValidator { @@ -52,4 +52,3 @@ class SchemaValidator { return results.merge(); } } - diff --git a/lib/validators/rules/component_rules.dart b/lib/pipeline/validate/rules/component_rules.dart similarity index 93% rename from lib/validators/rules/component_rules.dart rename to lib/pipeline/validate/rules/component_rules.dart index 0242838..ba2fc58 100644 --- a/lib/validators/rules/component_rules.dart +++ b/lib/pipeline/validate/rules/component_rules.dart @@ -1,7 +1,7 @@ import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_context.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_result.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_rule.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_context.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_result.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_rule.dart'; /// 组件验证规则 class ComponentValidationRule extends ValidationRule { diff --git a/lib/validators/rules/info_rules.dart b/lib/pipeline/validate/rules/info_rules.dart similarity index 83% rename from lib/validators/rules/info_rules.dart rename to lib/pipeline/validate/rules/info_rules.dart index e5f19ac..410e057 100644 --- a/lib/validators/rules/info_rules.dart +++ b/lib/pipeline/validate/rules/info_rules.dart @@ -1,6 +1,6 @@ -import 'package:swagger_generator_flutter/validators/core/validation_context.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_result.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_rule.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_context.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_result.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_rule.dart'; /// API 基本信息验证规则 class InfoValidationRule extends ValidationRule { diff --git a/lib/validators/rules/path_rules.dart b/lib/pipeline/validate/rules/path_rules.dart similarity index 95% rename from lib/validators/rules/path_rules.dart rename to lib/pipeline/validate/rules/path_rules.dart index fcea953..9792618 100644 --- a/lib/validators/rules/path_rules.dart +++ b/lib/pipeline/validate/rules/path_rules.dart @@ -1,7 +1,7 @@ import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_context.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_result.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_rule.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_context.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_result.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_rule.dart'; /// 路径验证规则 class PathValidationRule extends ValidationRule { diff --git a/lib/validators/rules/security_rules.dart b/lib/pipeline/validate/rules/security_rules.dart similarity index 83% rename from lib/validators/rules/security_rules.dart rename to lib/pipeline/validate/rules/security_rules.dart index 46cc584..f8a56ef 100644 --- a/lib/validators/rules/security_rules.dart +++ b/lib/pipeline/validate/rules/security_rules.dart @@ -1,7 +1,7 @@ import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_context.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_result.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_rule.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_context.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_result.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_rule.dart'; /// 安全要求验证规则 class SecurityValidationRule extends ValidationRule { diff --git a/lib/validators/rules/server_rules.dart b/lib/pipeline/validate/rules/server_rules.dart similarity index 88% rename from lib/validators/rules/server_rules.dart rename to lib/pipeline/validate/rules/server_rules.dart index 68780b7..da54fd1 100644 --- a/lib/validators/rules/server_rules.dart +++ b/lib/pipeline/validate/rules/server_rules.dart @@ -1,6 +1,6 @@ -import 'package:swagger_generator_flutter/validators/core/validation_context.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_result.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_rule.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_context.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_result.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_rule.dart'; /// 服务器配置验证规则 class ServerValidationRule extends ValidationRule { diff --git a/lib/validators/rules/structure_rules.dart b/lib/pipeline/validate/rules/structure_rules.dart similarity index 97% rename from lib/validators/rules/structure_rules.dart rename to lib/pipeline/validate/rules/structure_rules.dart index 1721657..e7658b5 100644 --- a/lib/validators/rules/structure_rules.dart +++ b/lib/pipeline/validate/rules/structure_rules.dart @@ -1,7 +1,7 @@ import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_context.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_result.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_rule.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_context.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_result.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_rule.dart'; /// 文档结构验证规则 class StructureValidationRule extends ValidationRule { diff --git a/lib/swagger_generator_flutter.dart b/lib/swagger_generator_flutter.dart index 8d8faf8..d828a46 100644 --- a/lib/swagger_generator_flutter.dart +++ b/lib/swagger_generator_flutter.dart @@ -7,10 +7,5 @@ export 'core/error_reporter.dart'; // 核心模型 export 'core/models.dart'; export 'core/performance_parser.dart'; -// 生成器 -export 'generators/retrofit_api_generator.dart'; // 工具类 export 'utils/string_utils.dart'; -// 验证器 -export 'validators/enhanced_validator.dart'; -export 'validators/schema_validator.dart'; diff --git a/lib/utils/type_validator.dart b/lib/utils/type_validator.dart index 1a32b4c..760db2c 100644 --- a/lib/utils/type_validator.dart +++ b/lib/utils/type_validator.dart @@ -1,5 +1,5 @@ import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/validators/core/validation_result.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/core/validation_result.dart'; /// 类型验证器 /// 提供严格的类型检查和验证功能 @@ -400,7 +400,9 @@ class TypeValidator { /// 验证参数 static ValidationResult _validateParameter( - ApiParameter parameter, String parentPath,) { + ApiParameter parameter, + String parentPath, + ) { final errors = []; final warnings = []; final currentPath = '$parentPath.parameters[${parameter.name}]'; diff --git a/lib/validators/enhanced_validator.dart b/lib/validators/enhanced_validator.dart deleted file mode 100644 index b775ec3..0000000 --- a/lib/validators/enhanced_validator.dart +++ /dev/null @@ -1,4 +0,0 @@ -/// Backward-compat shim for EnhancedValidator -library; - -export 'package:swagger_generator_flutter/pipeline/validate/impl/enhanced_validator.dart'; diff --git a/lib/validators/schema_validator.dart b/lib/validators/schema_validator.dart deleted file mode 100644 index 775e4ec..0000000 --- a/lib/validators/schema_validator.dart +++ /dev/null @@ -1,5 +0,0 @@ -/// Backward-compat shim for schema validator -library; - -export 'package:swagger_generator_flutter/pipeline/validate/impl/schema_validator.dart'; - diff --git a/test/comprehensive_generator_test.dart b/test/comprehensive_generator_test.dart index ad17cae..354eed0 100644 --- a/test/comprehensive_generator_test.dart +++ b/test/comprehensive_generator_test.dart @@ -1,5 +1,5 @@ import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/generators/retrofit_api_generator.dart'; +import 'package:swagger_generator_flutter/pipeline/generate/impl/retrofit_api_generator.dart'; import 'package:test/test.dart'; void main() { diff --git a/test/integration_test.dart b/test/integration_test.dart index 535fcbd..5789b50 100644 --- a/test/integration_test.dart +++ b/test/integration_test.dart @@ -3,8 +3,8 @@ import 'dart:io'; import 'package:swagger_generator_flutter/core/error_reporter.dart'; import 'package:swagger_generator_flutter/core/performance_parser.dart'; -import 'package:swagger_generator_flutter/generators/retrofit_api_generator.dart'; -import 'package:swagger_generator_flutter/validators/enhanced_validator.dart'; +import 'package:swagger_generator_flutter/pipeline/generate/impl/retrofit_api_generator.dart'; +import 'package:swagger_generator_flutter/pipeline/validate/impl/enhanced_validator.dart'; import 'package:test/test.dart'; void main() { diff --git a/test/simple_generator_test.dart b/test/simple_generator_test.dart index d50770c..e3a8689 100644 --- a/test/simple_generator_test.dart +++ b/test/simple_generator_test.dart @@ -1,6 +1,6 @@ import 'package:swagger_generator_flutter/core/models.dart'; -import 'package:swagger_generator_flutter/generators/model_code_generator.dart'; -import 'package:swagger_generator_flutter/generators/retrofit_api_generator.dart'; +import 'package:swagger_generator_flutter/pipeline/generate/apis.dart'; +import 'package:swagger_generator_flutter/pipeline/generate/models.dart'; import 'package:test/test.dart'; void main() {