Passed
Push — main ( 793ca0...1152a0 )
by Eran
01:16
created

graphinate.server   A

Complexity

Total Complexity 2

Size/Duplication

Total Lines 49
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 29
dl 0
loc 49
rs 10
c 0
b 0
f 0
wmc 2

1 Function

Rating   Name   Duplication   Size   Complexity  
A graphql() 0 35 2
1
import contextlib
2
import webbrowser
3
4
import strawberry
5
from starlette.applications import Starlette
6
from strawberry.asgi import GraphQL
7
from strawberry.extensions.tracing import OpenTelemetryExtension
8
9
from .starlette import routes
10
11
DEFAULT_PORT: int = 8072
12
13
14
def graphql(graphql_schema: strawberry.Schema, port: int = DEFAULT_PORT):
15
    """
16
17
    Args:
18
        graphql_schema:
19
        port:
20
21
    Returns:
22
23
    """
24
    graphql_schema.extensions.append(OpenTelemetryExtension)
25
26
    @contextlib.asynccontextmanager
27
    async def lifespan(app: Starlette):  # pragma: no cover
28
        def open_url():
29
            for app_name in ('voyager', 'graphiql', 'viewer'):
30
                webbrowser.open(f'http://localhost:{port}/{app_name}')
31
32
        open_url()
33
        yield
34
35
    graphql_app = GraphQL(graphql_schema)
36
    app = Starlette(
37
        lifespan=lifespan,
38
        routes=routes()
39
    )
40
    app.add_route("/graphql", graphql_app)
41
    app.add_websocket_route("/graphql", graphql_app)
42
43
    from starlette_prometheus import PrometheusMiddleware, metrics
44
    app.add_middleware(PrometheusMiddleware)
45
    app.add_route("/metrics", metrics)
46
47
    import uvicorn
48
    uvicorn.run(app, host='0.0.0.0', port=port)
49