logdetective 2.2.1__py3-none-any.whl → 2.4.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.
@@ -26,6 +26,9 @@ class Extractor:
26
26
  self.skip_snippets = skip_snippets
27
27
  self.max_snippet_len = max_snippet_len
28
28
 
29
+ if self.verbose:
30
+ LOG.setLevel(logging.DEBUG)
31
+
29
32
  def __call__(self, log: str) -> list[Tuple[int, str]]:
30
33
  raise NotImplementedError
31
34
 
@@ -11,9 +11,13 @@ import gitlab.v4
11
11
  import gitlab.v4.objects
12
12
  import jinja2
13
13
  import aiohttp
14
+ import backoff
14
15
 
15
16
  from logdetective.server.config import SERVER_CONFIG, LOG
16
- from logdetective.server.exceptions import LogsTooLargeError
17
+ from logdetective.server.exceptions import (
18
+ LogsTooLargeError,
19
+ LogDetectiveConnectionError,
20
+ )
17
21
  from logdetective.server.llm import perform_staged_analysis
18
22
  from logdetective.server.metric import add_new_metrics, update_metrics
19
23
  from logdetective.server.models import (
@@ -29,6 +33,7 @@ from logdetective.server.database.models import (
29
33
  GitlabMergeRequestJobs,
30
34
  )
31
35
  from logdetective.server.compressors import RemoteLogCompressor
36
+ from logdetective.server.utils import connection_error_giveup
32
37
 
33
38
  MR_REGEX = re.compile(r"refs/merge-requests/(\d+)/.*$")
34
39
  FAILURE_LOG_REGEX = re.compile(r"(\w*\.log)")
@@ -91,8 +96,8 @@ async def process_gitlab_job_event(
91
96
  log_url, preprocessed_log = await retrieve_and_preprocess_koji_logs(
92
97
  gitlab_cfg, job
93
98
  )
94
- except LogsTooLargeError:
95
- LOG.error("Could not retrieve logs. Too large.")
99
+ except (LogsTooLargeError, LogDetectiveConnectionError) as ex:
100
+ LOG.error("Could not retrieve logs due to %s", ex)
96
101
  raise
97
102
 
98
103
  # Submit log to Log Detective and await the results.
@@ -151,6 +156,9 @@ def is_eligible_package(project_name: str):
151
156
  return True
152
157
 
153
158
 
159
+ @backoff.on_exception(
160
+ backoff.expo, ConnectionResetError, max_time=60, on_giveup=connection_error_giveup
161
+ )
154
162
  async def retrieve_and_preprocess_koji_logs(
155
163
  gitlab_cfg: GitLabInstanceConfig,
156
164
  job: gitlab.v4.objects.ProjectJob,
@@ -256,8 +264,7 @@ async def retrieve_and_preprocess_koji_logs(
256
264
  LOG.debug("Failed architecture: %s", failed_arch)
257
265
 
258
266
  log_path = failed_arches[failed_arch].as_posix()
259
-
260
- log_url = f"{gitlab_cfg.api_path}/projects/{job.project_id}/jobs/{job.id}/artifacts/{log_path}" # pylint: disable=line-too-long
267
+ log_url = f"{gitlab_cfg.url}/{gitlab_cfg.api_path}/projects/{job.project_id}/jobs/{job.id}/artifacts/{log_path}" # pylint: disable=line-too-long
261
268
  LOG.debug("Returning contents of %s%s", gitlab_cfg.url, log_url)
262
269
 
263
270
  # Return the log as a file-like object with .read() function
@@ -307,6 +307,7 @@ class GitLabInstanceConfig(BaseModel): # pylint: disable=too-many-instance-attr
307
307
 
308
308
  name: str = None
309
309
  url: str = None
310
+ # Path to API of the gitlab instance, assuming `url` as prefix.
310
311
  api_path: str = None
311
312
  api_token: str = None
312
313
 
@@ -0,0 +1,59 @@
1
+ <b>Log Detective report
2
+ {% if project %}for {{ project }}{% endif %}
3
+ </b>
4
+ <p>
5
+ Analysis:
6
+ <br>
7
+ {{ explanation }}
8
+ <br>
9
+ <details>
10
+ <summary>Analysis details</summary>
11
+ <ul>
12
+ {% for snippet in snippets %}
13
+ <li>
14
+ <b>Line {{ snippet.line_number }}:</b> <code>{{ snippet.text }}</code>
15
+ {{ snippet.explanation.text }}
16
+ </li>
17
+ {% endfor %}
18
+ </ul>
19
+ </details>
20
+ </p>
21
+ <br>
22
+ <details>
23
+ <summary>Help</summary>
24
+ <p>
25
+ Log Detective analyses logs using template mining algorithm and LLMs.
26
+ Providing overview of the primary issue, while highlighting potentially important log lines.
27
+ </p>
28
+ <p>
29
+ Log Detective may offer potential solution to problem.
30
+ However, it is designed to do so only when sufficiently confident in the response.
31
+ <br>
32
+ Even so, as with any LLM based AI system, recommendations of Log Detective must be taken with caution.
33
+ Before acting on any recommendations of Log Detective, consider following:
34
+ </p>
35
+ <ul>
36
+ <li>
37
+ <b>Do you understand how does the proposed solution work? And why should it solve your problem?</b>
38
+ </li>
39
+ <li>Did Log Detective work with sufficient information to make this suggestion?</li>
40
+ <li>Are the suggested actions safe in the context of your work?</li>
41
+ <li>Do results of snippet analysis align with results of final analysis?</li>
42
+ <li>Are there any potentially adverse outcomes from implementing proposed solution?</li>
43
+ </ul>
44
+ </details>
45
+ <br>
46
+ {% render_contacts %}
47
+ <details>
48
+ <summary>Contacts</summary>
49
+ <p>Don't hesitate to reach out with your questions or suggestions.</p>
50
+ <ul>
51
+ <li>
52
+ <a href="https://github.com/fedora-copr/logdetective">Source</a>
53
+ </li>
54
+ <li>
55
+ <a href="https://github.com/fedora-copr/logdetective/issues">Issue tracker</a>
56
+ </li>
57
+ </ul>
58
+ </details>
59
+ {% endif %}
@@ -1,68 +1,69 @@
1
- The package {{ package }} failed to build, here is a possible explanation why.
2
-
1
+ The package {{ package }} build has experienced an issue.
3
2
  Please know that the explanation was provided by AI and may be incorrect.
4
3
  {% if certainty > 0 %}
5
- In this case, we are {{ "%.2f" | format(certainty) }}% certain of the response {{ emoji_face }}.
4
+ In this case, we are {{ "%.2f" | format(certainty) }}% certain of the response {{ emoji_face }}.
6
5
  {% endif %}
7
-
8
- {{ explanation }}
9
-
10
- <details>
6
+ <b>Snippets:</b>
11
7
  <ul>
12
- {% for snippet in snippets %}
13
- <li>
14
- <b>Line {{ snippet.line_number }}:</b> <code>{{ snippet.text }}</code>
15
- {{ snippet.explanation.text }}
16
- </li>
17
- {% endfor %}
8
+ {% for snippet in snippets %}
9
+ <li>
10
+ <b>Line {{ snippet.line_number }}:</b> <code>{{ snippet.text }}</code>
11
+ {{ snippet.explanation.text }}
12
+ </li>
13
+ {% endfor %}
18
14
  </ul>
15
+ <details>
16
+ <summary>Description</summary>
17
+ {{ explanation }}
19
18
  </details>
20
-
21
19
  <details>
22
- <summary>Logs</summary>
23
- <p>
24
- Log Detective analyzed the following logs files to provide an explanation:
25
- </p>
26
-
27
- <ul>
28
- <li><a href="{{ log_url }}">{{ log_url }}</a></li>
29
- </ul>
30
-
31
- <p>
32
- Additional logs are available from:
20
+ <summary>Logs</summary>
21
+ <p>Log Detective analyzed the following logs files to provide an explanation:</p>
33
22
  <ul>
34
- <li><a href="{{ artifacts_url }}">artifacts.zip</a></li>
35
- </ul>
36
- </p>
37
-
38
- <p>
39
- Please know that these log files are automatically removed after some
40
- time, so you might need a backup.
41
- </p>
23
+ <li>
24
+ <a href="{{ log_url }}">{{ log_url }}</a>
25
+ </li>
26
+ </ul>
27
+ <p>
28
+ Additional logs are available from:
29
+ <ul>
30
+ <li>
31
+ <a href="{{ artifacts_url }}">artifacts.zip</a>
32
+ </li>
33
+ </ul>
34
+ </p>
35
+ <p>
36
+ Please know that these log files are automatically removed after some
37
+ time, so you might need a backup.
38
+ </p>
42
39
  </details>
43
-
44
40
  <details>
45
- <summary>Help</summary>
46
- <p>Don't hesitate to reach out.</p>
47
-
48
- <ul>
49
- <li><a href="https://github.com/fedora-copr/logdetective">Upstream</a></li>
50
- <li><a href="https://github.com/fedora-copr/logdetective/issues">Issue tracker</a></li>
51
- <li><a href="https://redhat.enterprise.slack.com/archives/C06DWNVKKDE">Slack</a></li>
52
- <li><a href="https://log-detective.com/documentation">Documentation</a></li>
53
- </ul>
41
+ <summary>Help</summary>
42
+ <p>Don't hesitate to reach out.</p>
43
+ <ul>
44
+ <li>
45
+ <a href="https://github.com/fedora-copr/logdetective">Upstream</a>
46
+ </li>
47
+ <li>
48
+ <a href="https://github.com/fedora-copr/logdetective/issues">Issue tracker</a>
49
+ </li>
50
+ <li>
51
+ <a href="https://redhat.enterprise.slack.com/archives/C06DWNVKKDE">Slack</a>
52
+ </li>
53
+ <li>
54
+ <a href="https://log-detective.com/documentation">Documentation</a>
55
+ </li>
56
+ </ul>
54
57
  </details>
55
-
56
-
57
58
  ---
58
59
  This comment was created by [Log Detective][log-detective].
59
-
60
- Was the provided feedback accurate and helpful? <br>Please vote with :thumbsup:
61
- or :thumbsdown: to help us improve.<br>
62
-
60
+ Was the provided feedback accurate and helpful?
61
+ <br>
62
+ Please vote with :thumbsup:
63
+ or :thumbsdown: to help us improve.
64
+ <br>
63
65
  <i>If this Log Detective report contains harmful content, please use the
64
- [Gitlab reporting feature for harmful content](https://docs.gitlab.com/user/report_abuse/)
66
+ [Gitlab reporting feature for harmful content](https://docs.gitlab.com/user/report_abuse/)
65
67
  and contact the [Log Detective developers](https://github.com/fedora-copr/logdetective/issues).</i>
66
-
67
68
  [log-detective]: https://log-detective.com/
68
69
  [contact]: https://github.com/fedora-copr
@@ -1,57 +1,60 @@
1
- The package {{ package }} failed to build, here is a possible explanation why.
2
-
1
+ The package {{ package }} build has experienced an issue.
3
2
  Please know that the explanation was provided by AI and may be incorrect.
4
3
  {% if certainty > 0 %}
5
- In this case, we are {{ "%.2f" | format(certainty) }}% certain of the response {{ emoji_face }}.
4
+ In this case, we are {{ "%.2f" | format(certainty) }}% certain of the response {{ emoji_face }}.
6
5
  {% endif %}
7
-
8
- {{ explanation }}
9
-
10
6
  <details>
11
- <summary>Logs</summary>
12
- <p>
13
- Log Detective analyzed the following logs files to provide an explanation:
14
- </p>
15
-
16
- <ul>
17
- <li><a href="{{ log_url }}">{{ log_url }}</a></li>
18
- </ul>
19
-
20
- <p>
21
- Additional logs are available from:
7
+ <summary>Description</summary>
8
+ {{ explanation }}
9
+ </details>
10
+ <details>
11
+ <summary>Logs</summary>
12
+ <p>Log Detective analyzed the following logs files to provide an explanation:</p>
22
13
  <ul>
23
- <li><a href="{{ artifacts_url }}">artifacts.zip</a></li>
24
- </ul>
25
- </p>
26
-
27
- <p>
28
- Please know that these log files are automatically removed after some
29
- time, so you might need a backup.
30
- </p>
14
+ <li>
15
+ <a href="{{ log_url }}">{{ log_url }}</a>
16
+ </li>
17
+ </ul>
18
+ <p>
19
+ Additional logs are available from:
20
+ <ul>
21
+ <li>
22
+ <a href="{{ artifacts_url }}">artifacts.zip</a>
23
+ </li>
24
+ </ul>
25
+ </p>
26
+ <p>
27
+ Please know that these log files are automatically removed after some
28
+ time, so you might need a backup.
29
+ </p>
31
30
  </details>
32
-
33
31
  <details>
34
- <summary>Help</summary>
35
- <p>Don't hesitate to reach out.</p>
36
-
37
- <ul>
38
- <li><a href="https://github.com/fedora-copr/logdetective">Upstream</a></li>
39
- <li><a href="https://github.com/fedora-copr/logdetective/issues">Issue tracker</a></li>
40
- <li><a href="https://redhat.enterprise.slack.com/archives/C06DWNVKKDE">Slack</a></li>
41
- <li><a href="https://log-detective.com/documentation">Documentation</a></li>
42
- </ul>
32
+ <summary>Help</summary>
33
+ <p>Don't hesitate to reach out.</p>
34
+ <ul>
35
+ <li>
36
+ <a href="https://github.com/fedora-copr/logdetective">Upstream</a>
37
+ </li>
38
+ <li>
39
+ <a href="https://github.com/fedora-copr/logdetective/issues">Issue tracker</a>
40
+ </li>
41
+ <li>
42
+ <a href="https://redhat.enterprise.slack.com/archives/C06DWNVKKDE">Slack</a>
43
+ </li>
44
+ <li>
45
+ <a href="https://log-detective.com/documentation">Documentation</a>
46
+ </li>
47
+ </ul>
43
48
  </details>
44
-
45
-
46
49
  ---
47
50
  This comment was created by [Log Detective][log-detective].
48
-
49
- Was the provided feedback accurate and helpful? <br>Please vote with :thumbsup:
50
- or :thumbsdown: to help us improve.<br>
51
-
51
+ Was the provided feedback accurate and helpful?
52
+ <br>
53
+ Please vote with :thumbsup:
54
+ or :thumbsdown: to help us improve.
55
+ <br>
52
56
  <i>If this Log Detective report contains harmful content, please use the
53
- [Gitlab reporting feature for harmful content](https://docs.gitlab.com/user/report_abuse/)
57
+ [Gitlab reporting feature for harmful content](https://docs.gitlab.com/user/report_abuse/)
54
58
  and contact the [Log Detective developers](https://github.com/fedora-copr/logdetective/issues).</i>
55
-
56
59
  [log-detective]: https://log-detective.com/
57
60
  [contact]: https://github.com/fedora-copr
@@ -1,8 +1,9 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: logdetective
3
- Version: 2.2.1
3
+ Version: 2.4.0
4
4
  Summary: Log using LLM AI to search for build/test failures and provide ideas for fixing these.
5
5
  License: Apache-2.0
6
+ License-File: LICENSE
6
7
  Author: Jiri Podivin
7
8
  Author-email: jpodivin@gmail.com
8
9
  Requires-Python: >=3.11,<4.0
@@ -15,6 +16,7 @@ Classifier: Programming Language :: Python :: 3
15
16
  Classifier: Programming Language :: Python :: 3.11
16
17
  Classifier: Programming Language :: Python :: 3.12
17
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
18
20
  Classifier: Topic :: Internet :: Log Analysis
19
21
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
22
  Classifier: Topic :: Software Development :: Debuggers
@@ -93,12 +95,13 @@ Usage
93
95
  -----
94
96
 
95
97
  To analyze a log file, run the script with the following command line arguments:
96
- - `url` (required): The URL of the log file to be analyzed.
97
- - `--model` (optional, default: "Mistral-7B-Instruct-v0.2-GGUF"): The path or URL of the language model for analysis. As we are using LLama.cpp we want this to be in the `gguf` format. You can include the download link to the model here. If the model is already on your machine it will skip the download.
98
+ - `file` (required): The path or URL of the log file to be analyzed.
99
+ - `--model` (optional, default: "Mistral-7B-Instruct-v0.3-GGUF"): The path or Hugging space name of the language model for analysis. For models from Hugging Face, write them as `namespace/repo_name`. As we are using LLama.cpp we want this to be in the `gguf` format. If the model is already on your machine it will skip the download.
100
+ - `--filename_suffix` (optional, default "Q4_K.gguf"): You can specify which suffix of the file to use. This option is applied when specifying model using the Hugging Face repository.
98
101
  - `--summarizer` DISABLED: LLM summarization option was removed. Argument is kept for backward compatibility only.(optional, default: "drain"): Choose between LLM and Drain template miner as the log summarizer. You can also provide the path to an existing language model file instead of using a URL.
99
102
  - `--n_lines` DISABLED: LLM summarization option was removed. Argument is kept for backward compatibility only. (optional, default: 8): The number of lines per chunk for LLM analysis. This only makes sense when you are summarizing with LLM.
100
- - `--n_clusters` (optional, default 8): Number of clusters for Drain to organize log chunks into. This only makes sense when you are summarizing with Drain
101
- - `--skip_snippets` Path to patterns for skipping snippets.
103
+ - `--n_clusters` (optional, default 8): Number of clusters for Drain to organize log chunks into. This only makes sense when you are summarizing with Drain.
104
+ - `--skip_snippets` Path to patterns for skipping snippets (in YAML).
102
105
 
103
106
  Example usage:
104
107
 
@@ -108,14 +111,10 @@ Or if the log file is stored locally:
108
111
 
109
112
  logdetective ./data/logs.txt
110
113
 
111
- Example you want to use a different model:
114
+ Examples of using different models. Note the use of `--filename_suffix` (or `-F`) option, useful for models that were quantized:
112
115
 
113
- logdetective https://example.com/logs.txt --model https://huggingface.co/QuantFactory/Meta-Llama-3-8B-Instruct-GGUF/resolve/main/Meta-Llama-3-8B-Instruct.Q5_K_S.gguf?download=true
114
- logdetective https://example.com/logs.txt --model QuantFactory/Meta-Llama-3-8B-Instruct-GGUF
115
-
116
- Example of different suffix (useful for models that were quantized)
117
-
118
- logdetective https://kojipkgs.fedoraproject.org//work/tasks/3367/131313367/build.log --model 'fedora-copr/granite-3.2-8b-instruct-GGUF' -F Q4_K.gguf
116
+ logdetective https://example.com/logs.txt --model QuantFactory/Meta-Llama-3-8B-Instruct-GGUF --filename_suffix Q5_K_S.gguf
117
+ logdetective https://kojipkgs.fedoraproject.org//work/tasks/3367/131313367/build.log --model 'fedora-copr/granite-3.2-8b-instruct-GGUF' -F Q4_K_M.gguf
119
118
 
120
119
  Example of altered prompts:
121
120
 
@@ -124,9 +123,9 @@ Example of altered prompts:
124
123
  logdetective https://kojipkgs.fedoraproject.org//work/tasks/3367/131313367/build.log --prompts ~/my-prompts.yml
125
124
 
126
125
 
127
- Note that streaming with some models (notably Meta-Llama-3 is broken) is broken and can be worked around by `no-stream` option:
126
+ Note that streaming with some models (notably Meta-Llama-3) is broken and can be worked around by `no-stream` option:
128
127
 
129
- logdetective https://example.com/logs.txt --model QuantFactory/Meta-Llama-3-8B-Instruct-GGUF --no-stream
128
+ logdetective https://example.com/logs.txt --model QuantFactory/Meta-Llama-3-8B-Instruct-GGUF --filename_suffix Q5_K_M.gguf --no-stream
130
129
 
131
130
 
132
131
  Real Example
@@ -1,7 +1,7 @@
1
1
  logdetective/__init__.py,sha256=VqRngDcuFT7JWms8Qc_MsOvajoXVOKPr-S1kqY3Pqhc,59
2
2
  logdetective/constants.py,sha256=aCwrkBrDdS_kbNESK-Z-ewg--DSzodV2OMgwEq3UE38,2456
3
3
  logdetective/drain3.ini,sha256=ni91eCT1TwTznZwcqWoOVMQcGEnWhEDNCoTPF7cfGfY,1360
4
- logdetective/extractors.py,sha256=Nh5wMcLXtcYLFAHwr6naCPPOtWzLUCW2iF__UKfckUY,5927
4
+ logdetective/extractors.py,sha256=vT-je4NkDgSj9rRtSeLpqBU52gIUnnVgJPHFbVihpCw,5993
5
5
  logdetective/logdetective.py,sha256=Ck7TL3YvdQG8zniudM8bM51LfTyVW6Ea3BarTjzjWHo,6606
6
6
  logdetective/models.py,sha256=uczmQtWFgSp_ZGssngdTM4qzPF1o64dCy0469GoSbjQ,2937
7
7
  logdetective/prompts-summary-first.yml,sha256=3Zfp4NNOfaFYq5xBlBjeQa5PdjYfS4v17OtJqQ-DRpU,821
@@ -20,20 +20,21 @@ logdetective/server/database/models/merge_request_jobs.py,sha256=q4reSC7YnEfWBPp
20
20
  logdetective/server/database/models/metrics.py,sha256=_UCaizcl9w4iX54EWvk5VvXeLcg2UfnQgXg4br3OLko,14214
21
21
  logdetective/server/emoji.py,sha256=hV4O0yfL0l1a3kWLImvBsY4AJQauKs7okYOGBEtYVz0,4795
22
22
  logdetective/server/exceptions.py,sha256=piV7wVKc-rw_pHrThbZbUjtmjuO5qUbjVNFwjdfcP3Q,864
23
- logdetective/server/gitlab.py,sha256=MrAprXLTN6Q15qBC_Y2y42iKdtmIfed_pfjEt0gABvc,16422
23
+ logdetective/server/gitlab.py,sha256=hPQICeYK1B_1BS56GIExQgEhcdS5Y6IgBCkk-eXtnDY,16708
24
24
  logdetective/server/koji.py,sha256=LG1pRiKUFvYFRKzgQoUG3pUHfcEwMoaMNjUSMKw_pBA,5640
25
25
  logdetective/server/llm.py,sha256=bmA6LsV80OdO60q4WLoKuehuVDEYq-HhBAYcZeLfrv8,10150
26
26
  logdetective/server/metric.py,sha256=QrrX1FmMa7sc57av0P9UFOiCIFYVLs1opOWV3ObYo0s,4086
27
- logdetective/server/models.py,sha256=rsdEf3lw0fvjWKhC9evaSsfZQR-H2mg0uig4KA6ho0c,20762
27
+ logdetective/server/models.py,sha256=jUzQUszMqgOeOrH1V2ORtejGrD1Nw1sX05bsbAyFvV4,20830
28
28
  logdetective/server/plot.py,sha256=C98U9prGoPkp8_t4v2dovdZuwOhSbxXSeB_K9Q2r3NE,14607
29
29
  logdetective/server/server.py,sha256=s1QtD6FYsQX7BaVi783v7sqCEk4ccqlBJHFKUQlGgWM,24684
30
- logdetective/server/templates/gitlab_full_comment.md.j2,sha256=H4NPjm3l8X5d0TNtfyZZZj_gHY1Y7hWEqY6RaVA8qt0,1947
31
- logdetective/server/templates/gitlab_short_comment.md.j2,sha256=vPisU1c98LPKEwlKtMrtlqnEOlbykPZK96MpHAf-o88,1758
30
+ logdetective/server/templates/base_response.html.j2,sha256=BJGGV_Xb0Lnue8kq32oG9lI5CQDf9vce7HMYsP-Pvb4,2040
31
+ logdetective/server/templates/gitlab_full_comment.md.j2,sha256=qcDowH7bSD1NmoCVIvR4AG61xQbuVpHQ9CGj9L-RwpM,2232
32
+ logdetective/server/templates/gitlab_short_comment.md.j2,sha256=UpQxIgOuOO8BBF__kzFl0XlCuYmcyfN2yMz6vd4PQ2Q,2000
32
33
  logdetective/server/utils.py,sha256=7ub-Nz7LUP_idwi2_nEC4FBuY9otSBUVy9nw86-sjYc,3861
33
34
  logdetective/skip_snippets.yml,sha256=reGlhPPCo06nNUJWiC2LY-OJOoPdcyOB7QBTSMeh0eg,487
34
35
  logdetective/utils.py,sha256=9EyHKGNxtS1ObSepL-T3M43rKIxQJkFDA5yllLbS5Bs,9178
35
- logdetective-2.2.1.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
36
- logdetective-2.2.1.dist-info/METADATA,sha256=qF8CgXo59m7Aa5-bbCCwc252ImSgaxfaVPiuHkvFX4c,21455
37
- logdetective-2.2.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
38
- logdetective-2.2.1.dist-info/entry_points.txt,sha256=3K_vXja6PmcA8sNdUi63WdImeiNhVZcEGPTaoJmltfA,63
39
- logdetective-2.2.1.dist-info/RECORD,,
36
+ logdetective-2.4.0.dist-info/METADATA,sha256=WjXnQeIgrvCKSHpNDPs5UuBQYEJfQn-3eGCyIOcgVCk,21645
37
+ logdetective-2.4.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
38
+ logdetective-2.4.0.dist-info/entry_points.txt,sha256=3K_vXja6PmcA8sNdUi63WdImeiNhVZcEGPTaoJmltfA,63
39
+ logdetective-2.4.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
40
+ logdetective-2.4.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any