If you are interested in contributing to OmniSafe, your contributions will fall into two categories:
- You want to propose a new Feature and implement it
- Create an issue about your intended feature, and we shall discuss the design and implementation. Once we agree that the plan looks good, go ahead and implement it.
- You want to implement a feature or bug-fix for an outstanding issue
- Look at the outstanding issues here: https://github.com/PKU-Alignment/omnisafe/issues.
- Pick an issue or feature and comment on the task that you want to work on this feature.
- If you need more context on a particular issue, please ask and we shall provide.
Once you finish implementing a feature or bug-fix, please send a Pull Request to https://github.com/PKU-Alignment/omnisafe.
If you are not familiar with creating a Pull Request, here are some guides:
- http://stackoverflow.com/questions/14680711/how-to-do-a-github-pull-request
- https://help.github.com/articles/creating-a-pull-request/
To develop OmniSafe on your machine, here are some tips:
- Clone a copy of OmniSafe from GitHub:
git clone https://github.com/PKU-Alignment/omnisafe
cd omnisafe/
- Install OmniSafe in develop mode, with support for building the docs and running tests:
pip install -e .[docs,tests,extra]
We are using black codestyle (max line length of 100 characters) together with isort to sort the imports.
Please run make format
to reformat your code. You can check the codestyle using make lint
.
Please document each function/method and type, them using the following template, which is similar to the [PyTorch docs style]:
Similar to the standard PyTorch Style docstring formatting rules, the following guidelines should be followed for docstring types (docstring types are the type information contained in the round brackets after the variable name):
-
If Python Version is less than
3.10
, you need to addfrom __future__ import annotations
. -
The
Callable
,Any
,Iterable
,Iterator
,Generator
types should have their first letter capitalized. -
The
list
andtuple
types should be completely lowercase. -
Types should not be made plural. For example:
tuple of int
should be used instead oftuple of ints
. -
The only acceptable delimiter words for types are
or
andof
. No other non-type words should be used other thanoptional
. -
The word
optional
should only be used after the types, and it is only used if the user does not have to specify a value for the variable. Default values are listed after the variable description. Example:
my_var (int, optional): Variable description. Default: 1
-
Basic Python types should match their type name so that the Intersphinx extension can correctly identify them. For example:
- Use
str
instead ofstring
. - Use
bool
instead ofboolean
. - Use
dict
instead ofdictionary
.
- Use
-
Square brackets should be used for the dictionary type. For example:
my_var (dict[str, int]): Variable description.
- If a variable has two different possible types, then the word
or
should be used without a comma. Otherwise variables with 3 or more types should use commas to separate the types. Example:
x (type1 or type2): Variable description.
y (type1, type2, or type3): Variable description.
Please document each function/method and type, them using the following template, which is similar to the PyTorch Docstring:
def my_function(arg1: type1, arg2: type2, my_var: int = 1) -> returntype:
"""Short description of the function.
(Optional) Long description of the function or example usage.
Args:
arg1 (type1): Variable description.
arg2 (type2): Variable description.
my_var (int, optional): Variable description. Default: 1
Returns:
Variable description.
"""
...
return my_variable
Before proposing a PR, please open an issue, where the feature will be discussed. This prevent from duplicated PR to be proposed and also ease the code review process.
A PR must pass the Continuous Integration tests to be merged with the main branch. Each PR need to be reviewed and accepted by at least one of the maintainers:
All new features must add tests in the tests/
folder ensuring that everything works fine.
We use pytest.
Also, when a bug fix is proposed, tests should be added to avoid regression.
To run tests with pytest
:
make pytest
Type checking with pylint
and mypy
:
make pylint
make mypy
Codestyle check with black
, isort
and flake8
:
make format
To run pre-commit
beforce commit:
make pre-commit
Build the documentation:
make docs
Check documentation spelling (you need to install sphinxcontrib.spelling
package for that):
make spelling
Please do not forget to update the CHANGELOG.md and add documentation if needed. You should add your username next to each changelog entry that you added. If this is your first contribution, please add your username at the bottom too.
Credits: this contributing guide is based on the PyTorch.