Skip to content

Commit dfc9fd8

Browse files
committed
ci: add lint and package checks
Signed-off-by: Esteve Fernandez <esteve@apache.org>
1 parent de743fc commit dfc9fd8

12 files changed

Lines changed: 189 additions & 23 deletions

File tree

.github/workflows/bloom-release.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ jobs:
4747
rosdistro: ${{ matrix.rosdistro }}
4848
track: ${{ matrix.track }}
4949
release-repository: https://github.com/ros2-gbp/rosidl_rust-release.git
50+
exclude-paths: |
51+
rosidl_generator_rs_tests/**
5052
5153
release-pr:
5254
name: Release PR
@@ -70,5 +72,7 @@ jobs:
7072
with:
7173
mode: prepare
7274
base-branch: main
75+
exclude-paths: |
76+
rosidl_generator_rs_tests/**
7377
env:
7478
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.github/workflows/build-deb.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,6 @@ jobs:
6464
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
6565
PACKAGES_BRANCH: ${{ matrix.debdistro }}-${{ matrix.rosdistro }}
6666
DEBIAN_REVISION_PREFIX: 0~
67+
SKIP_PACKAGES: rosidl_generator_rs_tests
6768
SQUASH_HISTORY: true
6869
ROS_TESTING: ${{ matrix.ros_testing }}

.github/workflows/ci.yaml

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
name: Checks
2+
3+
on:
4+
pull_request:
5+
push:
6+
branches:
7+
- main
8+
workflow_dispatch:
9+
10+
permissions:
11+
contents: read
12+
13+
jobs:
14+
python:
15+
name: Python lint and syntax
16+
runs-on: ubuntu-24.04
17+
steps:
18+
- name: Checkout repository
19+
uses: actions/checkout@v6
20+
21+
- name: Set up Python
22+
uses: actions/setup-python@v6
23+
with:
24+
python-version: '3.x'
25+
26+
- name: Install Python tooling
27+
run: python -m pip install ruff==0.15.17
28+
29+
- name: Check Python syntax
30+
run: |
31+
python -m compileall -q rosidl_generator_rs/rosidl_generator_rs
32+
python -m py_compile rosidl_generator_rs/bin/rosidl_generator_rs
33+
34+
- name: Lint Python sources
35+
run: python -m ruff check rosidl_generator_rs/rosidl_generator_rs rosidl_generator_rs/bin/rosidl_generator_rs
36+
37+
ros:
38+
name: ROS build and test (${{ matrix.ros_distro }})
39+
runs-on: ${{ matrix.runner }}
40+
strategy:
41+
fail-fast: false
42+
matrix:
43+
include:
44+
- ros_distro: humble
45+
runner: ubuntu-22.04
46+
- ros_distro: jazzy
47+
runner: ubuntu-24.04
48+
steps:
49+
- name: Checkout repository
50+
uses: actions/checkout@v6
51+
52+
- name: Set up ROS
53+
uses: ros-tooling/setup-ros@v0.7
54+
with:
55+
required-ros-distributions: ${{ matrix.ros_distro }}
56+
57+
- name: Install package dependencies
58+
run: |
59+
rosdep update
60+
rosdep install --from-paths . --ignore-src --rosdistro ${{ matrix.ros_distro }} -y
61+
62+
- name: Build package
63+
shell: bash
64+
run: |
65+
source /opt/ros/${{ matrix.ros_distro }}/setup.bash
66+
colcon build --packages-up-to rosidl_generator_rs_tests --event-handlers console_direct+
67+
68+
- name: Test package
69+
shell: bash
70+
run: |
71+
source /opt/ros/${{ matrix.ros_distro }}/setup.bash
72+
source install/setup.bash
73+
colcon test --packages-select rosidl_generator_rs --event-handlers console_direct+
74+
colcon test-result --verbose
75+
76+
- name: Check generated Rust package
77+
shell: bash
78+
run: |
79+
tests_crate="$PWD/build/rosidl_generator_rs_tests/rosidl_generator_rs/rosidl_generator_rs_tests/rust"
80+
cargo check --manifest-path "$tests_crate/Cargo.toml"

rosidl_generator_rs/CMakeLists.txt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ project(rosidl_generator_rs)
55
find_package(ament_cmake REQUIRED)
66

77
if("$ENV{ROS_DISTRO}" STRLESS_EQUAL "humble")
8-
find_package(rosidl_cmake REQUIRED)
9-
ament_export_dependencies(rosidl_cmake)
8+
find_package(rosidl_cmake REQUIRED)
9+
ament_export_dependencies(rosidl_cmake)
1010
endif()
1111

1212
ament_export_dependencies(ament_cmake)
@@ -16,18 +16,30 @@ ament_index_register_resource("rosidl_generator_packages")
1616

1717
ament_python_install_package(${PROJECT_NAME})
1818

19+
if(BUILD_TESTING)
20+
find_package(ament_lint_auto REQUIRED)
21+
# The Python sources are checked by Ruff in CI. Copyright and docstring
22+
# linters are noisy for template files in this generator package.
23+
set(ament_cmake_copyright_FOUND TRUE)
24+
set(ament_cmake_flake8_FOUND TRUE)
25+
set(ament_cmake_pep257_FOUND TRUE)
26+
ament_lint_auto_find_test_dependencies()
27+
endif()
28+
1929
ament_package(
2030
CONFIG_EXTRAS
2131
"rosidl_generator_rs-extras.cmake.in"
2232
"cmake/register_rs.cmake"
2333
)
2434

25-
install(DIRECTORY cmake
26-
DESTINATION share/${PROJECT_NAME})
35+
install(
36+
DIRECTORY cmake
37+
DESTINATION share/${PROJECT_NAME}
38+
)
2739
ament_register_extension(
28-
"rosidl_generate_idl_interfaces"
29-
"rosidl_generator_rs"
30-
"${PROJECT_SOURCE_DIR}/cmake/rosidl_generator_rs_generate_interfaces.cmake")
40+
"rosidl_generate_idl_interfaces"
41+
"rosidl_generator_rs"
42+
"${PROJECT_SOURCE_DIR}/cmake/rosidl_generator_rs_generate_interfaces.cmake")
3143

3244
install(
3345
PROGRAMS bin/rosidl_generator_rs

rosidl_generator_rs/cmake/custom_command.cmake

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,29 @@ set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
1717

1818
add_custom_command(
1919
OUTPUT
20-
${_generated_common_rs_files}
21-
${_generated_msg_rs_files}
22-
${_generated_srv_rs_files}
23-
${_generated_action_rs_files}
20+
${_generated_common_rs_files}
21+
${_generated_msg_rs_files}
22+
${_generated_srv_rs_files}
23+
${_generated_action_rs_files}
2424
COMMAND ${PYTHON_EXECUTABLE} ${rosidl_generator_rs_BIN}
25-
--generator-arguments-file "${generator_arguments_file}"
26-
--typesupport-impls "${_typesupport_impls}"
25+
--generator-arguments-file "${generator_arguments_file}"
26+
--typesupport-impls "${_typesupport_impls}"
2727
DEPENDS ${target_dependencies}
2828
COMMENT "Generating Rust code for ROS interfaces"
2929
VERBATIM
3030
)
3131

3232
if(TARGET ${rosidl_generate_interfaces_TARGET}${_target_suffix})
33-
message(WARNING "Custom target ${rosidl_generate_interfaces_TARGET}${_target_suffix} already exists")
33+
message(
34+
WARNING
35+
"Custom target ${rosidl_generate_interfaces_TARGET}${_target_suffix} already exists")
3436
else()
3537
add_custom_target(
3638
${rosidl_generate_interfaces_TARGET}${_target_suffix} ALL
3739
DEPENDS
38-
${_generated_common_rs_files}
39-
${_generated_msg_rs_files}
40-
${_generated_srv_rs_files}
41-
${_generated_action_rs_files}
40+
${_generated_common_rs_files}
41+
${_generated_msg_rs_files}
42+
${_generated_srv_rs_files}
43+
${_generated_action_rs_files}
4244
)
4345
endif()

rosidl_generator_rs/rosidl_generator_rs/__init__.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@
2323
import rosidl_pycommon
2424

2525
from rosidl_parser.definition import AbstractGenericString
26-
from rosidl_parser.definition import AbstractNestedType
27-
from rosidl_parser.definition import AbstractSequence
28-
from rosidl_parser.definition import AbstractString
29-
from rosidl_parser.definition import AbstractWString
3026
from rosidl_parser.definition import Action
3127
from rosidl_parser.definition import Array
3228
from rosidl_parser.definition import BasicType
@@ -234,7 +230,7 @@ def get_rs_name(name):
234230
'yield', 'try'
235231
]
236232
# If the field name is a reserved keyword in Rust append an underscore
237-
return name if not name in keywords else name + '_'
233+
return name if name not in keywords else name + '_'
238234

239235
def escape_string(s):
240236
s = s.replace('\\', '\\\\')
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
cmake_minimum_required(VERSION 3.12)
2+
3+
project(rosidl_generator_rs_tests)
4+
5+
find_package(ament_cmake REQUIRED)
6+
find_package(rosidl_default_generators REQUIRED)
7+
find_package(rosidl_generator_rs REQUIRED)
8+
9+
rosidl_generate_interfaces(${PROJECT_NAME}
10+
"msg/Complex.msg"
11+
"msg/Keywords.msg"
12+
"srv/Compute.srv"
13+
"action/DoThing.action"
14+
)
15+
16+
ament_package()
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Goal
2+
Complex goal
3+
---
4+
# Result
5+
Complex result
6+
---
7+
# Feedback
8+
float32 progress
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Exercises primitive, array, sequence, bounded, nested, and keyword fields.
2+
bool enabled
3+
int32 count
4+
float64[3] coefficients
5+
uint8[] payload
6+
string name
7+
string<=16 bounded_name
8+
int32[<=4] bounded_values
9+
Keywords keyword_fields
10+
Keywords[2] keyword_array
11+
Keywords[] keyword_sequence
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Exercises Rust keyword escaping and constant rendering.
2+
uint8 try
3+
string type
4+
int32 const
5+
6+
uint32 ANSWER=42
7+
string NAME=rosidl_rust

0 commit comments

Comments
 (0)