Files
prefect-go/CONTRIBUTING.md

197 lines
4.5 KiB
Markdown

# Contributing to prefect-go
Thank you for your interest in contributing to prefect-go!
## Development Setup
### Prerequisites
- Go 1.21 or later
- A running Prefect server (for integration tests)
### Clone the Repository
```bash
git clone https://git.schultes.dev/schultesdev/prefect-go.git
cd prefect-go
```
### Install Dependencies
```bash
go mod download
```
## Development Workflow
### Running Tests
```bash
# Run unit tests
make test
# Run integration tests (requires running Prefect server)
make test-integration
# Generate coverage report
make test-coverage
```
### Code Formatting
```bash
# Format code
make fmt
# Run linter
make lint
# Run go vet
make vet
```
### Building Examples
```bash
make build-examples
```
## Project Structure
```
prefect-go/
├── api/ # OpenAPI specifications
├── cmd/ # Command-line tools
│ └── generate/ # Code generator
├── examples/ # Example programs
│ ├── basic/ # Basic usage
│ ├── deployment/ # Deployment examples
│ ├── monitoring/ # Monitoring examples
│ └── pagination/ # Pagination examples
├── pkg/ # Library code
│ ├── client/ # Main client and services
│ ├── errors/ # Error types
│ ├── models/ # Data models
│ ├── pagination/ # Pagination support
│ └── retry/ # Retry logic
└── tools/ # Build tools
```
## Code Style
- Follow standard Go conventions
- Use `gofmt` for formatting
- Write tests for new functionality
- Add GoDoc comments for exported types and functions
- Keep functions focused and small
- Use meaningful variable names
## Commit Messages
- Use clear, descriptive commit messages
- Start with a verb in present tense (e.g., "Add", "Fix", "Update")
- Reference issue numbers when applicable
Example:
```
Add support for work pool queues
Implements work pool queue operations including create, get, and list.
Closes #123
```
## Pull Request Process
1. **Fork** the repository
2. **Create** a feature branch (`git checkout -b feature/amazing-feature`)
3. **Make** your changes
4. **Add** tests for new functionality
5. **Ensure** all tests pass (`make test`)
6. **Run** code formatting (`make fmt`)
7. **Commit** your changes with a clear message
8. **Push** to your fork (`git push origin feature/amazing-feature`)
9. **Open** a Pull Request
### Pull Request Guidelines
- Provide a clear description of the changes
- Reference any related issues
- Ensure CI checks pass
- Request review from maintainers
- Be responsive to feedback
## Adding New Features
### Adding a New Service
1. Add the service struct in `pkg/client/services.go` or a new file
2. Add the service to the `Client` struct in `pkg/client/client.go`
3. Initialize the service in `NewClient()`
4. Implement service methods following existing patterns
5. Add tests for the new service
6. Update documentation
Example:
```go
// NewService represents operations for new resources
type NewService struct {
client *Client
}
func (s *NewService) Get(ctx context.Context, id uuid.UUID) (*models.NewResource, error) {
var resource models.NewResource
path := joinPath("/new_resources", id.String())
if err := s.client.get(ctx, path, &resource); err != nil {
return nil, fmt.Errorf("failed to get resource: %w", err)
}
return &resource, nil
}
```
### Adding New Models
1. Add model structs in `pkg/models/models.go`
2. Follow existing naming conventions (`Resource`, `ResourceCreate`, `ResourceUpdate`)
3. Use proper JSON tags
4. Add documentation comments
## Testing
### Unit Tests
- Write unit tests for all new functions
- Use table-driven tests when appropriate
- Mock external dependencies
- Aim for >80% code coverage
### Integration Tests
- Add integration tests for API operations
- Use the `integration` build tag
- Clean up resources after tests
- Handle test failures gracefully
## Documentation
### GoDoc
- Add package-level documentation
- Document all exported types and functions
- Include examples in documentation when helpful
- Use proper formatting (code blocks, links, etc.)
### Examples
- Add examples for new features in `examples/`
- Make examples runnable and self-contained
- Include error handling
- Add comments explaining key concepts
## Questions?
Feel free to open an issue if you have questions or need clarification.
## License
By contributing, you agree that your contributions will be licensed under the MIT License.