autocoder-nano 0.1.28__py3-none-any.whl → 0.1.29__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.
@@ -0,0 +1,455 @@
1
+ import time
2
+ from typing import Any, Optional, List, Union, Dict, Iterable, Generator
3
+ from contextlib import contextmanager
4
+
5
+ from rich import box
6
+ from rich.console import Console, Group
7
+ from rich.live import Live
8
+ from rich.markdown import Markdown
9
+ from rich.panel import Panel
10
+ from rich.syntax import Syntax
11
+ from rich.table import Table
12
+ from rich.text import Text
13
+ from rich.box import Box, ROUNDED
14
+ from rich.columns import Columns
15
+ from rich.emoji import Emoji
16
+ from rich.progress import Progress, SpinnerColumn, TextColumn, BarColumn
17
+
18
+
19
+ class Printer:
20
+ def __init__(self, console: Optional[Console] = None):
21
+ """
22
+ 增强版富文本打印机
23
+ :param console: 可传入自定义的Rich Console实例
24
+ """
25
+ self.console = console or Console()
26
+ self._live: Optional[Live] = None
27
+ self._progress: Optional[Progress] = None
28
+
29
+ def print_table(
30
+ self, data: Iterable[Iterable[Any]], title: Optional[str] = None, headers: Optional[List[str]] = None,
31
+ show_lines: bool = False, expand: bool = False, caption: Optional[str] = None
32
+ ) -> None:
33
+ """
34
+ 打印表格
35
+ :param data: 二维可迭代数据
36
+ :param title: 表格标题
37
+ :param headers: 列标题列表
38
+ :param show_lines: 是否显示行分隔线
39
+ :param expand: 是否扩展表格宽度
40
+ :param caption: 底部说明文字
41
+ """
42
+ table = Table(
43
+ title=title, show_header=bool(headers), show_lines=show_lines, expand=expand,
44
+ caption=caption, padding=(0, 1)
45
+ )
46
+
47
+ if headers:
48
+ for header in headers:
49
+ table.add_column(header, style="cyan", header_style="bold magenta")
50
+
51
+ for row in data:
52
+ styled_row = [str(item) if not isinstance(item, Text) else item for item in row]
53
+ table.add_row(*styled_row)
54
+
55
+ self.console.print(table)
56
+
57
+ def print_table_compact(
58
+ self,
59
+ data: Iterable[Iterable[Any]],
60
+ title: Optional[str] = None,
61
+ headers: Optional[List[str]] = None,
62
+ show_lines: bool = False,
63
+ expand: bool = False,
64
+ caption: Optional[str] = None,
65
+ compact: bool = True,
66
+ center: bool = True # 新增居中参数
67
+ ) -> None:
68
+ """ 打印表格(紧凑版本) """
69
+ table = Table(
70
+ title=title,
71
+ show_header=bool(headers),
72
+ show_lines=show_lines,
73
+ expand=expand,
74
+ caption=caption,
75
+ padding=(0, 0) if compact else (0, 1), # 紧凑模式减少内边距
76
+ box=box.SIMPLE if compact else box.ASCII # 紧凑模式使用简单边框
77
+ )
78
+
79
+ # 列样式调整
80
+ for header in (headers or []):
81
+ table.add_column(
82
+ header,
83
+ style="cyan",
84
+ header_style="bold magenta",
85
+ min_width=20 if compact else None,
86
+ justify="center" if center else "left" # 列内容居中
87
+ )
88
+
89
+ # 行内容处理 - 确保所有元素可渲染
90
+ for row in data:
91
+ styled_row = [str(item) if not isinstance(item, Text) else item for item in row]
92
+ table.add_row(*styled_row)
93
+
94
+ # 自动添加面板
95
+ self.print_panel(
96
+ table,
97
+ title=None,
98
+ border_style="cyan" if compact else "blue",
99
+ width=None if compact else 100,
100
+ center=center # 传递居中参数
101
+ )
102
+
103
+ def print_markdown(self, text: str, panel: bool = False) -> None:
104
+ """打印Markdown文本"""
105
+ md = Markdown(text)
106
+ self._print_with_panel(md, panel)
107
+
108
+ def print_code(
109
+ self, code: str, lexer: str = "python", theme: str = "monokai",
110
+ line_numbers: bool = True, panel: bool = False
111
+ ) -> None:
112
+ """高亮打印代码块"""
113
+ syntax = Syntax(
114
+ code,
115
+ lexer,
116
+ theme=theme,
117
+ line_numbers=line_numbers,
118
+ padding=(0, 2)
119
+ )
120
+ # self.console.print(syntax)
121
+ self._print_with_panel(syntax, panel)
122
+
123
+ def print_panel(
124
+ self, content: Any, title: Optional[str] = None, border_style: str = "cyan",
125
+ width: Optional[int] = None, padding: tuple = (0, 1), center: bool = False # 新增居中参数
126
+ ) -> None:
127
+ """带边框的面板输出(支持居中版)"""
128
+ # 创建居中包装器
129
+ renderable = content
130
+ if center:
131
+ renderable = Columns([content], align="center", width=width)
132
+
133
+ panel = Panel(
134
+ renderable,
135
+ title=title,
136
+ border_style=border_style,
137
+ width=width,
138
+ padding=padding,
139
+ box=box.SQUARE
140
+ )
141
+ self.console.print(panel)
142
+
143
+ def print_text(
144
+ self, *texts: Union[str, Text], style: Optional[str] = None, justify: Optional[str] = "left"
145
+ ) -> None:
146
+ """灵活文本打印,支持样式和混合内容"""
147
+ rich_text = Group(*[
148
+ Text(str(t), style=style) if isinstance(t, str) else t
149
+ for t in texts
150
+ ])
151
+ self.console.print(rich_text, justify=justify)
152
+
153
+ @contextmanager
154
+ def live_context(self, refresh_per_second: float = 4.0) -> Generator[None, Any, None]:
155
+ """动态内容上下文管理器"""
156
+ with Live(console=self.console, refresh_per_second=refresh_per_second) as live:
157
+ self._live = live
158
+ try:
159
+ yield
160
+ finally:
161
+ self._live = None
162
+
163
+ def update_live(self, content: Any) -> None:
164
+ """更新动态内容"""
165
+ if self._live:
166
+ self._live.update(content)
167
+
168
+ @contextmanager
169
+ def progress_context(self) -> Generator[Progress, Any, None]:
170
+ """进度条上下文管理器"""
171
+ self._progress = Progress(
172
+ SpinnerColumn(),
173
+ TextColumn("[progress.description]{task.description}"),
174
+ BarColumn(),
175
+ TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
176
+ console=self.console
177
+ )
178
+ with self._progress:
179
+ yield self._progress
180
+ self._progress = None
181
+
182
+ @contextmanager
183
+ def progress_context_with_panel(
184
+ self, title: Optional[str] = None, border_style: str = "cyan"
185
+ ) -> Generator[Progress, Any, None]:
186
+ self._progress = Progress(
187
+ SpinnerColumn(style="cyan"),
188
+ TextColumn("[progress.description]{task.description}", justify="right"),
189
+ BarColumn(bar_width=None, style="blue1", complete_style="bold blue", finished_style="bold green"),
190
+ TextColumn("[progress.percentage]{task.percentage:>3.0f}%", style="bold"),
191
+ TextColumn("•"),
192
+ TextColumn("[cyan]{task.completed}/{task.total}", justify="left"),
193
+ expand=True,
194
+ transient=True
195
+ )
196
+
197
+ # 创建包含进度条的面板
198
+ progress_panel = Panel(
199
+ self._progress,
200
+ title=title or "任务进度",
201
+ border_style=border_style,
202
+ padding=(1, 2),
203
+ box=box.ROUNDED
204
+ )
205
+
206
+ # 使用单个Live实例包装整个面板
207
+ with Live(progress_panel, console=self.console, refresh_per_second=10) as live:
208
+ # 手动将Progress的live替换为我们创建的live
209
+ self._progress.live = live
210
+ with self._progress:
211
+ yield self._progress
212
+ self._progress = None
213
+
214
+ def print_card(
215
+ self, content: Union[str, Text, Markdown, Syntax], title: Optional[str] = None,
216
+ border_style: str = "cyan", width: Optional[int] = None, icon: Optional[str] = None, box: Box = ROUNDED
217
+ ) -> None:
218
+ """
219
+ 基础卡片输出
220
+ :param content: 内容(支持多种格式)
221
+ :param title: 卡片标题
222
+ :param border_style: 边框样式
223
+ :param width: 卡片宽度
224
+ :param icon: 标题前图标(支持Emoji)
225
+ :param box: 边框样式(来自rich.box)
226
+ """
227
+ if icon:
228
+ title = f"{Emoji(icon)} {title}" if title else Emoji(icon)
229
+
230
+ panel = Panel(
231
+ content,
232
+ title=title,
233
+ box=box,
234
+ border_style=border_style,
235
+ width=width,
236
+ padding=(0, 1)
237
+ )
238
+ self.console.print(panel)
239
+
240
+ def multi_col_cards(
241
+ self, cards: List[Dict[str, Any]], equal: bool = True
242
+ ) -> None:
243
+ """
244
+ 多列卡片布局
245
+ :param cards: 卡片参数列表
246
+ :param equal: 是否等宽
247
+ """
248
+ rendered_cards = []
249
+ for card in cards:
250
+ content = card.get("content", "")
251
+ if isinstance(content, str):
252
+ # 自动识别Markdown
253
+ if content.strip().startswith(("#", "-", "*")):
254
+ content = Markdown(content)
255
+
256
+ rendered = Panel(
257
+ content,
258
+ title=card.get("title"),
259
+ box=card.get("box", ROUNDED),
260
+ border_style=card.get("border_style", "cyan"),
261
+ width=card.get("width")
262
+ )
263
+ rendered_cards.append(rendered)
264
+
265
+ self.console.print(Columns(rendered_cards, equal=equal))
266
+
267
+ def status_card(
268
+ self, message: str, status: str = "info", title: Optional[str] = None
269
+ ) -> None:
270
+ """
271
+ 状态卡片(预设样式)
272
+ :param status: 状态类型(info/success/warning/error)
273
+ :param message: 主要内容
274
+ :param title: 可选标题
275
+ """
276
+ config = {
277
+ "info": {"icon": "ℹ️", "color": "cyan"},
278
+ "success": {"icon": "✅", "color": "green"},
279
+ "warning": {"icon": "⚠️", "color": "yellow"},
280
+ "error": {"icon": "❌", "color": "red"}
281
+ }.get(status.lower(), {})
282
+
283
+ title_text = Text()
284
+ if config.get("icon"):
285
+ title_text.append(f"{config['icon']} ")
286
+ if title:
287
+ title_text.append(title, style=f"bold {config['color']}")
288
+
289
+ self.print_card(
290
+ content=Markdown(message),
291
+ title=title_text,
292
+ border_style=config.get("color", "cyan")
293
+ )
294
+
295
+ def print_key_value(
296
+ self, items: Dict[str, Any], key_style: str = "bold cyan",
297
+ value_style: str = "green", separator: str = ": ", panel: bool = True
298
+ ) -> None:
299
+ """
300
+ 键值对格式化输出
301
+ :param items: 字典数据
302
+ :param key_style: 键的样式
303
+ :param value_style: 值的样式
304
+ :param separator: 键值分隔符
305
+ :param panel: 是否用面板包裹
306
+ """
307
+ content = Group(*[
308
+ Text.assemble(
309
+ (f"{k}{separator}", key_style),
310
+ (str(v), value_style)
311
+ ) for k, v in items.items()
312
+ ])
313
+ self._print_with_panel(content, panel)
314
+
315
+ def context_aware_help(
316
+ self, help_content: Dict[str, str], current_context: str, width: int = 40
317
+ ):
318
+ """
319
+ 上下文感知帮助面板
320
+ :param help_content: 帮助信息字典 {上下文关键字: 说明内容}
321
+ :param current_context: 当前分析出的上下文
322
+ :param width: 面板宽度
323
+ """
324
+ matched_keys = [k for k in help_content if k in current_context]
325
+ if not matched_keys:
326
+ return
327
+
328
+ help_text = Text()
329
+ for key in matched_keys:
330
+ help_text.append(f"[bold]{key}[/]\n{help_content[key]}\n\n", style="dim")
331
+
332
+ self.print_panel(
333
+ help_text,
334
+ title="相关帮助信息",
335
+ border_style="cyan",
336
+ width=width
337
+ )
338
+
339
+ def _print_with_panel(self, content: Any, use_panel: bool) -> None:
340
+ """内部方法:根据参数决定是否使用面板包装"""
341
+ if use_panel:
342
+ self.print_panel(content)
343
+ else:
344
+ self.console.print(content)
345
+
346
+ @staticmethod
347
+ def create_console(**kwargs) -> Console:
348
+ """创建预配置的Console实例"""
349
+ return Console(record=True, **kwargs)
350
+
351
+ def get_console(self):
352
+ return self.console
353
+
354
+
355
+ if __name__ == '__main__':
356
+ printer = Printer()
357
+ # 表格示例
358
+ printer.print_table(
359
+ headers=["Name", "Age", "Country"],
360
+ data=[
361
+ ["Alice", 28, "USA"],
362
+ ["Bob", Text("32 (senior)", style="bold red"), "UK"],
363
+ ["Charlie", 45, "Australia"]
364
+ ],
365
+ title="User Info",
366
+ show_lines=False
367
+ )
368
+
369
+ printer.print_table_compact(
370
+ headers=["Name", "Age", "Country"],
371
+ data=[
372
+ ["Alice", 28, "USA"],
373
+ ["Bob", Text("32 (senior)", style="bold red"), "UK"],
374
+ ["Charlie", 45, "Australia"]
375
+ ],
376
+ title="User Info",
377
+ show_lines=True,
378
+ center=True,
379
+ compact=True
380
+ )
381
+
382
+ # 键值对示例
383
+ printer.print_key_value(
384
+ {"版本": "1.2.3", "作者": "Alice", "许可证": "MIT"},
385
+ panel=True
386
+ )
387
+
388
+ # Markdown示例
389
+ printer.print_markdown("# 这是标题\n- 列表项1\n- 列表项2", panel=True)
390
+
391
+ # 代码示例
392
+ printer.print_code('print("Hello World!")', line_numbers=False)
393
+
394
+ # Text示例
395
+ printer.print_text(Text("32 (senior)", style="bold red"))
396
+ printer.print_text(Text("32 (senior)", style="dim red"))
397
+ printer.print_text("32 (senior)", style="dim red")
398
+
399
+ # 动态内容示例
400
+ # with printer.live_context():
401
+ # for i in range(10):
402
+ # printer.update_live(f"Processing... [bold green]{i + 1}/10")
403
+ # time.sleep(0.1)
404
+
405
+ # 进度条示例
406
+ # with printer.progress_context() as progress:
407
+ # task = progress.add_task("Downloading", total=10)
408
+ # for i in range(10):
409
+ # progress.update(task, advance=1)
410
+ # time.sleep(0.1)
411
+
412
+ # with printer.progress_context_with_panel(title="数据处理进度") as progress:
413
+ # task = progress.add_task("[red]下载文件...", total=10)
414
+ #
415
+ # for i in range(10):
416
+ # time.sleep(0.1)
417
+ # progress.update(task, advance=1)
418
+
419
+ # 基础卡片
420
+ printer.print_card(
421
+ title="系统通知",
422
+ content="当前系统版本:v2.4.1 , 可用存储空间:128GB",
423
+ icon="package",
424
+ border_style="dim blue",
425
+ width=50
426
+ )
427
+
428
+ printer.print_card(
429
+ title="第一阶段",
430
+ content="处理 REST/RAG/Search 资源...",
431
+ border_style="dim cyan"
432
+ )
433
+
434
+ # # 多列卡片
435
+ # printer.multi_col_cards([
436
+ # {
437
+ # "title": "CPU使用率",
438
+ # "content": "```\n[██████ 75%]\n```",
439
+ # "border_style": "yellow"
440
+ # },
441
+ # {
442
+ # "title": "内存状态",
443
+ # "content": "已用:4.2/8.0 GB"
444
+ # },
445
+ # {
446
+ # "title": "网络状态",
447
+ # "content": Markdown("- Ping: 28ms\n- 带宽:↑1.2 ↓4.5 Mbps")
448
+ # }
449
+ # ])
450
+
451
+ # printer.status_card(
452
+ # status="error",
453
+ # message="无法连接到数据库:\n- 检查网络连接\n- 验证凭据有效性",
454
+ # title="严重错误"
455
+ # )
autocoder_nano/version.py CHANGED
@@ -1,3 +1,3 @@
1
- __version__ = "0.1.28"
1
+ __version__ = "0.1.29"
2
2
  __author__ = "moofs"
3
3
  __license__ = "Apache License 2.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: autocoder_nano
3
- Version: 0.1.28
3
+ Version: 0.1.29
4
4
  Summary: AutoCoder Nano
5
5
  Author: moofs
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -10,7 +10,6 @@ Requires-Python: >=3.10
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
12
  Requires-Dist: loguru
13
- Requires-Dist: tabulate
14
13
  Requires-Dist: GitPython
15
14
  Requires-Dist: jinja2
16
15
  Requires-Dist: openai>=1.14.3
@@ -25,7 +24,7 @@ Requires-Dist: uvicorn
25
24
  Requires-Dist: pathspec
26
25
  Requires-Dist: fastapi
27
26
  Requires-Dist: tokenizers
28
- Requires-Dist: duckdb
27
+ Requires-Dist: duckdb==1.2.0
29
28
  Requires-Dist: numpy
30
29
  Requires-Dist: requests
31
30
  Requires-Dist: beautifulsoup4
@@ -1,16 +1,16 @@
1
1
  autocoder_nano/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- autocoder_nano/auto_coder_nano.py,sha256=CgUumtK8rfVaHWlO4ND5oTnhhNfyYQ1fSr0th4Wkwv0,104325
2
+ autocoder_nano/auto_coder_nano.py,sha256=5M5c7FblpbjOzV9h7j0raZxuYbFq_iEbpErhp_ZbDL0,101507
3
3
  autocoder_nano/auto_coder_nano_rag.py,sha256=9BtNZ6nC5D5SPTIuziXZOfouCBLOMNzvJMTdDPQEgO8,10436
4
4
  autocoder_nano/auto_coder_nano_ui.py,sha256=ZBskcIJMeTJY7_JipGJaee58G9fUJaOv3LV4hptLc6c,12669
5
5
  autocoder_nano/file_utils.py,sha256=iGbkbQ191nKL4aNufdexYYYQSDM1XrDC9Uxp_PIbawY,661
6
- autocoder_nano/git_utils.py,sha256=sq81FCdB7kUIYPb-7zRNcnjUHDLU1ObgyVT9PvXXnA0,20350
6
+ autocoder_nano/git_utils.py,sha256=zDbQcfQ2hcdnL4PNWzVXSbc_ixPdPm-rgavhDnIrtH8,20685
7
7
  autocoder_nano/helper.py,sha256=LbieDBKp408x9g4GHCvcujUgMgxDTV9owGHIBYpT1ww,6643
8
- autocoder_nano/llm_client.py,sha256=D0p6EcnmM5jeoWvPxyxe7ZYUObOASF9fXEKJga4mdOE,3941
8
+ autocoder_nano/llm_client.py,sha256=C2h1uZ4cjsYxItlgDowBljAjNwJqdVhjAXptgkGd2-s,4360
9
9
  autocoder_nano/llm_prompt.py,sha256=ViWUfCZp0gDESAAPHBhZc2WhHiFUHIxK6a2xbFu0sjU,10864
10
10
  autocoder_nano/llm_types.py,sha256=LIvATT40K9A_NAMuaNUKZt-6fu9zZP39uU6-dFUZNHk,9521
11
11
  autocoder_nano/sys_utils.py,sha256=Sn6kr5diaEkVWbYDBrtenr9zw32jVIWvsAReY7_uEd0,1638
12
12
  autocoder_nano/templates.py,sha256=Sv61fSy8V7YsM_bSqDLFMX5tinleSZ6Z2hetCDXl6g8,4270
13
- autocoder_nano/version.py,sha256=zeGAjY0OkOCPDTzXrM2ODQ2ng6u7KTrPi_ovWAysli8,79
13
+ autocoder_nano/version.py,sha256=d-XOCPQRy_qfLozchW1GNzQc1E0ggOGJNzVUb0V6t9k,79
14
14
  autocoder_nano/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  autocoder_nano/agent/agent_base.py,sha256=aic_Od5owZEu-VJhyAfQiz9R4btfvgPLJGwtxH3WBno,16369
16
16
  autocoder_nano/agent/new/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -37,15 +37,15 @@ autocoder_nano/app/templates/partials/input.html,sha256=8CY3JcHaA4nPZ2Vu4ragdYZz
37
37
  autocoder_nano/app/templates/partials/message.html,sha256=HWEh_j_yJAbP7zFs6jt88BDzkP7dG6VgPUbS2MT5Ax4,1548
38
38
  autocoder_nano/data/tokenizer.json,sha256=7Lb5_DaYlDRvBRH0B0ynXO5c1fOwbQLxujX805-OEh0,7847602
39
39
  autocoder_nano/edit/__init__.py,sha256=QPMuW7tBTUe0Q00gUPJEmdxWqvunqko9_dsim0ncr7c,623
40
- autocoder_nano/edit/actions.py,sha256=fRIp2VSIIgdjYLQ1dZt5kykTXkYzx7GX5CVc5BJhPQM,6205
40
+ autocoder_nano/edit/actions.py,sha256=N4qzSIE7Ifm7r6Sk-HbgWmbDqMP6jfrpByfpV7rbEo8,6480
41
41
  autocoder_nano/edit/text.py,sha256=nC7VkQYHCDdT3ULpy0DIjkFwB9suhjIxK39AEzXqbno,1150
42
42
  autocoder_nano/edit/code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  autocoder_nano/edit/code/generate_editblock.py,sha256=s-VTZK0G1OhjEyZXqyjj4sY48fOo02EvHhaxTIw4ytY,13110
44
- autocoder_nano/edit/code/merge_editblock.py,sha256=xgHl364BTX8vtnzqI49gupUCnMkhrJ4IqNO0PDaN3kk,17657
44
+ autocoder_nano/edit/code/merge_editblock.py,sha256=Vk-FOVvaEzKcSRDMyMyR_M77kqj-s5-zejChn4QwLAY,17557
45
45
  autocoder_nano/edit/code/modification_ranker.py,sha256=hnF1acqAzPYKm9hEFxobJHfGGDdM-GclZLxvtt83lGA,3431
46
46
  autocoder_nano/index/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
- autocoder_nano/index/entry.py,sha256=L_xoV-GDEzzwS6zP4M1-ZGQ6l6mh2R-ez8quZdhlhg0,7785
48
- autocoder_nano/index/index_manager.py,sha256=G5oD0uI78Yo07WtM8RaWpvqEUvkl6Uph2Pi-ZfIUuZg,15258
47
+ autocoder_nano/index/entry.py,sha256=S71dfnYC201eQLXwqNCo_Y83ImI1ZxuJ0_m2hz5nCJc,7729
48
+ autocoder_nano/index/index_manager.py,sha256=ek7AqU8M-Snl5qZYhO_U0SEK3-y1u5OOxD9z-LdDesE,15619
49
49
  autocoder_nano/index/symbols_utils.py,sha256=z_16X6BozTfmric1uU-r2GqzDabJ5ChfAOB4lo7i-_8,1450
50
50
  autocoder_nano/project/__init__.py,sha256=8R90zhCcRTHWScAOYw20lkcHI4IhSm-ywCLcfezn0Oc,227
51
51
  autocoder_nano/project/pyproject.py,sha256=UZqHBrUmsCW73YkG8shjeFSEYGB_zFDH1ezoPP_f33Q,4478
@@ -69,9 +69,11 @@ autocoder_nano/ss/__init__.py,sha256=jp9Az7c0uafZcC6qfxjyZnSnVLtgA_4UdakSOcp8osE
69
69
  autocoder_nano/ss/search_engine.py,sha256=4_RcxF1almJX5XlLWB7d9UXM92YDK2bOqoCrkuGg5Mc,3720
70
70
  autocoder_nano/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
71
  autocoder_nano/tools/http_tools.py,sha256=04Tmg8BTwfsw7_-fKBDHv787XU4yQ5UtQSDj0zJBIUc,3189
72
- autocoder_nano-0.1.28.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
73
- autocoder_nano-0.1.28.dist-info/METADATA,sha256=gH794GPszg5XH_Cjmz6KykMJCjvLvjclXx-vrEUwvZU,13593
74
- autocoder_nano-0.1.28.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
75
- autocoder_nano-0.1.28.dist-info/entry_points.txt,sha256=Dj8gGZ_AgLy8ANqr2do_DJjpsR3JMh-ztsrUXo4Vn5Q,194
76
- autocoder_nano-0.1.28.dist-info/top_level.txt,sha256=D7s34cwIs1F4EAjRRDvO_zTHtUz1Z7UVccFUNlJn7HI,15
77
- autocoder_nano-0.1.28.dist-info/RECORD,,
72
+ autocoder_nano/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ autocoder_nano/utils/printer_utils.py,sha256=MohOZeihWQIj7ZpDo5TPT93hijIbjPWknNSyHf4ns_Q,15196
74
+ autocoder_nano-0.1.29.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
75
+ autocoder_nano-0.1.29.dist-info/METADATA,sha256=23Hie3PP50CJkT98hdfaJYx6FXMTEdrRi2eCQ-j5Gs4,13576
76
+ autocoder_nano-0.1.29.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
77
+ autocoder_nano-0.1.29.dist-info/entry_points.txt,sha256=Dj8gGZ_AgLy8ANqr2do_DJjpsR3JMh-ztsrUXo4Vn5Q,194
78
+ autocoder_nano-0.1.29.dist-info/top_level.txt,sha256=D7s34cwIs1F4EAjRRDvO_zTHtUz1Z7UVccFUNlJn7HI,15
79
+ autocoder_nano-0.1.29.dist-info/RECORD,,