Contributing
============
Thank you for your interest in contributing to Rain CLI! This document provides guidelines and information for contributors.
Getting Started
---------------
Development Setup
~~~~~~~~~~~~~~~~~
1. **Fork and Clone**
Fork the repository on GitHub and clone your fork:
.. code-block:: bash
git clone https://github.com/yourusername/rain.git
cd rain
2. **Set up Development Environment**
Create a virtual environment and install dependencies:
.. code-block:: bash
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -e .
pip install -r requirements-dev.txt
3. **Install Optional Dependencies**
For full functionality during development:
.. code-block:: bash
pip install netifaces distro GPUtil py-cpuinfo
4. **Verify Installation**
Test that everything works:
.. code-block:: bash
rain --version
python -m pytest
Project Structure
-----------------
Understanding the codebase:
.. code-block:: text
rain/
├── cli/
│ └── main.py # Main CLI entry point
├── core/
│ ├── collector.py # System information collection
│ └── robust_collector.py # Robust collection with fallbacks
├── tests/
│ └── test_*.py # Test files
├── docs/
│ ├── conf.py # Sphinx configuration
│ └── *.rst # Documentation files
├── setup.py # Package setup
└── README.md # Project readme
Key Components
~~~~~~~~~~~~~~
**CLI Module (``cli/main.py``)**
- Command-line interface implementation
- Argument parsing and validation
- Output formatting and display
**Core Module (``core/collector.py``)**
- System information collection
- Cross-platform compatibility
- Performance optimization
**Robust Collector (``core/robust_collector.py``)**
- Error-resistant collection methods
- Graceful degradation
- Fallback implementations
How to Contribute
-----------------
Types of Contributions
~~~~~~~~~~~~~~~~~~~~~~
We welcome various types of contributions:
- **Bug Reports**: Help us identify and fix issues
- **Feature Requests**: Suggest new functionality
- **Code Contributions**: Implement features or fix bugs
- **Documentation**: Improve or expand documentation
- **Testing**: Add test coverage or improve existing tests
Reporting Bugs
~~~~~~~~~~~~~~
When reporting bugs, please include:
1. **Environment Information**:
- Operating system and version
- Python version
- Rain CLI version
- Output of ``rain --json`` (if relevant)
2. **Steps to Reproduce**:
- Exact commands that trigger the issue
- Expected vs. actual behavior
- Any error messages
3. **Additional Context**:
- Screenshots (if applicable)
- System specifications
- Other relevant software versions
**Bug Report Template**:
.. code-block:: text
**Environment**
- OS: [e.g., Ubuntu 20.04, macOS 12.0, Windows 10]
- Python: [e.g., 3.9.7]
- Rain CLI: [e.g., 1.0.0]
**Description**
A clear description of the bug.
**Steps to Reproduce**
1. Run `rain ...`
2. See error
**Expected Behavior**
What you expected to happen.
**Actual Behavior**
What actually happened.
**Additional Context**
Any other relevant information.
Suggesting Features
~~~~~~~~~~~~~~~~~~~
For feature requests, please:
1. **Check Existing Issues**: Ensure the feature hasn't been requested
2. **Describe the Use Case**: Explain why this feature would be useful
3. **Propose Implementation**: If you have ideas on how to implement it
4. **Consider Scope**: Keep features focused and maintainable
**Feature Request Template**:
.. code-block:: text
**Feature Description**
A clear description of the proposed feature.
**Use Case**
Why would this feature be useful? What problem does it solve?
**Proposed Implementation**
If you have ideas on how to implement this feature.
**Alternatives Considered**
Other approaches you've considered.
Code Contributions
~~~~~~~~~~~~~~~~~~
Development Workflow
^^^^^^^^^^^^^^^^^^^^^
1. **Create an Issue**: Discuss your changes before implementing
2. **Create a Branch**: Use descriptive branch names
3. **Make Changes**: Follow coding standards and test your changes
4. **Submit a Pull Request**: Include a clear description
**Branch Naming**:
- ``feature/description`` for new features
- ``fix/description`` for bug fixes
- ``docs/description`` for documentation changes
**Commit Messages**:
Use clear, descriptive commit messages:
.. code-block:: text
Add CPU temperature monitoring for Linux
- Implement temperature collection using /sys/class/thermal
- Add fallback for systems without thermal sensors
- Update tests for new functionality
Closes #123
Coding Standards
^^^^^^^^^^^^^^^^
**Python Style**:
- Follow PEP 8
- Use type hints where appropriate
- Write docstrings for functions and classes
- Keep functions focused and small
**Code Quality**:
- Run tests before submitting: ``python -m pytest``
- Check code style: ``flake8``
- Ensure type correctness: ``mypy`` (if configured)
**Example Function**:
.. code-block:: python
def get_cpu_temperature() -> Optional[float]:
"""Get CPU temperature in Celsius.
Returns:
CPU temperature in Celsius, or None if unavailable.
Raises:
OSError: If temperature sensors are not accessible.
"""
try:
with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f:
temp_millidegrees = int(f.read().strip())
return temp_millidegrees / 1000.0
except (FileNotFoundError, PermissionError, ValueError):
return None
Testing
^^^^^^^
**Writing Tests**:
- Add tests for new functionality
- Test edge cases and error conditions
- Use meaningful test names
- Mock external dependencies
**Test Categories**:
- **Unit Tests**: Test individual functions
- **Integration Tests**: Test component interactions
- **Platform Tests**: Test cross-platform compatibility
**Example Test**:
.. code-block:: python
def test_get_cpu_temperature_success():
"""Test successful CPU temperature retrieval."""
with patch('builtins.open', mock_open(read_data='45000')):
temp = get_cpu_temperature()
assert temp == 45.0
def test_get_cpu_temperature_file_not_found():
"""Test handling of missing temperature file."""
with patch('builtins.open', side_effect=FileNotFoundError):
temp = get_cpu_temperature()
assert temp is None
Documentation
~~~~~~~~~~~~~
**Documentation Types**:
- **User Documentation**: How to use Rain CLI
- **Developer Documentation**: How to contribute and extend
- **API Documentation**: Function and module references
**Writing Guidelines**:
- Use clear, concise language
- Include practical examples
- Keep documentation up-to-date with code changes
- Test documentation examples
**Building Documentation**:
.. code-block:: bash
cd docs
sphinx-build -b html . _build/html
Pull Request Process
--------------------
Submission Guidelines
~~~~~~~~~~~~~~~~~~~~~
1. **Pre-submission Checklist**:
- [ ] Tests pass locally
- [ ] Code follows style guidelines
- [ ] Documentation is updated
- [ ] Commit messages are clear
- [ ] Branch is up-to-date with main
2. **Pull Request Description**:
- Clear title summarizing changes
- Detailed description of what changed
- Reference related issues
- Include testing notes
**Pull Request Template**:
.. code-block:: text
## Description
Brief description of changes.
## Changes Made
- List of specific changes
- Another change
## Testing
- How the changes were tested
- Any manual testing performed
## Related Issues
Closes #123
## Screenshots (if applicable)
[Include screenshots for UI changes]
Review Process
~~~~~~~~~~~~~~
1. **Automated Checks**: CI/CD runs tests and checks
2. **Code Review**: Maintainers review code quality and design
3. **Testing**: Changes are tested on different platforms
4. **Merge**: Approved changes are merged to main branch
**Review Criteria**:
- Code quality and style
- Test coverage
- Documentation completeness
- Performance impact
- Cross-platform compatibility
Release Process
---------------
Rain CLI follows semantic versioning (SemVer):
- **Major (x.0.0)**: Breaking changes
- **Minor (0.x.0)**: New features, backward compatible
- **Patch (0.0.x)**: Bug fixes, backward compatible
Community Guidelines
--------------------
Code of Conduct
~~~~~~~~~~~~~~~
We are committed to providing a welcoming and inclusive environment:
- **Be Respectful**: Treat everyone with respect and kindness
- **Be Collaborative**: Work together constructively
- **Be Patient**: Help others learn and grow
- **Be Inclusive**: Welcome diverse perspectives and backgrounds
Communication
~~~~~~~~~~~~~
- **GitHub Issues**: Bug reports and feature requests
- **Pull Requests**: Code discussions and reviews
- **Discussions**: General questions and community support
Recognition
~~~~~~~~~~~
Contributors are recognized in:
- ``CONTRIBUTORS.md`` file
- Release notes
- Project documentation
Getting Help
------------
If you need help contributing:
1. **Check Documentation**: Start with this guide and user documentation
2. **Search Issues**: Look for similar questions or problems
3. **Ask Questions**: Open a discussion or issue for help
4. **Contact Maintainers**: Reach out directly if needed
**Useful Resources**:
- `GitHub Flow Guide `_
- `Python Style Guide (PEP 8) `_
- `Sphinx Documentation `_
Thank you for contributing to Rain CLI! Your help makes this project better for everyone.