pycode-kg 0.21.2__tar.gz → 0.21.4__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 (62) hide show
  1. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/PKG-INFO +10 -11
  2. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/README.md +5 -5
  3. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/pyproject.toml +31 -8
  4. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/__init__.py +1 -1
  5. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/analysis/bridge.py +1 -1
  6. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/analysis/centrality.py +1 -1
  7. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/analysis/framework_detector.py +1 -1
  8. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_hooks.py +1 -1
  9. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/pycodekg.py +1 -1
  10. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/snapshots.py +1 -1
  11. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/LICENSE +0 -0
  12. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/.DS_Store +0 -0
  13. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/__main__.py +0 -0
  14. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/analysis/__init__.py +0 -0
  15. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/analysis/hybrid_rank.py +0 -0
  16. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/app.py +0 -0
  17. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/architecture.py +0 -0
  18. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/build_pycodekg_sqlite.py +0 -0
  19. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/__init__.py +0 -0
  20. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_analyze.py +0 -0
  21. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_architecture.py +0 -0
  22. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_bridges.py +0 -0
  23. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_build.py +0 -0
  24. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_build_full.py +0 -0
  25. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_centrality.py +0 -0
  26. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_explain.py +0 -0
  27. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_framework_nodes.py +0 -0
  28. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_init.py +0 -0
  29. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_mcp.py +0 -0
  30. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_model.py +0 -0
  31. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_query.py +0 -0
  32. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_snapshot.py +0 -0
  33. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/cmd_viz.py +0 -0
  34. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/main.py +0 -0
  35. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/cli/options.py +0 -0
  36. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/config.py +0 -0
  37. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/explain.py +0 -0
  38. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/graph.py +0 -0
  39. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/graph_html.py +0 -0
  40. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/index.py +0 -0
  41. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/kg.py +0 -0
  42. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/layout3d.py +0 -0
  43. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/mcp_server.py +0 -0
  44. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/module/__init__.py +0 -0
  45. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/module/base.py +0 -0
  46. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/module/extractor.py +0 -0
  47. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/module/types.py +0 -0
  48. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/pycodekg_query.py +0 -0
  49. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/pycodekg_snippet_packer.py +0 -0
  50. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/pycodekg_thorough_analysis.py +0 -0
  51. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/pycodekg_viz.py +0 -0
  52. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/pycodekg_viz3d.py +0 -0
  53. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/ranking/__init__.py +0 -0
  54. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/ranking/cli_rank.py +0 -0
  55. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/ranking/coderank.py +0 -0
  56. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/sql/004_add_centrality_table.sql +0 -0
  57. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/store.py +0 -0
  58. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/theme.py +0 -0
  59. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/utils.py +0 -0
  60. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/visitor.py +0 -0
  61. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/viz3d.py +0 -0
  62. {pycode_kg-0.21.2 → pycode_kg-0.21.4}/src/pycode_kg/viz3d_timeline.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycode-kg
3
- Version: 0.21.2
3
+ Version: 0.21.4
4
4
  Summary: A tool to build a searchable knowledge graph from Python repositories
5
5
  License-Expression: Elastic-2.0
6
6
  License-File: LICENSE
@@ -24,7 +24,7 @@ Requires-Dist: PyQt5 (>=5.15.0) ; extra == "viz3d"
24
24
  Requires-Dist: click (>=8.1.0,<9)
25
25
  Requires-Dist: detect-secrets (>=1.5.0) ; extra == "all"
26
26
  Requires-Dist: detect-secrets (>=1.5.0) ; extra == "dev"
27
- Requires-Dist: kgmodule-utils[semantic,sqlite-vec,viz] (>=0.9.0)
27
+ Requires-Dist: kgmodule-utils[semantic] (>=0.10.0)
28
28
  Requires-Dist: markdown (>=3.6) ; extra == "all"
29
29
  Requires-Dist: markdown (>=3.6) ; extra == "viz3d"
30
30
  Requires-Dist: mcp (>=1.0.0,<2)
@@ -45,21 +45,20 @@ Requires-Dist: pytest-cov (>=5.0.0) ; extra == "all"
45
45
  Requires-Dist: pytest-cov (>=5.0.0) ; extra == "dev"
46
46
  Requires-Dist: pyvis (>=0.3.2) ; extra == "all"
47
47
  Requires-Dist: pyvis (>=0.3.2) ; extra == "viz"
48
- Requires-Dist: pyvista[jupyter] (>=0.44.0) ; extra == "all"
49
- Requires-Dist: pyvista[jupyter] (>=0.44.0) ; extra == "viz3d"
48
+ Requires-Dist: pyvista (>=0.44.0) ; extra == "all"
49
+ Requires-Dist: pyvista (>=0.44.0) ; extra == "viz3d"
50
50
  Requires-Dist: pyvistaqt (>=0.11.0) ; extra == "all"
51
51
  Requires-Dist: pyvistaqt (>=0.11.0) ; extra == "viz3d"
52
52
  Requires-Dist: rich (>=14.3.3,<15)
53
53
  Requires-Dist: ruff (>=0.4.0) ; extra == "all"
54
54
  Requires-Dist: ruff (>=0.4.0) ; extra == "dev"
55
- Requires-Dist: safetensors (>=0.5.0)
56
55
  Requires-Dist: sentence-transformers (>=5.4.1)
56
+ Requires-Dist: sqlite-vec (==0.1.9)
57
57
  Requires-Dist: streamlit (>=1.56.0) ; extra == "all"
58
58
  Requires-Dist: streamlit (>=1.56.0) ; extra == "viz"
59
59
  Requires-Dist: torch (>=2.5.1)
60
60
  Requires-Dist: trame-vtk (>=2.0.0) ; extra == "all"
61
61
  Requires-Dist: trame-vtk (>=2.0.0) ; extra == "viz3d"
62
- Requires-Dist: transformers (>=5.5.0,<6)
63
62
  Requires-Dist: ty (>=0.0.41) ; extra == "all"
64
63
  Requires-Dist: ty (>=0.0.41) ; extra == "dev"
65
64
  Project-URL: Homepage, https://github.com/Flux-Frontiers/pycode_kg
@@ -73,7 +72,7 @@ Description-Content-Type: text/markdown
73
72
 
74
73
  [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13-blue.svg)](https://www.python.org/)
75
74
  [![License: Elastic-2.0](https://img.shields.io/badge/License-Elastic%202.0-blue.svg)](https://www.elastic.co/licensing/elastic-license)
76
- [![Version](https://img.shields.io/badge/version-0.21.2-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
75
+ [![Version](https://img.shields.io/badge/version-0.21.4-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
77
76
  [![CI](https://github.com/Flux-Frontiers/pycode_kg/actions/workflows/ci.yml/badge.svg)](https://github.com/Flux-Frontiers/pycode_kg/actions/workflows/ci.yml)
78
77
  [![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/)
79
78
  [![DOI](https://zenodo.org/badge/1202379010.svg)](https://zenodo.org/badge/latestdoi/1202379010)
@@ -270,17 +269,17 @@ If you use PyCodeKG in your research or project, please cite it:
270
269
 
271
270
  [![DOI](https://zenodo.org/badge/1202379010.svg)](https://zenodo.org/badge/latestdoi/1202379010)
272
271
 
273
- > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.21.2) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19834777
272
+ > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.21.4) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19737993
274
273
 
275
274
  ```bibtex
276
275
  @software{suchanek_pycode_kg,
277
276
  author = {Suchanek, Eric G.},
278
277
  title = {{PyCodeKG}: A Knowledge Graph for Python Codebases},
279
- version = {0.21.2},
278
+ version = {0.21.4},
280
279
  year = {2026},
281
280
  publisher = {Flux-Frontiers},
282
281
  url = {https://github.com/Flux-Frontiers/pycode_kg},
283
- doi = {10.5281/zenodo.19834777},
282
+ doi = {10.5281/zenodo.19737993},
284
283
  }
285
284
  ```
286
285
 
@@ -300,5 +299,5 @@ If you use PyCodeKG in your research or project, please cite it:
300
299
 
301
300
  ---
302
301
 
303
- *Built for Python developers and AI agents that work alongside them — egs · Last updated July 2026*
302
+ *Built for Python developers and AI agents that work alongside them — egs · Last updated August 2026*
304
303
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13-blue.svg)](https://www.python.org/)
7
7
  [![License: Elastic-2.0](https://img.shields.io/badge/License-Elastic%202.0-blue.svg)](https://www.elastic.co/licensing/elastic-license)
8
- [![Version](https://img.shields.io/badge/version-0.21.2-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
8
+ [![Version](https://img.shields.io/badge/version-0.21.4-blue.svg)](https://github.com/Flux-Frontiers/pycode_kg/releases)
9
9
  [![CI](https://github.com/Flux-Frontiers/pycode_kg/actions/workflows/ci.yml/badge.svg)](https://github.com/Flux-Frontiers/pycode_kg/actions/workflows/ci.yml)
10
10
  [![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/)
11
11
  [![DOI](https://zenodo.org/badge/1202379010.svg)](https://zenodo.org/badge/latestdoi/1202379010)
@@ -202,17 +202,17 @@ If you use PyCodeKG in your research or project, please cite it:
202
202
 
203
203
  [![DOI](https://zenodo.org/badge/1202379010.svg)](https://zenodo.org/badge/latestdoi/1202379010)
204
204
 
205
- > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.21.2) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19834777
205
+ > Suchanek, E. G. (2026). *PyCodeKG: A Knowledge Graph for Python Codebases* (Version 0.21.4) [Software]. Flux-Frontiers. https://doi.org/10.5281/zenodo.19737993
206
206
 
207
207
  ```bibtex
208
208
  @software{suchanek_pycode_kg,
209
209
  author = {Suchanek, Eric G.},
210
210
  title = {{PyCodeKG}: A Knowledge Graph for Python Codebases},
211
- version = {0.21.2},
211
+ version = {0.21.4},
212
212
  year = {2026},
213
213
  publisher = {Flux-Frontiers},
214
214
  url = {https://github.com/Flux-Frontiers/pycode_kg},
215
- doi = {10.5281/zenodo.19834777},
215
+ doi = {10.5281/zenodo.19737993},
216
216
  }
217
217
  ```
218
218
 
@@ -232,4 +232,4 @@ If you use PyCodeKG in your research or project, please cite it:
232
232
 
233
233
  ---
234
234
 
235
- *Built for Python developers and AI agents that work alongside them — egs · Last updated July 2026*
235
+ *Built for Python developers and AI agents that work alongside them — egs · Last updated August 2026*
@@ -1,7 +1,7 @@
1
1
  # pyproject.toml — PyCodeKG package configuration (PEP 621)
2
2
  #
3
3
  # Author: Eric G. Suchanek, PhD
4
- # Last Revision: 2026-07-29
4
+ # Last Revision: 2026-08-03
5
5
  #
6
6
  # Build system : Poetry 2.x with PEP 621 [project] table
7
7
  #
@@ -70,7 +70,7 @@ torch = [
70
70
  # ---------------------------------------------------------------------------
71
71
  [project]
72
72
  name = "pycode-kg"
73
- version = "0.21.2"
73
+ version = "0.21.4"
74
74
  description = "A tool to build a searchable knowledge graph from Python repositories"
75
75
  readme = "README.md"
76
76
  license = "Elastic-2.0"
@@ -101,11 +101,28 @@ dependencies = [
101
101
  "numpy>=1.24.0",
102
102
  "pandas>=2.0.0",
103
103
  "rich>=14.3.3,<15",
104
- "safetensors>=0.5.0",
105
104
  "sentence-transformers>=5.4.1",
105
+ # Core, not optional: kg.py hard-codes vector_backend="sqlite-vec", so every
106
+ # build/query path goes through kg_utils.vector_backend.SqliteVecBackend,
107
+ # which imports sqlite_vec at connect time. Exact pin — sqlite-vec is pre-1.0
108
+ # and breaking minors ship under 0.x; kgmodule-utils pins the same ==0.1.9.
109
+ # Declared here rather than pulled via kgmodule-utils[sqlite-vec] so the
110
+ # requirement is visible in this project's own metadata (doc-kg 0.20.0 does
111
+ # the same).
112
+ "sqlite-vec==0.1.9",
113
+ # Kept direct even though `[semantic]` carries the same `>=2.5.1`: the
114
+ # `[tool.poetry.dependencies]` block above routes linux torch to the CPU-only
115
+ # index, and that enrichment only applies to a dependency this project
116
+ # declares itself. Dropping it here would pull the ~3.4G CUDA wheel back in.
106
117
  "torch>=2.5.1",
107
- "transformers>=5.5.0,<6",
108
- "kgmodule-utils[semantic,sqlite-vec,viz]>=0.9.0",
118
+ # `[semantic]` is safe again as of kgmodule-utils 0.10.0, which moved
119
+ # `lancedb` out into its own `[lancedb]` extra. It now carries numpy, rich,
120
+ # sentence-transformers, sqlite-vec, torch and transformers under the same
121
+ # constraints used here, so `transformers` needs no direct entry.
122
+ # `[viz]` stays off: kg_utils.viz imports pyvis lazily, so it would force
123
+ # pyvis into every bare install when it belongs in this project's own `viz`
124
+ # extra.
125
+ "kgmodule-utils[semantic]>=0.10.0",
109
126
  ]
110
127
 
111
128
  [project.optional-dependencies]
@@ -127,7 +144,7 @@ viz3d = [
127
144
  "markdown>=3.6",
128
145
  "param>=2.0.0",
129
146
  "PyQt5>=5.15.0",
130
- "pyvista[jupyter]>=0.44.0",
147
+ "pyvista>=0.44.0",
131
148
  "pyvistaqt>=0.11.0",
132
149
  "trame-vtk>=2.0.0",
133
150
  ]
@@ -149,7 +166,7 @@ all = [
149
166
  "PyQt5>=5.15.0",
150
167
  "pytest>=8.0.0",
151
168
  "pytest-cov>=5.0.0",
152
- "pyvista[jupyter]>=0.44.0",
169
+ "pyvista>=0.44.0",
153
170
  "pyvistaqt>=0.11.0",
154
171
  "pyvis>=0.3.2",
155
172
  "ruff>=0.4.0",
@@ -190,7 +207,13 @@ target-version = "py312"
190
207
  # Vendored agent scratch dirs (Claude Code skills, Codex) — not project code.
191
208
  # The pre-commit hook's exclude can't cover these (it runs with
192
209
  # pass_filenames: false), so the exclusion must live here.
193
- extend-exclude = [".claude", ".agents", ".codex"]
210
+ extend-exclude = [".claude", ".agents", ".codex", "*.md"]
211
+ # ruff 0.16 formats Python code blocks inside Markdown as stable behaviour
212
+ # (0.15 gates it behind preview), so `ruff format --check .` starts rewriting
213
+ # prose docs the moment the lock resolves 0.16 — a failure that looks unrelated
214
+ # to whatever change triggered the relock. Doc snippets are illustrative and
215
+ # often deliberately aligned, so keep them out of the formatter's reach.
216
+ # doc_kg and ftree_kg carry the same exclusion.
194
217
 
195
218
  [tool.ruff.lint]
196
219
  # B023, BLE001, PLC0415 replace the retired pylint hook's cell-var-from-loop,
@@ -32,7 +32,7 @@ KGModule SDK (build new domain KGs)::
32
32
  from pycode_kg import KGModule, KGExtractor, PyCodeKGExtractor, NodeSpec, EdgeSpec
33
33
  """
34
34
 
35
- __version__ = "0.21.2"
35
+ __version__ = "0.21.4"
36
36
  __author__ = "Eric G. Suchanek, PhD"
37
37
 
38
38
  # Low-level primitives (locked v0 contract)
@@ -4,7 +4,7 @@ Measures module interaction complexity: how many unique modules each module call
4
4
  For well-modularized codebases, identifies orchestrator and hub modules.
5
5
 
6
6
  Author: Eric G. Suchanek, PhD
7
- Last Revision: 2026-07-28 22:44:43
7
+ Last Revision: 2026-08-02 16:34:57
8
8
  License: Elastic 2.0
9
9
  """
10
10
 
@@ -12,7 +12,7 @@ Public API:
12
12
  - :func:`aggregate_module_scores` — roll node scores up to module level.
13
13
 
14
14
  Author: Eric G. Suchanek, PhD
15
- Last Revision: 2026-07-28 22:44:43
15
+ Last Revision: 2026-08-02 16:34:57
16
16
  """
17
17
 
18
18
  from __future__ import annotations
@@ -3,7 +3,7 @@ Framework Detector for PyCodeKG.
3
3
  Identifies repo-defining abstractions using centrality and cross-module signals.
4
4
 
5
5
  Author: Eric G. Suchanek, PhD
6
- Last Revision: 2026-07-28 22:44:43
6
+ Last Revision: 2026-08-02 16:34:57
7
7
  License: Elastic 2.0
8
8
  """
9
9
 
@@ -6,7 +6,7 @@ CLI command for installing PyCodeKG git hooks:
6
6
  install-hooks — install the pre-commit snapshot hook into .git/hooks/
7
7
 
8
8
  Author: Eric G. Suchanek, PhD
9
- Last Revision: 2026-07-29 15:21:32
9
+ Last Revision: 2026-08-02 16:34:57
10
10
  """
11
11
 
12
12
  from __future__ import annotations
@@ -23,7 +23,7 @@ No persistence, no embeddings, no LLMs—just pure AST extraction. Integration w
23
23
  vector databases and semantic search happens downstream.
24
24
 
25
25
  Author: Eric G. Suchanek, PhD
26
- Last Revision: 2026-07-28 22:44:43
26
+ Last Revision: 2026-08-02 16:34:57
27
27
  """
28
28
 
29
29
  from __future__ import annotations
@@ -35,7 +35,7 @@ Usage
35
35
  >>> prev = mgr.get_previous(tree_hash)
36
36
 
37
37
  Author: Eric G. Suchanek, PhD
38
- Last Revision: 2026-07-28
38
+ Last Revision: 2026-08-02
39
39
 
40
40
  License: Elastic 2.0
41
41
  """
File without changes