Spaces:
Sleeping
Sleeping
Contributing to Spatial Metabolic Atlas
Thank you for your interest in contributing! This document provides guidelines for development, testing, and contributions.
π€ How to Contribute
Types of Contributions
- Bug Fixes: Report and fix issues
- Features: Add new analysis modules or visualizations
- Documentation: Improve guides and examples
- Tests: Add unit and integration tests
- Performance: Optimize existing code
π§ Development Setup
1. Clone Repository
git clone <repo-url>
cd streamlit_app
2. Create Development Environment
# Create virtual environment
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Install dependencies with dev extras
pip install -r requirements.txt
pip install -e . # If using setup.py
3. Install Pre-commit Hooks
pip install pre-commit
pre-commit install
π Code Style
Python Style Guide (PEP 8)
# Format code
black modules/ utils/
# Check linting
flake8 modules/ utils/
# Type checking
mypy modules/ utils/
Docstring Format
def example_function(param1: str, param2: int) -> bool:
"""
Brief description of function.
Longer description if needed, explaining the purpose,
algorithm, or important details.
Parameters
----------
param1 : str
Description of param1
param2 : int
Description of param2
Returns
-------
bool
Description of return value
Examples
--------
>>> result = example_function("test", 42)
>>> print(result)
True
Notes
-----
Additional implementation notes or warnings.
"""
return True
π§ͺ Testing
Running Tests
# Run all tests
pytest
# Run specific test file
pytest tests/test_visualization.py
# Run with coverage
pytest --cov=modules --cov=utils tests/
# Verbose output
pytest -v
Writing Tests
# tests/test_module.py
import pytest
from modules import visualization
def test_spatial_flux_map_basic():
"""Test basic spatial flux map generation."""
# Setup
mock_adata = create_mock_adata()
# Action
fig = visualization.plot_spatial_flux(mock_adata, 'EX_glc_D[e]')
# Assert
assert fig is not None
assert fig.axes is not None
def test_visualization_with_invalid_reaction():
"""Test error handling for invalid reactions."""
mock_adata = create_mock_adata()
with pytest.raises(ValueError):
visualization.plot_spatial_flux(mock_adata, 'INVALID_RXN')
π¦ Adding New Modules
Structure for New Feature
modules/
βββ new_feature.py # Main module
βββ __init__.py
βββ tests/
βββ test_new_feature.py
Module Template
"""
New Feature Module
==================
Brief description of functionality.
"""
import streamlit as st
import logging
logger = logging.getLogger(__name__)
def render():
"""Render feature UI."""
st.markdown("## π New Feature")
# Check prerequisites
if st.session_state.metabolic_adata is None:
st.error("Please run flux analysis first.")
return
metabolic_adata = st.session_state.metabolic_adata
# UI components
col1, col2 = st.columns(2)
with col1:
# Input controls
parameter = st.slider("Parameter:", 1, 100, 50)
with col2:
# Additional options
method = st.selectbox("Method:", ["option1", "option2"])
# Main computation
if st.button("βΆοΈ Run Analysis") :
try:
with st.spinner("Computing..."):
result = perform_analysis(metabolic_adata, parameter, method)
st.success("β Analysis complete!")
st.dataframe(result)
except Exception as e:
st.error(f"Error: {str(e)}")
logger.error(f"Analysis failed: {str(e)}", exc_info=True)
def perform_analysis(adata, parameter, method):
"""
Perform custom analysis.
Parameters
----------
adata : AnnData
Input data
parameter : int
Analysis parameter
method : str
Analysis method
Returns
-------
pd.DataFrame
Analysis results
"""
# Implementation
results = {}
return results
Integrating into Main App
# app.py
elif page == "π New Feature":
from modules import new_feature
new_feature.render()
π Documentation
Adding to README.md
- Update feature list under "Features"
- Add usage instructions in "Usage Guide"
- Include examples and expected outputs
Creating Examples
# examples/basic_workflow.py
"""
Basic workflow example for Spatial Metabolic Atlas.
"""
import scanpy as sc
from streamlit_app.utils import plotting, flux_utils
# Load data
adata = sc.read_h5ad("data/spatial_data.h5ad")
# Preprocess
sc.pp.normalize_total(adata, 1e4)
sc.pp.log1p(adata)
# Visualize
fig = plotting.plot_spatial_flux(adata, "EX_glc_D[e]")
print("Done!")
π Bug Reports
When reporting bugs, include:
- Title: Concise description
- Steps to reproduce: Exact steps to recreate issue
- Expected behavior: What should happen
- Actual behavior: What actually happens
- Screenshots: If applicable
- Environment: Python version, OS, package versions
Bug Report Template
## Bug: [Title]
### Steps to Reproduce
1. Load dataset X
2. Go to Y module
3. Click button Z
4. Get error
### Expected Behavior
Should show visualization
### Actual Behavior
Shows error message: "..."
### Screenshots
[If applicable]
### Environment
- Python: 3.10.5
- Streamlit: 1.28.0
- OS: Ubuntu 22.04
π¨ Feature Requests
Provide:
- Use case: Why is this needed?
- Description: Detailed description
- Example: How would it be used?
- Priority: Low, Medium, High
Feature Request Template
## Feature: [Title]
### Use Case
Researchers want to [use case description]
### Proposed Solution
Implement [feature description]
### Example Usage
[How users would use this feature]
### Additional Context
[Any other relevant information]
π Pull Request Process
- Fork the repository
- Create Branch:
git checkout -b feature/feature-name - Make Changes: Follow code style guidelines
- Write Tests: Add tests for new functionality
- Document: Update README, docstrings, comments
- Commit: Clear, descriptive commit messages
- Push:
git push origin feature/feature-name - Create PR: Open pull request with description
PR Template
## Description
Brief description of changes
## Type
- [ ] Bug fix
- [ ] New feature
- [ ] Documentation
- [ ] Performance
## Changes
- Change 1
- Change 2
## Testing
- [ ] Tests added/updated
- [ ] All tests passing
- [ ] Manual testing completed
## Screenshots
[If applicable]
## Checklist
- [ ] Code follows style guidelines
- [ ] Documentation updated
- [ ] Tests added
- [ ] No breaking changes
ποΈ Architecture Decisions
Module Interface Standard
All modules should:
- Implement
render()function - Check
st.session_statefor prerequisites - Handle errors gracefully with try/except
- Log important operations
- Provide user feedback (success/error messages)
Caching Strategy
@st.cache_data(ttl=3600)
def expensive_computation(data):
"""This will be cached for 1 hour."""
return result
@st.cache_resource
def load_model():
"""This will be cached for entire session."""
return model
π Release Process
Update Version:
app.py: Update version stringsetup.py: Update version- Create CHANGELOG entry
Create Release:
- Tag commit:
git tag v1.0.0 - Push tag:
git push origin v1.0.0 - Create GitHub release with notes
- Tag commit:
Deploy:
- Build Docker image
- Push to registry
- Deploy to production
π Getting Help
- Documentation: Check README.md and DEPLOYMENT.md
- Issues: Search GitHub Issues
- Discussions: Start discussion thread
- Email: contact@example.com
π Code of Conduct
Our Pledge
We are committed to providing a welcoming and inclusive environment.
Our Standards
- Use welcoming language
- Be respectful of differing opinions
- Accept constructive criticism gracefully
- Focus on what is best for the community
- Show empathy towards other community members
Enforcement
Violations may result in removal from the community.
Thank you for contributing! π
Your contributions help make Spatial Metabolic Atlas better for researchers worldwide.
Last Updated: February 2024