Skip to content

Commit

Permalink
feat: init pytest workflow (#238)
Browse files Browse the repository at this point in the history
- 使用 pytest 跑单测
  • Loading branch information
RaoHai authored Aug 21, 2024
2 parents aa797d2 + 41ca1bf commit 8dc07c0
Show file tree
Hide file tree
Showing 32 changed files with 183 additions and 90 deletions.
8 changes: 7 additions & 1 deletion .github/workflows/aws-preview.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
name: Deploy Backend to Preview ECS

# on:
# workflow_run:
# workflows: ["PR Tests"]
# types:
# - completed
on:
pull_request:
branches: [ "main" ]
Expand All @@ -17,11 +22,12 @@ env:
permissions:
id-token: write # This is required for requesting the JWT
contents: read # This is required for actions/checkout
actions: write

jobs:
deploy:
runs-on: ubuntu-latest
environment: production
environment: Preview
strategy:
fail-fast: true

Expand Down
66 changes: 66 additions & 0 deletions .github/workflows/pr-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: PR Tests

on:
pull_request:
branches: [ "main" ]
paths:
- .github/workflows/aws-preview.yml
- server/**
- petercat_utils/**
- subscriber/**

permissions:
id-token: write # This is required for requesting the JWT
contents: read # This is required for actions/checkout
pull-requests: write
actions: write

env:
AWS_REGION: ap-northeast-1
REPORT_FILE: md_report.md

jobs:
build:
runs-on: ubuntu-latest
environment: Preview
strategy:
fail-fast: true
defaults:
run:
working-directory: ./server
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::654654285942:role/Github-OIDC
audience: sts.amazonaws.com
aws-region: ${{ env.AWS_REGION }}

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12.0'

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install ruff
pip install pytest pytest-cov pytest-md-report
- name: Lint with Ruff
run: |
ruff check --output-format=github .
- name: Test with pytest
run: |
pytest -v --md-report --md-report-output ${{ env.REPORT_FILE }}
cat ${{ env.REPORT_FILE }}
- name: Comment PR
uses: thollander/actions-comment-pull-request@v2
with:
filePath: ./server/${{ env.REPORT_FILE }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ venv
.next/
out/

.ruff_cache/

# production
build
Expand Down
25 changes: 0 additions & 25 deletions Makefile

This file was deleted.

13 changes: 0 additions & 13 deletions client/tests/github/pull_request_test.py

This file was deleted.

25 changes: 25 additions & 0 deletions docs/guides/self_hosting_aws.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
## Supabase Budget

|Resources| Instances | Pricing |
|---------|------|------|
| Supabase | 1 | $0


## Infrastructure Budget

|Resources| Instances | Pricing |
|---------|------|------|
| EC2 Container Registry (ECR) | | https://aws.amazon.com/cn/ecr/pricing/
| Route 53 | 1 | $0.53
| Secrets Manager | 1 | $0.40
| S3 | Very Few | https://aws.amazon.com/cn/s3/pricing/
| CloudFront | 2 | $0
| Lambda | 4 | https://aws.amazon.com/cn/lambda/pricing/


## LLM Budget

|Resources| Instances | Pricing |
|---------|------|------|
| OpenAI | - | https://openai.com/pricing/
| Gemini flash | - | $0
10 changes: 5 additions & 5 deletions petercat_utils/rag_helper/task.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import json
from typing import Optional
from github import Github

import boto3

from .git_doc_task import GitDocTask
from .git_issue_task import GitIssueTask
from .git_task import GitTask

# Create SQS client
sqs = boto3.client("sqs")

from github import Github

from ..utils.env import get_env_variable
from ..data_class import TaskStatus, TaskType
from ..db.client.supabase import get_client

# Create SQS client
sqs = boto3.client("sqs")


g = Github()

TABLE_NAME = "rag_tasks"
Expand Down
15 changes: 15 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,26 @@ authors = ["raoha.rh <[email protected]>"]
readme = "README.md"
packages = [{include = "petercat_utils"}]

[tool.ruff]
builtins = ["_"]

[pytest]
testpaths = ["tests"]
pythonpath = "."
consider_namespace_packages = "True"
python_files = "test_*.py"
cov="com"
cov-report=["xml","html"]
md_report = true
md_report_verbose = 0
md_report_color = "auto"

[tool.poetry.dependencies]
python = "^3.8"
langchain_community = "^0.2.11"
langchain_openai = "^0.1.20"
langchain_core = "0.2.28"
langchain = "^0.2.12"
supabase = "2.6.0"
pydantic = "2.7.0"
PyGithub = "2.3.0"
Expand Down
1 change: 1 addition & 0 deletions server/agent/bot_builder.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from typing import AsyncIterator, Optional
from petercat_utils.data_class import ChatData

from agent.base import AgentBuilder
from prompts.bot_builder import generate_prompt_by_user_id
from tools import bot_builder
Expand Down
5 changes: 3 additions & 2 deletions server/agent/qa_chat.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from typing import AsyncIterator, Optional
from agent.base import AgentBuilder
from prompts.bot_template import generate_prompt_by_repo_name
from petercat_utils import get_client
from petercat_utils.data_class import ChatData

from agent.base import AgentBuilder
from prompts.bot_template import generate_prompt_by_repo_name
from tools import issue, sourcecode, knowledge, git_info


Expand Down
9 changes: 5 additions & 4 deletions server/auth/get_user_info.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from typing import Annotated
from fastapi import Cookie, HTTPException
from fastapi import Cookie
import httpx
import secrets
import random
Expand All @@ -8,7 +8,8 @@
from .get_oauth_token import get_oauth_token
from petercat_utils import get_client, get_env_variable

random_str = lambda N: ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(N))
def random_str(N):
return ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(N))

AUTH0_DOMAIN = get_env_variable("AUTH0_DOMAIN")

Expand Down Expand Up @@ -70,7 +71,7 @@ async def get_user_id(petercat_user_token: Annotated[str | None, Cookie()] = Non
user_info = await getUserInfoByToken(petercat_user_token)
return user_info['id']

except Exception as e:
except Exception:
return None

async def get_user_access_token(petercat_user_token: Annotated[str | None, Cookie()] = None):
Expand All @@ -83,5 +84,5 @@ async def get_user_access_token(petercat_user_token: Annotated[str | None, Cooki
access_token = await getUserAccessToken(user_id=user_info['id'])
print(f"get_user_access_token: user_info={user_info}, access_token={access_token}")
return access_token
except Exception as e:
except Exception:
return None
1 change: 1 addition & 0 deletions server/bot/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from petercat_utils import get_client
from petercat_utils.data_class import RAGGitDocConfig
from petercat_utils import git_doc_task

from prompts.bot_template import generate_prompt_by_repo_name

g = Github()
Expand Down
7 changes: 3 additions & 4 deletions server/dao/authorizationDAO.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from supabase.client import Client

from petercat_utils.db.client.supabase import get_client

import json
from dao.BaseDAO import BaseDAO
from models.authorization import Authorization
from supabase.client import Client, create_client

from petercat_utils.db.client.supabase import get_client

class AuthorizationDAO(BaseDAO):
client: Client
Expand Down
3 changes: 2 additions & 1 deletion server/event_handler/discussion.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
from typing import Any
from github import Github, Auth
from github import GithubException
from agent.qa_chat import agent_chat

from petercat_utils.data_class import ChatData, Message, TextContentBlock

from agent.qa_chat import agent_chat


class DiscussionEventHandler:
event: Any
Expand Down
3 changes: 2 additions & 1 deletion server/event_handler/issue.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from typing import Any
from github import Github, Auth
from github import GithubException
from agent.qa_chat import agent_chat

from petercat_utils.data_class import ChatData, Message, TextContentBlock

from agent.qa_chat import agent_chat


class IssueEventHandler:
event: Any
Expand Down
13 changes: 6 additions & 7 deletions server/main.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import os

import uvicorn
from fastapi import FastAPI
from starlette.middleware.sessions import SessionMiddleware
from fastapi.middleware.cors import CORSMiddleware
Expand All @@ -10,6 +8,7 @@

# Import fastapi routers
from routers import bot, health_checker, github, rag, auth, chat, task

AUTH0_DOMAIN = get_env_variable("AUTH0_DOMAIN")
API_AUDIENCE = get_env_variable("API_IDENTIFIER")
CLIENT_ID = get_env_variable("AUTH0_CLIENT_ID")
Expand Down Expand Up @@ -50,8 +49,8 @@
app.include_router(task.router)


if __name__ == "__main__":
if is_dev:
uvicorn.run("main:app", host="0.0.0.0", port=int(os.environ.get("PORT", "8080")), reload=True)
else:
uvicorn.run(app, host="0.0.0.0", port=int(os.environ.get("PORT", "8080")))
# if __name__ == "__main__":
# if is_dev:
# uvicorn.run("main:app", host="0.0.0.0", port=int(os.environ.get("PORT", "8080")), reload=True)
# else:
# uvicorn.run(app, host="0.0.0.0", port=int(os.environ.get("PORT", "8080")))
2 changes: 1 addition & 1 deletion server/models/authorization.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from datetime import datetime
import json
from pydantic import BaseModel, field_serializer
from typing import Any, Dict
from typing import Dict

class Authorization(BaseModel):
token: str
Expand Down
6 changes: 5 additions & 1 deletion server/pytest.ini
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
[pytest]
testpaths = tests
python_files = test_*.py
rootdir=server
consider_namespace_packages = True
python_files = test_*.py
cov=com
cov-report=xml,html
5 changes: 2 additions & 3 deletions server/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ python-dotenv==1.0.0
openai
mangum
langserve
langchain_community
langchain
langchain-openai
langchain_community>=0.2.11
langchain>=0.2.12
PyGithub
GitPython
python-multipart
Expand Down
Empty file added server/routers/__init__.py
Empty file.
5 changes: 2 additions & 3 deletions server/routers/auth.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from typing import Annotated
from fastapi import APIRouter, Cookie, Request, HTTPException, status, Response

from fastapi.responses import RedirectResponse
import httpx

from petercat_utils import get_client, get_env_variable
from auth.get_user_info import generateAnonymousUser, getAnonymousUserInfoByToken, getUserAccessToken, getUserInfoByToken

from auth.get_user_info import generateAnonymousUser, getAnonymousUserInfoByToken, getUserInfoByToken

AUTH0_DOMAIN = get_env_variable("AUTH0_DOMAIN")

Expand Down
Loading

0 comments on commit 8dc07c0

Please sign in to comment.