Contributing Guidelines
=======================
We welcome contributions to BaseAttentive! This guide will help you get started.
Code of Conduct
---------------
We are committed to providing a welcoming and inspiring community for all. Please
refer to our `Code of Conduct <../CODE_OF_CONDUCT.md>`_ for our community
standards.
Getting Started
---------------
1. **Fork the repository**
Click the "Fork" button in the GitHub interface to create your own copy.
2. **Clone your fork**
.. code-block:: bash
git clone https://github.com/yourusername/base-attentive.git
cd base-attentive
3. **Add upstream remote**
.. code-block:: bash
git remote add upstream https://github.com/earthai-tech/base-attentive.git
4. **Create a feature branch**
.. code-block:: bash
git checkout -b feature/your-feature-name
5. **Set up development environment**
.. code-block:: bash
conda create -n base-attentive python=3.10
conda activate base-attentive
pip install -e ".[dev,tensorflow]"
Types of Contributions
----------------------
**Bug Reports**
Submit a GitHub issue with:
- Clear title and description
- Steps to reproduce
- Expected vs actual behavior
- Environment details (OS, Python version, etc.)
**Feature Requests**
Submit a GitHub issue with:
- Clear title and description
- Use case and motivation
- Proposed API/usage
- Alternative approaches considered
**Documentation**
Improve docstrings, examples, or guides:
- Fix typos and clarity
- Add examples
- Improve structure
- Add missing sections
**Code Quality**
Improve test coverage, performance, or style:
- Add tests for untested code
- Optimize performance
- Refactor for clarity
- Fix linting issues
**Bug Fixes & Features**
Implement fixes and features:
- Follow all guidelines below
- Include tests
- Update documentation
- Add changelog entry
Pull Request Process
--------------------
1. **Before you start**
- Check for existing issues/PRs
- Discuss major changes first
- Install dev dependencies
2. **Make your changes**
- Follow code standards (see below)
- Add tests for new functionality
- Update docstrings
- Update relevant documentation
3. **Test locally**
.. code-block:: bash
# Run tests
pytest tests/ -v
# Check coverage
pytest tests/ --cov=src/base_attentive
# Check style
ruff check src/ tests/
# Format
ruff format src/ tests/
# Type checking
mypy src/base_attentive/
4. **Commit with clear messages**
.. code-block:: bash
git add .
git commit -m "feat: Add feature description
- Detailed explanation of changes
- Additional context if needed
- Fixes #issue_number"
5. **Push to your fork**
.. code-block:: bash
git push origin feature/your-feature-name
6. **Create a pull request**
- Go to GitHub and create a PR
- Link related issues with "Fixes #123"
- Describe your changes clearly
- Explain why the change is needed
7. **Respond to feedback**
- Be open to suggestions
- Make requested changes
- Push updates to the same branch
Code Style Guide
----------------
**Python Style**
- Follow **PEP 8**
- Line length: 95 characters
- Use double quotes for strings
- 4 spaces for indentation
- Add ``from __future__ import annotations`` at the top of every module
**Type Hints**
All functions must have type hints:
.. code-block:: python
from __future__ import annotations
from typing import Optional, Tuple
import numpy as np
def predict(
features: np.ndarray,
quantiles: Optional[list[float]] = None,
) -> Tuple[np.ndarray, Optional[np.ndarray]]:
"""Make predictions with optional quantiles."""
pass
**Docstrings**
Use NumPy-style docstrings:
.. code-block:: python
from __future__ import annotations
import numpy as np
def validate_inputs(
static: np.ndarray,
dynamic: np.ndarray,
future: np.ndarray,
) -> None:
"""Validate input array shapes and types.
Parameters
----------
static : np.ndarray
Static features of shape (batch, static_dim)
dynamic : np.ndarray
Dynamic features of shape (batch, time_steps, dynamic_dim)
future : np.ndarray
Future features of shape (batch, horizon, future_dim)
Raises
------
ValueError
If any array has incompatible shape or type
TypeError
If input is not an array
Examples
--------
>>> validate_inputs(s, d, f) # Returns None if valid
"""
pass
**Imports**
Group and sort imports:
.. code-block:: python
# 1. Standard library
from __future__ import annotations
from pathlib import Path
import re
# 2. Third-party
import numpy as np
import keras
# 3. Local
from .utils import helper_function
from .components import BaseComponent
Testing Requirements
--------------------
**Coverage**
- New code must have test coverage
- Aim for >80% line coverage on new modules
- Run: ``pytest tests/ --cov=src/base_attentive --cov-report=html``
**Test Organization**
.. code-block:: python
import pytest
import numpy as np
from base_attentive import BaseAttentive
class TestMyFeature:
"""Tests for my feature."""
@pytest.fixture
def model(self):
"""Create a test model."""
return BaseAttentive(
static_input_dim=4,
dynamic_input_dim=8,
future_input_dim=6,
output_dim=1,
forecast_horizon=12,
embed_dim=16,
)
def test_basic_functionality(self, model):
"""Test basic usage."""
static = np.random.randn(2, 4).astype("float32")
dynamic = np.random.randn(2, 50, 8).astype("float32")
future = np.random.randn(2, 12, 6).astype("float32")
result = model([static, dynamic, future], training=False)
assert result.shape == (2, 12, 1)
def test_edge_case(self, model):
"""Test edge case handling."""
# Test boundary conditions
pass
def test_error_handling(self):
"""Test error messages."""
with pytest.raises(ValueError):
BaseAttentive(
static_input_dim=-1,
dynamic_input_dim=8,
future_input_dim=6,
output_dim=1,
forecast_horizon=12,
)
**Running Tests**
.. code-block:: bash
# Run all tests
pytest tests/
# Run specific test file
pytest tests/test_backend.py
# Run specific test
pytest tests/test_backend.py::TestBackend::test_method
# Run with coverage
pytest tests/ --cov=src/base_attentive
Documentation Requirements
---------------------------
**Update Documentation**
- Update docstrings if API changes
- Add examples for new features
- Update relevant .rst files in docs/
- Run Sphinx locally to verify: ``sphinx-build -b html docs docs/_build/html``
**Docstring Format**
.. code-block:: python
"""Brief description (one line).
Longer description explaining the function, class, or module
in more detail. Can span multiple lines and paragraphs.
Parameters
----------
param1 : type
Description of param1
param2 : type, optional
Description of param2
Returns
-------
type
Description of return value
Raises
------
ExceptionType
When this exception is raised
See Also
--------
related_function : Brief description
AnotherClass : Brief description
Examples
--------
>>> result = function(arg1, arg2)
>>> print(result)
expected_output
"""
**Documentation File Updates**
- Update table of contents if adding new sections
- Update cross-references
- Add links to new features
- Keep ASCII diagrams up to date
Common Pitfalls to Avoid
------------------------
**Don't:**
- Commit to main branch directly
- Skip tests or documentation
- Use single-letter variable names
- Add large datasets to repo
- Ignore style warnings
- Change unrelated code
**Do:**
- Create feature branches
- Write tests for all code
- Use descriptive names
- Keep commits focused
- Follow style guide
- Keep changes minimal and focused
Commit Message Format
---------------------
Use conventional commits format:
.. code-block:: text
type(scope): subject
body
footer
**Types:**
- ``feat``: New feature
- ``fix``: Bug fix
- ``docs``: Documentation changes
- ``style``: Code style (not logic)
- ``refactor``: Code restructuring
- ``perf``: Performance improvements
- ``test``: Test additions or changes
- ``chore``: Build/dependency changes
**Examples:**
.. code-block:: text
feat(core): Add quantile modeling support
- Implement QuantileDistributionModeling layer
- Add quantile_loss function
- Update BaseAttentive to support quantiles parameter
- Add tests for quantile functionality
Fixes #123
docs(api): Update BaseAttentive docstring
- Add quantile parameter description
- Add examples for probabilistic forecasts
Review Process
--------------
**What we look for:**
- Code follows style guide
- Tests pass and coverage is adequate
- Documentation is clear and complete
- Changes are focused and minimal
- Commit messages are clear
- No breaking changes (or documented)
**Timeline:**
- Small PRs (< 100 lines): 1-2 days
- Medium PRs (100-500 lines): 2-5 days
- Large PRs (> 500 lines): 5-10 days
- Complex features: May require discussion
Getting Help
------------
- Read the `Documentation `_
- Ask in `GitHub Discussions `_
- Open an `Issue `_ for bugs
- Email: etanoyau@gmail.com
Thank You!
----------
Thank you for contributing to BaseAttentive! Your efforts help make this
project better for everyone.
See Also
--------
- `Code of Conduct <../CODE_OF_CONDUCT.md>`_
- `Development Guide `_
- `Architecture Overview <../ARCHITECTURE.md>`_