-
Notifications
You must be signed in to change notification settings - Fork 105
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #269 from espressif/feat/ci_add_dependencies_readme
Feat/ci add dependencies readme
- Loading branch information
Showing
20 changed files
with
450 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
[flake8] | ||
|
||
select = | ||
# Full lists are given in order to suppress all errors from other plugins | ||
# Full list of pyflakes error codes: | ||
F401, # module imported but unused | ||
F402, # import module from line N shadowed by loop variable | ||
F403, # 'from module import *' used; unable to detect undefined names | ||
F404, # future import(s) name after other statements | ||
F405, # name may be undefined, or defined from star imports: module | ||
F406, # 'from module import *' only allowed at module level | ||
F407, # an undefined __future__ feature name was imported | ||
F601, # dictionary key name repeated with different values | ||
F602, # dictionary key variable name repeated with different values | ||
F621, # too many expressions in an assignment with star-unpacking | ||
F622, # two or more starred expressions in an assignment (a, *b, *c = d) | ||
F631, # assertion test is a tuple, which are always True | ||
F701, # a break statement outside of a while or for loop | ||
F702, # a continue statement outside of a while or for loop | ||
F703, # a continue statement in a finally block in a loop | ||
F704, # a yield or yield from statement outside of a function | ||
F705, # a return statement with arguments inside a generator | ||
F706, # a return statement outside of a function/method | ||
F707, # an except: block as not the last exception handler | ||
F721, F722, # doctest syntax error syntax error in forward type annotation | ||
F811, # redefinition of unused name from line N | ||
F812, # list comprehension redefines name from line N | ||
F821, # undefined name name | ||
F822, # undefined name name in __all__ | ||
F823, # local variable name referenced before assignment | ||
F831, # duplicate argument name in function definition | ||
F841, # local variable name is assigned to but never used | ||
F901, # raise NotImplemented should be raise NotImplementedError | ||
|
||
# Full list of pycodestyle violations: | ||
E101, # indentation contains mixed spaces and tabs | ||
E111, # indentation is not a multiple of four | ||
E112, # expected an indented block | ||
E113, # unexpected indentation | ||
E114, # indentation is not a multiple of four (comment) | ||
E115, # expected an indented block (comment) | ||
E116, # unexpected indentation (comment) | ||
E121, # continuation line under-indented for hanging indent | ||
E122, # continuation line missing indentation or outdented | ||
E123, # closing bracket does not match indentation of opening bracket's line | ||
E124, # closing bracket does not match visual indentation | ||
E125, # continuation line with same indent as next logical line | ||
E126, # continuation line over-indented for hanging indent | ||
E127, # continuation line over-indented for visual indent | ||
E128, # continuation line under-indented for visual indent | ||
E129, # visually indented line with same indent as next logical line | ||
E131, # continuation line unaligned for hanging indent | ||
E133, # closing bracket is missing indentation | ||
E201, # whitespace after '(' | ||
E202, # whitespace before ')' | ||
E203, # whitespace before ':' | ||
E211, # whitespace before '(' | ||
E221, # multiple spaces before operator | ||
E222, # multiple spaces after operator | ||
E223, # tab before operator | ||
E224, # tab after operator | ||
E225, # missing whitespace around operator | ||
E226, # missing whitespace around arithmetic operator | ||
E227, # missing whitespace around bitwise or shift operator | ||
E228, # missing whitespace around modulo operator | ||
E231, # missing whitespace after ',', ';', or ':' | ||
E241, # multiple spaces after ',' | ||
E242, # tab after ',' | ||
E251, # unexpected spaces around keyword / parameter equals | ||
E261, # at least two spaces before inline comment | ||
E262, # inline comment should start with '# ' | ||
E265, # block comment should start with '# ' | ||
E266, # too many leading '#' for block comment | ||
E271, # multiple spaces after keyword | ||
E272, # multiple spaces before keyword | ||
E273, # tab after keyword | ||
E274, # tab before keyword | ||
E275, # missing whitespace after keyword | ||
E301, # expected 1 blank line, found 0 | ||
E302, # expected 2 blank lines, found 0 | ||
E303, # too many blank lines | ||
E304, # blank lines found after function decorator | ||
E305, # expected 2 blank lines after end of function or class | ||
E306, # expected 1 blank line before a nested definition | ||
E401, # multiple imports on one line | ||
E402, # module level import not at top of file | ||
E501, # line too long (82 > 79 characters) | ||
E502, # the backslash is redundant between brackets | ||
E701, # multiple statements on one line (colon) | ||
E702, # multiple statements on one line (semicolon) | ||
E703, # statement ends with a semicolon | ||
E704, # multiple statements on one line (def) | ||
E711, # comparison to None should be 'if cond is None:' | ||
E712, # comparison to True should be 'if cond is True:' or 'if cond:' | ||
E713, # test for membership should be 'not in' | ||
E714, # test for object identity should be 'is not' | ||
E721, # do not compare types, use 'isinstance()' | ||
E722, # do not use bare except, specify exception instead | ||
E731, # do not assign a lambda expression, use a def | ||
E741, # do not use variables named 'l', 'O', or 'I' | ||
E742, # do not define classes named 'l', 'O', or 'I' | ||
E743, # do not define functions named 'l', 'O', or 'I' | ||
E901, # SyntaxError or IndentationError | ||
E902, # IOError | ||
W191, # indentation contains tabs | ||
W291, # trailing whitespace | ||
W292, # no newline at end of file | ||
W293, # blank line contains whitespace | ||
W391, # blank line at end of file | ||
W503, # line break before binary operator | ||
W504, # line break after binary operator | ||
W505, # doc line too long (82 > 79 characters) | ||
W601, # .has_key() is deprecated, use 'in' | ||
W602, # deprecated form of raising exception | ||
W603, # '<>' is deprecated, use '!=' | ||
W604, # backticks are deprecated, use 'repr()' | ||
W605, # invalid escape sequence 'x' | ||
W606, # 'async' and 'await' are reserved keywords starting with Python 3.7 | ||
|
||
# Full list of flake8 violations | ||
E999, # failed to compile a file into an Abstract Syntax Tree for the plugins that require it | ||
|
||
# Full list of mccabe violations | ||
C901 # complexity value provided by the user | ||
|
||
ignore = | ||
E221, # multiple spaces before operator | ||
E231, # missing whitespace after ',', ';', or ':' | ||
E241, # multiple spaces after ',' | ||
W503, # line break before binary operator | ||
W504 # line break after binary operator | ||
|
||
max-line-length = 160 | ||
|
||
show_source = True | ||
|
||
statistics = True | ||
|
||
exclude = | ||
.git, | ||
__pycache__, |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
#!/usr/bin/env python | ||
# | ||
# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
""" | ||
Check if BSP's README.md contains list of dependencies | ||
""" | ||
|
||
import os | ||
import sys | ||
import argparse | ||
from idf_component_tools.manifest import ManifestManager | ||
from py_markdown_table.markdown_table import markdown_table | ||
from typing import Any | ||
|
||
DEPENDENCIES_START = '<!-- Autogenerated start: Dependencies -->\n' | ||
DEPENDENCIES_END = '<!-- Autogenerated end: Dependencies -->\n' | ||
DEPENDENCIES_HEADER = '### Dependencies\n' | ||
ESP_REGISTRY_URL = 'https://components.espressif.com/components/' | ||
|
||
|
||
def get_dependencies_table(manifest): | ||
""" | ||
Get markdown formatted table of manifest's dependencies | ||
""" | ||
table = DEPENDENCIES_HEADER | ||
table_data = [ | ||
{ | ||
"component":item.name, | ||
"version":item.version_spec, | ||
} for item in manifest.dependencies] | ||
for item in table_data: | ||
if item["component"] != "idf": | ||
item_name = item["component"] | ||
item["component"] = "[" + item_name + "](" + ESP_REGISTRY_URL + item_name + ")" | ||
markdown = markdown_table(table_data).set_params(row_sep='markdown', quote=False).get_markdown() | ||
table += markdown + '\n' | ||
return table | ||
|
||
|
||
def check_bsp_readme(file: str) -> Any: | ||
bsp_path = os.path.dirname(file) # File can be idf_component.yml or README.md | ||
# Get list of dependencies of this BSP | ||
manager = ManifestManager(bsp_path, 'bsp') | ||
table = get_dependencies_table(manager.load()) | ||
|
||
with open(os.path.join(bsp_path, 'README.md'), 'r+') as readme: | ||
content = readme.readlines() | ||
# Find or create 'Dependencies section' in the README.md | ||
try: | ||
start_idx = content.index(DEPENDENCIES_START) | ||
end_idx = content.index(DEPENDENCIES_END) | ||
if set(table.splitlines()) <= set([line[:-1] for line in content]): | ||
# The table exists and is correct, we can return here | ||
return 0 | ||
else: | ||
print("[" + bsp_path + "] Incorrect dependencies table, updating...") | ||
del content[start_idx + 1:end_idx] | ||
except ValueError: | ||
print("[" + bsp_path + "] First run on this file. Writing dependencies section...") | ||
content.append(DEPENDENCIES_START) | ||
content.append(DEPENDENCIES_END) | ||
start_idx = content.index(DEPENDENCIES_START) | ||
|
||
# Write the generated table to the README.md | ||
content.insert(start_idx + 1, table) | ||
readme.truncate(0) | ||
readme.seek(0, os.SEEK_SET) | ||
readme.writelines(content) | ||
# We have modified the README.md | ||
return 1 | ||
|
||
|
||
def check_all_bsps(): | ||
parser = argparse.ArgumentParser() | ||
parser.add_argument('filenames', nargs='*', help='Filenames to check.') | ||
args = parser.parse_args() | ||
ret = 0 | ||
for f in args.filenames: | ||
ret += check_bsp_readme(f) | ||
return ret | ||
|
||
|
||
if __name__ == '__main__': | ||
os.environ["IDF_VERSION"] = "5.3.0" # Let's assume IDF v5.3.0 for optional dependencies | ||
sys.exit(check_all_bsps()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,46 @@ | ||
# See https://pre-commit.com for more information | ||
# See https://pre-commit.com/hooks.html for more hooks | ||
|
||
repos: | ||
- repo: https://github.com/igrr/astyle_py.git | ||
- repo: https://github.com/igrr/astyle_py.git | ||
rev: v1.0.5 | ||
hooks: | ||
- id: astyle_py | ||
- id: astyle_py | ||
args: ['--style=otbs', '--attach-namespaces', '--attach-classes', '--indent=spaces=4', '--convert-tabs', '--align-pointer=name', '--align-reference=name', '--keep-one-line-statements', '--pad-header', '--pad-oper'] | ||
|
||
- repo: https://github.com/pre-commit/pre-commit-hooks | ||
- repo: https://github.com/espressif/check-copyright/ | ||
rev: v1.0.3 | ||
hooks: | ||
- id: check-copyright | ||
args: ['--config', 'check_copyright_config.yaml'] | ||
|
||
- repo: https://github.com/PyCQA/flake8 | ||
rev: 5.0.4 | ||
hooks: | ||
- id: flake8 | ||
types: [python] | ||
args: ['--config=.flake8', '--tee', '--benchmark'] | ||
|
||
- repo: local | ||
hooks: | ||
- id: bsp-dependencies-readme | ||
name: Update BSP README with dependencies section | ||
entry: .github/ci/update_readme_dependencies.py | ||
language: python | ||
files: 'bsp\/.*idf_component\.yml|bsp\/.*README\.md' # All idf_component.yml and README.md files in bsp directory | ||
additional_dependencies: | ||
- idf_component_manager | ||
- py-markdown-table | ||
|
||
- repo: https://github.com/pre-commit/pre-commit-hooks | ||
rev: v4.3.0 | ||
hooks: | ||
- id: trailing-whitespace | ||
- id: trailing-whitespace | ||
types_or: [c, c++] | ||
- id: end-of-file-fixer | ||
types_or: [c, c++] | ||
- id: check-merge-conflict | ||
- id: mixed-line-ending | ||
- id: end-of-file-fixer | ||
types_or: [c, c++] | ||
- id: check-merge-conflict | ||
- id: mixed-line-ending | ||
types_or: [c, c++, text] | ||
args: ['--fix=lf'] | ||
description: Forces to replace line ending by the UNIX 'lf' character | ||
|
||
- repo: https://github.com/espressif/check-copyright/ | ||
rev: v1.0.3 | ||
hooks: | ||
- id: check-copyright | ||
args: ['--config', 'check_copyright_config.yaml'] |
Oops, something went wrong.