Skip to content
This repository was archived by the owner on Mar 10, 2026. It is now read-only.

Commit 26f3d93

Browse files
authored
Merge pull request #92 from FalkorDB/staging
Staging
2 parents bead6e5 + 9d21bb8 commit 26f3d93

File tree

10 files changed

+1778
-3500
lines changed

10 files changed

+1778
-3500
lines changed

.github/workflows/python-app.yml

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ name: Python application
55

66
on:
77
push:
8-
branches: [ "main" ]
8+
branches: [ "main", "staging" ]
99
pull_request:
10-
branches: [ "main" ]
10+
branches: [ "main", "staging" ]
1111

1212
permissions:
1313
contents: read
@@ -19,15 +19,16 @@ jobs:
1919

2020
steps:
2121
- uses: actions/checkout@v4
22-
- name: Set up Python 3.10
23-
uses: actions/setup-python@v3
22+
- name: Install uv
23+
uses: astral-sh/setup-uv@v4
24+
- name: Set up Python 3.12
25+
uses: actions/setup-python@v5
2426
with:
25-
python-version: "3.10"
27+
python-version: "3.12"
2628
- name: Install dependencies
2729
run: |
28-
python -m pip install --upgrade pip
29-
pip install flake8 pytest
30-
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
30+
uv pip install --system flake8 pytest
31+
uv pip install --system .
3132
- name: Lint with flake8
3233
run: |
3334
# stop the build if there are Python syntax errors or undefined names

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,17 @@ docker run -p 6379:6379 -p 3000:3000 -it --rm falkordb/falkordb:latest
2222

2323
Create your own `.env` file from the `.env.template` file
2424

25+
### Install dependencies
26+
27+
Install project dependencies:
28+
29+
```bash
30+
uv sync
31+
```
32+
2533
Start the server:
2634
```bash
27-
flask --app api/index.py run --debug
35+
uv run flask --app api/index.py run --debug
2836
```
2937

3038
### Creating a graph

api/analyzers/source_analyzer.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,20 +143,23 @@ def second_pass(self, graph: Graph, files: list[Path], path: Path) -> None:
143143
logging.info(f'Processing file ({i + 1}/{files_len}): {file_path}')
144144
for _, entity in file.entities.items():
145145
entity.resolved_symbol(lambda key, symbol: analyzers[file_path.suffix].resolve_symbol(self.files, lsps[file_path.suffix], file_path, path, key, symbol))
146-
for key, symbols in entity.resolved_symbols.items():
146+
for key, symbols in entity.symbols.items():
147147
for symbol in symbols:
148+
if len(symbol.resolved_symbol) == 0:
149+
continue
150+
resolved_symbol = next(iter(symbol.resolved_symbol))
148151
if key == "base_class":
149-
graph.connect_entities("EXTENDS", entity.id, symbol.id)
152+
graph.connect_entities("EXTENDS", entity.id, resolved_symbol.id)
150153
elif key == "implement_interface":
151-
graph.connect_entities("IMPLEMENTS", entity.id, symbol.id)
154+
graph.connect_entities("IMPLEMENTS", entity.id, resolved_symbol.id)
152155
elif key == "extend_interface":
153-
graph.connect_entities("EXTENDS", entity.id, symbol.id)
156+
graph.connect_entities("EXTENDS", entity.id, resolved_symbol.id)
154157
elif key == "call":
155-
graph.connect_entities("CALLS", entity.id, symbol.id)
158+
graph.connect_entities("CALLS", entity.id, resolved_symbol.id, {"line": symbol.symbol.start_point.row, "text": symbol.symbol.text.decode("utf-8")})
156159
elif key == "return_type":
157-
graph.connect_entities("RETURNS", entity.id, symbol.id)
160+
graph.connect_entities("RETURNS", entity.id, resolved_symbol.id)
158161
elif key == "parameters":
159-
graph.connect_entities("PARAMETERS", entity.id, symbol.id)
162+
graph.connect_entities("PARAMETERS", entity.id, resolved_symbol.id)
160163

161164
def analyze_files(self, files: list[Path], path: Path, graph: Graph) -> None:
162165
self.first_pass(path, files, [], graph)

api/entities/entity.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
from typing import Callable, Self
22
from tree_sitter import Node
33

4+
class Symbol:
5+
def __init__(self, symbol: Node):
6+
self.symbol = symbol
7+
self.resolved_symbol = set()
8+
9+
def add_resolve_symbol(self, resolved_symbol):
10+
self.resolved_symbol.add(resolved_symbol)
411

512
class Entity:
613
def __init__(self, node: Node):
714
self.node = node
8-
self.symbols: dict[str, list[Node]] = {}
9-
self.resolved_symbols: dict[str, set[Self]] = {}
15+
self.symbols: dict[str, list[Symbol]] = {}
1016
self.children: dict[Node, Self] = {}
1117

1218
def add_symbol(self, key: str, symbol: Node):
1319
if key not in self.symbols:
1420
self.symbols[key] = []
15-
self.symbols[key].append(symbol)
16-
17-
def add_resolved_symbol(self, key: str, symbol: Self):
18-
if key not in self.resolved_symbols:
19-
self.resolved_symbols[key] = set()
20-
self.resolved_symbols[key].add(symbol)
21+
self.symbols[key].append(Symbol(symbol))
2122

2223
def add_child(self, child: Self):
2324
child.parent = self
2425
self.children[child.node] = child
2526

2627
def resolved_symbol(self, f: Callable[[str, Node], list[Self]]):
2728
for key, symbols in self.symbols.items():
28-
self.resolved_symbols[key] = set()
2929
for symbol in symbols:
30-
for resolved_symbol in f(key, symbol):
31-
self.resolved_symbols[key].add(resolved_symbol)
30+
for resolved_symbol in f(key, symbol.symbol):
31+
symbol.add_resolve_symbol(resolved_symbol)

api/graph.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ def set_file_coverage(self, path: str, name: str, ext: str, coverage: float) ->
479479

480480
res = self._query(q, params)
481481

482-
def connect_entities(self, relation: str, src_id: int, dest_id: int) -> None:
482+
def connect_entities(self, relation: str, src_id: int, dest_id: int, properties: dict = {}) -> None:
483483
"""
484484
Establish a relationship between src and dest
485485
@@ -491,9 +491,10 @@ def connect_entities(self, relation: str, src_id: int, dest_id: int) -> None:
491491
q = f"""MATCH (src), (dest)
492492
WHERE ID(src) = $src_id AND ID(dest) = $dest_id
493493
MERGE (src)-[e:{relation}]->(dest)
494+
SET e += $properties
494495
RETURN e"""
495496

496-
params = {'src_id': src_id, 'dest_id': dest_id}
497+
params = {'src_id': src_id, 'dest_id': dest_id, "properties": properties}
497498
self._query(q, params)
498499

499500
def function_calls_function(self, caller_id: int, callee_id: int, pos: int) -> None:

api/llm.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,6 @@ def _define_ontology() -> Ontology:
235235
ontology = _define_ontology()
236236

237237
def _create_kg_agent(repo_name: str):
238-
global ontology
239-
240238
model_name = os.getenv('MODEL_NAME', 'gemini/gemini-2.0-flash')
241239

242240
model = LiteModel(model_name)

0 commit comments

Comments
 (0)