@@ -4,4 +4,208 @@ Guideline to contribute to this package
4
4
5
5
---------------
6
6
7
- ## TBD
7
+ ## General
8
+
9
+ You're always welcome to contribute to this package with or without raising an
10
+ issue before creating a PR.
11
+
12
+ Please follow this guideline covering all necessary steps and hints to ensure
13
+ a smooth review and contribution process.
14
+
15
+ ## Code
16
+
17
+ To test and verify your changes it is recommended to run all checks locally in
18
+ a virtual environment. Use the following commands to setup and install all
19
+ tools.
20
+
21
+ ``` bash
22
+ python3 -m venv .venv
23
+ source .venv/bin/activate
24
+
25
+ pip install -r requirements-test.txt
26
+ ```
27
+
28
+ For very old systems it might be necessary to use an older version of
29
+ ` pre-commit ` , an "always" working version is ` 1.18.3 ` with the drawback of not
30
+ having ` flake8 ` and maybe other checks in place.
31
+
32
+ ### Format
33
+
34
+ The Python code format is checked by ` flake8 ` with the default line length
35
+ limit of 79. Further configuration can be found in the ` .flake8 ` file in the
36
+ repo root.
37
+
38
+ The YAML code format is checked by ` yamllint ` with some small adjustments as
39
+ defined in the ` .yamllint ` file in the repo root.
40
+
41
+ Use the following commands (inside the virtual environment) to run the Python
42
+ and YAML checks
43
+
44
+ ``` bash
45
+ # check Python
46
+ flake8 .
47
+
48
+ # check YAML
49
+ yamllint .
50
+ ```
51
+
52
+ ### Tests
53
+
54
+ Every code should be covered by a unittest. This can be achieved for
55
+ MicroPython up to some degree, as hardware specific stuff can't be always
56
+ tested by a unittest.
57
+
58
+ For now ` mpy_unittest ` is used as tool of choice and runs directly on the
59
+ divice. For ease of use a Docker container is used as not always a device is
60
+ at hand or connected to the CI.
61
+
62
+ The hardware UART connection is faked by a TCP connection providing the same
63
+ interface and basic functions as a real hardware interface.
64
+
65
+ The tests are defined, as usual, in the ` tests ` folder. The ` mpy_unittest `
66
+ takes and runs all tests defined and imported there by the ` __init__.py ` file.
67
+
68
+ Further tests, which could be called Integration tests, are defined in this
69
+ folder as well. To be usable they may require a counterpart e.g. a client
70
+ communicating with a host, which is simply achieved by two Docker containers,
71
+ defined in the ` docker-compose-tcp-test.yaml ` or ` docker-compose-rtu-test.yaml `
72
+ file, located in the repo root. The examples for TCP or RTU client usage are
73
+ used to provide a static setup.
74
+
75
+ Incontrast to Python, no individual test results will be reported as parsable
76
+ XML or similar, the container will exit with either ` 1 ` in case of an error or
77
+ with ` 0 ` on success.
78
+
79
+ ``` bash
80
+ # build and run the "native" unittests
81
+ docker build --tag micropython-test --file Dockerfile.tests .
82
+
83
+ # Execute client/host TCP examples
84
+ docker compose up --build --exit-code-from micropython-host
85
+
86
+ # Run client/host TCP tests
87
+ docker compose -f docker-compose-tcp-test.yaml up --build --exit-code-from micropython-host
88
+
89
+ # Run client/host RTU examples with faked RTU via TCP
90
+ docker compose -f docker-compose-rtu.yaml up --build --exit-code-from micropython-host
91
+
92
+ # Run client/host RTU tests
93
+ docker compose -f docker-compose-rtu-test.yaml up --build --exit-code-from micropython-host
94
+ ```
95
+
96
+ ### Precommit hooks
97
+
98
+ This repo is equipped with a ` .pre-commit-config.yaml ` file to combine most of
99
+ the previously mentioned checks plus the changelog validation, see next
100
+ section, into one handy command. It additionally allows to automatically run
101
+ the checks on every commit.
102
+
103
+ In order to run this repo's pre commit hooks, perform the following steps
104
+
105
+ ``` bash
106
+ # install pre-commit to run before each commit, optionally
107
+ pre-commit install
108
+
109
+ pre-commit run --all-files
110
+ ```
111
+
112
+ ## Changelog
113
+
114
+ The changelog format is based on [ Keep a Changelog] [ ref-keep-a-changelog ] , and
115
+ this project adheres to [ Semantic Versioning] [ ref-semantic-versioning ] .
116
+
117
+ Please add a changelog entry for every PR you contribute. The versions are
118
+ seperated into ` MAJOR.MINOR.PATCH ` :
119
+
120
+ - Increment the major version by 1 in case you created a breaking, non
121
+ backwards compatible change which requires the user to perform additional
122
+ tasks, adopt his currently running code or in general can't be used as is anymore.
123
+ - Increment the minor version by 1 on new "features" which can be used or are
124
+ optional, but in either case do not require any changes by the user to keep
125
+ the system running after upgrading.
126
+ - Increment the patch version by 1 on bugfixes which fix an issue but can be
127
+ used out of the box, like features, without any changes by the user. In some
128
+ cases bugfixes can be breaking changes of course.
129
+
130
+ Please add the date the change has been made as well to the changelog
131
+ following the format ` ## [MAJOR.MINOR.PATCH] - YYYY-MM-DD ` . It is not
132
+ necessary to keep this date up to date, it is just used as meta data.
133
+
134
+ The changelog entry shall be short but meaningful and can of course contain
135
+ links and references to other issues or PRs. New lines are only allowed for a
136
+ new bulletpoint entry. Usage examples or other code snippets should be placed
137
+ in the code documentation, README or the docs folder.
138
+
139
+ ### General
140
+
141
+ The package version file, located at ` umodbus/version.py ` contains the latest
142
+ changelog version.
143
+
144
+ To avoid a manual sync of the changelog version and the package version file
145
+ content, the ` changelog2version ` package is used. It parses the changelog,
146
+ extracts the latest version and updates the version file.
147
+
148
+ The package version file can be generated with the following command consuming
149
+ the latest changelog entry
150
+
151
+ ``` bash
152
+ changelog2version \
153
+ --changelog_file changelog.md \
154
+ --version_file umodbus/version.py \
155
+ --version_file_type py \
156
+ --debug
157
+ ```
158
+
159
+ To validate the existing package version file against the latest changelog
160
+ entry use this command
161
+
162
+ ``` bash
163
+ changelog2version \
164
+ --changelog_file=changelog.md \
165
+ --version_file=umodbus/version.py \
166
+ --validate
167
+ ```
168
+
169
+ ### MicroPython
170
+
171
+ On MicroPython the ` mip ` package is used to install packages instead of ` pip `
172
+ at MicroPython version 1.20.0 and newer. This utilizes a ` package.json ` file
173
+ in the repo root to define all files and dependencies of a package to be
174
+ downloaded by [ ` mip ` ] [ ref-mip-docs ] .
175
+
176
+ To avoid a manual sync of the changelog version and the MicroPython package
177
+ file content, the ` setup2upypackage ` package is used. It parses the changelog,
178
+ extracts the latest version and updates the package file version entry. It
179
+ additionally parses the ` setup.py ` file and adds entries for all files
180
+ contained in the package to the ` urls ` section and all other external
181
+ dependencies to the ` deps ` section.
182
+
183
+ The MicroPython package file can be generated with the following command based
184
+ on the latest changelog entry and ` setup ` file.
185
+
186
+ ``` bash
187
+ upy-package \
188
+ --setup_file setup.py \
189
+ --package_changelog_file changelog.md \
190
+ --package_file package.json
191
+ ```
192
+
193
+ To validate the existing package file against the latest changelog entry and
194
+ setup file content use this command
195
+
196
+ ``` bash
197
+ upy-package \
198
+ --setup_file setup.py \
199
+ --package_changelog_file changelog.md \
200
+ --package_file package.json \
201
+ --validate
202
+ ```
203
+
204
+ ## Documentation
205
+
206
+ Please check the ` docs/DOCUMENTATION.md ` file for further details.
207
+
208
+ <!-- Links -->
209
+ [ ref-keep-a-changelog ] : https://keepachangelog.com/en/1.0.0/
210
+ [ ref-semantic-versioning ] : https://semver.org/spec/v2.0.0.html
211
+ [ ref-mip-docs ] : https://docs.micropython.org/en/v1.20.0/reference/packages.html
0 commit comments