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

graphinate.server.run_graphql()   A

Complexity

Conditions 2

Size

Total Lines 35
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 20
nop 2
dl 0
loc 35
rs 9.4
c 0
b 0
f 0
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