fix(refactor): correct import paths after pipeline migration
- Updated all internal import statements to point to the new 'pipeline' directory structure. - Resolved all 'uri_does_not_exist' and 'undefined_class' errors caused by the refactoring. - The project now passes 'dart analyze' with no errors.
This commit is contained in:
parent
481db5bf8f
commit
53f89940ed
|
|
@ -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<void> 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
|
||||
```
|
||||
|
|
|
|||
|
|
@ -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**: 缓存解析结果并记录耗时
|
||||
|
|
|
|||
|
|
@ -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})
|
||||
|
|
|
|||
|
|
@ -96,6 +96,12 @@ class ApiPath {
|
|||
|
||||
/// 安全要求
|
||||
final List<ApiSecurityRequirement> security;
|
||||
|
||||
bool get isMultipart =>
|
||||
parameters.any((p) => p.type == PropertyType.file) ||
|
||||
(requestBody?.content.keys
|
||||
.any((k) => k.contains('multipart/form-data')) ??
|
||||
false);
|
||||
}
|
||||
|
||||
/// API参数信息
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +0,0 @@
|
|||
/// Backward-compat shim for BaseGenerator
|
||||
library;
|
||||
|
||||
export 'package:swagger_generator_flutter/pipeline/generate/impl/base_generator.dart';
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
/// Backward-compat shim for ModelCodeGenerator
|
||||
library;
|
||||
|
||||
export 'package:swagger_generator_flutter/pipeline/generate/impl/model_code_generator.dart';
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
/// Backward-compat shim for RetrofitApiGenerator
|
||||
library;
|
||||
|
||||
export 'package:swagger_generator_flutter/pipeline/generate/impl/retrofit_api_generator.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';
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +0,0 @@
|
|||
/// Backward-compat shim for SwaggerDataParser
|
||||
library;
|
||||
|
||||
export 'package:swagger_generator_flutter/pipeline/parse/impl/swagger_data_parser.dart';
|
||||
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
/// Backward-compat shim for parser fetcher
|
||||
library;
|
||||
|
||||
export 'package:swagger_generator_flutter/pipeline/parse/impl/swagger_fetcher.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';
|
||||
|
|
|
|||
|
|
@ -363,4 +363,3 @@ class GeneratorOptions {
|
|||
final String endpointsFileName;
|
||||
final String docsFileName;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -237,4 +237,3 @@ String _needsJsonKeyAnnotation(
|
|||
|
||||
return annotations.join(', ');
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -118,4 +118,3 @@ String _getModelSubDirectory(ApiModel model) {
|
|||
return 'result';
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -57,4 +57,3 @@ bool _isPaginationResponseModel(ApiModel model) {
|
|||
|
||||
return isTotalNumeric && isItemsArray;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ mixin RetrofitApiGrouping {
|
|||
}
|
||||
|
||||
/// 按版本分组 API paths
|
||||
/// 返回: Map<版本, Map<Tag, List<ApiPath>>>
|
||||
/// 返回: `Map<版本, Map<Tag, List<ApiPath>>>`
|
||||
Map<String, Map<String, List<ApiPath>>> groupApisByVersion(
|
||||
List<ApiPath> paths,
|
||||
) {
|
||||
|
|
@ -51,4 +51,3 @@ mixin RetrofitApiGrouping {
|
|||
return groups;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,4 +18,3 @@ class ApiMethodParameter {
|
|||
final String description;
|
||||
final dynamic defaultValue;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -120,4 +120,3 @@ mixin RetrofitApiParameterEntities {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -288,4 +288,3 @@ mixin RetrofitApiReturnTypes {
|
|||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ mixin RetrofitApiSchemaComposition {
|
|||
RetrofitApiGenerator get _g => this as RetrofitApiGenerator;
|
||||
|
||||
/// 组合模式 Schema 处理
|
||||
String? _extractTypeFromCompositionSchema(Map<String, dynamic> schema) {
|
||||
String? extractTypeFromCompositionSchema(Map<String, dynamic> schema) {
|
||||
if (schema['discriminator'] != null) {
|
||||
final discriminatorType = _handleDiscriminatorSchema(schema);
|
||||
if (discriminatorType != null) {
|
||||
|
|
@ -52,7 +52,7 @@ mixin RetrofitApiSchemaComposition {
|
|||
}
|
||||
return 'List<dynamic>';
|
||||
} 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 {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -64,14 +64,14 @@ mixin RetrofitApiSchema {
|
|||
return 'List<dynamic>';
|
||||
}
|
||||
} 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,8 +5,10 @@ mixin RetrofitApiTemplateData {
|
|||
|
||||
List<String> _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<String, dynamic> _buildApiClassData(List<ApiPath> 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<String> _getImportsForPaths(List<ApiPath> paths) {
|
||||
final imports = <String>{};
|
||||
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(),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -3,4 +3,3 @@
|
|||
library;
|
||||
|
||||
export 'package:swagger_generator_flutter/commands/services/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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -81,4 +81,3 @@ class SwaggerFetcher {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -82,4 +82,3 @@ class TemplateLoader {
|
|||
_cache.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -90,4 +90,3 @@ class TemplateRenderer {
|
|||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,3 @@
|
|||
library;
|
||||
|
||||
export 'package:swagger_generator_flutter/core/template_renderer.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 {
|
||||
|
|
@ -1,6 +1,3 @@
|
|||
/// Pipeline: validate
|
||||
/// Re-export enhanced validator (decorator over schema validator).
|
||||
library;
|
||||
|
||||
export 'package:swagger_generator_flutter/validators/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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
@ -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 {
|
||||
|
|
@ -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 {
|
||||
|
|
@ -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 {
|
||||
|
|
@ -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 {
|
||||
|
|
@ -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 {
|
||||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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 = <ValidationError>[];
|
||||
final warnings = <ValidationWarning>[];
|
||||
final currentPath = '$parentPath.parameters[${parameter.name}]';
|
||||
|
|
|
|||
|
|
@ -1,4 +0,0 @@
|
|||
/// Backward-compat shim for EnhancedValidator
|
||||
library;
|
||||
|
||||
export 'package:swagger_generator_flutter/pipeline/validate/impl/enhanced_validator.dart';
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
/// Backward-compat shim for schema validator
|
||||
library;
|
||||
|
||||
export 'package:swagger_generator_flutter/pipeline/validate/impl/schema_validator.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() {
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Reference in New Issue