:tocdepth: 2 Contributing Guidelines ======================= Thank you for your interest in contributing to the project! This document will help you get started. There are many ways to contribute: - Participate in discussions - Report issues or suggest improvements - Contribute with code to fix bugs or add features - Improve the documentation Reporting issues ---------------- If you find a bug or have a suggestion for improvement, please open an issue. Before doing so, make sure to search for existing ones to avoid duplicates. When opening a new issue, provide as much information as possible. The templates provided will guide you on what to include. In general, the more details you provide, the easier it will be to understand and address the problem. `Short, self-contained, correct examples `__ are always appreciated. If you can provide a code snippet that reproduces the issue, it will be very helpful. Debug information is also important. See the `troubleshooting section in the docs `__ to learn how to gather it. Be sure to exclude any sensitive data. Contributing with code ---------------------- All code contributions must be made through Pull Requests. When contributing, please: - **Follow the PEP8 style guide**: Ensure your code is clean and readable by following the `PEP8 style guide `__. - **Include tests**: Write the necessary tests to verify your code works. Ensure all tests pass before submitting a PR. - **Avoid breaking changes**: If necessary, mention them clearly in the PR description. - **Update documentation**: Update or add documentation for new or changed features. - **Use clear commit messages**: Although not mandatory, we encourage following the `Conventional Commits `__ specification to maintain a clean and organized commit history. Architecture overview ~~~~~~~~~~~~~~~~~~~~~ Before contributing, it’s important to understand the project’s architecture: - **Async-first**: All API logic lives in ``AsyncSemanticScholar``. The sync ``SemanticScholar`` class delegates every method to its async counterpart via ``_run_async()``. - **Data models**: All response objects inherit from ``SemanticScholarObject`` and follow the same pattern: a ``FIELDS`` class constant, attributes initialized to ``None`` in ``__init__``, and a ``_init_attributes(data)`` method that populates them from a dict. - **HTTP layer**: ``ApiRequester`` is the single point for HTTP requests, retries, and error mapping. API methods should not make HTTP calls directly. When adding new features, follow these patterns to keep the codebase consistent. If your contribution requires changes to the architecture, please discuss it in the PR description so it can be reviewed properly. Running and writing tests ~~~~~~~~~~~~~~~~~~~~~~~~~ First, install the dependencies: .. code:: console pip install -r test-requirements.txt Then, run the tests: 1. Run all tests: .. code:: console python -m unittest 2. Run all tests in a specific class: .. code:: console python -m unittest tests.test_semanticscholar.TestClassName 3. Run a specific test method: .. code:: console python -m unittest tests.test_semanticscholar.TestClassName.testMethod Async tests ~~~~~~~~~~~ Async tests use ``IsolatedAsyncioTestCase`` and follow the same naming convention as sync tests, but with an ``_async`` suffix (e.g., ``test_get_paper_async``). They reuse the same VCR cassettes as their sync counterparts via the ``use_shared_cassette`` decorator, which strips the ``_async`` suffix to find the matching cassette file. Recording API Calls ~~~~~~~~~~~~~~~~~~~ This project uses `VCR.py `__, a library designed to record HTTP interactions and replay them during tests, eliminating the need to make actual HTTP requests repeatedly. When adding new tests, the first run will record the interactions and save them as a new file in the ``tests/data`` directory. Code coverage ~~~~~~~~~~~~~ When adding new code, make sure to write tests that cover it. The goal is to maintain high code coverage. To check the code coverage, run: .. code:: console python -m coverage run --source=semanticscholar/ -m unittest discover To generate a report, run: .. code:: console python -m coverage report If you want to see the coverage in HTML format, run: .. code:: console python -m coverage html Contributing to documentation ----------------------------- The documentation is built using `Sphinx `__ and hosted on `Read the Docs `__. To get started, install the necessary dependencies: .. code:: console pip install -r docs-requirements.txt After adding new content, you could build the documentation locally: .. code:: console cd docs && make html Then, open the ``docs/build/html/index.html`` file in your browser to see the changes. Please do not include auto-generated files, such as those created by ``docs/source/conf.py``, in your PRs. To contribute to the documentation, it’s important to be familiar with **reStructuredText** and **Sphinx**. For more details on how to work with them, refer to the `official Sphinx documentation `__.