Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 25 additions & 42 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,55 +1,38 @@
name: CI

name: CI (AST only)
on:
push:
branches: ["main"]
pull_request:
branches: ["main"]

branches: [ main ]
jobs:
build:
ast_only:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Python
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Install deps
python-version: "3.12"
- name: Install minimal deps
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt || true
pip install pytest flake8

# ΜΗΝ αποτυγχάνει το job από το flake8
- name: Lint (flake8 - non-fatal)
- name: AST pre-repair sweep
run: |
flake8 --config setup.cfg . || true

# Syntax check non-fatal για να μη μπλοκάρεις
- name: Syntax check (non-fatal)
python scripts/ast_repair.py || true
- name: AST parse all .py (post-repair)
run: |
python - <<'PY'
import py_compile, sys
try:
py_compile.compile('main.py', doraise=True)
print("py_compile: OK")
except Exception as e:
print("py_compile error:", e)
sys.exit(0)
import ast, pathlib, sys
bad=[]
for p in pathlib.Path(".").rglob("*.py"):
if any(x in p.parts for x in (".venv","__pycache__")):
continue
try:
ast.parse(p.read_text(encoding="utf-8"))
except Exception as e:
bad.append((str(p), type(e).__name__, str(e)))
if bad:
for f,t,msg in bad:
print(f"[SYNTAX] {f}: {t}: {msg}")
sys.exit(1)
print("AST OK")
PY

# Ultra-smoke pytest χωρίς 3rd-party plugins
- name: Pytest (ultra smoke)
env:
PYTEST_DISABLE_PLUGIN_AUTOLOAD: "1"
TZ: "Europe/Athens"
TELEGRAM_BOT_TOKEN: ""
TELEGRAM_CHAT_ID: ""
WALLET_ADDRESS: "0x0000000000000000000000000000000000000000"
ETHERSCAN_API: ""
CRONOS_RPC_URL: ""
run: |
pytest -q -p no:all tests/test_smoke.py || true
71 changes: 71 additions & 0 deletions scripts/ast_repair.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from __future__ import annotations
import ast, pathlib, sys

ROOT = pathlib.Path(".")
EXCLUDE = {".venv", "__pycache__"}

def excluded(p: pathlib.Path) -> bool:
return any(part in EXCLUDE for part in p.parts)

def norm(s: str) -> str:
if s.startswith("\ufeff"):
s = s.lstrip("\ufeff")
s = s.replace("\r\n","\n").replace("\r","\n")
while s.startswith("\n\n"):
s = s[1:]
return s

def looks_globally_indented(lines: list[str]) -> bool:
first = [ln for ln in lines if ln.strip()][:30]
return bool(first) and all(ln.startswith(" ") for ln in first)

def dedent4(s: str) -> str:
return "\n".join(ln[4:] if ln.startswith(" ") else ln for ln in s.splitlines())

def parse_ok(s: str, fname: str) -> tuple[bool,str]:
try:
ast.parse(s, filename=fname)
return True,""
except SyntaxError as e:
return False,f"{type(e).__name__}: {e}"
except Exception as e:
return False,f"{type(e).__name__}: {e}"

def main() -> int:
fixed, bad = [], []
for p in ROOT.rglob("*.py"):
if excluded(p): continue
try:
src = p.read_text(encoding="utf-8", errors="replace")
except Exception:
continue
ok, msg = parse_ok(src, str(p))
if ok: continue

orig = src
s = norm(src)
if looks_globally_indented(s.splitlines()):
s = dedent4(s)

ok2, msg2 = parse_ok(s, str(p))
if ok2 and s != orig:
p.write_text(s, encoding="utf-8", newline="\n")
fixed.append(str(p))
elif not ok2:
bad.append((str(p), msg, msg2))

if fixed:
print("[AST-REPAIR] Fixed:")
for f in fixed: print(" -", f)
if bad:
print("[AST-FAIL] Unfixed:")
for f,m1,m2 in bad:
print(f" - {f}\n before: {m1}\n after : {m2}")
return 2
print("AST repair sweep OK")
return 0

if __name__ == "__main__":
raise SystemExit(main())
11 changes: 11 additions & 0 deletions scripts/smoke_offline.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from __future__ import annotations
import sys

def main() -> int:
print("Offline smoke: OK (no imports beyond stdlib).")
return 0

if __name__ == "__main__":
raise SystemExit(main())