janito 2.28.0__py3-none-any.whl → 2.29.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.
- janito/cli/chat_mode/session.py +150 -58
- janito/cli/prompt_core.py +0 -2
- janito/cli/rich_terminal_reporter.py +2 -1
- janito/cli/single_shot_mode/handler.py +0 -2
- janito/provider_registry.py +1 -1
- janito/providers/openai/provider.py +1 -1
- janito/tools/adapters/local/search_text/core.py +1 -1
- {janito-2.28.0.dist-info → janito-2.29.0.dist-info}/METADATA +1 -1
- {janito-2.28.0.dist-info → janito-2.29.0.dist-info}/RECORD +13 -13
- {janito-2.28.0.dist-info → janito-2.29.0.dist-info}/WHEEL +0 -0
- {janito-2.28.0.dist-info → janito-2.29.0.dist-info}/entry_points.txt +0 -0
- {janito-2.28.0.dist-info → janito-2.29.0.dist-info}/licenses/LICENSE +0 -0
- {janito-2.28.0.dist-info → janito-2.29.0.dist-info}/top_level.txt +0 -0
janito/cli/chat_mode/session.py
CHANGED
@@ -63,6 +63,7 @@ class ChatSession:
|
|
63
63
|
allowed_permissions=None,
|
64
64
|
):
|
65
65
|
self.console = console
|
66
|
+
self.session_start_time = time.time()
|
66
67
|
self.user_input_history = UserInputHistory()
|
67
68
|
self.input_dicts = self.user_input_history.load()
|
68
69
|
self.mem_history = InMemoryHistory()
|
@@ -114,22 +115,13 @@ class ChatSession:
|
|
114
115
|
self.multi_line_mode = getattr(args, "multi", False) if args else False
|
115
116
|
|
116
117
|
def _select_profile_and_role(self, args, role):
|
117
|
-
profile
|
118
|
-
role_arg = getattr(args, "role", None) if args is not None else None
|
119
|
-
python_profile = (
|
120
|
-
getattr(args, "developer", False) if args is not None else False
|
121
|
-
)
|
122
|
-
market_profile = getattr(args, "market", False) if args is not None else False
|
118
|
+
profile, role_arg, python_profile, market_profile = self._extract_args(args)
|
123
119
|
profile_system_prompt = None
|
124
120
|
no_tools_mode = False
|
125
121
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
# Handle --market flag
|
131
|
-
if market_profile and profile is None and role_arg is None:
|
132
|
-
profile = "Market Analyst"
|
122
|
+
profile = self._determine_profile(
|
123
|
+
profile, role_arg, python_profile, market_profile
|
124
|
+
)
|
133
125
|
|
134
126
|
if (
|
135
127
|
profile is None
|
@@ -137,16 +129,9 @@ class ChatSession:
|
|
137
129
|
and not python_profile
|
138
130
|
and not market_profile
|
139
131
|
):
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
# Check if any getter command is active - these don't need interactive mode
|
132
|
+
skip_profile_selection = self._should_skip_profile_selection(args)
|
133
|
+
else:
|
144
134
|
skip_profile_selection = False
|
145
|
-
if args is not None:
|
146
|
-
for key in GETTER_KEYS:
|
147
|
-
if getattr(args, key, False):
|
148
|
-
skip_profile_selection = True
|
149
|
-
break
|
150
135
|
|
151
136
|
if skip_profile_selection:
|
152
137
|
profile = "Developer with Python Tools" # Default for non-interactive commands
|
@@ -314,39 +299,14 @@ class ChatSession:
|
|
314
299
|
)
|
315
300
|
start_time = time.time()
|
316
301
|
|
317
|
-
|
318
|
-
|
319
|
-
self.agent.get_model_name()
|
320
|
-
if hasattr(self.agent, "get_model_name")
|
321
|
-
else "Unknown"
|
322
|
-
)
|
323
|
-
provider_name = (
|
324
|
-
self.agent.get_provider_name()
|
325
|
-
if hasattr(self.agent, "get_provider_name")
|
326
|
-
else "Unknown"
|
327
|
-
)
|
302
|
+
model_name, provider_name = self._get_model_info()
|
303
|
+
backend_hostname = self._get_backend_hostname()
|
328
304
|
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
if cfg is not None:
|
335
|
-
b = getattr(cfg, "base_url", None)
|
336
|
-
if b:
|
337
|
-
candidates.append(b)
|
338
|
-
direct_base = getattr(drv, "base_url", None)
|
339
|
-
if direct_base:
|
340
|
-
candidates.append(direct_base)
|
341
|
-
cfg2 = getattr(self.agent, "config", None)
|
342
|
-
if cfg2 is not None:
|
343
|
-
b2 = getattr(cfg2, "base_url", None)
|
344
|
-
if b2:
|
345
|
-
candidates.append(b2)
|
346
|
-
top_base = getattr(self.agent, "base_url", None)
|
347
|
-
if top_base:
|
348
|
-
candidates.append(top_base)
|
349
|
-
from urllib.parse import urlparse
|
305
|
+
self.console.print(
|
306
|
+
Rule(
|
307
|
+
f"[bold blue]Model: {model_name} ({provider_name}) | Backend: {backend_hostname}[/bold blue]"
|
308
|
+
)
|
309
|
+
)
|
350
310
|
|
351
311
|
for candidate in candidates:
|
352
312
|
try:
|
@@ -377,8 +337,6 @@ class ChatSession:
|
|
377
337
|
print_token_message_summary(
|
378
338
|
self.console, self.msg_count, usage, elapsed=elapsed
|
379
339
|
)
|
380
|
-
# Send terminal bell character to trigger TUI bell after printing token summary
|
381
|
-
print("\a", end="", flush=True)
|
382
340
|
if final_event and hasattr(final_event, "metadata"):
|
383
341
|
exit_reason = (
|
384
342
|
final_event.metadata.get("exit_reason")
|
@@ -395,6 +353,102 @@ class ChatSession:
|
|
395
353
|
|
396
354
|
self.console.print(traceback.format_exc())
|
397
355
|
|
356
|
+
def _extract_args(self, args):
|
357
|
+
"""Extract profile and role arguments from args."""
|
358
|
+
profile = getattr(args, "profile", None) if args is not None else None
|
359
|
+
role_arg = getattr(args, "role", None) if args is not None else None
|
360
|
+
python_profile = (
|
361
|
+
getattr(args, "developer", False) if args is not None else False
|
362
|
+
)
|
363
|
+
market_profile = getattr(args, "market", False) if args is not None else False
|
364
|
+
return profile, role_arg, python_profile, market_profile
|
365
|
+
|
366
|
+
def _determine_profile(self, profile, role_arg, python_profile, market_profile):
|
367
|
+
"""Determine the profile based on flags and arguments."""
|
368
|
+
if python_profile and profile is None and role_arg is None:
|
369
|
+
return "Developer with Python Tools"
|
370
|
+
if market_profile and profile is None and role_arg is None:
|
371
|
+
return "Market Analyst"
|
372
|
+
return profile
|
373
|
+
|
374
|
+
def _should_skip_profile_selection(self, args):
|
375
|
+
"""Check if profile selection should be skipped for getter commands."""
|
376
|
+
from janito.cli.core.getters import GETTER_KEYS
|
377
|
+
|
378
|
+
if args is None:
|
379
|
+
return False
|
380
|
+
|
381
|
+
for key in GETTER_KEYS:
|
382
|
+
if getattr(args, key, False):
|
383
|
+
return True
|
384
|
+
return False
|
385
|
+
|
386
|
+
def _get_model_info(self):
|
387
|
+
"""Get model and provider information."""
|
388
|
+
model_name = (
|
389
|
+
self.agent.get_model_name()
|
390
|
+
if hasattr(self.agent, "get_model_name")
|
391
|
+
else "Unknown"
|
392
|
+
)
|
393
|
+
provider_name = (
|
394
|
+
self.agent.get_provider_name()
|
395
|
+
if hasattr(self.agent, "get_provider_name")
|
396
|
+
else "Unknown"
|
397
|
+
)
|
398
|
+
return model_name, provider_name
|
399
|
+
|
400
|
+
def _get_backend_hostname(self):
|
401
|
+
"""Extract backend hostname from agent configuration."""
|
402
|
+
candidates = self._collect_base_urls()
|
403
|
+
return self._parse_hostname_from_urls(candidates)
|
404
|
+
|
405
|
+
def _collect_base_urls(self):
|
406
|
+
"""Collect all possible base URLs from agent configuration."""
|
407
|
+
candidates = []
|
408
|
+
|
409
|
+
# Collect from driver
|
410
|
+
drv = getattr(self.agent, "driver", None)
|
411
|
+
if drv is not None:
|
412
|
+
cfg = getattr(drv, "config", None)
|
413
|
+
if cfg is not None:
|
414
|
+
b = getattr(cfg, "base_url", None)
|
415
|
+
if b:
|
416
|
+
candidates.append(b)
|
417
|
+
direct_base = getattr(drv, "base_url", None)
|
418
|
+
if direct_base:
|
419
|
+
candidates.append(direct_base)
|
420
|
+
|
421
|
+
# Collect from agent config
|
422
|
+
cfg2 = getattr(self.agent, "config", None)
|
423
|
+
if cfg2 is not None:
|
424
|
+
b2 = getattr(cfg2, "base_url", None)
|
425
|
+
if b2:
|
426
|
+
candidates.append(b2)
|
427
|
+
|
428
|
+
# Collect from agent directly
|
429
|
+
top_base = getattr(self.agent, "base_url", None)
|
430
|
+
if top_base:
|
431
|
+
candidates.append(top_base)
|
432
|
+
|
433
|
+
return candidates
|
434
|
+
|
435
|
+
def _parse_hostname_from_urls(self, candidates):
|
436
|
+
"""Parse hostname from a list of URL candidates."""
|
437
|
+
from urllib.parse import urlparse
|
438
|
+
|
439
|
+
for candidate in candidates:
|
440
|
+
try:
|
441
|
+
if not candidate:
|
442
|
+
continue
|
443
|
+
parsed = urlparse(str(candidate))
|
444
|
+
host = parsed.netloc or parsed.path
|
445
|
+
if host:
|
446
|
+
return host
|
447
|
+
except Exception:
|
448
|
+
return str(candidate)
|
449
|
+
|
450
|
+
return "Unknown"
|
451
|
+
|
398
452
|
def _create_prompt_session(self):
|
399
453
|
return PromptSession(
|
400
454
|
style=chat_shell_style,
|
@@ -416,7 +470,25 @@ class ChatSession:
|
|
416
470
|
else:
|
417
471
|
try:
|
418
472
|
cmd_input = session.prompt(HTML("<inputline>💬 </inputline>"))
|
419
|
-
except
|
473
|
+
except KeyboardInterrupt:
|
474
|
+
# Ask for confirmation on Ctrl+C
|
475
|
+
from prompt_toolkit import prompt
|
476
|
+
|
477
|
+
try:
|
478
|
+
confirm = prompt(
|
479
|
+
"Are you sure you want to exit? (y/n): ",
|
480
|
+
style=self._create_prompt_session().style,
|
481
|
+
)
|
482
|
+
if confirm.lower() == "y":
|
483
|
+
self._handle_exit()
|
484
|
+
return None
|
485
|
+
else:
|
486
|
+
return "" # Return empty string to continue
|
487
|
+
except (KeyboardInterrupt, EOFError):
|
488
|
+
# Handle second Ctrl+C or Ctrl+D as immediate exit
|
489
|
+
self._handle_exit()
|
490
|
+
return None
|
491
|
+
except EOFError:
|
420
492
|
self._handle_exit()
|
421
493
|
return None
|
422
494
|
sanitized = cmd_input.strip()
|
@@ -430,7 +502,27 @@ class ChatSession:
|
|
430
502
|
return sanitized
|
431
503
|
|
432
504
|
def _handle_exit(self):
|
433
|
-
|
505
|
+
session_duration = time.time() - self.session_start_time
|
506
|
+
|
507
|
+
# Get total token usage from performance collector
|
508
|
+
from janito.perf_singleton import performance_collector
|
509
|
+
|
510
|
+
total_tokens = performance_collector.get_token_usage().get("total_tokens", 0)
|
511
|
+
|
512
|
+
# Format session duration
|
513
|
+
if session_duration < 60:
|
514
|
+
duration_str = f"{session_duration:.1f}s"
|
515
|
+
elif session_duration < 3600:
|
516
|
+
duration_str = f"{session_duration/60:.1f}m"
|
517
|
+
else:
|
518
|
+
duration_str = f"{session_duration/3600:.1f}h"
|
519
|
+
|
520
|
+
self.console.print(f"[bold yellow]Session completed![/bold yellow]")
|
521
|
+
self.console.print(
|
522
|
+
f"[dim]Session time: {duration_str} | Total tokens: {total_tokens:,}[/dim]"
|
523
|
+
)
|
524
|
+
self.console.print("[bold yellow]Goodbye![/bold yellow]")
|
525
|
+
|
434
526
|
if hasattr(self, "agent") and hasattr(self.agent, "join_driver"):
|
435
527
|
if (
|
436
528
|
hasattr(self.agent, "input_queue")
|
janito/cli/prompt_core.py
CHANGED
@@ -216,8 +216,6 @@ class PromptHandler:
|
|
216
216
|
if on_event and final_event is not None:
|
217
217
|
on_event(final_event)
|
218
218
|
global_event_bus.publish(final_event)
|
219
|
-
# Terminal bell moved to token summary printing in session.py and handler.py
|
220
|
-
pass # print('\a', end='', flush=True)
|
221
219
|
except KeyboardInterrupt:
|
222
220
|
# Capture user interrupt / cancellation
|
223
221
|
self.console.print("[red]Interrupted by the user.[/red]")
|
@@ -139,11 +139,12 @@ class RichTerminalReporter(EventHandlerBase):
|
|
139
139
|
if not msg or not subtype:
|
140
140
|
return
|
141
141
|
if subtype == ReportSubtype.ACTION_INFO:
|
142
|
-
# Use orange for modification actions
|
142
|
+
# Use orange for all write/modification actions
|
143
143
|
modification_actions = (
|
144
144
|
getattr(ReportAction, "UPDATE", None),
|
145
145
|
getattr(ReportAction, "WRITE", None),
|
146
146
|
getattr(ReportAction, "DELETE", None),
|
147
|
+
getattr(ReportAction, "CREATE", None),
|
147
148
|
)
|
148
149
|
style = (
|
149
150
|
"orange1"
|
@@ -125,8 +125,6 @@ class PromptHandler:
|
|
125
125
|
print_token_message_summary(
|
126
126
|
shared_console, msg_count=1, usage=usage, elapsed=elapsed
|
127
127
|
)
|
128
|
-
# Send terminal bell character to trigger TUI bell after printing token summary
|
129
|
-
print("\a", end="", flush=True)
|
130
128
|
self._cleanup_driver_and_console()
|
131
129
|
|
132
130
|
def _cleanup_driver_and_console(self):
|
janito/provider_registry.py
CHANGED
@@ -41,7 +41,7 @@ class ProviderRegistry:
|
|
41
41
|
rows.append(info[:3])
|
42
42
|
|
43
43
|
# Group providers by openness (open-source first, then proprietary)
|
44
|
-
open_providers = {"cerebras", "deepseek", "alibaba", "
|
44
|
+
open_providers = {"cerebras", "deepseek", "alibaba", "moonshot", "zai"}
|
45
45
|
|
46
46
|
def sort_key(row):
|
47
47
|
provider_name = row[0]
|
@@ -18,7 +18,7 @@ class OpenAIProvider(LLMProvider):
|
|
18
18
|
MAINTAINER = "João Pinto <janito@ikignosis.org>"
|
19
19
|
MODEL_SPECS = MODEL_SPECS
|
20
20
|
DEFAULT_MODEL = (
|
21
|
-
"gpt-
|
21
|
+
"gpt-5" # Options: gpt-4.1, gpt-4o, o3-mini, o4-mini, gpt-5, gpt-5-nano
|
22
22
|
)
|
23
23
|
|
24
24
|
def __init__(
|
@@ -98,7 +98,7 @@ class SearchTextTool(ToolBase):
|
|
98
98
|
if max_depth > 0:
|
99
99
|
info_str += tr(" [max_depth={max_depth}]", max_depth=max_depth)
|
100
100
|
if count_only:
|
101
|
-
info_str += " [count
|
101
|
+
info_str += " [count]"
|
102
102
|
self.report_action(info_str, ReportAction.READ)
|
103
103
|
if os.path.isfile(search_path):
|
104
104
|
dir_output, dir_limit_reached, per_file_counts = self._handle_file(
|
@@ -16,7 +16,7 @@ janito/perf_singleton.py,sha256=g1h0Sdf4ydzegeEpJlMhQt4H0GQZ2hryXrdYOTL-b30,113
|
|
16
16
|
janito/performance_collector.py,sha256=RYu4av16Trj3RljJZ8-2Gbn1KlGdJUosrcVFYtwviNI,6285
|
17
17
|
janito/platform_discovery.py,sha256=JN3kC7hkxdvuj-AyrJTlbbDJjtNHke3fdlZDqGi_uz0,4621
|
18
18
|
janito/provider_config.py,sha256=acn2FEgWsEIyi2AxZiuCLoP2rXDd-nXcP5VB4CZHaeE,3189
|
19
|
-
janito/provider_registry.py,sha256=
|
19
|
+
janito/provider_registry.py,sha256=IRNB35Cjn4PSXMWOxKBjPg0DfUEOoL4vh63OSPxhMtk,6925
|
20
20
|
janito/report_events.py,sha256=q4OR_jTZNfcqaQF_fzTjgqo6_VlUIxSGWfhpT4nJWcw,938
|
21
21
|
janito/shell.bak.zip,sha256=hznHbmgfkAkjuQDJ3w73XPQh05yrtUZQxLmtGbanbYU,22
|
22
22
|
janito/utils.py,sha256=eXSsMgM69YyzahgCNrJQLcEbB8ssLI1MQqaa20ONxbE,376
|
@@ -30,17 +30,17 @@ janito/cli/config.py,sha256=HkZ14701HzIqrvaNyDcDhGlVHfpX_uHlLp2rHmhRm_k,872
|
|
30
30
|
janito/cli/console.py,sha256=gJolqzWL7jEPLxeuH-CwBDRFpXt976KdZOEAB2tdBDs,64
|
31
31
|
janito/cli/main.py,sha256=s5odou0txf8pzTf1ADk2yV7T5m8B6cejJ81e7iu776U,312
|
32
32
|
janito/cli/main_cli.py,sha256=Axubqtwl7LVikdCZ4edgTurLgq_F11641CjVbTi2oow,17008
|
33
|
-
janito/cli/prompt_core.py,sha256=
|
33
|
+
janito/cli/prompt_core.py,sha256=F68J4Xl6jZMYFN4oBBYZFj15Jp-HTYoLub4bw2XpNRU,11648
|
34
34
|
janito/cli/prompt_handler.py,sha256=SnPTlL64noeAMGlI08VBDD5IDD8jlVMIYA4-fS8zVLg,215
|
35
35
|
janito/cli/prompt_setup.py,sha256=s48gvNfZhKjsEhf4EzL1tKIGm4wDidPMDvlM6TAPYes,2116
|
36
|
-
janito/cli/rich_terminal_reporter.py,sha256=
|
36
|
+
janito/cli/rich_terminal_reporter.py,sha256=K48Ywwj6xz_NikuezzBmYJM1PANmQD-G48sE4NjQhn0,6835
|
37
37
|
janito/cli/utils.py,sha256=plCQiDKIf3V8mFhhX5H9-MF2W86i-xRdWf8Xi117Z0w,677
|
38
38
|
janito/cli/verbose_output.py,sha256=wY_B4of5e8Vv7w1fRwOZzNGU2JqbMdcFnGjtEr4hLus,7686
|
39
39
|
janito/cli/chat_mode/bindings.py,sha256=odjc5_-YW1t2FRhBUNRNoBMoQIg5sMz3ktV7xG0ADFU,975
|
40
40
|
janito/cli/chat_mode/chat_entry.py,sha256=RFdPd23jsA2DMHRacpjAdwI_1dFBaWrtnwyQEgb2fHA,475
|
41
41
|
janito/cli/chat_mode/prompt_style.py,sha256=vsqQ9xxmrYjj1pWuVe9CayQf39fo2EIXrkKPkflSVn4,805
|
42
42
|
janito/cli/chat_mode/script_runner.py,sha256=WFTFVWzg_VQrD2Ujj02XWjscfGgHwmjBeRxaEjWw9ps,6505
|
43
|
-
janito/cli/chat_mode/session.py,sha256=
|
43
|
+
janito/cli/chat_mode/session.py,sha256=JNawNraHt_N6lUy46GTLUBojLW9zhgluApQ7RSTVyJg,20107
|
44
44
|
janito/cli/chat_mode/session_profile_select.py,sha256=bEM8Q41c6taxxMCalXlLMUO18y6WRB84zaVEb-j6Wj4,6441
|
45
45
|
janito/cli/chat_mode/toolbar.py,sha256=SzdWAJdcY1g2rTPZCPL6G5X8jO6ZQYjwko2-nw54_nU,3397
|
46
46
|
janito/cli/chat_mode/shell/autocomplete.py,sha256=lE68MaVaodbA2VfUM0_YLqQVLBJAE_BJsd5cMtwuD-g,793
|
@@ -101,7 +101,7 @@ janito/cli/core/runner.py,sha256=7JS9-mN9XNFg6htjQUyOgpQFG86as_4gWMxxwRLc424,915
|
|
101
101
|
janito/cli/core/setters.py,sha256=zjSUxy6iUzcrmEunFk7dA90KqbMaq2O7LTGP8wn2HxA,5378
|
102
102
|
janito/cli/core/unsetters.py,sha256=FEw9gCt0vRvoCt0kRSNfVB2tzi_TqppJIx2nHPP59-k,2012
|
103
103
|
janito/cli/single_shot_mode/__init__.py,sha256=Ct99pKe9tINzVW6oedZJfzfZQKWpXz-weSSCn0hrwHY,115
|
104
|
-
janito/cli/single_shot_mode/handler.py,sha256=
|
104
|
+
janito/cli/single_shot_mode/handler.py,sha256=d251ObY-5bkUyccV9NYkKDF0VCKrQTrGEnwt3mtj61w,5529
|
105
105
|
janito/docs/GETTING_STARTED.md,sha256=Yx3vi1LQWyDWlE_JYuz4V9EL-Gh4WU6cOBqCr8XidF4,4960
|
106
106
|
janito/drivers/dashscope.bak.zip,sha256=9Pv4Xyciju8jO1lEMFVgYXexoZkxmDO3Ig6vw3ODfL8,4936
|
107
107
|
janito/drivers/openai_responses.bak.zip,sha256=E43eDCHGa2tCtdjzj_pMnWDdnsOZzj8BJTR5tJp8wcM,13352
|
@@ -169,7 +169,7 @@ janito/providers/moonshot/model_info.py,sha256=PpdUkmuR7g6SyiEzS9nePskPjn5xI1ZM2
|
|
169
169
|
janito/providers/moonshot/provider.py,sha256=LJxNoC7Oo-ZoFKs2ulK2lXzUEx7kV-79HJ8JG4J-UWU,3856
|
170
170
|
janito/providers/openai/__init__.py,sha256=f0m16-sIqScjL9Mp4A0CQBZx6H3PTEy0cnE08jeaB5U,38
|
171
171
|
janito/providers/openai/model_info.py,sha256=VTkq3xcx2vk0tXlFVHQxKeFzl-DL1T1J2elVOEwCdHI,4265
|
172
|
-
janito/providers/openai/provider.py,sha256=
|
172
|
+
janito/providers/openai/provider.py,sha256=PPr_qmSe5GyysnZCxhjeUVhE2LWKjKOSRel-8aaxq_U,4761
|
173
173
|
janito/providers/openai/schema_generator.py,sha256=hTqeLcPTR8jeKn5DUUpo7b-EZ-V-g1WwXiX7MbHnFzE,2234
|
174
174
|
janito/providers/zai/__init__.py,sha256=qtIr9_QBFaXG8xB6cRDGhS7se6ir11CWseI9azLMRBo,24
|
175
175
|
janito/providers/zai/model_info.py,sha256=ldwD8enpxXv1G-YsDw4YJn31YsVueQ4vj5HgoYvnPxo,1183
|
@@ -231,7 +231,7 @@ janito/tools/adapters/local/get_file_outline/markdown_outline.py,sha256=bXEBg0D9
|
|
231
231
|
janito/tools/adapters/local/get_file_outline/python_outline.py,sha256=RAcf9Vxec08lA06drYaNre5HCJ2lTzrRAskZ3rlyE-U,10326
|
232
232
|
janito/tools/adapters/local/get_file_outline/search_outline.py,sha256=bski24TpnJVf3L0TNzkx3HfvaXwttQl4EVkwk2POQOw,1348
|
233
233
|
janito/tools/adapters/local/search_text/__init__.py,sha256=FEYpF5tTtf0fiAyRGIGSn-kV-MJDkhdFIbus16mYW8Y,34
|
234
|
-
janito/tools/adapters/local/search_text/core.py,sha256=
|
234
|
+
janito/tools/adapters/local/search_text/core.py,sha256=Ryi3XOZNvk2dx5c1rAttXJKQI5yBKckav2baKYMKqyM,7882
|
235
235
|
janito/tools/adapters/local/search_text/match_lines.py,sha256=RLR8fZFP-Q57rY0fTENbMItmt3dJZiYX0otmGHVRjfw,2131
|
236
236
|
janito/tools/adapters/local/search_text/pattern_utils.py,sha256=D7vtAr8oT0tGV0C_UUarAXS9XQtP-MTYmmc8Yg8iVTg,2362
|
237
237
|
janito/tools/adapters/local/search_text/traverse_directory.py,sha256=EpL1qywAV0H29pm8-QsHrjKchKP4i4sRUOENVuNptCo,4000
|
@@ -247,9 +247,9 @@ janito/tools/adapters/local/validate_file_syntax/ps1_validator.py,sha256=TeIkPt0
|
|
247
247
|
janito/tools/adapters/local/validate_file_syntax/python_validator.py,sha256=BfCO_K18qy92m-2ZVvHsbEU5e11OPo1pO9Vz4G4616E,130
|
248
248
|
janito/tools/adapters/local/validate_file_syntax/xml_validator.py,sha256=AijlsP_PgNuC8ZbGsC5vOTt3Jur76otQzkd_7qR0QFY,284
|
249
249
|
janito/tools/adapters/local/validate_file_syntax/yaml_validator.py,sha256=TgyI0HRL6ug_gBcWEm5TGJJuA4E34ZXcIzMpAbv3oJs,155
|
250
|
-
janito-2.
|
251
|
-
janito-2.
|
252
|
-
janito-2.
|
253
|
-
janito-2.
|
254
|
-
janito-2.
|
255
|
-
janito-2.
|
250
|
+
janito-2.29.0.dist-info/licenses/LICENSE,sha256=GSAKapQH5ZIGWlpQTA7v5YrfECyaxaohUb1vJX-qepw,1090
|
251
|
+
janito-2.29.0.dist-info/METADATA,sha256=qs80f05hLB5SVF0hPk5h1vwBvWt0S1B5mWwYBr5egSE,16945
|
252
|
+
janito-2.29.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
253
|
+
janito-2.29.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
|
254
|
+
janito-2.29.0.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
|
255
|
+
janito-2.29.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|