@@ -168,19 +168,30 @@ def count_functionalities(plain_source) -> int:
168168 return len (section .children ) if section is not None else 0
169169
170170
171- def validate_functionalities_have_implementation_reqs (plain_source , module_name ) -> None :
172- """Raise if the module has functionalities but no implementation reqs are specified."""
171+ def validate_functionalities_have_implementation_reqs (plain_source , module_name , has_requires = False ) -> None :
172+ """Raise if the module has functionalities but no implementation reqs are specified.
173+
174+ ``has_requires`` indicates whether the module depends on another module via ``requires``.
175+ Unlike ``import``, ``requires`` does not inherit implementation reqs, so a hint is added to
176+ steer users who expected inheritance.
177+ """
173178 implementation_reqs = plain_source [plain_spec .NON_FUNCTIONAL_REQUIREMENTS ]
174179 has_implementation_reqs = (
175180 implementation_reqs is not None
176181 and hasattr (implementation_reqs , "children" )
177182 and len (implementation_reqs .children ) > 0
178183 )
179184 if not has_implementation_reqs :
180- raise PlainSyntaxError (
181- f"Plain syntax error: Module '{ module_name } ' specifies functionalities but no implementation reqs. "
182- f"At least one implementation req is required."
185+ message = (
186+ f"Plain syntax error: Module '{ module_name } ' defines functionalities but specifies no "
187+ f"{ plain_spec . NON_FUNCTIONAL_REQUIREMENTS } . At least one implementation req is required."
183188 )
189+ if has_requires :
190+ message += (
191+ " Implementation reqs are not inherited through 'requires' — "
192+ "add them to this module, or 'import' a module that provides them."
193+ )
194+ raise PlainSyntaxError (message )
184195
185196
186197def _is_acceptance_test_heading (token ) -> tuple [bool , str | None ]:
@@ -763,7 +774,11 @@ def plain_file_parser( # noqa: C901
763774 f"'{ plain_spec .FUNCTIONAL_REQUIREMENTS } ' section. At least one functionality must be specified."
764775 )
765776
766- validate_functionalities_have_implementation_reqs (plain_file_parse_result .plain_source , module_name )
777+ validate_functionalities_have_implementation_reqs (
778+ plain_file_parse_result .plain_source ,
779+ module_name ,
780+ has_requires = bool (plain_file_parse_result .required_modules ),
781+ )
767782
768783 exported_definitions = process_required_modules (
769784 plain_file_parse_result .required_modules ,
0 commit comments