370 lines
7.4 KiB
Markdown
370 lines
7.4 KiB
Markdown
# 贡献指南
|
||
|
||
感谢您对 Swagger Generator Flutter 项目的关注!我们欢迎各种形式的贡献。
|
||
|
||
## 🤝 如何贡献
|
||
|
||
### 报告问题
|
||
|
||
如果您发现了 bug 或有功能建议,请:
|
||
|
||
1. 检查 [现有 Issues](https://github.com/your-repo/swagger_generator_flutter/issues) 是否已有相关报告
|
||
2. 如果没有,请创建新的 Issue,包含:
|
||
- 清晰的标题和描述
|
||
- 重现步骤(如果是 bug)
|
||
- 期望的行为
|
||
- 实际的行为
|
||
- 环境信息(Dart/Flutter 版本等)
|
||
- 相关的代码片段或错误日志
|
||
|
||
### 提交代码
|
||
|
||
1. **Fork 项目**
|
||
```bash
|
||
git clone https://github.com/your-username/swagger_generator_flutter.git
|
||
cd swagger_generator_flutter
|
||
```
|
||
|
||
2. **创建分支**
|
||
```bash
|
||
git checkout -b feature/your-feature-name
|
||
# 或
|
||
git checkout -b fix/your-bug-fix
|
||
```
|
||
|
||
3. **安装依赖**
|
||
```bash
|
||
flutter pub get
|
||
```
|
||
|
||
4. **进行更改**
|
||
- 遵循项目的代码风格
|
||
- 添加必要的测试
|
||
- 更新相关文档
|
||
|
||
5. **运行测试**
|
||
```bash
|
||
dart test
|
||
```
|
||
|
||
6. **提交更改**
|
||
```bash
|
||
git add .
|
||
git commit -m "feat: add new feature" # 遵循 Conventional Commits
|
||
```
|
||
|
||
7. **推送分支**
|
||
```bash
|
||
git push origin feature/your-feature-name
|
||
```
|
||
|
||
8. **创建 Pull Request**
|
||
- 提供清晰的 PR 描述
|
||
- 链接相关的 Issues
|
||
- 确保所有检查通过
|
||
|
||
## 📝 代码风格
|
||
|
||
### Dart 代码风格
|
||
|
||
我们遵循 [Dart 官方代码风格指南](https://dart.dev/guides/language/effective-dart/style):
|
||
|
||
```dart
|
||
// ✅ 好的示例
|
||
class ApiGenerator {
|
||
final String className;
|
||
final bool generateModels;
|
||
|
||
ApiGenerator({
|
||
required this.className,
|
||
this.generateModels = true,
|
||
});
|
||
|
||
String generateCode() {
|
||
// 实现逻辑
|
||
return 'generated code';
|
||
}
|
||
}
|
||
|
||
// ❌ 不好的示例
|
||
class api_generator {
|
||
String class_name;
|
||
bool generate_models;
|
||
|
||
api_generator(this.class_name, this.generate_models);
|
||
|
||
String generate_code() {
|
||
return "generated code";
|
||
}
|
||
}
|
||
```
|
||
|
||
### 命名约定
|
||
|
||
- **类名**: PascalCase (`ApiGenerator`)
|
||
- **方法名**: camelCase (`generateCode`)
|
||
- **变量名**: camelCase (`className`)
|
||
- **常量**: SCREAMING_SNAKE_CASE (`DEFAULT_TIMEOUT`)
|
||
- **文件名**: snake_case (`api_generator.dart`)
|
||
|
||
### 注释规范
|
||
|
||
```dart
|
||
/// 生成 Retrofit API 代码的生成器
|
||
///
|
||
/// 支持多种配置选项,包括:
|
||
/// - 模块化 API 生成
|
||
/// - 基础响应类型
|
||
/// - 分页支持
|
||
///
|
||
/// 示例用法:
|
||
/// ```dart
|
||
/// final generator = RetrofitApiGenerator(
|
||
/// className: 'ApiService',
|
||
/// splitByTags: true,
|
||
/// );
|
||
/// ```
|
||
class RetrofitApiGenerator {
|
||
/// API 服务类名
|
||
final String className;
|
||
|
||
/// 是否按标签分割 API
|
||
final bool splitByTags;
|
||
|
||
/// 创建 Retrofit API 生成器
|
||
///
|
||
/// [className] 生成的 API 服务类名
|
||
/// [splitByTags] 是否按标签分割成多个 API 类
|
||
RetrofitApiGenerator({
|
||
this.className = 'ApiService',
|
||
this.splitByTags = false,
|
||
});
|
||
}
|
||
```
|
||
|
||
## 🧪 测试指南
|
||
|
||
### 测试结构
|
||
|
||
```
|
||
tests/
|
||
├── unit/ # 单元测试
|
||
│ ├── generators/ # 生成器测试
|
||
│ ├── parsers/ # 解析器测试
|
||
│ └── validators/ # 验证器测试
|
||
├── integration/ # 集成测试
|
||
└── fixtures/ # 测试数据
|
||
```
|
||
|
||
### 编写测试
|
||
|
||
```dart
|
||
import 'package:test/test.dart';
|
||
import 'package:swagger_generator_flutter/swagger_generator_flutter.dart';
|
||
|
||
void main() {
|
||
group('RetrofitApiGenerator', () {
|
||
late RetrofitApiGenerator generator;
|
||
|
||
setUp(() {
|
||
generator = RetrofitApiGenerator(
|
||
className: 'TestApi',
|
||
splitByTags: false,
|
||
);
|
||
});
|
||
|
||
test('should generate basic API structure', () {
|
||
// Arrange
|
||
final document = createTestDocument();
|
||
|
||
// Act
|
||
final result = generator.generateFromDocument(document);
|
||
|
||
// Assert
|
||
expect(result, contains('abstract class TestApi'));
|
||
expect(result, contains('@RestApi()'));
|
||
});
|
||
|
||
test('should handle empty document', () {
|
||
// Arrange
|
||
final emptyDocument = createEmptyDocument();
|
||
|
||
// Act & Assert
|
||
expect(() => generator.generateFromDocument(emptyDocument),
|
||
returnsNormally);
|
||
});
|
||
});
|
||
}
|
||
|
||
SwaggerDocument createTestDocument() {
|
||
return SwaggerDocument(
|
||
title: 'Test API',
|
||
version: '1.0.0',
|
||
description: 'Test',
|
||
servers: [],
|
||
components: ApiComponents(schemas: {}, securitySchemes: {}),
|
||
paths: {},
|
||
models: {},
|
||
controllers: {},
|
||
security: [],
|
||
);
|
||
}
|
||
```
|
||
|
||
### 测试覆盖率
|
||
|
||
我们目标是保持 90%+ 的测试覆盖率:
|
||
|
||
```bash
|
||
# 运行测试并生成覆盖率报告
|
||
dart test --coverage=coverage
|
||
genhtml coverage/lcov.info -o coverage/html
|
||
```
|
||
|
||
## 📚 文档贡献
|
||
|
||
### 文档类型
|
||
|
||
1. **API 文档**: 代码中的 dartdoc 注释
|
||
2. **用户指南**: README.md 和 docs/ 目录
|
||
3. **示例代码**: example/ 目录
|
||
4. **迁移指南**: MIGRATION_GUIDE.md
|
||
|
||
### 文档风格
|
||
|
||
- 使用清晰、简洁的语言
|
||
- 提供实际的代码示例
|
||
- 包含常见用例和最佳实践
|
||
- 保持文档与代码同步
|
||
|
||
## 🔄 发布流程
|
||
|
||
### 版本号规范
|
||
|
||
我们遵循 [语义化版本](https://semver.org/lang/zh-CN/):
|
||
|
||
- **主版本号**: 不兼容的 API 修改
|
||
- **次版本号**: 向下兼容的功能性新增
|
||
- **修订号**: 向下兼容的问题修正
|
||
|
||
### 提交信息规范
|
||
|
||
我们使用 [Conventional Commits](https://www.conventionalcommits.org/zh-hans/):
|
||
|
||
```
|
||
<类型>[可选的作用域]: <描述>
|
||
|
||
[可选的正文]
|
||
|
||
[可选的脚注]
|
||
```
|
||
|
||
**类型:**
|
||
- `feat`: 新功能
|
||
- `fix`: 修复 bug
|
||
- `docs`: 文档更新
|
||
- `style`: 代码格式调整
|
||
- `refactor`: 重构
|
||
- `test`: 测试相关
|
||
- `chore`: 构建过程或辅助工具的变动
|
||
|
||
**示例:**
|
||
```
|
||
feat(generator): add support for file upload
|
||
|
||
- Add MultipartFile support in OptimizedRetrofitGenerator
|
||
- Generate proper @MultiPart annotations
|
||
- Update tests and documentation
|
||
|
||
Closes #123
|
||
```
|
||
|
||
## 🏗️ 开发环境设置
|
||
|
||
### 必需工具
|
||
|
||
- Dart SDK 3.0+
|
||
- Flutter SDK 3.0+
|
||
- Git
|
||
|
||
### 推荐工具
|
||
|
||
- VS Code 或 IntelliJ IDEA
|
||
- Dart 和 Flutter 插件
|
||
- Git hooks (pre-commit)
|
||
|
||
### 环境配置
|
||
|
||
1. **克隆项目**
|
||
```bash
|
||
git clone https://github.com/your-repo/swagger_generator_flutter.git
|
||
cd swagger_generator_flutter
|
||
```
|
||
|
||
2. **安装依赖**
|
||
```bash
|
||
flutter pub get
|
||
```
|
||
|
||
3. **运行测试**
|
||
```bash
|
||
dart test
|
||
```
|
||
|
||
4. **运行示例**
|
||
```bash
|
||
dart run example/basic_usage.dart
|
||
```
|
||
|
||
### 开发工作流
|
||
|
||
1. 创建功能分支
|
||
2. 编写代码和测试
|
||
3. 运行所有测试
|
||
4. 更新文档
|
||
5. 提交代码
|
||
6. 创建 Pull Request
|
||
|
||
## 🎯 贡献领域
|
||
|
||
我们特别欢迎以下领域的贡献:
|
||
|
||
### 高优先级
|
||
- 🐛 Bug 修复
|
||
- 📚 文档改进
|
||
- 🧪 测试覆盖率提升
|
||
- 🚀 性能优化
|
||
|
||
### 中优先级
|
||
- ✨ 新功能开发
|
||
- 🔧 工具改进
|
||
- 📝 示例代码
|
||
- 🌐 国际化支持
|
||
|
||
### 低优先级
|
||
- 🎨 UI/UX 改进
|
||
- 📦 依赖更新
|
||
- 🔍 代码质量提升
|
||
|
||
## 📞 联系我们
|
||
|
||
- **GitHub Issues**: 报告 bug 和功能请求
|
||
- **GitHub Discussions**: 一般讨论和问题
|
||
- **Email**: maintainer@example.com
|
||
|
||
## 📄 许可证
|
||
|
||
通过贡献代码,您同意您的贡献将在与项目相同的 [MIT 许可证](LICENSE) 下授权。
|
||
|
||
## 🙏 致谢
|
||
|
||
感谢所有贡献者的努力!您的贡献让这个项目变得更好。
|
||
|
||
### 贡献者列表
|
||
|
||
<!-- 这里会自动生成贡献者列表 -->
|
||
|
||
---
|
||
|
||
再次感谢您的贡献!🎉
|