Skip to content

Commit df05c7c

Browse files
author
luis
committed
ADD: rate of unit test coverage generation in CI
1 parent 6b06f9d commit df05c7c

File tree

16 files changed

+779
-141
lines changed

16 files changed

+779
-141
lines changed

Diff for: .circleci/config.yml

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: 2
1+
version: 2.1
22
jobs:
33
build:
44

@@ -25,4 +25,5 @@ jobs:
2525
- run: sudo pip install setuptools-rust
2626
- run: sudo python -m pip install --upgrade pip
2727
- run: sudo pip install --trusted-host=pypi.python.org --trusted-host=pypi.org --trusted-host=files.pythonhosted.org -r requirements.txt
28-
- run: python -m pytest ./tests/test_implementations
28+
- run: coverage run -m pytest ./tests/test_implementations
29+
- run: coveralls

Diff for: .coveragerc

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
[report]
3+
show_missing = True
4+
omit =
5+
venv/*
6+
tests/*
7+
# Regexes for lines to exclude from consideration
8+
exclude_lines =
9+
raise NotImplementedError
10+
self._exclude_column = \[\]
11+
if __name__ == .__main__.:

Diff for: .gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/htmlcov/
2+
.coverage

Diff for: README.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
# FastAPI Quick CRUD
22

3+
4+
5+
36
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/c2a6306f7f0a41948369d80368eb7abb)](https://www.codacy.com/gh/LuisLuii/FastAPIQuickCRUD/dashboard?utm_source=github.com&utm_medium=referral&utm_content=LuisLuii/FastAPIQuickCRUD&utm_campaign=Badge_Grade)
4-
[![CircleCI](https://circleci.com/gh/LuisLuii/FastAPIQuickCRUD/tree/develop.svg?style=svg)](https://circleci.com/gh/LuisLuii/FastAPIQuickCRUD/tree/main)
7+
[![Coverage Status](https://coveralls.io/repos/github/LuisLuii/FastAPIQuickCRUD/badge.svg?branch=feature/code_coverage)](https://coveralls.io/github/LuisLuii/FastAPIQuickCRUD?branch=develop)
8+
[![CircleCI](https://circleci.com/gh/LuisLuii/FastAPIQuickCRUD/tree/develop.svg?style=svg)](https://circleci.com/gh/LuisLuii/FastAPIQuickCRUD/tree/develop)
9+
[![PyPidownload](https://img.shields.io/pypi/dm/fastapi-quickcrud)](https://pypi.org/project/fastapi-quickcrud)
10+
[![SupportedVersion](https://img.shields.io/pypi/pyversions/fastapi-quickcrud)](https://pypi.org/project/fastapi-quickcrud)
11+
[![SupportedVersion](https://img.shields.io/pypi/status/fastapi-quickcrud)](https://pypi.org/project/fastapi-quickcrud)
512

613
---
714

Diff for: README_zh.md

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
# FastAPI Quick CRUD
22

3-
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/c2a6306f7f0a41948369d80368eb7abb)](https://www.codacy.com/gh/LuisLuii/FastAPIQuickCRUD/dashboard?utm_source=github.com&utm_medium=referral&utm_content=LuisLuii/FastAPIQuickCRUD&utm_campaign=Badge_Grade)
43

4+
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/c2a6306f7f0a41948369d80368eb7abb)](https://www.codacy.com/gh/LuisLuii/FastAPIQuickCRUD/dashboard?utm_source=github.com&utm_medium=referral&utm_content=LuisLuii/FastAPIQuickCRUD&utm_campaign=Badge_Grade)
5+
[![Coverage Status](https://coveralls.io/repos/github/LuisLuii/FastAPIQuickCRUD/badge.svg?branch=feature/code_coverage)](https://coveralls.io/github/LuisLuii/FastAPIQuickCRUD?branch=develop)
6+
[![CircleCI](https://circleci.com/gh/LuisLuii/FastAPIQuickCRUD/tree/develop.svg?style=svg)](https://circleci.com/gh/LuisLuii/FastAPIQuickCRUD/tree/develop)
7+
[![PyPidownload](https://img.shields.io/pypi/dm/fastapi-quickcrud)](https://pypi.org/project/fastapi-quickcrud)
8+
[![SupportedVersion](https://img.shields.io/pypi/pyversions/fastapi-quickcrud)](https://pypi.org/project/fastapi-quickcrud)
9+
[![SupportedVersion](https://img.shields.io/pypi/status/fastapi-quickcrud)](https://pypi.org/project/fastapi-quickcrud)
510

611
FastAPI Quick CRUD 可以為你節省編寫重複的CRUD代碼,用戶只需要為你的Postgresql table編寫Sqlalchemy Declarative Base Class 便可立即生成該Table的 CRUD API。
712

Diff for: __main__.py

Whitespace-only changes.

Diff for: requirements.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ StrEnum
77
pytest
88
guid
99
uvicorn
10-
requests
10+
requests
11+
coverage
12+
coveralls

Diff for: setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
author_email='[email protected]',
2727
url='https://gitlab.com/luislui/quickcrud',
2828
license="MIT License",
29-
keywords=["fastapi", "crud", "restful", "routing", "generator", "crudrouter","postgresql","builder"],
29+
keywords=["fastapi", "crud", "restful", "routing","SQLAlchemy", "generator", "crudrouter","postgresql","builder"],
3030
packages=find_packages('src'),
3131
package_dir={'': 'src'},
3232
setup_requires=["setuptools>=31.6.0"],

Diff for: src/fastapi_quickcrud/crud_router.py

+10-9
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from .misc.abstract_execute import SQLALchemyExecuteService, DatabasesExecuteService
1313
from .misc.abstract_parser import SQLALchemyResultParse, DatabasesResultParserBase
1414
from .misc.abstract_query import SQLALchemyQueryService
15-
from .misc.abstract_route import SQLALChemyBaseRouteSource
15+
from .misc.abstract_route import SQLALChemyBaseRouteSource, DatabasesRouteResourceBase
1616
from .misc.crud_model import CRUDModel
1717
from .misc.type import CrudMethods, SessionObject
1818

@@ -61,14 +61,15 @@ def crud_router_builder(
6161
execute_service = SQLALchemyExecuteService()
6262
crud_service = SQLALchemyQueryService(model=db_model, async_mode=async_mode)
6363
else:
64-
routes_source = SQLALChemyBaseRouteSource
65-
if not async_mode:
66-
raise Exception('databases session object only support async')
67-
result_parser = DatabasesResultParserBase(async_model=async_mode,
68-
crud_models=crud_models,
69-
autocommit=autocommit)
70-
execute_service = DatabasesExecuteService()
71-
crud_service = SQLALchemyQueryService(model=db_model, async_mode=async_mode)
64+
raise NotImplementedError
65+
# routes_source = DatabasesRouteResourceBase
66+
# if not async_mode:
67+
# raise Exception('databases session object only support async')
68+
# result_parser = DatabasesResultParserBase(async_model=async_mode,
69+
# crud_models=crud_models,
70+
# autocommit=autocommit)
71+
# execute_service = DatabasesExecuteService()
72+
# crud_service = SQLALchemyQueryService(model=db_model, async_mode=async_mode)
7273

7374
def find_one_api(request_response_model: dict, dependencies):
7475
_request_query_model = request_response_model.get('requestQueryModel', None)

Diff for: src/fastapi_quickcrud/misc/abstract_execute.py

+16-35
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
11
from abc import ABC, abstractmethod
2-
from typing import List
3-
4-
from sqlalchemy import and_, text, select, delete, update
5-
from sqlalchemy.dialects.postgresql import insert
6-
from sqlalchemy.sql.elements import BinaryExpression
7-
8-
from .exceptions import UnknownOrderType, UpdateColumnEmptyException, UnknownColumn
9-
from .type import Ordering
10-
from .utils import alias_to_column
11-
from .utils import find_query_builder
122

133

144
class DBExecuteServiceBase(ABC):
@@ -21,12 +11,13 @@ async def async_execute(self):
2111
def execute(self):
2212
raise NotImplementedError
2313

14+
2415
class SQLALchemyExecuteService(DBExecuteServiceBase):
2516

2617
def __init__(self):
2718
pass
2819

29-
async def async_execute_and_expire(self,session, stmt):
20+
async def async_execute_and_expire(self, session, stmt):
3021
result = await session.execute(stmt)
3122
session.expire_all()
3223
return result
@@ -36,35 +27,25 @@ def execute_and_expire(self, session, stmt):
3627
session.expire_all()
3728
return result
3829

39-
async def async_execute(self,session, stmt):
30+
async def async_execute(self, session, stmt):
4031
return await session.execute(stmt)
4132

42-
def execute(self,session, stmt):
33+
def execute(self, session, stmt):
4334
return session.execute(stmt)
4435

4536

46-
class DatabasesExecuteService(DBExecuteServiceBase):
47-
37+
class DatabasesExecuteService():
4838
def __init__(self):
49-
pass
50-
51-
def insert_one(self):
52-
raise NotImplementedError
53-
54-
def get_many(self):
55-
raise NotImplementedError
56-
def get_one(self):
57-
raise NotImplementedError
58-
59-
async def async_get_one(self, session, stmt):
60-
query_result = await session.fetch_one(stmt)
61-
return query_result
62-
63-
def upsert(self):
64-
raise NotImplementedError
65-
66-
def delete(self):
6739
raise NotImplementedError
6840

69-
def update(self):
70-
raise NotImplementedError
41+
# async def async_fetch_many(self, session, stmt):
42+
# return await session.fetch_all(query=stmt)
43+
#
44+
# async def async_fetch_one(self, session, stmt,value):
45+
# return await session.fetch_one(query=stmt, values=value)
46+
#
47+
# async def async_execute(self, session, stmt):
48+
# return await session.execute(query=stmt)
49+
#
50+
# async def async_execute_many(self, session, stmt):
51+
# return await session.execute_many(query=stmt)

Diff for: src/fastapi_quickcrud/misc/abstract_parser.py

+64-57
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ def find_one(self, *, response_model, sql_execute_result, fastapi_response, **kw
102102
return result
103103

104104
async def async_find_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
105+
# FIXME handle NO_CONTENT
105106
result_list = [i.__dict__ for i in sql_execute_result.scalars()]
106107
result = parse_obj_as(response_model, result_list)
107108
fastapi_response.headers["x-total-count"] = str(len(result_list))
@@ -340,62 +341,68 @@ def post_redirect_get(self, *, response_model, sql_execute_result, fastapi_reque
340341

341342

342343
class DatabasesResultParserBase(ABC):
343-
344-
def __init__(self, async_model, crud_models, autocommit):
345-
self.async_mode = async_model
346-
self.crud_models = crud_models
347-
self.primary_name = crud_models.PRIMARY_KEY_NAME
348-
self.autocommit = autocommit
349-
350-
async def async_commit(self, session):
351-
if self.autocommit:
352-
await session.commit()
353-
354-
async def async_find_one(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
355-
if not sql_execute_result:
356-
return Response('specific data not found',status_code=HTTPStatus.NOT_FOUND)
357-
result = parse_obj_as(response_model, dict(sql_execute_result))
358-
fastapi_response.headers["x-total-count"] = str(1)
359-
360-
await self.async_commit(kwargs.get('session'))
361-
return result
362-
363-
def find_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
364-
raise NotImplementedError
365-
366-
367-
def update_one(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
368-
raise NotImplementedError
369-
370-
371-
def update_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
372-
raise NotImplementedError
373-
374-
375-
def patch_one(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
376-
raise NotImplementedError
377-
378-
379-
def patch_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
380-
raise NotImplementedError
381-
382-
383-
def upsert_one(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
384-
raise NotImplementedError
385-
386-
387-
def upsert_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
388-
raise NotImplementedError
389-
390-
391-
def delete_one(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
392-
raise NotImplementedError
393-
394-
395-
def delete_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
396-
raise NotImplementedError
397-
398-
399-
def post_redirect_get(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
344+
def __init__(self):
400345
raise NotImplementedError
401346

347+
# def __init__(self, async_model, crud_models, autocommit):
348+
# self.async_mode = async_model
349+
# self.crud_models = crud_models
350+
# self.primary_name = crud_models.PRIMARY_KEY_NAME
351+
# self.autocommit = autocommit
352+
#
353+
# async def async_commit(self, session):
354+
# if self.autocommit:
355+
# await session.commit()
356+
#
357+
# async def async_find_one(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
358+
# if not sql_execute_result:
359+
# return Response('specific data not found',status_code=HTTPStatus.NOT_FOUND)
360+
# result = parse_obj_as(response_model, dict(sql_execute_result))
361+
# fastapi_response.headers["x-total-count"] = str(1)
362+
#
363+
# await self.async_commit(kwargs.get('session'))
364+
# return result
365+
#
366+
# async def async_find_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
367+
# # sql_execute_result = [] if no data
368+
# result_list = [dict(i) for i in sql_execute_result]
369+
# result = parse_obj_as(response_model, result_list)
370+
# fastapi_response.headers["x-total-count"] = str(len(result_list))
371+
# await self.async_commit(kwargs.get('session'))
372+
# return result
373+
#
374+
# def update_one(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
375+
# raise NotImplementedError
376+
#
377+
#
378+
# def update_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
379+
# raise NotImplementedError
380+
#
381+
#
382+
# def patch_one(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
383+
# raise NotImplementedError
384+
#
385+
#
386+
# def patch_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
387+
# raise NotImplementedError
388+
#
389+
#
390+
# def upsert_one(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
391+
# raise NotImplementedError
392+
#
393+
#
394+
# def upsert_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
395+
# raise NotImplementedError
396+
#
397+
#
398+
# def delete_one(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
399+
# raise NotImplementedError
400+
#
401+
#
402+
# def delete_many(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
403+
# raise NotImplementedError
404+
#
405+
#
406+
# def post_redirect_get(self, *, response_model, sql_execute_result, fastapi_response, **kwargs):
407+
# raise NotImplementedError
408+
#

0 commit comments

Comments
 (0)