Skip to content

Commit

Permalink
Merge pull request #269 from espressif/feat/ci_add_dependencies_readme
Browse files Browse the repository at this point in the history
Feat/ci add dependencies readme
  • Loading branch information
tore-espressif authored Jan 15, 2024
2 parents 2fe2ed4 + 0968bfa commit 1a1bd4b
Show file tree
Hide file tree
Showing 20 changed files with 450 additions and 26 deletions.
141 changes: 141 additions & 0 deletions .flake8
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__,
87 changes: 87 additions & 0 deletions .github/ci/update_readme_dependencies.py
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())
49 changes: 35 additions & 14 deletions .pre-commit-config.yaml
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']
Loading

0 comments on commit 1a1bd4b

Please sign in to comment.