Found via `codespell -q 3 -L aci,ake,aline,alle,alledges,alocation,als,ang,anid,apoints,ba,beginn,behaviour,bloaded,bottome,byteorder,calculater,cancelled,cancelling,cas,cascade,centimetre,childrens,childs,colour,colours,commen,connexion,currenty,dof,doubleclick,dum,eiter,elemente,ende,feld,finde,findf,freez,hist,iff,indicies,initialisation,initialise,initialised,initialises,initialisiert,inout,ist,kilometre,lod,mantatory,methode,metres,millimetre,modell,nd,noe,normale,normaly,nto,numer,oce,oder,ontop,orgin,orginx,orginy,ot,pard,parm,parms,pres,programm,que,rady,recurrance,rougly,seperator,serie,sinc,strack,substraction,te,thist,thru,tread,uint,unter,vertexes,wallthickness,whitespaces -S ./.git,*.po,*.ts,./ChangeLog.txt,./src/3rdParty,./src/Mod/Assembly/App/opendcm,./src/CXX,./src/zipios++,./src/Base/swig*,./src/Mod/Robot/App/kdl_cp,./src/Mod/Import/App/SCL,./src/WindowsInstaller,./src/Doc/FreeCAD.uml,./build/doc/SourceDocu`
131 lines
5.3 KiB
Markdown
131 lines
5.3 KiB
Markdown
# Draft coding conventions
|
|
|
|
- These coding rules apply to the Draft Workbench.
|
|
Other modules or the base system may use different coding guidelines.
|
|
- These coding rules are essentially the same well known PEP 8 guidelines
|
|
that are recommended for all projects that use the Python programming
|
|
language;
|
|
for example, the [FEM Workbench](../Fem)
|
|
uses basically these same conventions.
|
|
- Draft is an old workbench, and thus the rules described here
|
|
are not followed strictly at the moment;
|
|
nevertheless, we are working on improving the situation over time.
|
|
- New code added to the workbench should adhere to these guidelines.
|
|
|
|
## General
|
|
|
|
- All files should have the license header at the beginning.
|
|
- Unix line endings should be used.
|
|
- Never use mixed line endings in the same file.
|
|
- Use 4 spaces for a single level of indentation. Do not use tabs.
|
|
- Remove trailing white spaces.
|
|
- Keep files at less than 1000 lines in size.
|
|
- Break a module into smaller modules, or into a package
|
|
(a subdirectory with various modules),
|
|
as necessary.
|
|
- A big function can be broken into smaller functions.
|
|
- A big class can be broken into smaller classes.
|
|
Then one class can subclass the other ones
|
|
in order to inherit their methods.
|
|
|
|
## Python
|
|
|
|
### Code formatting
|
|
|
|
- In general, code should follow [PEP 8](https://www.python.org/dev/peps/pep-0008/)
|
|
and [PEP 257](https://www.python.org/dev/peps/pep-0257/) (docstrings).
|
|
- Maximum line length should be 80 characters.
|
|
- Find ways to reduce nested blocks of code by using auxiliary variables,
|
|
and functions that encapsulate the operations inside these blocks.
|
|
- If you have more than 3 levels of indentation, this is a sign
|
|
that the code should be refactored.
|
|
- Use double quotes for `"strings"`.
|
|
|
|
### Imports
|
|
|
|
- Imports should be at the beginning of the file,
|
|
after the license header and module docstring,
|
|
and they should be grouped in three types in order:
|
|
standard library imports, third party imports,
|
|
and then FreeCAD specific imports.
|
|
- Import only one module per line.
|
|
- Do not use asterisk imports, `from module import *`, as this
|
|
makes it hard to validate imported functions and classes.
|
|
- Do not import modules inside a function or class.
|
|
- The import of modules that require the graphical interface,
|
|
such as `FreeCADGui`, should be guarded by an `if FreeCAD.GuiUp:` test.
|
|
- In general, the code should be structured in such a way
|
|
that console-only functions are separate from their graphical interface
|
|
implementations (GuiCommands).
|
|
|
|
### Naming policy
|
|
|
|
- Follow [PEP 8](https://www.python.org/dev/peps/pep-0008/).
|
|
- `snake_case_names.py` for modules.
|
|
- `variable_names_without_capitals` for variables.
|
|
- `CamelCaseClass` for classes.
|
|
- `CONSTANTS_USE_CAPITALS` for constants.
|
|
- `functions_without_capitals()` for functions and class methods.
|
|
- Functions expected to return a value should indicate what is expected,
|
|
so `is_mesh_valid` is a good name, but `check_mesh` is not a good name.
|
|
- Class names, method names, and variables that are auxiliary,
|
|
and not meant to be part of the public interface should start
|
|
with an underscore like `_MyInternalClass` or `_my_small_variable`.
|
|
|
|
### Python code formatting tools
|
|
|
|
- Using a code editor that automatically checks compliance with PEP 8
|
|
is recommended.
|
|
- For example, [Spyder](https://www.spyder-ide.org/)
|
|
contains code checkers `pylint`, `pyflakes`, `pycodestyle`, `jedi`,
|
|
`sphinx`, etc., that automatically test the code as you write it,
|
|
and can provide documentation and hints on the used functions and classes
|
|
in real time, even the ones that you have just written.
|
|
- Compliance should be manually checked with [flake8](https://flake8.pycqa.org/en/latest/).
|
|
```bash
|
|
flake8 --ignore=E226,E266,W503 file.py
|
|
```
|
|
|
|
We may ignore certain errors and warnings.
|
|
- E226: spaces around arithmetic operators `*`, `/`, `+`, `-`;
|
|
sometimes we don't need a space.
|
|
- E266: only one `#` for comments; we need two `##` for Doxygen documentation.
|
|
- W503: break lines before a binary operator like `and` and `or`.
|
|
The W503 warning will be changed in the future so we can ignore it for now.
|
|
- See the meaning of the error codes in the
|
|
[pycodestyle documentation](http://pycodestyle.pycqa.org/en/latest/intro.html).
|
|
|
|
A good way to test entire folders for compliance is to run
|
|
the following command.
|
|
```bash
|
|
find src/Mod/Draft -name '*.py' ! -name InitGui.py -exec flake8 --ignore=E226,E266,W503 --max-line-length=100 '{}' '+'
|
|
```
|
|
|
|
- The online [LGTM service](https://lgtm.com/projects/g/FreeCAD/FreeCAD/latest/files/src/Mod/Draft/)
|
|
is also able to analyze the code and detect problems.
|
|
- Avoid automatic code formatters.
|
|
|
|
## C++
|
|
|
|
- Consider using [PEP 7](https://www.python.org/dev/peps/pep-0007/).
|
|
- In general, use the same naming style as with Python code.
|
|
|
|
## Spelling
|
|
|
|
- Take care of spelling mistakes in the default English messages,
|
|
graphical user interfaces, documentation strings, and source code comments.
|
|
- Use [codespell](https://github.com/codespell-project/codespell)
|
|
to find common errors.
|
|
|
|
The following command tests files in the Draft directory,
|
|
but skips translation files and certain words which could be custom defined
|
|
variables, functions, and classes.
|
|
```bash
|
|
codespell -q 3 -S '*.ts' -L beginn,childs,eiter,methode,programm src/Mod/Draft
|
|
```
|
|
|
|
Interactively fix the errors found.
|
|
```bash
|
|
codespell -i 3 -w -S '*.ts' -L beginn,childs,eiter,methode,programm src/Mod/Draft
|
|
```
|