pax_global_header 0000666 0000000 0000000 00000000064 15070515525 0014517 g ustar 00root root 0000000 0000000 52 comment=c7b9b1c68103eeb8dd4a4664e83551197dfb1074
litestar-2.18.0/ 0000775 0000000 0000000 00000000000 15070515525 0013436 5 ustar 00root root 0000000 0000000 litestar-2.18.0/.all-contributorsrc 0000664 0000000 0000000 00000147045 15070515525 0017302 0 ustar 00root root 0000000 0000000 {
"files": [
"README.md"
],
"imageSize": 100,
"commit": false,
"contributors": [
{
"login": "Goldziher",
"name": "Na'aman Hirschfeld",
"avatar_url": "https://avatars.githubusercontent.com/u/30733348?v=4",
"profile": "https://www.linkedin.com/in/nhirschfeld/",
"contributions": [
"maintenance",
"code",
"doc",
"test",
"ideas",
"example",
"bug"
]
},
{
"login": "peterschutt",
"name": "Peter Schutt",
"avatar_url": "https://avatars.githubusercontent.com/u/20659309?v=4",
"profile": "https://github.com/peterschutt",
"contributions": [
"maintenance",
"code",
"doc",
"test",
"ideas",
"example",
"bug"
]
},
{
"login": "ashwinvin",
"name": "Ashwin Vinod",
"avatar_url": "https://avatars.githubusercontent.com/u/38067089?v=4",
"profile": "https://ashwinvin.github.io",
"contributions": [
"code",
"doc"
]
},
{
"login": "dkress59",
"name": "Damian",
"avatar_url": "https://avatars.githubusercontent.com/u/28515387?v=4",
"profile": "http://www.damiankress.de",
"contributions": [
"doc"
]
},
{
"login": "vincentsarago",
"name": "Vincent Sarago",
"avatar_url": "https://avatars.githubusercontent.com/u/10407788?v=4",
"profile": "https://remotepixel.ca",
"contributions": [
"code"
]
},
{
"login": "JonasKs",
"name": "Jonas Krüger Svensson",
"avatar_url": "https://avatars.githubusercontent.com/u/5310116?v=4",
"profile": "https://hotfix.guru",
"contributions": [
"platform"
]
},
{
"login": "sondrelg",
"name": "Sondre Lillebø Gundersen",
"avatar_url": "https://avatars.githubusercontent.com/u/25310870?v=4",
"profile": "https://github.com/sondrelg",
"contributions": [
"platform"
]
},
{
"login": "vrslev",
"name": "Lev",
"avatar_url": "https://avatars.githubusercontent.com/u/75225148?v=4",
"profile": "https://github.com/vrslev",
"contributions": [
"code",
"ideas"
]
},
{
"login": "timwedde",
"name": "Tim Wedde",
"avatar_url": "https://avatars.githubusercontent.com/u/20231751?v=4",
"profile": "https://github.com/timwedde",
"contributions": [
"code"
]
},
{
"login": "tclasen",
"name": "Tory Clasen",
"avatar_url": "https://avatars.githubusercontent.com/u/11999013?v=4",
"profile": "https://github.com/tclasen",
"contributions": [
"code"
]
},
{
"login": "Bobronium",
"name": "Arseny Boykov",
"avatar_url": "https://avatars.githubusercontent.com/u/36469655?v=4",
"profile": "http://t.me/Bobronium",
"contributions": [
"code",
"ideas"
]
},
{
"login": "yudjinn",
"name": "Jacob Rodgers",
"avatar_url": "https://avatars.githubusercontent.com/u/7493084?v=4",
"profile": "https://github.com/yudjinn",
"contributions": [
"example"
]
},
{
"login": "danesolberg",
"name": "Dane Solberg",
"avatar_url": "https://avatars.githubusercontent.com/u/25882507?v=4",
"profile": "https://github.com/danesolberg",
"contributions": [
"code"
]
},
{
"login": "madlad33",
"name": "madlad33",
"avatar_url": "https://avatars.githubusercontent.com/u/54079440?v=4",
"profile": "https://github.com/madlad33",
"contributions": [
"code"
]
},
{
"login": "Butch78",
"name": "Matthew Aylward ",
"avatar_url": "https://avatars.githubusercontent.com/u/19205392?v=4",
"profile": "http://matthewtyleraylward.com",
"contributions": [
"code"
]
},
{
"login": "Joko013",
"name": "Jan Klima",
"avatar_url": "https://avatars.githubusercontent.com/u/30841710?v=4",
"profile": "https://github.com/Joko013",
"contributions": [
"code"
]
},
{
"login": "i404788",
"name": "C2D",
"avatar_url": "https://avatars.githubusercontent.com/u/50617709?v=4",
"profile": "https://github.com/i404788",
"contributions": [
"test"
]
},
{
"login": "to-ph",
"name": "to-ph",
"avatar_url": "https://avatars.githubusercontent.com/u/84818322?v=4",
"profile": "https://github.com/to-ph",
"contributions": [
"code"
]
},
{
"login": "imbev",
"name": "imbev",
"avatar_url": "https://avatars.githubusercontent.com/u/105524473?v=4",
"profile": "https://imbev.gitlab.io/site",
"contributions": [
"doc"
]
},
{
"login": "185504a9",
"name": "cătălin",
"avatar_url": "https://avatars.githubusercontent.com/u/45485069?v=4",
"profile": "https://git.roboces.dev/catalin",
"contributions": [
"code"
]
},
{
"login": "Seon82",
"name": "Seon82",
"avatar_url": "https://avatars.githubusercontent.com/u/46298009?v=4",
"profile": "https://github.com/Seon82",
"contributions": [
"doc"
]
},
{
"login": "slavugan",
"name": "Slava",
"avatar_url": "https://avatars.githubusercontent.com/u/8457612?v=4",
"profile": "https://github.com/slavugan",
"contributions": [
"code"
]
},
{
"login": "Harry-Lees",
"name": "Harry",
"avatar_url": "https://avatars.githubusercontent.com/u/52263746?v=4",
"profile": "https://github.com/Harry-Lees",
"contributions": [
"code",
"doc"
]
},
{
"login": "cofin",
"name": "Cody Fincher",
"avatar_url": "https://avatars.githubusercontent.com/u/204685?v=4",
"profile": "https://github.com/cofin",
"contributions": [
"maintenance",
"code",
"doc",
"test",
"ideas",
"example",
"bug"
]
},
{
"login": "cclauss",
"name": "Christian Clauss",
"avatar_url": "https://avatars.githubusercontent.com/u/3709715?v=4",
"profile": "https://www.patreon.com/cclauss",
"contributions": [
"doc"
]
},
{
"login": "josepdaniel",
"name": "josepdaniel",
"avatar_url": "https://avatars.githubusercontent.com/u/36941460?v=4",
"profile": "https://github.com/josepdaniel",
"contributions": [
"code"
]
},
{
"login": "devtud",
"name": "devtud",
"avatar_url": "https://avatars.githubusercontent.com/u/6808024?v=4",
"profile": "https://github.com/devtud",
"contributions": [
"bug"
]
},
{
"login": "nramos0",
"name": "Nicholas Ramos",
"avatar_url": "https://avatars.githubusercontent.com/u/35410160?v=4",
"profile": "https://github.com/nramos0",
"contributions": [
"code"
]
},
{
"login": "seladb",
"name": "seladb",
"avatar_url": "https://avatars.githubusercontent.com/u/9059541?v=4",
"profile": "https://twitter.com/seladb",
"contributions": [
"doc",
"code"
]
},
{
"login": "aedify-swi",
"name": "Simon Wienhöfer",
"avatar_url": "https://avatars.githubusercontent.com/u/66629131?v=4",
"profile": "https://github.com/aedify-swi",
"contributions": [
"code"
]
},
{
"login": "mobiusxs",
"name": "MobiusXS",
"avatar_url": "https://avatars.githubusercontent.com/u/57055149?v=4",
"profile": "https://github.com/mobiusxs",
"contributions": [
"code"
]
},
{
"login": "Aidan-Simard",
"name": "Aidan Simard",
"avatar_url": "https://avatars.githubusercontent.com/u/73361895?v=4",
"profile": "http://aidansimard.dev",
"contributions": [
"doc"
]
},
{
"login": "waweber",
"name": "wweber",
"avatar_url": "https://avatars.githubusercontent.com/u/714224?v=4",
"profile": "https://github.com/waweber",
"contributions": [
"code"
]
},
{
"login": "samuelcolvin",
"name": "Samuel Colvin",
"avatar_url": "https://avatars.githubusercontent.com/u/4039449?v=4",
"profile": "http://scolvin.com",
"contributions": [
"code"
]
},
{
"login": "toudi",
"name": "Mateusz Mikołajczyk",
"avatar_url": "https://avatars.githubusercontent.com/u/81148?v=4",
"profile": "https://github.com/toudi",
"contributions": [
"code"
]
},
{
"login": "Alex-CodeLab",
"name": "Alex ",
"avatar_url": "https://avatars.githubusercontent.com/u/1678423?v=4",
"profile": "https://github.com/Alex-CodeLab",
"contributions": [
"code"
]
},
{
"login": "odiseo0",
"name": "Odiseo",
"avatar_url": "https://avatars.githubusercontent.com/u/87550035?v=4",
"profile": "https://github.com/odiseo0",
"contributions": [
"doc"
]
},
{
"login": "ingjavierpinilla",
"name": "Javier Pinilla",
"avatar_url": "https://avatars.githubusercontent.com/u/36714646?v=4",
"profile": "https://github.com/ingjavierpinilla",
"contributions": [
"code"
]
},
{
"login": "Chaoyingz",
"name": "Chaoying",
"avatar_url": "https://avatars.githubusercontent.com/u/32626585?v=4",
"profile": "https://github.com/Chaoyingz",
"contributions": [
"doc"
]
},
{
"login": "infohash",
"name": "infohash",
"avatar_url": "https://avatars.githubusercontent.com/u/46137868?v=4",
"profile": "https://github.com/infohash",
"contributions": [
"code"
]
},
{
"login": "john-ingles",
"name": "John Ingles",
"avatar_url": "https://avatars.githubusercontent.com/u/35442886?v=4",
"profile": "https://www.linkedin.com/in/john-ingles/",
"contributions": [
"code"
]
},
{
"login": "h0rn3t",
"name": "Eugene",
"avatar_url": "https://avatars.githubusercontent.com/u/1213719?v=4",
"profile": "https://github.com/h0rn3t",
"contributions": [
"test",
"code"
]
},
{
"login": "jonadaly",
"name": "Jon Daly",
"avatar_url": "https://avatars.githubusercontent.com/u/26462826?v=4",
"profile": "https://github.com/jonadaly",
"contributions": [
"doc",
"code"
]
},
{
"login": "Harshal6927",
"name": "Harshal Laheri",
"avatar_url": "https://avatars.githubusercontent.com/u/73422191?v=4",
"profile": "https://harshallaheri.me/",
"contributions": [
"code",
"doc"
]
},
{
"login": "sorasful",
"name": "Téva KRIEF",
"avatar_url": "https://avatars.githubusercontent.com/u/32820423?v=4",
"profile": "https://github.com/sorasful",
"contributions": [
"code"
]
},
{
"login": "jtraub",
"name": "Konstantin Mikhailov",
"avatar_url": "https://avatars.githubusercontent.com/u/153191?v=4",
"profile": "https://github.com/jtraub",
"contributions": [
"maintenance",
"code",
"doc",
"test",
"ideas",
"example",
"bug"
]
},
{
"login": "devmitch",
"name": "Mitchell Henry",
"avatar_url": "https://avatars.githubusercontent.com/u/17354727?v=4",
"profile": "http://linkedin.com/in/mitchell-henry334/",
"contributions": [
"doc"
]
},
{
"login": "chbndrhnns",
"name": "chbndrhnns",
"avatar_url": "https://avatars.githubusercontent.com/u/7534547?v=4",
"profile": "https://github.com/chbndrhnns",
"contributions": [
"doc"
]
},
{
"login": "nielsvanhooy",
"name": "nielsvanhooy",
"avatar_url": "https://avatars.githubusercontent.com/u/40770348?v=4",
"profile": "https://github.com/nielsvanhooy",
"contributions": [
"code",
"bug",
"test"
]
},
{
"login": "provinzkraut",
"name": "provinzkraut",
"avatar_url": "https://avatars.githubusercontent.com/u/25355197?v=4",
"profile": "https://github.com/provinzkraut",
"contributions": [
"maintenance",
"code",
"doc",
"test",
"ideas",
"example",
"bug",
"design"
]
},
{
"login": "jab",
"name": "Joshua Bronson",
"avatar_url": "https://avatars.githubusercontent.com/u/64992?v=4",
"profile": "https://github.com/jab",
"contributions": [
"doc"
]
},
{
"login": "ReznikovRoman",
"name": "Roman Reznikov",
"avatar_url": "https://avatars.githubusercontent.com/u/44291988?v=4",
"profile": "http://linkedin.com/in/roman-reznikov",
"contributions": [
"doc"
]
},
{
"login": "mookrs",
"name": "mookrs",
"avatar_url": "https://avatars.githubusercontent.com/u/985439?v=4",
"profile": "http://mookrs.com",
"contributions": [
"doc"
]
},
{
"login": "mivade",
"name": "Mike DePalatis",
"avatar_url": "https://avatars.githubusercontent.com/u/2805515?v=4",
"profile": "http://mike.depalatis.net",
"contributions": [
"doc"
]
},
{
"login": "pemocarlo",
"name": "Carlos Alberto Pérez-Molano",
"avatar_url": "https://avatars.githubusercontent.com/u/7297323?v=4",
"profile": "https://github.com/pemocarlo",
"contributions": [
"doc"
]
},
{
"login": "ThinksFast",
"name": "ThinksFast",
"avatar_url": "https://avatars.githubusercontent.com/u/114229148?v=4",
"profile": "https://www.bestcryptocodes.com",
"contributions": [
"test",
"doc"
]
},
{
"login": "ottermata",
"name": "Christopher Krause",
"avatar_url": "https://avatars.githubusercontent.com/u/9451844?v=4",
"profile": "https://github.com/ottermata",
"contributions": [
"code"
]
},
{
"login": "smithk86",
"name": "Kyle Smith",
"avatar_url": "https://avatars.githubusercontent.com/u/1161424?v=4",
"profile": "http://www.kylesmith.me",
"contributions": [
"code",
"doc",
"bug"
]
},
{
"login": "scott2b",
"name": "Scott Bradley",
"avatar_url": "https://avatars.githubusercontent.com/u/307713?v=4",
"profile": "https://github.com/scott2b",
"contributions": [
"bug"
]
},
{
"login": "srikanthccv",
"name": "Srikanth Chekuri",
"avatar_url": "https://avatars.githubusercontent.com/u/22846633?v=4",
"profile": "https://www.linkedin.com/in/srikanthccv/",
"contributions": [
"test",
"doc"
]
},
{
"login": "LonelyVikingMichael",
"name": "Michael Bosch",
"avatar_url": "https://avatars.githubusercontent.com/u/78952809?v=4",
"profile": "https://lonelyviking.com",
"contributions": [
"doc"
]
},
{
"login": "sssssss340",
"name": "sssssss340",
"avatar_url": "https://avatars.githubusercontent.com/u/8406195?v=4",
"profile": "https://github.com/sssssss340",
"contributions": [
"bug"
]
},
{
"login": "ste-pool",
"name": "ste-pool",
"avatar_url": "https://avatars.githubusercontent.com/u/17198460?v=4",
"profile": "https://github.com/ste-pool",
"contributions": [
"code",
"infra"
]
},
{
"login": "Alc-Alc",
"name": "Alc-Alc",
"avatar_url": "https://avatars.githubusercontent.com/u/45509143?v=4",
"profile": "https://github.com/Alc-Alc",
"contributions": [
"doc",
"code",
"test",
"infra"
]
},
{
"login": "asomethings",
"name": "asomethings",
"avatar_url": "https://avatars.githubusercontent.com/u/16171942?v=4",
"profile": "http://asomethings.com",
"contributions": [
"code"
]
},
{
"login": "garburator",
"name": "Garry Bullock",
"avatar_url": "https://avatars.githubusercontent.com/u/14207857?v=4",
"profile": "https://github.com/garburator",
"contributions": [
"doc"
]
},
{
"login": "NiclasHaderer",
"name": "Niclas Haderer",
"avatar_url": "https://avatars.githubusercontent.com/u/109728711?v=4",
"profile": "https://github.com/NiclasHaderer",
"contributions": [
"code"
]
},
{
"login": "dialvarezs",
"name": "Diego Alvarez",
"avatar_url": "https://avatars.githubusercontent.com/u/13831919?v=4",
"profile": "https://github.com/dialvarezs",
"contributions": [
"doc",
"code",
"test"
]
},
{
"login": "rgajason",
"name": "Jason Nance",
"avatar_url": "https://avatars.githubusercontent.com/u/51208317?v=4",
"profile": "https://www.rgare.com",
"contributions": [
"doc"
]
},
{
"login": "spikenn",
"name": "Igor Kapadze",
"avatar_url": "https://avatars.githubusercontent.com/u/32995595?v=4",
"profile": "https://github.com/spikenn",
"contributions": [
"doc"
]
},
{
"login": "Jarmos-san",
"name": "Somraj Saha",
"avatar_url": "https://avatars.githubusercontent.com/u/31373860?v=4",
"profile": "https://jarmos.vercel.app",
"contributions": [
"doc"
]
},
{
"login": "maggias",
"name": "Magnús Ágúst Skúlason",
"avatar_url": "https://avatars.githubusercontent.com/u/11139514?v=4",
"profile": "http://skulason.me",
"contributions": [
"code",
"doc"
]
},
{
"login": "pomma89",
"name": "Alessio Parma",
"avatar_url": "https://avatars.githubusercontent.com/u/4697032?v=4",
"profile": "https://alessioparma.xyz/",
"contributions": [
"doc"
]
},
{
"login": "Lugoues",
"name": "Peter Brunner",
"avatar_url": "https://avatars.githubusercontent.com/u/372610?v=4",
"profile": "https://github.com/Lugoues",
"contributions": [
"code"
]
},
{
"login": "JacobCoffee",
"name": "Jacob Coffee",
"avatar_url": "https://avatars.githubusercontent.com/u/45884264?v=4",
"profile": "https://scriptr.dev/",
"contributions": [
"doc",
"code",
"test",
"infra",
"ideas",
"maintenance",
"business",
"design"
]
},
{
"login": "Gamazic",
"name": "Gamazic",
"avatar_url": "https://avatars.githubusercontent.com/u/33692402?v=4",
"profile": "https://github.com/Gamazic",
"contributions": [
"code"
]
},
{
"login": "kareemmahlees",
"name": "Kareem Mahlees",
"avatar_url": "https://avatars.githubusercontent.com/u/89863279?v=4",
"profile": "https://github.com/kareemmahlees",
"contributions": [
"code"
]
},
{
"login": "abdulhaq-e",
"name": "Abdulhaq Emhemmed",
"avatar_url": "https://avatars.githubusercontent.com/u/2532125?v=4",
"profile": "https://github.com/abdulhaq-e",
"contributions": [
"code",
"doc"
]
},
{
"login": "jenish2014",
"name": "Jenish",
"avatar_url": "https://avatars.githubusercontent.com/u/9599888?v=4",
"profile": "https://github.com/jenish2014",
"contributions": [
"code",
"doc"
]
},
{
"login": "chris-telemetry",
"name": "chris-telemetry",
"avatar_url": "https://avatars.githubusercontent.com/u/78052999?v=4",
"profile": "https://github.com/chris-telemetry",
"contributions": [
"code"
]
},
{
"login": "WardPearce",
"name": "Ward",
"avatar_url": "https://avatars.githubusercontent.com/u/27844174?v=4",
"profile": "http://wardpearce.com",
"contributions": [
"bug"
]
},
{
"login": "knowsuchagency",
"name": "Stephan Fitzpatrick",
"avatar_url": "https://avatars.githubusercontent.com/u/11974795?v=4",
"profile": "https://knowsuchagency.com",
"contributions": [
"bug"
]
},
{
"login": "ekeric13",
"name": "Eric Kennedy",
"avatar_url": "https://avatars.githubusercontent.com/u/6489651?v=4",
"profile": "https://codepen.io/ekeric13/",
"contributions": [
"doc"
]
},
{
"login": "wassafshahzad",
"name": "wassaf shahzad",
"avatar_url": "https://avatars.githubusercontent.com/u/25094157?v=4",
"profile": "https://github.com/wassafshahzad",
"contributions": [
"code"
]
},
{
"login": "nilsso",
"name": "Nils Olsson",
"avatar_url": "https://avatars.githubusercontent.com/u/567181?v=4",
"profile": "http://nilsso.github.io",
"contributions": [
"code",
"bug"
]
},
{
"login": "Nadock",
"name": "Riley Chase",
"avatar_url": "https://avatars.githubusercontent.com/u/1491530?v=4",
"profile": "http://rileychase.net",
"contributions": [
"code"
]
},
{
"login": "onerandomusername",
"name": "arl",
"avatar_url": "https://avatars.githubusercontent.com/u/71233171?v=4",
"profile": "https://gh.arielle.codes",
"contributions": [
"maintenance"
]
},
{
"login": "Galdanwing",
"name": "Antoine van der Horst",
"avatar_url": "https://avatars.githubusercontent.com/u/29492757?v=4",
"profile": "https://github.com/Galdanwing",
"contributions": [
"doc"
]
},
{
"login": "zoni",
"name": "Nick Groenen",
"avatar_url": "https://avatars.githubusercontent.com/u/145285?v=4",
"profile": "https://nick.groenen.me",
"contributions": [
"doc"
]
},
{
"login": "giorgiovilardo",
"name": "Giorgio Vilardo",
"avatar_url": "https://avatars.githubusercontent.com/u/56472600?v=4",
"profile": "https://github.com/giorgiovilardo",
"contributions": [
"doc"
]
},
{
"login": "bollwyvl",
"name": "Nicholas Bollweg",
"avatar_url": "https://avatars.githubusercontent.com/u/45380?v=4",
"profile": "https://github.com/bollwyvl",
"contributions": [
"code"
]
},
{
"login": "tompin82",
"name": "Tomas Jonsson",
"avatar_url": "https://avatars.githubusercontent.com/u/47041409?v=4",
"profile": "https://github.com/tompin82",
"contributions": [
"test",
"code"
]
},
{
"login": "khiemdoan",
"name": "Khiem Doan",
"avatar_url": "https://avatars.githubusercontent.com/u/15646249?v=4",
"profile": "https://www.linkedin.com/in/khiem-doan/",
"contributions": [
"doc"
]
},
{
"login": "kedod",
"name": "kedod",
"avatar_url": "https://avatars.githubusercontent.com/u/35638715?v=4",
"profile": "https://github.com/kedod",
"contributions": [
"doc",
"code",
"test"
]
},
{
"login": "sonpro1296",
"name": "sonpro1296",
"avatar_url": "https://avatars.githubusercontent.com/u/17319142?v=4",
"profile": "https://github.com/sonpro1296",
"contributions": [
"code",
"test",
"infra",
"doc"
]
},
{
"login": "patrickarmengol",
"name": "Patrick Armengol",
"avatar_url": "https://avatars.githubusercontent.com/u/42473149?v=4",
"profile": "https://patrickarmengol.com",
"contributions": [
"doc"
]
},
{
"login": "SanderWegter",
"name": "Sander",
"avatar_url": "https://avatars.githubusercontent.com/u/7465799?v=4",
"profile": "https://sanderwegter.nl",
"contributions": [
"doc"
]
},
{
"login": "erhuabushuo",
"name": "疯人院主任",
"avatar_url": "https://avatars.githubusercontent.com/u/1642364?v=4",
"profile": "https://github.com/erhuabushuo",
"contributions": [
"doc"
]
},
{
"login": "aviral-nayya",
"name": "aviral-nayya",
"avatar_url": "https://avatars.githubusercontent.com/u/121891493?v=4",
"profile": "https://github.com/aviral-nayya",
"contributions": [
"code"
]
},
{
"login": "whiskeyriver",
"name": "whiskeyriver",
"avatar_url": "https://avatars.githubusercontent.com/u/162092?v=4",
"profile": "https://github.com/whiskeyriver",
"contributions": [
"code"
]
},
{
"login": "v3ss0n",
"name": "Phyo Arkar Lwin",
"avatar_url": "https://avatars.githubusercontent.com/u/419606?v=4",
"profile": "https://hexcode.tech",
"contributions": [
"code"
]
},
{
"login": "MatthewNewland",
"name": "MatthewNewland",
"avatar_url": "https://avatars.githubusercontent.com/u/9618670?v=4",
"profile": "https://github.com/MatthewNewland",
"contributions": [
"bug",
"code",
"test"
]
},
{
"login": "vtarchon",
"name": "Tom Kuo",
"avatar_url": "https://avatars.githubusercontent.com/u/1598170?v=4",
"profile": "https://github.com/vtarchon",
"contributions": [
"bug"
]
},
{
"login": "LeckerenSirupwaffeln",
"name": "LeckerenSirupwaffeln",
"avatar_url": "https://avatars.githubusercontent.com/u/83568015?v=4",
"profile": "https://github.com/LeckerenSirupwaffeln",
"contributions": [
"bug"
]
},
{
"login": "eldano1995",
"name": "Daniel González Fernández",
"avatar_url": "https://avatars.githubusercontent.com/u/24553679?v=4",
"profile": "https://github.com/eldano1995",
"contributions": [
"doc"
]
},
{
"login": "01EK98",
"name": "01EK98",
"avatar_url": "https://avatars.githubusercontent.com/u/101988390?v=4",
"profile": "https://github.com/01EK98",
"contributions": [
"doc"
]
},
{
"login": "sarbor",
"name": "Sarbo Roy",
"avatar_url": "https://avatars.githubusercontent.com/u/15257226?v=4",
"profile": "https://github.com/sarbor",
"contributions": [
"code"
]
},
{
"login": "rseeley",
"name": "Ryan Seeley",
"avatar_url": "https://avatars.githubusercontent.com/u/5397221?v=4",
"profile": "https://github.com/rseeley",
"contributions": [
"code"
]
},
{
"login": "ctrl-Felix",
"name": "Felix",
"avatar_url": "https://avatars.githubusercontent.com/u/62290842?v=4",
"profile": "https://github.com/ctrl-Felix",
"contributions": [
"doc",
"bug"
]
},
{
"login": "gsakkis",
"name": "George Sakkis",
"avatar_url": "https://avatars.githubusercontent.com/u/291289?v=4",
"profile": "https://www.linkedin.com/in/gsakkis",
"contributions": [
"code"
]
},
{
"login": "floxay",
"name": "Huba Tuba",
"avatar_url": "https://avatars.githubusercontent.com/u/57007485?v=4",
"profile": "https://github.com/floxay",
"contributions": [
"doc",
"code",
"test"
]
},
{
"login": "sfermigier",
"name": "Stefane Fermigier",
"avatar_url": "https://avatars.githubusercontent.com/u/271079?v=4",
"profile": "http://fermigier.com/",
"contributions": [
"doc"
]
},
{
"login": "r4gesingh47",
"name": "r4ge",
"avatar_url": "https://avatars.githubusercontent.com/u/71139938?v=4",
"profile": "https://github.com/r4gesingh47",
"contributions": [
"code",
"doc"
]
},
{
"login": "jaykv",
"name": "Jay",
"avatar_url": "https://avatars.githubusercontent.com/u/18240054?v=4",
"profile": "https://github.com/jaykv",
"contributions": [
"code"
]
},
{
"login": "sinisaos",
"name": "sinisaos",
"avatar_url": "https://avatars.githubusercontent.com/u/30960668?v=4",
"profile": "https://github.com/sinisaos",
"contributions": [
"doc"
]
},
{
"login": "Tsdevendra1",
"name": "Tharuka Devendra",
"avatar_url": "https://avatars.githubusercontent.com/u/38055748?v=4",
"profile": "https://github.com/Tsdevendra1",
"contributions": [
"code"
]
},
{
"login": "euri10",
"name": "euri10",
"avatar_url": "https://avatars.githubusercontent.com/u/1104190?v=4",
"profile": "https://github.com/euri10",
"contributions": [
"code",
"doc",
"bug"
]
},
{
"login": "su-shubham",
"name": "Shubham",
"avatar_url": "https://avatars.githubusercontent.com/u/75021117?v=4",
"profile": "https://github.com/su-shubham",
"contributions": [
"doc"
]
},
{
"login": "erik-hasse",
"name": "Erik Hasse",
"avatar_url": "https://avatars.githubusercontent.com/u/37126755?v=4",
"profile": "https://www.linkedin.com/in/erik-hasse",
"contributions": [
"bug",
"code"
]
},
{
"login": "sobolevn",
"name": "Nikita Sobolev",
"avatar_url": "https://avatars.githubusercontent.com/u/4660275?v=4",
"profile": "https://sobolevn.me",
"contributions": [
"infra",
"code"
]
},
{
"login": "lazyc97",
"name": "Nguyễn Hoàng Đức",
"avatar_url": "https://avatars.githubusercontent.com/u/8538104?v=4",
"profile": "https://github.com/lazyc97",
"contributions": [
"bug"
]
},
{
"login": "RavanaBhrama",
"name": "RavanaBhrama",
"avatar_url": "https://avatars.githubusercontent.com/u/131459969?v=4",
"profile": "https://github.com/RavanaBhrama",
"contributions": [
"doc"
]
},
{
"login": "mj0nez",
"name": "Marcel Johannesmann",
"avatar_url": "https://avatars.githubusercontent.com/u/20128340?v=4",
"profile": "https://github.com/mj0nez",
"contributions": [
"doc"
]
},
{
"login": "therealzanfar",
"name": "Matthew",
"avatar_url": "https://avatars.githubusercontent.com/u/10294685?v=4",
"profile": "http://zanfar.com/",
"contributions": [
"doc"
]
},
{
"login": "Mattwmaster58",
"name": "Mattwmaster58",
"avatar_url": "https://avatars.githubusercontent.com/u/26337069?v=4",
"profile": "https://github.com/Mattwmaster58",
"contributions": [
"bug",
"code",
"test"
]
},
{
"login": "aorith",
"name": "Manuel Sanchez Pinar",
"avatar_url": "https://avatars.githubusercontent.com/u/5411704?v=4",
"profile": "https://es.linkedin.com/in/manusp",
"contributions": [
"doc"
]
},
{
"login": "juan-riveros",
"name": "Juan Riveros",
"avatar_url": "https://avatars.githubusercontent.com/u/1297567?v=4",
"profile": "https://github.com/juan-riveros",
"contributions": [
"doc"
]
},
{
"login": "davidbrochart",
"name": "David Brochart",
"avatar_url": "https://avatars.githubusercontent.com/u/4711805?v=4",
"profile": "https://github.com/davidbrochart",
"contributions": [
"doc"
]
},
{
"login": "sean-donoghue",
"name": "Sean Donoghue",
"avatar_url": "https://avatars.githubusercontent.com/u/64597271?v=4",
"profile": "https://github.com/sean-donoghue",
"contributions": [
"doc"
]
},
{
"login": "sykloid",
"name": "P.C. Shyamshankar",
"avatar_url": "https://avatars.githubusercontent.com/u/22753?v=4",
"profile": "https://sykloid.org/",
"contributions": [
"bug",
"code",
"test"
]
},
{
"login": "wevonosky",
"name": "William Evonosky",
"avatar_url": "https://avatars.githubusercontent.com/u/19598171?v=4",
"profile": "https://github.com/wevonosky",
"contributions": [
"code"
]
},
{
"login": "geeshta",
"name": "geeshta",
"avatar_url": "https://avatars.githubusercontent.com/u/61031243?v=4",
"profile": "https://github.com/geeshta",
"contributions": [
"doc",
"code",
"bug"
]
},
{
"login": "RobertRosca",
"name": "Robert Rosca",
"avatar_url": "https://avatars.githubusercontent.com/u/32569096?v=4",
"profile": "https://fosstodon.org/@robertrosca",
"contributions": [
"doc"
]
},
{
"login": "syshenyu",
"name": "DICE_Lab",
"avatar_url": "https://avatars.githubusercontent.com/u/92897003?v=4",
"profile": "https://github.com/syshenyu",
"contributions": [
"code"
]
},
{
"login": "lsanpablo",
"name": "Luis San Pablo",
"avatar_url": "https://avatars.githubusercontent.com/u/7145688?v=4",
"profile": "https://github.com/lsanpablo",
"contributions": [
"code",
"test",
"doc"
]
},
{
"login": "Lancetnik",
"name": "Pastukhov Nikita",
"avatar_url": "https://avatars.githubusercontent.com/u/44573917?v=4",
"profile": "https://github.com/Lancetnik",
"contributions": [
"doc"
]
},
{
"login": "ddxv",
"name": "James O'Claire",
"avatar_url": "https://avatars.githubusercontent.com/u/7601451?v=4",
"profile": "http://jamesoclaire.com",
"contributions": [
"doc"
]
},
{
"login": "pbaletkeman",
"name": "Pete",
"avatar_url": "https://avatars.githubusercontent.com/u/22402240?v=4",
"profile": "https://github.com/pbaletkeman",
"contributions": [
"doc"
]
},
{
"login": "heralight",
"name": "Alexandre Richonnier",
"avatar_url": "https://avatars.githubusercontent.com/u/534840?v=4",
"profile": "http://www.hera.cc",
"contributions": [
"code",
"doc"
]
},
{
"login": "betaboon",
"name": "betaboon",
"avatar_url": "https://avatars.githubusercontent.com/u/7346933?v=4",
"profile": "https://github.com/betaboon",
"contributions": [
"code"
]
},
{
"login": "brakhane",
"name": "Dennis Brakhane",
"avatar_url": "https://avatars.githubusercontent.com/u/541637?v=4",
"profile": "https://github.com/brakhane",
"contributions": [
"code",
"bug"
]
},
{
"login": "AgarwalPragy",
"name": "Pragy Agarwal",
"avatar_url": "https://avatars.githubusercontent.com/u/7423639?v=4",
"profile": "https://mind.wiki",
"contributions": [
"doc"
]
},
{
"login": "dybi",
"name": "Piotr Dybowski",
"avatar_url": "https://avatars.githubusercontent.com/u/36961162?v=4",
"profile": "https://github.com/dybi",
"contributions": [
"doc"
]
},
{
"login": "myslak71",
"name": "Konrad Szczurek",
"avatar_url": "https://avatars.githubusercontent.com/u/43068450?v=4",
"profile": "https://github.com/myslak71",
"contributions": [
"doc",
"test"
]
},
{
"login": "orgarten",
"name": "Orell Garten",
"avatar_url": "https://avatars.githubusercontent.com/u/10799869?v=4",
"profile": "https://github.com/orgarten",
"contributions": [
"code",
"doc",
"test"
]
},
{
"login": "Kumzy",
"name": "Julien",
"avatar_url": "https://avatars.githubusercontent.com/u/5995441?v=4",
"profile": "https://github.com/Kumzy",
"contributions": [
"doc"
]
},
{
"login": "leejayhsu",
"name": "Leejay Hsu",
"avatar_url": "https://avatars.githubusercontent.com/u/37034741?v=4",
"profile": "https://github.com/leejayhsu",
"contributions": [
"maintenance",
"infra",
"doc"
]
},
{
"login": "mbeijen",
"name": "Michiel W. Beijen",
"avatar_url": "https://avatars.githubusercontent.com/u/659504?v=4",
"profile": "https://x14.nl",
"contributions": [
"doc"
]
},
{
"login": "baoliay2008",
"name": "L. Bao",
"avatar_url": "https://avatars.githubusercontent.com/u/13620348?v=4",
"profile": "https://github.com/baoliay2008",
"contributions": [
"doc"
]
},
{
"login": "jdglaser",
"name": "Jarred Glaser",
"avatar_url": "https://avatars.githubusercontent.com/u/32422167?v=4",
"profile": "http://jarredglaser.com",
"contributions": [
"doc"
]
},
{
"login": "hunterjsb",
"name": "Hunter Boyd",
"avatar_url": "https://avatars.githubusercontent.com/u/69213737?v=4",
"profile": "https://github.com/hunterjsb",
"contributions": [
"doc"
]
},
{
"login": "cesarmg1980",
"name": "Cesar Giulietti",
"avatar_url": "https://avatars.githubusercontent.com/u/38872121?v=4",
"profile": "https://github.com/cesarmg1980",
"contributions": [
"doc"
]
},
{
"login": "marcuslimdw",
"name": "Marcus Lim",
"avatar_url": "https://avatars.githubusercontent.com/u/42759889?v=4",
"profile": "https://gitlab.com/marcuslimdw/",
"contributions": [
"doc"
]
},
{
"login": "hzhou0",
"name": "Henry Zhou",
"avatar_url": "https://avatars.githubusercontent.com/u/43188301?v=4",
"profile": "https://github.com/hzhou0",
"contributions": [
"bug",
"code"
]
},
{
"login": "WilliamStam",
"name": "William Stam",
"avatar_url": "https://avatars.githubusercontent.com/u/182800?v=4",
"profile": "https://github.com/WilliamStam",
"contributions": [
"doc"
]
},
{
"login": "andrewdoh",
"name": "andrew do",
"avatar_url": "https://avatars.githubusercontent.com/u/7662358?v=4",
"profile": "https://github.com/andrewdoh",
"contributions": [
"code",
"test",
"doc"
]
},
{
"login": "cbscsm",
"name": "Boseong Choi",
"avatar_url": "https://avatars.githubusercontent.com/u/31615733?v=4",
"profile": "https://github.com/cbscsm",
"contributions": [
"code",
"test"
]
},
{
"login": "wer153",
"name": "Kim Minki",
"avatar_url": "https://avatars.githubusercontent.com/u/23370765?v=4",
"profile": "https://github.com/wer153",
"contributions": [
"code",
"doc"
]
},
{
"login": "jseop-lim",
"name": "Jeongseop Lim",
"avatar_url": "https://avatars.githubusercontent.com/u/86508420?v=4",
"profile": "https://velog.io/@azzurri21",
"contributions": [
"doc"
]
},
{
"login": "FergusMok",
"name": "FergusMok",
"avatar_url": "https://avatars.githubusercontent.com/u/10182564?v=4",
"profile": "https://github.com/FergusMok",
"contributions": [
"doc",
"code",
"test"
]
},
{
"login": "manusinghal19",
"name": "Manu Singhal",
"avatar_url": "https://avatars.githubusercontent.com/u/8455587?v=4",
"profile": "https://github.com/manusinghal19",
"contributions": [
"doc"
]
},
{
"login": "jrycw",
"name": "Jerry Wu",
"avatar_url": "https://avatars.githubusercontent.com/u/67060418?v=4",
"profile": "https://cv.ycwu.space",
"contributions": [
"doc"
]
},
{
"login": "horo-fox",
"name": "horo",
"avatar_url": "https://avatars.githubusercontent.com/u/143025439?v=4",
"profile": "https://github.com/horo-fox",
"contributions": [
"bug"
]
},
{
"login": "rosstitmarsh",
"name": "Ross Titmarsh",
"avatar_url": "https://avatars.githubusercontent.com/u/23349806?v=4",
"profile": "https://github.com/rosstitmarsh",
"contributions": [
"code"
]
},
{
"login": "korneevm",
"name": "Mike Korneev",
"avatar_url": "https://avatars.githubusercontent.com/u/743250?v=4",
"profile": "https://github.com/korneevm",
"contributions": [
"doc"
]
},
{
"login": "patrickneise",
"name": "Patrick Neise",
"avatar_url": "https://avatars.githubusercontent.com/u/6312074?v=4",
"profile": "https://github.com/patrickneise",
"contributions": [
"code"
]
},
{
"login": "JeanArhancet",
"name": "Jean Arhancet",
"avatar_url": "https://avatars.githubusercontent.com/u/10811879?v=4",
"profile": "https://github.com/JeanArhancet",
"contributions": [
"bug"
]
},
{
"login": "betaprior",
"name": "Leo Alekseyev",
"avatar_url": "https://avatars.githubusercontent.com/u/338250?v=4",
"profile": "http://dnquark.com",
"contributions": [
"code"
]
},
{
"login": "aranvir",
"name": "aranvir",
"avatar_url": "https://avatars.githubusercontent.com/u/75439739?v=4",
"profile": "https://github.com/aranvir",
"contributions": [
"doc",
"code",
"test"
]
},
{
"login": "bunny-therapist",
"name": "bunny-therapist",
"avatar_url": "https://avatars.githubusercontent.com/u/87039365?v=4",
"profile": "https://github.com/bunny-therapist",
"contributions": [
"code"
]
},
{
"login": "benluo",
"name": "Ben Luo",
"avatar_url": "https://avatars.githubusercontent.com/u/70398?v=4",
"profile": "http://www.benluo.cc",
"contributions": [
"doc"
]
},
{
"login": "hugovk",
"name": "Hugo van Kemenade",
"avatar_url": "https://avatars.githubusercontent.com/u/1324225?v=4",
"profile": "https://github.com/hugovk",
"contributions": [
"doc"
]
},
{
"login": "error418",
"name": "Michael Gerbig",
"avatar_url": "https://avatars.githubusercontent.com/u/7716544?v=4",
"profile": "https://error418.github.io",
"contributions": [
"doc"
]
},
{
"login": "crisog",
"name": "CrisOG",
"avatar_url": "https://avatars.githubusercontent.com/u/40803711?v=4",
"profile": "https://github.com/crisog",
"contributions": [
"bug",
"code",
"test"
]
},
{
"login": "haryle",
"name": "harryle",
"avatar_url": "https://avatars.githubusercontent.com/u/64817481?v=4",
"profile": "https://github.com/haryle",
"contributions": [
"code",
"test"
]
},
{
"login": "ubernostrum",
"name": "James Bennett",
"avatar_url": "https://avatars.githubusercontent.com/u/12384?v=4",
"profile": "http://www.b-list.org/",
"contributions": [
"bug"
]
},
{
"login": "sherbang",
"name": "sherbang",
"avatar_url": "https://avatars.githubusercontent.com/u/275015?v=4",
"profile": "https://github.com/sherbang",
"contributions": [
"doc"
]
},
{
"login": "carlsmedstad",
"name": "Carl Smedstad",
"avatar_url": "https://avatars.githubusercontent.com/u/6952324?v=4",
"profile": "https://github.com/carlsmedstad",
"contributions": [
"test"
]
},
{
"login": "maintain0404",
"name": "Taein Min",
"avatar_url": "https://avatars.githubusercontent.com/u/50428534?v=4",
"profile": "https://github.com/maintain0404",
"contributions": [
"doc"
]
},
{
"login": "wallseat",
"name": "Stanislav Lyu.",
"avatar_url": "https://avatars.githubusercontent.com/u/26143672?v=4",
"profile": "https://github.com/wallseat",
"contributions": [
"bug"
]
},
{
"login": "tibor-reiss",
"name": "Tibor Reiss",
"avatar_url": "https://avatars.githubusercontent.com/u/75096465?v=4",
"profile": "https://github.com/tibor-reiss",
"contributions": [
"test",
"doc",
"code"
]
},
{
"login": "0xE111",
"name": "Alex",
"avatar_url": "https://avatars.githubusercontent.com/u/11032969?v=4",
"profile": "https://pogrom.dev",
"contributions": [
"bug",
"code"
]
},
{
"login": "JorenSix",
"name": "Joren Six",
"avatar_url": "https://avatars.githubusercontent.com/u/60453?v=4",
"profile": "http://0110.be",
"contributions": [
"doc"
]
},
{
"login": "jderrien",
"name": "jderrien",
"avatar_url": "https://avatars.githubusercontent.com/u/145396?v=4",
"profile": "https://github.com/jderrien",
"contributions": [
"doc"
]
},
{
"login": "PossiblePanda",
"name": "PossiblePanda",
"avatar_url": "https://avatars.githubusercontent.com/u/85448494?v=4",
"profile": "https://possiblepanda.me",
"contributions": [
"doc"
]
},
{
"login": "evstratbg",
"name": "evstrat",
"avatar_url": "https://avatars.githubusercontent.com/u/10176401?v=4",
"profile": "https://github.com/evstratbg",
"contributions": [
"infra"
]
},
{
"login": "eltociear",
"name": "Ikko Eltociear Ashimine",
"avatar_url": "https://avatars.githubusercontent.com/u/22633385?v=4",
"profile": "https://speakerdeck.com/eltociear",
"contributions": [
"doc"
]
},
{
"login": "taihim",
"name": "Taimur Ibrahim",
"avatar_url": "https://avatars.githubusercontent.com/u/13764071?v=4",
"profile": "https://github.com/taihim",
"contributions": [
"doc"
]
},
{
"login": "l-armstrong",
"name": "l-armstrong",
"avatar_url": "https://avatars.githubusercontent.com/u/43922258?v=4",
"profile": "https://github.com/l-armstrong",
"contributions": [
"doc"
]
},
{
"login": "Anu-cool-007",
"name": "Anuranjan Srivastava",
"avatar_url": "https://avatars.githubusercontent.com/u/16525919?v=4",
"profile": "https://github.com/Anu-cool-007",
"contributions": [
"code"
]
},
{
"login": "Zimzozaur",
"name": "Simon Joseph",
"avatar_url": "https://avatars.githubusercontent.com/u/106471045?v=4",
"profile": "https://github.com/Zimzozaur",
"contributions": [
"doc"
]
},
{
"login": "abelkm99",
"name": "Abel Kidanemariam",
"avatar_url": "https://avatars.githubusercontent.com/u/41730180?v=4",
"profile": "https://github.com/abelkm99",
"contributions": [
"code",
"test",
"doc"
]
},
{
"login": "trim21",
"name": "Trim21",
"avatar_url": "https://avatars.githubusercontent.com/u/13553903?v=4",
"profile": "https://blog.trim21.me/",
"contributions": [
"code",
"test"
]
},
{
"login": "aarcex3",
"name": "Agustin Arce",
"avatar_url": "https://avatars.githubusercontent.com/u/59893355?v=4",
"profile": "http://aarcex3.github.io",
"contributions": [
"doc"
]
},
{
"login": "FarhanAliRaza",
"name": "Farhan Ali Raza",
"avatar_url": "https://avatars.githubusercontent.com/u/62690310?v=4",
"profile": "https://github.com/FarhanAliRaza",
"contributions": [
"doc"
]
},
{
"login": "pogopaule",
"name": "Fabian",
"avatar_url": "https://avatars.githubusercontent.com/u/576949?v=4",
"profile": "https://github.com/pogopaule",
"contributions": [
"code"
]
},
{
"login": "mohammedbabelly20",
"name": "Mohammed Babelly",
"avatar_url": "https://avatars.githubusercontent.com/u/104768048?v=4",
"profile": "https://github.com/mohammedbabelly20",
"contributions": [
"code"
]
},
{
"login": "charles-dyfis-net",
"name": "Charles Duffy",
"avatar_url": "https://avatars.githubusercontent.com/u/22370?v=4",
"profile": "https://keybase.io/charlesdyfisnet",
"contributions": [
"code"
]
},
{
"login": "RenameMe1",
"name": "Evgeny Demchenko",
"avatar_url": "https://avatars.githubusercontent.com/u/165988121?v=4",
"profile": "https://github.com/RenameMe1",
"contributions": [
"doc",
"test"
]
},
{
"login": "olzhasar",
"name": "Olzhas Arystanov",
"avatar_url": "https://avatars.githubusercontent.com/u/12471703?v=4",
"profile": "https://olzhasar.com",
"contributions": [
"bug",
"doc"
]
},
{
"login": "vikigenius",
"name": "Vikash",
"avatar_url": "https://avatars.githubusercontent.com/u/12724810?v=4",
"profile": "https://github.com/vikigenius",
"contributions": [
"code"
]
},
{
"login": "ftsartek",
"name": "Jordan Russell",
"avatar_url": "https://avatars.githubusercontent.com/u/20253317?v=4",
"profile": "https://github.com/ftsartek",
"contributions": [
"doc",
"test",
"code"
]
},
{
"login": "sloria",
"name": "Steven Loria",
"avatar_url": "https://avatars.githubusercontent.com/u/2379650?v=4",
"profile": "https://stevenloria.com",
"contributions": [
"doc"
]
},
{
"login": "oek1ng",
"name": "oek1ng",
"avatar_url": "https://avatars.githubusercontent.com/u/193062679?v=4",
"profile": "https://github.com/oek1ng",
"contributions": [
"code"
]
},
{
"login": "Ada-lave",
"name": "Vladislav",
"avatar_url": "https://avatars.githubusercontent.com/u/113159483?v=4",
"profile": "https://github.com/Ada-lave",
"contributions": [
"doc"
]
},
{
"login": "eandersons",
"name": "Edgars",
"avatar_url": "https://avatars.githubusercontent.com/u/9976861?v=4",
"profile": "https://gaitenis.id.lv",
"contributions": [
"doc"
]
},
{
"login": "Jannchie",
"name": "Jianqi Pan",
"avatar_url": "https://avatars.githubusercontent.com/u/29743310?v=4",
"profile": "https://jannchie.com",
"contributions": [
"code"
]
},
{
"login": "PokkaKiyo",
"name": "PokkaKiyo",
"avatar_url": "https://avatars.githubusercontent.com/u/31039465?v=4",
"profile": "https://github.com/PokkaKiyo",
"contributions": [
"test"
]
},
{
"login": "s-aleshin",
"name": "Sergei Aleshin",
"avatar_url": "https://avatars.githubusercontent.com/u/66841202?v=4",
"profile": "https://github.com/s-aleshin",
"contributions": [
"code"
]
}
],
"contributorsPerLine": 7,
"projectName": "litestar",
"projectOwner": "litestar-org",
"repoType": "github",
"repoHost": "https://github.com",
"skipCi": true,
"commitConvention": "angular",
"commitType": "docs"
}
litestar-2.18.0/.devcontainer/ 0000775 0000000 0000000 00000000000 15070515525 0016175 5 ustar 00root root 0000000 0000000 litestar-2.18.0/.devcontainer/Dockerfile 0000664 0000000 0000000 00000001261 15070515525 0020167 0 ustar 00root root 0000000 0000000 # [Choice] Python version (use -bookworm or -bullseye variants on local arm64/Apple Silicon): 3, 3.13, 3.12, 3.11, 3.10, 3.9, 3.8, 3-bookworm, 3.13-bookworm, 3.12-bookworm, 3.11-bookworm, 3.10-bookworm, 3.9-bookworm, 3.8-bookworm, 3-bullseye, 3.11-bullseye, 3.10-bullseye, 3.9-bullseye, 3.8-bullseye, 3-buster, 3.11-buster, 3.10-buster, 3.9-buster, 3.8-buster
ARG VERSION=3.12
ARG VARIANT=-bookworm
FROM python:${VERSION}${VARIANT}
ARG VERSION
ENV UV_LOCKED=1 UV_PYTHON=${VERSION}
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get purge -y fish
RUN python3 -m pip install --upgrade setuptools cython pip
litestar-2.18.0/.devcontainer/devcontainer.json 0000664 0000000 0000000 00000003406 15070515525 0021554 0 ustar 00root root 0000000 0000000 {
"name": "litestar-org/litestar",
"build": {
"dockerfile": "./Dockerfile",
"context": "."
},
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": "true",
"username": "vscode",
"userUid": "1000",
"userGid": "1000",
"upgradePackages": "true"
},
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/devcontainers-contrib/features/pre-commit:2": {},
"ghcr.io/devcontainers/features/python:1": "none",
"ghcr.io/devcontainers/features/git:1": {
"version": "latest",
"ppa": "false"
}
},
"customizations": {
"codespaces": {
"openFiles": ["CONTRIBUTING.rst"]
},
"vscode": {
"extensions": [
"mhutchie.git-graph",
"eamodio.gitlens",
"github.vscode-github-actions",
"ms-python.black-formatter",
"ms-python.mypy-type-checker",
"charliermarsh.ruff"
],
"settings": {
"python.editor.defaultFormatter": "charliermarsh.ruff",
"python.defaultInterpreterPath": "${workspaceFolder}/.venv",
"python.terminal.activateEnvInCurrentTerminal": true,
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true,
"python.testing.pytestArgs": ["."],
"python.terminal.launchArgs": ["-X", "dev"],
"terminal.integrated.shell.linux": "/bin/bash",
"terminal.integrated.profiles.linux": {
"bash": {
"path": "bash",
"icon": "terminal-bash"
},
"zsh": {
"path": "zsh"
},
"fish": {
"path": "fish"
}
}
}
}
},
"forwardPorts": [8000],
"postCreateCommand": [
"uv",
"sync"
],
"remoteUser": "vscode"
}
litestar-2.18.0/.github/ 0000775 0000000 0000000 00000000000 15070515525 0014776 5 ustar 00root root 0000000 0000000 litestar-2.18.0/.github/CODEOWNERS 0000664 0000000 0000000 00000001076 15070515525 0016375 0 ustar 00root root 0000000 0000000 # Code owner settings for `litestar`
# @maintainers should be assigned to all reviews.
# Most specific assignment takes precedence though, so if you add a more specific thing than the `*` glob, you must also add @maintainers
# For more info about code owners see https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners#codeowners-file-example
# Global Assignment
* @litestar-org/maintainers @litestar-org/members
# Documentation
docs/* @litestar-org/maintainers @JacobCoffee @provinzkraut
litestar-2.18.0/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 15070515525 0017161 5 ustar 00root root 0000000 0000000 litestar-2.18.0/.github/ISSUE_TEMPLATE/BUG.yml 0000664 0000000 0000000 00000005122 15070515525 0020321 0 ustar 00root root 0000000 0000000 name: "Bug Report"
description: Create an issue for a bug.
title: "Bug:
"
labels:
- "Bug :bug:"
- "Triage Required"
projects:
- "litestar-org/16"
body:
- type: textarea
id: description
attributes:
label: "Description"
description: Please enter an description of the bug you are encountering
placeholder:
validations:
required: true
- type: input
id: reprod-url
attributes:
label: "URL to code causing the issue"
description: Please enter the URL to provide a reproduction of the issue, if applicable
placeholder: ex. https://github.com/USERNAME/REPO-NAME
validations:
required: false
- type: textarea
id: mcve
attributes:
label: "MCVE"
description: >-
Please provide a minimal, complete, and verifiable example of the issue.
This will be automatically formatted into code, so no need for backticks.
placeholder: |
from litestar import Litestar, get
@get("/")
def hello_world() -> str:
return "hello world"
app = Litestar(route_handlers=[hello_world])
render: python
validations:
required: false
- type: textarea
id: reprod
attributes:
label: "Steps to reproduce"
description: Please enter the exact steps to reproduce the issue
value: |
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
validations:
required: false
- type: textarea
id: screenshot
attributes:
label: "Screenshots"
description: If applicable, add screenshots to help explain your problem.
placeholder: Drag-and-drop images up add them directly or use Markdown to embed external images.
validations:
required: false
- type: textarea
id: logs
attributes:
label: "Logs"
description: >-
Please copy and paste any relevant log output.
This will be automatically formatted into code, so no need for backticks.
render: text
validations:
required: false
- type: textarea
id: version
attributes:
label: "Litestar Version"
description: What version of Litestar are you using when encountering this issue?
validations:
required: true
- type: checkboxes
id: platform
attributes:
label: "Platform"
description: What platform are you encountering the issue on?
options:
- label: "Linux"
- label: "Mac"
- label: "Windows"
- label: "Other (Please specify in the description above)"
validations:
required: false
litestar-2.18.0/.github/ISSUE_TEMPLATE/DOCS.yml 0000664 0000000 0000000 00000000650 15070515525 0020435 0 ustar 00root root 0000000 0000000 name: "Documentation Update"
description: Create an issue for documentation changes
title: "Docs: "
labels:
- "Documentation :books:"
projects:
- "litestar-org/16"
body:
- type: textarea
id: summary
attributes:
label: "Summary"
description: Provide a brief summary of your feature request
placeholder: Describe in a few lines your feature request
validations:
required: true
litestar-2.18.0/.github/ISSUE_TEMPLATE/REQUEST.yml 0000664 0000000 0000000 00000002343 15070515525 0021036 0 ustar 00root root 0000000 0000000 name: "Feature Request"
description: Create an issue for a new feature request
title: "Enhancement: "
labels:
- "Enhancement"
projects:
- "litestar-org/16"
body:
- type: textarea
id: summary
attributes:
label: "Summary"
description: Provide a brief summary of your feature request
placeholder: Describe in a few lines your feature request
validations:
required: true
- type: textarea
id: basic_example
attributes:
label: "Basic Example"
description: Indicate here some basic examples of your feature.
placeholder: Provide some basic example of your feature request
validations:
required: false
- type: textarea
id: drawbacks
attributes:
label: "Drawbacks and Impact"
description: What are the drawbacks or impacts of your feature request?
placeholder: Describe any the drawbacks or impacts of your feature request
validations:
required: false
- type: textarea
id: unresolved_question
attributes:
label: "Unresolved questions"
description: What, if any, unresolved questions do you have about your feature request?
placeholder: Identify any unresolved issues.
validations:
required: false
litestar-2.18.0/.github/ISSUE_TEMPLATE/config.yml 0000664 0000000 0000000 00000000727 15070515525 0021157 0 ustar 00root root 0000000 0000000 blank_issues_enabled: false
contact_links:
- name: Litestar Documentation
url: https://docs.litestar.dev/
about: Official Litestar documentation - please check here before opening an issue.
- name: Litestar Website
url: https://litestar.dev/
about: Main Litestar website - for details about Litestar's projects.
- name: Discord
url: https://discord.gg/litestar
about: Join our Discord community to chat or get in touch with the maintainers.
litestar-2.18.0/.github/PULL_REQUEST_TEMPLATE.md 0000664 0000000 0000000 00000001320 15070515525 0020573 0 ustar 00root root 0000000 0000000
## Description
-
## Closes
litestar-2.18.0/.github/dependabot.yml 0000664 0000000 0000000 00000000165 15070515525 0017630 0 ustar 00root root 0000000 0000000 version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
litestar-2.18.0/.github/labeler.yml 0000664 0000000 0000000 00000013624 15070515525 0017135 0 ustar 00root root 0000000 0000000 version: v1
labels:
# -- types -------------------------------------------------------------------
- label: 'type/feat'
sync: true
matcher:
title: '^feat(\([^)]+\))?!?:'
- label: 'type/bug'
sync: true
matcher:
title: '^fix(\([^)]+\))?!?:'
- label: 'type/docs'
sync: true
matcher:
title: '^docs(\([^)]+\))?:'
- label: 'Breaking 🔨'
sync: true
matcher:
title: '^(feat|fix)(\([^)]+\))?!:'
# -- distinct areas ----------------------------------------------------------
- label: '3.x'
sync: true
matcher:
baseBranch: '^v3$'
- label: 'area/docs'
sync: true
matcher:
files:
any: ['docs/*', 'docs/**/*', '**/*.rst', '**/*.md']
- label: 'area/unit-tests'
sync: true
matcher:
files:
any: ['test/unit/*', 'test/unit/**/*']
- label: 'area/end-to-end-tests'
sync: true
matcher:
files:
any: ['test/e2e/*', 'test/e2e/**/*']
- label: 'area/test-apps'
sync: true
matcher:
files:
any: ['test/test_apps/*', 'test/test_apps/**/*']
- label: 'area/docs'
sync: true
matcher:
files:
any: ['docs/*', 'docs/**/*', '**/*.rst', '**/*.md']
- label: 'area/unit-tests'
sync: true
matcher:
files:
any: ['test/unit/*', 'test/unit/**/*']
- label: 'area/end-to-end-tests'
sync: true
matcher:
files:
any: ['test/e2e/*', 'test/e2e/**/*']
- label: 'area/test-apps'
sync: true
matcher:
files:
any: ['test/test_apps/*', 'test/test_apps/**/*']
- label: 'area/ci'
sync: true
matcher:
files:
any: ['.github/**/*', 'codecov.yml', 'pre-commit-config.yaml', 'sonar-project.properties']
- label: 'area/dependencies'
sync: true
matcher:
files:
any: ['pyproject.toml', '*.lock']
- label: 'area/enums'
sync: true
matcher:
files: ['litestar/enums.py']
- label: 'area/background-tasks'
sync: true
matcher:
files: ['litestar/background_tasks.py']
- label: 'area/constants'
sync: true
matcher:
files: ['litestar/constants.py']
- label: 'area/concurrency'
sync: true
matcher:
files: ['litestar/concurrency.py']
- label: 'area/parsers'
sync: true
matcher:
files: ['litestar/_parsers.py']
- label: 'area/layers'
sync: true
matcher:
files: ['litestar/_layers/*']
- label: 'area/multipart'
sync: true
matcher:
files: ['litestar/_multipart.py']
- label: 'area/di'
sync: true
matcher:
files: ['litestar/di.py']
- label: 'area/file-system'
sync: true
matcher:
files: ['litestar/file_system.py']
- label: 'area/controller'
sync: true
matcher:
files: ['litestar/controller.py']
- label: 'area/serialization'
sync: true
matcher:
files: ['litestar/serialization/*']
- label: 'area/params'
sync: true
matcher:
files: ['litestar/params.py']
- label: 'area/template'
sync: true
matcher:
files: ['litestar/template/*']
- label: 'area/events'
sync: true
matcher:
files: ['litestar/events/*']
- label: 'area/router'
sync: true
matcher:
files: ['litestar/router.py']
- label: 'area/exceptions'
sync: true
matcher:
files: ['litestar/exceptions/*']
- label: 'area/static-files'
sync: true
matcher:
files: ['litestar/static_files/*']
- label: 'area/signature'
sync: true
matcher:
files: ['litestar/_signature/*']
- label: 'area/plugins'
sync: true
matcher:
files: ['litestar/plugins/*']
- label: 'area/stores'
sync: true
matcher:
files: ['litestar/stores/*']
- label: 'area/logging'
sync: true
matcher:
files: ['litestar/logging/*']
- label: 'area/connection'
sync: true
matcher:
files: ['litestar/connection/*']
- label: 'area/asgi'
sync: true
matcher:
files: ['litestar/_asgi/*']
- label: 'area/types'
sync: true
matcher:
files: ['litestar/types/*']
- label: 'area/kwargs'
sync: true
matcher:
files: ['litestar/_kwargs/*']
- label: 'area/datastructures'
sync: true
matcher:
files: ['litestar/datastructures/*']
- label: 'area/channels'
sync: true
matcher:
files: ['litestar/channels/*']
- label: 'area/response'
sync: true
matcher:
files: ['litestar/response/*']
- label: 'area/repository'
sync: true
matcher:
files: ['litestar/repository/*']
- label: 'area/security'
sync: true
matcher:
files: ['litestar/security/*']
- label: 'area/dto'
sync: true
matcher:
files: ['litestar/dto/*']
- label: 'area/testing'
sync: true
matcher:
files: ['litestar/testing/*']
- label: 'area/openapi'
sync: true
matcher:
files: ['litestar/_openapi/*']
- label: 'area/middleware'
sync: true
matcher:
files: ['litestar/middleware/*']
- label: 'area/handlers'
sync: true
matcher:
files: ['litestar/handlers/*']
- label: 'area/contrib'
sync: true
matcher:
files: ['litestar/contrib/*']
- label: 'area/private-api'
sync: true
matcher:
files:
any: ['litestar/_*.py', 'litestar/*/_*.py', 'litestar/_*/**/*.py']
# -- Size Based Labels -------------------------------------------------------
- label: 'size: small'
sync: true
matcher:
files:
count:
gte: 1
lte: 10
- label: 'size: medium'
sync: true
matcher:
files:
count:
gte: 10
lte: 25
- label: 'size: large'
sync: true
matcher:
files:
count:
gte: 26
# -- Merge Checks --------------------------------------------------------------
checks:
- context: 'No Merge check'
description: "Disable merging when 'do not merge' label is set"
labels:
none: ['do not merge']
litestar-2.18.0/.github/workflows/ 0000775 0000000 0000000 00000000000 15070515525 0017033 5 ustar 00root root 0000000 0000000 litestar-2.18.0/.github/workflows/ci.yml 0000664 0000000 0000000 00000022326 15070515525 0020156 0 ustar 00root root 0000000 0000000 name: Tests And Linting
on:
pull_request:
merge_group:
push:
branches:
- main
- v1.51
env:
UV_LOCKED: 1
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.8"
- name: Install Pre-Commit
run: python -m pip install pre-commit
- name: Load cached Pre-Commit Dependencies
id: cached-pre-commit-dependencies
uses: actions/cache@v4
with:
path: ~/.cache/pre-commit/
key: pre-commit-4|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }}
- name: Execute Pre-Commit
run: pre-commit run --show-diff-on-failure --color=always --all-files
mypy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.8"
allow-prereleases: true
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.5.4"
enable-cache: true
- name: Run mypy
run: uv run mypy
pyright:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.8"
allow-prereleases: true
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.5.4"
enable-cache: true
- name: Run pyright
run: uv run pyright
slotscheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.8"
allow-prereleases: false
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.5.4"
enable-cache: true
- name: Run slotscheck
run: uv run slotscheck litestar
test:
name: "test (${{ matrix.python-version }})"
strategy:
fail-fast: true
matrix:
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
uses: ./.github/workflows/test.yml
with:
coverage: ${{ (matrix.python-version == '3.12' || matrix.python-version == '3.8') }}
python-version: ${{ matrix.python-version }}
# add an aggregate step here to check if any of the steps of the matrix 'test' job
# failed. this allows us to have dynamic or diverging steps in the matrix, while still
# being able to mark the 'test' step as a required check for a PR to be considered
# mergeable, without having to specify each individual matrix item.
test_success:
needs: test
# ensure this step always runs
if: always()
runs-on: ubuntu-latest
steps:
- name: Report success or fail
run: exit ${{ needs.test.result == 'success' && '0' || '1' }}
test_typing_extensions:
runs-on: ubuntu-latest
strategy:
matrix:
typing-extensions: ["4.12.1", "4.13.1", "latest"]
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up python
uses: actions/setup-python@v5
with:
python-version: 3.13
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.6.12"
enable-cache: true
- name: Install dependencies
run: uv sync
- name: Install typing-extensions
if: ${{ matrix.typing-extensions != 'latest' }}
run: uv pip install typing-extensions=="${{ matrix.typing-extensions }}"
- name: Install typing-extensions
if: ${{ matrix.typing-extensions == 'latest' }}
run: uv pip install typing-extensions --upgrade --prerelease=allow
- name: Test
run: uv run --no-sync -- python -m pytest tests/unit/test_typing.py
test_integration:
name: Test server integration
runs-on: ubuntu-latest
strategy:
matrix:
uvicorn-version: ["uvicorn<0.27.0", "uvicorn>=0.27.0"]
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up python 3.11
uses: actions/setup-python@v5
with:
python-version: 3.11
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.5.4"
enable-cache: true
- name: Install Build Dependencies
run: sudo apt-get install build-essential libpq-dev python3-dev -y
- name: Install dependencies
run: |
uv sync
uv pip install -U "${{ matrix.uvicorn-version }}"
- name: Set PYTHONPATH
run: echo "PYTHONPATH=$PWD" >> $GITHUB_ENV
- name: Test
run: uv run --no-sync pytest tests -m server_integration
test-platform-compat:
if: github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'test platform compat')
strategy:
fail-fast: false
matrix:
os: ["macos-latest", "windows-latest"]
uses: ./.github/workflows/test.yml
with:
python-version: "3.13"
os: ${{ matrix.os }}
timeout: 30
codeql:
needs:
- test
- validate
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Initialize CodeQL Without Dependencies
uses: github/codeql-action/init@v3
with:
setup-python-dependencies: false
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
build-docs:
needs:
- validate
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Install Build Dependencies
run: sudo apt-get install build-essential libpq-dev python3-dev -y
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
allow-prereleases: true
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.5.4"
enable-cache: true
- name: Build docs
run: uv run make docs
- name: Check docs links
env:
LITESTAR_DOCS_IGNORE_MISSING_EXAMPLE_OUTPUT: 1
run: uv run make docs-linkcheck
- name: Save PR number
run: |
echo "${{ github.event.number }}" > .pr_number
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: docs-preview
path: |
docs/_build/html
.pr_number
include-hidden-files: true
test_minimal_app:
name: Test Minimal Application with Base Dependencies
runs-on: ubuntu-latest
env:
python_version: "3.12"
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.5.4"
enable-cache: true
- name: Set pythonpath
run: echo "PYTHONPATH=$PWD" >> $GITHUB_ENV
- name: Test
run: |
mv tests/examples/test_hello_world.py test_hello_world.py
uv run pytest test_hello_world.py
test_pydantic_1_app:
name: Test Minimal Pydantic 1 application
runs-on: ubuntu-latest
env:
python_version: "3.12"
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Install Build Dependencies
run: sudo apt-get install build-essential libpq-dev python3-dev -y
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.5.4"
enable-cache: true
- name: Install dependencies
run: |
uv sync
uv pip install "pydantic==1.*"
- name: Set pythonpath
run: echo "PYTHONPATH=$PWD" >> $GITHUB_ENV
- name: Test
run: uv run --no-sync coverage run --branch -m unittest test_apps/pydantic_1_app.py
- name: Rename coverage file
run: mv .coverage* .coverage.pydantic_v1
- uses: actions/upload-artifact@v4
with:
name: coverage-data-pydantic_v1-${{ inputs.python-version }}
path: .coverage.pydantic_v1
include-hidden-files: true
upload-test-coverage:
runs-on: ubuntu-latest
needs:
- test
- test_pydantic_1_app
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Download Artifacts
uses: actions/download-artifact@v5
with:
pattern: coverage-data*
merge-multiple: true
- name: Combine coverage files
run: |
python -Im pip install coverage covdefaults
python -Im coverage combine
python -Im coverage xml -i
- name: Fix coverage file name
run: sed -i "s/home\/runner\/work\/litestar\/litestar/github\/workspace/g" coverage.xml
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
with:
files: coverage.xml
token: ${{ secrets.CODECOV_TOKEN }}
litestar-2.18.0/.github/workflows/codeql.yml 0000664 0000000 0000000 00000000674 15070515525 0021034 0 ustar 00root root 0000000 0000000 name: CodeQL scheduled
on:
schedule:
- cron: "0 4 * * *"
jobs:
codeql:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: "main"
- name: Initialize CodeQL With Dependencies
uses: github/codeql-action/init@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
litestar-2.18.0/.github/workflows/docs-preview.yml 0000664 0000000 0000000 00000004733 15070515525 0022174 0 ustar 00root root 0000000 0000000 name: Deploy documentation preview
on:
workflow_run:
workflows: [Tests And Linting]
types: [completed]
jobs:
deploy:
if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request' }}
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Download artifact
uses: dawidd6/action-download-artifact@v11
with:
workflow_conclusion: success
run_id: ${{ github.event.workflow_run.id }}
path: docs-preview
name: docs-preview
- name: Validate and set PR number
run: |
PR_NUMBER=$(cat docs-preview/.pr_number)
if ! [[ "$PR_NUMBER" =~ ^[0-9]+$ ]]; then
echo "Invalid PR number: $PR_NUMBER"
exit 1
fi
echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV
- name: Deploy docs preview
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: docs-preview/docs/_build/html
token: ${{ secrets.DOCS_PREVIEW_DEPLOY_TOKEN }}
repository-name: litestar-org/litestar-docs-preview
clean: false
target-folder: ${{ env.PR_NUMBER }}
branch: gh-pages
- uses: actions/github-script@v7
env:
PR_NUMBER: ${{ env.PR_NUMBER }}
with:
script: |
const issue_number = process.env.PR_NUMBER
const body = "Documentation preview will be available shortly at https://litestar-org.github.io/litestar-docs-preview/" + issue_number
const opts = github.rest.issues.listComments.endpoint.merge({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
});
const comments = await github.paginate(opts)
for (const comment of comments) {
if (comment.user.id === 41898282 && comment.body === body) {
await github.rest.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: comment.id
})
}
}
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
body: body,
})
litestar-2.18.0/.github/workflows/docs.yml 0000664 0000000 0000000 00000003143 15070515525 0020507 0 ustar 00root root 0000000 0000000 name: Documentation Building
on:
release:
types: [published]
push:
branches:
- main
workflow_dispatch:
inputs:
version:
description: 'Version to build docs for (1, 2, main)'
required: true
default: 'main'
type: choice
options:
- main
- '2'
- '1'
env:
UV_LOCKED: 1
jobs:
docs:
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.5.4"
enable-cache: true
- name: Install dependencies
run: uv sync
- name: Fetch gh pages
run: git fetch origin gh-pages --depth=1
- name: Build release docs
run: uv run python tools/build_docs.py docs-build
if: github.event_name == 'release'
- name: Build docs (main branch)
run: uv run python tools/build_docs.py docs-build --version main
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
- name: Build docs (manual trigger)
run: |
if [ "${{ inputs.version }}" == "release" ]; then
uv run python tools/build_docs.py docs-build
else
uv run python tools/build_docs.py docs-build --version ${{ inputs.version }}
fi
if: github.event_name == 'workflow_dispatch'
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: docs-build
litestar-2.18.0/.github/workflows/notify-released-issues.yml 0000664 0000000 0000000 00000001570 15070515525 0024164 0 ustar 00root root 0000000 0000000 name: Notify released issues
on:
workflow_call:
inputs:
release_tag:
type: string
required: true
jobs:
notify:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Get released issues
id: get-released-issues
run:
echo "issues=$(python ./.github/workflows/notify_released_issues/get_closed_issues.py ${{ inputs.release_tag }})" >> "$GITHUB_OUTPUT"
- uses: actions/github-script@v7
env:
CLOSED_ISSUES: ${{ steps.get-released-issues.outputs.issues }}
with:
script: |
const script = require('./.github/workflows/notify_released_issues/notify.js')
await script({github, context, core})
litestar-2.18.0/.github/workflows/notify_released_issues/ 0000775 0000000 0000000 00000000000 15070515525 0023602 5 ustar 00root root 0000000 0000000 litestar-2.18.0/.github/workflows/notify_released_issues/get_closed_issues.py 0000664 0000000 0000000 00000001650 15070515525 0027661 0 ustar 00root root 0000000 0000000 from __future__ import annotations
import itertools
import json
import pathlib
import re
import sys
__all__ = (
"find_resolved_issues",
"main",
)
def find_resolved_issues(source: str, tag: str) -> list[str]:
version = tag.split("v", maxsplit=1)[-1]
changelog_line = f".. changelog:: {version}"
stop_line = ".. changelog::"
return list(
{
issue
for line in itertools.takewhile(
lambda l: stop_line not in l, # noqa: E741
source.split(changelog_line, maxsplit=1)[1].splitlines(),
)
if re.match(r"\s+:issue: [\d ,]+", line)
for issue in re.findall(r"\d+", line)
}
)
def main(tag: str) -> str:
source = pathlib.Path("docs/release-notes/changelog.rst").read_text()
return json.dumps(find_resolved_issues(source, tag))
if __name__ == "__main__":
print(main(sys.argv[1])) # noqa: T201
litestar-2.18.0/.github/workflows/notify_released_issues/notify.js 0000664 0000000 0000000 00000002273 15070515525 0025454 0 ustar 00root root 0000000 0000000 module.exports = async ({github, context, core}) => {
const issues = JSON.parse(process.env.CLOSED_ISSUES)
const releaseURL = context.payload.release.html_url
const releaseName = context.payload.release.name
const baseBody = "A fix for this issue has been released in"
const body = baseBody + ` [${releaseName}](${releaseURL})`
for (const issueNumber of issues) {
const opts = github.rest.issues.listComments.endpoint.merge({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
});
const comments = await github.paginate(opts)
for (const comment of comments) {
if (comment.user.id === 41898282 && comment.body.startsWith(baseBody)) {
await github.rest.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: comment.id
})
}
}
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
body: body,
})
}
}
litestar-2.18.0/.github/workflows/pr-labeler.yml 0000664 0000000 0000000 00000002622 15070515525 0021605 0 ustar 00root root 0000000 0000000 name: "Pull Request Labeler"
on:
pull_request_target:
jobs:
apply-labels:
permissions:
contents: read
pull-requests: write
checks: write
statuses: write
runs-on: ubuntu-latest
steps:
- uses: fuxingloh/multi-labeler@v4
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
distinguish-pr-origin:
needs: apply-labels
if: ${{ always() }}
permissions:
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const maintainers = [
'JacobCoffee', 'provinzkraut', 'cofin',
'peterschutt', 'Alc-Alc', 'guacs',
'dependabot[bot]', 'all-contributors[bot]'
]
if (maintainers.includes(context.payload.sender.login)) {
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['pr/internal']
})
} else {
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['pr/external', 'Triage Required :hospital:']
})
}
litestar-2.18.0/.github/workflows/pr-merged.yml 0000664 0000000 0000000 00000003654 15070515525 0021450 0 ustar 00root root 0000000 0000000 name: "PR merged"
on:
pull_request:
types:
- closed
branches:
- main
- v3.0
jobs:
close_and_notify:
name: Close issues and notify
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
with:
script: |
const prNumber = context.payload.number
const branch = context.baseRef
// TODO: use semantic commits to specify the exact version, when it will be released
const commentBody = `\nThis issue has been closed in #${prNumber}. The change will be included in upcoming releases.`
const query = `query($number: Int!, $owner: String!, $name: String!) { repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
id
closingIssuesReferences (first: 10) { edges { node { number } } }
}
}
}`
const res = await github.graphql(query, {number: prNumber, owner: context.repo.owner, name: context.repo.repo})
const linkedIssues = res.repository.pullRequest.closingIssuesReferences.edges.map(
edge => edge.node.number
)
for (const issueNumber of linkedIssues) {
const res = await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
state: "closed",
state_reason: "completed"
})
if (res.status === 200) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
body: commentBody,
})
}
}
litestar-2.18.0/.github/workflows/pr-title.yml 0000664 0000000 0000000 00000000532 15070515525 0021316 0 ustar 00root root 0000000 0000000 name: "Lint PR Title"
on:
pull_request_target:
types:
- opened
- edited
- synchronize
permissions:
pull-requests: read
jobs:
main:
name: Validate PR title
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
litestar-2.18.0/.github/workflows/publish.yml 0000664 0000000 0000000 00000001557 15070515525 0021234 0 ustar 00root root 0000000 0000000 name: Latest Release
on:
release:
types: [published]
workflow_dispatch:
jobs:
publish-release:
name: upload release to PyPI
runs-on: ubuntu-latest
permissions:
id-token: write
environment: release
steps:
- name: Check out repository
uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.5.4"
enable-cache: true
- name: Build package
run: uv build
- name: Publish package distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
notify-issues:
needs: publish-release
name: Notify issues
uses: ./.github/workflows/notify-released-issues.yml
with:
release_tag: ${{ github.event.release.tag_name }}
litestar-2.18.0/.github/workflows/test.yml 0000664 0000000 0000000 00000004133 15070515525 0020536 0 ustar 00root root 0000000 0000000 name: Test
on:
workflow_call:
inputs:
python-version:
required: true
type: string
coverage:
required: false
type: boolean
default: false
os:
required: false
type: string
default: "ubuntu-latest"
timeout:
required: false
type: number
default: 10
env:
UV_LOCKED: 1
jobs:
test:
runs-on: ${{ inputs.os }}
timeout-minutes: ${{ inputs.timeout }}
defaults:
run:
shell: bash
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up python ${{ inputs.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ inputs.python-version }}
# Linux Source
- name: Install Build Dependencies
run: sudo apt-get install build-essential libpq-dev python3-dev -y
if: startsWith(inputs.os, 'ubuntu')
# MacOS Source
- name: Install Build Dependencies
run: brew install libpq && brew link --force libpq
if: startsWith(inputs.os, 'macos')
# Windows Source
- name: Install Build Dependencies
uses: ikalnytskyi/action-setup-postgres@v7
if: startsWith(inputs.os, 'windows')
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.8.8"
enable-cache: true
- name: Install dependencies
run: uv sync
- name: Set PYTHONPATH
run: echo "PYTHONPATH=$PWD" >> $GITHUB_ENV
- name: Test
if: ${{ !inputs.coverage }}
run: uv run pytest docs/examples tests -n auto
- name: Test with coverage
if: inputs.coverage
run: uv run pytest docs/examples tests -n auto --cov
- name: Rename coverage file
if: inputs.coverage
run: mv .coverage .coverage.${{ inputs.python-version }}
- uses: actions/upload-artifact@v4
if: inputs.coverage
with:
name: coverage-data-${{ inputs.python-version }}
path: .coverage.${{ inputs.python-version }}
include-hidden-files: true
litestar-2.18.0/.gitignore 0000664 0000000 0000000 00000001004 15070515525 0015421 0 ustar 00root root 0000000 0000000 # folders
*.egg-info/
.auto_pytabs_cache/
.hypothesis/
.idea/
.mypy_cache/
.pytest_cache/
.scannerwork/
.unasyncd_cache/
.venv/
.venv*
.vscode/
__pycache__/
assets/
build/
dist/
html/
node_modules/
results/
site/
target/
# files
**/*.so
**/*.sqlite
**/*.sqlite*
*.iml
.DS_Store
.coverage
.ruff_cache
/docs/_build/
coverage.*
setup.py
# pdm
.pdm.toml
.pdm-python
.pdm-build/
# pdm - PEP 582
__pypackages__/
# pyenv / rtx / asdf
.tool-versions
.python-version
/.dmypy.json
# test certificates
certs/
pdm.toml
.zed
litestar-2.18.0/.pre-commit-config.yaml 0000664 0000000 0000000 00000002767 15070515525 0017733 0 ustar 00root root 0000000 0000000 default_language_version:
python: "3.12"
repos:
- repo: https://github.com/compilerla/conventional-pre-commit
rev: v3.6.0
hooks:
- id: conventional-pre-commit
stages: [commit-msg]
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: check-ast
- id: check-case-conflict
- id: check-toml
- id: debug-statements
exclude: ^(litestar/config/app\.py|litestar/app\.py|test_apps/debugging/main\.py)$
- id: end-of-file-fixer
- id: mixed-line-ending
- id: trailing-whitespace
exclude: "tests/unit/test_openapi/test_typescript_converter/test_converter.py"
- repo: https://github.com/provinzkraut/unasyncd
rev: "v0.8.1"
hooks:
- id: unasyncd
additional_dependencies: ["ruff==0.12.8"]
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: "v0.12.8"
hooks:
- id: ruff
args: ["--fix"]
- id: ruff-format
- repo: https://github.com/crate-ci/typos
rev: v1.30.3
hooks:
- id: typos
- repo: https://github.com/python-formate/flake8-dunder-all
rev: v0.4.1
hooks:
- id: ensure-dunder-all
exclude: "test*|examples*|tools"
args: ["--use-tuple"]
- repo: https://github.com/sphinx-contrib/sphinx-lint
rev: "v1.0.0"
hooks:
- id: sphinx-lint
- repo: local
hooks:
- id: pypi-readme
name: pypi-readme
language: python
entry: python tools/pypi_readme.py
types: [markdown]
litestar-2.18.0/CITATION.cff 0000664 0000000 0000000 00000003053 15070515525 0015331 0 ustar 00root root 0000000 0000000 cff-version: 1.2.0
title: Litestar
message: 'If you use this software, please cite it as below.'
type: software
authors:
- given-names: Janek Nouvertné
- given-names: Peter Schutt
- given-names: Cody Fincher
- given-names: Visakh Unnikrishnan
- given-names: Jacob Coffee
- given-names: Na'aman Hirschfeld
repository-code: 'https://github.com/litestar-org/litestar'
url: 'https://docs.litestar.dev/latest/'
abstract: >-
Litestar is a powerful, flexible, and highly performant Python web framework
for building modern APIs and applications. With an emphasis on developer
experience and performance, Litestar provides a rich set of features out of the
box, including automatic API documentation, data validation and serialization,
ORM integration, dependency injection, caching, websockets, and more.
Litestar's layered architecture and open ecosystem enable seamless integration
with popular libraries like Pydantic, SQLAlchemy, and msgspec. It offers both
asynchronous and synchronous execution models without performance penalties.
With Litestar, you can effortlessly build and deploy production-ready APIs and
web applications, leveraging features like interactive API documentation,
middlewares for common tasks, session and JWT-based authentication, and strict
runtime validation for enhanced safety. Experience the perfect blend of ease
of use, flexibility and performance with Litestar.
keywords:
- python
- web
- framework
- typing
- dependency injection
- api
license: MIT
version: v2.8.0
date-released: '2024-04-05'
litestar-2.18.0/CONTRIBUTING.rst 0000664 0000000 0000000 00000034024 15070515525 0016102 0 ustar 00root root 0000000 0000000 Contribution Guide
==================
.. _pipx: https://pypa.github.io/pipx/
.. |pipx| replace:: `pipx `__
.. _homebrew: https://brew.sh/
.. |homebrew| replace:: `Homebrew `__
Getting Started
---------------
Supported Python Versions
+++++++++++++++++++++++++
The lowest currently supported version is Python 3.8.
At a minimum you will need Python 3.8 for code changes and 3.12 if you plan on doing documentation building / changes.
You can use various tools to manage multiple Python versions on your system including:
* `pyenv `_ and `pyenv-win for Windows `_
* `rtx / mise `_
* `asdf `_
* `Building each version manually from source `_
* Utilizing `GitHub Codespaces `_
We use the lowest supported version in our type-checking CI,
this ensures that the changes you made are backward compatible.
Setting up the environment
++++++++++++++++++++++++++
.. tip:: We maintain a Makefile with several commands to help with common tasks.
You can run ``make help`` to see a list of available commands.
If you are utilizing `GitHub Codespaces `_,
the environment will bootstrap itself automatically. The steps below are for local development.
#. Install `uv `_:
#. Run ``make install`` to create a `virtual environment `_
and install the required development dependencies or run the ``uv sync`` command manually:
.. code-block:: shell
:caption: Installing the development dependencies
uv sync
.. tip:: Many modern IDEs like PyCharm or VS Code will enable the uv-managed virtualenv that is created in step 2
for you automatically.
If your IDE / editor does not offer this functionality, then you will need to manually activate the virtualenv
yourself. Otherwise you may encounter errors or unexpected behaviour when trying to run the commands referenced
within this document.
To activate the virtualenv manually, please consult uv's documentation on
`working with virtual environments `_.
The rest of this document will assume this environment is active wherever commands are referenced.
Code contributions
------------------
Workflow
++++++++
#. `Fork `_ the `Litestar repository `_
#. Clone your fork locally with git
#. `Set up the environment <#setting-up-the-environment>`_
#. Make your changes
#. (Optional) Run ``pre-commit run --all-files`` to run linters and formatters. This step is optional and will be executed
automatically by git before you make a commit, but you may want to run it manually in order to apply fixes
#. Commit your changes to git. We follow `conventional commits `_
which are enforced using a ``pre-commit`` hook.
#. Push the changes to your fork
#. Open a `pull request `_. Give the pull request a descriptive title
indicating what it changes. The style of the PR title should also follow
`conventional commits `_, and this is enforced using a GitHub action.
#. Add yourself as a contributor using the `all-contributors bot `_
Guidelines for writing code
----------------------------
- Code should be `Pythonic and zen `_
- All code should be fully `typed `_. This is enforced via
`mypy `_ and `Pyright `_
* When requiring complex types, use a `type alias `_.
Check :doc:`reference/types` if a type alias for your use case already exists
* If something cannot be typed correctly due to a limitation of the type checkers, you may use :func:`typing.cast`
to rectify the situation. However, you should only use this as a last resort if you've exhausted all other options
of `type narrowing `_, such as :func:`isinstance` checks
and `type guards `_.
* You may use a properly scoped ``type: ignore`` if you ensured that a line is correct, but mypy / pyright has
issues with it.
Properly scoped meaning do not use blank ``type: ignore``, instead supply the specific error code, e.g.,
``type: ignore[attr-defined]``
- If you are adding or modifying existing code, ensure that it's fully tested. 100% test coverage is mandatory, and will
be checked on the PR using `SonarCloud `_ and
`Codecov `_
- All functions, methods, classes, and attributes should be documented with a docstring. We use the
`Google docstring style `_. If you come
across a function or method that doesn't conform to this standard, please update it as you go
- When adding a new public interface, it has to be included in the reference documentation located in
``docs/reference``. If applicable, add or modify examples in the docs related to the new functionality implemented,
following the guidelines established in `Adding examples`_.
Writing and running tests
+++++++++++++++++++++++++
Tests are contained within the ``tests`` directory, and follow the same directory structure as the ``litestar`` module.
If you are adding a test case, it should be located within the correct submodule of ``tests``. E.g., tests for
``litestar/utils/sync.py`` reside in ``tests/utils/test_sync.py``.
The ``Makefile`` includes several commands for running tests:
- ``make test`` to run tests located in ``tests``
- ``make test-examples`` to run tests located in ``docs/examples/tests``
- ``make test-all`` to run all tests
- ``make coverage`` to run tests with coverage and generate an html report
The tests make use of `pytest-xdist `_ to speed up
test runs. These are enabled by default when running ``make test``, ``make test-all``
or ``make coverage``. Due to the nature of pytest-xdist, attaching a debugger isn't as
straightforward. For debugging, it's recommended to run the tests individually with
``pytest `` or via an IDE, which will skip ``pytest-xdist``.
Running type checkers
+++++++++++++++++++++
We use `mypy `_ and `pyright `_ to
enforce type safety. You can run them with:
- ``make mypy``
- ``make pyright``
- ``make type-check`` to run both
- ``make lint`` to run pre-commit hooks and type checkers.
Our type checkers are run on Python 3.8 in CI, so you should make sure to run them on the same version locally as well.
Project documentation
---------------------
The documentation is located in the ``/docs`` directory and is written in
`reStructuredText `_ with the `Sphinx `_.
library. If you're unfamiliar with any of those,
`reStructuredText primer `_ and
`Sphinx quickstart `_ are recommended reads.
Docs theme and appearance
+++++++++++++++++++++++++
We welcome contributions that enhance / improve the appearance and usability of the docs. We use the excellent
`PyData Sphinx Theme `_ theme, which comes with a lot of options out of the box.
If you wish to contribute to the docs style / setup, or static site generation, you should consult the theme docs
as a first step.
Running the docs locally
++++++++++++++++++++++++
You can serve the documentation locally with
.. code-block:: shell
:caption: Serving the documentation locally
make docs-serve
or build it with
.. code-block:: shell
:caption: Serving the documentation locally
make docs
Writing and editing docs
++++++++++++++++++++++++
We welcome contributions that enhance / improve the content of the docs. Feel free to add examples, clarify text,
restructure the docs, etc., but make sure to follow these guidelines:
- Write text in idiomatic English, using simple language
- Do not use contractions for ease of reading for non-native English speakers
- Opt for `Oxford commas `_ when listing a series of terms
- Keep examples simple and self contained (see `Adding examples`_). This is to ensure they are tested
alongside the rest of the test suite and properly type checked and linted.
- Provide links where applicable.
- Use `intersphinx `_ wherever possible when
referencing external libraries
- Provide diagrams using `Mermaid `_ where applicable and possible
Adding examples
~~~~~~~~~~~~~~~
The examples from the docs are located in their own modules inside the ``/docs/examples`` folder. This makes it easier
to test them alongside the rest of the test suite, ensuring they do not become stale as Litestar evolves.
Please follow the next guidelines when adding a new example:
- Add the example in the corresponding module directory in ``/docs/examples`` or create a new one if necessary
- Create a suite for the module in ``/tests/examples`` that tests the aspects of the example that it demonstrates
- Reference the example in the rst file with an external reference code block, e.g.
.. code-block:: rst
:caption: An example of how to use literal includes of external files
.. literalinclude:: /examples/test_thing.py
:language: python
:caption: All includes should have a descriptive caption
Automatically execute examples
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Our docs include a Sphinx extension that can automatically run requests against example apps
and include their result in the documentation page when its being built. This only requires 2 steps:
1. Create an example file with an ``app`` object in it, which is an instance of ``Litestar``
2. Add a comment in the form of ``# run: /hello`` to the example file
When building the docs (or serving them locally), a process serving the ``app`` instance
will be launched, and the requests specified in the comments will be run against it. The
comments will be stripped from the result, and the output of the ``curl`` invocation inserted
after the example code-block.
The ``# run:`` syntax is nothing special; everything after the colon will be passed to
the ``curl`` command that's being invoked. The URL is built automatically, so the
specified path can just be a path relative to the app.
In practice, this looks like the following:
.. code-block:: python
:caption: An example of how to use the automatic example runner
:no-upgrade:
from typing import Dict
from litestar import Litestar, get
@get("/")
def hello_world() -> Dict[str, str]:
"""Handler function that returns a greeting dictionary."""
return {"hello": "world"}
app = Litestar(route_handlers=[hello_world])
# run: /
This is equivalent to:
.. code-block:: python
:caption: An example of how to use the automatic example runner
from typing import Dict
from litestar import Litestar, get
@get("/")
def hello_world() -> Dict[str, str]:
"""Handler function that returns a greeting dictionary."""
return {"hello": "world"}
app = Litestar(route_handlers=[hello_world])
.. admonition:: Run it
.. code-block:: bash
> curl http://127.0.0.1:8000/
{"hello": "world"}
Creating a New Release
----------------------
#. Checkout the ``main`` branch:
.. code-block:: shell
:caption: Checking out the main branch of the ``litestar`` repository
git checkout main
#. Run the release preparation script:
.. code-block:: shell
:caption: Preparing a new release
python tools/prepare_release.py --update-version --create-draft-release
Replace ```` with the desired version number following the
`versioning scheme `_.
This script will:
- Update the version in ``pyproject.toml``
- Generate a changelog entry in :doc:`/release-notes/changelog`
- Create a draft release on GitHub
#. Review the generated changelog entry in :doc:`/release-notes/changelog` to ensure it looks correct.
#. Commit the changes to ``main``:
.. code-block:: shell
:caption: Committing the changes to the main branch
git commit -am "chore(release): prepare release vX.Y.Z"
Replace ``vX.Y.Z`` with the actual version number.
#. Create a new branch for the release:
.. code-block:: shell
:caption: Creating a new branch for the release
git checkout -b vX.Y.Z
#. Push the changes to a ``vX.Y.Z`` branch:
.. code-block:: shell
:caption: Pushing the changes to the ``vX.Y.Z`` branch
git push origin vX.Y.Z
#. Open a pull request from the ``vX.Y.Z`` branch to ``main``.
#. Once the pull request is approved, go to the draft release on GitHub
(the release preparation script will provide a link).
#. Review the release notes in the draft release to ensure they look correct.
#. If everything looks good, click "Publish release" to make the release official.
#. Go to the `Release Action `_ and approve
the release workflow if necessary.
#. Check that the release workflow runs successfully.
.. note:: The version number should follow `semantic versioning `_ and
`PEP 440 `_.
litestar-2.18.0/LICENSE 0000664 0000000 0000000 00000002120 15070515525 0014436 0 ustar 00root root 0000000 0000000 The MIT License (MIT)
Copyright (c) 2021, 2022, 2023, 2024, 2025 Litestar Org.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
litestar-2.18.0/Makefile 0000664 0000000 0000000 00000012633 15070515525 0015103 0 ustar 00root root 0000000 0000000 SHELL := /bin/bash
# =============================================================================
# Variables
# =============================================================================
.DEFAULT_GOAL:=help
.ONESHELL:
ENV_PREFIX = .venv/bin/
VENV_EXISTS = $(shell python3 -c "if __import__('pathlib').Path('.venv/bin/activate').exists(): print('yes')")
.EXPORT_ALL_VARIABLES:
.PHONY: help
help: ## Display this help text for Makefile
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
.PHONY: upgrade
upgrade: ## Upgrade all dependencies to the latest stable versions
@echo "=> Updating all dependencies"
@uv lock --upgrade
@echo "=> Dependencies Updated"
@uv run pre-commit autoupdate
@echo "=> Updated Pre-commit"
# =============================================================================
# Developer Utils
# =============================================================================
.PHONY: install
install: ## Install dependencies
@uv sync
.PHONY: clean
clean: ## Cleanup temporary build artifacts
@echo "=> Cleaning working directory"
@rm -rf .pytest_cache .ruff_cache .hypothesis build/ -rf dist/ .eggs/
@find . -name '*.egg-info' -exec rm -rf {} +
@find . -type f -name '*.egg' -exec rm -f {} +
@find . -name '*.pyc' -exec rm -f {} +
@find . -name '*.pyo' -exec rm -f {} +
@find . -name '*~' -exec rm -f {} +
@find . -name '__pycache__' -exec rm -rf {} +
@find . -name '.ipynb_checkpoints' -exec rm -rf {} +
@rm -rf .coverage coverage.xml coverage.json htmlcov/ .pytest_cache tests/.pytest_cache tests/**/.pytest_cache .mypy_cache
$(MAKE) docs-clean
.PHONY: destroy
destroy: ## Destroy the virtual environment
@rm -rf .venv
.PHONY: lock
lock: ## Rebuild lockfiles from scratch, updating all dependencies
@uv lock
# =============================================================================
# Tests, Linting, Coverage
# =============================================================================
.PHONY: mypy
mypy: ## Run mypy
@echo "=> Running mypy"
@uv run dmypy run
@echo "=> mypy complete"
.PHONY: mypy-nocache
mypy-nocache: ## Run Mypy without cache
@echo "=> Running mypy without a cache"
@uv run dmypy run -- --cache-dir=/dev/null
@echo "=> mypy complete"
.PHONY: pyright
pyright: ## Run pyright
@echo "=> Running pyright"
@uv run pyright
@echo "=> pyright complete"
.PHONY: type-check
type-check: mypy pyright ## Run all type checking
.PHONY: pre-commit
pre-commit: ## Runs pre-commit hooks; includes ruff formatting and linting, codespell
@echo "=> Running pre-commit process"
@uv run pre-commit run --all-files
@echo "=> Pre-commit complete"
.PHONY: slots-check
slots-check: ## Check for slots usage in classes
@echo "=> Checking for slots usage in classes"
@uv run slotscheck litestar
@echo "=> Slots check complete"
.PHONY: lint
lint: pre-commit type-check slots-check ## Run all linting
.PHONY: coverage
coverage: ## Run the tests and generate coverage report
@echo "=> Running tests with coverage"
@uv run pytest tests --cov -n auto
@uv run coverage html
@uv run coverage xml
@echo "=> Coverage report generated"
.PHONY: test
test: ## Run the tests
@echo "=> Running test cases"
@uv run pytest tests
@echo "=> Tests complete"
.PHONY: test-examples
test-examples: ## Run the examples tests
@uv run pytest docs/examples
.PHONY: test-all
test-all: test test-examples ## Run all tests
.PHONY: check-all
check-all: lint test-all coverage ## Run all linting, tests, and coverage checks
# =============================================================================
# Docs
# =============================================================================
# XXX: docs commands are pinned to Python 3.12 due to picologging not being compatible with 3.13
.PHONY: docs-install
docs-install: ## Install docs dependencies
@echo "=> Installing documentation dependencies"
@uv sync --python 3.12 --group docs
@echo "=> Installed documentation dependencies"
docs-clean: ## Dump the existing built docs
@echo "=> Cleaning documentation build assets"
@rm -rf docs/_build
@echo "=> Removed existing documentation build assets"
docs-serve: docs-clean ## Serve the docs locally
@echo "=> Serving documentation"
uv run --python 3.12 sphinx-autobuild docs docs/_build/ -j auto --watch litestar --watch docs --watch tests --watch CONTRIBUTING.rst --open-browser --port=0
docs: docs-clean ## Dump the existing built docs and rebuild them
@echo "=> Building documentation"
@uv run --python 3.12 sphinx-build -M html docs docs/_build/ -E -a -j auto -W --keep-going
.PHONY: docs-linkcheck
docs-linkcheck: ## Run the link check on the docs
@uv run --python 3.12 sphinx-build -b linkcheck ./docs ./docs/_build -D linkcheck_ignore='http://.*','https://.*'
.PHONY: docs-linkcheck-full
docs-linkcheck-full: ## Run the full link check on the docs
@uv run --python 3.12 sphinx-build -b linkcheck ./docs ./docs/_build -D linkcheck_anchors=0
litestar-2.18.0/README.md 0000664 0000000 0000000 00000314764 15070515525 0014734 0 ustar 00root root 0000000 0000000
| Project | | Status |
|-----------|:----|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| CI/CD | | [](https://github.com/litestar-org/litestar/actions/workflows/publish.yml) [](https://github.com/litestar-org/litestar/actions/workflows/ci.yml) [](https://github.com/litestar-org/litestar/actions/workflows/docs.yml) |
| Quality | | [](https://codecov.io/github/litestar-org/litestar) |
| Package | | [](https://badge.fury.io/py/litestar)    |
| Community | | [](https://reddit.com/r/litestarapi) [](https://discord.gg/litestar) [](https://matrix.to/#/#litestar:matrix.org) [](https://blog.litestar.dev) [](https://twitter.com/LitestarAPI) [](https://blog.litestar.dev) |
| Meta | | [](https://github.com/litestar-org/litestar) [](https://github.com/python/mypy) [](https://spdx.org/licenses/) [](https://github.com/sponsors/litestar-org) [](https://github.com/astral-sh/ruff) [](https://github.com/psf/black) [](#contributors-) |
Litestar is a powerful, flexible yet opinionated ASGI framework, focused on
building APIs. It offers high-performance data validation, dependency injection,
first-class ORM integration, authorization primitives, a rich plugin API, middleware,
and much more that's needed to get applications up and running.
Check out the [documentation 📚](https://docs.litestar.dev/) for a detailed overview of
its features!
Additionally, the [Litestar fullstack repository](https://github.com/litestar-org/litestar-fullstack)
can give you a good impression how a fully fledged Litestar application may look.
Table of Contents
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Core Features](#core-features)
- [Example Applications](#example-applications)
- [Features](#features)
- [Class-based Controllers](#class-based-controllers)
- [Data Parsing, Type Hints, and Msgspec](#data-parsing-type-hints-and-msgspec)
- [Plugin System, ORM support, and DTOs](#plugin-system-orm-support-and-dtos)
- [OpenAPI](#openapi)
- [Dependency Injection](#dependency-injection)
- [Middleware](#middleware)
- [Route Guards](#route-guards)
- [Request Life Cycle Hooks](#request-life-cycle-hooks)
- [Performance](#performance)
- [Contributing](#contributing)
## Installation
```shell
pip install litestar
```
or to include the CLI and a server (uvicorn) for running your application:
```shell
pip install 'litestar[standard]'
```
## Quick Start
```python title="app.py"
from litestar import Litestar, get
@get("/")
async def hello_world() -> dict[str, str]:
"""Keeping the tradition alive with hello world."""
return {"hello": "world"}
app = Litestar(route_handlers=[hello_world])
```
And run it with
```bash
litestar run
```
## Core Features
- [Class based controllers](#class-based-controllers)
- [Dependency Injection](#dependency-injection)
- [Layered Middleware](#middleware)
- [Plugin System](#plugin-system-orm-support-and-dtos)
- [OpenAPI 3.1 schema generation](#openapi)
- [Life Cycle Hooks](#request-life-cycle-hooks)
- [Route Guards based Authorization](#route-guards)
- Support for `dataclasses`, `TypedDict`, [`msgspec`](https://jcristharif.com/msgspec/), [pydantic version 1 and version 2 (even within the same application)](https://docs.pydantic.dev/latest/) and [(c)attrs](https://catt.rs/en/stable/)
- Layered parameter declaration
- Support for [RFC 9457](https://datatracker.ietf.org/doc/html/rfc9457) standardized "Problem Detail" error responses
- [Automatic API documentation with](#redoc-swagger-ui-and-stoplight-elements-api-documentation):
- [Scalar](https://github.com/scalar/scalar/)
- [RapiDoc](https://github.com/rapi-doc/RapiDoc)
- [Redoc](https://github.com/Redocly/redoc)
- [Stoplight Elements](https://github.com/stoplightio/elements)
- [Swagger-UI](https://swagger.io/tools/swagger-ui/)
- [Trio](https://trio.readthedocs.io/en/stable/) support (built-in, via [AnyIO](https://anyio.readthedocs.io/))
- Ultra-fast validation, serialization and deserialization using [msgspec](https://github.com/jcrist/msgspec)
- [SQLAlchemy integration](https://docs.advanced-alchemy.litestar.dev/latest/)
## Example Applications
Pre-built Example Apps
- [litestar-hello-world](https://github.com/litestar-org/litestar-hello-world): A bare-minimum application setup. Great
for testing and POC work.
- [litestar-fullstack](https://github.com/litestar-org/litestar-fullstack): A reference application that contains most of the boilerplate required for a web application.
It features a Litestar app configured with best practices, SQLAlchemy 2.0 and SAQ, a frontend integrated with Vitejs and Jinja2 templates, Docker, and more. Like all
Litestar projects, this application is open to contributions, big and small.
## Sponsors
Litestar is an open-source project, and we enjoy the support of our sponsors to help fund the exciting
work we do.
A **huge** thanks to our sponsors:
[//]: # "Note to maintainers: Highest sponsors first; no more than 3 per row - create new div if needed"
Check out our sponsors in the docs
If you would like to support the work that we do please consider [becoming a sponsor][sponsor-polar]
via [Polar.sh][sponsor-polar] (preferred), [GitHub][sponsor-github] or [Open Collective][sponsor-oc].
Also, exclusively with [Polar][sponsor-polar], you can engage in pledge-based sponsorships.
[sponsor-github]: https://github.com/sponsors/litestar-org
[sponsor-oc]: https://opencollective.com/litestar
[sponsor-polar]: https://polar.sh/litestar-org
## Features
### Class-based Controllers
While supporting function-based route handlers, Litestar also supports and promotes python OOP using class based
controllers:
Example for class-based controllers
```python title="my_app/controllers/user.py"
from typing import List, Optional
from datetime import datetime
from litestar import Controller, get, post, put, patch, delete
from litestar.dto import DTOData
from pydantic import UUID4
from my_app.models import User, PartialUserDTO
class UserController(Controller):
path = "/users"
@post()
async def create_user(self, data: User) -> User: ...
@get()
async def list_users(self) -> List[User]: ...
@get(path="/{date:int}")
async def list_new_users(self, date: datetime) -> List[User]: ...
@patch(path="/{user_id:uuid}", dto=PartialUserDTO)
async def partial_update_user(
self, user_id: UUID4, data: DTOData[PartialUserDTO]
) -> User: ...
@put(path="/{user_id:uuid}")
async def update_user(self, user_id: UUID4, data: User) -> User: ...
@get(path="/{user_name:str}")
async def get_user_by_name(self, user_name: str) -> Optional[User]: ...
@get(path="/{user_id:uuid}")
async def get_user(self, user_id: UUID4) -> User: ...
@delete(path="/{user_id:uuid}")
async def delete_user(self, user_id: UUID4) -> None: ...
```
### Data Parsing, Type Hints, and Msgspec
Litestar is rigorously typed, and it enforces typing. For example, if you forget to type a return value for a route
handler, an exception will be raised. The reason for this is that Litestar uses typing data to generate OpenAPI specs,
as well as to validate and parse data. Thus, typing is essential to the framework.
Furthermore, Litestar allows extending its support using plugins.
### Plugin System, ORM support, and DTOs
Litestar has a plugin system that allows the user to extend serialization/deserialization, OpenAPI generation, and other
features.
It ships with a builtin plugin for SQL Alchemy, which allows the user to use SQLAlchemy declarative classes "natively"
i.e., as type parameters that will be serialized/deserialized and to return them as values from route
handlers.
Litestar also supports the programmatic creation of DTOs with a `DTOFactory` class, which also supports the use of
plugins.
### OpenAPI
Litestar has custom logic to generate OpenAPI 3.1.0 schema, include optional generation of examples using the
[`polyfactory`](https://pypi.org/project/polyfactory/) library.
#### ReDoc, Swagger-UI and Stoplight Elements API Documentation
Litestar serves the documentation from the generated OpenAPI schema with:
- [ReDoc](https://redoc.ly/)
- [Swagger-UI](https://swagger.io/tools/swagger-ui/)
- [Stoplight Elements](https://github.com/stoplightio/elements)
- [RapiDoc](https://rapidocweb.com/)
All these are available and enabled by default.
### Dependency Injection
Litestar has a simple but powerful DI system inspired by pytest. You can define named dependencies - sync or async - at
different levels of the application, and then selective use or overwrite them.
Example for DI
```python
from litestar import Litestar, get
from litestar.di import Provide
async def my_dependency() -> str: ...
@get("/")
async def index(injected: str) -> str:
return injected
app = Litestar([index], dependencies={"injected": Provide(my_dependency)})
```
### Middleware
Litestar supports typical ASGI middleware and ships with middlewares to handle things such as
- CORS
- CSRF
- Rate limiting
- GZip and Brotli compression
- Client- and server-side sessions
### Route Guards
Litestar has an authorization mechanism called `guards`, which allows the user to define guard functions at different
level of the application (app, router, controller etc.) and validate the request before hitting the route handler
function.
Example for route guards
```python
from litestar import Litestar, get
from litestar.connection import ASGIConnection
from litestar.handlers.base import BaseRouteHandler
from litestar.exceptions import NotAuthorizedException
async def is_authorized(connection: ASGIConnection, handler: BaseRouteHandler) -> None:
# validate authorization
# if not authorized, raise NotAuthorizedException
raise NotAuthorizedException()
@get("/", guards=[is_authorized])
async def index() -> None: ...
app = Litestar([index])
```
### Request Life Cycle Hooks
Litestar supports request life cycle hooks, similarly to Flask - i.e. `before_request` and `after_request`
## Performance
Litestar is fast. It is on par with, or significantly faster than comparable ASGI frameworks.
You can see and run the benchmarks [here](https://github.com/litestar-org/api-performance-tests),
or read more about it [here](https://docs.litestar.dev/latest/benchmarks) in our documentation.
## Contributing
Litestar is open to contributions big and small. You can always [join our discord](https://discord.gg/litestar) server
or [join our Matrix](https://matrix.to/#/#litestar:matrix.org) space
to discuss contributions and project maintenance. For guidelines on how to contribute, please
see [the contribution guide](CONTRIBUTING.rst).
## Contributors ✨
Thanks goes to these wonderful people:
Emoji Key
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification.
Contributions of any kind welcome!
litestar-2.18.0/codecov.yml 0000664 0000000 0000000 00000000255 15070515525 0015605 0 ustar 00root root 0000000 0000000 coverage:
status:
project:
default:
target: auto
threshold: 0.1%
patch:
default:
target: auto
comment:
require_changes: true
litestar-2.18.0/docs/ 0000775 0000000 0000000 00000000000 15070515525 0014366 5 ustar 00root root 0000000 0000000 litestar-2.18.0/docs/PYPI_README.md 0000664 0000000 0000000 00000046602 15070515525 0016516 0 ustar 00root root 0000000 0000000
| Project | | Status |
|-----------|:----|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| CI/CD | | [](https://github.com/litestar-org/litestar/actions/workflows/publish.yml) [](https://github.com/litestar-org/litestar/actions/workflows/ci.yml) [](https://github.com/litestar-org/litestar/actions/workflows/docs.yml) |
| Quality | | [](https://codecov.io/github/litestar-org/litestar) |
| Package | | [](https://badge.fury.io/py/litestar)    |
| Community | | [](https://reddit.com/r/litestarapi) [](https://discord.gg/litestar) [](https://matrix.to/#/#litestar:matrix.org) [](https://blog.litestar.dev) [](https://twitter.com/LitestarAPI) [](https://blog.litestar.dev) |
| Meta | | [](https://github.com/litestar-org/litestar) [](https://github.com/python/mypy) [](https://spdx.org/licenses/) [](https://github.com/sponsors/litestar-org) [](https://github.com/astral-sh/ruff) [](https://github.com/psf/black) [](#contributors-) |
Litestar is a powerful, flexible yet opinionated ASGI framework, focused on
building APIs. It offers high-performance data validation, dependency injection,
first-class ORM integration, authorization primitives, a rich plugin API, middleware,
and much more that's needed to get applications up and running.
Check out the [documentation 📚](https://docs.litestar.dev/) for a detailed overview of
its features!
Additionally, the [Litestar fullstack repository](https://github.com/litestar-org/litestar-fullstack)
can give you a good impression how a fully fledged Litestar application may look.
Table of Contents
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Core Features](#core-features)
- [Example Applications](#example-applications)
- [Features](#features)
- [Class-based Controllers](#class-based-controllers)
- [Data Parsing, Type Hints, and Msgspec](#data-parsing-type-hints-and-msgspec)
- [Plugin System, ORM support, and DTOs](#plugin-system-orm-support-and-dtos)
- [OpenAPI](#openapi)
- [Dependency Injection](#dependency-injection)
- [Middleware](#middleware)
- [Route Guards](#route-guards)
- [Request Life Cycle Hooks](#request-life-cycle-hooks)
- [Performance](#performance)
- [Contributing](#contributing)
## Installation
```shell
pip install litestar
```
or to include the CLI and a server (uvicorn) for running your application:
```shell
pip install 'litestar[standard]'
```
## Quick Start
```python title="app.py"
from litestar import Litestar, get
@get("/")
async def hello_world() -> dict[str, str]:
"""Keeping the tradition alive with hello world."""
return {"hello": "world"}
app = Litestar(route_handlers=[hello_world])
```
And run it with
```bash
litestar run
```
## Core Features
- [Class based controllers](#class-based-controllers)
- [Dependency Injection](#dependency-injection)
- [Layered Middleware](#middleware)
- [Plugin System](#plugin-system-orm-support-and-dtos)
- [OpenAPI 3.1 schema generation](#openapi)
- [Life Cycle Hooks](#request-life-cycle-hooks)
- [Route Guards based Authorization](#route-guards)
- Support for `dataclasses`, `TypedDict`, [`msgspec`](https://jcristharif.com/msgspec/), [pydantic version 1 and version 2 (even within the same application)](https://docs.pydantic.dev/latest/) and [(c)attrs](https://catt.rs/en/stable/)
- Layered parameter declaration
- Support for [RFC 9457](https://datatracker.ietf.org/doc/html/rfc9457) standardized "Problem Detail" error responses
- [Automatic API documentation with](#redoc-swagger-ui-and-stoplight-elements-api-documentation):
- [Scalar](https://github.com/scalar/scalar/)
- [RapiDoc](https://github.com/rapi-doc/RapiDoc)
- [Redoc](https://github.com/Redocly/redoc)
- [Stoplight Elements](https://github.com/stoplightio/elements)
- [Swagger-UI](https://swagger.io/tools/swagger-ui/)
- [Trio](https://trio.readthedocs.io/en/stable/) support (built-in, via [AnyIO](https://anyio.readthedocs.io/))
- Ultra-fast validation, serialization and deserialization using [msgspec](https://github.com/jcrist/msgspec)
- [SQLAlchemy integration](https://docs.advanced-alchemy.litestar.dev/latest/)
## Example Applications
Pre-built Example Apps
- [litestar-hello-world](https://github.com/litestar-org/litestar-hello-world): A bare-minimum application setup. Great
for testing and POC work.
- [litestar-fullstack](https://github.com/litestar-org/litestar-fullstack): A reference application that contains most of the boilerplate required for a web application.
It features a Litestar app configured with best practices, SQLAlchemy 2.0 and SAQ, a frontend integrated with Vitejs and Jinja2 templates, Docker, and more. Like all
Litestar projects, this application is open to contributions, big and small.
## Sponsors
Litestar is an open-source project, and we enjoy the support of our sponsors to help fund the exciting
work we do.
A **huge** thanks to our sponsors:
[//]: # "Note to maintainers: Highest sponsors first; no more than 3 per row - create new div if needed"
Check out our sponsors in the docs
If you would like to support the work that we do please consider [becoming a sponsor][sponsor-polar]
via [Polar.sh][sponsor-polar] (preferred), [GitHub][sponsor-github] or [Open Collective][sponsor-oc].
Also, exclusively with [Polar][sponsor-polar], you can engage in pledge-based sponsorships.
[sponsor-github]: https://github.com/sponsors/litestar-org
[sponsor-oc]: https://opencollective.com/litestar
[sponsor-polar]: https://polar.sh/litestar-org
## Features
### Class-based Controllers
While supporting function-based route handlers, Litestar also supports and promotes python OOP using class based
controllers:
Example for class-based controllers
```python title="my_app/controllers/user.py"
from typing import List, Optional
from datetime import datetime
from litestar import Controller, get, post, put, patch, delete
from litestar.dto import DTOData
from pydantic import UUID4
from my_app.models import User, PartialUserDTO
class UserController(Controller):
path = "/users"
@post()
async def create_user(self, data: User) -> User: ...
@get()
async def list_users(self) -> List[User]: ...
@get(path="/{date:int}")
async def list_new_users(self, date: datetime) -> List[User]: ...
@patch(path="/{user_id:uuid}", dto=PartialUserDTO)
async def partial_update_user(
self, user_id: UUID4, data: DTOData[PartialUserDTO]
) -> User: ...
@put(path="/{user_id:uuid}")
async def update_user(self, user_id: UUID4, data: User) -> User: ...
@get(path="/{user_name:str}")
async def get_user_by_name(self, user_name: str) -> Optional[User]: ...
@get(path="/{user_id:uuid}")
async def get_user(self, user_id: UUID4) -> User: ...
@delete(path="/{user_id:uuid}")
async def delete_user(self, user_id: UUID4) -> None: ...
```
### Data Parsing, Type Hints, and Msgspec
Litestar is rigorously typed, and it enforces typing. For example, if you forget to type a return value for a route
handler, an exception will be raised. The reason for this is that Litestar uses typing data to generate OpenAPI specs,
as well as to validate and parse data. Thus, typing is essential to the framework.
Furthermore, Litestar allows extending its support using plugins.
### Plugin System, ORM support, and DTOs
Litestar has a plugin system that allows the user to extend serialization/deserialization, OpenAPI generation, and other
features.
It ships with a builtin plugin for SQL Alchemy, which allows the user to use SQLAlchemy declarative classes "natively"
i.e., as type parameters that will be serialized/deserialized and to return them as values from route
handlers.
Litestar also supports the programmatic creation of DTOs with a `DTOFactory` class, which also supports the use of
plugins.
### OpenAPI
Litestar has custom logic to generate OpenAPI 3.1.0 schema, include optional generation of examples using the
[`polyfactory`](https://pypi.org/project/polyfactory/) library.
#### ReDoc, Swagger-UI and Stoplight Elements API Documentation
Litestar serves the documentation from the generated OpenAPI schema with:
- [ReDoc](https://redoc.ly/)
- [Swagger-UI](https://swagger.io/tools/swagger-ui/)
- [Stoplight Elements](https://github.com/stoplightio/elements)
- [RapiDoc](https://rapidocweb.com/)
All these are available and enabled by default.
### Dependency Injection
Litestar has a simple but powerful DI system inspired by pytest. You can define named dependencies - sync or async - at
different levels of the application, and then selective use or overwrite them.
Example for DI
```python
from litestar import Litestar, get
from litestar.di import Provide
async def my_dependency() -> str: ...
@get("/")
async def index(injected: str) -> str:
return injected
app = Litestar([index], dependencies={"injected": Provide(my_dependency)})
```
### Middleware
Litestar supports typical ASGI middleware and ships with middlewares to handle things such as
- CORS
- CSRF
- Rate limiting
- GZip and Brotli compression
- Client- and server-side sessions
### Route Guards
Litestar has an authorization mechanism called `guards`, which allows the user to define guard functions at different
level of the application (app, router, controller etc.) and validate the request before hitting the route handler
function.
Example for route guards
```python
from litestar import Litestar, get
from litestar.connection import ASGIConnection
from litestar.handlers.base import BaseRouteHandler
from litestar.exceptions import NotAuthorizedException
async def is_authorized(connection: ASGIConnection, handler: BaseRouteHandler) -> None:
# validate authorization
# if not authorized, raise NotAuthorizedException
raise NotAuthorizedException()
@get("/", guards=[is_authorized])
async def index() -> None: ...
app = Litestar([index])
```
### Request Life Cycle Hooks
Litestar supports request life cycle hooks, similarly to Flask - i.e. `before_request` and `after_request`
## Performance
Litestar is fast. It is on par with, or significantly faster than comparable ASGI frameworks.
You can see and run the benchmarks [here](https://github.com/litestar-org/api-performance-tests),
or read more about it [here](https://docs.litestar.dev/latest/benchmarks) in our documentation.
## Contributing
Litestar is open to contributions big and small. You can always [join our discord](https://discord.gg/litestar) server
or [join our Matrix](https://matrix.to/#/#litestar:matrix.org) space
to discuss contributions and project maintenance. For guidelines on how to contribute, please
see [the contribution guide](CONTRIBUTING.rst).
litestar-2.18.0/docs/_static/ 0000775 0000000 0000000 00000000000 15070515525 0016014 5 ustar 00root root 0000000 0000000 litestar-2.18.0/docs/_static/favicon.png 0000664 0000000 0000000 00000017005 15070515525 0020152 0 ustar 00root root 0000000 0000000 PNG
IHDR >a pHYs [M_p tEXtSoftware www.inkscape.org< IDATx}y\{UqC@525Rn)صluju+"eeb*nWSE3pef3z_ʙg<=<#д} x V
@^sA0N= m#A2@ @gD%[eR
iTwA.6ƁV $ w D ZY `] tsJ $= < @+m[F ;A( hz$x@6@>` 6 H%0@;g` m H6Ɨt#==(++^ZZ
iH5k-ZYl͚5k PD`X"B#"t H6
s o2p1:t~
GCzz:L4i;sN{wt~:t `OtV7AhaodHR--ă9s,sO:CB&˯156`\DW$ɋj3l构Θ,ŋP$+܌>.XҴ
2ɉz -fTիl:3=YPP~;D u#4[,Zd{t4