mdify-cli 2.10.0__py3-none-any.whl → 2.11.0__py3-none-any.whl

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.
mdify/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """mdify - Convert documents to Markdown via Docling container."""
2
2
 
3
- __version__ = "2.10.0"
3
+ __version__ = "2.11.0"
mdify/cli.py CHANGED
@@ -38,6 +38,9 @@ SUPPORTED_RUNTIMES = ("docker", "podman", "orbstack", "colima", "container")
38
38
  MACOS_RUNTIMES_PRIORITY = ("container", "orbstack", "colima", "podman", "docker")
39
39
  OTHER_RUNTIMES_PRIORITY = ("docker", "podman")
40
40
 
41
+ # Debug mode
42
+ DEBUG = os.environ.get("MDIFY_DEBUG", "").lower() in ("1", "true", "yes")
43
+
41
44
 
42
45
  # =============================================================================
43
46
  # Update checking functions
@@ -294,8 +297,10 @@ def check_image_exists(runtime: str, image: str) -> bool:
294
297
  try:
295
298
  images = json.loads(result.stdout.decode())
296
299
  # Check if image exists in the list
300
+ # Apple Container returns format: [{"reference": "image:tag", "descriptor": {...}}]
297
301
  for img in images:
298
- if img.get("name") == image or image in img.get("repoTags", []):
302
+ reference = img.get("reference", "")
303
+ if reference == image or reference.startswith(f"{image}:"):
299
304
  return True
300
305
  except json.JSONDecodeError:
301
306
  pass
@@ -813,6 +818,10 @@ def main() -> int:
813
818
 
814
819
  image_exists = check_image_exists(runtime, image)
815
820
 
821
+ if not args.quiet and image_exists:
822
+ print(f"Using cached image: {image}")
823
+ print()
824
+
816
825
  # NOTE: Docker Desktop on macOS/Windows uses a VM, so disk space checks may not
817
826
  # accurately reflect available space in the container's filesystem. Remote Docker
818
827
  # daemons (DOCKER_HOST) are also not supported. In these cases, the check will
@@ -977,6 +986,9 @@ def main() -> int:
977
986
  start_time = time.time()
978
987
  try:
979
988
  # Convert via HTTP API
989
+ if DEBUG:
990
+ print(f" DEBUG: Converting {input_file.name} via {container.base_url}/v1/convert/file", file=sys.stderr)
991
+
980
992
  result = convert_file(
981
993
  container.base_url, input_file, to_format="md"
982
994
  )
@@ -1017,7 +1029,15 @@ def main() -> int:
1017
1029
  print(
1018
1030
  f"{progress} {input_file.name} ✗ ({format_duration(elapsed)})"
1019
1031
  )
1020
- print(f" Error: Container crashed (file may be too complex or large)", file=sys.stderr)
1032
+ print(f" Error: Container crashed while processing file", file=sys.stderr)
1033
+ print(f" File may be too complex, large, or malformed", file=sys.stderr)
1034
+ print(f" Retrieving container logs...", file=sys.stderr)
1035
+ # Get last 20 lines of container logs for debugging
1036
+ logs = container.get_logs(tail=20)
1037
+ if logs:
1038
+ print(f" Container logs (last 20 lines):", file=sys.stderr)
1039
+ for line in logs.strip().split('\n'):
1040
+ print(f" {line}", file=sys.stderr)
1021
1041
  print(f" Stopping remaining conversions", file=sys.stderr)
1022
1042
  break
1023
1043
 
mdify/container.py CHANGED
@@ -125,6 +125,48 @@ class DoclingContainer:
125
125
  check=False,
126
126
  )
127
127
 
128
+ def get_logs(self, tail: int = 50) -> str:
129
+ """Get container logs for debugging.
130
+
131
+ Args:
132
+ tail: Number of lines to retrieve from end of logs
133
+
134
+ Returns:
135
+ Container logs as string
136
+ """
137
+ if not self.container_name:
138
+ return ""
139
+
140
+ try:
141
+ result = subprocess.run(
142
+ [self.runtime, "logs", "--tail", str(tail), self.container_name],
143
+ capture_output=True,
144
+ text=True,
145
+ check=False,
146
+ )
147
+ return result.stdout if result.returncode == 0 else ""
148
+ except Exception:
149
+ return ""
150
+
151
+ def is_running(self) -> bool:
152
+ """Check if container process is still running.
153
+
154
+ Returns:
155
+ True if container is running, False otherwise
156
+ """
157
+ if not self.container_name:
158
+ return False
159
+
160
+ try:
161
+ result = subprocess.run(
162
+ [self.runtime, "ps", "-q", "-f", f"name={self.container_name}"],
163
+ capture_output=True,
164
+ check=False,
165
+ )
166
+ return result.returncode == 0 and bool(result.stdout.strip())
167
+ except Exception:
168
+ return False
169
+
128
170
  def is_ready(self) -> bool:
129
171
  """Check if container is healthy.
130
172
 
@@ -132,6 +174,10 @@ class DoclingContainer:
132
174
  True if container is healthy, False otherwise
133
175
  """
134
176
  try:
177
+ # First check if container is still running
178
+ if not self.is_running():
179
+ return False
180
+ # Then check health endpoint
135
181
  return check_health(self.base_url)
136
182
  except Exception:
137
183
  return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mdify-cli
3
- Version: 2.10.0
3
+ Version: 2.11.0
4
4
  Summary: Convert PDFs and document images into structured Markdown for LLM workflows
5
5
  Author: tiroq
6
6
  License-Expression: MIT
@@ -0,0 +1,12 @@
1
+ assets/mdify.png,sha256=qUj7WXWqNwpI2KNXOW79XJwqFqa-UI0JEkmt1mmy4Rg,1820418
2
+ mdify/__init__.py,sha256=vKo2-djuhRrvQ09Em1Mk8XAv_Tu4lXOarH3sNvrrHmU,91
3
+ mdify/__main__.py,sha256=bhpJ00co6MfaVOdH4XLoW04NtLYDa_oJK7ODzfLrn9M,143
4
+ mdify/cli.py,sha256=9nW2mpkbgosP2CKvnNQzlAKr9R8ISDrkXWPnXnL7w1c,35983
5
+ mdify/container.py,sha256=JoN8mUE1hIIVnrxZwdHud70vgNo_1ZIJtmNoPwBWk8I,6647
6
+ mdify/docling_client.py,sha256=xuQR6sC1v3EPloOSwExoHCqT4uUxE8myYq-Yeby3C2I,7975
7
+ mdify_cli-2.11.0.dist-info/licenses/LICENSE,sha256=NWM66Uv-XuSMKaU-gaPmvfyk4WgE6zcIPr78wyg6GAo,1065
8
+ mdify_cli-2.11.0.dist-info/METADATA,sha256=QVa7y09SvJC6GnXnTLnBPJ-iqy2bKOrJT-_YPOaZFcs,9623
9
+ mdify_cli-2.11.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
10
+ mdify_cli-2.11.0.dist-info/entry_points.txt,sha256=0Xki8f5lADQUtwdt6Eq_FEaieI6Byhk8UE7BuDhChMg,41
11
+ mdify_cli-2.11.0.dist-info/top_level.txt,sha256=qltzf7h8owHq7dxCdfCkSHY8gT21hn1_E8P-VWS_OKM,6
12
+ mdify_cli-2.11.0.dist-info/RECORD,,
@@ -1,12 +0,0 @@
1
- assets/mdify.png,sha256=qUj7WXWqNwpI2KNXOW79XJwqFqa-UI0JEkmt1mmy4Rg,1820418
2
- mdify/__init__.py,sha256=CjafoKZ-RjxyPtnUKVPmPjquU0FlfXDBkDDWZWb1ryw,91
3
- mdify/__main__.py,sha256=bhpJ00co6MfaVOdH4XLoW04NtLYDa_oJK7ODzfLrn9M,143
4
- mdify/cli.py,sha256=ZQMirATkanV0l8v0-A000uXPy7BaT5BPbVFSNSnpLJM,34817
5
- mdify/container.py,sha256=tkk0nv7EquL-rKUY4nkS_yGITb7mqw8B7eEfuqaeVrg,5239
6
- mdify/docling_client.py,sha256=xuQR6sC1v3EPloOSwExoHCqT4uUxE8myYq-Yeby3C2I,7975
7
- mdify_cli-2.10.0.dist-info/licenses/LICENSE,sha256=NWM66Uv-XuSMKaU-gaPmvfyk4WgE6zcIPr78wyg6GAo,1065
8
- mdify_cli-2.10.0.dist-info/METADATA,sha256=c2dtC7VEMeSqPhgbmQBLEM5N6zOkIXfWDPocCz9Ye8E,9623
9
- mdify_cli-2.10.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
10
- mdify_cli-2.10.0.dist-info/entry_points.txt,sha256=0Xki8f5lADQUtwdt6Eq_FEaieI6Byhk8UE7BuDhChMg,41
11
- mdify_cli-2.10.0.dist-info/top_level.txt,sha256=qltzf7h8owHq7dxCdfCkSHY8gT21hn1_E8P-VWS_OKM,6
12
- mdify_cli-2.10.0.dist-info/RECORD,,