litearm-python 1.2.1__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. {litearm_python-1.2.1/src/litearm_python.egg-info → litearm_python-1.2.2}/PKG-INFO +3 -3
  2. {litearm_python-1.2.1 → litearm_python-1.2.2}/README.md +1 -1
  3. {litearm_python-1.2.1 → litearm_python-1.2.2}/pyproject.toml +2 -2
  4. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/__init__.py +1 -1
  5. {litearm_python-1.2.1 → litearm_python-1.2.2/src/litearm_python.egg-info}/PKG-INFO +3 -3
  6. litearm_python-1.2.2/tests/test_package_metadata.py +48 -0
  7. litearm_python-1.2.1/tests/test_package_metadata.py +0 -28
  8. {litearm_python-1.2.1 → litearm_python-1.2.2}/LICENSE +0 -0
  9. {litearm_python-1.2.1 → litearm_python-1.2.2}/setup.cfg +0 -0
  10. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/__main__.py +0 -0
  11. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/_protocol.py +0 -0
  12. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/_rot.py +0 -0
  13. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/arm.py +0 -0
  14. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/cart.py +0 -0
  15. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/diagnostics.py +0 -0
  16. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/errors.py +0 -0
  17. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/log.py +0 -0
  18. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/model.py +0 -0
  19. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/params.py +0 -0
  20. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/payload.py +0 -0
  21. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/py.typed +0 -0
  22. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/state.py +0 -0
  23. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/testing.py +0 -0
  24. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/tool.py +0 -0
  25. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm/transport.py +0 -0
  26. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm_python.egg-info/SOURCES.txt +0 -0
  27. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm_python.egg-info/dependency_links.txt +0 -0
  28. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm_python.egg-info/entry_points.txt +0 -0
  29. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm_python.egg-info/requires.txt +0 -0
  30. {litearm_python-1.2.1 → litearm_python-1.2.2}/src/litearm_python.egg-info/top_level.txt +0 -0
  31. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_ack_echo.py +0 -0
  32. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_arm_offline.py +0 -0
  33. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_banner.py +0 -0
  34. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_capability.py +0 -0
  35. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_cart_errors.py +0 -0
  36. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_cart_protocol.py +0 -0
  37. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_cart_queue.py +0 -0
  38. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_cart_wait.py +0 -0
  39. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_cli.py +0 -0
  40. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_dfu.py +0 -0
  41. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_diagnostics.py +0 -0
  42. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_doc_examples.py +0 -0
  43. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_error_codes.py +0 -0
  44. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_error_hierarchy.py +0 -0
  45. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_ff_io.py +0 -0
  46. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_fork_guard.py +0 -0
  47. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_frame_ownership.py +0 -0
  48. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_full_coverage.py +0 -0
  49. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_home.py +0 -0
  50. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_ik_bench.py +0 -0
  51. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_license.py +0 -0
  52. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_lifecycle.py +0 -0
  53. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_live.py +0 -0
  54. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_log.py +0 -0
  55. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_model.py +0 -0
  56. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_msg.py +0 -0
  57. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_offline.py +0 -0
  58. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_params.py +0 -0
  59. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_payload.py +0 -0
  60. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_protocol_crc.py +0 -0
  61. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_protocol_sync.py +0 -0
  62. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_public_api.py +0 -0
  63. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_request_and_get.py +0 -0
  64. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_silent_noops.py +0 -0
  65. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_status_layout.py +0 -0
  66. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_teardown.py +0 -0
  67. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_tool_offset.py +0 -0
  68. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_transport.py +0 -0
  69. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_transport_injection.py +0 -0
  70. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_transport_threadsafe.py +0 -0
  71. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_zero_g.py +0 -0
  72. {litearm_python-1.2.1 → litearm_python-1.2.2}/tests/test_zero_g_cart_guard.py +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: litearm-python
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: Python SDK for the LiteArm robotic arm
5
- License: MIT
5
+ License: Apache-2.0
6
6
  Requires-Python: >=3.9
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
@@ -505,4 +505,4 @@ On Windows use `env.ps1` / `env.cmd` and `run_example.ps1` / `run_example.cmd`.
505
505
 
506
506
  ## License
507
507
 
508
- MIT
508
+ Apache License 2.0 — see [LICENSE](LICENSE).
@@ -492,4 +492,4 @@ On Windows use `env.ps1` / `env.cmd` and `run_example.ps1` / `run_example.cmd`.
492
492
 
493
493
  ## License
494
494
 
495
- MIT
495
+ Apache License 2.0 — see [LICENSE](LICENSE).
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "litearm-python"
7
- version = "1.2.1"
7
+ version = "1.2.2"
8
8
  description = "Python SDK for the LiteArm robotic arm"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
11
- license = { text = "MIT" }
11
+ license = { text = "Apache-2.0" }
12
12
  dependencies = ["pyserial>=3.4"]
13
13
 
14
14
  [project.optional-dependencies]
@@ -92,7 +92,7 @@ from litearm.state import JointState, RobotState
92
92
  from litearm.tool import TcpOffset
93
93
  from litearm.transport import find_cdc_port
94
94
 
95
- __version__ = "1.2.1"
95
+ __version__ = "1.2.2"
96
96
 
97
97
  __all__ = [
98
98
  "Arm", "Msg", "LicenseInfo", "RobotState", "JointState", "find_cdc_port", "main",
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: litearm-python
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: Python SDK for the LiteArm robotic arm
5
- License: MIT
5
+ License: Apache-2.0
6
6
  Requires-Python: >=3.9
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
@@ -505,4 +505,4 @@ On Windows use `env.ps1` / `env.cmd` and `run_example.ps1` / `run_example.cmd`.
505
505
 
506
506
  ## License
507
507
 
508
- MIT
508
+ Apache License 2.0 — see [LICENSE](LICENSE).
@@ -0,0 +1,48 @@
1
+ """Packaging metadata —— PyPI 的副标题和许可证都取自 `pyproject.toml`。
2
+
3
+ 副标题 (`[project].description`) 会直接出现在 PyPI 项目页和搜索结果里, 所以它
4
+ 必须是英文。许可证 (`[project].license`) 则必须与仓库根目录的 `LICENSE` 一致:
5
+ GitHub 只扫 `LICENSE` 文件, PyPI 只读包元数据, 两处不一致时两个平台会显示不同
6
+ 的许可证。这两条用例把上述约束变成可检查的门禁。
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import re
11
+ from pathlib import Path
12
+
13
+ PYPROJECT = Path(__file__).resolve().parents[1] / "pyproject.toml"
14
+
15
+
16
+ def _project_description() -> str:
17
+ text = PYPROJECT.read_text(encoding="utf-8")
18
+ match = re.search(r'^description\s*=\s*"([^"]*)"\s*$', text, re.MULTILINE)
19
+ assert match is not None, "pyproject.toml has no [project].description"
20
+ return match.group(1)
21
+
22
+
23
+ def _project_license() -> str:
24
+ text = PYPROJECT.read_text(encoding="utf-8")
25
+ match = re.search(
26
+ r'^license\s*=\s*\{\s*text\s*=\s*"([^"]+)"\s*\}\s*$', text, re.MULTILINE
27
+ )
28
+ assert match is not None, "pyproject.toml has no [project].license"
29
+ return match.group(1)
30
+
31
+
32
+ def test_pypi_subtitle_is_english():
33
+ """PyPI 副标题 (Summary) 必须是英文, 不能是中文。"""
34
+ description = _project_description()
35
+ assert description, "[project].description must not be empty"
36
+ assert description.isascii(), (
37
+ "PyPI shows [project].description as the project subtitle; "
38
+ f"write it in English: {description!r}"
39
+ )
40
+
41
+
42
+ def test_license_metadata_matches_the_license_file():
43
+ """PyPI 读 pyproject 的 license 字段, GitHub 扫 LICENSE 文件, 两边必须一致。"""
44
+ declared = _project_license()
45
+ license_file = (PYPROJECT.parent / "LICENSE").read_text(encoding="utf-8")
46
+ assert declared == "Apache-2.0"
47
+ assert "Apache License" in license_file
48
+ assert "Version 2.0" in license_file
@@ -1,28 +0,0 @@
1
- """Packaging metadata —— PyPI 把 `[project].description` 当作项目副标题展示。
2
-
3
- 副标题会直接出现在 PyPI 项目页和搜索结果里, 所以它必须是英文; 这条用例把
4
- "别再把中文写回 description" 变成可检查的门禁。
5
- """
6
- from __future__ import annotations
7
-
8
- import re
9
- from pathlib import Path
10
-
11
- PYPROJECT = Path(__file__).resolve().parents[1] / "pyproject.toml"
12
-
13
-
14
- def _project_description() -> str:
15
- text = PYPROJECT.read_text(encoding="utf-8")
16
- match = re.search(r'^description\s*=\s*"([^"]*)"\s*$', text, re.MULTILINE)
17
- assert match is not None, "pyproject.toml has no [project].description"
18
- return match.group(1)
19
-
20
-
21
- def test_pypi_subtitle_is_english():
22
- """PyPI 副标题 (Summary) 必须是英文, 不能是中文。"""
23
- description = _project_description()
24
- assert description, "[project].description must not be empty"
25
- assert description.isascii(), (
26
- "PyPI shows [project].description as the project subtitle; "
27
- f"write it in English: {description!r}"
28
- )
File without changes
File without changes