pymcap-cli 0.5.0__tar.gz → 0.6.0__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 (61) hide show
  1. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/PKG-INFO +1 -1
  2. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/pyproject.toml +1 -1
  3. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/core/mcap_processor.py +26 -2
  4. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/README.md +0 -0
  5. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/__init__.py +0 -0
  6. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cli.py +0 -0
  7. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/__init__.py +0 -0
  8. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/_run_processor.py +0 -0
  9. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/bag2mcap_cmd.py +0 -0
  10. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/cat_cmd.py +0 -0
  11. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/compress_cmd.py +0 -0
  12. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/convert_cmd.py +0 -0
  13. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/diag_cmd.py +0 -0
  14. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/du_cmd.py +0 -0
  15. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/filter_cmd.py +0 -0
  16. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/info_cmd.py +0 -0
  17. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/info_json_cmd.py +0 -0
  18. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/list_cmd.py +0 -0
  19. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/merge_cmd.py +0 -0
  20. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/plot_cmd.py +0 -0
  21. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/process_cmd.py +0 -0
  22. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/rechunk_cmd.py +0 -0
  23. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/records_cmd.py +0 -0
  24. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/recover_cmd.py +0 -0
  25. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/recover_inplace_cmd.py +0 -0
  26. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/roscompress_cmd.py +0 -0
  27. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/rosdecompress_cmd.py +0 -0
  28. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/tftree_cmd.py +0 -0
  29. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/topic_chunks_cmd.py +0 -0
  30. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/cmd/video_cmd.py +0 -0
  31. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/core/__init__.py +0 -0
  32. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/core/input_handler.py +0 -0
  33. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/core/mcap_transform.py +0 -0
  34. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/core/msg_resolver.py +0 -0
  35. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/core/processors.py +0 -0
  36. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/debug_wrapper.py +0 -0
  37. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/display/__init__.py +0 -0
  38. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/display/display_utils.py +0 -0
  39. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/display/osc_utils.py +0 -0
  40. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/display/sparkline.py +0 -0
  41. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/encoding/__init__.py +0 -0
  42. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/encoding/decompress.py +0 -0
  43. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/encoding/encoder_common.py +0 -0
  44. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/encoding/pointcloud.py +0 -0
  45. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/encoding/video_factory.py +0 -0
  46. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/encoding/video_ffmpeg.py +0 -0
  47. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/encoding/video_protocols.py +0 -0
  48. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/encoding/video_pyav.py +0 -0
  49. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/http_utils.py +0 -0
  50. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/info_types.py +0 -0
  51. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/py.typed +0 -0
  52. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/rosbag_reader/__init__.py +0 -0
  53. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/rosbag_reader/_reader.py +0 -0
  54. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/rosbag_reader/_types.py +0 -0
  55. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/rosbag_reader/py.typed +0 -0
  56. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/types/__init__.py +0 -0
  57. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/types/info_data.py +0 -0
  58. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/types/info_link.py +0 -0
  59. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/types/info_types.py +0 -0
  60. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/types/types_manual.py +0 -0
  61. {pymcap_cli-0.5.0 → pymcap_cli-0.6.0}/src/pymcap_cli/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pymcap-cli
3
- Version: 0.5.0
3
+ Version: 0.6.0
4
4
  Summary: High-performance Python CLI for MCAP file processing with advanced recovery, filtering, and optimization capabilities
5
5
  Keywords: mcap,cli,robotics,ros,ros2,recovery,filtering,compression
6
6
  Author: Marko Bausch
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pymcap-cli"
3
- version = "0.5.0"
3
+ version = "0.6.0"
4
4
  description = "High-performance Python CLI for MCAP file processing with advanced recovery, filtering, and optimization capabilities"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -29,6 +29,7 @@ from small_mcap import (
29
29
  Schema,
30
30
  Statistics,
31
31
  breakup_chunk,
32
+ get_header,
32
33
  get_summary,
33
34
  stream_reader,
34
35
  )
@@ -57,6 +58,7 @@ from pymcap_cli.utils import (
57
58
  )
58
59
 
59
60
  console = Console()
61
+ OUTPUT_LIBRARY = "pymcap-cli"
60
62
 
61
63
 
62
64
  @dataclass(slots=True)
@@ -692,8 +694,8 @@ class McapProcessor:
692
694
  writer.schemas = self.schemas
693
695
  writer.channels = self.channels
694
696
 
695
- # Start writer (use default profile/library for merged files)
696
- writer.start()
697
+ header = self._resolve_output_header()
698
+ writer.start(profile=header.profile, library=header.library)
697
699
 
698
700
  try:
699
701
  # Pre-load schemas and channels from all files' summaries
@@ -878,3 +880,25 @@ class McapProcessor:
878
880
  f"[yellow]Warning (stream {stream_id}): Failed to decode chunk: {e}[/yellow]"
879
881
  )
880
882
  self.stats.errors_encountered += 1
883
+
884
+ def _resolve_output_header(self) -> Header:
885
+ """Choose output header metadata from readable inputs.
886
+
887
+ The output library should identify this tool. The profile is preserved only when
888
+ all readable input headers agree, which covers the common merge/recover case.
889
+ """
890
+ profiles: set[str] = set()
891
+
892
+ for input_file in self.options.inputs:
893
+ input_stream = input_file.stream
894
+ original_position = input_stream.tell()
895
+ try:
896
+ header = get_header(input_stream)
897
+ except McapError:
898
+ continue
899
+ finally:
900
+ input_stream.seek(original_position)
901
+ profiles.add(header.profile)
902
+
903
+ profile = profiles.pop() if len(profiles) == 1 else ""
904
+ return Header(profile=profile, library=OUTPUT_LIBRARY)
File without changes