First off, thank you for considering contributing to Faborite! 🎉 It's people like you that make Faborite such a great tool.
This project and everyone participating in it is governed by the Faborite Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to michael@datachain.consulting.
Before creating bug reports, please check the existing issues to avoid duplicates. When you create a bug report, please include as many details as possible:
Bug Report Template:
- Title: A clear and descriptive title
- Description: A clear and concise description of the bug
- Steps to Reproduce: Step-by-step instructions to reproduce the behavior
- Expected Behavior: What you expected to happen
- Actual Behavior: What actually happened
- Environment:
- Faborite version
- Operating System
- .NET version
- Fabric workspace type
Enhancement suggestions are tracked as GitHub issues. When creating an enhancement suggestion, please include:
- Use case: Why is this enhancement useful?
- Proposed solution: A clear description of what you want to happen
- Alternatives considered: Any alternative solutions you've considered
- Fork the repository and create your branch from
main - Make your changes following our coding standards
- Write or update tests for your changes
- Ensure all tests pass by running
dotnet test - Update documentation if needed
- Submit a pull request
# Clone your fork
git clone https://github.com/YOUR_USERNAME/faborite.git
cd faborite
# Add upstream remote
git remote add upstream https://github.com/mjtpena/faborite.git
# Install dependencies and build
dotnet restore
dotnet build
# Run tests
dotnet test
# Run with coverage
dotnet test --collect:"XPlat Code Coverage"faborite/
├── src/
│ ├── Faborite.Core/ # Core library (main logic)
│ └── Faborite.Cli/ # CLI application
├── tests/
│ ├── Faborite.Core.Tests/ # Unit tests for core
│ └── Faborite.Cli.Tests/ # Unit tests for CLI
└── docs/ # Documentation
- Follow Microsoft's C# Coding Conventions
- Use meaningful variable and method names
- Keep methods small and focused (single responsibility)
- Use async/await for I/O operations
- Add XML documentation comments for public APIs
// ✅ Good
public async Task<TableSyncResult> SyncTableAsync(
string tableName,
CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNullOrEmpty(tableName);
// Implementation...
}
// ❌ Bad
public async Task<TableSyncResult> Sync(string t)
{
// No validation, poor naming
}Follow the Conventional Commits specification:
<type>(<scope>): <description>
[optional body]
[optional footer]
Types:
feat: A new featurefix: A bug fixdocs: Documentation only changesstyle: Changes that don't affect code meaning (formatting)refactor: Code change that neither fixes a bug nor adds a featureperf: Performance improvementstest: Adding or updating testschore: Changes to build process or auxiliary tools
Examples:
feat(sampling): add stratified sampling strategy
fix(onelake): handle connection timeout properly
docs(readme): update installation instructions
test(exporter): add tests for CSV export
- Write unit tests for all new functionality
- Maintain test coverage above 80%
- Use descriptive test names that explain the scenario
// ✅ Good test name
[Fact]
public async Task SyncTableAsync_WithInvalidTableName_ThrowsArgumentException()
// ❌ Bad test name
[Fact]
public async Task Test1()Before submitting a PR, ensure:
- Code compiles without errors
- All tests pass (
dotnet test) - New code has appropriate test coverage
- Documentation is updated if needed
- Commit messages follow conventions
- PR description explains the changes
Looking for something to work on? Check out issues labeled:
good first issue- Great for newcomershelp wanted- Issues where we need help
- GitHub Discussions: Ask questions and share ideas
- GitHub Issues: Report bugs or request features
- Email: michael@datachain.consulting
Contributors will be recognized in our README and release notes. We appreciate every contribution, no matter how small!
By contributing to Faborite, you agree that your contributions will be licensed under its MIT license.
Thank you for contributing! 🙏