BabelDOC 0.2.4__tar.gz → 0.2.6__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 (91) hide show
  1. {babeldoc-0.2.4 → babeldoc-0.2.6}/PKG-INFO +12 -2
  2. {babeldoc-0.2.4 → babeldoc-0.2.6}/README.md +11 -1
  3. babeldoc-0.2.6/babeldoc/__init__.py +1 -0
  4. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/const.py +1 -1
  5. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/midend/paragraph_finder.py +3 -3
  6. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/translator/translator.py +0 -50
  7. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/main.py +1 -22
  8. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/pdfinterp.py +2 -0
  9. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/progress_monitor.py +5 -1
  10. {babeldoc-0.2.4 → babeldoc-0.2.6}/pyproject.toml +2 -2
  11. {babeldoc-0.2.4 → babeldoc-0.2.6}/uv.lock +1 -1
  12. babeldoc-0.2.4/babeldoc/__init__.py +0 -1
  13. {babeldoc-0.2.4 → babeldoc-0.2.6}/.cursorignore +0 -0
  14. {babeldoc-0.2.4 → babeldoc-0.2.6}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
  15. {babeldoc-0.2.4 → babeldoc-0.2.6}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
  16. {babeldoc-0.2.4 → babeldoc-0.2.6}/.github/dependabot.yml +0 -0
  17. {babeldoc-0.2.4 → babeldoc-0.2.6}/.github/labels.yml +0 -0
  18. {babeldoc-0.2.4 → babeldoc-0.2.6}/.github/release-drafter.yml +0 -0
  19. {babeldoc-0.2.4 → babeldoc-0.2.6}/.github/workflows/codeql.yml +0 -0
  20. {babeldoc-0.2.4 → babeldoc-0.2.6}/.github/workflows/docs.yml +0 -0
  21. {babeldoc-0.2.4 → babeldoc-0.2.6}/.github/workflows/labeler.yml +0 -0
  22. {babeldoc-0.2.4 → babeldoc-0.2.6}/.github/workflows/publish-to-pypi.yml +0 -0
  23. {babeldoc-0.2.4 → babeldoc-0.2.6}/.github/workflows/test.yml +0 -0
  24. {babeldoc-0.2.4 → babeldoc-0.2.6}/.gitignore +0 -0
  25. {babeldoc-0.2.4 → babeldoc-0.2.6}/.pre-commit-config.yaml +0 -0
  26. {babeldoc-0.2.4 → babeldoc-0.2.6}/LICENSE +0 -0
  27. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/assets/assets.py +0 -0
  28. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/assets/embedding_assets_metadata.py +0 -0
  29. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/asynchronize/__init__.py +0 -0
  30. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/converter.py +0 -0
  31. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/__init__.py +0 -0
  32. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/babeldoc_exception/BabelDOCException.py +0 -0
  33. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/backend/__init__.py +0 -0
  34. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/backend/pdf_creater.py +0 -0
  35. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/frontend/__init__.py +0 -0
  36. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/frontend/il_creater.py +0 -0
  37. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/il_version_1.py +0 -0
  38. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/il_version_1.rnc +0 -0
  39. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/il_version_1.rng +0 -0
  40. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/il_version_1.xsd +0 -0
  41. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/midend/__init__.py +0 -0
  42. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/midend/add_debug_information.py +0 -0
  43. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/midend/detect_scanned_file.py +0 -0
  44. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/midend/il_translator.py +0 -0
  45. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/midend/il_translator_llm_only.py +0 -0
  46. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/midend/layout_parser.py +0 -0
  47. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/midend/remove_descent.py +0 -0
  48. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/midend/styles_and_formulas.py +0 -0
  49. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/midend/typesetting.py +0 -0
  50. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/translator/__init__.py +0 -0
  51. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/translator/cache.py +0 -0
  52. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/utils/fontmap.py +0 -0
  53. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/utils/layout_helper.py +0 -0
  54. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/utils/style_helper.py +0 -0
  55. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/document_il/xml_converter.py +0 -0
  56. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/docvision/README.md +0 -0
  57. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/docvision/__init__.py +0 -0
  58. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/docvision/doclayout.py +0 -0
  59. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/docvision/rpc_doclayout.py +0 -0
  60. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/high_level.py +0 -0
  61. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/tools/generate_font_metadata.py +0 -0
  62. {babeldoc-0.2.4 → babeldoc-0.2.6}/babeldoc/translation_config.py +0 -0
  63. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/CODE_OF_CONDUCT.md +0 -0
  64. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/CONTRIBUTING.md +0 -0
  65. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/CONTRIBUTOR_REWARD.md +0 -0
  66. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
  67. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
  68. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
  69. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
  70. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
  71. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/ImplementationDetails/README.md +0 -0
  72. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
  73. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
  74. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/README.md +0 -0
  75. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/deploy.sh +0 -0
  76. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-banner.png +0 -0
  77. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
  78. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
  79. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
  80. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
  81. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-big-logo.png +0 -0
  82. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-contributor_reward_example.png +0 -0
  83. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-preview.gif +0 -0
  84. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
  85. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
  86. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/images/babeldoc-small-logo.png +0 -0
  87. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/index.md +0 -0
  88. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/intro-to-pdf-object.md +0 -0
  89. {babeldoc-0.2.4 → babeldoc-0.2.6}/docs/requirements.txt +0 -0
  90. {babeldoc-0.2.4 → babeldoc-0.2.6}/mkdocs.yml +0 -0
  91. {babeldoc-0.2.4 → babeldoc-0.2.6}/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.4
3
+ Version: 0.2.6
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
@@ -138,6 +138,16 @@ uv run babeldoc --files example.pdf --files example2.pdf --openai --openai-model
138
138
 
139
139
  ## Advanced Options
140
140
 
141
+ > [!NOTE]
142
+ > This CLI is mainly for debugging purposes. Although end users can use this CLI to translate files, we do not provide any technical support for this purpose.
143
+ >
144
+ > End users should directly use **Online Service**: Beta version launched [Immersive Translate - BabelDOC](https://app.immersivetranslate.com/babel-doc/) 1000 free pages per month.
145
+ >
146
+ > End users who need self-deployment should use [PDFMathTranslate](https://github.com/Byaidu/PDFMathTranslate)
147
+ >
148
+ > If you find that an option is not listed below, it means that this option is a debugging option for maintainers. Please do not use these options.
149
+
150
+
141
151
  ### Language Options
142
152
 
143
153
  - `--lang-in`, `-li`: Source language code (default: en)
@@ -181,7 +191,7 @@ uv run babeldoc --files example.pdf --files example2.pdf --openai --openai-model
181
191
 
182
192
  > [!TIP]
183
193
  >
184
- > 1. You must specify one translation service among `--openai`.
194
+ > 1. Currently, only OpenAI-compatible LLM is supported. For more translator support, please use [PDFMathTranslate](https://github.com/Byaidu/PDFMathTranslate).
185
195
  > 2. It is recommended to use models with strong compatibility with OpenAI, such as: `glm-4-flash`, `deepseek-chat`, etc.
186
196
  > 3. Currently, it has not been optimized for traditional translation engines like Bing/Google, it is recommended to use LLMs.
187
197
 
@@ -100,6 +100,16 @@ uv run babeldoc --files example.pdf --files example2.pdf --openai --openai-model
100
100
 
101
101
  ## Advanced Options
102
102
 
103
+ > [!NOTE]
104
+ > This CLI is mainly for debugging purposes. Although end users can use this CLI to translate files, we do not provide any technical support for this purpose.
105
+ >
106
+ > End users should directly use **Online Service**: Beta version launched [Immersive Translate - BabelDOC](https://app.immersivetranslate.com/babel-doc/) 1000 free pages per month.
107
+ >
108
+ > End users who need self-deployment should use [PDFMathTranslate](https://github.com/Byaidu/PDFMathTranslate)
109
+ >
110
+ > If you find that an option is not listed below, it means that this option is a debugging option for maintainers. Please do not use these options.
111
+
112
+
103
113
  ### Language Options
104
114
 
105
115
  - `--lang-in`, `-li`: Source language code (default: en)
@@ -143,7 +153,7 @@ uv run babeldoc --files example.pdf --files example2.pdf --openai --openai-model
143
153
 
144
154
  > [!TIP]
145
155
  >
146
- > 1. You must specify one translation service among `--openai`.
156
+ > 1. Currently, only OpenAI-compatible LLM is supported. For more translator support, please use [PDFMathTranslate](https://github.com/Byaidu/PDFMathTranslate).
147
157
  > 2. It is recommended to use models with strong compatibility with OpenAI, such as: `glm-4-flash`, `deepseek-chat`, etc.
148
158
  > 3. Currently, it has not been optimized for traditional translation engines like Bing/Google, it is recommended to use LLMs.
149
159
 
@@ -0,0 +1 @@
1
+ __version__ = "0.2.6"
@@ -3,7 +3,7 @@ import shutil
3
3
  import subprocess
4
4
  from pathlib import Path
5
5
 
6
- __version__ = "0.2.4"
6
+ __version__ = "0.2.6"
7
7
 
8
8
  CACHE_FOLDER = Path.home() / ".cache" / "babeldoc"
9
9
 
@@ -29,7 +29,7 @@ class ParagraphFinder:
29
29
 
30
30
  # 定义项目符号的正则表达式模式
31
31
  BULLET_POINT_PATTERN = re.compile(
32
- r"[•⚫⬤◆◇○●◦‣⁃▪▫∗†‡¹²³⁴⁵⁶⁷⁸⁹⁰₁₂₃₄₅₆₇₈₉₀ᵃᵇᶜᵈᵉᶠᵍʰⁱʲᵏˡᵐⁿᵒᵖᵍʳˢᵗᵘᵛʷˣʸᶻ†‡§¶※⁑⁂⁕⁎⁜⁑❧☙⁋‖‽]"
32
+ r"[■•⚫⬤◆◇○●◦‣⁃▪▫∗†‡¹²³⁴⁵⁶⁷⁸⁹⁰₁₂₃₄₅₆₇₈₉₀ᵃᵇᶜᵈᵉᶠᵍʰⁱʲᵏˡᵐⁿᵒᵖᵍʳˢᵗᵘᵛʷˣʸᶻ†‡§¶※⁑⁂⁕⁎⁜⁑❧☙⁋‖‽]"
33
33
  )
34
34
 
35
35
  def __init__(self, translation_config: TranslationConfig):
@@ -417,7 +417,7 @@ class ParagraphFinder:
417
417
  ),
418
418
  unicode="",
419
419
  debug_id=generate_base58_id(),
420
- layout_label=prev_composition.layout_label,
420
+ layout_label=paragraph.layout_label,
421
421
  )
422
422
  # 更新原段落
423
423
  paragraph.pdf_paragraph_composition = (
@@ -446,7 +446,7 @@ class ParagraphFinder:
446
446
  ),
447
447
  unicode="",
448
448
  debug_id=generate_base58_id(),
449
- layout_label=prev_composition.layout_label,
449
+ layout_label=paragraph.layout_label,
450
450
  )
451
451
  # 更新原段落
452
452
  paragraph.pdf_paragraph_composition = (
@@ -6,7 +6,6 @@ import unicodedata
6
6
  from abc import ABC
7
7
  from abc import abstractmethod
8
8
 
9
- import httpx
10
9
  import openai
11
10
  from tenacity import retry
12
11
  from tenacity import retry_if_exception_type
@@ -260,52 +259,3 @@ class OpenAITranslator(BaseTranslator):
260
259
 
261
260
  def get_rich_text_right_placeholder(self, placeholder_id: int):
262
261
  return self.get_formular_placeholder(placeholder_id + 1)
263
-
264
-
265
- class TranslateTranslator(BaseTranslator):
266
- # https://github.com/openai/openai-python
267
- name = "openai"
268
-
269
- def __init__(
270
- self,
271
- lang_in,
272
- lang_out,
273
- url=None,
274
- ignore_cache=False,
275
- ):
276
- super().__init__(lang_in, lang_out, ignore_cache)
277
- self.client = httpx.Client()
278
- self.url = url
279
-
280
- def do_translate(self, text) -> str:
281
- response = self.client.post(
282
- self.url,
283
- json={
284
- "text": [text],
285
- "src": "Englih",
286
- "tgt": "Simplifed Chinese",
287
- },
288
- )
289
- return response.json()["text"][0]
290
-
291
- def prompt(self, text):
292
- return [
293
- {
294
- "role": "system",
295
- "content": "You are a professional,authentic machine translation engine.",
296
- },
297
- {
298
- "role": "user",
299
- "content": f";; Treat next line as plain text input and translate it into {self.lang_out}, output translation ONLY. If translation is unnecessary (e.g. proper nouns, codes, {'{{1}}, etc. '}), return the original text. NO explanations. NO notes. Input:\n\n{text}",
300
- },
301
- ]
302
-
303
- def get_formular_placeholder(self, placeholder_id: int):
304
- return "{{v" + str(placeholder_id) + "}}"
305
- return "{{" + str(placeholder_id) + "}}"
306
-
307
- def get_rich_text_left_placeholder(self, placeholder_id: int):
308
- return self.get_formular_placeholder(placeholder_id)
309
-
310
- def get_rich_text_right_placeholder(self, placeholder_id: int):
311
- return self.get_formular_placeholder(placeholder_id + 1)
@@ -15,7 +15,6 @@ from rich.progress import TimeRemainingColumn
15
15
  import babeldoc.assets.assets
16
16
  import babeldoc.high_level
17
17
  from babeldoc.document_il.translator.translator import OpenAITranslator
18
- from babeldoc.document_il.translator.translator import TranslateTranslator
19
18
  from babeldoc.document_il.translator.translator import set_translate_rate_limiter
20
19
  from babeldoc.docvision.doclayout import DocLayoutModel
21
20
  from babeldoc.docvision.rpc_doclayout import RpcDocLayoutModel
@@ -23,7 +22,7 @@ from babeldoc.translation_config import TranslationConfig
23
22
  from babeldoc.translation_config import WatermarkOutputMode
24
23
 
25
24
  logger = logging.getLogger(__name__)
26
- __version__ = "0.2.4"
25
+ __version__ = "0.2.6"
27
26
 
28
27
 
29
28
  def create_parser():
@@ -194,11 +193,6 @@ def create_parser():
194
193
  action="store_true",
195
194
  help="Use OpenAI translator.",
196
195
  )
197
- service_group.add_argument(
198
- "--translate",
199
- action="store_true",
200
- help="Use translate translator.",
201
- )
202
196
  service_group = parser.add_argument_group(
203
197
  "Translation - OpenAI Options",
204
198
  description="OpenAI specific options",
@@ -217,14 +211,6 @@ def create_parser():
217
211
  "-k",
218
212
  help="The API key for the OpenAI API.",
219
213
  )
220
- service_group = parser.add_argument_group(
221
- "Translation - Translate Options",
222
- description="Translate specific options",
223
- )
224
- service_group.add_argument(
225
- "--translate-url",
226
- help="The base URL for the Translation API.",
227
- )
228
214
 
229
215
  return parser
230
216
 
@@ -273,13 +259,6 @@ async def main():
273
259
  api_key=args.openai_api_key,
274
260
  ignore_cache=args.ignore_cache,
275
261
  )
276
- elif args.translate:
277
- translator = TranslateTranslator(
278
- lang_in=args.lang_in,
279
- lang_out=args.lang_out,
280
- ignore_cache=args.ignore_cache,
281
- url=args.translate_url,
282
- )
283
262
  else:
284
263
  raise ValueError("Invalid translator type")
285
264
 
@@ -203,6 +203,7 @@ class PDFPageInterpreterEx(PDFPageInterpreter):
203
203
  if settings.STRICT:
204
204
  raise PDFInterpreterError("No colorspace specified!")
205
205
  n = 1
206
+ n = len(self.argstack)
206
207
  args = self.pop(n)
207
208
  self.il_creater.on_passthrough_per_char("SCN", args)
208
209
  self.graphicstate.scolor = cast(Color, args)
@@ -216,6 +217,7 @@ class PDFPageInterpreterEx(PDFPageInterpreter):
216
217
  if settings.STRICT:
217
218
  raise PDFInterpreterError("No colorspace specified!")
218
219
  n = 1
220
+ n = len(self.argstack)
219
221
  args = self.pop(n)
220
222
  self.il_creater.on_passthrough_per_char("scn", args)
221
223
  self.graphicstate.ncolor = cast(Color, args)
@@ -148,10 +148,14 @@ class ProgressMonitor:
148
148
  if report_time_delta < self.report_interval and stage.total > 3:
149
149
  return
150
150
  if self.progress_change_callback:
151
+ if stage.total != 0:
152
+ stage_progress = stage.current * 100 / stage.total
153
+ else:
154
+ stage_progress = 100
151
155
  self.progress_change_callback(
152
156
  type="progress_update",
153
157
  stage=stage.display_name,
154
- stage_progress=stage.current * 100 / stage.total,
158
+ stage_progress=stage_progress,
155
159
  stage_current=stage.current,
156
160
  stage_total=stage.total,
157
161
  overall_progress=self.calculate_current_progress(stage),
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "BabelDOC"
3
- version = "0.2.4"
3
+ version = "0.2.6"
4
4
  description = "Yet Another Document Translator"
5
5
  license = "AGPL-3.0"
6
6
  readme = "README.md"
@@ -136,7 +136,7 @@ pythonpath = [".", "src"]
136
136
  testpaths = ["tests"]
137
137
 
138
138
  [bumpver]
139
- current_version = "0.2.4"
139
+ current_version = "0.2.6"
140
140
  version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
141
141
 
142
142
  [bumpver.file_patterns]
@@ -48,7 +48,7 @@ wheels = [
48
48
 
49
49
  [[package]]
50
50
  name = "babeldoc"
51
- version = "0.2.4"
51
+ version = "0.2.6"
52
52
  source = { editable = "." }
53
53
  dependencies = [
54
54
  { name = "bitstring" },
@@ -1 +0,0 @@
1
- __version__ = "0.2.4"
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
File without changes
File without changes