From 9644992222da66bd6aaad9f182bac704b7572e22 Mon Sep 17 00:00:00 2001 From: tyler-yankee Date: Fri, 17 Jan 2025 12:25:54 -0500 Subject: [PATCH 01/19] initial skeleton of pip and poetry examples (README setup and CI files) --- drake_pip/.clang-format | 22 +++++++++++ drake_pip/.github/ci_build_test | 15 +++++++ drake_pip/.github/ubuntu_setup | 9 +++++ drake_pip/.github/workflows/ci.yml | 56 +++++++++++++++++++++++++++ drake_pip/CPPLINT.cfg | 7 ++++ drake_pip/LICENSE | 16 ++++++++ drake_pip/README.md | 29 ++++++++++++++ drake_poetry/.clang-format | 22 +++++++++++ drake_poetry/.github/ci_build_test | 17 ++++++++ drake_poetry/.github/ubuntu_setup | 16 ++++++++ drake_poetry/.github/workflows/ci.yml | 55 ++++++++++++++++++++++++++ drake_poetry/CPPLINT.cfg | 7 ++++ drake_poetry/LICENSE | 16 ++++++++ drake_poetry/README.md | 34 ++++++++++++++++ private/test/file_sync_test.py | 10 +++++ 15 files changed, 331 insertions(+) create mode 100644 drake_pip/.clang-format create mode 100644 drake_pip/.github/ci_build_test create mode 100644 drake_pip/.github/ubuntu_setup create mode 100644 drake_pip/.github/workflows/ci.yml create mode 100644 drake_pip/CPPLINT.cfg create mode 100644 drake_pip/LICENSE create mode 100644 drake_pip/README.md create mode 100644 drake_poetry/.clang-format create mode 100644 drake_poetry/.github/ci_build_test create mode 100644 drake_poetry/.github/ubuntu_setup create mode 100644 drake_poetry/.github/workflows/ci.yml create mode 100644 drake_poetry/CPPLINT.cfg create mode 100644 drake_poetry/LICENSE create mode 100644 drake_poetry/README.md diff --git a/drake_pip/.clang-format b/drake_pip/.clang-format new file mode 100644 index 00000000..57a1cc0b --- /dev/null +++ b/drake_pip/.clang-format @@ -0,0 +1,22 @@ +# -*- mode: yaml -*- +# vi: set ft=yaml : +# SPDX-License-Identifier: MIT-0 + +--- +BasedOnStyle: Google +--- +Language: Cpp +DerivePointerAlignment: false +PointerAlignment: Left + +IncludeCategories: + - Regex: '^[<"](aio|arpa/inet|assert|complex|cpio|ctype|curses|dirent|dlfcn|errno|fcntl|fenv|float|fmtmsg|fnmatch|ftw|glob|grp|iconv|inttypes|iso646|langinfo|libgen|limits|locale|math|monetary|mqueue|ndbm|netdb|net/if|netinet/in|netinet/tcp|nl_types|poll|pthread|pwd|regex|sched|search|semaphore|setjmp|signal|spawn|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|strings|stropts|sys/ipc|syslog|sys/mman|sys/msg|sys/resource|sys/select|sys/sem|sys/shm|sys/socket|sys/stat|sys/statvfs|sys/time|sys/times|sys/types|sys/uio|sys/un|sys/utsname|sys/wait|tar|term|termios|tgmath|threads|time|trace|uchar|ulimit|uncntrl|unistd|utime|utmpx|wchar|wctype|wordexp)\.h[">]$' + Priority: 10 + - Regex: '^[<"](algorithm|array|atomic|bitset|cassert|ccomplex|cctype|cerrno|cfenv|cfloat|chrono|cinttypes|ciso646|climits|clocale|cmath|codecvt|complex|condition_variable|csetjmp|csignal|cstdalign|cstdarg|cstdbool|cstddef|cstdint|cstdio|cstdlib|cstring|ctgmath|ctime|cuchar|cwchar|cwctype|deque|exception|forward_list|fstream|functional|future|initializer_list|iomanip|ios|iosfwd|iostream|istream|iterator|limits|list|locale|map|memory|mutex|new|numeric|ostream|queue|random|ratio|regex|scoped_allocator|set|shared_mutex|sstream|stack|stdexcept|streambuf|string|strstream|system_error|thread|tuple|type_traits|typeindex|typeinfo|unordered_map|unordered_set|utility|valarray|vector)[">]$' + Priority: 20 + - Regex: '^<' + Priority: 30 + - Regex: '^"(drake|drake_external_examples)' + Priority: 50 + - Regex: '^"' + Priority: 40 diff --git a/drake_pip/.github/ci_build_test b/drake_pip/.github/ci_build_test new file mode 100644 index 00000000..7ad6157e --- /dev/null +++ b/drake_pip/.github/ci_build_test @@ -0,0 +1,15 @@ +#!/bin/bash +# SPDX-License-Identifier: MIT-0 + +set -euxo pipefail + +python3 --version + +python3 -m venv env +source env/bin/activate +pip install drake + +python3 -c 'import pydrake.all; print(pydrake.__file__)' + +deactivate +rm -rf env \ No newline at end of file diff --git a/drake_pip/.github/ubuntu_setup b/drake_pip/.github/ubuntu_setup new file mode 100644 index 00000000..989fd892 --- /dev/null +++ b/drake_pip/.github/ubuntu_setup @@ -0,0 +1,9 @@ +#!/bin/bash +# SPDX-License-Identifier: MIT-0 + +set -euxo pipefail + +echo 'APT::Acquire::Retries "4";' > /etc/apt/apt.conf.d/80-acquire-retries +echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/90-get-assume-yes + +export DEBIAN_FRONTEND='noninteractive' \ No newline at end of file diff --git a/drake_pip/.github/workflows/ci.yml b/drake_pip/.github/workflows/ci.yml new file mode 100644 index 00000000..10e60212 --- /dev/null +++ b/drake_pip/.github/workflows/ci.yml @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: MIT-0 + +--- + name: ci + on: + push: + branches: + - main + pull_request: + branches: + - main + schedule: + - cron: '0 12 * * *' + concurrency: + # Cancel previous CI runs when additional commits are added to a pull request. + # This will not cancel CI runs associated with `schedule` or `push`. + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true + jobs: + macos_sonoma_arm_cmake_installed: + name: macos sonoma 14 arm + runs-on: macos-14 + steps: + - name: checkout + uses: actions/checkout@v4 + # See issue https://github.com/actions/setup-python/issues/577. There is + # some kind of environment conflict between the symlinks found in the + # GitHub Actions runner and `brew upgrade python` where `brew` detects and + # refuses to overwrite symlinks. The cause for our runs is not clear, + # we do not use that action, but if that issue is closed this section + # can be removed. + - name: sanitize GHA / brew python environment + run: | + # Remove the symlinks that cause issues. + find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete + sudo rm -rf /Library/Frameworks/Python.framework/ + - name: pip build and test + working-directory: drake_pip + run: .github/ci_build_test + shell: zsh -efuo pipefail {0} + ubuntu_jammy_cmake_installed: + name: ubuntu 22.04 jammy + runs-on: ubuntu-latest + container: ubuntu:jammy + steps: + - name: checkout + uses: actions/checkout@v4 + - name: setup + working-directory: drake_pip + run: .github/ubuntu_setup + shell: bash + - name: pip build and test + working-directory: drake_pip + run: .github/ci_build_test + shell: bash + \ No newline at end of file diff --git a/drake_pip/CPPLINT.cfg b/drake_pip/CPPLINT.cfg new file mode 100644 index 00000000..a5dd11fb --- /dev/null +++ b/drake_pip/CPPLINT.cfg @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: MIT-0 + +set noparent + +filter=-build/c++11 +filter=-build/header_guard +filter=-build/include_subdir diff --git a/drake_pip/LICENSE b/drake_pip/LICENSE new file mode 100644 index 00000000..cdacdc00 --- /dev/null +++ b/drake_pip/LICENSE @@ -0,0 +1,16 @@ +Copyright (c) 2017-2023 by the drake-external-examples developers. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/drake_pip/README.md b/drake_pip/README.md new file mode 100644 index 00000000..140472b2 --- /dev/null +++ b/drake_pip/README.md @@ -0,0 +1,29 @@ +# Python Project with Drake Installed from pip + +This installs Drake using [`pip`](https://pypi.org/project/pip/), the Pyton package manager. + +## Instructions + +First, create a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment), name it `env`, and activate it: + +``` +python3 -m venv env +source env/bin/activate +``` + +Then install Drake for Python in the virtual environment: + +``` +pip install drake +``` + +Call the following to ensure `pydrake` can be imported: + +``` +python3 -c 'import pydrake.all; print(pydrake.__file__)' +``` + +That's all that is needed to use Drake from Python. See [Installation via Pip](https://drake.mit.edu/pip.html#stable-releases) for more information on installation. For more information on what's available for Drake in Python, see [Using Drake from Python](https://drake.mit.edu/python_bindings.html) and the Python API [pydrake](https://drake.mit.edu/pydrake/index.html). + +## Examples + diff --git a/drake_poetry/.clang-format b/drake_poetry/.clang-format new file mode 100644 index 00000000..57a1cc0b --- /dev/null +++ b/drake_poetry/.clang-format @@ -0,0 +1,22 @@ +# -*- mode: yaml -*- +# vi: set ft=yaml : +# SPDX-License-Identifier: MIT-0 + +--- +BasedOnStyle: Google +--- +Language: Cpp +DerivePointerAlignment: false +PointerAlignment: Left + +IncludeCategories: + - Regex: '^[<"](aio|arpa/inet|assert|complex|cpio|ctype|curses|dirent|dlfcn|errno|fcntl|fenv|float|fmtmsg|fnmatch|ftw|glob|grp|iconv|inttypes|iso646|langinfo|libgen|limits|locale|math|monetary|mqueue|ndbm|netdb|net/if|netinet/in|netinet/tcp|nl_types|poll|pthread|pwd|regex|sched|search|semaphore|setjmp|signal|spawn|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|strings|stropts|sys/ipc|syslog|sys/mman|sys/msg|sys/resource|sys/select|sys/sem|sys/shm|sys/socket|sys/stat|sys/statvfs|sys/time|sys/times|sys/types|sys/uio|sys/un|sys/utsname|sys/wait|tar|term|termios|tgmath|threads|time|trace|uchar|ulimit|uncntrl|unistd|utime|utmpx|wchar|wctype|wordexp)\.h[">]$' + Priority: 10 + - Regex: '^[<"](algorithm|array|atomic|bitset|cassert|ccomplex|cctype|cerrno|cfenv|cfloat|chrono|cinttypes|ciso646|climits|clocale|cmath|codecvt|complex|condition_variable|csetjmp|csignal|cstdalign|cstdarg|cstdbool|cstddef|cstdint|cstdio|cstdlib|cstring|ctgmath|ctime|cuchar|cwchar|cwctype|deque|exception|forward_list|fstream|functional|future|initializer_list|iomanip|ios|iosfwd|iostream|istream|iterator|limits|list|locale|map|memory|mutex|new|numeric|ostream|queue|random|ratio|regex|scoped_allocator|set|shared_mutex|sstream|stack|stdexcept|streambuf|string|strstream|system_error|thread|tuple|type_traits|typeindex|typeinfo|unordered_map|unordered_set|utility|valarray|vector)[">]$' + Priority: 20 + - Regex: '^<' + Priority: 30 + - Regex: '^"(drake|drake_external_examples)' + Priority: 50 + - Regex: '^"' + Priority: 40 diff --git a/drake_poetry/.github/ci_build_test b/drake_poetry/.github/ci_build_test new file mode 100644 index 00000000..1d238ef6 --- /dev/null +++ b/drake_poetry/.github/ci_build_test @@ -0,0 +1,17 @@ +#!/bin/bash +# SPDX-License-Identifier: MIT-0 + +set -euxo pipefail + +poetry --version + +poetry new drake_poetry_demo +pushd drake_poetry_demo +poetry add drake +eval $(poetry env activate) + +python3 -c 'import pydrake.all; print(pydrake.__file__)' + +deactivate +popd +rm -rf drake_poetry_demo \ No newline at end of file diff --git a/drake_poetry/.github/ubuntu_setup b/drake_poetry/.github/ubuntu_setup new file mode 100644 index 00000000..18e83ec6 --- /dev/null +++ b/drake_poetry/.github/ubuntu_setup @@ -0,0 +1,16 @@ +#!/bin/bash +# SPDX-License-Identifier: MIT-0 + +set -euxo pipefail + +echo 'APT::Acquire::Retries "4";' > /etc/apt/apt.conf.d/80-acquire-retries +echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/90-get-assume-yes + +export DEBIAN_FRONTEND='noninteractive' + +sudo apt-get install --no-install-recommends $(cat < Date: Fri, 17 Jan 2025 13:45:28 -0500 Subject: [PATCH 02/19] add particle demos to pip and poetry examples, and poetry install to ubuntu_setup --- drake_pip/.github/ci_build_test | 4 +- drake_pip/README.md | 6 +++ drake_pip/src/particle.py | 48 ++++++++++++++++++++++++ drake_pip/src/particle_test.py | 59 ++++++++++++++++++++++++++++++ drake_poetry/.github/ci_build_test | 8 ++-- drake_poetry/README.md | 10 ++++- drake_poetry/src/particle.py | 48 ++++++++++++++++++++++++ drake_poetry/src/particle_test.py | 59 ++++++++++++++++++++++++++++++ private/test/file_sync_test.py | 4 -- 9 files changed, 235 insertions(+), 11 deletions(-) create mode 100644 drake_pip/src/particle.py create mode 100644 drake_pip/src/particle_test.py create mode 100644 drake_poetry/src/particle.py create mode 100644 drake_poetry/src/particle_test.py diff --git a/drake_pip/.github/ci_build_test b/drake_pip/.github/ci_build_test index 7ad6157e..edd7a6df 100644 --- a/drake_pip/.github/ci_build_test +++ b/drake_pip/.github/ci_build_test @@ -11,5 +11,7 @@ pip install drake python3 -c 'import pydrake.all; print(pydrake.__file__)' +python3 src/particle_test.py + deactivate -rm -rf env \ No newline at end of file +rm -rf env src/__pycache__ \ No newline at end of file diff --git a/drake_pip/README.md b/drake_pip/README.md index 140472b2..5df62ade 100644 --- a/drake_pip/README.md +++ b/drake_pip/README.md @@ -27,3 +27,9 @@ That's all that is needed to use Drake from Python. See [Installation via Pip](h ## Examples +To run the particle example tests in this directory, navigate to `src` and call the test file to execute the unit tests: + +``` +cd src +python3 particle_test.py +``` \ No newline at end of file diff --git a/drake_pip/src/particle.py b/drake_pip/src/particle.py new file mode 100644 index 00000000..10d6474d --- /dev/null +++ b/drake_pip/src/particle.py @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: MIT-0 + +from pydrake.systems.framework import BasicVector +from pydrake.systems.framework import LeafSystem +from pydrake.systems.framework import PortDataType + + +class Particle(LeafSystem): + """ + A linear 1DOF particle system. + + With very simple dynamics xdotdot = a, this system can be described in + terms of its: + + Inputs: + linear acceleration (input index 0), in m/s^2 units. + + States/Outputs: + linear position (state/output index 0), in m units. + linear velocity (state/output index 1), in m/s units. + """ + def __init__(self): + LeafSystem.__init__(self) + # A 1D input vector for acceleration. + self.DeclareInputPort('acceleration', PortDataType.kVectorValued, 1) + # Adding one generalized position and one generalized velocity. + self.DeclareContinuousState(1, 1, 0) + # A 2D output vector for position and velocity. + self.DeclareVectorOutputPort('postion_and_velocity', BasicVector(2), + self.CopyStateOut) + + def CopyStateOut(self, context, output): + # Get current state from context. + continuous_state_vector = context.get_continuous_state_vector() + # Write system output. + output.SetFromVector(continuous_state_vector.CopyToVector()) + + def DoCalcTimeDerivatives(self, context, derivatives): + # Get current state from context. + continuous_state_vector = x = context.get_continuous_state_vector() + # Obtain the structure we need to write into. + derivatives_vector = derivatives.get_mutable_vector() + # Get current input acceleration value. + input_vector = self.EvalVectorInput(context, 0) + # Set the derivatives. The first one is velocity and the second one is + # acceleration. + derivatives_vector.SetAtIndex(0, continuous_state_vector.GetAtIndex(1)) + derivatives_vector.SetAtIndex(1, input_vector.GetAtIndex(0)) diff --git a/drake_pip/src/particle_test.py b/drake_pip/src/particle_test.py new file mode 100644 index 00000000..5108aa5c --- /dev/null +++ b/drake_pip/src/particle_test.py @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: MIT-0 + +import unittest + +from particle import Particle + + +class TestParticle(unittest.TestCase): + """A test case for Particle systems.""" + def setUp(self): + # System (aka 'device under test') being tested. + self.dut = Particle() + # Context for the given dut. + self.context = self.dut.CreateDefaultContext() + # Outputs of the given dut. + self.output = self.dut.AllocateOutput() + # Derivatives of the given dut. + self.derivatives = self.dut.AllocateTimeDerivatives() + + def test_output(self): + """ + Makes sure a Particle output is consistent with its state (position and + velocity). + """ + # Initialize state. + continuous_state_vector = \ + self.context.get_mutable_continuous_state_vector() + continuous_state_vector.SetAtIndex(0, 10.0) # x0 = 10 m. + continuous_state_vector.SetAtIndex(1, 1.0) # x1 = 1 m/s. + # Compute outputs. + self.dut.CalcOutput(self.context, self.output) + output_vector = self.output.get_vector_data(0) + # Check results. + self.assertEqual(output_vector.GetAtIndex(0), 10.0) # y0 == x0 + self.assertEqual(output_vector.GetAtIndex(1), 1.0) # y1 == x1 + + def test_derivatives(self): + """ + Makes sure a Particle system state derivatives are consistent with its + state and input (velocity and acceleration). + """ + # Set input. + input_port = self.dut.get_input_port(0) + input_port.FixValue(self.context, 1.0) # u0 = 1 m/s^2 + # Set state. + continuous_state_vector = \ + self.context.get_mutable_continuous_state_vector() + continuous_state_vector.SetAtIndex(0, 0.0) # x0 = 0 m + continuous_state_vector.SetAtIndex(1, 2.0) # x1 = 2 m/s + # Compute derivatives. + self.dut.CalcTimeDerivatives(self.context, self.derivatives) + derivatives_vector = self.derivatives.get_vector() + # Check results. + self.assertEqual(derivatives_vector.GetAtIndex(0), 2.0) # x0dot == x1 + self.assertEqual(derivatives_vector.GetAtIndex(1), 1.0) # x1dot == u0 + + +if __name__ == '__main__': + unittest.main() diff --git a/drake_poetry/.github/ci_build_test b/drake_poetry/.github/ci_build_test index 1d238ef6..12082dca 100644 --- a/drake_poetry/.github/ci_build_test +++ b/drake_poetry/.github/ci_build_test @@ -5,13 +5,13 @@ set -euxo pipefail poetry --version -poetry new drake_poetry_demo -pushd drake_poetry_demo +poetry init -n poetry add drake eval $(poetry env activate) python3 -c 'import pydrake.all; print(pydrake.__file__)' +python3 src/particle_test.py + deactivate -popd -rm -rf drake_poetry_demo \ No newline at end of file +rm -rf src/__pycache__ \ No newline at end of file diff --git a/drake_poetry/README.md b/drake_poetry/README.md index 80d53aea..0629372c 100644 --- a/drake_poetry/README.md +++ b/drake_poetry/README.md @@ -6,10 +6,10 @@ For an introduction to `poetry`, see [Basic usage](https://python-poetry.org/doc ## Instructions -First, create a new `poetry` project: +First, create a new `poetry` project in this directory, optionally including `-n` to ignore the interactive setup: ``` -poetry new drake_poetry_demo +poetry init [-n] ``` The `pyproject.toml` file that's created contains the project and dependency information. Refer to [Source Installation](https://drake.mit.edu/from_source.html) for the version of Python currently supported by Drake, which can be specified using: @@ -32,3 +32,9 @@ eval $(poetry env activate) ## Examples +To run the particle example tests in this directory, navigate to `src` and call the test file to execute the unit tests: + +``` +cd src +python3 particle_test.py +``` \ No newline at end of file diff --git a/drake_poetry/src/particle.py b/drake_poetry/src/particle.py new file mode 100644 index 00000000..10d6474d --- /dev/null +++ b/drake_poetry/src/particle.py @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: MIT-0 + +from pydrake.systems.framework import BasicVector +from pydrake.systems.framework import LeafSystem +from pydrake.systems.framework import PortDataType + + +class Particle(LeafSystem): + """ + A linear 1DOF particle system. + + With very simple dynamics xdotdot = a, this system can be described in + terms of its: + + Inputs: + linear acceleration (input index 0), in m/s^2 units. + + States/Outputs: + linear position (state/output index 0), in m units. + linear velocity (state/output index 1), in m/s units. + """ + def __init__(self): + LeafSystem.__init__(self) + # A 1D input vector for acceleration. + self.DeclareInputPort('acceleration', PortDataType.kVectorValued, 1) + # Adding one generalized position and one generalized velocity. + self.DeclareContinuousState(1, 1, 0) + # A 2D output vector for position and velocity. + self.DeclareVectorOutputPort('postion_and_velocity', BasicVector(2), + self.CopyStateOut) + + def CopyStateOut(self, context, output): + # Get current state from context. + continuous_state_vector = context.get_continuous_state_vector() + # Write system output. + output.SetFromVector(continuous_state_vector.CopyToVector()) + + def DoCalcTimeDerivatives(self, context, derivatives): + # Get current state from context. + continuous_state_vector = x = context.get_continuous_state_vector() + # Obtain the structure we need to write into. + derivatives_vector = derivatives.get_mutable_vector() + # Get current input acceleration value. + input_vector = self.EvalVectorInput(context, 0) + # Set the derivatives. The first one is velocity and the second one is + # acceleration. + derivatives_vector.SetAtIndex(0, continuous_state_vector.GetAtIndex(1)) + derivatives_vector.SetAtIndex(1, input_vector.GetAtIndex(0)) diff --git a/drake_poetry/src/particle_test.py b/drake_poetry/src/particle_test.py new file mode 100644 index 00000000..5108aa5c --- /dev/null +++ b/drake_poetry/src/particle_test.py @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: MIT-0 + +import unittest + +from particle import Particle + + +class TestParticle(unittest.TestCase): + """A test case for Particle systems.""" + def setUp(self): + # System (aka 'device under test') being tested. + self.dut = Particle() + # Context for the given dut. + self.context = self.dut.CreateDefaultContext() + # Outputs of the given dut. + self.output = self.dut.AllocateOutput() + # Derivatives of the given dut. + self.derivatives = self.dut.AllocateTimeDerivatives() + + def test_output(self): + """ + Makes sure a Particle output is consistent with its state (position and + velocity). + """ + # Initialize state. + continuous_state_vector = \ + self.context.get_mutable_continuous_state_vector() + continuous_state_vector.SetAtIndex(0, 10.0) # x0 = 10 m. + continuous_state_vector.SetAtIndex(1, 1.0) # x1 = 1 m/s. + # Compute outputs. + self.dut.CalcOutput(self.context, self.output) + output_vector = self.output.get_vector_data(0) + # Check results. + self.assertEqual(output_vector.GetAtIndex(0), 10.0) # y0 == x0 + self.assertEqual(output_vector.GetAtIndex(1), 1.0) # y1 == x1 + + def test_derivatives(self): + """ + Makes sure a Particle system state derivatives are consistent with its + state and input (velocity and acceleration). + """ + # Set input. + input_port = self.dut.get_input_port(0) + input_port.FixValue(self.context, 1.0) # u0 = 1 m/s^2 + # Set state. + continuous_state_vector = \ + self.context.get_mutable_continuous_state_vector() + continuous_state_vector.SetAtIndex(0, 0.0) # x0 = 0 m + continuous_state_vector.SetAtIndex(1, 2.0) # x1 = 2 m/s + # Compute derivatives. + self.dut.CalcTimeDerivatives(self.context, self.derivatives) + derivatives_vector = self.derivatives.get_vector() + # Check results. + self.assertEqual(derivatives_vector.GetAtIndex(0), 2.0) # x0dot == x1 + self.assertEqual(derivatives_vector.GetAtIndex(1), 1.0) # x1dot == u0 + + +if __name__ == '__main__': + unittest.main() diff --git a/private/test/file_sync_test.py b/private/test/file_sync_test.py index a0702bc6..c90260a8 100755 --- a/private/test/file_sync_test.py +++ b/private/test/file_sync_test.py @@ -25,10 +25,6 @@ "drake_bazel_download/.github/ubuntu_setup", "drake_cmake_installed/.github/ubuntu_setup", ), - ( - "drake_pip/.github/ubuntu_setup", - "drake_poetry/.github/ubuntu_setup", - ), ( "drake_bazel_download/CPPLINT.cfg", "drake_bazel_external/CPPLINT.cfg", From 272e96c6779098bba58e02e97a3235e6f19f976b Mon Sep 17 00:00:00 2001 From: tyler-yankee Date: Fri, 17 Jan 2025 14:41:37 -0500 Subject: [PATCH 03/19] sync new examples with GHA and add MacOS CI support for poetry install --- .github/workflows/ci.yml | 4 ++ .github/workflows/pip.yml | 56 +++++++++++++++++++++++++ .github/workflows/poetry.yml | 59 +++++++++++++++++++++++++++ drake_poetry/.github/macos_setup | 9 ++++ drake_poetry/.github/ubuntu_setup | 1 + drake_poetry/.github/workflows/ci.yml | 4 ++ private/test/file_sync_test.py | 11 +++++ 7 files changed, 144 insertions(+) create mode 100644 .github/workflows/pip.yml create mode 100644 .github/workflows/poetry.yml create mode 100644 drake_poetry/.github/macos_setup diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 51f2cb27..1b15e4fd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,6 +23,10 @@ jobs: uses: ./.github/workflows/bazel_download.yml cmake_installed_apt: uses: ./.github/workflows/cmake_installed_apt.yml + pip: + uses: ./.github/workflows/pip.yml + poetry: + uses: ./.github/workflows/poetry.yml file_sync: name: file sync runs-on: ubuntu-latest diff --git a/.github/workflows/pip.yml b/.github/workflows/pip.yml new file mode 100644 index 00000000..10e60212 --- /dev/null +++ b/.github/workflows/pip.yml @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: MIT-0 + +--- + name: ci + on: + push: + branches: + - main + pull_request: + branches: + - main + schedule: + - cron: '0 12 * * *' + concurrency: + # Cancel previous CI runs when additional commits are added to a pull request. + # This will not cancel CI runs associated with `schedule` or `push`. + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true + jobs: + macos_sonoma_arm_cmake_installed: + name: macos sonoma 14 arm + runs-on: macos-14 + steps: + - name: checkout + uses: actions/checkout@v4 + # See issue https://github.com/actions/setup-python/issues/577. There is + # some kind of environment conflict between the symlinks found in the + # GitHub Actions runner and `brew upgrade python` where `brew` detects and + # refuses to overwrite symlinks. The cause for our runs is not clear, + # we do not use that action, but if that issue is closed this section + # can be removed. + - name: sanitize GHA / brew python environment + run: | + # Remove the symlinks that cause issues. + find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete + sudo rm -rf /Library/Frameworks/Python.framework/ + - name: pip build and test + working-directory: drake_pip + run: .github/ci_build_test + shell: zsh -efuo pipefail {0} + ubuntu_jammy_cmake_installed: + name: ubuntu 22.04 jammy + runs-on: ubuntu-latest + container: ubuntu:jammy + steps: + - name: checkout + uses: actions/checkout@v4 + - name: setup + working-directory: drake_pip + run: .github/ubuntu_setup + shell: bash + - name: pip build and test + working-directory: drake_pip + run: .github/ci_build_test + shell: bash + \ No newline at end of file diff --git a/.github/workflows/poetry.yml b/.github/workflows/poetry.yml new file mode 100644 index 00000000..367d6918 --- /dev/null +++ b/.github/workflows/poetry.yml @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: MIT-0 + +--- + name: ci + on: + push: + branches: + - main + pull_request: + branches: + - main + schedule: + - cron: '0 12 * * *' + concurrency: + # Cancel previous CI runs when additional commits are added to a pull request. + # This will not cancel CI runs associated with `schedule` or `push`. + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true + jobs: + macos_sonoma_arm_cmake_installed: + name: macos sonoma 14 arm + runs-on: macos-14 + steps: + - name: checkout + uses: actions/checkout@v4 + # See issue https://github.com/actions/setup-python/issues/577. There is + # some kind of environment conflict between the symlinks found in the + # GitHub Actions runner and `brew upgrade python` where `brew` detects and + # refuses to overwrite symlinks. The cause for our runs is not clear, + # we do not use that action, but if that issue is closed this section + # can be removed. + - name: sanitize GHA / brew python environment + run: | + # Remove the symlinks that cause issues. + find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete + sudo rm -rf /Library/Frameworks/Python.framework/ + - name: setup + working-directory: drake_poetry + run: .github/macos_setup + shell: zsh -efuo pipefail {0} + - name: poetry build and test + working-directory: drake_poetry + run: .github/ci_build_test + shell: zsh -efuo pipefail {0} + ubuntu_jammy_cmake_installed: + name: ubuntu 22.04 jammy + runs-on: ubuntu-latest + container: ubuntu:jammy + steps: + - name: checkout + uses: actions/checkout@v4 + - name: setup + working-directory: drake_poetry + run: .github/ubuntu_setup + shell: bash + - name: poetry build and test + working-directory: drake_poetry + run: .github/ci_build_test + shell: bash \ No newline at end of file diff --git a/drake_poetry/.github/macos_setup b/drake_poetry/.github/macos_setup new file mode 100644 index 00000000..dd5b0748 --- /dev/null +++ b/drake_poetry/.github/macos_setup @@ -0,0 +1,9 @@ +#!/bin/bash +# SPDX-License-Identifier: MIT-0 + +set -euxo pipefail + +brew install pipx +pipx ensurepath + +pipx install poetry \ No newline at end of file diff --git a/drake_poetry/.github/ubuntu_setup b/drake_poetry/.github/ubuntu_setup index 18e83ec6..0d8ff6de 100644 --- a/drake_poetry/.github/ubuntu_setup +++ b/drake_poetry/.github/ubuntu_setup @@ -13,4 +13,5 @@ sudo apt-get install --no-install-recommends $(cat < Date: Fri, 17 Jan 2025 14:43:51 -0500 Subject: [PATCH 04/19] add new examples to top-level README --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 37b90d69..8c1a6bd1 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ own project: * [`drake_cmake_external`](./drake_cmake_external) * [`drake_cmake_installed`](./drake_cmake_installed) * [`drake_cmake_installed_apt`](./drake_cmake_installed_apt) +* [`drake_pip`](./drake_pip) +* [`drake_poetry`](./drake_poetry) ## Continuous Integration @@ -23,9 +25,12 @@ Scripts are provided for various CI instances in `scripts/continuous_integration | `drake_cmake_external` | - | o | | `drake_cmake_installed` | o | - | | `drake_cmake_installed_apt` | o | - | +| `drake_pip` | o | - | +| `drake_poetry` | o | - | || ![GitHub Actions](https://img.shields.io/github/actions/workflow/status/RobotLocomotion/drake-external-examples/ci.yml?branch=main) | [![Jenkins](https://img.shields.io/jenkins/build.svg?jobUrl=https://drake-jenkins.csail.mit.edu/job/RobotLocomotion/job/drake-external-examples/job/main)](https://drake-jenkins.csail.mit.edu/job/RobotLocomotion/job/drake-external-examples/) | Note, the GitHub Actions jobs only build and test `drake_bazel_download`, -`drake_cmake_installed`, and `drake_cmake_installed_apt` since these are the -exemplary cases for lightweight, open-source builds on public CI servers. +`drake_cmake_installed`, `drake_cmake_installed_apt`, `drake_pip`, and +`drake_poetry`, since these are the exemplary cases for lightweight, +open-source builds on public CI servers. From c0d467130056b40da963fbf1c6d08a13247340c5 Mon Sep 17 00:00:00 2001 From: tyler-yankee Date: Fri, 17 Jan 2025 15:05:14 -0500 Subject: [PATCH 05/19] implement GHA scripts for pip and poetry examples --- .github/workflows/pip.yml | 107 +++++++++++----------- .github/workflows/poetry.yml | 111 ++++++++++++----------- drake_pip/.github/ci_build_test | 4 +- drake_pip/.github/ubuntu_setup | 4 +- drake_pip/.github/workflows/ci.yml | 118 ++++++++++++++----------- drake_pip/README.md | 14 ++- drake_pip/setup/install_prereqs | 93 ++++++++++++++++++++ drake_poetry/.github/ci_build_test | 4 +- drake_poetry/.github/macos_setup | 6 +- drake_poetry/.github/ubuntu_setup | 9 +- drake_poetry/.github/workflows/ci.yml | 122 ++++++++++++++------------ drake_poetry/README.md | 12 ++- drake_poetry/setup/install_prereqs | 96 ++++++++++++++++++++ private/test/file_sync_test.py | 12 +-- 14 files changed, 469 insertions(+), 243 deletions(-) mode change 100644 => 100755 drake_pip/.github/ci_build_test mode change 100644 => 100755 drake_pip/.github/ubuntu_setup create mode 100755 drake_pip/setup/install_prereqs mode change 100644 => 100755 drake_poetry/.github/ci_build_test mode change 100644 => 100755 drake_poetry/.github/macos_setup mode change 100644 => 100755 drake_poetry/.github/ubuntu_setup create mode 100755 drake_poetry/setup/install_prereqs diff --git a/.github/workflows/pip.yml b/.github/workflows/pip.yml index 10e60212..51dcea26 100644 --- a/.github/workflows/pip.yml +++ b/.github/workflows/pip.yml @@ -1,56 +1,57 @@ # SPDX-License-Identifier: MIT-0 --- - name: ci - on: - push: - branches: - - main - pull_request: - branches: - - main - schedule: - - cron: '0 12 * * *' - concurrency: - # Cancel previous CI runs when additional commits are added to a pull request. - # This will not cancel CI runs associated with `schedule` or `push`. - group: ${{ github.head_ref || github.run_id }} - cancel-in-progress: true - jobs: - macos_sonoma_arm_cmake_installed: - name: macos sonoma 14 arm - runs-on: macos-14 - steps: - - name: checkout - uses: actions/checkout@v4 - # See issue https://github.com/actions/setup-python/issues/577. There is - # some kind of environment conflict between the symlinks found in the - # GitHub Actions runner and `brew upgrade python` where `brew` detects and - # refuses to overwrite symlinks. The cause for our runs is not clear, - # we do not use that action, but if that issue is closed this section - # can be removed. - - name: sanitize GHA / brew python environment - run: | - # Remove the symlinks that cause issues. - find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete - sudo rm -rf /Library/Frameworks/Python.framework/ - - name: pip build and test - working-directory: drake_pip - run: .github/ci_build_test - shell: zsh -efuo pipefail {0} - ubuntu_jammy_cmake_installed: - name: ubuntu 22.04 jammy - runs-on: ubuntu-latest - container: ubuntu:jammy - steps: - - name: checkout - uses: actions/checkout@v4 - - name: setup - working-directory: drake_pip - run: .github/ubuntu_setup - shell: bash - - name: pip build and test - working-directory: drake_pip - run: .github/ci_build_test - shell: bash - \ No newline at end of file +name: ci +on: + workflow_call: + +jobs: + macos_sonoma_arm_pip: + name: macos sonoma 14 arm + runs-on: macos-14 + steps: + - name: checkout + uses: actions/checkout@v4 + # See issue https://github.com/actions/setup-python/issues/577. There is + # some kind of environment conflict between the symlinks found in the + # GitHub Actions runner and `brew upgrade python` where `brew` detects and + # refuses to overwrite symlinks. The cause for our runs is not clear, + # we do not use that action, but if that issue is closed this section + # can be removed. + - name: sanitize GHA / brew python environment + run: | + # Remove the symlinks that cause issues. + find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete + sudo rm -rf /Library/Frameworks/Python.framework/ + - name: python setup + id: macos_python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: pip setup + working-directory: drake_pip + run: setup/install_prereqs + shell: zsh -efuo pipefail {0} + - name: pip build and test + working-directory: drake_pip + run: .github/ci_build_test + env: + PYTHON_VERSION: '3.12' + shell: zsh -efuo pipefail {0} + ubuntu_jammy_pip: + name: ubuntu 22.04 jammy + runs-on: ubuntu-latest + container: ubuntu:jammy + steps: + - name: checkout + uses: actions/checkout@v4 + - name: pip setup + working-directory: drake_pip + run: .github/ubuntu_setup + shell: bash + - name: pip build and test + working-directory: drake_pip + run: .github/ci_build_test + env: + PYTHON_VERSION: '3.10' + shell: bash \ No newline at end of file diff --git a/.github/workflows/poetry.yml b/.github/workflows/poetry.yml index 367d6918..98a4deee 100644 --- a/.github/workflows/poetry.yml +++ b/.github/workflows/poetry.yml @@ -1,59 +1,58 @@ # SPDX-License-Identifier: MIT-0 --- - name: ci - on: - push: - branches: - - main - pull_request: - branches: - - main - schedule: - - cron: '0 12 * * *' - concurrency: - # Cancel previous CI runs when additional commits are added to a pull request. - # This will not cancel CI runs associated with `schedule` or `push`. - group: ${{ github.head_ref || github.run_id }} - cancel-in-progress: true - jobs: - macos_sonoma_arm_cmake_installed: - name: macos sonoma 14 arm - runs-on: macos-14 - steps: - - name: checkout - uses: actions/checkout@v4 - # See issue https://github.com/actions/setup-python/issues/577. There is - # some kind of environment conflict between the symlinks found in the - # GitHub Actions runner and `brew upgrade python` where `brew` detects and - # refuses to overwrite symlinks. The cause for our runs is not clear, - # we do not use that action, but if that issue is closed this section - # can be removed. - - name: sanitize GHA / brew python environment - run: | - # Remove the symlinks that cause issues. - find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete - sudo rm -rf /Library/Frameworks/Python.framework/ - - name: setup - working-directory: drake_poetry - run: .github/macos_setup - shell: zsh -efuo pipefail {0} - - name: poetry build and test - working-directory: drake_poetry - run: .github/ci_build_test - shell: zsh -efuo pipefail {0} - ubuntu_jammy_cmake_installed: - name: ubuntu 22.04 jammy - runs-on: ubuntu-latest - container: ubuntu:jammy - steps: - - name: checkout - uses: actions/checkout@v4 - - name: setup - working-directory: drake_poetry - run: .github/ubuntu_setup - shell: bash - - name: poetry build and test - working-directory: drake_poetry - run: .github/ci_build_test - shell: bash \ No newline at end of file +name: ci +on: + workflow_call: + +jobs: + macos_sonoma_arm_poetry: + name: macos sonoma 14 arm + runs-on: macos-14 + steps: + - name: checkout + uses: actions/checkout@v4 + # See issue https://github.com/actions/setup-python/issues/577. There is + # some kind of environment conflict between the symlinks found in the + # GitHub Actions runner and `brew upgrade python` where `brew` detects and + # refuses to overwrite symlinks. The cause for our runs is not clear, + # we do not use that action, but if that issue is closed this section + # can be removed. + - name: sanitize GHA / brew python environment + run: | + # Remove the symlinks that cause issues. + find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete + sudo rm -rf /Library/Frameworks/Python.framework/ + - name: python setup + id: macos_python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: poetry setup + working-directory: drake_poetry + run: .github/macos_setup + shell: zsh -efuo pipefail {0} + - name: poetry build and test + working-directory: drake_poetry + run: .github/ci_build_test + env: + PYTHON_VERSION: '3.12' + shell: zsh -efuo pipefail {0} + ubuntu_jammy_poetry: + name: ubuntu 22.04 jammy + runs-on: ubuntu-latest + container: ubuntu:jammy + steps: + - name: checkout + uses: actions/checkout@v4 + # This should be kept in one step because updating of the PATH variable + # after installing poetry does not persist between steps on GHA. + - name: poetry setup, build, and test + working-directory: drake_poetry + run: | + .github/ubuntu_setup + source $HOME/.profile # update PATH + .github/ci_build_test + env: + PYTHON_VERSION: '3.10' + shell: bash \ No newline at end of file diff --git a/drake_pip/.github/ci_build_test b/drake_pip/.github/ci_build_test old mode 100644 new mode 100755 index edd7a6df..10eb35fc --- a/drake_pip/.github/ci_build_test +++ b/drake_pip/.github/ci_build_test @@ -3,9 +3,9 @@ set -euxo pipefail -python3 --version +"python$PYTHON_VERSION" --version +"python$PYTHON_VERSION" -m venv env -python3 -m venv env source env/bin/activate pip install drake diff --git a/drake_pip/.github/ubuntu_setup b/drake_pip/.github/ubuntu_setup old mode 100644 new mode 100755 index 989fd892..97861d9b --- a/drake_pip/.github/ubuntu_setup +++ b/drake_pip/.github/ubuntu_setup @@ -6,4 +6,6 @@ set -euxo pipefail echo 'APT::Acquire::Retries "4";' > /etc/apt/apt.conf.d/80-acquire-retries echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/90-get-assume-yes -export DEBIAN_FRONTEND='noninteractive' \ No newline at end of file +export DEBIAN_FRONTEND='noninteractive' + +setup/install_prereqs \ No newline at end of file diff --git a/drake_pip/.github/workflows/ci.yml b/drake_pip/.github/workflows/ci.yml index 10e60212..c9958f59 100644 --- a/drake_pip/.github/workflows/ci.yml +++ b/drake_pip/.github/workflows/ci.yml @@ -1,56 +1,68 @@ # SPDX-License-Identifier: MIT-0 --- - name: ci - on: - push: - branches: - - main - pull_request: - branches: - - main - schedule: - - cron: '0 12 * * *' - concurrency: - # Cancel previous CI runs when additional commits are added to a pull request. - # This will not cancel CI runs associated with `schedule` or `push`. - group: ${{ github.head_ref || github.run_id }} - cancel-in-progress: true - jobs: - macos_sonoma_arm_cmake_installed: - name: macos sonoma 14 arm - runs-on: macos-14 - steps: - - name: checkout - uses: actions/checkout@v4 - # See issue https://github.com/actions/setup-python/issues/577. There is - # some kind of environment conflict between the symlinks found in the - # GitHub Actions runner and `brew upgrade python` where `brew` detects and - # refuses to overwrite symlinks. The cause for our runs is not clear, - # we do not use that action, but if that issue is closed this section - # can be removed. - - name: sanitize GHA / brew python environment - run: | - # Remove the symlinks that cause issues. - find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete - sudo rm -rf /Library/Frameworks/Python.framework/ - - name: pip build and test - working-directory: drake_pip - run: .github/ci_build_test - shell: zsh -efuo pipefail {0} - ubuntu_jammy_cmake_installed: - name: ubuntu 22.04 jammy - runs-on: ubuntu-latest - container: ubuntu:jammy - steps: - - name: checkout - uses: actions/checkout@v4 - - name: setup - working-directory: drake_pip - run: .github/ubuntu_setup - shell: bash - - name: pip build and test - working-directory: drake_pip - run: .github/ci_build_test - shell: bash - \ No newline at end of file +name: ci +on: + push: + branches: + - main + pull_request: + branches: + - main + schedule: + - cron: '0 12 * * *' +concurrency: + # Cancel previous CI runs when additional commits are added to a pull request. + # This will not cancel CI runs associated with `schedule` or `push`. + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true +jobs: + macos_sonoma_arm_pip: + name: macos sonoma 14 arm + runs-on: macos-14 + steps: + - name: checkout + uses: actions/checkout@v4 + # See issue https://github.com/actions/setup-python/issues/577. There is + # some kind of environment conflict between the symlinks found in the + # GitHub Actions runner and `brew upgrade python` where `brew` detects and + # refuses to overwrite symlinks. The cause for our runs is not clear, + # we do not use that action, but if that issue is closed this section + # can be removed. + - name: sanitize GHA / brew python environment + run: | + # Remove the symlinks that cause issues. + find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete + sudo rm -rf /Library/Frameworks/Python.framework/ + - name: python setup + id: macos_python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: pip setup + working-directory: drake_pip + run: setup/install_prereqs + shell: zsh -efuo pipefail {0} + - name: pip build and test + working-directory: drake_pip + run: .github/ci_build_test + env: + PYTHON_VERSION: '3.12' + shell: zsh -efuo pipefail {0} + ubuntu_jammy_pip: + name: ubuntu 22.04 jammy + runs-on: ubuntu-latest + container: ubuntu:jammy + steps: + - name: checkout + uses: actions/checkout@v4 + - name: pip setup + working-directory: drake_pip + run: .github/ubuntu_setup + shell: bash + - name: pip build and test + working-directory: drake_pip + run: .github/ci_build_test + env: + PYTHON_VERSION: '3.10' + shell: bash \ No newline at end of file diff --git a/drake_pip/README.md b/drake_pip/README.md index 5df62ade..26cc0472 100644 --- a/drake_pip/README.md +++ b/drake_pip/README.md @@ -4,10 +4,16 @@ This installs Drake using [`pip`](https://pypi.org/project/pip/), the Pyton pack ## Instructions -First, create a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment), name it `env`, and activate it: +First, install the required packages: ``` -python3 -m venv env +sudo setup/install_prereqs +``` + +Create a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) named `env` and activate it: + +``` +python -m venv env source env/bin/activate ``` @@ -20,7 +26,7 @@ pip install drake Call the following to ensure `pydrake` can be imported: ``` -python3 -c 'import pydrake.all; print(pydrake.__file__)' +python -c 'import pydrake.all; print(pydrake.__file__)' ``` That's all that is needed to use Drake from Python. See [Installation via Pip](https://drake.mit.edu/pip.html#stable-releases) for more information on installation. For more information on what's available for Drake in Python, see [Using Drake from Python](https://drake.mit.edu/python_bindings.html) and the Python API [pydrake](https://drake.mit.edu/pydrake/index.html). @@ -31,5 +37,5 @@ To run the particle example tests in this directory, navigate to `src` and call ``` cd src -python3 particle_test.py +python particle_test.py ``` \ No newline at end of file diff --git a/drake_pip/setup/install_prereqs b/drake_pip/setup/install_prereqs new file mode 100755 index 00000000..c1d51298 --- /dev/null +++ b/drake_pip/setup/install_prereqs @@ -0,0 +1,93 @@ +#!/bin/bash + +# Copyright (c) 2020, Massachusetts Institute of Technology. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +set -euxo pipefail + +case "$OSTYPE" in + darwin*) + # Mac specific installations + if [[ "${EUID}" -eq 0 ]]; then + echo 'This script must NOT be run as root' >&2 + exit 1 + fi + + if [[ ! -d /opt/drake ]]; then + sudo mkdir -p /opt/drake + sudo chmod g+rwx /opt/drake + sudo chown "${USER}" /opt/drake + sudo chgrp admin /opt/drake + fi + + # Install Drake dependencies. + curl -o drake.tar.gz https://drake-packages.csail.mit.edu/drake/nightly/drake-latest-mac-arm64.tar.gz + trap 'rm -f drake.tar.gz' EXIT + tar -xf drake.tar.gz -C /opt + ;; + + linux*) + # Ubuntu specific installations + if [[ "${EUID:-}" -ne 0 ]]; then + echo 'This script must be run as root' >&2 + exit 2 + fi + + apt-get update + apt-get install --no-install-recommends lsb-release + + if [[ "$(lsb_release -sc)" != 'jammy' ]]; then + echo 'This script requires Ubuntu 22.04 (Jammy)' >&2 + exit 3 + fi + + apt-get install --no-install-recommends $(cat < /etc/apt/apt.conf.d/90-get-assume-yes export DEBIAN_FRONTEND='noninteractive' -sudo apt-get install --no-install-recommends $(cat <&2 + exit 1 + fi + + if [[ ! -d /opt/drake ]]; then + sudo mkdir -p /opt/drake + sudo chmod g+rwx /opt/drake + sudo chown "${USER}" /opt/drake + sudo chgrp admin /opt/drake + fi + + # Install Drake dependencies. + curl -o drake.tar.gz https://drake-packages.csail.mit.edu/drake/nightly/drake-latest-mac-arm64.tar.gz + trap 'rm -f drake.tar.gz' EXIT + tar -xf drake.tar.gz -C /opt + + brew install pipx + + ;; + + linux*) + # Ubuntu specific installations + if [[ "${EUID:-}" -ne 0 ]]; then + echo 'This script must be run as root' >&2 + exit 2 + fi + + apt-get update + apt-get install --no-install-recommends lsb-release + + if [[ "$(lsb_release -sc)" != 'jammy' ]]; then + echo 'This script requires Ubuntu 22.04 (Jammy)' >&2 + exit 3 + fi + + apt-get install --no-install-recommends $(cat < Date: Mon, 20 Jan 2025 15:34:29 -0500 Subject: [PATCH 06/19] polish READMEs after updates to CI --- drake_pip/README.md | 16 +++++++++++----- drake_poetry/README.md | 31 +++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/drake_pip/README.md b/drake_pip/README.md index 26cc0472..4b801f49 100644 --- a/drake_pip/README.md +++ b/drake_pip/README.md @@ -1,22 +1,28 @@ # Python Project with Drake Installed from pip -This installs Drake using [`pip`](https://pypi.org/project/pip/), the Pyton package manager. +This installs Drake using [`pip`](https://pypi.org/project/pip/), the Python package manager. ## Instructions First, install the required packages: ``` -sudo setup/install_prereqs +setup/install_prereqs ``` Create a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) named `env` and activate it: ``` -python -m venv env +python3 -m venv env source env/bin/activate ``` +*Note:* Depending on the system and which version of Python is installed, +it may be beneficial (or necessary) to instantiate the virtual environment +with a specific command. For example, call `python3.10` on Ubuntu 22.04. +Refer to [Source Installation](https://drake.mit.edu/from_source.html) +for the version of Python currently supported by Drake on each operating system. + Then install Drake for Python in the virtual environment: ``` @@ -26,7 +32,7 @@ pip install drake Call the following to ensure `pydrake` can be imported: ``` -python -c 'import pydrake.all; print(pydrake.__file__)' +python3 -c 'import pydrake.all; print(pydrake.__file__)' ``` That's all that is needed to use Drake from Python. See [Installation via Pip](https://drake.mit.edu/pip.html#stable-releases) for more information on installation. For more information on what's available for Drake in Python, see [Using Drake from Python](https://drake.mit.edu/python_bindings.html) and the Python API [pydrake](https://drake.mit.edu/pydrake/index.html). @@ -37,5 +43,5 @@ To run the particle example tests in this directory, navigate to `src` and call ``` cd src -python particle_test.py +python3 particle_test.py ``` \ No newline at end of file diff --git a/drake_poetry/README.md b/drake_poetry/README.md index 0a9f1390..8bbeaf08 100644 --- a/drake_poetry/README.md +++ b/drake_poetry/README.md @@ -1,6 +1,6 @@ # Python Project with Drake Installed from pip -This installs Drake using [`poetry`](https://python-poetry.org/), the Pyton package manager. +This installs Drake using [`poetry`](https://python-poetry.org/), the Python package manager. For an introduction to `poetry`, see [Basic usage](https://python-poetry.org/docs/basic-usage/). @@ -9,29 +9,44 @@ For an introduction to `poetry`, see [Basic usage](https://python-poetry.org/doc First, install the required packages: ``` -sudo setup/install_prereqs +setup/install_prereqs ``` Additionally, install `poetry` following the [Installation Instructions](https://python-poetry.org/docs/#installation). -Create a new `poetry` project in the current directory, optionally including `-n` to ignore the interactive setup: +Call `poetry init` to create project in the current directory, including the following arguments: + +* `--python [version]` to introduce a requirement on the version(s) +of Python that will be supported by this `poetry` project. +Refer to [Source Installation](https://drake.mit.edu/from_source.html) +for the version of Python currently supported by Drake +on each operating system. Refer to +[Version Constraints](https://python-poetry.org/docs/dependency-specification/#version-constraints) +for guidelines on how to specify Python version requirements in `poetry`. +* (Optional) `-n` to ignore the interactive setup + +For example, to setup an environment on Ubuntu 22.04, call: ``` -poetry init [-n] +poetry init -n --python ~3.10 ``` -The `pyproject.toml` file that's created contains the project and dependency information. Refer to [Source Installation](https://drake.mit.edu/from_source.html) for the version of Python currently supported by Drake, which can be specified using: +The `pyproject.toml` file that's created contains the project and dependency information. + +From there, ensure `poetry` is using the correct version of Python, as directed above: ``` -requires-python = "3.10" +poetry env use [3.10/3.12] ``` -Drake will be added under `dependencies`, which can be done automatically using: +Drake can be installed using: ``` poetry add drake ``` +After a successfull installation, Drake should be seen under `dependencies` in the `pyproject.toml` file. + To activate the virtual environment installed by `poetry`, use: ``` @@ -44,5 +59,5 @@ To run the particle example tests in this directory, navigate to `src` and call ``` cd src -python particle_test.py +python3 particle_test.py ``` \ No newline at end of file From d5f2c752caeccba783f93d0e37e4ade543a8194b Mon Sep 17 00:00:00 2001 From: tyler-yankee Date: Mon, 20 Jan 2025 15:34:40 -0500 Subject: [PATCH 07/19] add maybe_sudo logic to install_prereqs scripts --- drake_pip/setup/install_prereqs | 23 ++++++++++++++--------- drake_poetry/setup/install_prereqs | 21 +++++++++++++-------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/drake_pip/setup/install_prereqs b/drake_pip/setup/install_prereqs index c1d51298..d15bfe7a 100755 --- a/drake_pip/setup/install_prereqs +++ b/drake_pip/setup/install_prereqs @@ -31,6 +31,11 @@ set -euxo pipefail +maybe_sudo= +if [[ "${EUID}" -ne 0 ]]; then + maybe_sudo=sudo +fi + case "$OSTYPE" in darwin*) # Mac specific installations @@ -40,10 +45,10 @@ case "$OSTYPE" in fi if [[ ! -d /opt/drake ]]; then - sudo mkdir -p /opt/drake - sudo chmod g+rwx /opt/drake - sudo chown "${USER}" /opt/drake - sudo chgrp admin /opt/drake + ${maybe_sudo} mkdir -p /opt/drake + ${maybe_sudo} chmod g+rwx /opt/drake + ${maybe_sudo} chown "${USER}" /opt/drake + ${maybe_sudo} chgrp admin /opt/drake fi # Install Drake dependencies. @@ -59,15 +64,15 @@ case "$OSTYPE" in exit 2 fi - apt-get update - apt-get install --no-install-recommends lsb-release + ${maybe_sudo} apt-get update + ${maybe_sudo} apt-get install --no-install-recommends lsb-release if [[ "$(lsb_release -sc)" != 'jammy' ]]; then echo 'This script requires Ubuntu 22.04 (Jammy)' >&2 exit 3 fi - apt-get install --no-install-recommends $(cat <&2 @@ -81,8 +86,8 @@ EOF trap 'rm -f drake.tar.gz' EXIT tar -xf drake.tar.gz -C /opt - apt-get update - apt-get install --no-install-recommends $(cat < Date: Tue, 21 Jan 2025 08:32:28 -0500 Subject: [PATCH 08/19] update scripts and documentation to install system package dependencies without downloading Drake locally --- .github/workflows/pip.yml | 4 -- .github/workflows/poetry.yml | 2 +- drake_pip/.github/workflows/ci.yml | 4 -- drake_pip/README.md | 4 +- drake_pip/setup/install_prereqs | 86 +++++++++------------------ drake_poetry/.github/macos_setup | 9 --- drake_poetry/.github/ubuntu_setup | 5 +- drake_poetry/.github/workflows/ci.yml | 2 +- drake_poetry/README.md | 8 +-- drake_poetry/setup/install_prereqs | 80 ++++++++++--------------- 10 files changed, 69 insertions(+), 135 deletions(-) delete mode 100755 drake_poetry/.github/macos_setup diff --git a/.github/workflows/pip.yml b/.github/workflows/pip.yml index 51dcea26..2eee9bea 100644 --- a/.github/workflows/pip.yml +++ b/.github/workflows/pip.yml @@ -28,10 +28,6 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.12' - - name: pip setup - working-directory: drake_pip - run: setup/install_prereqs - shell: zsh -efuo pipefail {0} - name: pip build and test working-directory: drake_pip run: .github/ci_build_test diff --git a/.github/workflows/poetry.yml b/.github/workflows/poetry.yml index 98a4deee..c0595c4e 100644 --- a/.github/workflows/poetry.yml +++ b/.github/workflows/poetry.yml @@ -30,7 +30,7 @@ jobs: python-version: '3.12' - name: poetry setup working-directory: drake_poetry - run: .github/macos_setup + run: setup/install_prereqs shell: zsh -efuo pipefail {0} - name: poetry build and test working-directory: drake_poetry diff --git a/drake_pip/.github/workflows/ci.yml b/drake_pip/.github/workflows/ci.yml index c9958f59..f1498777 100644 --- a/drake_pip/.github/workflows/ci.yml +++ b/drake_pip/.github/workflows/ci.yml @@ -39,10 +39,6 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.12' - - name: pip setup - working-directory: drake_pip - run: setup/install_prereqs - shell: zsh -efuo pipefail {0} - name: pip build and test working-directory: drake_pip run: .github/ci_build_test diff --git a/drake_pip/README.md b/drake_pip/README.md index 4b801f49..809bb1c5 100644 --- a/drake_pip/README.md +++ b/drake_pip/README.md @@ -1,10 +1,10 @@ -# Python Project with Drake Installed from pip +# Python Project with Drake Installed from Pip This installs Drake using [`pip`](https://pypi.org/project/pip/), the Python package manager. ## Instructions -First, install the required packages: +First, install the required Ubuntu packages (this step is not needed on Mac): ``` setup/install_prereqs diff --git a/drake_pip/setup/install_prereqs b/drake_pip/setup/install_prereqs index d15bfe7a..d691900a 100755 --- a/drake_pip/setup/install_prereqs +++ b/drake_pip/setup/install_prereqs @@ -36,63 +36,35 @@ if [[ "${EUID}" -ne 0 ]]; then maybe_sudo=sudo fi -case "$OSTYPE" in - darwin*) - # Mac specific installations - if [[ "${EUID}" -eq 0 ]]; then - echo 'This script must NOT be run as root' >&2 - exit 1 - fi +# Ubuntu-specific installations +${maybe_sudo} apt-get update +${maybe_sudo} apt-get install --no-install-recommends lsb-release - if [[ ! -d /opt/drake ]]; then - ${maybe_sudo} mkdir -p /opt/drake - ${maybe_sudo} chmod g+rwx /opt/drake - ${maybe_sudo} chown "${USER}" /opt/drake - ${maybe_sudo} chgrp admin /opt/drake - fi - - # Install Drake dependencies. - curl -o drake.tar.gz https://drake-packages.csail.mit.edu/drake/nightly/drake-latest-mac-arm64.tar.gz - trap 'rm -f drake.tar.gz' EXIT - tar -xf drake.tar.gz -C /opt - ;; - - linux*) - # Ubuntu specific installations - if [[ "${EUID:-}" -ne 0 ]]; then - echo 'This script must be run as root' >&2 - exit 2 - fi - - ${maybe_sudo} apt-get update - ${maybe_sudo} apt-get install --no-install-recommends lsb-release - - if [[ "$(lsb_release -sc)" != 'jammy' ]]; then - echo 'This script requires Ubuntu 22.04 (Jammy)' >&2 - exit 3 - fi - - ${maybe_sudo} apt-get install --no-install-recommends $(cat <&2 + exit 3 +fi diff --git a/drake_poetry/.github/macos_setup b/drake_poetry/.github/macos_setup deleted file mode 100755 index d003d402..00000000 --- a/drake_poetry/.github/macos_setup +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -# SPDX-License-Identifier: MIT-0 - -set -euxo pipefail - -setup/install_prereqs - -pipx install poetry -pipx ensurepath \ No newline at end of file diff --git a/drake_poetry/.github/ubuntu_setup b/drake_poetry/.github/ubuntu_setup index 3921f049..97861d9b 100755 --- a/drake_poetry/.github/ubuntu_setup +++ b/drake_poetry/.github/ubuntu_setup @@ -8,7 +8,4 @@ echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/90-get-assume-yes export DEBIAN_FRONTEND='noninteractive' -setup/install_prereqs - -pipx install poetry -pipx ensurepath \ No newline at end of file +setup/install_prereqs \ No newline at end of file diff --git a/drake_poetry/.github/workflows/ci.yml b/drake_poetry/.github/workflows/ci.yml index f92e8f4c..57d2a48b 100644 --- a/drake_poetry/.github/workflows/ci.yml +++ b/drake_poetry/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: python-version: '3.12' - name: poetry setup working-directory: drake_poetry - run: .github/macos_setup + run: setup/install_prereqs shell: zsh -efuo pipefail {0} - name: poetry build and test working-directory: drake_poetry diff --git a/drake_poetry/README.md b/drake_poetry/README.md index 8bbeaf08..deef3395 100644 --- a/drake_poetry/README.md +++ b/drake_poetry/README.md @@ -1,4 +1,4 @@ -# Python Project with Drake Installed from pip +# Python Project with Drake Installed from Poetry This installs Drake using [`poetry`](https://python-poetry.org/), the Python package manager. @@ -6,14 +6,14 @@ For an introduction to `poetry`, see [Basic usage](https://python-poetry.org/doc ## Instructions -First, install the required packages: +First, install the required packages. This includes an installation of Poetry using `pipx`; +see the [Installation Instructions](https://python-poetry.org/docs/#installation) for +more information. ``` setup/install_prereqs ``` -Additionally, install `poetry` following the [Installation Instructions](https://python-poetry.org/docs/#installation). - Call `poetry init` to create project in the current directory, including the following arguments: * `--python [version]` to introduce a requirement on the version(s) diff --git a/drake_poetry/setup/install_prereqs b/drake_poetry/setup/install_prereqs index faffaf2f..d23ad3c7 100755 --- a/drake_poetry/setup/install_prereqs +++ b/drake_poetry/setup/install_prereqs @@ -38,64 +38,46 @@ fi case "$OSTYPE" in darwin*) - # Mac specific installations - if [[ "${EUID}" -eq 0 ]]; then - echo 'This script must NOT be run as root' >&2 - exit 1 - fi - - if [[ ! -d /opt/drake ]]; then - ${maybe_sudo} mkdir -p /opt/drake - ${maybe_sudo} chmod g+rwx /opt/drake - ${maybe_sudo} chown "${USER}" /opt/drake - ${maybe_sudo} chgrp admin /opt/drake - fi - - # Install Drake dependencies. - curl -o drake.tar.gz https://drake-packages.csail.mit.edu/drake/nightly/drake-latest-mac-arm64.tar.gz - trap 'rm -f drake.tar.gz' EXIT - tar -xf drake.tar.gz -C /opt - + # Mac-specific installations brew install pipx - ;; linux*) - # Ubuntu specific installations - if [[ "${EUID:-}" -ne 0 ]]; then - echo 'This script must be run as root' >&2 - exit 2 - fi - + # Ubuntu-specific installations ${maybe_sudo} apt-get update ${maybe_sudo} apt-get install --no-install-recommends lsb-release - if [[ "$(lsb_release -sc)" != 'jammy' ]]; then - echo 'This script requires Ubuntu 22.04 (Jammy)' >&2 - exit 3 - fi - - apt-get install --no-install-recommends $(cat <&2 + exit 3 + fi ;; esac -# Show version for debugging; use echo for newline / readability. -echo -e "\ndrake VERSION.TXT: $(cat /opt/drake/share/doc/drake/VERSION.TXT)\n" - -/opt/drake/share/drake/setup/install_prereqs \ No newline at end of file +# Install poetry and put it on PATH +pipx install poetry +pipx ensurepath \ No newline at end of file From 0230ee1940da39425b84d4f85edde0cf4d0d106b Mon Sep 17 00:00:00 2001 From: tyler-yankee Date: Tue, 21 Jan 2025 10:42:37 -0500 Subject: [PATCH 09/19] [review] whitespaces/newlines, file_sync, Ubuntu packages --- .github/workflows/pip.yml | 2 +- .github/workflows/poetry.yml | 2 +- drake_pip/.github/ubuntu_setup | 2 +- drake_pip/.github/workflows/ci.yml | 2 +- drake_pip/README.md | 24 ++++++++++------ drake_pip/setup/install_prereqs | 39 +++++++++---------------- drake_poetry/.github/ubuntu_setup | 2 +- drake_poetry/.github/workflows/ci.yml | 2 +- drake_poetry/setup/install_prereqs | 41 +++++++++------------------ private/test/file_sync_test.py | 6 ++-- 10 files changed, 53 insertions(+), 69 deletions(-) diff --git a/.github/workflows/pip.yml b/.github/workflows/pip.yml index 2eee9bea..a4db33a8 100644 --- a/.github/workflows/pip.yml +++ b/.github/workflows/pip.yml @@ -50,4 +50,4 @@ jobs: run: .github/ci_build_test env: PYTHON_VERSION: '3.10' - shell: bash \ No newline at end of file + shell: bash diff --git a/.github/workflows/poetry.yml b/.github/workflows/poetry.yml index c0595c4e..16e2e376 100644 --- a/.github/workflows/poetry.yml +++ b/.github/workflows/poetry.yml @@ -55,4 +55,4 @@ jobs: .github/ci_build_test env: PYTHON_VERSION: '3.10' - shell: bash \ No newline at end of file + shell: bash diff --git a/drake_pip/.github/ubuntu_setup b/drake_pip/.github/ubuntu_setup index 97861d9b..60cd4f84 100755 --- a/drake_pip/.github/ubuntu_setup +++ b/drake_pip/.github/ubuntu_setup @@ -8,4 +8,4 @@ echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/90-get-assume-yes export DEBIAN_FRONTEND='noninteractive' -setup/install_prereqs \ No newline at end of file +setup/install_prereqs diff --git a/drake_pip/.github/workflows/ci.yml b/drake_pip/.github/workflows/ci.yml index f1498777..902ff2d3 100644 --- a/drake_pip/.github/workflows/ci.yml +++ b/drake_pip/.github/workflows/ci.yml @@ -61,4 +61,4 @@ jobs: run: .github/ci_build_test env: PYTHON_VERSION: '3.10' - shell: bash \ No newline at end of file + shell: bash diff --git a/drake_pip/README.md b/drake_pip/README.md index 809bb1c5..bef94297 100644 --- a/drake_pip/README.md +++ b/drake_pip/README.md @@ -1,6 +1,7 @@ # Python Project with Drake Installed from Pip -This installs Drake using [`pip`](https://pypi.org/project/pip/), the Python package manager. +This installs Drake using [`pip`](https://pypi.org/project/pip/), +the Python package manager. ## Instructions @@ -10,18 +11,20 @@ First, install the required Ubuntu packages (this step is not needed on Mac): setup/install_prereqs ``` -Create a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) named `env` and activate it: +Create a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) +named `env` and activate it: ``` python3 -m venv env source env/bin/activate ``` -*Note:* Depending on the system and which version of Python is installed, -it may be beneficial (or necessary) to instantiate the virtual environment -with a specific command. For example, call `python3.10` on Ubuntu 22.04. -Refer to [Source Installation](https://drake.mit.edu/from_source.html) -for the version of Python currently supported by Drake on each operating system. +*Note:* Depending on the system and which version of Python is installed, +it may be beneficial (or necessary) to instantiate the virtual environment +with a specific command. For example, call `python3.10` on Ubuntu 22.04. +Refer to [Source Installation](https://drake.mit.edu/from_source.html) +for the version of Python currently supported by Drake on each +operating system. Then install Drake for Python in the virtual environment: @@ -35,7 +38,12 @@ Call the following to ensure `pydrake` can be imported: python3 -c 'import pydrake.all; print(pydrake.__file__)' ``` -That's all that is needed to use Drake from Python. See [Installation via Pip](https://drake.mit.edu/pip.html#stable-releases) for more information on installation. For more information on what's available for Drake in Python, see [Using Drake from Python](https://drake.mit.edu/python_bindings.html) and the Python API [pydrake](https://drake.mit.edu/pydrake/index.html). +That's all that is needed to use Drake from Python. +See [Installation via Pip](https://drake.mit.edu/pip.html#stable-releases) +for more information on installation. +For more information on what's available for Drake in Python, +see [Using Drake from Python](https://drake.mit.edu/python_bindings.html) +and the Python API [pydrake](https://drake.mit.edu/pydrake/index.html). ## Examples diff --git a/drake_pip/setup/install_prereqs b/drake_pip/setup/install_prereqs index d691900a..db0455d6 100755 --- a/drake_pip/setup/install_prereqs +++ b/drake_pip/setup/install_prereqs @@ -40,31 +40,18 @@ fi ${maybe_sudo} apt-get update ${maybe_sudo} apt-get install --no-install-recommends lsb-release -# Jammy and Noble have slightly different package versions needed -# (libglib2.0-0 vs. libglib2.0-0t64) -if [[ "$(lsb_release -sc)" == 'jammy' ]]; then - ${maybe_sudo} apt-get update - ${maybe_sudo} apt-get install --no-install-recommends $(cat <&2 +if [[ "$(lsb_release -sc)" != 'jammy' ]]; then + echo 'This script requires Ubuntu 22.04 (Jammy)' >&2 exit 3 fi + +${maybe_sudo} apt-get update +${maybe_sudo} apt-get install --no-install-recommends $(cat < /etc/apt/apt.conf.d/90-get-assume-yes export DEBIAN_FRONTEND='noninteractive' -setup/install_prereqs \ No newline at end of file +setup/install_prereqs diff --git a/drake_poetry/.github/workflows/ci.yml b/drake_poetry/.github/workflows/ci.yml index 57d2a48b..efece628 100644 --- a/drake_poetry/.github/workflows/ci.yml +++ b/drake_poetry/.github/workflows/ci.yml @@ -66,4 +66,4 @@ jobs: .github/ci_build_test env: PYTHON_VERSION: '3.10' - shell: bash \ No newline at end of file + shell: bash diff --git a/drake_poetry/setup/install_prereqs b/drake_poetry/setup/install_prereqs index d23ad3c7..39c7ff5d 100755 --- a/drake_poetry/setup/install_prereqs +++ b/drake_poetry/setup/install_prereqs @@ -47,37 +47,24 @@ case "$OSTYPE" in ${maybe_sudo} apt-get update ${maybe_sudo} apt-get install --no-install-recommends lsb-release - # Jammy and Noble have slightly different package versions needed - # (libglib2.0-0 vs. libglib2.0-0t64) - if [[ "$(lsb_release -sc)" == 'jammy' ]]; then - ${maybe_sudo} apt-get update - ${maybe_sudo} apt-get install --no-install-recommends $(cat <&2 + if [[ "$(lsb_release -sc)" != 'jammy' ]]; then + echo 'This script requires Ubuntu 22.04 (Jammy)' >&2 exit 3 fi + + ${maybe_sudo} apt-get update + ${maybe_sudo} apt-get install --no-install-recommends $(cat < Date: Tue, 21 Jan 2025 15:18:40 -0500 Subject: [PATCH 10/19] [review] formatting updates, remove unnecessary apt update --- drake_pip/README.md | 2 +- drake_pip/setup/install_prereqs | 1 - drake_poetry/README.md | 14 +++++++------- drake_poetry/setup/install_prereqs | 1 - 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/drake_pip/README.md b/drake_pip/README.md index bef94297..3ac2d515 100644 --- a/drake_pip/README.md +++ b/drake_pip/README.md @@ -52,4 +52,4 @@ To run the particle example tests in this directory, navigate to `src` and call ``` cd src python3 particle_test.py -``` \ No newline at end of file +``` diff --git a/drake_pip/setup/install_prereqs b/drake_pip/setup/install_prereqs index db0455d6..47a24aa6 100755 --- a/drake_pip/setup/install_prereqs +++ b/drake_pip/setup/install_prereqs @@ -45,7 +45,6 @@ if [[ "$(lsb_release -sc)" != 'jammy' ]]; then exit 3 fi -${maybe_sudo} apt-get update ${maybe_sudo} apt-get install --no-install-recommends $(cat < Date: Wed, 22 Jan 2025 09:06:30 -0500 Subject: [PATCH 11/19] remove cpplint and clang-format files from Python examples --- drake_pip/.clang-format | 22 ---------------------- drake_pip/CPPLINT.cfg | 7 ------- drake_poetry/.clang-format | 22 ---------------------- drake_poetry/CPPLINT.cfg | 7 ------- private/test/file_sync_test.py | 6 +----- 5 files changed, 1 insertion(+), 63 deletions(-) delete mode 100644 drake_pip/.clang-format delete mode 100644 drake_pip/CPPLINT.cfg delete mode 100644 drake_poetry/.clang-format delete mode 100644 drake_poetry/CPPLINT.cfg diff --git a/drake_pip/.clang-format b/drake_pip/.clang-format deleted file mode 100644 index 57a1cc0b..00000000 --- a/drake_pip/.clang-format +++ /dev/null @@ -1,22 +0,0 @@ -# -*- mode: yaml -*- -# vi: set ft=yaml : -# SPDX-License-Identifier: MIT-0 - ---- -BasedOnStyle: Google ---- -Language: Cpp -DerivePointerAlignment: false -PointerAlignment: Left - -IncludeCategories: - - Regex: '^[<"](aio|arpa/inet|assert|complex|cpio|ctype|curses|dirent|dlfcn|errno|fcntl|fenv|float|fmtmsg|fnmatch|ftw|glob|grp|iconv|inttypes|iso646|langinfo|libgen|limits|locale|math|monetary|mqueue|ndbm|netdb|net/if|netinet/in|netinet/tcp|nl_types|poll|pthread|pwd|regex|sched|search|semaphore|setjmp|signal|spawn|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|strings|stropts|sys/ipc|syslog|sys/mman|sys/msg|sys/resource|sys/select|sys/sem|sys/shm|sys/socket|sys/stat|sys/statvfs|sys/time|sys/times|sys/types|sys/uio|sys/un|sys/utsname|sys/wait|tar|term|termios|tgmath|threads|time|trace|uchar|ulimit|uncntrl|unistd|utime|utmpx|wchar|wctype|wordexp)\.h[">]$' - Priority: 10 - - Regex: '^[<"](algorithm|array|atomic|bitset|cassert|ccomplex|cctype|cerrno|cfenv|cfloat|chrono|cinttypes|ciso646|climits|clocale|cmath|codecvt|complex|condition_variable|csetjmp|csignal|cstdalign|cstdarg|cstdbool|cstddef|cstdint|cstdio|cstdlib|cstring|ctgmath|ctime|cuchar|cwchar|cwctype|deque|exception|forward_list|fstream|functional|future|initializer_list|iomanip|ios|iosfwd|iostream|istream|iterator|limits|list|locale|map|memory|mutex|new|numeric|ostream|queue|random|ratio|regex|scoped_allocator|set|shared_mutex|sstream|stack|stdexcept|streambuf|string|strstream|system_error|thread|tuple|type_traits|typeindex|typeinfo|unordered_map|unordered_set|utility|valarray|vector)[">]$' - Priority: 20 - - Regex: '^<' - Priority: 30 - - Regex: '^"(drake|drake_external_examples)' - Priority: 50 - - Regex: '^"' - Priority: 40 diff --git a/drake_pip/CPPLINT.cfg b/drake_pip/CPPLINT.cfg deleted file mode 100644 index a5dd11fb..00000000 --- a/drake_pip/CPPLINT.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: MIT-0 - -set noparent - -filter=-build/c++11 -filter=-build/header_guard -filter=-build/include_subdir diff --git a/drake_poetry/.clang-format b/drake_poetry/.clang-format deleted file mode 100644 index 57a1cc0b..00000000 --- a/drake_poetry/.clang-format +++ /dev/null @@ -1,22 +0,0 @@ -# -*- mode: yaml -*- -# vi: set ft=yaml : -# SPDX-License-Identifier: MIT-0 - ---- -BasedOnStyle: Google ---- -Language: Cpp -DerivePointerAlignment: false -PointerAlignment: Left - -IncludeCategories: - - Regex: '^[<"](aio|arpa/inet|assert|complex|cpio|ctype|curses|dirent|dlfcn|errno|fcntl|fenv|float|fmtmsg|fnmatch|ftw|glob|grp|iconv|inttypes|iso646|langinfo|libgen|limits|locale|math|monetary|mqueue|ndbm|netdb|net/if|netinet/in|netinet/tcp|nl_types|poll|pthread|pwd|regex|sched|search|semaphore|setjmp|signal|spawn|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|strings|stropts|sys/ipc|syslog|sys/mman|sys/msg|sys/resource|sys/select|sys/sem|sys/shm|sys/socket|sys/stat|sys/statvfs|sys/time|sys/times|sys/types|sys/uio|sys/un|sys/utsname|sys/wait|tar|term|termios|tgmath|threads|time|trace|uchar|ulimit|uncntrl|unistd|utime|utmpx|wchar|wctype|wordexp)\.h[">]$' - Priority: 10 - - Regex: '^[<"](algorithm|array|atomic|bitset|cassert|ccomplex|cctype|cerrno|cfenv|cfloat|chrono|cinttypes|ciso646|climits|clocale|cmath|codecvt|complex|condition_variable|csetjmp|csignal|cstdalign|cstdarg|cstdbool|cstddef|cstdint|cstdio|cstdlib|cstring|ctgmath|ctime|cuchar|cwchar|cwctype|deque|exception|forward_list|fstream|functional|future|initializer_list|iomanip|ios|iosfwd|iostream|istream|iterator|limits|list|locale|map|memory|mutex|new|numeric|ostream|queue|random|ratio|regex|scoped_allocator|set|shared_mutex|sstream|stack|stdexcept|streambuf|string|strstream|system_error|thread|tuple|type_traits|typeindex|typeinfo|unordered_map|unordered_set|utility|valarray|vector)[">]$' - Priority: 20 - - Regex: '^<' - Priority: 30 - - Regex: '^"(drake|drake_external_examples)' - Priority: 50 - - Regex: '^"' - Priority: 40 diff --git a/drake_poetry/CPPLINT.cfg b/drake_poetry/CPPLINT.cfg deleted file mode 100644 index a5dd11fb..00000000 --- a/drake_poetry/CPPLINT.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: MIT-0 - -set noparent - -filter=-build/c++11 -filter=-build/header_guard -filter=-build/include_subdir diff --git a/private/test/file_sync_test.py b/private/test/file_sync_test.py index a1065389..ee4eaee3 100755 --- a/private/test/file_sync_test.py +++ b/private/test/file_sync_test.py @@ -18,8 +18,6 @@ "drake_cmake_external/.clang-format", "drake_cmake_installed/.clang-format", "drake_cmake_installed_apt/.clang-format", - "drake_pip/.clang-format", - "drake_poetry/.clang-format", ), ( "drake_bazel_download/.github/ubuntu_setup", @@ -33,8 +31,6 @@ "drake_cmake_external/CPPLINT.cfg", "drake_cmake_installed/CPPLINT.cfg", "drake_cmake_installed_apt/CPPLINT.cfg", - "drake_pip/CPPLINT.cfg", - "drake_poetry/CPPLINT.cfg", ), ( "LICENSE", @@ -168,7 +164,7 @@ def check(index: int, paths: tuple[str]): def gha_workflow_check(workflow_name: str): - """Enforces the subdir_ci to have the contents of root_ci up until + """Enforces the subdir_ci to have the contents of root_ci up until it reaches the jobs: line plus the content in the subdir_ workflow after jobs: is mentioned. """ From d27eac34c346c0f921b64b605de649a54a94d58e Mon Sep 17 00:00:00 2001 From: tyler-yankee Date: Wed, 22 Jan 2025 09:11:03 -0500 Subject: [PATCH 12/19] update all LICENSE files to 2025 --- LICENSE | 2 +- drake_bazel_download/LICENSE | 2 +- drake_bazel_external/LICENSE | 2 +- drake_bazel_external_legacy/LICENSE | 2 +- drake_cmake_external/LICENSE | 2 +- drake_cmake_installed/LICENSE | 2 +- drake_cmake_installed_apt/LICENSE | 2 +- drake_pip/LICENSE | 2 +- drake_poetry/LICENSE | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/LICENSE b/LICENSE index cdacdc00..c0e4bddd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2023 by the drake-external-examples developers. +Copyright (c) 2017-2025 by the drake-external-examples developers. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/drake_bazel_download/LICENSE b/drake_bazel_download/LICENSE index cdacdc00..c0e4bddd 100644 --- a/drake_bazel_download/LICENSE +++ b/drake_bazel_download/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2023 by the drake-external-examples developers. +Copyright (c) 2017-2025 by the drake-external-examples developers. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/drake_bazel_external/LICENSE b/drake_bazel_external/LICENSE index cdacdc00..c0e4bddd 100644 --- a/drake_bazel_external/LICENSE +++ b/drake_bazel_external/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2023 by the drake-external-examples developers. +Copyright (c) 2017-2025 by the drake-external-examples developers. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/drake_bazel_external_legacy/LICENSE b/drake_bazel_external_legacy/LICENSE index cdacdc00..c0e4bddd 100644 --- a/drake_bazel_external_legacy/LICENSE +++ b/drake_bazel_external_legacy/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2023 by the drake-external-examples developers. +Copyright (c) 2017-2025 by the drake-external-examples developers. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/drake_cmake_external/LICENSE b/drake_cmake_external/LICENSE index cdacdc00..c0e4bddd 100644 --- a/drake_cmake_external/LICENSE +++ b/drake_cmake_external/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2023 by the drake-external-examples developers. +Copyright (c) 2017-2025 by the drake-external-examples developers. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/drake_cmake_installed/LICENSE b/drake_cmake_installed/LICENSE index cdacdc00..c0e4bddd 100644 --- a/drake_cmake_installed/LICENSE +++ b/drake_cmake_installed/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2023 by the drake-external-examples developers. +Copyright (c) 2017-2025 by the drake-external-examples developers. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/drake_cmake_installed_apt/LICENSE b/drake_cmake_installed_apt/LICENSE index cdacdc00..c0e4bddd 100644 --- a/drake_cmake_installed_apt/LICENSE +++ b/drake_cmake_installed_apt/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2023 by the drake-external-examples developers. +Copyright (c) 2017-2025 by the drake-external-examples developers. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/drake_pip/LICENSE b/drake_pip/LICENSE index cdacdc00..c0e4bddd 100644 --- a/drake_pip/LICENSE +++ b/drake_pip/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2023 by the drake-external-examples developers. +Copyright (c) 2017-2025 by the drake-external-examples developers. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/drake_poetry/LICENSE b/drake_poetry/LICENSE index cdacdc00..c0e4bddd 100644 --- a/drake_poetry/LICENSE +++ b/drake_poetry/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2023 by the drake-external-examples developers. +Copyright (c) 2017-2025 by the drake-external-examples developers. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From fb00a52424285d676c5df2c551ee616432f292c3 Mon Sep 17 00:00:00 2001 From: tyler-yankee Date: Wed, 22 Jan 2025 09:43:10 -0500 Subject: [PATCH 13/19] formatting, Python version and packages on Ubuntu, consistent README and ci_build_test for dirs --- .github/workflows/pip.yml | 2 +- .github/workflows/poetry.yml | 2 +- README.md | 2 +- drake_pip/.github/ci_build_test | 8 +++-- drake_pip/.github/workflows/ci.yml | 2 +- drake_pip/README.md | 16 +++++----- drake_pip/setup/install_prereqs | 43 ++++----------------------- drake_poetry/.github/ci_build_test | 6 ++-- drake_poetry/.github/workflows/ci.yml | 2 +- drake_poetry/README.md | 28 ++++++++++------- drake_poetry/setup/install_prereqs | 36 +++------------------- 11 files changed, 48 insertions(+), 99 deletions(-) diff --git a/.github/workflows/pip.yml b/.github/workflows/pip.yml index a4db33a8..ea07ba47 100644 --- a/.github/workflows/pip.yml +++ b/.github/workflows/pip.yml @@ -49,5 +49,5 @@ jobs: working-directory: drake_pip run: .github/ci_build_test env: - PYTHON_VERSION: '3.10' + PYTHON_VERSION: '3' shell: bash diff --git a/.github/workflows/poetry.yml b/.github/workflows/poetry.yml index 16e2e376..782f01d0 100644 --- a/.github/workflows/poetry.yml +++ b/.github/workflows/poetry.yml @@ -54,5 +54,5 @@ jobs: source $HOME/.profile # update PATH .github/ci_build_test env: - PYTHON_VERSION: '3.10' + PYTHON_VERSION: '3' shell: bash diff --git a/README.md b/README.md index 8c1a6bd1..8fb118b4 100644 --- a/README.md +++ b/README.md @@ -32,5 +32,5 @@ Scripts are provided for various CI instances in `scripts/continuous_integration Note, the GitHub Actions jobs only build and test `drake_bazel_download`, `drake_cmake_installed`, `drake_cmake_installed_apt`, `drake_pip`, and -`drake_poetry`, since these are the exemplary cases for lightweight, +`drake_poetry`, since these are the exemplary cases for lightweight, open-source builds on public CI servers. diff --git a/drake_pip/.github/ci_build_test b/drake_pip/.github/ci_build_test index 10eb35fc..9228a462 100755 --- a/drake_pip/.github/ci_build_test +++ b/drake_pip/.github/ci_build_test @@ -4,14 +4,16 @@ set -euxo pipefail "python$PYTHON_VERSION" --version -"python$PYTHON_VERSION" -m venv env +"python$PYTHON_VERSION" -m venv env source env/bin/activate pip install drake python3 -c 'import pydrake.all; print(pydrake.__file__)' -python3 src/particle_test.py +cd src +python3 particle_test.py +cd .. deactivate -rm -rf env src/__pycache__ \ No newline at end of file +rm -rf env src/__pycache__ diff --git a/drake_pip/.github/workflows/ci.yml b/drake_pip/.github/workflows/ci.yml index 902ff2d3..68ff49af 100644 --- a/drake_pip/.github/workflows/ci.yml +++ b/drake_pip/.github/workflows/ci.yml @@ -60,5 +60,5 @@ jobs: working-directory: drake_pip run: .github/ci_build_test env: - PYTHON_VERSION: '3.10' + PYTHON_VERSION: '3' shell: bash diff --git a/drake_pip/README.md b/drake_pip/README.md index 3ac2d515..7d49ff90 100644 --- a/drake_pip/README.md +++ b/drake_pip/README.md @@ -5,12 +5,16 @@ the Python package manager. ## Instructions -First, install the required Ubuntu packages (this step is not needed on Mac): +First, install the required Ubuntu packages: ``` setup/install_prereqs ``` +For Mac users, simply ensure the correct version of Python +is installed from Homebrew by referring to the +[Supported Configurations](https://drake.mit.edu/installation.html#supported-configurations). + Create a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) named `env` and activate it: @@ -19,13 +23,6 @@ python3 -m venv env source env/bin/activate ``` -*Note:* Depending on the system and which version of Python is installed, -it may be beneficial (or necessary) to instantiate the virtual environment -with a specific command. For example, call `python3.10` on Ubuntu 22.04. -Refer to [Source Installation](https://drake.mit.edu/from_source.html) -for the version of Python currently supported by Drake on each -operating system. - Then install Drake for Python in the virtual environment: ``` @@ -47,7 +44,8 @@ and the Python API [pydrake](https://drake.mit.edu/pydrake/index.html). ## Examples -To run the particle example tests in this directory, navigate to `src` and call the test file to execute the unit tests: +To run the particle example tests in this directory, +navigate to `src` and call the test file to execute the unit tests: ``` cd src diff --git a/drake_pip/setup/install_prereqs b/drake_pip/setup/install_prereqs index 47a24aa6..c85a2e8f 100755 --- a/drake_pip/setup/install_prereqs +++ b/drake_pip/setup/install_prereqs @@ -1,33 +1,5 @@ #!/bin/bash - -# Copyright (c) 2020, Massachusetts Institute of Technology. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# * Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. +# SPDX-License-Identifier: MIT-0 set -euxo pipefail @@ -40,17 +12,12 @@ fi ${maybe_sudo} apt-get update ${maybe_sudo} apt-get install --no-install-recommends lsb-release -if [[ "$(lsb_release -sc)" != 'jammy' ]]; then - echo 'This script requires Ubuntu 22.04 (Jammy)' >&2 - exit 3 -fi - ${maybe_sudo} apt-get install --no-install-recommends $(cat < Date: Wed, 22 Jan 2025 09:51:09 -0500 Subject: [PATCH 14/19] conditional Python versioning for poetry example --- drake_poetry/.github/ci_build_test | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drake_poetry/.github/ci_build_test b/drake_poetry/.github/ci_build_test index a09cd159..263cdc24 100755 --- a/drake_poetry/.github/ci_build_test +++ b/drake_poetry/.github/ci_build_test @@ -5,8 +5,14 @@ set -euxo pipefail poetry --version "python$PYTHON_VERSION" --version -poetry init -n --python "~$PYTHON_VERSION" -poetry env use $PYTHON_VERSION +# Set up the appropriate version of Python for Poetry +# if one other than the default is specified +if [[ "$PYTHON_VERSION" != "3" ]]; then + poetry init -n --python "~$PYTHON_VERSION" + poetry env use $PYTHON_VERSION +else + poetry init -n +fi poetry add drake eval $(poetry env activate) From bdc0cf45651d81f8cbc78baca1eef8621e8603ce Mon Sep 17 00:00:00 2001 From: tyler-yankee Date: Wed, 22 Jan 2025 09:59:07 -0500 Subject: [PATCH 15/19] remove 'macos_python' artifact in CI --- .github/workflows/pip.yml | 1 - .github/workflows/poetry.yml | 1 - drake_pip/.github/workflows/ci.yml | 1 - drake_poetry/.github/workflows/ci.yml | 1 - 4 files changed, 4 deletions(-) diff --git a/.github/workflows/pip.yml b/.github/workflows/pip.yml index ea07ba47..9a74609b 100644 --- a/.github/workflows/pip.yml +++ b/.github/workflows/pip.yml @@ -24,7 +24,6 @@ jobs: find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete sudo rm -rf /Library/Frameworks/Python.framework/ - name: python setup - id: macos_python uses: actions/setup-python@v5 with: python-version: '3.12' diff --git a/.github/workflows/poetry.yml b/.github/workflows/poetry.yml index 782f01d0..2dbfd7f0 100644 --- a/.github/workflows/poetry.yml +++ b/.github/workflows/poetry.yml @@ -24,7 +24,6 @@ jobs: find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete sudo rm -rf /Library/Frameworks/Python.framework/ - name: python setup - id: macos_python uses: actions/setup-python@v5 with: python-version: '3.12' diff --git a/drake_pip/.github/workflows/ci.yml b/drake_pip/.github/workflows/ci.yml index 68ff49af..d2a20a04 100644 --- a/drake_pip/.github/workflows/ci.yml +++ b/drake_pip/.github/workflows/ci.yml @@ -35,7 +35,6 @@ jobs: find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete sudo rm -rf /Library/Frameworks/Python.framework/ - name: python setup - id: macos_python uses: actions/setup-python@v5 with: python-version: '3.12' diff --git a/drake_poetry/.github/workflows/ci.yml b/drake_poetry/.github/workflows/ci.yml index 9d80dd17..57a23d82 100644 --- a/drake_poetry/.github/workflows/ci.yml +++ b/drake_poetry/.github/workflows/ci.yml @@ -35,7 +35,6 @@ jobs: find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete sudo rm -rf /Library/Frameworks/Python.framework/ - name: python setup - id: macos_python uses: actions/setup-python@v5 with: python-version: '3.12' From 9403424fc9a02db7d43522cf03395b2a711c7904 Mon Sep 17 00:00:00 2001 From: tyler-yankee Date: Wed, 22 Jan 2025 11:41:50 -0500 Subject: [PATCH 16/19] refactor pip example to use requirements.txt and install Drake from script --- .github/workflows/pip.yml | 8 ++-- drake_pip/.github/ci_build_test | 6 --- drake_pip/.github/workflows/ci.yml | 8 ++-- drake_pip/README.md | 61 ++++++++++++++++++++++-------- drake_pip/requirements.txt | 3 ++ drake_pip/setup/install_prereqs | 2 + drake_pip/setup/setup_env | 10 +++++ 7 files changed, 69 insertions(+), 29 deletions(-) create mode 100644 drake_pip/requirements.txt create mode 100755 drake_pip/setup/setup_env diff --git a/.github/workflows/pip.yml b/.github/workflows/pip.yml index 9a74609b..feaa82ac 100644 --- a/.github/workflows/pip.yml +++ b/.github/workflows/pip.yml @@ -27,11 +27,13 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.12' + - name: venv setup and install + working-directory: drake_pip + run: setup/setup_env 3.12 + shell: zsh -eufo pipefail {0} - name: pip build and test working-directory: drake_pip run: .github/ci_build_test - env: - PYTHON_VERSION: '3.12' shell: zsh -efuo pipefail {0} ubuntu_jammy_pip: name: ubuntu 22.04 jammy @@ -47,6 +49,4 @@ jobs: - name: pip build and test working-directory: drake_pip run: .github/ci_build_test - env: - PYTHON_VERSION: '3' shell: bash diff --git a/drake_pip/.github/ci_build_test b/drake_pip/.github/ci_build_test index 9228a462..10c4ac3a 100755 --- a/drake_pip/.github/ci_build_test +++ b/drake_pip/.github/ci_build_test @@ -3,13 +3,7 @@ set -euxo pipefail -"python$PYTHON_VERSION" --version -"python$PYTHON_VERSION" -m venv env - source env/bin/activate -pip install drake - -python3 -c 'import pydrake.all; print(pydrake.__file__)' cd src python3 particle_test.py diff --git a/drake_pip/.github/workflows/ci.yml b/drake_pip/.github/workflows/ci.yml index d2a20a04..3ff741e1 100644 --- a/drake_pip/.github/workflows/ci.yml +++ b/drake_pip/.github/workflows/ci.yml @@ -38,11 +38,13 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.12' + - name: venv setup and install + working-directory: drake_pip + run: setup/setup_env 3.12 + shell: zsh -eufo pipefail {0} - name: pip build and test working-directory: drake_pip run: .github/ci_build_test - env: - PYTHON_VERSION: '3.12' shell: zsh -efuo pipefail {0} ubuntu_jammy_pip: name: ubuntu 22.04 jammy @@ -58,6 +60,4 @@ jobs: - name: pip build and test working-directory: drake_pip run: .github/ci_build_test - env: - PYTHON_VERSION: '3' shell: bash diff --git a/drake_pip/README.md b/drake_pip/README.md index 7d49ff90..5b983712 100644 --- a/drake_pip/README.md +++ b/drake_pip/README.md @@ -3,36 +3,67 @@ This installs Drake using [`pip`](https://pypi.org/project/pip/), the Python package manager. -## Instructions +# Instructions -First, install the required Ubuntu packages: +Follow the setup instructions for [Ubuntu](#ubuntu-setup) +or [Mac OS](#mac-setup), and read the [General Overview](#general-overview) +for additional background information. -``` +## Ubuntu Setup + +If on Ubuntu, first install the required packages: + +```bash setup/install_prereqs ``` -For Mac users, simply ensure the correct version of Python +This script will also run `setup/setup_env`, which creates the virtual environment for this project and installs Drake. + +To start programming, simply activate the environment by calling: + +```bash +source env/bin/activate +``` + +## Mac Setup + +If on Mac OS X, simply ensure the correct version of Python is installed from Homebrew by referring to the [Supported Configurations](https://drake.mit.edu/installation.html#supported-configurations). -Create a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) -named `env` and activate it: +Then, run the following script to create the virtual environment for this project and install Drake: +```bash +setup/setup_env ``` -python3 -m venv env + +*Note*: If you have multiple versions of Python installed, +you can specify the correct version as an optional argument +to the script. For example, `setup/setup_env 3.12`. + +To start programming, simply activate the environment by calling: + +```bash source env/bin/activate ``` -Then install Drake for Python in the virtual environment: +## General Overview -``` -pip install drake -``` +The `setup_env` script takes care of the virtual environment +and Drake installation, but read below for a quick overview of the steps. -Call the following to ensure `pydrake` can be imported: +Create a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) +named `env` and activate it: +```bash +python3 -m venv env +source env/bin/activate ``` -python3 -c 'import pydrake.all; print(pydrake.__file__)' + +Then install Drake in the virtual environment using the provided `requirements.txt` file: + +```bash +pip3 install -r requirements.txt ``` That's all that is needed to use Drake from Python. @@ -42,12 +73,12 @@ For more information on what's available for Drake in Python, see [Using Drake from Python](https://drake.mit.edu/python_bindings.html) and the Python API [pydrake](https://drake.mit.edu/pydrake/index.html). -## Examples +# Examples To run the particle example tests in this directory, navigate to `src` and call the test file to execute the unit tests: -``` +```bash cd src python3 particle_test.py ``` diff --git a/drake_pip/requirements.txt b/drake_pip/requirements.txt new file mode 100644 index 00000000..c3441737 --- /dev/null +++ b/drake_pip/requirements.txt @@ -0,0 +1,3 @@ +# Currently, this only includes the most recent version of drake. +# Feel free to add more packages for your own project! +drake \ No newline at end of file diff --git a/drake_pip/setup/install_prereqs b/drake_pip/setup/install_prereqs index c85a2e8f..b1af6335 100755 --- a/drake_pip/setup/install_prereqs +++ b/drake_pip/setup/install_prereqs @@ -21,3 +21,5 @@ ${maybe_sudo} apt-get install --no-install-recommends $(cat < Date: Wed, 22 Jan 2025 13:24:13 -0500 Subject: [PATCH 17/19] refactor poetry example to include readily-available environment --- .github/workflows/poetry.yml | 17 +- drake_poetry/.github/ci_build_test | 17 +- drake_poetry/.github/workflows/ci.yml | 17 +- drake_poetry/README.md | 68 +-- drake_poetry/poetry.lock | 630 ++++++++++++++++++++++++++ drake_poetry/pyproject.toml | 13 + drake_poetry/setup/install_prereqs | 17 +- 7 files changed, 692 insertions(+), 87 deletions(-) create mode 100644 drake_poetry/poetry.lock create mode 100644 drake_poetry/pyproject.toml diff --git a/.github/workflows/poetry.yml b/.github/workflows/poetry.yml index 2dbfd7f0..d9511991 100644 --- a/.github/workflows/poetry.yml +++ b/.github/workflows/poetry.yml @@ -29,13 +29,11 @@ jobs: python-version: '3.12' - name: poetry setup working-directory: drake_poetry - run: setup/install_prereqs + run: setup/install_prereqs 3.12 shell: zsh -efuo pipefail {0} - - name: poetry build and test + - name: poetry test working-directory: drake_poetry run: .github/ci_build_test - env: - PYTHON_VERSION: '3.12' shell: zsh -efuo pipefail {0} ubuntu_jammy_poetry: name: ubuntu 22.04 jammy @@ -44,14 +42,13 @@ jobs: steps: - name: checkout uses: actions/checkout@v4 - # This should be kept in one step because updating of the PATH variable - # after installing poetry does not persist between steps on GHA. - - name: poetry setup, build, and test + # ubuntu_setup and ci_build_test must occur in one step + # because when poetry is installed, the update to PATH + # does not persist between steps on GHA. + - name: poetry setup and test working-directory: drake_poetry run: | .github/ubuntu_setup - source $HOME/.profile # update PATH + source $HOME/.profile .github/ci_build_test - env: - PYTHON_VERSION: '3' shell: bash diff --git a/drake_poetry/.github/ci_build_test b/drake_poetry/.github/ci_build_test index 263cdc24..422d7997 100755 --- a/drake_poetry/.github/ci_build_test +++ b/drake_poetry/.github/ci_build_test @@ -4,24 +4,9 @@ set -euxo pipefail poetry --version -"python$PYTHON_VERSION" --version -# Set up the appropriate version of Python for Poetry -# if one other than the default is specified -if [[ "$PYTHON_VERSION" != "3" ]]; then - poetry init -n --python "~$PYTHON_VERSION" - poetry env use $PYTHON_VERSION -else - poetry init -n -fi - -poetry add drake -eval $(poetry env activate) - -python3 -c 'import pydrake.all; print(pydrake.__file__)' cd src -python3 particle_test.py +poetry run python particle_test.py cd .. -deactivate rm -rf src/__pycache__ diff --git a/drake_poetry/.github/workflows/ci.yml b/drake_poetry/.github/workflows/ci.yml index 57a23d82..1f5fe0f9 100644 --- a/drake_poetry/.github/workflows/ci.yml +++ b/drake_poetry/.github/workflows/ci.yml @@ -40,13 +40,11 @@ jobs: python-version: '3.12' - name: poetry setup working-directory: drake_poetry - run: setup/install_prereqs + run: setup/install_prereqs 3.12 shell: zsh -efuo pipefail {0} - - name: poetry build and test + - name: poetry test working-directory: drake_poetry run: .github/ci_build_test - env: - PYTHON_VERSION: '3.12' shell: zsh -efuo pipefail {0} ubuntu_jammy_poetry: name: ubuntu 22.04 jammy @@ -55,14 +53,13 @@ jobs: steps: - name: checkout uses: actions/checkout@v4 - # This should be kept in one step because updating of the PATH variable - # after installing poetry does not persist between steps on GHA. - - name: poetry setup, build, and test + # ubuntu_setup and ci_build_test must occur in one step + # because when poetry is installed, the update to PATH + # does not persist between steps on GHA. + - name: poetry setup and test working-directory: drake_poetry run: | .github/ubuntu_setup - source $HOME/.profile # update PATH + source $HOME/.profile .github/ci_build_test - env: - PYTHON_VERSION: '3' shell: bash diff --git a/drake_poetry/README.md b/drake_poetry/README.md index fc9a5676..1dd52376 100644 --- a/drake_poetry/README.md +++ b/drake_poetry/README.md @@ -6,66 +6,34 @@ the Python package manager. For an introduction to `poetry`, see [Basic usage](https://python-poetry.org/docs/basic-usage/). -## Instructions +# Instructions -First, install the required packages. -This includes an installation of Poetry using `pipx`; see the -[Installation Instructions](https://python-poetry.org/docs/#installation) -for more information. - -``` -setup/install_prereqs -``` - -Call `poetry init` to create project in the current directory, -including the following arguments: - -* `--python [version]` to introduce a requirement on the version(s) -of Python that will be supported by this `poetry` project. -Refer to [Source Installation](https://drake.mit.edu/from_source.html) -for the version of Python currently supported by Drake -on each operating system. Refer to -[Version Constraints](https://python-poetry.org/docs/dependency-specification/#version-constraints) -for guidelines on how to specify Python version requirements in `poetry`. -* (Optional) `-n` to ignore the interactive setup - -For example, to setup an environment on Ubuntu 22.04, call: - -``` -poetry init -n --python ~3.10 -``` - -The `pyproject.toml` file that's created -contains the project and dependency information. +The `pyproject.toml` file found in this directory contains all +that is needed to start a Poetry project using the most recent +version of Drake. -From there, ensure `poetry` is using the correct version of Python, -as directed above: +Run the installation script to perform the following: -``` -poetry env use [3.10/3.12] -``` - -Drake can be installed using: +* install the required system packages for Drake +* install Poetry using `pipx`; see the +[Installation Instructions](https://python-poetry.org/docs/#installation) +for more information +* install the most recent version of Drake using `poetry install` -``` -poetry add drake +```bash +setup/install_prereqs ``` -After a successfull installation, -Drake should be seen under `dependencies` in the `pyproject.toml` file. +*Note*: If you have multiple versions of Python installed, +you can specify the correct version as an optional argument +to the script. For example, `setup/install_prereqs 3.12`. -To activate the virtual environment installed by `poetry`, use: - -``` -eval $(poetry env activate) -``` - -## Examples +# Examples To run the particle example tests in this directory, navigate to `src` and call the test file to execute the unit tests: -``` +```bash cd src -python3 particle_test.py +poetry run python particle_test.py ``` diff --git a/drake_poetry/poetry.lock b/drake_poetry/poetry.lock new file mode 100644 index 00000000..a84c0a8d --- /dev/null +++ b/drake_poetry/poetry.lock @@ -0,0 +1,630 @@ +# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. + +[[package]] +name = "contourpy" +version = "1.3.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595"}, + {file = "contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697"}, + {file = "contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f"}, + {file = "contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375"}, + {file = "contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d"}, + {file = "contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e"}, + {file = "contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1"}, + {file = "contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82"}, + {file = "contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53"}, + {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"}, +] + +[package.dependencies] +numpy = ">=1.23" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "drake" +version = "1.37.0" +description = "Model-based design and verification for robotics" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "drake-1.37.0-cp310-cp310-manylinux_2_35_x86_64.whl", hash = "sha256:4c5b8a792a0dcba6e1f211388e56a82120b41ebbe16367642b29f0c423b79149"}, + {file = "drake-1.37.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:48d246bc40f385bc038d2a9e190766457f44326e70df99a391d95cc28114e6e3"}, + {file = "drake-1.37.0-cp311-cp311-manylinux_2_35_x86_64.whl", hash = "sha256:4a2c06741d1aabe4ff94763a359b0d1ccd16f9822df372ecc5f83973dbb7e37a"}, + {file = "drake-1.37.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b88d45d7747cd75b5cc549258f72c3b1abb09ca8fd955c422946cb507276a0a4"}, + {file = "drake-1.37.0-cp312-cp312-manylinux_2_35_x86_64.whl", hash = "sha256:e1682978fc12fe71bd8083ba7d360be70e20efa243bd036af737d422c57c486d"}, +] + +[package.dependencies] +matplotlib = "*" +numpy = "*" +pydot = "*" +PyYAML = "*" + +[[package]] +name = "fonttools" +version = "4.55.4" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "fonttools-4.55.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b332ea7b7f5f3d99f9bc5a28a23c3824ae72711abf7c4e1d62fa21699fdebe7"}, + {file = "fonttools-4.55.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d8f925909256e62152e7c3e192655dbca3ab8c3cdef7d7b436732727e80feb6"}, + {file = "fonttools-4.55.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a58af9b98e39bcd773aa352b4512be79b472830b799cb1d3cafb2b4796b71cd"}, + {file = "fonttools-4.55.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:736d750d2ab4523067d8058e5294b40b01f2eee521e0fd401bec0d5e21e80b12"}, + {file = "fonttools-4.55.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1a9a2e7e8a9d3bfa9589db3e6c4e4c127fec252493924b2f87a67a25f9430057"}, + {file = "fonttools-4.55.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87824368e994af34a95cb4279a8c711e51974b3c28d052d39d768531cc9e8e59"}, + {file = "fonttools-4.55.4-cp310-cp310-win32.whl", hash = "sha256:6c36dcbfe64bce38c4d4f1d436cdc6445e969eee96eb98d98be603b5abf8c3f2"}, + {file = "fonttools-4.55.4-cp310-cp310-win_amd64.whl", hash = "sha256:3c53a467e5cf629acdbefc98b0f554859539fb6447bbeae4117b9ab51464ccc5"}, + {file = "fonttools-4.55.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1605b28165c785bf26c2cbd205dc0822463e3f9f56f187049eb214dc5f4a59cb"}, + {file = "fonttools-4.55.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d851d8b2fdb676507365d1430c3285d62c4039d0d7760d8cf2f2e5ea3aa19d73"}, + {file = "fonttools-4.55.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fb3cf1cddf08cec0338f238f950cb76fabab23a324a579e3e1f9b2ef2578329"}, + {file = "fonttools-4.55.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddd3208b06186ca00fbd329c0d0fed5ba209c99017cc46e2c4ea42233c2fbd00"}, + {file = "fonttools-4.55.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9bd98819cb585a894dda9dcb337afeb2601abf17da17de7bfbfc1bc2e4a062c7"}, + {file = "fonttools-4.55.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4877376c10541e8dccf14876c8476d5082338fa5d21103894894382cc245144b"}, + {file = "fonttools-4.55.4-cp311-cp311-win32.whl", hash = "sha256:3a5e466894ec6d8a009b0eb8e02a6eb26959a318d5b7a906280c26bdadce6423"}, + {file = "fonttools-4.55.4-cp311-cp311-win_amd64.whl", hash = "sha256:f595129e6f9c6402965d6295fe8c18c1945d27af0f90bdb52ff426226e647afc"}, + {file = "fonttools-4.55.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b3db72ad2d26a0e9ec694cbfb4485a8da9c095d29f66561cf935dbd19f3efcea"}, + {file = "fonttools-4.55.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87717808fd5953588c3ffaf512e8cab0e43c09c1da04e42ba87fa4c07d8170c7"}, + {file = "fonttools-4.55.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f49dac626ad5bc1a0147b88e6157e3211fd440d00007f0da6c9e5f91dd5cb88e"}, + {file = "fonttools-4.55.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d0ac8656ada8b604ae5da15d9aa075232f2181b95b51a3a2a55195222df7e7"}, + {file = "fonttools-4.55.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:013c8b45873fa77a4ff6d25e43fecf1046cb7e8c6b32f1843117f98f3f8eac60"}, + {file = "fonttools-4.55.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94caad375d254a0332926512f06791f5e66c24a913ebecd6178b14f61d27c62f"}, + {file = "fonttools-4.55.4-cp312-cp312-win32.whl", hash = "sha256:cb3eb4bf3a0c4e431e1ccab7a33ef4f1bb32657133fff4a61dc4fcbd54b94d29"}, + {file = "fonttools-4.55.4-cp312-cp312-win_amd64.whl", hash = "sha256:6914269f6ff6b20c6b5a9b19d0b752880bd8ee218d9a7d6afe9960bbf1922d98"}, + {file = "fonttools-4.55.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:699dd32da7258a89939567a3d71b3f8decf84da54488a2526693f0d981a76479"}, + {file = "fonttools-4.55.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f374b18ac04fbf78f20940418aee7882be3cdcb328ded80e16c3356499f64cf"}, + {file = "fonttools-4.55.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b18792529ca3c24259090b6faa60bd0bdfcc4a06312e8f06d6fccab007f07193"}, + {file = "fonttools-4.55.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e91d25261ebc9ff2143b95e6272f46b9f28e260b8f40feda07c80b66ff7e61d"}, + {file = "fonttools-4.55.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2695781a897395d03504fd24b60c944726b5e7b7af9ea3d922f7319d70c6fc37"}, + {file = "fonttools-4.55.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21de3ef5b8e5361fd01d6aef2c09dda4ede139d6b3a1f5cf621d6bea48840dfd"}, + {file = "fonttools-4.55.4-cp313-cp313-win32.whl", hash = "sha256:0ef33fda14e39aabb892a18ed16805b0b5b4e8a801fd1815a694be9dc7f30024"}, + {file = "fonttools-4.55.4-cp313-cp313-win_amd64.whl", hash = "sha256:e953b1614e32b6da828ae7659c8f330a593b6c4b7a4a31f8f63c01b12f0d3680"}, + {file = "fonttools-4.55.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e2d1bbcaf8ca8c60fbb029982197fbaa487559d5380f1c3098882c5ceb4311c7"}, + {file = "fonttools-4.55.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a885593dbcbfc250ff17831f7dc9316e95c3d046e6cd7ff7ab52ebf673bbf978"}, + {file = "fonttools-4.55.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02cd4ad9b3ab9f9c5b233b3bb6a96a036c9c0ef17487805b5e73cedf6439d188"}, + {file = "fonttools-4.55.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:822d46676f794bb6cac055b43f5636792e2a360e18cf0f3a0333c21d79ec0f2d"}, + {file = "fonttools-4.55.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:7b195440fe14d8601053a51e06e13c94f725bf9f964611be99dc3cb65497ce8e"}, + {file = "fonttools-4.55.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a0e0a0ec8cc4b8f82f9cf4efa26774dbd93433ba51b8f9bd2b214bf36c5638f6"}, + {file = "fonttools-4.55.4-cp38-cp38-win32.whl", hash = "sha256:ca7e6047fbc995500e0b7459a04d5b92cafd7730b636d5f83334cd7eefdf95c7"}, + {file = "fonttools-4.55.4-cp38-cp38-win_amd64.whl", hash = "sha256:0185983fcf49ae7a826cedc6f64d68b0434a5b7905d89e75bc95fced7fe118c1"}, + {file = "fonttools-4.55.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:dcc08dcb2be554073a72f3a8cecbc4226602ccdd0187b8f37a03a731cb931864"}, + {file = "fonttools-4.55.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7b9b414ce50f09cb692e97ff82b041ea1a21076ed9c1923206560c15ce9ad03a"}, + {file = "fonttools-4.55.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807a1357d434ef1f4aed9bdfee7077f52dbc040b18ac98f6e417f69a48afbb5"}, + {file = "fonttools-4.55.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a3ec7cba2e71edbc999ce3d48d34ef87cc30a36af6ff90dfc0dbc131f705fc"}, + {file = "fonttools-4.55.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2964b9fe6b4a892a41a8a517bac232072a821cf2288fad1d19c6c1d19c34b0dd"}, + {file = "fonttools-4.55.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0b9f4f032295adeb39a8c0eefb08a7b1e90f4b7571506e5d84bb923a7afa8247"}, + {file = "fonttools-4.55.4-cp39-cp39-win32.whl", hash = "sha256:ee4e86280dc637a17e926cbdd32c2de148c013c3468777ae6e94c8b4449c8e93"}, + {file = "fonttools-4.55.4-cp39-cp39-win_amd64.whl", hash = "sha256:82a03920f0f524abab375dcfac8926d9596986503ee00ae435bdd71b1498f214"}, + {file = "fonttools-4.55.4-py3-none-any.whl", hash = "sha256:d07ad8f31038c6394a0945752458313367a0ef8125d284ee59f99e68393a3c2d"}, + {file = "fonttools-4.55.4.tar.gz", hash = "sha256:9598af0af85073659facbe9612fcc56b071ef2f26e3819ebf9bd8c5d35f958c5"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b"}, + {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, +] + +[[package]] +name = "matplotlib" +version = "3.10.0" +description = "Python plotting package" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6"}, + {file = "matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e"}, + {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:607b16c8a73943df110f99ee2e940b8a1cbf9714b65307c040d422558397dac5"}, + {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01d2b19f13aeec2e759414d3bfe19ddfb16b13a1250add08d46d5ff6f9be83c6"}, + {file = "matplotlib-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e6c6461e1fc63df30bf6f80f0b93f5b6784299f721bc28530477acd51bfc3d1"}, + {file = "matplotlib-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:994c07b9d9fe8d25951e3202a68c17900679274dadfc1248738dcfa1bd40d7f3"}, + {file = "matplotlib-3.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fd44fc75522f58612ec4a33958a7e5552562b7705b42ef1b4f8c0818e304a363"}, + {file = "matplotlib-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c58a9622d5dbeb668f407f35f4e6bfac34bb9ecdcc81680c04d0258169747997"}, + {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:845d96568ec873be63f25fa80e9e7fae4be854a66a7e2f0c8ccc99e94a8bd4ef"}, + {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5439f4c5a3e2e8eab18e2f8c3ef929772fd5641876db71f08127eed95ab64683"}, + {file = "matplotlib-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4673ff67a36152c48ddeaf1135e74ce0d4bce1bbf836ae40ed39c29edf7e2765"}, + {file = "matplotlib-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e8632baebb058555ac0cde75db885c61f1212e47723d63921879806b40bec6a"}, + {file = "matplotlib-3.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4659665bc7c9b58f8c00317c3c2a299f7f258eeae5a5d56b4c64226fca2f7c59"}, + {file = "matplotlib-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d44cb942af1693cced2604c33a9abcef6205601c445f6d0dc531d813af8a2f5a"}, + {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a994f29e968ca002b50982b27168addfd65f0105610b6be7fa515ca4b5307c95"}, + {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b0558bae37f154fffda54d779a592bc97ca8b4701f1c710055b609a3bac44c8"}, + {file = "matplotlib-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:503feb23bd8c8acc75541548a1d709c059b7184cde26314896e10a9f14df5f12"}, + {file = "matplotlib-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:c40ba2eb08b3f5de88152c2333c58cee7edcead0a2a0d60fcafa116b17117adc"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96f2886f5c1e466f21cc41b70c5a0cd47bfa0015eb2d5793c88ebce658600e25"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:12eaf48463b472c3c0f8dbacdbf906e573013df81a0ab82f0616ea4b11281908"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fbbabc82fde51391c4da5006f965e36d86d95f6ee83fb594b279564a4c5d0d2"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad2e15300530c1a94c63cfa546e3b7864bd18ea2901317bae8bbf06a5ade6dcf"}, + {file = "matplotlib-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3547d153d70233a8496859097ef0312212e2689cdf8d7ed764441c77604095ae"}, + {file = "matplotlib-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c55b20591ced744aa04e8c3e4b7543ea4d650b6c3c4b208c08a05b4010e8b442"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ade1003376731a971e398cc4ef38bb83ee8caf0aee46ac6daa4b0506db1fd06"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95b710fea129c76d30be72c3b38f330269363fbc6e570a5dd43580487380b5ff"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdbaf909887373c3e094b0318d7ff230b2ad9dcb64da7ade654182872ab2593"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d907fddb39f923d011875452ff1eca29a9e7f21722b873e90db32e5d8ddff12e"}, + {file = "matplotlib-3.10.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3b427392354d10975c1d0f4ee18aa5844640b512d5311ef32efd4dd7db106ede"}, + {file = "matplotlib-3.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5fd41b0ec7ee45cd960a8e71aea7c946a28a0b8a4dcee47d2856b2af051f334c"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:81713dd0d103b379de4516b861d964b1d789a144103277769238c732229d7f03"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:359f87baedb1f836ce307f0e850d12bb5f1936f70d035561f90d41d305fdacea"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80dc3a4add4665cf2faa90138384a7ffe2a4e37c58d83e115b54287c4f06ef"}, + {file = "matplotlib-3.10.0.tar.gz", hash = "sha256:b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] + +[[package]] +name = "numpy" +version = "2.2.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e"}, + {file = "numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e"}, + {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715"}, + {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a"}, + {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97"}, + {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957"}, + {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d"}, + {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd"}, + {file = "numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160"}, + {file = "numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014"}, + {file = "numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189"}, + {file = "numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323"}, + {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac"}, + {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e"}, + {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c"}, + {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f"}, + {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826"}, + {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8"}, + {file = "numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50"}, + {file = "numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2"}, + {file = "numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467"}, + {file = "numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a"}, + {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825"}, + {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37"}, + {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748"}, + {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0"}, + {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278"}, + {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba"}, + {file = "numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283"}, + {file = "numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be"}, + {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84"}, + {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff"}, + {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0"}, + {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de"}, + {file = "numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9"}, + {file = "numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49"}, + {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2"}, + {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7"}, + {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb"}, + {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648"}, + {file = "numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4"}, + {file = "numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576"}, + {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495"}, + {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df"}, + {file = "numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a"}, + {file = "numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60"}, + {file = "numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"}, +] + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "pillow" +version = "11.1.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, + {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269"}, + {file = "pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49"}, + {file = "pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a"}, + {file = "pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96"}, + {file = "pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f"}, + {file = "pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761"}, + {file = "pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c"}, + {file = "pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6"}, + {file = "pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf"}, + {file = "pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3"}, + {file = "pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9"}, + {file = "pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c"}, + {file = "pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547"}, + {file = "pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab"}, + {file = "pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9"}, + {file = "pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe"}, + {file = "pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8"}, + {file = "pillow-11.1.0-cp39-cp39-win32.whl", hash = "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5"}, + {file = "pillow-11.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f"}, + {file = "pillow-11.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0"}, + {file = "pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pydot" +version = "3.0.4" +description = "Python interface to Graphviz's Dot" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pydot-3.0.4-py3-none-any.whl", hash = "sha256:bfa9c3fc0c44ba1d132adce131802d7df00429d1a79cc0346b0a5cd374dbe9c6"}, + {file = "pydot-3.0.4.tar.gz", hash = "sha256:3ce88b2558f3808b0376f22bfa6c263909e1c3981e2a7b629b65b451eee4a25d"}, +] + +[package.dependencies] +pyparsing = ">=3.0.9" + +[package.extras] +dev = ["chardet", "parameterized", "ruff"] +release = ["zest.releaser[recommended]"] +tests = ["chardet", "parameterized", "pytest", "pytest-cov", "pytest-xdist[psutil]", "ruff", "tox"] + +[[package]] +name = "pyparsing" +version = "3.2.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[metadata] +lock-version = "2.1" +python-versions = "^3.10" +content-hash = "ac180672b1b980ffb0210fbcc5667a6dd0c54493d6eee87c5d6e78d8d2a540b6" diff --git a/drake_poetry/pyproject.toml b/drake_poetry/pyproject.toml new file mode 100644 index 00000000..73684077 --- /dev/null +++ b/drake_poetry/pyproject.toml @@ -0,0 +1,13 @@ +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry] +package-mode = false +description = "Example poetry project using Drake" +authors = ["RobotLocomotion <@>"] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +drake = "^1.37.0" diff --git a/drake_poetry/setup/install_prereqs b/drake_poetry/setup/install_prereqs index 97cf5c0d..8f44cc24 100755 --- a/drake_poetry/setup/install_prereqs +++ b/drake_poetry/setup/install_prereqs @@ -36,6 +36,21 @@ EOF ;; esac -# Install poetry and put it on PATH +# Install poetry pipx install poetry pipx ensurepath +# Update PATH on Linux in order to run the next steps +if [[ "$OSTYPE" == "linux"* ]]; then + source $HOME/.profile +fi + +# If a version of Python other than the default (3) is provided, +# enforce that poetry use that version. +PYTHON_VERSION=${1:-'3'} +echo "Creating poetry environment with python${PYTHON_VERSION}" +if [[ "$PYTHON_VERSION" != "3" ]]; then + poetry env use $PYTHON_VERSION +fi + +# Install poetry dependencies +poetry install From 52bcccca443149e387698a2006b52f2c815f1c0c Mon Sep 17 00:00:00 2001 From: tyler-yankee Date: Wed, 22 Jan 2025 15:16:02 -0500 Subject: [PATCH 18/19] formatting and documentation updates --- drake_pip/README.md | 36 +++++++----------------------- drake_pip/requirements.txt | 2 +- drake_pip/setup/install_prereqs | 4 ++-- drake_poetry/README.md | 4 ++++ drake_poetry/setup/install_prereqs | 9 ++------ 5 files changed, 17 insertions(+), 38 deletions(-) diff --git a/drake_pip/README.md b/drake_pip/README.md index 5b983712..d0090e89 100644 --- a/drake_pip/README.md +++ b/drake_pip/README.md @@ -6,8 +6,10 @@ the Python package manager. # Instructions Follow the setup instructions for [Ubuntu](#ubuntu-setup) -or [Mac OS](#mac-setup), and read the [General Overview](#general-overview) -for additional background information. +or [Mac OS](#mac-setup). + +See [Installation via Pip](https://drake.mit.edu/pip.html#stable-releases) +for more information on installation. ## Ubuntu Setup @@ -47,32 +49,6 @@ To start programming, simply activate the environment by calling: source env/bin/activate ``` -## General Overview - -The `setup_env` script takes care of the virtual environment -and Drake installation, but read below for a quick overview of the steps. - -Create a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) -named `env` and activate it: - -```bash -python3 -m venv env -source env/bin/activate -``` - -Then install Drake in the virtual environment using the provided `requirements.txt` file: - -```bash -pip3 install -r requirements.txt -``` - -That's all that is needed to use Drake from Python. -See [Installation via Pip](https://drake.mit.edu/pip.html#stable-releases) -for more information on installation. -For more information on what's available for Drake in Python, -see [Using Drake from Python](https://drake.mit.edu/python_bindings.html) -and the Python API [pydrake](https://drake.mit.edu/pydrake/index.html). - # Examples To run the particle example tests in this directory, @@ -82,3 +58,7 @@ navigate to `src` and call the test file to execute the unit tests: cd src python3 particle_test.py ``` + +For more information on what's available for Drake in Python, +see [Using Drake from Python](https://drake.mit.edu/python_bindings.html) +and the Python API [pydrake](https://drake.mit.edu/pydrake/index.html). diff --git a/drake_pip/requirements.txt b/drake_pip/requirements.txt index c3441737..bcebbc50 100644 --- a/drake_pip/requirements.txt +++ b/drake_pip/requirements.txt @@ -1,3 +1,3 @@ # Currently, this only includes the most recent version of drake. # Feel free to add more packages for your own project! -drake \ No newline at end of file +drake diff --git a/drake_pip/setup/install_prereqs b/drake_pip/setup/install_prereqs index b1af6335..84ad33c2 100755 --- a/drake_pip/setup/install_prereqs +++ b/drake_pip/setup/install_prereqs @@ -9,9 +9,9 @@ if [[ "${EUID}" -ne 0 ]]; then fi # Ubuntu-specific installations +# See https://github.com/RobotLocomotion/drake/blob/master/tools/wheel/content/INSTALLATION +# for a complete list of the required libraries to be installed. ${maybe_sudo} apt-get update -${maybe_sudo} apt-get install --no-install-recommends lsb-release - ${maybe_sudo} apt-get install --no-install-recommends $(cat <&2 - exit 3 - fi - ${maybe_sudo} apt-get install --no-install-recommends $(cat < Date: Fri, 24 Jan 2025 16:22:16 -0500 Subject: [PATCH 19/19] refactor poetry example for user installation --- .github/workflows/poetry.yml | 11 ++++++---- drake_poetry/.github/setup | 30 +++++++++++++++++++++++++++ drake_poetry/.github/ubuntu_setup | 11 ---------- drake_poetry/.github/workflows/ci.yml | 11 ++++++---- drake_poetry/README.md | 10 ++++----- drake_poetry/setup/install_prereqs | 19 +---------------- private/test/file_sync_test.py | 1 - 7 files changed, 50 insertions(+), 43 deletions(-) create mode 100755 drake_poetry/.github/setup delete mode 100755 drake_poetry/.github/ubuntu_setup diff --git a/.github/workflows/poetry.yml b/.github/workflows/poetry.yml index d9511991..3bb73af2 100644 --- a/.github/workflows/poetry.yml +++ b/.github/workflows/poetry.yml @@ -29,7 +29,9 @@ jobs: python-version: '3.12' - name: poetry setup working-directory: drake_poetry - run: setup/install_prereqs 3.12 + run: | + .github/setup + setup/install_prereqs 3.12 shell: zsh -efuo pipefail {0} - name: poetry test working-directory: drake_poetry @@ -42,13 +44,14 @@ jobs: steps: - name: checkout uses: actions/checkout@v4 - # ubuntu_setup and ci_build_test must occur in one step + # setup and test must occur in one step # because when poetry is installed, the update to PATH - # does not persist between steps on GHA. + # does not persist between steps on GHA - name: poetry setup and test working-directory: drake_poetry run: | - .github/ubuntu_setup + .github/setup source $HOME/.profile + setup/install_prereqs .github/ci_build_test shell: bash diff --git a/drake_poetry/.github/setup b/drake_poetry/.github/setup new file mode 100755 index 00000000..41d0ce78 --- /dev/null +++ b/drake_poetry/.github/setup @@ -0,0 +1,30 @@ +#!/bin/bash +# SPDX-License-Identifier: MIT-0 + +set -euxo pipefail + +case "$OSTYPE" in + darwin*) + # Mac-specific installations + brew install pipx + ;; + + linux*) + if [[ "${EUID:-}" -ne 0 ]]; then + echo 'This script must be run as root' >&2 + exit 2 + fi + + # Ubuntu-specific installations + echo 'APT::Acquire::Retries "4";' > /etc/apt/apt.conf.d/80-acquire-retries + echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/90-get-assume-yes + + export DEBIAN_FRONTEND='noninteractive' + + apt-get update + apt-get install --no-install-recommends pipx python3 + ;; +esac + +pipx install poetry +pipx ensurepath diff --git a/drake_poetry/.github/ubuntu_setup b/drake_poetry/.github/ubuntu_setup deleted file mode 100755 index 60cd4f84..00000000 --- a/drake_poetry/.github/ubuntu_setup +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# SPDX-License-Identifier: MIT-0 - -set -euxo pipefail - -echo 'APT::Acquire::Retries "4";' > /etc/apt/apt.conf.d/80-acquire-retries -echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/90-get-assume-yes - -export DEBIAN_FRONTEND='noninteractive' - -setup/install_prereqs diff --git a/drake_poetry/.github/workflows/ci.yml b/drake_poetry/.github/workflows/ci.yml index 1f5fe0f9..efd7d7a7 100644 --- a/drake_poetry/.github/workflows/ci.yml +++ b/drake_poetry/.github/workflows/ci.yml @@ -40,7 +40,9 @@ jobs: python-version: '3.12' - name: poetry setup working-directory: drake_poetry - run: setup/install_prereqs 3.12 + run: | + .github/setup + setup/install_prereqs 3.12 shell: zsh -efuo pipefail {0} - name: poetry test working-directory: drake_poetry @@ -53,13 +55,14 @@ jobs: steps: - name: checkout uses: actions/checkout@v4 - # ubuntu_setup and ci_build_test must occur in one step + # setup and test must occur in one step # because when poetry is installed, the update to PATH - # does not persist between steps on GHA. + # does not persist between steps on GHA - name: poetry setup and test working-directory: drake_poetry run: | - .github/ubuntu_setup + .github/setup source $HOME/.profile + setup/install_prereqs .github/ci_build_test shell: bash diff --git a/drake_poetry/README.md b/drake_poetry/README.md index 7cbee3e7..d62a6cda 100644 --- a/drake_poetry/README.md +++ b/drake_poetry/README.md @@ -12,13 +12,13 @@ The `pyproject.toml` file found in this directory contains all that is needed to start a Poetry project using the most recent version of Drake. +First, follow the [Installation Instructions](https://python-poetry.org/docs/#installation) +to install Poetry using your preferred method. + Run the installation script to perform the following: -* install the required system packages for Drake -* install Poetry using `pipx`; see the -[Installation Instructions](https://python-poetry.org/docs/#installation) -for more information -* install the most recent version of Drake using `poetry install` +* install the required system packages for Drake (Ubuntu only) +* set up your Poetry environment and install the most recent version of Drake ```bash setup/install_prereqs diff --git a/drake_poetry/setup/install_prereqs b/drake_poetry/setup/install_prereqs index 2727e4bc..44c6be0c 100755 --- a/drake_poetry/setup/install_prereqs +++ b/drake_poetry/setup/install_prereqs @@ -8,13 +8,7 @@ if [[ "${EUID}" -ne 0 ]]; then maybe_sudo=sudo fi -case "$OSTYPE" in - darwin*) - # Mac-specific installations - brew install pipx - ;; - - linux*) +if [[ "$OSTYPE" == "linux"* ]]; then # Ubuntu-specific installations # See https://github.com/RobotLocomotion/drake/blob/master/tools/wheel/content/INSTALLATION # for a complete list of the required libraries to be installed. @@ -24,19 +18,8 @@ case "$OSTYPE" in libglib2.0-0 libsm6 libx11-6 - pipx - python3 EOF ) - ;; -esac - -# Install poetry -pipx install poetry -pipx ensurepath -# Update PATH on Linux in order to run the next steps -if [[ "$OSTYPE" == "linux"* ]]; then - source $HOME/.profile fi # If a version of Python other than the default (3) is provided, diff --git a/private/test/file_sync_test.py b/private/test/file_sync_test.py index ee4eaee3..4cfeeac3 100755 --- a/private/test/file_sync_test.py +++ b/private/test/file_sync_test.py @@ -23,7 +23,6 @@ "drake_bazel_download/.github/ubuntu_setup", "drake_cmake_installed/.github/ubuntu_setup", "drake_pip/.github/ubuntu_setup", - "drake_poetry/.github/ubuntu_setup", ), ( "drake_bazel_download/CPPLINT.cfg",