BabelDOC 0.2.13__tar.gz → 0.2.14__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 (93) hide show
  1. {babeldoc-0.2.13 → babeldoc-0.2.14}/PKG-INFO +1 -1
  2. babeldoc-0.2.14/babeldoc/__init__.py +1 -0
  3. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/const.py +1 -1
  4. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/backend/pdf_creater.py +6 -1
  5. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/high_level.py +26 -23
  6. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/main.py +1 -1
  7. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/pdfinterp.py +7 -7
  8. {babeldoc-0.2.13 → babeldoc-0.2.14}/pyproject.toml +2 -2
  9. {babeldoc-0.2.13 → babeldoc-0.2.14}/uv.lock +7 -7
  10. babeldoc-0.2.13/babeldoc/__init__.py +0 -1
  11. {babeldoc-0.2.13 → babeldoc-0.2.14}/.cursorignore +0 -0
  12. {babeldoc-0.2.13 → babeldoc-0.2.14}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
  13. {babeldoc-0.2.13 → babeldoc-0.2.14}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
  14. {babeldoc-0.2.13 → babeldoc-0.2.14}/.github/dependabot.yml +0 -0
  15. {babeldoc-0.2.13 → babeldoc-0.2.14}/.github/labels.yml +0 -0
  16. {babeldoc-0.2.13 → babeldoc-0.2.14}/.github/release-drafter.yml +0 -0
  17. {babeldoc-0.2.13 → babeldoc-0.2.14}/.github/workflows/codeql.yml +0 -0
  18. {babeldoc-0.2.13 → babeldoc-0.2.14}/.github/workflows/docs.yml +0 -0
  19. {babeldoc-0.2.13 → babeldoc-0.2.14}/.github/workflows/labeler.yml +0 -0
  20. {babeldoc-0.2.13 → babeldoc-0.2.14}/.github/workflows/publish-to-pypi.yml +0 -0
  21. {babeldoc-0.2.13 → babeldoc-0.2.14}/.github/workflows/test.yml +0 -0
  22. {babeldoc-0.2.13 → babeldoc-0.2.14}/.gitignore +0 -0
  23. {babeldoc-0.2.13 → babeldoc-0.2.14}/.pre-commit-config.yaml +0 -0
  24. {babeldoc-0.2.13 → babeldoc-0.2.14}/LICENSE +0 -0
  25. {babeldoc-0.2.13 → babeldoc-0.2.14}/README.md +0 -0
  26. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/assets/assets.py +0 -0
  27. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/assets/embedding_assets_metadata.py +0 -0
  28. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/asynchronize/__init__.py +0 -0
  29. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/converter.py +0 -0
  30. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/__init__.py +0 -0
  31. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/babeldoc_exception/BabelDOCException.py +0 -0
  32. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/backend/__init__.py +0 -0
  33. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/frontend/__init__.py +0 -0
  34. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/frontend/il_creater.py +0 -0
  35. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/il_version_1.py +0 -0
  36. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/il_version_1.rnc +0 -0
  37. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/il_version_1.rng +0 -0
  38. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/il_version_1.xsd +0 -0
  39. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/midend/__init__.py +0 -0
  40. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/midend/add_debug_information.py +0 -0
  41. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/midend/detect_scanned_file.py +0 -0
  42. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/midend/il_translator.py +0 -0
  43. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/midend/il_translator_llm_only.py +0 -0
  44. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/midend/layout_parser.py +0 -0
  45. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/midend/paragraph_finder.py +0 -0
  46. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/midend/remove_descent.py +0 -0
  47. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/midend/styles_and_formulas.py +0 -0
  48. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/midend/typesetting.py +0 -0
  49. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/translator/__init__.py +0 -0
  50. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/translator/cache.py +0 -0
  51. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/translator/translator.py +0 -0
  52. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/utils/fontmap.py +0 -0
  53. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/utils/layout_helper.py +0 -0
  54. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/utils/style_helper.py +0 -0
  55. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/document_il/xml_converter.py +0 -0
  56. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/docvision/README.md +0 -0
  57. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/docvision/__init__.py +0 -0
  58. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/docvision/doclayout.py +0 -0
  59. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/docvision/rpc_doclayout.py +0 -0
  60. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/progress_monitor.py +0 -0
  61. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/result_merger.py +0 -0
  62. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/split_manager.py +0 -0
  63. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/tools/generate_font_metadata.py +0 -0
  64. {babeldoc-0.2.13 → babeldoc-0.2.14}/babeldoc/translation_config.py +0 -0
  65. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/CODE_OF_CONDUCT.md +0 -0
  66. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/CONTRIBUTING.md +0 -0
  67. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/CONTRIBUTOR_REWARD.md +0 -0
  68. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
  69. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
  70. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
  71. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
  72. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
  73. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/ImplementationDetails/README.md +0 -0
  74. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
  75. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
  76. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/README.md +0 -0
  77. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/deploy.sh +0 -0
  78. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-banner.png +0 -0
  79. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
  80. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
  81. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
  82. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
  83. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-big-logo.png +0 -0
  84. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-contributor_reward_example.png +0 -0
  85. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-preview.gif +0 -0
  86. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
  87. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
  88. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/images/babeldoc-small-logo.png +0 -0
  89. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/index.md +0 -0
  90. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/intro-to-pdf-object.md +0 -0
  91. {babeldoc-0.2.13 → babeldoc-0.2.14}/docs/requirements.txt +0 -0
  92. {babeldoc-0.2.13 → babeldoc-0.2.14}/mkdocs.yml +0 -0
  93. {babeldoc-0.2.13 → babeldoc-0.2.14}/tests/test_translation_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: BabelDOC
3
- Version: 0.2.13
3
+ Version: 0.2.14
4
4
  Summary: Yet Another Document Translator
5
5
  Project-URL: Homepage, https://github.com/funstory-ai/BabelDOC
6
6
  Project-URL: Issues, https://github.com/funstory-ai/BabelDOC/issues
@@ -0,0 +1 @@
1
+ __version__ = "0.2.14"
@@ -3,7 +3,7 @@ import shutil
3
3
  import subprocess
4
4
  from pathlib import Path
5
5
 
6
- __version__ = "0.2.13"
6
+ __version__ = "0.2.14"
7
7
 
8
8
  CACHE_FOLDER = Path.home() / ".cache" / "babeldoc"
9
9
 
@@ -730,7 +730,12 @@ class PDFCreater:
730
730
  draw_op.append(b" Tj ET Q \n")
731
731
  for xobj in page.pdf_xobject:
732
732
  draw_op = xobj_draw_ops[xobj.xobj_id]
733
- pdf.update_stream(xobj.xref_id, draw_op.tobytes())
733
+ try:
734
+ pdf.update_stream(xobj.xref_id, draw_op.tobytes())
735
+ except Exception:
736
+ logger.warning(
737
+ f"update xref {xobj.xref_id} stream fail, continue"
738
+ )
734
739
  # pdf.update_stream(xobj.xref_id, b'')
735
740
  for rect in page.pdf_rectangle:
736
741
  self._debug_render_rectangle(page_op, rect)
@@ -190,10 +190,10 @@ def start_parse_il(
190
190
  # box[y0:y1, x0:x1] = 0
191
191
  # layout[page.pageno] = box
192
192
  # 新建一个 xref 存放新指令流
193
- page.page_xref = doc_zh.get_new_xref() # hack 插入页面的新 xref
194
- doc_zh.update_object(page.page_xref, "<<>>")
195
- doc_zh.update_stream(page.page_xref, b"")
196
- doc_zh[page.pageno].set_contents(page.page_xref)
193
+ # page.page_xref = doc_zh.get_new_xref() # hack 插入页面的新 xref
194
+ # doc_zh.update_object(page.page_xref, "<<>>")
195
+ # doc_zh.update_stream(page.page_xref, b"")
196
+ # doc_zh[page.pageno].set_contents(page.page_xref)
197
197
  ops_base = interpreter.process_page(page)
198
198
  il_creater.on_page_base_operation(ops_base)
199
199
  il_creater.on_page_end()
@@ -353,6 +353,21 @@ class MemoryMonitor:
353
353
  time.sleep(self.interval)
354
354
 
355
355
 
356
+ def fix_null_xref(doc: Document) -> None:
357
+ """Fix null xref in PDF file by replacing them with empty arrays.
358
+
359
+ Args:
360
+ doc: PyMuPDF Document object to fix
361
+ """
362
+ for i in range(1, doc.xref_length()):
363
+ try:
364
+ obj = doc.xref_object(i)
365
+ if obj == "null":
366
+ doc.update_object(i, "[]")
367
+ except Exception:
368
+ doc.update_object(i, "[]")
369
+
370
+
356
371
  def do_translate(
357
372
  pm: ProgressMonitor, translation_config: TranslationConfig
358
373
  ) -> TranslateResult:
@@ -507,12 +522,14 @@ def _do_translate_single(
507
522
  """Original translation logic for a single document or part"""
508
523
  translation_config.progress_monitor = pm
509
524
  original_pdf_path = translation_config.input_file
510
- doc_input = Document(original_pdf_path)
511
525
  if translation_config.debug:
526
+ doc_input = Document(original_pdf_path)
512
527
  logger.debug("debug mode, save decompressed input pdf")
513
528
  output_path = translation_config.get_working_file_path(
514
529
  "input.decompressed.pdf",
515
530
  )
531
+ # Fix null xref in PDF file
532
+ fix_null_xref(doc_input)
516
533
  doc_input.save(output_path, expand=True, pretty=True)
517
534
 
518
535
  # Continue with original processing
@@ -521,21 +538,7 @@ def _do_translate_single(
521
538
  resfont = "china-ss"
522
539
 
523
540
  # Fix null xref in PDF file
524
- for i in range(1, doc_pdf2zh.xref_length()):
525
- try:
526
- obj = doc_pdf2zh.xref_object(i)
527
- if obj == "null":
528
- ret = doc_pdf2zh.update_object(i, "[]")
529
- if ret != 0:
530
- logger.warning(f"try fix1 xref {i} fail, continue")
531
- else:
532
- logger.info(f"try fix1 xref {i} success")
533
- except Exception:
534
- ret = doc_pdf2zh.update_object(i, "[]")
535
- if ret != 0:
536
- logger.warning(f"try fix2 xref {i} fail, continue")
537
- else:
538
- logger.info(f"try fix2 xref {i} success")
541
+ fix_null_xref(doc_pdf2zh)
539
542
 
540
543
  for page in doc_pdf2zh:
541
544
  page.insert_font(resfont, None)
@@ -543,7 +546,7 @@ def _do_translate_single(
543
546
  resfont = None
544
547
  doc_pdf2zh.save(temp_pdf_path)
545
548
  il_creater = ILCreater(translation_config)
546
- il_creater.mupdf = doc_input
549
+ il_creater.mupdf = doc_pdf2zh
547
550
  xml_converter = XMLConverter()
548
551
  logger.debug(f"start parse il from {temp_pdf_path}")
549
552
  with Path(temp_pdf_path).open("rb") as f:
@@ -578,7 +581,7 @@ def _do_translate_single(
578
581
 
579
582
  # Generate layouts for all pages
580
583
  logger.debug("start generating layouts")
581
- docs = LayoutParser(translation_config).process(docs, doc_input)
584
+ docs = LayoutParser(translation_config).process(docs, doc_pdf2zh)
582
585
  logger.debug("finish generating layouts")
583
586
  if translation_config.debug:
584
587
  xml_converter.write_json(
@@ -634,7 +637,7 @@ def _do_translate_single(
634
637
 
635
638
  if translation_config.watermark_output_mode == WatermarkOutputMode.Both:
636
639
  mono_watermark_first_page_doc_bytes, dual_watermark_first_page_doc_bytes = (
637
- generate_first_page_with_watermark(doc_input, translation_config, docs)
640
+ generate_first_page_with_watermark(doc_pdf2zh, translation_config, docs)
638
641
  )
639
642
 
640
643
  Typesetting(translation_config).typsetting_document(docs)
@@ -22,7 +22,7 @@ from babeldoc.translation_config import TranslationConfig
22
22
  from babeldoc.translation_config import WatermarkOutputMode
23
23
 
24
24
  logger = logging.getLogger(__name__)
25
- __version__ = "0.2.13"
25
+ __version__ = "0.2.14"
26
26
 
27
27
 
28
28
  def create_parser():
@@ -337,14 +337,14 @@ class PDFPageInterpreterEx(PDFPageInterpreter):
337
337
  ops_base = self.render_contents(page.resources, page.contents, ctm=ctm)
338
338
  self.device.fontid = self.fontid
339
339
  self.device.fontmap = self.fontmap
340
- ops_new = self.device.end_page(page)
340
+ _ops_new = self.device.end_page(page)
341
341
  # 上面渲染的时候会根据 cropbox 减掉页面偏移得到真实坐标,这里输出的时候需要用 cm 把页面偏移加回来
342
- self.obj_patch[page.page_xref] = (
343
- # f"q {ops_base}Q 1 0 0 1 {x0} {y0} cm {ops_new}" # ops_base 里可能有图,需要让 ops_new 里的文字覆盖在上面,使用 q/Q 重置位置矩阵
344
- ""
345
- )
346
- for obj in page.contents:
347
- self.obj_patch[obj.objid] = ""
342
+ # self.obj_patch[page.page_xref] = (
343
+ # # f"q {ops_base}Q 1 0 0 1 {x0} {y0} cm {ops_new}" # ops_base 里可能有图,需要让 ops_new 里的文字覆盖在上面,使用 q/Q 重置位置矩阵
344
+ # ""
345
+ # )
346
+ # for obj in page.contents:
347
+ # self.obj_patch[obj.objid] = ""
348
348
  return ops_base
349
349
 
350
350
  def render_contents(
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "BabelDOC"
3
- version = "0.2.13"
3
+ version = "0.2.14"
4
4
  description = "Yet Another Document Translator"
5
5
  license = "AGPL-3.0"
6
6
  readme = "README.md"
@@ -147,7 +147,7 @@ pythonpath = [".", "src"]
147
147
  testpaths = ["tests"]
148
148
 
149
149
  [bumpver]
150
- current_version = "0.2.13"
150
+ current_version = "0.2.14"
151
151
  version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
152
152
 
153
153
  [bumpver.file_patterns]
@@ -48,7 +48,7 @@ wheels = [
48
48
 
49
49
  [[package]]
50
50
  name = "babeldoc"
51
- version = "0.2.13"
51
+ version = "0.2.14"
52
52
  source = { editable = "." }
53
53
  dependencies = [
54
54
  { name = "bitstring" },
@@ -1399,7 +1399,7 @@ wheels = [
1399
1399
 
1400
1400
  [[package]]
1401
1401
  name = "openai"
1402
- version = "1.66.3"
1402
+ version = "1.66.5"
1403
1403
  source = { registry = "https://pypi.org/simple" }
1404
1404
  dependencies = [
1405
1405
  { name = "anyio" },
@@ -1411,9 +1411,9 @@ dependencies = [
1411
1411
  { name = "tqdm" },
1412
1412
  { name = "typing-extensions" },
1413
1413
  ]
1414
- sdist = { url = "https://files.pythonhosted.org/packages/a3/77/5172104ca1df35ed2ed8fb26dbc787f721c39498fc51d666c4db07756a0c/openai-1.66.3.tar.gz", hash = "sha256:8dde3aebe2d081258d4159c4cb27bdc13b5bb3f7ea2201d9bd940b9a89faf0c9", size = 397244 }
1414
+ sdist = { url = "https://files.pythonhosted.org/packages/bb/10/b19dc682c806e6735a8387f2003afe2abada9f9e5227318de642c6949524/openai-1.66.5.tar.gz", hash = "sha256:f61b8fac29490ca8fdc6d996aa6926c18dbe5639536f8c40219c40db05511b11", size = 398595 }
1415
1415
  wheels = [
1416
- { url = "https://files.pythonhosted.org/packages/78/5a/e20182f7b6171642d759c548daa0ba20a1d3ac10d2bd0a13fd75704a9ac3/openai-1.66.3-py3-none-any.whl", hash = "sha256:a427c920f727711877ab17c11b95f1230b27767ba7a01e5b66102945141ceca9", size = 567400 },
1416
+ { url = "https://files.pythonhosted.org/packages/c7/3b/1ba418920ecd1eae7cc4d4ac8a01711ee0879b1a57dd81d10551e5b9a2ea/openai-1.66.5-py3-none-any.whl", hash = "sha256:74be528175f8389f67675830c51a15bd51e874425c86d3de6153bf70ed6c2884", size = 571144 },
1417
1417
  ]
1418
1418
 
1419
1419
  [[package]]
@@ -1594,7 +1594,7 @@ wheels = [
1594
1594
 
1595
1595
  [[package]]
1596
1596
  name = "pre-commit"
1597
- version = "4.1.0"
1597
+ version = "4.2.0"
1598
1598
  source = { registry = "https://pypi.org/simple" }
1599
1599
  dependencies = [
1600
1600
  { name = "cfgv" },
@@ -1603,9 +1603,9 @@ dependencies = [
1603
1603
  { name = "pyyaml" },
1604
1604
  { name = "virtualenv" },
1605
1605
  ]
1606
- sdist = { url = "https://files.pythonhosted.org/packages/2a/13/b62d075317d8686071eb843f0bb1f195eb332f48869d3c31a4c6f1e063ac/pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4", size = 193330 }
1606
+ sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424 }
1607
1607
  wheels = [
1608
- { url = "https://files.pythonhosted.org/packages/43/b3/df14c580d82b9627d173ceea305ba898dca135feb360b6d84019d0803d3b/pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b", size = 220560 },
1608
+ { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707 },
1609
1609
  ]
1610
1610
 
1611
1611
  [[package]]
@@ -1 +0,0 @@
1
- __version__ = "0.2.13"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes