mbox series

[libgpiod,0/2] support casting line.Value to bool

Message ID 20240522004643.96863-1-warthog618@gmail.com
Headers show
Series support casting line.Value to bool | expand

Message

Kent Gibson May 22, 2024, 12:46 a.m. UTC
While writing a gpiod plugin for gpiozero (Python), I had to map line.Value
to its bool equivalent.  Casting seemed the obvious way to go, as it is
essentially a boolean, but that didn't work as I expected - it always
returned True. This is the case for any Python type that does not provide
a suitable conversion operator.

This series adds support for casting line.Value to bool.

Patch 1 adds a test that comfirms the existing behaviour.
Patch 2 adds the __bool__() operator to make the Value behave as one
might expect.

As an aside, I couldn't for the life of me work out how to run the complete
python test suite.  There are no hints in the documentation.

There is a python-tests-run target in the Makefile, but that didn't work:

~/libgpiod/bindings/python$ make python-tests-run
PYTHONPATH=/home/kent/libgpiod/bindings/python
LD_LIBRARY_PATH=/home/kent/libgpiod/lib/.libs/:\
	/home/kent/libgpiod/tests/gpiosim/.libs/ \
python3 -B -m tests
/bin/bash: line 2: /home/kent/libgpiod/tests/gpiosim/.libs/: Is a directory
make: *** [Makefile:677: python-tests-run] Error 126

I tried fixing that but I still couldn't satisfy ld wrt the gpiosim
(I don't have libgpiod installed - just using the local build),
so gave up and called this particular test directly with

$ python -m unittest tests_line.py

While that passes, I can't guarantee it hasn't caused some other
breakage, though it seems very unlikely.

Kent Gibson (2):
  bindings: python: tests: add test for casting line.Value to bool
  bindings: python: support casting line.Value to bool

 bindings/python/gpiod/line.py       |  3 +++
 bindings/python/tests/Makefile.am   |  1 +
 bindings/python/tests/tests_line.py | 11 +++++++++++
 3 files changed, 15 insertions(+)
 create mode 100644 bindings/python/tests/tests_line.py

--
2.39.2

Comments

Bartosz Golaszewski May 22, 2024, 4:22 p.m. UTC | #1
On Wed, 22 May 2024 02:46:41 +0200, Kent Gibson <warthog618@gmail.com> said:
> While writing a gpiod plugin for gpiozero (Python), I had to map line.Value
> to its bool equivalent.  Casting seemed the obvious way to go, as it is
> essentially a boolean, but that didn't work as I expected - it always
> returned True. This is the case for any Python type that does not provide
> a suitable conversion operator.
>
> This series adds support for casting line.Value to bool.
>

Ha! Interesting. Do you think we may need it anywhere else too?

> Patch 1 adds a test that comfirms the existing behaviour.
> Patch 2 adds the __bool__() operator to make the Value behave as one
> might expect.
>
> As an aside, I couldn't for the life of me work out how to run the complete
> python test suite.  There are no hints in the documentation.
>
> There is a python-tests-run target in the Makefile, but that didn't work:
>
> ~/libgpiod/bindings/python$ make python-tests-run
> PYTHONPATH=/home/kent/libgpiod/bindings/python
> LD_LIBRARY_PATH=/home/kent/libgpiod/lib/.libs/:\
> 	/home/kent/libgpiod/tests/gpiosim/.libs/ \
> python3 -B -m tests
> /bin/bash: line 2: /home/kent/libgpiod/tests/gpiosim/.libs/: Is a directory
> make: *** [Makefile:677: python-tests-run] Error 126
>
> I tried fixing that but I still couldn't satisfy ld wrt the gpiosim
> (I don't have libgpiod installed - just using the local build),
> so gave up and called this particular test directly with
>

I typically run it like this:

    PYTHONPATH=./bindings/python
LD_LIBRARY_PATH=./lib/.libs/:./tests/gpiosim/.libs/:bindings/python/
python -B -m tests

Bart

> $ python -m unittest tests_line.py
>
> While that passes, I can't guarantee it hasn't caused some other
> breakage, though it seems very unlikely.
>
> Kent Gibson (2):
>   bindings: python: tests: add test for casting line.Value to bool
>   bindings: python: support casting line.Value to bool
>
>  bindings/python/gpiod/line.py       |  3 +++
>  bindings/python/tests/Makefile.am   |  1 +
>  bindings/python/tests/tests_line.py | 11 +++++++++++
>  3 files changed, 15 insertions(+)
>  create mode 100644 bindings/python/tests/tests_line.py
>
> --
> 2.39.2
>
>
Kent Gibson May 22, 2024, 11:57 p.m. UTC | #2
On Wed, May 22, 2024 at 09:22:50AM -0700, brgl@bgdev.pl wrote:
> On Wed, 22 May 2024 02:46:41 +0200, Kent Gibson <warthog618@gmail.com> said:
> > While writing a gpiod plugin for gpiozero (Python), I had to map line.Value
> > to its bool equivalent.  Casting seemed the obvious way to go, as it is
> > essentially a boolean, but that didn't work as I expected - it always
> > returned True. This is the case for any Python type that does not provide
> > a suitable conversion operator.
> >
> > This series adds support for casting line.Value to bool.
> >
>
> Ha! Interesting. Do you think we may need it anywhere else too?
>

I guess the same applies to the C++ and Rust bindings - I'll have to
check.

> > Patch 1 adds a test that comfirms the existing behaviour.
> > Patch 2 adds the __bool__() operator to make the Value behave as one
> > might expect.
> >
> > As an aside, I couldn't for the life of me work out how to run the complete
> > python test suite.  There are no hints in the documentation.
> >
> > There is a python-tests-run target in the Makefile, but that didn't work:
> >
> > ~/libgpiod/bindings/python$ make python-tests-run
> > PYTHONPATH=/home/kent/libgpiod/bindings/python
> > LD_LIBRARY_PATH=/home/kent/libgpiod/lib/.libs/:\
> > 	/home/kent/libgpiod/tests/gpiosim/.libs/ \
> > python3 -B -m tests
> > /bin/bash: line 2: /home/kent/libgpiod/tests/gpiosim/.libs/: Is a directory
> > make: *** [Makefile:677: python-tests-run] Error 126
> >
> > I tried fixing that but I still couldn't satisfy ld wrt the gpiosim
> > (I don't have libgpiod installed - just using the local build),
> > so gave up and called this particular test directly with
> >
>
> I typically run it like this:
>
>     PYTHONPATH=./bindings/python
> LD_LIBRARY_PATH=./lib/.libs/:./tests/gpiosim/.libs/:bindings/python/
> python -B -m tests
>

So a one-liner?

That gives me:

$ PYTHONPATH=./bindings/python LD_LIBRARY_PATH=./lib/.libs/:./tests/gpiosim/.libs/:bindings/python/ python3 -B -m tests
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/kent/libgpiod/bindings/python/tests/__main__.py", line 7, in <module>
    from .tests_chip import *
  File "/home/kent/libgpiod/bindings/python/tests/tests_chip.py", line 8, in <module>
    from . import gpiosim
  File "/home/kent/libgpiod/bindings/python/tests/gpiosim/__init__.py", line 4, in <module>
    from .chip import Chip
  File "/home/kent/libgpiod/bindings/python/tests/gpiosim/chip.py", line 4, in <module>
    from . import _ext
FileNotFoundError: [Errno 2] No such file or directory

That might also be as far as I got previously - I may've been mis-remembering
that the final hurdle was an import error, not an ld issue, though both are
looking for a module they can't find, so basically the same thing.

Cheers,
Kent.
Kent Gibson May 23, 2024, 12:32 a.m. UTC | #3
On Thu, May 23, 2024 at 07:57:12AM +0800, Kent Gibson wrote:
> On Wed, May 22, 2024 at 09:22:50AM -0700, brgl@bgdev.pl wrote:
> > On Wed, 22 May 2024 02:46:41 +0200, Kent Gibson <warthog618@gmail.com> said:
> > > While writing a gpiod plugin for gpiozero (Python), I had to map line.Value
> > > to its bool equivalent.  Casting seemed the obvious way to go, as it is
> > > essentially a boolean, but that didn't work as I expected - it always
> > > returned True. This is the case for any Python type that does not provide
> > > a suitable conversion operator.
> > >
> > > This series adds support for casting line.Value to bool.
> > >
> >
> > Ha! Interesting. Do you think we may need it anywhere else too?
> >
>
> I guess the same applies to the C++ and Rust bindings - I'll have to
> check.
>

Or do you mean other fields?  There wasn't anything in line.py - all the
other enums are non-binary.  And nothing else springs to mind.

Cheers,
Kent.
Bartosz Golaszewski May 23, 2024, 7:50 a.m. UTC | #4
On Thu, May 23, 2024 at 2:32 AM Kent Gibson <warthog618@gmail.com> wrote:
>
> On Thu, May 23, 2024 at 07:57:12AM +0800, Kent Gibson wrote:
> > On Wed, May 22, 2024 at 09:22:50AM -0700, brgl@bgdev.pl wrote:
> > > On Wed, 22 May 2024 02:46:41 +0200, Kent Gibson <warthog618@gmail.com> said:
> > > > While writing a gpiod plugin for gpiozero (Python), I had to map line.Value
> > > > to its bool equivalent.  Casting seemed the obvious way to go, as it is
> > > > essentially a boolean, but that didn't work as I expected - it always
> > > > returned True. This is the case for any Python type that does not provide
> > > > a suitable conversion operator.
> > > >
> > > > This series adds support for casting line.Value to bool.
> > > >
> > >
> > > Ha! Interesting. Do you think we may need it anywhere else too?
> > >
> >
> > I guess the same applies to the C++ and Rust bindings - I'll have to
> > check.
> >
>
> Or do you mean other fields?  There wasn't anything in line.py - all the
> other enums are non-binary.  And nothing else springs to mind.

Yeah, I meant other Python classes. C++ is fine, the cast from enum to
int is unambiguous. For Rust I don't know but I'm seeing things like
IntMap<Value> in the code, I suppose, enums map fine if nobody
complained yet (given rust would most likely not build at all if it
didn't handle this case).

Bart
Bartosz Golaszewski May 23, 2024, 7:55 a.m. UTC | #5
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>


On Wed, 22 May 2024 08:46:41 +0800, Kent Gibson wrote:
> While writing a gpiod plugin for gpiozero (Python), I had to map line.Value
> to its bool equivalent.  Casting seemed the obvious way to go, as it is
> essentially a boolean, but that didn't work as I expected - it always
> returned True. This is the case for any Python type that does not provide
> a suitable conversion operator.
> 
> This series adds support for casting line.Value to bool.
> 
> [...]

Applied, thanks!

[1/2] bindings: python: tests: add test for casting line.Value to bool
      commit: c8e3ae0499c800955cd77d8959be0f14e4b514cc
[2/2] bindings: python: support casting line.Value to bool
      commit: 5f9152b0ca8ad7ac8a8591553931b38dc10c5db0

Best regards,