|
1 | 1 | [build-system] |
2 | | -requires = ["setuptools>=45", "wheel"] |
3 | | -build-backend = "setuptools.build_meta" |
| 2 | +requires = ["uv_build>=0.9.9,<0.10"] |
| 3 | +build-backend = "uv_build" |
4 | 4 |
|
5 | 5 | [project] |
6 | 6 | name = "holosoma" |
7 | 7 | version = "0.0.1" |
| 8 | +description = "Holosoma: core training framework for humanoid robot reinforcement learning (locomotion + whole-body tracking)." |
| 9 | +readme = "README.md" |
8 | 10 | requires-python = ">=3.8" |
| 11 | +authors = [{ name = "Amazon FAR Team" }] |
| 12 | +license = { text = "Apache-2.0" } |
| 13 | +keywords = ["humanoid", "robotics", "reinforcement-learning", "locomotion", "whole-body-tracking", "sim2real"] |
| 14 | +classifiers = [ |
| 15 | + "Programming Language :: Python :: 3", |
| 16 | + "License :: OSI Approved :: Apache Software License", |
| 17 | + "Operating System :: POSIX :: Linux", |
| 18 | + "Topic :: Scientific/Engineering :: Artificial Intelligence", |
| 19 | + "Intended Audience :: Developers", |
| 20 | + "Intended Audience :: Science/Research", |
| 21 | +] |
9 | 22 | dependencies = [ |
10 | 23 | "astor", |
11 | 24 | "easydict", |
@@ -55,17 +68,43 @@ dependencies = [ |
55 | 68 | "zmq", |
56 | 69 | ] |
57 | 70 |
|
58 | | - |
59 | | -# Mark optional-dependencies as dynamic since it needs runtime computation |
60 | | -dynamic = ["optional-dependencies"] |
| 71 | +[project.optional-dependencies] |
| 72 | +# Robot SDKs are published to PyPI (FAR forks). The import names are unchanged |
| 73 | +# (`unitree_interface`, `booster_robotics_sdk`) — only the distribution names |
| 74 | +# differ from the historical GitHub-release wheels. Previously computed |
| 75 | +# dynamically in setup.py; now static since the versions are fixed pins. |
| 76 | +unitree = ["far-unitree-sdk==0.1.6"] |
| 77 | +booster = ["far-booster-sdk==0.1.1"] |
| 78 | +# ROS2 example plugins (clock_publish, gantry_control). rclpy and the ROS message |
| 79 | +# packages ship with a ROS2 distro / RoboStack, not PyPI, so this extra is a |
| 80 | +# marker/opt-in rather than a pip-installable set — install rclpy from your ROS |
| 81 | +# environment. The plugins import rclpy lazily, so core stays ROS-free without it. |
| 82 | +ros2 = [] |
61 | 83 |
|
62 | 84 | [project.entry-points."holosoma.bridge"] |
63 | 85 | unitree = "holosoma.bridge.unitree.unitree_sdk2py_bridge:UnitreeSdk2Bridge" |
64 | 86 | unitree_mp = "holosoma.bridge.unitree.unitree_sdk2py_bridge_mp:UnitreeMpSdk2Bridge" |
65 | 87 | booster = "holosoma.bridge.booster.booster_sdk2py_bridge:BoosterSdk2Bridge" |
66 | 88 |
|
67 | | -[tool.setuptools.packages.find] |
68 | | -where = ["."] |
| 89 | +# uv_build packaging. FLAT layout (the holosoma/ module lives at the project |
| 90 | +# root, not under src/), so module-root = "". Only the holosoma module ships — |
| 91 | +# the tests/ tree is intentionally excluded from the distribution (the old |
| 92 | +# setuptools find_packages(where=".") shipped it as a top-level `tests` package, |
| 93 | +# which name-squats the global import; excluding it is the correct behavior). |
| 94 | +[tool.uv.build-backend] |
| 95 | +module-name = "holosoma" |
| 96 | +module-root = "" |
| 97 | +# Ship non-.py package data bundled inside holosoma/ (asset meshes, robot |
| 98 | +# descriptions, configs, motion clips) plus the py.typed marker. Mirrors the |
| 99 | +# old MANIFEST.in recursive-includes + package_data py.typed. |
| 100 | +source-include = [ |
| 101 | + "holosoma/py.typed", |
| 102 | + "holosoma/**/*.STL", |
| 103 | + "holosoma/**/*.urdf", |
| 104 | + "holosoma/**/*.yaml", |
| 105 | + "holosoma/**/*.npz", |
| 106 | + "holosoma/**/*.obj", |
| 107 | +] |
69 | 108 |
|
70 | 109 | [tool.pytest.ini_options] |
71 | 110 | markers = [ |
|
0 commit comments