retab 0.0.41__py3-none-any.whl → 0.0.42__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.
@@ -3,6 +3,7 @@ from pydantic import BaseModel, Field
3
3
 
4
4
  from ..mime import MIMEData, BaseMIMEData
5
5
  from ..browser_canvas import BrowserCanvas
6
+ from ..ai_models import LLMModel
6
7
 
7
8
  TableParsingFormat = Literal["markdown", "yaml", "html", "json"]
8
9
 
@@ -18,7 +19,7 @@ class ParseRequest(BaseModel):
18
19
  """Request model for document parsing."""
19
20
 
20
21
  document: MIMEData = Field(..., description="Document to parse")
21
- fast_mode: bool = Field(default=False, description="Use fast mode for parsing (may reduce quality)")
22
+ model: LLMModel = Field(default="gemini-2.5-flash", description="Model to use for parsing")
22
23
  table_parsing_format: TableParsingFormat = Field(default="html", description="Format for parsing tables")
23
24
  image_resolution_dpi: int = Field(default=72, description="DPI for image processing")
24
25
  browser_canvas: BrowserCanvas = Field(default="A4", description="Canvas size for document rendering")
@@ -30,3 +31,4 @@ class ParseResult(BaseModel):
30
31
  document: BaseMIMEData = Field(..., description="Processed document metadata")
31
32
  usage: RetabUsage = Field(..., description="Processing usage information")
32
33
  pages: list[str] = Field(..., description="Text content of each page")
34
+ text: str = Field(..., description="Text content of the document")
@@ -3,13 +3,19 @@ from typing import Any, Literal, Optional
3
3
 
4
4
  import nanoid # type: ignore
5
5
  from openai.types.chat import ChatCompletion
6
- from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
6
+ from openai.types.chat.chat_completion_reasoning_effort import (
7
+ ChatCompletionReasoningEffort,
8
+ )
7
9
  from pydantic import BaseModel, Field, computed_field, model_validator
8
10
 
9
11
  from retab.types.chat import ChatCompletionRetabMessage
10
12
  from retab.types.documents.extractions import RetabParsedChatCompletion
11
13
 
12
- from ..utils.usage.usage import CostBreakdown, compute_cost_from_model, compute_cost_from_model_with_breakdown
14
+ from ..utils.usage.usage import (
15
+ CostBreakdown,
16
+ compute_cost_from_model,
17
+ compute_cost_from_model_with_breakdown,
18
+ )
13
19
  from .ai_models import Amount
14
20
  from .modalities import Modality
15
21
 
@@ -17,9 +23,18 @@ ValidationsState = Literal["pending", "validated", "invalid"]
17
23
 
18
24
 
19
25
  class ExtractionSource(BaseModel):
20
- type: Literal["api", "annotation", "processor", "automation.link", "automation.mailbox", "automation.cron", "automation.outlook", "automation.endpoint", "schema.extract"] = (
21
- Field(description="Type of extraction")
22
- )
26
+ type: Literal[
27
+ "api",
28
+ "annotation",
29
+ "processor",
30
+ "automation",
31
+ "automation.link",
32
+ "automation.mailbox",
33
+ "automation.cron",
34
+ "automation.outlook",
35
+ "automation.endpoint",
36
+ "schema.extract",
37
+ ] = Field(description="Type of extraction")
23
38
  id: str | None = Field(default=None, description="ID the trigger of the extraction")
24
39
 
25
40
 
@@ -34,7 +49,10 @@ class ExtractionTimingStep(BaseModel):
34
49
 
35
50
 
36
51
  class Extraction(BaseModel):
37
- id: str = Field(default_factory=lambda: "extr_" + nanoid.generate(), description="Unique identifier of the analysis")
52
+ id: str = Field(
53
+ default_factory=lambda: "extr_" + nanoid.generate(),
54
+ description="Unique identifier of the analysis",
55
+ )
38
56
  messages: list[ChatCompletionRetabMessage] = Field(default_factory=list)
39
57
  messages_gcs: str = Field(..., description="GCS path to the messages")
40
58
  file_gcs_paths: list[str] = Field(..., description="GCS paths to the files")
@@ -51,16 +69,23 @@ class Extraction(BaseModel):
51
69
  source: ExtractionSource = Field(..., description="Source of the extraction")
52
70
  image_resolution_dpi: int = Field(default=96, description="Resolution of the image sent to the LLM")
53
71
  browser_canvas: BrowserCanvas = Field(
54
- default="A4", description="Sets the size of the browser canvas for rendering documents in browser-based processing. Choose a size that matches the document type."
72
+ default="A4",
73
+ description="Sets the size of the browser canvas for rendering documents in browser-based processing. Choose a size that matches the document type.",
55
74
  )
56
75
  modality: Modality = Field(default="native", description="Modality of the extraction")
57
- reasoning_effort: Optional[ChatCompletionReasoningEffort] = Field(default=None, description="The effort level for the model to reason about the input data.")
76
+ reasoning_effort: Optional[ChatCompletionReasoningEffort] = Field(
77
+ default=None,
78
+ description="The effort level for the model to reason about the input data.",
79
+ )
58
80
  timings: list[ExtractionTimingStep] = Field(default_factory=list, description="Timings of the extraction")
59
81
 
60
82
  # Infered from the schema
61
83
  schema_id: str = Field(..., description="Version of the schema used for the analysis")
62
84
  schema_data_id: str = Field(..., description="Version of the schema data used for the analysis")
63
- created_at: datetime.datetime = Field(default_factory=lambda: datetime.datetime.now(datetime.timezone.utc), description="Timestamp of the creation of the extraction object")
85
+ created_at: datetime.datetime = Field(
86
+ default_factory=lambda: datetime.datetime.now(datetime.timezone.utc),
87
+ description="Timestamp of the creation of the extraction object",
88
+ )
64
89
  request_at: datetime.datetime | None = Field(default=None, description="Timestamp of the extraction request if provided.")
65
90
  organization_id: str = Field(..., description="Organization ID of the user or application")
66
91
  validation_state: Optional[ValidationsState] = Field(default=None, description="Validation state of the extraction")
@@ -0,0 +1,119 @@
1
+ Metadata-Version: 2.1
2
+ Name: retab
3
+ Version: 0.0.42
4
+ Summary: Retab official python library
5
+ Home-page: https://github.com/Retab-dev/retab
6
+ Author: Retab
7
+ Author-email: contact@retab.com
8
+ Project-URL: Team website, https://retab.com
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Operating System :: POSIX :: Linux
12
+ Classifier: Operating System :: MacOS
13
+ Classifier: Intended Audience :: Science/Research
14
+ Requires-Python: >=3.6
15
+ Description-Content-Type: text/markdown
16
+ Requires-Dist: Pillow
17
+ Requires-Dist: httpx
18
+ Requires-Dist: pydantic
19
+ Requires-Dist: pydantic-core
20
+ Requires-Dist: requests
21
+ Requires-Dist: tqdm
22
+ Requires-Dist: types-tqdm
23
+ Requires-Dist: backoff
24
+ Requires-Dist: termplotlib
25
+ Requires-Dist: Levenshtein
26
+ Requires-Dist: pandas
27
+ Requires-Dist: numpy
28
+ Requires-Dist: motor
29
+ Requires-Dist: rich
30
+ Requires-Dist: puremagic
31
+ Requires-Dist: pycountry
32
+ Requires-Dist: phonenumbers
33
+ Requires-Dist: email-validator
34
+ Requires-Dist: python-stdnum
35
+ Requires-Dist: nanoid
36
+ Requires-Dist: openai
37
+ Requires-Dist: google-genai
38
+ Requires-Dist: google-generativeai
39
+ Requires-Dist: anthropic
40
+ Requires-Dist: tiktoken
41
+ Requires-Dist: truststore
42
+ Requires-Dist: ruff
43
+
44
+ # Retab
45
+
46
+ <div align="center" style="margin-bottom: 1em;">
47
+
48
+ <img src="https://raw.githubusercontent.com/Retab-dev/retab/refs/heads/main/assets/retab-logo.png" alt="Retab Logo" width="150">
49
+
50
+
51
+ *The AI Automation Platform*
52
+
53
+ Made with love by the team at [Retab](https://retab.com) 🤍.
54
+
55
+ [Our Website](https://retab.com) | [Documentation](https://docs.retab.com/get-started/introduction) | [Discord](https://discord.com/invite/vc5tWRPqag) | [Twitter](https://x.com/retabdev)
56
+
57
+
58
+ </div>
59
+
60
+ ---
61
+
62
+ ### What is Retab?
63
+
64
+ Retab solves all the major challenges in document processing with LLMs:
65
+
66
+ 1. **Universal Document Preprocessing**: Convert any file type (PDFs, Excel, emails, etc.) into LLM-ready format without writing custom parsers
67
+ 2. **Structured, Schema-driven Extraction**: Get consistent, reliable outputs using schema-based prompt engineering
68
+ 3. **Processors**: Publish a live, stable, shareable document processor.
69
+ 4. **Automations**: Create document processing workflows that can be triggered by events (mailbox, upload link, endpoint, outlook plugin).
70
+ 5. **Evaluations**: Evaluate the performance of models against annotated datasets
71
+ 6. **Optimizations**: Identify the most used processors and help you finetune models to reduce costs and improve performance
72
+
73
+ We are offering you all the software-defined primitives to build your own document processing solutions. We see it as **Stripe** for document processing.
74
+
75
+ Our goal is to make the process of analyzing documents and unstructured data as **easy** and **transparent** as possible.
76
+
77
+ **A new, lighter paradigm**
78
+ Large Language Models collapse entire layers of legacy OCR pipelines into a single, elegant abstraction. When a model can read, reason, and structure text natively, we no longer need brittle heuristics, handcrafted parsers, or heavyweight ETL jobs. Instead, we can expose a small, principled API: "give me the document, tell me the schema, and get back structured truth." Complexity evaporates, reliability rises, speed follows, and costs fall—because every component you remove is one that can no longer break. LLM‑first design lets us focus less on plumbing and more on the questions we actually want answered.
79
+
80
+ Many people haven't yet realized how powerful LLMs have become at document processing tasks - we're here to help **unlock these capabilities**.
81
+
82
+ ---
83
+
84
+ ## Go further
85
+
86
+ * [Quickstart](/get-started/quickstart)
87
+ * [API Reference](/api-reference/introduction)
88
+
89
+ ---
90
+
91
+ ## Code examples
92
+
93
+ ## You can check our Github repository to see code examples: [python examples](https://github.com/Retab-dev/retab/tree/main/examples) and [jupyter notebooks](https://github.com/Retab-dev/retab-nodejs/tree/main/notebooks).
94
+
95
+ ## Community
96
+
97
+ Let's create the future of document processing together!
98
+
99
+ Join our [discord community](https://discord.com/invite/vc5tWRPqag) to share tips, discuss best practices, and showcase what you build. Or just [tweet](https://x.com/retabdev) at us.
100
+
101
+ We can't wait to see how you'll use Retab.
102
+
103
+ * [Discord](https://discord.com/invite/vc5tWRPqag)
104
+ * [Twitter](https://x.com/retabdev)
105
+
106
+ ---
107
+
108
+ ## Roadmap
109
+
110
+ We share our roadmap publicly on [Github](https://github.com/Retab-dev/retab)
111
+
112
+ Among the features we're working on:
113
+
114
+ * [ ] Node.js SDK
115
+ * [ ] Low-level speed optimizations for Evals Frontend
116
+ * [ ] Schema optimization autopilot
117
+ * [ ] Sources API
118
+ * [ ] Parse API for RAG
119
+
@@ -1,6 +1,6 @@
1
1
  retab/__init__.py,sha256=sRurau6z8m4pn7VFKdHr9FyNA9Ffhvg064i2NF0RmPc,124
2
2
  retab/_resource.py,sha256=JfAU4UTa05ugWfbrpO7fsVr_pFewht99NkoIfK6kBQM,577
3
- retab/client.py,sha256=ebU_g0BfIJ6Lz-XsHjlMtomTBy4V_lDDgLTC0AYzDZE,29768
3
+ retab/client.py,sha256=gbBSkOWbXLoYXwRGXkhubBeIxAecVHvW_3b9ELNSE2Q,29768
4
4
  retab/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  retab/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  retab/_utils/ai_models.py,sha256=u0SDwSd3SNhJaFm6bPepiGIh4BbocGYDKk4qu3kVIxc,4821
@@ -31,26 +31,26 @@ retab/resources/usage.py,sha256=OmJMPwmP1TBuZmMKrjaGWnl2mQ9VbQDKSAm6l7Tsaf4,1360
31
31
  retab/resources/consensus/__init__.py,sha256=0b3MSOFiYPwkNTrs_dBPRhwSl3kuk8BtG5QXofIUb9M,89
32
32
  retab/resources/consensus/client.py,sha256=D2TeqqCp0ZvqvQLAe1i3nW8nnf-Ms6zNEXRA9C26TQI,3705
33
33
  retab/resources/consensus/completions.py,sha256=6vTnqADY6GueV28smYRDQ2yooj94G2WHMlQLyKOXqtw,8372
34
- retab/resources/consensus/completions_stream.py,sha256=JQdOsWunY60nNSsrz3V4SA6OUXx_IxRsKjg1fjq2QSs,10893
34
+ retab/resources/consensus/completions_stream.py,sha256=DlU9od01F1Fmh9WjTLhq4KsntfqXy5jGGwrYauS43Ec,10893
35
35
  retab/resources/consensus/responses.py,sha256=av__D_3hs8GlV7RnBnrLmtjq6_DzbWwfSP8lzjiHlw8,9935
36
36
  retab/resources/consensus/responses_stream.py,sha256=OopJ9aoO7HctfhLnXzJx8-dkk-4jK_juOw6jUAkzwVM,11671
37
37
  retab/resources/documents/__init__.py,sha256=OjXmngFN0RKqO4SI-mJBNzr6Ex6rMxfq0DxaqzP0RQs,89
38
- retab/resources/documents/client.py,sha256=K1G63fRdd5T-HjmYsoW-6V7hXT8o9L2F15qIGBfWC5c,25361
38
+ retab/resources/documents/client.py,sha256=fTaNecDke_fGEcqQIcTJcGZDKhSMWgZl2bxc6W48oOg,25295
39
39
  retab/resources/documents/extractions.py,sha256=jMBgirKohgMTsdwX-LQldmvgHVHt-Q2N5810K1tzk9Q,25623
40
40
  retab/resources/evaluations/__init__.py,sha256=3npbUDbxYn3ihnUKV7PRYNBYqL7MZ9AwhQHr7LaIESg,97
41
41
  retab/resources/evaluations/client.py,sha256=SdI-m_8V0BApparlHO1mYFwvjAGWsHBKD_-Z3ZLcdq0,10658
42
42
  retab/resources/evaluations/documents.py,sha256=G58AYRpmlGRspwuunwhWB_cqN_Zn5Ukp_f2NAMyxMi4,9489
43
43
  retab/resources/evaluations/iterations.py,sha256=v9kD1tJ-3I0A02zVIwSInKHwPzGhmub7fc5FEBJkT74,17664
44
44
  retab/resources/processors/__init__.py,sha256=w1HrMdSi3xlrcEDFMQ9BA7rbUhOFWSTkTKkkR2PfFHQ,93
45
- retab/resources/processors/client.py,sha256=s5OddrzUF-kue8-58jbwOfN4a5yk3dgtpMCnlpPjlPU,20710
45
+ retab/resources/processors/client.py,sha256=EMu7VlniDePhPvlCryGwXWaG2wketLA6vz8JUFs8U0A,20710
46
46
  retab/resources/processors/automations/__init__.py,sha256=Iej-_yIxc8xAuhYmR0e2VI7j_EXVsNk1_L98OJSD82E,121
47
47
  retab/resources/processors/automations/client.py,sha256=3w54F0JfC2GYDosLux8LVEjDd_RXqQ29-SyNXGa28U8,10500
48
- retab/resources/processors/automations/endpoints.py,sha256=EulA5993Kj42uAhcWbnZdYwF5ppColOlOIW0Pz1Ujnc,10895
49
- retab/resources/processors/automations/links.py,sha256=HBfpouFBxwjIyDWHyG15XwYRC2lLJLkcywmTUnjQcPI,11449
50
- retab/resources/processors/automations/logs.py,sha256=Ft0cH6C2zbm4dLdiQ-3hqC8HU8-23bGOjUGbaauDNAU,8827
51
- retab/resources/processors/automations/mailboxes.py,sha256=PAZzkchZdekyesJxo42GGjrCvimUvGfv8E3dBYvjql8,15907
52
- retab/resources/processors/automations/outlook.py,sha256=Zj_sVxpDLCNxh1xaTAZ6GMGd26KtFo7QXrmalUpi4xA,14919
53
- retab/resources/processors/automations/tests.py,sha256=9LDZltHgHOOoJT1apkvB_aaM96WlzCDPtsoyMN3UWrA,5991
48
+ retab/resources/processors/automations/endpoints.py,sha256=9ur3OR1b-gKaM4JqiQVaWUS0DmkfNvYgbi_TkbyoXQ4,11046
49
+ retab/resources/processors/automations/links.py,sha256=LXOnDlaei07MRIc5KfxhCS5QikE8g0uptuYFeimXFPg,11449
50
+ retab/resources/processors/automations/logs.py,sha256=seBjzv4Tm8fMJcApzZcyR5yXG5YLP0yW5BH5ql7JMcg,8827
51
+ retab/resources/processors/automations/mailboxes.py,sha256=7TQcUDM9iX_E_Yg_r2l59Jxf-1p30bx4jTMY-rgD5MQ,16155
52
+ retab/resources/processors/automations/outlook.py,sha256=ANX0MftT4VQt8ehZkhN1xpaccph9pDNXYLbO2WW3wsw,15189
53
+ retab/resources/processors/automations/tests.py,sha256=nbO6qIkQnpr629ZkCchbfCJOm7KyjDOaLsxXxB3i0cg,6219
54
54
  retab/resources/secrets/__init__.py,sha256=SwofMyk96k0YSyj1d_GRxhpVx4wb4TA97TISsTjB0Kc,105
55
55
  retab/resources/secrets/client.py,sha256=nXt1cgvkWqhA99WTnC1PWbWJq-EbwvoDuCQOa0GJOOU,599
56
56
  retab/resources/secrets/external_api_keys.py,sha256=3TuJxjk65EPUT2XC3wBcYWaVwqzc6QGv9BoHufzxTLU,3759
@@ -63,7 +63,7 @@ retab/types/completions.py,sha256=ZQU29bm-FhdOzky4_Dp2N--fedR82C3QfCRZCJCQ-P8,53
63
63
  retab/types/consensus.py,sha256=EsFCsyZK8NhkQ1BizFpnGN54D24hRFKc0xwt9VpH11c,1161
64
64
  retab/types/evals.py,sha256=JNdWu4hplfSEuSzu9l27ZVr2RO2opUKEruIpKXZosmU,9953
65
65
  retab/types/events.py,sha256=NrisdzJAaJ_kkfgdsqoiDB-Upm0LnbIGZikU_e9XXWw,2195
66
- retab/types/extractions.py,sha256=3l-RW9iUUVHqWBnbfoUO7I3VREAJdDqHUQaNAJ0NKR8,5849
66
+ retab/types/extractions.py,sha256=Pvzu2Bu62X6P055xDj6Du8kf_ilJBiyeYl_uN5GfGVw,6038
67
67
  retab/types/inference_settings.py,sha256=F_mBPFVY1yAwsHD11Z2ljMf3zkvviOey_JBnu8yEF84,572
68
68
  retab/types/logs.py,sha256=uWgul1YpbczzWozuVnBWuVMm6NAZElSE1rXs_O8A98s,9260
69
69
  retab/types/metrics.py,sha256=0KEWUWW13s_tWjh7oUs33ip9TPwI7LZUNGE7k5qNoOo,1947
@@ -76,7 +76,7 @@ retab/types/automations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
76
76
  retab/types/automations/cron.py,sha256=jDx0VzciboQw2_whvBXzgX5ZS0z2DksTgmyhXCSSGMk,3174
77
77
  retab/types/automations/endpoints.py,sha256=IbylkBUBllcrtr9tifug0ptVq2vFKixuQ6e2JfW5Xfw,666
78
78
  retab/types/automations/links.py,sha256=1ipBFWasY3cqds0U5AUz9Ez6T5kcgzX5r0gzZvFw8tU,901
79
- retab/types/automations/mailboxes.py,sha256=KZh2BiQ8Q-HgNQT672Sl97LDnqW2sgjY_W3ZEj7o4Ow,2332
79
+ retab/types/automations/mailboxes.py,sha256=3LDmEZO1RtsNq-5Q7jVjfTo7o92rYK-UH56Ja-dKJ9Q,2332
80
80
  retab/types/automations/outlook.py,sha256=4rJ-_1Py88n44ASdWJHpb0_V5VKafP7pj67ovi6iYwU,3040
81
81
  retab/types/automations/webhooks.py,sha256=_IY33_RL8ULYmKW7vYbCXLCEmsrKzM9SmwdPyv6LfwM,571
82
82
  retab/types/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -85,8 +85,8 @@ retab/types/db/files.py,sha256=udJKGplw6a8cF4XUTLN_QAU9-pyEWs4THHX1zyvbx0U,1261
85
85
  retab/types/documents/__init__.py,sha256=RaD6PnvRJw7QEVTh_PYNX6gckpLcxUJH7FKaopRKJzY,114
86
86
  retab/types/documents/correct_orientation.py,sha256=e-ivsslI6L6Gl0YkcslXw_DH620xMGEYVp4tdeviXeM,261
87
87
  retab/types/documents/create_messages.py,sha256=S2nJ4GHZ3hKTZ4kNs5XrCZeaokOsy9LqRC-FVHkFvSY,10285
88
- retab/types/documents/extractions.py,sha256=TyxUmkDbP-OB2LlC6gB5PkJ_z5cyq7atsS2EWKlJ8z0,19112
89
- retab/types/documents/parse.py,sha256=WCfwBUsMgYFAZWbuOgCPd2dkcFmi1fYOf21XuiIj4uo,1323
88
+ retab/types/documents/extractions.py,sha256=z1XlQLeCGcUAipVB8WGbbUjaBor1bN9BxQzeBaDMj3E,19096
89
+ retab/types/documents/parse.py,sha256=-gCzloJhZraR_Pi9Je0SL8aP52n0GfO9qH838usPA3w,1418
90
90
  retab/types/evaluations/__init__.py,sha256=fRQlK6y3x3SHqaukVYd9_zH8HrUk9TpoG9dlOTuIkcY,920
91
91
  retab/types/evaluations/documents.py,sha256=oy0nqTrv0Pe__5ligeNWn5MbqVDAFRSrXYbCVoLxyXw,1268
92
92
  retab/types/evaluations/iterations.py,sha256=lVHcqmIT0AtJyn7dc_Mw-WbeA0gfTUG1KoifCOFPIkg,4635
@@ -123,7 +123,7 @@ retab/utils/_model_cards/openai.yaml,sha256=PcmjqAioomqWOw25H4BluVfJ1WO_zapg_nPx
123
123
  retab/utils/_model_cards/xai.yaml,sha256=OdVV33_WODc4UBZhDezcUq_5mHQK5zeOT49EjJUJ764,612
124
124
  retab/utils/usage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
125
  retab/utils/usage/usage.py,sha256=PoQAMSWqEXYIRdp-JW9HjecFVitD_oMbxDMtDJdqWnQ,12948
126
- retab-0.0.41.dist-info/METADATA,sha256=XhOqB_OlYbAsLh0tB4ce8gKqBrQnM-7QG9oTFCMPcNs,14142
127
- retab-0.0.41.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
128
- retab-0.0.41.dist-info/top_level.txt,sha256=waQR0EGdhLIQtztoE3AXg7ik5ONQ9q_bsKVpyFuJdq0,6
129
- retab-0.0.41.dist-info/RECORD,,
126
+ retab-0.0.42.dist-info/METADATA,sha256=iXf44YON_rAIYSUqLblaiAahfFIMoyTivm1UkPYxrx8,4549
127
+ retab-0.0.42.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
128
+ retab-0.0.42.dist-info/top_level.txt,sha256=waQR0EGdhLIQtztoE3AXg7ik5ONQ9q_bsKVpyFuJdq0,6
129
+ retab-0.0.42.dist-info/RECORD,,