robyn 0.73.0__cp311-cp311-macosx_10_12_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of robyn might be problematic. Click here for more details.
- robyn/__init__.py +757 -0
- robyn/__main__.py +4 -0
- robyn/ai.py +308 -0
- robyn/argument_parser.py +129 -0
- robyn/authentication.py +96 -0
- robyn/cli.py +136 -0
- robyn/dependency_injection.py +71 -0
- robyn/env_populator.py +35 -0
- robyn/events.py +6 -0
- robyn/exceptions.py +32 -0
- robyn/jsonify.py +13 -0
- robyn/logger.py +80 -0
- robyn/mcp.py +461 -0
- robyn/openapi.py +448 -0
- robyn/processpool.py +226 -0
- robyn/py.typed +0 -0
- robyn/reloader.py +164 -0
- robyn/responses.py +208 -0
- robyn/robyn.cpython-311-darwin.so +0 -0
- robyn/robyn.pyi +421 -0
- robyn/router.py +410 -0
- robyn/scaffold/mongo/Dockerfile +12 -0
- robyn/scaffold/mongo/app.py +43 -0
- robyn/scaffold/mongo/requirements.txt +2 -0
- robyn/scaffold/no-db/Dockerfile +12 -0
- robyn/scaffold/no-db/app.py +12 -0
- robyn/scaffold/no-db/requirements.txt +1 -0
- robyn/scaffold/postgres/Dockerfile +32 -0
- robyn/scaffold/postgres/app.py +31 -0
- robyn/scaffold/postgres/requirements.txt +3 -0
- robyn/scaffold/postgres/supervisord.conf +14 -0
- robyn/scaffold/prisma/Dockerfile +15 -0
- robyn/scaffold/prisma/app.py +32 -0
- robyn/scaffold/prisma/requirements.txt +2 -0
- robyn/scaffold/prisma/schema.prisma +13 -0
- robyn/scaffold/sqlalchemy/Dockerfile +12 -0
- robyn/scaffold/sqlalchemy/__init__.py +0 -0
- robyn/scaffold/sqlalchemy/app.py +13 -0
- robyn/scaffold/sqlalchemy/models.py +21 -0
- robyn/scaffold/sqlalchemy/requirements.txt +2 -0
- robyn/scaffold/sqlite/Dockerfile +12 -0
- robyn/scaffold/sqlite/app.py +22 -0
- robyn/scaffold/sqlite/requirements.txt +1 -0
- robyn/scaffold/sqlmodel/Dockerfile +11 -0
- robyn/scaffold/sqlmodel/app.py +46 -0
- robyn/scaffold/sqlmodel/models.py +10 -0
- robyn/scaffold/sqlmodel/requirements.txt +2 -0
- robyn/status_codes.py +137 -0
- robyn/swagger.html +32 -0
- robyn/templating.py +30 -0
- robyn/types.py +44 -0
- robyn/ws.py +67 -0
- robyn-0.73.0.dist-info/METADATA +32 -0
- robyn-0.73.0.dist-info/RECORD +57 -0
- robyn-0.73.0.dist-info/WHEEL +4 -0
- robyn-0.73.0.dist-info/entry_points.txt +3 -0
- robyn-0.73.0.dist-info/licenses/LICENSE +25 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from sqlalchemy import Boolean, Column, Integer, String, create_engine
|
|
2
|
+
from sqlalchemy.orm import declarative_base, sessionmaker
|
|
3
|
+
|
|
4
|
+
Base = declarative_base()
|
|
5
|
+
|
|
6
|
+
engine = create_engine("sqlite+pysqlite:///:memory:", echo=True)
|
|
7
|
+
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class User(Base):
|
|
11
|
+
__tablename__ = "users"
|
|
12
|
+
|
|
13
|
+
id = Column(Integer, primary_key=True, index=True)
|
|
14
|
+
username = Column(String, unique=True, index=True)
|
|
15
|
+
hashed_password = Column(String)
|
|
16
|
+
is_active = Column(Boolean, default=True)
|
|
17
|
+
is_superuser = Column(Boolean, default=False)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
if __name__ == "__main__":
|
|
21
|
+
Base.metadata.create_all(bind=engine)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import sqlite3
|
|
2
|
+
|
|
3
|
+
from robyn import Robyn
|
|
4
|
+
|
|
5
|
+
app = Robyn(__file__)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@app.get("/")
|
|
9
|
+
def index():
|
|
10
|
+
# your db name
|
|
11
|
+
conn = sqlite3.connect("example.db")
|
|
12
|
+
cur = conn.cursor()
|
|
13
|
+
cur.execute("DROP TABLE IF EXISTS test")
|
|
14
|
+
cur.execute("CREATE TABLE test(column_1, column_2)")
|
|
15
|
+
res = cur.execute("SELECT name FROM sqlite_master")
|
|
16
|
+
th = res.fetchone()
|
|
17
|
+
table_name = th[0]
|
|
18
|
+
return f"Hello World! {table_name}"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
if __name__ == "__main__":
|
|
22
|
+
app.start(host="0.0.0.0", port=8080)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
robyn
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from models import Hero
|
|
2
|
+
from sqlmodel import Session, SQLModel, create_engine, select
|
|
3
|
+
|
|
4
|
+
from robyn import Robyn
|
|
5
|
+
|
|
6
|
+
app = Robyn(__file__)
|
|
7
|
+
|
|
8
|
+
engine = create_engine("sqlite:///database.db", echo=True)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@app.get("/")
|
|
12
|
+
def index():
|
|
13
|
+
return "Hello World"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@app.get("/create")
|
|
17
|
+
def create():
|
|
18
|
+
SQLModel.metadata.create_all(bind=engine)
|
|
19
|
+
return "created tables"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@app.get("/insert")
|
|
23
|
+
def insert():
|
|
24
|
+
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
|
|
25
|
+
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
|
|
26
|
+
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)
|
|
27
|
+
|
|
28
|
+
with Session(engine) as session:
|
|
29
|
+
session.add(hero_1)
|
|
30
|
+
session.add(hero_2)
|
|
31
|
+
session.add(hero_3)
|
|
32
|
+
session.commit()
|
|
33
|
+
return "inserted"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@app.get("/select")
|
|
37
|
+
def get_data():
|
|
38
|
+
with Session(engine) as session:
|
|
39
|
+
statement = select(Hero).where(Hero.name == "Spider-Boy")
|
|
40
|
+
hero = session.exec(statement).first()
|
|
41
|
+
return hero
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
if __name__ == "__main__":
|
|
45
|
+
# create a configured "Session" class
|
|
46
|
+
app.start(host="0.0.0.0", port=8080)
|
robyn/status_codes.py
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""
|
|
2
|
+
HTTP codes
|
|
3
|
+
See HTTP Status Code Registry:
|
|
4
|
+
https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
|
|
5
|
+
|
|
6
|
+
And RFC 2324 - https://tools.ietf.org/html/rfc2324
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
__all__ = (
|
|
10
|
+
"HTTP_100_CONTINUE",
|
|
11
|
+
"HTTP_101_SWITCHING_PROTOCOLS",
|
|
12
|
+
"HTTP_102_PROCESSING",
|
|
13
|
+
"HTTP_103_EARLY_HINTS",
|
|
14
|
+
"HTTP_200_OK",
|
|
15
|
+
"HTTP_201_CREATED",
|
|
16
|
+
"HTTP_202_ACCEPTED",
|
|
17
|
+
"HTTP_203_NON_AUTHORITATIVE_INFORMATION",
|
|
18
|
+
"HTTP_204_NO_CONTENT",
|
|
19
|
+
"HTTP_205_RESET_CONTENT",
|
|
20
|
+
"HTTP_206_PARTIAL_CONTENT",
|
|
21
|
+
"HTTP_207_MULTI_STATUS",
|
|
22
|
+
"HTTP_208_ALREADY_REPORTED",
|
|
23
|
+
"HTTP_226_IM_USED",
|
|
24
|
+
"HTTP_300_MULTIPLE_CHOICES",
|
|
25
|
+
"HTTP_301_MOVED_PERMANENTLY",
|
|
26
|
+
"HTTP_302_FOUND",
|
|
27
|
+
"HTTP_303_SEE_OTHER",
|
|
28
|
+
"HTTP_304_NOT_MODIFIED",
|
|
29
|
+
"HTTP_305_USE_PROXY",
|
|
30
|
+
"HTTP_306_RESERVED",
|
|
31
|
+
"HTTP_307_TEMPORARY_REDIRECT",
|
|
32
|
+
"HTTP_308_PERMANENT_REDIRECT",
|
|
33
|
+
"HTTP_400_BAD_REQUEST",
|
|
34
|
+
"HTTP_401_UNAUTHORIZED",
|
|
35
|
+
"HTTP_402_PAYMENT_REQUIRED",
|
|
36
|
+
"HTTP_403_FORBIDDEN",
|
|
37
|
+
"HTTP_404_NOT_FOUND",
|
|
38
|
+
"HTTP_405_METHOD_NOT_ALLOWED",
|
|
39
|
+
"HTTP_406_NOT_ACCEPTABLE",
|
|
40
|
+
"HTTP_407_PROXY_AUTHENTICATION_REQUIRED",
|
|
41
|
+
"HTTP_408_REQUEST_TIMEOUT",
|
|
42
|
+
"HTTP_409_CONFLICT",
|
|
43
|
+
"HTTP_410_GONE",
|
|
44
|
+
"HTTP_411_LENGTH_REQUIRED",
|
|
45
|
+
"HTTP_412_PRECONDITION_FAILED",
|
|
46
|
+
"HTTP_413_REQUEST_ENTITY_TOO_LARGE",
|
|
47
|
+
"HTTP_414_REQUEST_URI_TOO_LONG",
|
|
48
|
+
"HTTP_415_UNSUPPORTED_MEDIA_TYPE",
|
|
49
|
+
"HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE",
|
|
50
|
+
"HTTP_417_EXPECTATION_FAILED",
|
|
51
|
+
"HTTP_418_IM_A_TEAPOT",
|
|
52
|
+
"HTTP_421_MISDIRECTED_REQUEST",
|
|
53
|
+
"HTTP_422_UNPROCESSABLE_ENTITY",
|
|
54
|
+
"HTTP_423_LOCKED",
|
|
55
|
+
"HTTP_424_FAILED_DEPENDENCY",
|
|
56
|
+
"HTTP_425_TOO_EARLY",
|
|
57
|
+
"HTTP_426_UPGRADE_REQUIRED",
|
|
58
|
+
"HTTP_428_PRECONDITION_REQUIRED",
|
|
59
|
+
"HTTP_429_TOO_MANY_REQUESTS",
|
|
60
|
+
"HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE",
|
|
61
|
+
"HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS",
|
|
62
|
+
"HTTP_500_INTERNAL_SERVER_ERROR",
|
|
63
|
+
"HTTP_501_NOT_IMPLEMENTED",
|
|
64
|
+
"HTTP_502_BAD_GATEWAY",
|
|
65
|
+
"HTTP_503_SERVICE_UNAVAILABLE",
|
|
66
|
+
"HTTP_504_GATEWAY_TIMEOUT",
|
|
67
|
+
"HTTP_505_HTTP_VERSION_NOT_SUPPORTED",
|
|
68
|
+
"HTTP_506_VARIANT_ALSO_NEGOTIATES",
|
|
69
|
+
"HTTP_507_INSUFFICIENT_STORAGE",
|
|
70
|
+
"HTTP_508_LOOP_DETECTED",
|
|
71
|
+
"HTTP_510_NOT_EXTENDED",
|
|
72
|
+
"HTTP_511_NETWORK_AUTHENTICATION_REQUIRED",
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
HTTP_100_CONTINUE = 100
|
|
76
|
+
HTTP_101_SWITCHING_PROTOCOLS = 101
|
|
77
|
+
HTTP_102_PROCESSING = 102
|
|
78
|
+
HTTP_103_EARLY_HINTS = 103
|
|
79
|
+
HTTP_200_OK = 200
|
|
80
|
+
HTTP_201_CREATED = 201
|
|
81
|
+
HTTP_202_ACCEPTED = 202
|
|
82
|
+
HTTP_203_NON_AUTHORITATIVE_INFORMATION = 203
|
|
83
|
+
HTTP_204_NO_CONTENT = 204
|
|
84
|
+
HTTP_205_RESET_CONTENT = 205
|
|
85
|
+
HTTP_206_PARTIAL_CONTENT = 206
|
|
86
|
+
HTTP_207_MULTI_STATUS = 207
|
|
87
|
+
HTTP_208_ALREADY_REPORTED = 208
|
|
88
|
+
HTTP_226_IM_USED = 226
|
|
89
|
+
HTTP_300_MULTIPLE_CHOICES = 300
|
|
90
|
+
HTTP_301_MOVED_PERMANENTLY = 301
|
|
91
|
+
HTTP_302_FOUND = 302
|
|
92
|
+
HTTP_303_SEE_OTHER = 303
|
|
93
|
+
HTTP_304_NOT_MODIFIED = 304
|
|
94
|
+
HTTP_305_USE_PROXY = 305
|
|
95
|
+
HTTP_306_RESERVED = 306
|
|
96
|
+
HTTP_307_TEMPORARY_REDIRECT = 307
|
|
97
|
+
HTTP_308_PERMANENT_REDIRECT = 308
|
|
98
|
+
HTTP_400_BAD_REQUEST = 400
|
|
99
|
+
HTTP_401_UNAUTHORIZED = 401
|
|
100
|
+
HTTP_402_PAYMENT_REQUIRED = 402
|
|
101
|
+
HTTP_403_FORBIDDEN = 403
|
|
102
|
+
HTTP_404_NOT_FOUND = 404
|
|
103
|
+
HTTP_405_METHOD_NOT_ALLOWED = 405
|
|
104
|
+
HTTP_406_NOT_ACCEPTABLE = 406
|
|
105
|
+
HTTP_407_PROXY_AUTHENTICATION_REQUIRED = 407
|
|
106
|
+
HTTP_408_REQUEST_TIMEOUT = 408
|
|
107
|
+
HTTP_409_CONFLICT = 409
|
|
108
|
+
HTTP_410_GONE = 410
|
|
109
|
+
HTTP_411_LENGTH_REQUIRED = 411
|
|
110
|
+
HTTP_412_PRECONDITION_FAILED = 412
|
|
111
|
+
HTTP_413_REQUEST_ENTITY_TOO_LARGE = 413
|
|
112
|
+
HTTP_414_REQUEST_URI_TOO_LONG = 414
|
|
113
|
+
HTTP_415_UNSUPPORTED_MEDIA_TYPE = 415
|
|
114
|
+
HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE = 416
|
|
115
|
+
HTTP_417_EXPECTATION_FAILED = 417
|
|
116
|
+
HTTP_418_IM_A_TEAPOT = 418
|
|
117
|
+
HTTP_421_MISDIRECTED_REQUEST = 421
|
|
118
|
+
HTTP_422_UNPROCESSABLE_ENTITY = 422
|
|
119
|
+
HTTP_423_LOCKED = 423
|
|
120
|
+
HTTP_424_FAILED_DEPENDENCY = 424
|
|
121
|
+
HTTP_425_TOO_EARLY = 425
|
|
122
|
+
HTTP_426_UPGRADE_REQUIRED = 426
|
|
123
|
+
HTTP_428_PRECONDITION_REQUIRED = 428
|
|
124
|
+
HTTP_429_TOO_MANY_REQUESTS = 429
|
|
125
|
+
HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE = 431
|
|
126
|
+
HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS = 451
|
|
127
|
+
HTTP_500_INTERNAL_SERVER_ERROR = 500
|
|
128
|
+
HTTP_501_NOT_IMPLEMENTED = 501
|
|
129
|
+
HTTP_502_BAD_GATEWAY = 502
|
|
130
|
+
HTTP_503_SERVICE_UNAVAILABLE = 503
|
|
131
|
+
HTTP_504_GATEWAY_TIMEOUT = 504
|
|
132
|
+
HTTP_505_HTTP_VERSION_NOT_SUPPORTED = 505
|
|
133
|
+
HTTP_506_VARIANT_ALSO_NEGOTIATES = 506
|
|
134
|
+
HTTP_507_INSUFFICIENT_STORAGE = 507
|
|
135
|
+
HTTP_508_LOOP_DETECTED = 508
|
|
136
|
+
HTTP_510_NOT_EXTENDED = 510
|
|
137
|
+
HTTP_511_NETWORK_AUTHENTICATION_REQUIRED = 511
|
robyn/swagger.html
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>Robyn OpenAPI Docs</title>
|
|
5
|
+
<link
|
|
6
|
+
rel="stylesheet"
|
|
7
|
+
type="text/css"
|
|
8
|
+
href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css"
|
|
9
|
+
/>
|
|
10
|
+
<link
|
|
11
|
+
rel="icon"
|
|
12
|
+
type="image/png"
|
|
13
|
+
href="https://user-images.githubusercontent.com/29942790/140995889-5d91dcff-3aa7-4cfb-8a90-2cddf1337dca.png"
|
|
14
|
+
/>
|
|
15
|
+
<script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
|
|
16
|
+
<script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-standalone-preset.js"></script>
|
|
17
|
+
</head>
|
|
18
|
+
<body>
|
|
19
|
+
<div id="swagger-ui"></div>
|
|
20
|
+
<script>
|
|
21
|
+
window.onload = function () {
|
|
22
|
+
SwaggerUIBundle({
|
|
23
|
+
url: "/openapi.json",
|
|
24
|
+
dom_id: "#swagger-ui",
|
|
25
|
+
deepLinking: true,
|
|
26
|
+
presets: [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset],
|
|
27
|
+
layout: "StandaloneLayout",
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
</script>
|
|
31
|
+
</body>
|
|
32
|
+
</html>
|
robyn/templating.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
from jinja2 import Environment, FileSystemLoader
|
|
4
|
+
|
|
5
|
+
from robyn import status_codes
|
|
6
|
+
|
|
7
|
+
from .robyn import Headers, Response
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TemplateInterface(ABC):
|
|
11
|
+
def __init__(self): ...
|
|
12
|
+
|
|
13
|
+
@abstractmethod
|
|
14
|
+
def render_template(self, *args, **kwargs) -> Response: ...
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class JinjaTemplate(TemplateInterface):
|
|
18
|
+
def __init__(self, directory, encoding="utf-8", followlinks=False):
|
|
19
|
+
self.env = Environment(loader=FileSystemLoader(searchpath=directory, encoding=encoding, followlinks=followlinks))
|
|
20
|
+
|
|
21
|
+
def render_template(self, template_name, **kwargs) -> Response:
|
|
22
|
+
rendered_template = self.env.get_template(template_name).render(**kwargs)
|
|
23
|
+
return Response(
|
|
24
|
+
status_code=status_codes.HTTP_200_OK,
|
|
25
|
+
description=rendered_template,
|
|
26
|
+
headers=Headers({"Content-Type": "text/html; charset=utf-8"}),
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
__all__ = ["TemplateInterface", "JinjaTemplate"]
|
robyn/types.py
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Dict, NewType, Optional, TypedDict
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@dataclass
|
|
6
|
+
class Directory:
|
|
7
|
+
route: str
|
|
8
|
+
directory_path: str
|
|
9
|
+
show_files_listing: bool
|
|
10
|
+
index_file: Optional[str]
|
|
11
|
+
|
|
12
|
+
def as_list(self):
|
|
13
|
+
return [
|
|
14
|
+
self.route,
|
|
15
|
+
self.directory_path,
|
|
16
|
+
self.show_files_listing,
|
|
17
|
+
self.index_file,
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
PathParams = NewType("PathParams", Dict[str, str])
|
|
22
|
+
Method = NewType("Method", str)
|
|
23
|
+
FormData = NewType("FormData", Dict[str, str])
|
|
24
|
+
Files = NewType("Files", Dict[str, bytes])
|
|
25
|
+
IPAddress = NewType("IPAddress", Optional[str])
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class JSONResponse(TypedDict):
|
|
29
|
+
"""
|
|
30
|
+
A type alias for openapi response bodies. This class should be inherited by the response class type definition.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class Body:
|
|
37
|
+
"""
|
|
38
|
+
A type alias for openapi request bodies. This class should be inherited by the request body class annotation.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
__all__ = ["JSONResponse", "Body"]
|
robyn/ws.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import inspect
|
|
4
|
+
from typing import TYPE_CHECKING, Callable
|
|
5
|
+
|
|
6
|
+
from robyn.argument_parser import Config
|
|
7
|
+
from robyn.dependency_injection import DependencyMap
|
|
8
|
+
from robyn.robyn import FunctionInfo
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from robyn import Robyn
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
|
|
15
|
+
_logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class WebSocket:
|
|
19
|
+
# should this be websocket router?
|
|
20
|
+
"""This is the python wrapper for the web socket that will be used here."""
|
|
21
|
+
|
|
22
|
+
def __init__(self, robyn_object: "Robyn", endpoint: str, config: Config = Config(), dependencies: DependencyMap = DependencyMap()) -> None:
|
|
23
|
+
self.robyn_object = robyn_object
|
|
24
|
+
self.endpoint = endpoint
|
|
25
|
+
self.methods: dict = {}
|
|
26
|
+
self.config = config
|
|
27
|
+
self.dependencies = dependencies
|
|
28
|
+
|
|
29
|
+
def on(self, type: str) -> Callable[..., None]:
|
|
30
|
+
def inner(handler):
|
|
31
|
+
if type not in ["connect", "close", "message"]:
|
|
32
|
+
raise Exception(f"Socket method {type} does not exist")
|
|
33
|
+
|
|
34
|
+
params = dict(inspect.signature(handler).parameters)
|
|
35
|
+
num_params = len(params)
|
|
36
|
+
is_async = inspect.iscoroutinefunction(handler)
|
|
37
|
+
|
|
38
|
+
injected_dependencies = self.dependencies.get_dependency_map(self)
|
|
39
|
+
|
|
40
|
+
new_injected_dependencies = {}
|
|
41
|
+
for dependency in injected_dependencies:
|
|
42
|
+
if dependency in params:
|
|
43
|
+
new_injected_dependencies[dependency] = injected_dependencies[dependency]
|
|
44
|
+
else:
|
|
45
|
+
_logger.debug(f"Dependency {dependency} is not used in the handler {handler.__name__}")
|
|
46
|
+
|
|
47
|
+
self.methods[type] = FunctionInfo(handler, is_async, num_params, params, kwargs=new_injected_dependencies)
|
|
48
|
+
self.robyn_object.add_web_socket(self.endpoint, self)
|
|
49
|
+
|
|
50
|
+
return inner
|
|
51
|
+
|
|
52
|
+
def inject(self, **kwargs):
|
|
53
|
+
"""
|
|
54
|
+
Injects the dependencies for the route
|
|
55
|
+
|
|
56
|
+
:param kwargs dict: the dependencies to be injected
|
|
57
|
+
"""
|
|
58
|
+
self.dependencies.add_router_dependency(self, **kwargs)
|
|
59
|
+
|
|
60
|
+
def inject_global(self, **kwargs):
|
|
61
|
+
"""
|
|
62
|
+
Injects the dependencies for the global routes
|
|
63
|
+
Ideally, this function should be a global function
|
|
64
|
+
|
|
65
|
+
:param kwargs dict: the dependencies to be injected
|
|
66
|
+
"""
|
|
67
|
+
self.dependencies.add_global_dependency(**kwargs)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: robyn
|
|
3
|
+
Version: 0.73.0
|
|
4
|
+
Classifier: Development Status :: 3 - Alpha
|
|
5
|
+
Classifier: Environment :: Web Environment
|
|
6
|
+
Classifier: Intended Audience :: Developers
|
|
7
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
8
|
+
Classifier: Operating System :: OS Independent
|
|
9
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
17
|
+
Requires-Dist: inquirerpy==0.3.4
|
|
18
|
+
Requires-Dist: multiprocess==0.70.14
|
|
19
|
+
Requires-Dist: orjson>=3.11.5,<4.0.0
|
|
20
|
+
Requires-Dist: rustimport==1.3.4
|
|
21
|
+
Requires-Dist: uvloop~=0.22.1 ; platform_machine != 'armv7l' and platform_python_implementation == 'CPython' and sys_platform != 'win32'
|
|
22
|
+
Requires-Dist: watchdog==4.0.1
|
|
23
|
+
Requires-Dist: jinja2==3.0.1 ; extra == 'templating'
|
|
24
|
+
Provides-Extra: templating
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Summary: A Super Fast Async Python Web Framework with a Rust runtime.
|
|
27
|
+
Home-Page: https://github.com/sparckles/robyn
|
|
28
|
+
Author-email: Sanskar Jethi <sansyrox@gmail.com>
|
|
29
|
+
Project-URL: Changelog, https://github.com/sparckles/robyn/blob/main/CHANGELOG.md
|
|
30
|
+
Project-URL: Documentation, https://robyn.tech/
|
|
31
|
+
Project-URL: Issues, https://github.com/sparckles/robyn/issues
|
|
32
|
+
Project-URL: Repository, https://github.com/sparckles/robyn
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
robyn/__init__.py,sha256=ABaactRlCDMHgaatL9bgzE7YLjcACimtfd43-fHyJQs,29829
|
|
2
|
+
robyn/__main__.py,sha256=kpXJC6Zhn63mMPoRtX0ufk4XgPix8eqYXTKz4ju87FQ,64
|
|
3
|
+
robyn/ai.py,sha256=hhd_U8SQuNnlzRIi8wtURe9wdCeck5ck2W0aR5V_Gv8,10023
|
|
4
|
+
robyn/argument_parser.py,sha256=ftg_t9ZriK5S1yKw6a3E7Y9O3q9pg5Gw5mSgLDI2WSU,4251
|
|
5
|
+
robyn/authentication.py,sha256=iQy4AFB3iASKTYEs3WNBQCTTKwLZmh2Y4WFeXt6RwGM,3061
|
|
6
|
+
robyn/cli.py,sha256=WjBoFPoPDEUaPlD2gmRAy_citD8F_vuigVbxAuZhA-Y,3938
|
|
7
|
+
robyn/dependency_injection.py,sha256=so4u-_gZVnbut6z-MvwJv5deg5QJhUGJN4qqhr9tK9o,2450
|
|
8
|
+
robyn/env_populator.py,sha256=Ig5LVQGcGehzy4gislnFvTfIr-htHgi-YyYcTSSIsx8,1094
|
|
9
|
+
robyn/events.py,sha256=y5NxCIUZq0AGBzA6u-VYhuy5ew6SMTHvy2TRmSvJykQ,94
|
|
10
|
+
robyn/exceptions.py,sha256=VsvUp1VS1PSyJI3b5FbZDDTx4ZLwWObhjHUQN_lEmp8,965
|
|
11
|
+
robyn/jsonify.py,sha256=6_oAwg1p3LocMMs1vB9uyd_iL3MV5tOISwaU0HUznNo,308
|
|
12
|
+
robyn/logger.py,sha256=JGlQUhVUTdqIWPiiZ3KdGMP7uPofpcPSzNqcvisVt78,1829
|
|
13
|
+
robyn/mcp.py,sha256=qLtycnKmQectAAgM1jIVWOkNbUcnAEIMBLJp9sX_cnM,17691
|
|
14
|
+
robyn/openapi.py,sha256=EDdxO9oqTjQAXFPIXkL7bhaeLlJDVg0aV7Jy6QFMzIA,17092
|
|
15
|
+
robyn/processpool.py,sha256=5_mBAO6OZHL_Ox55ziOPCB4Mjm8aAjF2FdyglsxczOM,7163
|
|
16
|
+
robyn/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
robyn/reloader.py,sha256=XkJTCKwdA7hXfLn-EWBB-6i87dYpbZFkAY_uG4Pansk,5340
|
|
18
|
+
robyn/responses.py,sha256=5e13wMNEJuUfh33S7o4yUTeX6WWT_ErcXbW0FYn3Fns,6874
|
|
19
|
+
robyn/robyn.cpython-311-darwin.so,sha256=XBhLFKJ6xBpA_zbLwPLGkSIdJee8sSswgGKUppB2sf4,3912740
|
|
20
|
+
robyn/robyn.pyi,sha256=hS0bHILKZGdyMwO-MCu7lmUPpnoVilLyDnIj9z8dxFI,11453
|
|
21
|
+
robyn/router.py,sha256=xBKzNztZeLiv-PZ3CVqB-pLQzvWSyFphmuGclRodT3w,15235
|
|
22
|
+
robyn/scaffold/mongo/Dockerfile,sha256=x6eziI8D0kD82_RVCXXFHwzsgT_3lRaSKxJDHts4ETI,180
|
|
23
|
+
robyn/scaffold/mongo/app.py,sha256=28deIh6zHpMtOM8BnCEfruk7TOg0OrcZ7lF4n5Jhhv0,955
|
|
24
|
+
robyn/scaffold/mongo/requirements.txt,sha256=fuGINWbfo4Bjt_GdxfdLB6l9f7xW6nF0pVAiA1v3h6E,14
|
|
25
|
+
robyn/scaffold/no-db/Dockerfile,sha256=x6eziI8D0kD82_RVCXXFHwzsgT_3lRaSKxJDHts4ETI,180
|
|
26
|
+
robyn/scaffold/no-db/app.py,sha256=6KubIayK0ORo1Ub0dP1Z3YFzhARFtILkO26t5ujsres,172
|
|
27
|
+
robyn/scaffold/no-db/requirements.txt,sha256=BJV_VLg3Mq_o2LKLH7ChOefXHSUyO6SNdcLkwGDiGrM,6
|
|
28
|
+
robyn/scaffold/postgres/Dockerfile,sha256=46DpFsrFtcGoTxg7Pw2VDGMisKJPFRdDzHEQ0MFLn-I,832
|
|
29
|
+
robyn/scaffold/postgres/app.py,sha256=nSyLqW70tT82YRAS1stDgOu7kwRBJ0LkpkdhaqFIlos,606
|
|
30
|
+
robyn/scaffold/postgres/requirements.txt,sha256=SKmqzrnIdxwMqEoqiALn1vayNkjLjReuF0TVQ_KeNsA,87
|
|
31
|
+
robyn/scaffold/postgres/supervisord.conf,sha256=nX0H7VxpXTbahC6CZcHh4jvv4uemr7tO6bD2_NtIM7Q,294
|
|
32
|
+
robyn/scaffold/prisma/Dockerfile,sha256=VKhiSjrNggnex1-Cf5yO6inWa-FC2NhTdhdNi7lT7TY,258
|
|
33
|
+
robyn/scaffold/prisma/app.py,sha256=0Od3LdpxLTBEcoJXSk-vltTj-NV8yFKRiowMC2oSy8E,587
|
|
34
|
+
robyn/scaffold/prisma/requirements.txt,sha256=GQGHHGDP8-2UpEoW6yi6j27F3EAwBdXgR4cDX-RA5lY,13
|
|
35
|
+
robyn/scaffold/prisma/schema.prisma,sha256=ovojRZQYgR0yfhOq9I3VXD3wKngpRaR1LoVqpUakj74,181
|
|
36
|
+
robyn/scaffold/sqlalchemy/Dockerfile,sha256=x6eziI8D0kD82_RVCXXFHwzsgT_3lRaSKxJDHts4ETI,180
|
|
37
|
+
robyn/scaffold/sqlalchemy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
|
+
robyn/scaffold/sqlalchemy/app.py,sha256=4QVcVnchRd-lTOgj1qTr2mGB0frlXCN-4Dl6tx2-a7o,214
|
|
39
|
+
robyn/scaffold/sqlalchemy/models.py,sha256=GXtuWrKjZRld708SGvf0URIkmgy3rT2EhfbGQWjsuzo,661
|
|
40
|
+
robyn/scaffold/sqlalchemy/requirements.txt,sha256=O1_v5ca0c0Qo7BJISAsweOZRMY9s-PmiMHkrTRS8Uow,17
|
|
41
|
+
robyn/scaffold/sqlite/Dockerfile,sha256=x6eziI8D0kD82_RVCXXFHwzsgT_3lRaSKxJDHts4ETI,180
|
|
42
|
+
robyn/scaffold/sqlite/app.py,sha256=GYzbwqZFdQYBOvXnL0EZh6tW3HJOal1VnFxJx5LYiI0,491
|
|
43
|
+
robyn/scaffold/sqlite/requirements.txt,sha256=BJV_VLg3Mq_o2LKLH7ChOefXHSUyO6SNdcLkwGDiGrM,6
|
|
44
|
+
robyn/scaffold/sqlmodel/Dockerfile,sha256=swNsbRAjZuep8JOnMHsRSKmxjR6OszxJpeD_3WgJDOg,178
|
|
45
|
+
robyn/scaffold/sqlmodel/app.py,sha256=fjBkh35jVIreVLz5Do7L_YKko2wtMcyB9QOAeAMddIs,1089
|
|
46
|
+
robyn/scaffold/sqlmodel/models.py,sha256=_PN35KWIe9Mj5ufM4dIhxJJ7vvBBSo9O7kALWykMLPU,229
|
|
47
|
+
robyn/scaffold/sqlmodel/requirements.txt,sha256=iekxnkTUDPsiGZxNXtgjXcn6f9FKO4gF3lMiG1ILOUk,14
|
|
48
|
+
robyn/status_codes.py,sha256=BtVTWpdRB21V3ucvMWv7jq0ygM-3fbYZneldaYQxPZE,4222
|
|
49
|
+
robyn/swagger.html,sha256=uEolnRMaYidTmrUUkxYXPAmsGFxz993qXSFBoO76Sto,938
|
|
50
|
+
robyn/templating.py,sha256=8CkPWnZZ31FCZO3qLDmY5eeaUlFvSaIajv2KKbLDc5Q,942
|
|
51
|
+
robyn/types.py,sha256=B47NTCgCbvWqnhWKGKiOjX7SnQegNW2IP9xvcUVXt6E,979
|
|
52
|
+
robyn/ws.py,sha256=N0CFULHywF3BJMFv8wtYUNnCx1hnkQ6rf7z1JyZXshY,2347
|
|
53
|
+
robyn-0.73.0.dist-info/METADATA,sha256=X702SzIVMIJqySw_NiPNiS86cq_tVTfDvqAZG5XwUx4,1524
|
|
54
|
+
robyn-0.73.0.dist-info/WHEEL,sha256=uo497LsoCAD-gruBuBwmuPSjitTK7HU_NyyROWcAuhA,107
|
|
55
|
+
robyn-0.73.0.dist-info/entry_points.txt,sha256=Rla8T60GbwNh4BH5vu3h8eXoi_iTlrSmSYeVMVx-KI0,85
|
|
56
|
+
robyn-0.73.0.dist-info/licenses/LICENSE,sha256=j_4yGGMoPbscB-1KxkoiGhFAk5Esl7Vq-gKqmygvnWo,1323
|
|
57
|
+
robyn-0.73.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
BSD 2-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021, Sanskar Jethi
|
|
4
|
+
All rights reserved.
|
|
5
|
+
|
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
|
8
|
+
|
|
9
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
17
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
18
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
19
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
20
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
21
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
22
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
23
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
24
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
25
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|