Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
26 changes: 26 additions & 0 deletions .github/workflows/python-api-export-tasks.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Export tasks
on:
pull_request:
paths:
- "**"
Comment thread
xianbaoqian marked this conversation as resolved.
Outdated
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.8"]

steps:
- run: |
sudo apt-get update

- uses: actions/checkout@v2

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}

- run: python scripts/export_tasks.py
env: # Or as an environment variable
API_TOKEN: ${{ secrets.USER_API_TOKEN }}
Comment thread
xianbaoqian marked this conversation as resolved.
Outdated
40 changes: 40 additions & 0 deletions scripts/export_tasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import ast
Comment thread
xianbaoqian marked this conversation as resolved.
import os
import pathlib
import json

lib_to_task_map = {}


def extract_tasks(library_name, variable_name, value):
Comment thread
xianbaoqian marked this conversation as resolved.
Outdated
Comment thread
xianbaoqian marked this conversation as resolved.
Outdated
if variable_name == "ALLOWED_TASKS":
if isinstance(value, ast.Dict):
for key in value.keys:
lib_to_task_map.setdefault(library_name, []).append(key.value)
Comment thread
xianbaoqian marked this conversation as resolved.
Outdated


def traverse_global_assignments(library_name, file_content, handler):
Comment thread
xianbaoqian marked this conversation as resolved.
for element in ast.parse(file_content).body:
# Typical case
if isinstance(element, ast.AnnAssign):
handler(library_name, element.target.id, element.value)
Comment thread
xianbaoqian marked this conversation as resolved.
# Just in case user omitted the type annotation
# Unpacking and multi-variable assignment is rare so not handled
elif isinstance(element, ast.Assign):
target = element.targets[0]
if isinstance(target, ast.Name):
handler(library_name, target.id, element.value)


if __name__ == "__main__":
root = pathlib.Path(__file__).parent.parent.resolve()
libs = os.listdir(root / "docker_images")
libs.remove("common")

for lib in libs:
with open(root / "docker_images" / lib / "app/main.py") as f:
content = f.read()
traverse_global_assignments(lib, content, extract_tasks)

output = json.dumps(lib_to_task_map, sort_keys=True, indent=4)
print(output)