146 lines
6.1 KiB
Markdown
146 lines
6.1 KiB
Markdown
# FEM coding_conventions
|
|
These coding rules apply to FEM module code only. Other modules or the base system may use different coding rules especially in naming policy of Python.
|
|
|
|
|
|
## Spelling
|
|
- Be mindful of spelling. Spell checks are quite often neglected.
|
|
- Utilize [codespell](https://github.com/codespell-project/codespell) to discover and quickly correct spelling errors.
|
|
|
|
```bash
|
|
# Find typos
|
|
codespell -q 2 -S *.ts -S *.dyn -S *.svg -L childs,dof,dum,freez,methode,nd,normaly,programm,som,uint,vertexes,inout src/Mod/Fem/
|
|
|
|
# Interactively fix said typos
|
|
codespell -i 3 -w -S *.ts -S *.dyn -S *.svg -L childs,dof,dum,freez,methode,nd,normaly,programm,som,uint,vertexes,inout src/Mod/Fem/
|
|
```
|
|
|
|
**Notes:**
|
|
1) We recommend running the dev version as it uses the most up to date typo dictionaries.
|
|
2) To find the most amount of typos we recommend running a quick `pip install --upgrade`
|
|
See the [codespell docs](https://github.com/codespell-project/codespell#updating) for more info.
|
|
|
|
|
|
## Python and C++
|
|
### Code formatting
|
|
- All files should have a license header
|
|
- Unix line endings will be used:
|
|
- a .gitattributes file has been added to ensure line endings of text files are LF
|
|
- use `?w=1` in link address to suppress line ending changes on github
|
|
- never use mixed line endings on one file
|
|
- 4 Spaces for indent (in this file too ;-))
|
|
- no trailing white spaces
|
|
|
|
|
|
## Python
|
|
### Code formatting
|
|
- except W503 all Python code is pep8 compliant
|
|
- maximal line length is 100
|
|
- double quotes as string identifier
|
|
|
|
### Exceptione
|
|
- Do not use bare 'except'.
|
|
- Be more specific. If not possible use:
|
|
- Either use 'except Exception' or if really everything should be caught 'except BaseException'
|
|
- https://stackoverflow.com/a/18982772
|
|
- https://github.com/PyCQA/pycodestyle/issues/703
|
|
|
|
### Imports
|
|
- Only one import per line.
|
|
- on import from 'some_package' import 'some_module'. There should only be one 'some_module' per line.
|
|
- on import from 'some_module' import 'some_method'. There should only be one 'some_method' per line.
|
|
- Each import group should be sorted alphabetically.
|
|
- First the 'import some_module' ones, afterwards the 'from some_module import something'.
|
|
- First absolute path imports than relative path imports.
|
|
- On relative path imports first the one dot ones, afterwards the two dot ones.
|
|
- Star import should not be used at all (from some_module import *).
|
|
- Python imports should be grouped into groups:
|
|
- Standard library imports
|
|
- One empty line
|
|
- Third-party imports
|
|
- One empty line
|
|
- non Gui FreeCAD specific imports
|
|
- from module FreeCAD
|
|
- One empty line
|
|
- other modules, but not FEM
|
|
- One empty line
|
|
- FEM specific imports
|
|
- absolute imports
|
|
- One empty line
|
|
- relative imports
|
|
- One empty line
|
|
- FreeCAD Gui imports:
|
|
- The import of Gui modules should be guarded by a 'if FreeCAD.GuiUp:'
|
|
- On Gui only modules the guard is not needed
|
|
- Same as above but without a empty line
|
|
- Standard library imports
|
|
- Third-party Gui imports
|
|
- FreeCAD-specific imports from module FreeCADGui
|
|
- other FreeCAD Gui imports
|
|
- FEM Gui imports
|
|
- The above paragraphs highly reduces merge conflicts.
|
|
|
|
### Naming policy
|
|
- snake_case_names
|
|
- ClassNames, variable_names_without_capitals and CONSTANTS_USE_CAPITALS, functions_without_capitals
|
|
- Function 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 variable that are locally and not supposed to be used for scripting should start with underscore like _MyInternalClass
|
|
|
|
### Python code formatting tools
|
|
- **flake8** in source code directory on Linux shell
|
|
```bash
|
|
find src/Mod/Fem/ -name "*\.py" | xargs -I [] flake8 --ignore=E266,W503 --max-line-length=100 []
|
|
```
|
|
- [LGTM](https://lgtm.com/projects/g/FreeCAD/FreeCAD/latest/files/src/Mod/Fem/)
|
|
- TODO: check pylint
|
|
- Automatic code formatter will not be used for existent code
|
|
- For new code if someone would like to use a code formatter black should be used
|
|
|
|
### Coding
|
|
- print() vs. FreeCAD.Console.PrintMessage()
|
|
- `FreeCAD.Console.PrintMessage()` or Log or Error should be used
|
|
- `print()` should be used for debugging only
|
|
- [forum topic](https://forum.freecad.org/viewtopic.php?f=10&t=39110)
|
|
- BTW: Console prints need a new line where as print does not need one
|
|
- type checking:
|
|
- do not use hasattr(obj, "Proxy") and obj.Proxy.Type
|
|
- use method is_of_typ(obj, "TypeString") from module femtool.femutils
|
|
- ActiveDocument
|
|
- try to avoid the use of App.ActiveDocument or FreeCAD.ActiveDocument
|
|
- instead try to use some_obj.Document instead
|
|
- try to avoid the use of Gui.ActiveDocument or FreeCADGui.ActiveDocument
|
|
- instead try to use some_obj.ViewObject.Document or some_view_obj.Document
|
|
- activeDocument() is more robust than ActiveDocument
|
|
- [forum topic](https://forum.freecad.org/viewtopic.php?f=10&t=44133)
|
|
- FreeCAD Python console
|
|
- in code examples which will be copied in FreeCAD Python console
|
|
- it is common to use App.ActiveDocument.some_obj or method
|
|
|
|
### Documenting
|
|
Python style is preferred over Doxygen style
|
|
- see `ccx` tools module in fem tools package
|
|
- see [forum topic](https://forum.freecad.org/viewtopic.php?f=10&t=37094)
|
|
|
|
### Module structure
|
|
- task panels should go into a separate package too
|
|
- according pep8 imports should be on module beginning
|
|
- if task panel class in inside viewprovider module, the imports needed for task panel are module beginning too
|
|
- might be some special plot module or what ever is needed
|
|
- if this is not available the object can not even created
|
|
- if task panel is separate the object can be createdh
|
|
|
|
|
|
## C++
|
|
### Naming policy
|
|
- CamelCase names
|
|
|
|
### Code formatting
|
|
- slashes
|
|
- Do not use to many slashes in a row. This could cause trouble with Doxygen.
|
|
- see [PR with comment](https://github.com/FreeCAD/FreeCAD/pull/2757#discussion_r355218913)
|
|
|
|
|
|
## Icons
|
|
### Naming plicy
|
|
- Command icons use the command name.
|
|
- see [forum topic](https://forum.freecad.org/viewtopic.php?f=18&t=43379)
|