From 3184ba8dbb3c5998dc2ee7dc0cc47b1972fffa30 Mon Sep 17 00:00:00 2001 From: Benjamin Gaidioz Date: Wed, 24 Apr 2024 09:23:29 +0200 Subject: [PATCH 01/25] Using Jinjava --- build.sbt | 17 +- deps/others/build.sbt | 8 +- jinja-sql-client/project/build.properties | 1 + .../src/main/java/module-info.java | 25 ++ .../raw.client.api.CompilerServiceBuilder | 1 + .../jinja/sql/JinjaSqlCompilerService.scala | 249 ++++++++++++++++++ .../sql/JinjaSqlCompilerServiceBuilder.scala | 24 ++ .../src/test/scala/PreprocessingTest.scala | 190 +++++++++++++ project/Dependencies.scala | 2 + .../creds/local/LocalCredentialsService.scala | 2 +- 10 files changed, 515 insertions(+), 4 deletions(-) create mode 100644 jinja-sql-client/project/build.properties create mode 100644 jinja-sql-client/src/main/java/module-info.java create mode 100644 jinja-sql-client/src/main/resources/META-INF/services/raw.client.api.CompilerServiceBuilder create mode 100644 jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerService.scala create mode 100644 jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerServiceBuilder.scala create mode 100644 jinja-sql-client/src/test/scala/PreprocessingTest.scala diff --git a/build.sbt b/build.sbt index 4151bcc77..24354edc5 100644 --- a/build.sbt +++ b/build.sbt @@ -38,7 +38,8 @@ lazy val root = (project in file(".")) snapiTruffle, snapiClient, sqlParser, - sqlClient + sqlClient, + jinjaSqlClient ) .settings( commonSettings, @@ -282,3 +283,17 @@ lazy val pythonClient = (project in file("python-client")) Compile / packageBin / packageOptions += Package.ManifestAttributes("Automatic-Module-Name" -> "raw.python.client"), libraryDependencies += "org.graalvm.polyglot" % "python" % "23.1.0" % Provided ) + +lazy val jinjaSqlClient = (project in file("jinja-sql-client")) + .dependsOn( + client % "compile->compile;test->test", + sqlClient % "compile->compile;test->test", + ) + .settings( + commonSettings, + missingInterpolatorCompileSettings, + testSettings, + libraryDependencies ++= Seq( + jinjava + ) + ) diff --git a/deps/others/build.sbt b/deps/others/build.sbt index 4b449c314..899ec7a2d 100644 --- a/deps/others/build.sbt +++ b/deps/others/build.sbt @@ -13,11 +13,14 @@ val jacksonModuleScala = "com.fasterxml.jackson.module" %% "jackson-module-scala val mysqlModule = "com.mysql" % "mysql-connector-j" % "8.1.0" +val jinjava = "com.hubspot.jinjava" % "jinjava" % "2.7.2" exclude("com.google.code.findbugs", "annotations") + libraryDependencies ++= Seq( jwtCore, scalaLogging, jacksonModuleScala, - mysqlModule + mysqlModule, + jinjava ) // Map of artifact ID to module name @@ -26,6 +29,7 @@ val moduleNames = Map( "scala-logging" -> "typesafe.scalalogging", "jackson-module-scala" -> "com.fasterxml.jackson.scala", "mysql-connector-j" -> "mysql.connector.j", + "jinjava" -> "jinjava" ) def updatePom(pomFile: File, newVersion: String): Unit = { @@ -157,4 +161,4 @@ createS3SyncScript := { // Notify that the task is completed println(s"Bash script created: $scriptFile") -} \ No newline at end of file +} diff --git a/jinja-sql-client/project/build.properties b/jinja-sql-client/project/build.properties new file mode 100644 index 000000000..49214c4bb --- /dev/null +++ b/jinja-sql-client/project/build.properties @@ -0,0 +1 @@ +sbt.version = 1.9.9 diff --git a/jinja-sql-client/src/main/java/module-info.java b/jinja-sql-client/src/main/java/module-info.java new file mode 100644 index 000000000..ea6d64b0a --- /dev/null +++ b/jinja-sql-client/src/main/java/module-info.java @@ -0,0 +1,25 @@ +/* + * Copyright 2024 RAW Labs S.A. + * + * Use of this software is governed by the Business Source License + * included in the file licenses/BSL.txt. + * + * As of the Change Date specified in that file, in accordance with + * the Business Source License, use of this software will be governed + * by the Apache License, Version 2.0, included in the file + * licenses/APL.txt. + */ + +module raw.client.jinja.sql { + requires scala.library; + requires raw.client; + requires raw.utils; + requires jinjava; + requires org.slf4j; + + opens raw.client.jinja.sql to + jinjava; + + provides raw.client.api.CompilerServiceBuilder with + raw.client.jinja.sql.JinjaSqlCompilerServiceBuilder; +} diff --git a/jinja-sql-client/src/main/resources/META-INF/services/raw.client.api.CompilerServiceBuilder b/jinja-sql-client/src/main/resources/META-INF/services/raw.client.api.CompilerServiceBuilder new file mode 100644 index 000000000..2c056f037 --- /dev/null +++ b/jinja-sql-client/src/main/resources/META-INF/services/raw.client.api.CompilerServiceBuilder @@ -0,0 +1 @@ +raw.client.jinja.sql.JinjaSqlCompilerServiceBuilder \ No newline at end of file diff --git a/jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerService.scala b/jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerService.scala new file mode 100644 index 000000000..10c73bba7 --- /dev/null +++ b/jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerService.scala @@ -0,0 +1,249 @@ +/* + * Copyright 2024 RAW Labs S.A. + * + * Use of this software is governed by the Business Source License + * included in the file licenses/BSL.txt. + * + * As of the Change Date specified in that file, in accordance with + * the Business Source License, use of this software will be governed + * by the Apache License, Version 2.0, included in the file + * licenses/APL.txt. + */ + +package raw.client.jinja.sql + +import com.hubspot.jinjava.interpret.TemplateError.{ErrorReason, ErrorType} +import com.hubspot.jinjava.interpret.{JinjavaInterpreter, TemplateError} +import com.hubspot.jinjava.lib.fn.ELFunctionDefinition +import com.hubspot.jinjava.lib.tag.Tag +import com.hubspot.jinjava.tree.TagNode +import com.hubspot.jinjava.{Jinjava, JinjavaConfig} +import raw.client.api._ +import raw.utils.RawSettings + +import java.util +import scala.collection.mutable + +class JinjaSqlCompilerService(maybeClassLoader: Option[ClassLoader] = None)( + implicit protected val settings: RawSettings +) extends CompilerService { + + private val sqlCompilerService = CompilerServiceProvider("sql", maybeClassLoader) + + def dotAutoComplete( + source: String, + environment: raw.client.api.ProgramEnvironment, + position: raw.client.api.Pos + ): raw.client.api.AutoCompleteResponse = AutoCompleteResponse(Array.empty) + + private val validationConfigBuilder = JinjavaConfig + .newBuilder() + .withValidationMode(true) + .withMaxOutputSize(10000) + .withFailOnUnknownTokens(false) + .withNestedInterpretationEnabled(false) + + private val validationConfig = validationConfigBuilder.build() + + private val executionConfig = validationConfigBuilder.withFailOnUnknownTokens(true).build() + + private val validateJinjava = new Jinjava(validationConfig) + private val executeJinjava = new Jinjava(executionConfig) + + private object FailFunc { + def doFail(): String = { + "doFail" + } + def dontFail(): String = { + "dontFail" + } + } + + private class RaiseTag(doRaise: Boolean) extends Tag { + + override def interpret(tagNode: TagNode, interpreter: JinjavaInterpreter): String = { + if (doRaise) { + val o = interpreter.resolveELExpression(tagNode.getHelpers, tagNode.getLineNumber, tagNode.getStartPosition) + val error = new TemplateError(ErrorType.FATAL, ErrorReason.EXCEPTION, o.asInstanceOf[String], null, 0, 0, null) + interpreter.addError(error) + } + s"<$getName>" + } + + override def getEndTagName: String = null + + override def getName: String = "raise" + } + + private class ParamTag() extends Tag { + + override def interpret(tagNode: TagNode, interpreter: JinjavaInterpreter): String = { + s"-- <$getName>" + } + + override def getEndTagName: String = null + + override def getName: String = "param" + } + + private class TypeTag() extends Tag { + + override def interpret(tagNode: TagNode, interpreter: JinjavaInterpreter): String = { + s"-- <$getName>" + } + + override def getEndTagName: String = null + + override def getName: String = "type" + } + + private class DefaultTag() extends Tag { + + override def interpret(tagNode: TagNode, interpreter: JinjavaInterpreter): String = { + s"-- <$getName>" + } + + override def getEndTagName: String = null + + override def getName: String = "default" + } + + private val doFail = new ELFunctionDefinition("raw", "fail", FailFunc.getClass, "doFail") + private val dontFail = new ELFunctionDefinition("raw", "fail", FailFunc.getClass, "dontFail") + + validateJinjava.getGlobalContext.registerFunction(dontFail) + executeJinjava.getGlobalContext.registerFunction(doFail) + + validateJinjava.getGlobalContext.registerTag(new RaiseTag(doRaise = false)) + executeJinjava.getGlobalContext.registerTag(new RaiseTag(doRaise = true)) + for (tag <- List(new ParamTag(), new DefaultTag(), new TypeTag())) { + validateJinjava.registerTag(tag) + executeJinjava.registerTag(tag) + } + + def execute( + source: String, + environment: raw.client.api.ProgramEnvironment, + maybeDecl: Option[String], + outputStream: java.io.OutputStream + ): raw.client.api.ExecutionResponse = { + logger.debug("execute") + val arguments = new util.HashMap[String, Object]() + environment.maybeArguments.foreach(_.foreach { case (k, v) => arguments.put(k, rawValueToString(v)) }) + val result = executeJinjava.renderForResult(source, arguments) + if (result.getErrors.isEmpty) { + val processed = result.getOutput + sqlCompilerService.execute(processed, environment, None, outputStream) + } else { + ExecutionValidationFailure(asMessages(result.getErrors)) + } + } + + private def rawValueToString(value: RawValue) = value match { + case RawString(v) => v + case _ => ??? + } + + def eval( + source: String, + tipe: raw.client.api.RawType, + environment: raw.client.api.ProgramEnvironment + ): raw.client.api.EvalResponse = ??? + + def aiValidate(source: String, environment: raw.client.api.ProgramEnvironment): raw.client.api.ValidateResponse = ??? + + def formatCode( + source: String, + environment: raw.client.api.ProgramEnvironment, + maybeIndent: Option[Int], + maybeWidth: Option[Int] + ): raw.client.api.FormatCodeResponse = FormatCodeResponse(None) + + def getProgramDescription( + source: String, + environment: raw.client.api.ProgramEnvironment + ): raw.client.api.GetProgramDescriptionResponse = { + val unknownVariables = mutable.Set.empty[String] + validateJinjava.getGlobalContext.setDynamicVariableResolver(v => { + unknownVariables.add(v); "" + }) + val result = validateJinjava.renderForResult(source, new java.util.HashMap) + if (result.hasErrors) { + GetProgramDescriptionFailure(asMessages(result.getErrors)) + } else { + GetProgramDescriptionSuccess( + ProgramDescription( + Map.empty, + Some( + DeclDescription( + Some( + unknownVariables.map(ParamDescription(_, Some(RawStringType(false, false)), None, None, true)).toVector + ), + Some(RawIterableType(RawAnyType(), false, false)), + None + ) + ), + None + ) + ) + } + } + + def goToDefinition( + source: String, + environment: raw.client.api.ProgramEnvironment, + position: raw.client.api.Pos + ): raw.client.api.GoToDefinitionResponse = GoToDefinitionResponse(None) + + def hover( + source: String, + environment: raw.client.api.ProgramEnvironment, + position: raw.client.api.Pos + ): raw.client.api.HoverResponse = HoverResponse(None) + + def rename( + source: String, + environment: raw.client.api.ProgramEnvironment, + position: raw.client.api.Pos + ): raw.client.api.RenameResponse = RenameResponse(Array.empty) + + def validate(source: String, environment: raw.client.api.ProgramEnvironment): ValidateResponse = { + val result = validateJinjava.renderForResult(source, new java.util.HashMap()) + val errors = asMessages(result.getErrors) + ValidateResponse(errors) + } + + private def asMessages(errors: util.List[TemplateError]): List[ErrorMessage] = { + val errorMessages = mutable.ArrayBuffer.empty[ErrorMessage] + errors.forEach { error => + val message = error.getMessage + val line = error.getLineno + val column = error.getStartPosition + val range = ErrorRange(ErrorPosition(line, column), ErrorPosition(line, column + 1)) + val errorMessage = ErrorMessage(message, List(range), "") + errorMessages += errorMessage + } + errorMessages.toList + + } + + def wordAutoComplete( + source: String, + environment: raw.client.api.ProgramEnvironment, + prefix: String, + position: raw.client.api.Pos + ): raw.client.api.AutoCompleteResponse = AutoCompleteResponse(Array.empty) + + // Members declared in raw.utils.RawService + + def doStop(): Unit = { + sqlCompilerService.stop() + } + + def build(maybeClassLoader: Option[ClassLoader])( + implicit settings: raw.utils.RawSettings + ): raw.client.api.CompilerService = ??? + + def language: Set[String] = Set("jinja-sql") + +} diff --git a/jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerServiceBuilder.scala b/jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerServiceBuilder.scala new file mode 100644 index 000000000..13db731de --- /dev/null +++ b/jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerServiceBuilder.scala @@ -0,0 +1,24 @@ +/* + * Copyright 2024 RAW Labs S.A. + * + * Use of this software is governed by the Business Source License + * included in the file licenses/BSL.txt. + * + * As of the Change Date specified in that file, in accordance with + * the Business Source License, use of this software will be governed + * by the Apache License, Version 2.0, included in the file + * licenses/APL.txt. + */ + +package raw.client.jinja.sql + +import raw.client.api.{CompilerService, CompilerServiceBuilder} +import raw.utils.RawSettings + +class JinjaSqlCompilerServiceBuilder extends CompilerServiceBuilder { + override def language: Set[String] = Set("jinja-sql") + + override def build(maybeClassLoader: Option[ClassLoader])(implicit settings: RawSettings): CompilerService = + new JinjaSqlCompilerService(maybeClassLoader) + +} diff --git a/jinja-sql-client/src/test/scala/PreprocessingTest.scala b/jinja-sql-client/src/test/scala/PreprocessingTest.scala new file mode 100644 index 000000000..24e818c20 --- /dev/null +++ b/jinja-sql-client/src/test/scala/PreprocessingTest.scala @@ -0,0 +1,190 @@ +/* + * Copyright 2024 RAW Labs S.A. + * + * Use of this software is governed by the Business Source License + * included in the file licenses/BSL.txt. + * + * As of the Change Date specified in that file, in accordance with + * the Business Source License, use of this software will be governed + * by the Apache License, Version 2.0, included in the file + * licenses/APL.txt. + */ + +import raw.client.api.{CompilerService, ExecutionSuccess, ProgramEnvironment, RawString, RawValue} +import raw.client.jinja.sql.JinjaSqlCompilerService +import raw.creds.api.CredentialsTestContext +import raw.creds.local.LocalCredentialsTestContext +import raw.utils.{InteractiveUser, RawTestSuite, SettingsTestContext, TrainingWheelsContext, Uid} + +import java.io.ByteArrayOutputStream + +class PreprocessingTest + extends RawTestSuite + with SettingsTestContext + with TrainingWheelsContext + with CredentialsTestContext + with LocalCredentialsTestContext { + + private val database = sys.env.getOrElse("FDW_DATABASE", "unittest") + private val hostname = sys.env.getOrElse("FDW_HOSTNAME", "localhost") + private val port = sys.env.getOrElse("FDW_HOSTNAME", "5432") + private val username = sys.env.getOrElse("FDW_USERNAME", "postgres") + private val password = sys.env.getOrElse("FDW_PASSWORD", "1234") + + property("raw.creds.jdbc.fdw.host", hostname) + property("raw.creds.jdbc.fdw.port", port) + property("raw.creds.jdbc.fdw.user", username) + property("raw.creds.jdbc.fdw.password", password) + + ignore("""SELECT {{ key }}, + | COUNT(*), + | SUM({% raise "error, unknown key: " + key %}) + |FROM example.airports + |GROUP BY {{ key }} + |""".stripMargin) { q => + val v = compilerService.validate(q.q, asJson()) + assert(v != null) + val baos = new ByteArrayOutputStream() + val r = compilerService.execute(q.q, asJson(Map("key" -> RawString("city"))), None, baos) + assert(r == ExecutionSuccess) + } + + ignore("""SELECT {{ key }}, + | COUNT(*), + | SUM({{ raw:fail() }}) + |FROM example.airports + |GROUP BY {{ key }} + |""".stripMargin) { q => + val v = compilerService.validate(q.q, asJson()) + assert(v != null) + val baos = new ByteArrayOutputStream() + val r = compilerService.execute(q.q, asJson(Map("key" -> RawString("city"))), None, baos) + assert(r == ExecutionSuccess) + } + + test("""SELECT {{ 1 - 2 }} + |""".stripMargin) { q => + val v = compilerService.getProgramDescription(q.q, asJson()) + assert(v != null) + val baos = new ByteArrayOutputStream() + val r = compilerService.execute(q.q, asJson(), None, baos) + assert(r == ExecutionSuccess) + } + + test("""SELECT {{ 1 +> 2 }} + |""".stripMargin) { q => + val v = compilerService.validate(q.q, asJson()) + assert(v != null) + val baos = new ByteArrayOutputStream() + val r = compilerService.execute(q.q, asJson(), None, baos) + assert(r == ExecutionSuccess) + } + + test("""{% include '/etc/passwd' %} """.stripMargin) { q => + val v = compilerService.validate(q.q, asJson()) + assert(v != null) + } + + test(s""" + |{% set v = val == "latitude" ? "latitude" : "longitude" %} + |SELECT {{ key }}, MAX({{ v }}), MIN({{ v }}) + |FROM example.airports GROUP BY {{ key }} + |ORDER BY COUNT(*) {{ order }} + |LIMIT 3 + |""".stripMargin) { q => + val g = compilerService.getProgramDescription(q.q, asJson()) + assert(g != null) + val baos = new ByteArrayOutputStream() + val r = compilerService.execute( + q.q, + asJson(Map("key" -> RawString("country"), "val" -> RawString("latitude"), "order" -> RawString("DESC"))), + None, + baos + ) + assert(r == ExecutionSuccess) + assert(baos.toString == "") + + } + + test(s""" + |SELECT {{key}}, + | COUNT(*), + | SUM( + | {%if sumRow == "Quantity" %} quantity + | {%elif sumRow == "NetAmount" %} netamount + | {%else %} {% raise "unknown sum: " + sumRow %} + | {%endif %} + | ) + | {% if moreColumns == true } , MAX(latitude) {% endif %} + |FROM lokad_orders + |GROUP BY + | {%if key == "year" %} YEAR(date) + | {%elif key == "month" %} MONTH(date) + | {%elif key == "Quantity" %} quantity + | {%elif key == "Currency" %} currency + | {%else %} {% raise "unknown key:" + key %} + | {%endif %} AS {{key}} + |""".stripMargin) { q => + val v = compilerService.validate(q.q, asJson()) + assert(v != null) + } + + test("SELECT airport_id, {{ c }} FROM {{ }} ") { q => + val v = compilerService.validate(q.q, asJson()) + assert(v != null) + } + + test("SELECT airport_id, {{ colName }} FROM {{ table }}") { q => + val v = compilerService.validate(q.q, asJson()) + assert(v != null) + val d = compilerService.getProgramDescription(q.q, asJson()) + assert(d != null) + val baos = new ByteArrayOutputStream() + val r = compilerService.execute( + q.q, + asJson(Map("colName" -> RawString("city"), "table" -> RawString("example.airports"))), + None, + baos + ) + assert(r == ExecutionSuccess) + } + + test("SELECT airport_id, {{ colNames }} FROM {{ table }}") { q => + val baos = new ByteArrayOutputStream() + val r = compilerService.execute( + q.q, + asJson(Map("colNames" -> RawString("city, country"), "table" -> RawString("example.airports"))), + None, + baos + ) + assert(r == ExecutionSuccess) + } + + test("SELECT * FROM example.airports") { q => + val baos = new ByteArrayOutputStream() + val r = compilerService.execute(q.q, asJson(), None, baos) + assert(r == ExecutionSuccess) + } + + private var compilerService: CompilerService = _ + + private val user = InteractiveUser(Uid(database), "fdw user", "email", Seq.empty) + + private def asJson(params: Map[String, RawValue] = Map.empty): ProgramEnvironment = { + if (params.isEmpty) ProgramEnvironment(user, None, Set.empty, Map("output-format" -> "json")) + else ProgramEnvironment(user, Some(params.toArray), Set.empty, Map("output-format" -> "json")) + } + + override def beforeAll(): Unit = { + super.beforeAll() + compilerService = new JinjaSqlCompilerService(None) + } + + override def afterAll(): Unit = { + if (compilerService != null) { + compilerService.stop() + compilerService = null + } + } + +} diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 485cfeb06..dc090cbdc 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -90,4 +90,6 @@ object Dependencies { // from sql-client val hikariCP = "com.zaxxer" % "HikariCP" % "5.1.0" + + val jinjava = "com.hubspot.jinjava" % "jinjava" % "2.7.2-rawlabs" exclude("com.google.code.findbugs", "annotations") } diff --git a/snapi-frontend/src/main/scala/raw/creds/local/LocalCredentialsService.scala b/snapi-frontend/src/main/scala/raw/creds/local/LocalCredentialsService.scala index fee6e5add..36e8fd08f 100644 --- a/snapi-frontend/src/main/scala/raw/creds/local/LocalCredentialsService.scala +++ b/snapi-frontend/src/main/scala/raw/creds/local/LocalCredentialsService.scala @@ -146,7 +146,7 @@ class LocalCredentialsService extends CredentialsService { } override def getUserDb(user: AuthenticatedUser): String = { - "default-user-db" + "unittest" } override def doStop(): Unit = {} From adbbdb076de8b7a8a1ebc62e83039de1ab43ee5c Mon Sep 17 00:00:00 2001 From: Benjamin Gaidioz Date: Thu, 2 May 2024 10:41:25 +0200 Subject: [PATCH 02/25] wip --- build.sbt | 4 +- deps/others/build.sbt | 6 +- .../src/main/java/module-info.java | 4 - .../src/main/resources/python/rawjinja.py | 20 ++ .../jinja/sql/JinjaSqlCompilerService.scala | 268 ++++++++---------- .../src/test/scala/PreprocessingTest.scala | 48 +++- project/Dependencies.scala | 2 - 7 files changed, 189 insertions(+), 163 deletions(-) create mode 100644 jinja-sql-client/src/main/resources/python/rawjinja.py diff --git a/build.sbt b/build.sbt index 24354edc5..3c665d8fb 100644 --- a/build.sbt +++ b/build.sbt @@ -293,7 +293,5 @@ lazy val jinjaSqlClient = (project in file("jinja-sql-client")) commonSettings, missingInterpolatorCompileSettings, testSettings, - libraryDependencies ++= Seq( - jinjava - ) + libraryDependencies += "org.graalvm.polyglot" % "python" % "23.1.0" % Provided ) diff --git a/deps/others/build.sbt b/deps/others/build.sbt index 899ec7a2d..e38472615 100644 --- a/deps/others/build.sbt +++ b/deps/others/build.sbt @@ -13,14 +13,11 @@ val jacksonModuleScala = "com.fasterxml.jackson.module" %% "jackson-module-scala val mysqlModule = "com.mysql" % "mysql-connector-j" % "8.1.0" -val jinjava = "com.hubspot.jinjava" % "jinjava" % "2.7.2" exclude("com.google.code.findbugs", "annotations") - libraryDependencies ++= Seq( jwtCore, scalaLogging, jacksonModuleScala, - mysqlModule, - jinjava + mysqlModule ) // Map of artifact ID to module name @@ -29,7 +26,6 @@ val moduleNames = Map( "scala-logging" -> "typesafe.scalalogging", "jackson-module-scala" -> "com.fasterxml.jackson.scala", "mysql-connector-j" -> "mysql.connector.j", - "jinjava" -> "jinjava" ) def updatePom(pomFile: File, newVersion: String): Unit = { diff --git a/jinja-sql-client/src/main/java/module-info.java b/jinja-sql-client/src/main/java/module-info.java index ea6d64b0a..7764f090f 100644 --- a/jinja-sql-client/src/main/java/module-info.java +++ b/jinja-sql-client/src/main/java/module-info.java @@ -14,12 +14,8 @@ requires scala.library; requires raw.client; requires raw.utils; - requires jinjava; requires org.slf4j; - opens raw.client.jinja.sql to - jinjava; - provides raw.client.api.CompilerServiceBuilder with raw.client.jinja.sql.JinjaSqlCompilerServiceBuilder; } diff --git a/jinja-sql-client/src/main/resources/python/rawjinja.py b/jinja-sql-client/src/main/resources/python/rawjinja.py new file mode 100644 index 000000000..e98f564bf --- /dev/null +++ b/jinja-sql-client/src/main/resources/python/rawjinja.py @@ -0,0 +1,20 @@ +from jinja2 import Environment, meta + +class RawJinjaException(Exception): + + def __init__(self, message): + self._message = message + + def message(self): + return self._message + +env = Environment() + +def apply(code, args): + template = env.from_string(code) + d = dict([(key, args.get(key)) for key in args.keySet()]) + return template.render(d) + +def validate(code): + tree = env.parse(code) + return list(meta.find_undeclared_variables(tree)) diff --git a/jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerService.scala b/jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerService.scala index 10c73bba7..bf5d0b018 100644 --- a/jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerService.scala +++ b/jinja-sql-client/src/main/scala/raw/client/jinja/sql/JinjaSqlCompilerService.scala @@ -12,136 +12,79 @@ package raw.client.jinja.sql -import com.hubspot.jinjava.interpret.TemplateError.{ErrorReason, ErrorType} -import com.hubspot.jinjava.interpret.{JinjavaInterpreter, TemplateError} -import com.hubspot.jinjava.lib.fn.ELFunctionDefinition -import com.hubspot.jinjava.lib.tag.Tag -import com.hubspot.jinjava.tree.TagNode -import com.hubspot.jinjava.{Jinjava, JinjavaConfig} +import org.graalvm.polyglot.{Context, PolyglotAccess, PolyglotException, Source} import raw.client.api._ import raw.utils.RawSettings -import java.util -import scala.collection.mutable - class JinjaSqlCompilerService(maybeClassLoader: Option[ClassLoader] = None)( implicit protected val settings: RawSettings ) extends CompilerService { + private val JINJA_ERROR = "jinjaError" + + private val (engine, _) = CompilerService.getEngine private val sqlCompilerService = CompilerServiceProvider("sql", maybeClassLoader) + private val pythonCtx = Context + .newBuilder("python") + .engine(engine) + // .environment("RAW_SETTINGS", settings.renderAsString) + // .environment("RAW_USER", environment.user.uid.toString) + // .environment("RAW_TRACE_ID", environment.user.uid.toString) + // .environment("RAW_SCOPES", environment.scopes.mkString(",")) + .allowExperimentalOptions(true) + .allowPolyglotAccess(PolyglotAccess.ALL) + // setting false will deny all privileges unless configured below + .allowAllAccess(true) + // choose the backend for the POSIX module + .option("python.PosixModuleBackend", "java") + // equivalent to the Python -B flag + .option("python.DontWriteBytecodeFlag", "true") + // equivalent to the Python -v flag + // .option("python.VerboseFlag", "true") + // log level + // .option("log.python.level", "FINE") + // print Python exceptions directly + .option("python.AlwaysRunExcepthook", "true") + // TODO??? + .option("python.ForceImportSite", "true") // otherwise jinja2 isn't found/*/**/*/ + .option("python.Executable", getClass.getClassLoader.getResource("venv/bin/python").getPath) + .build() + + private val helper = getClass.getClassLoader.getResource("python/rawjinja.py") + private val bindings = { + val truffleSource = Source.newBuilder("python", helper).build() + pythonCtx.eval(truffleSource) + pythonCtx.getBindings("python") + } + private val apply = bindings.getMember("apply") + private val validate = bindings.getMember("validate") + def dotAutoComplete( source: String, environment: raw.client.api.ProgramEnvironment, position: raw.client.api.Pos ): raw.client.api.AutoCompleteResponse = AutoCompleteResponse(Array.empty) - private val validationConfigBuilder = JinjavaConfig - .newBuilder() - .withValidationMode(true) - .withMaxOutputSize(10000) - .withFailOnUnknownTokens(false) - .withNestedInterpretationEnabled(false) - - private val validationConfig = validationConfigBuilder.build() - - private val executionConfig = validationConfigBuilder.withFailOnUnknownTokens(true).build() - - private val validateJinjava = new Jinjava(validationConfig) - private val executeJinjava = new Jinjava(executionConfig) - - private object FailFunc { - def doFail(): String = { - "doFail" - } - def dontFail(): String = { - "dontFail" - } - } - - private class RaiseTag(doRaise: Boolean) extends Tag { - - override def interpret(tagNode: TagNode, interpreter: JinjavaInterpreter): String = { - if (doRaise) { - val o = interpreter.resolveELExpression(tagNode.getHelpers, tagNode.getLineNumber, tagNode.getStartPosition) - val error = new TemplateError(ErrorType.FATAL, ErrorReason.EXCEPTION, o.asInstanceOf[String], null, 0, 0, null) - interpreter.addError(error) - } - s"<$getName>" - } - - override def getEndTagName: String = null - - override def getName: String = "raise" - } - - private class ParamTag() extends Tag { - - override def interpret(tagNode: TagNode, interpreter: JinjavaInterpreter): String = { - s"-- <$getName>" - } - - override def getEndTagName: String = null - - override def getName: String = "param" - } - - private class TypeTag() extends Tag { - - override def interpret(tagNode: TagNode, interpreter: JinjavaInterpreter): String = { - s"-- <$getName>" - } - - override def getEndTagName: String = null - - override def getName: String = "type" - } - - private class DefaultTag() extends Tag { - - override def interpret(tagNode: TagNode, interpreter: JinjavaInterpreter): String = { - s"-- <$getName>" - } - - override def getEndTagName: String = null - - override def getName: String = "default" - } - - private val doFail = new ELFunctionDefinition("raw", "fail", FailFunc.getClass, "doFail") - private val dontFail = new ELFunctionDefinition("raw", "fail", FailFunc.getClass, "dontFail") - - validateJinjava.getGlobalContext.registerFunction(dontFail) - executeJinjava.getGlobalContext.registerFunction(doFail) - - validateJinjava.getGlobalContext.registerTag(new RaiseTag(doRaise = false)) - executeJinjava.getGlobalContext.registerTag(new RaiseTag(doRaise = true)) - for (tag <- List(new ParamTag(), new DefaultTag(), new TypeTag())) { - validateJinjava.registerTag(tag) - executeJinjava.registerTag(tag) - } - def execute( source: String, environment: raw.client.api.ProgramEnvironment, maybeDecl: Option[String], outputStream: java.io.OutputStream ): raw.client.api.ExecutionResponse = { - logger.debug("execute") - val arguments = new util.HashMap[String, Object]() - environment.maybeArguments.foreach(_.foreach { case (k, v) => arguments.put(k, rawValueToString(v)) }) - val result = executeJinjava.renderForResult(source, arguments) - if (result.getErrors.isEmpty) { - val processed = result.getOutput - sqlCompilerService.execute(processed, environment, None, outputStream) - } else { - ExecutionValidationFailure(asMessages(result.getErrors)) - } - } - - private def rawValueToString(value: RawValue) = value match { - case RawString(v) => v - case _ => ??? + val args = new java.util.HashMap[String, String] + for (userArgs <- environment.maybeArguments.toArray; (key, RawString(v)) <- userArgs) args.put(key, v) + val sqlQuery: String = + try { + apply.execute(pythonCtx.asValue(source), pythonCtx.asValue(args)).asString + } catch { + case ex: PolyglotException => handlePolyglotException(ex, source, environment) match { + case Some(errorMessage) => return ExecutionValidationFailure(List(errorMessage)) + case None => throw new CompilerServiceException(ex, environment) + } + } + logger.debug(sqlQuery) + sqlCompilerService.execute(sqlQuery, environment, None, outputStream) } def eval( @@ -163,30 +106,30 @@ class JinjaSqlCompilerService(maybeClassLoader: Option[ClassLoader] = None)( source: String, environment: raw.client.api.ProgramEnvironment ): raw.client.api.GetProgramDescriptionResponse = { - val unknownVariables = mutable.Set.empty[String] - validateJinjava.getGlobalContext.setDynamicVariableResolver(v => { - unknownVariables.add(v); "" - }) - val result = validateJinjava.renderForResult(source, new java.util.HashMap) - if (result.hasErrors) { - GetProgramDescriptionFailure(asMessages(result.getErrors)) - } else { - GetProgramDescriptionSuccess( - ProgramDescription( - Map.empty, - Some( - DeclDescription( - Some( - unknownVariables.map(ParamDescription(_, Some(RawStringType(false, false)), None, None, true)).toVector - ), - Some(RawIterableType(RawAnyType(), false, false)), - None - ) - ), - None - ) - ) + val unknownArgs = { + try { + validate.execute(pythonCtx.asValue(source)) + } catch { + case ex: PolyglotException => handlePolyglotException(ex, source, environment) match { + case Some(errorMessage) => return GetProgramDescriptionFailure(List(errorMessage)) + case None => throw new CompilerServiceException(ex, environment) + } + } } + assert(unknownArgs.hasArrayElements) + + val args = (0L until unknownArgs.getArraySize) + .map(unknownArgs.getArrayElement) + .map(_.asString) + .toVector + .map(s => ParamDescription(s, Some(RawStringType(false, false)), None, None, true)) + GetProgramDescriptionSuccess( + ProgramDescription( + Map.empty, + Some(DeclDescription(Some(args), Some(RawIterableType(RawAnyType(), false, false)), None)), + None + ) + ) } def goToDefinition( @@ -208,23 +151,17 @@ class JinjaSqlCompilerService(maybeClassLoader: Option[ClassLoader] = None)( ): raw.client.api.RenameResponse = RenameResponse(Array.empty) def validate(source: String, environment: raw.client.api.ProgramEnvironment): ValidateResponse = { - val result = validateJinjava.renderForResult(source, new java.util.HashMap()) - val errors = asMessages(result.getErrors) - ValidateResponse(errors) - } - - private def asMessages(errors: util.List[TemplateError]): List[ErrorMessage] = { - val errorMessages = mutable.ArrayBuffer.empty[ErrorMessage] - errors.forEach { error => - val message = error.getMessage - val line = error.getLineno - val column = error.getStartPosition - val range = ErrorRange(ErrorPosition(line, column), ErrorPosition(line, column + 1)) - val errorMessage = ErrorMessage(message, List(range), "") - errorMessages += errorMessage + { + try { + validate.execute(pythonCtx.asValue(source)) + } catch { + case ex: PolyglotException => handlePolyglotException(ex, source, environment) match { + case Some(errorMessage) => return ValidateResponse(List(errorMessage)) + case None => throw new CompilerServiceException(ex, environment) + } + } } - errorMessages.toList - + ValidateResponse(List.empty) } def wordAutoComplete( @@ -240,6 +177,41 @@ class JinjaSqlCompilerService(maybeClassLoader: Option[ClassLoader] = None)( sqlCompilerService.stop() } + private def handlePolyglotException( + ex: PolyglotException, + source: String, + environment: raw.client.api.ProgramEnvironment + ): Option[ErrorMessage] = { + if (ex.isInterrupted || ex.getMessage.startsWith("java.lang.InterruptedException")) { + throw new InterruptedException() + } else if (ex.getCause.isInstanceOf[InterruptedException]) { + throw ex.getCause + } else if (ex.isGuestException && !ex.isInternalError) { + val guestObject = ex.getGuestObject + val isException = guestObject.isException + assert(isException, s"$guestObject not an Exception!") + val exceptionClass = guestObject.getMetaObject.getMetaSimpleName + exceptionClass match { + case "TemplateSyntaxError" => + val lineno = guestObject.getMember("lineno").asInt() + val message = guestObject.getMember("message").asString() + val location = ErrorPosition(lineno, 1) + val endLocation = ErrorPosition(lineno, source.split('\n')(lineno - 1).length) + val range = ErrorRange(location, endLocation) + Some(ErrorMessage(message, List(range), JINJA_ERROR)) + case "TemplateRuntimeError" => + val message = guestObject.getMember("message").asString() + Some(ErrorMessage(message, List.empty, JINJA_ERROR)) + case "UndefinedError" => + val message = guestObject.getMember("message").asString() + Some(ErrorMessage(message, List.empty, JINJA_ERROR)) + case _ => throw new CompilerServiceException(ex, environment) + } + } else { + throw ex + } + } + def build(maybeClassLoader: Option[ClassLoader])( implicit settings: raw.utils.RawSettings ): raw.client.api.CompilerService = ??? diff --git a/jinja-sql-client/src/test/scala/PreprocessingTest.scala b/jinja-sql-client/src/test/scala/PreprocessingTest.scala index 24e818c20..92eb12802 100644 --- a/jinja-sql-client/src/test/scala/PreprocessingTest.scala +++ b/jinja-sql-client/src/test/scala/PreprocessingTest.scala @@ -71,6 +71,18 @@ class PreprocessingTest assert(r == ExecutionSuccess) } + test("""SELECT {{ a }} + {{ b }} + |""".stripMargin) { q => + val v = compilerService.getProgramDescription(q.q, asJson()) + assert(v != null) + } + + test("""SELECT {{ a + 1 - b }} + |""".stripMargin) { q => + val v = compilerService.getProgramDescription(q.q, asJson()) + assert(v != null) + } + test("""SELECT {{ 1 +> 2 }} |""".stripMargin) { q => val v = compilerService.validate(q.q, asJson()) @@ -102,7 +114,26 @@ class PreprocessingTest baos ) assert(r == ExecutionSuccess) - assert(baos.toString == "") + + } + + test(s""" + |{% set v = "latitude" if val == "latitude" else "longitude" %} + |SELECT {{ key }}, MAX({{ v }}), MIN({{ v }}) + |FROM example.airports GROUP BY {{ key }} + |ORDER BY COUNT(*) {{ order }} + |LIMIT 3 + |""".stripMargin) { q => + val g = compilerService.getProgramDescription(q.q, asJson()) + assert(g != null) + val baos = new ByteArrayOutputStream() + val r = compilerService.execute( + q.q, + asJson(Map("key" -> RawString("country"), "val" -> RawString("latitude"), "order" -> RawString("DESC"))), + None, + baos + ) + assert(r == ExecutionSuccess) } @@ -158,6 +189,7 @@ class PreprocessingTest baos ) assert(r == ExecutionSuccess) + assert(baos.toString() == "") } test("SELECT * FROM example.airports") { q => @@ -166,6 +198,20 @@ class PreprocessingTest assert(r == ExecutionSuccess) } + // a typo + test("SELECT '{{ name }'") { q => + val baos = new ByteArrayOutputStream() + val r = compilerService.execute(q.q, asJson(), None, baos) + assert(r == ExecutionSuccess) + } + + test("SELECT '{{ 12 + name }}'") { q => + val baos = new ByteArrayOutputStream() + val r = compilerService.execute(q.q, asJson(), None, baos) + assert(r == ExecutionSuccess) + } + + private var compilerService: CompilerService = _ private val user = InteractiveUser(Uid(database), "fdw user", "email", Seq.empty) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index dc090cbdc..485cfeb06 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -90,6 +90,4 @@ object Dependencies { // from sql-client val hikariCP = "com.zaxxer" % "HikariCP" % "5.1.0" - - val jinjava = "com.hubspot.jinjava" % "jinjava" % "2.7.2-rawlabs" exclude("com.google.code.findbugs", "annotations") } From ee26cee123518dd507bb54995e84f5f11d02ff5d Mon Sep 17 00:00:00 2001 From: Benjamin Gaidioz Date: Fri, 3 May 2024 11:31:40 +0200 Subject: [PATCH 03/25] wip_boots --- build.sbt | 2 +- .../raw/client/api/CompilerService.scala | 6 +- .../src/main/java/module-info.java | 1 + .../src/main/resources/python/rawjinja.py | 2 +- .../src/main/resources/venv/bin/Activate.ps1 | 247 + .../src/main/resources/venv/bin/activate | 69 + .../src/main/resources/venv/bin/activate.csh | 26 + .../src/main/resources/venv/bin/activate.fish | 66 + .../src/main/resources/venv/bin/graalpy | 1 + .../src/main/resources/venv/bin/pip | 8 + .../src/main/resources/venv/bin/pip3 | 8 + .../src/main/resources/venv/bin/pip3.10 | 8 + .../src/main/resources/venv/bin/python | 1 + .../src/main/resources/venv/bin/python3 | 1 + .../src/main/resources/venv/bin/python3.10 | 1 + .../Jinja2-3.1.3.dist-info/INSTALLER | 1 + .../Jinja2-3.1.3.dist-info/LICENSE.rst | 28 + .../Jinja2-3.1.3.dist-info/METADATA | 105 + .../Jinja2-3.1.3.dist-info/RECORD | 59 + .../Jinja2-3.1.3.dist-info/REQUESTED | 0 .../Jinja2-3.1.3.dist-info/WHEEL | 5 + .../Jinja2-3.1.3.dist-info/entry_points.txt | 2 + .../Jinja2-3.1.3.dist-info/top_level.txt | 1 + .../MarkupSafe-2.1.5-py3.10.egg-info/PKG-INFO | 94 + .../SOURCES.txt | 35 + .../dependency_links.txt | 1 + .../installed-files.txt | 11 + .../top_level.txt | 1 + .../site-packages/_distutils_hack/__init__.py | 226 + .../site-packages/_distutils_hack/override.py | 1 + .../site-packages/distutils-precedence.pth | 1 + .../site-packages/jinja2/__init__.py | 37 + .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 84 + .../site-packages/jinja2/bccache.py | 406 + .../site-packages/jinja2/compiler.py | 1956 ++++ .../site-packages/jinja2/constants.py | 20 + .../python3.10/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1667 ++++ .../site-packages/jinja2/exceptions.py | 166 + .../python3.10/site-packages/jinja2/ext.py | 869 ++ .../site-packages/jinja2/filters.py | 1854 ++++ .../site-packages/jinja2/idtracking.py | 318 + .../python3.10/site-packages/jinja2/lexer.py | 866 ++ .../site-packages/jinja2/loaders.py | 661 ++ .../python3.10/site-packages/jinja2/meta.py | 111 + .../site-packages/jinja2/nativetypes.py | 130 + .../python3.10/site-packages/jinja2/nodes.py | 1204 +++ .../site-packages/jinja2/optimizer.py | 47 + .../python3.10/site-packages/jinja2/parser.py | 1034 ++ .../python3.10/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1051 ++ .../site-packages/jinja2/sandbox.py | 428 + .../python3.10/site-packages/jinja2/tests.py | 255 + .../python3.10/site-packages/jinja2/utils.py | 755 ++ .../site-packages/jinja2/visitor.py | 92 + .../site-packages/markupsafe/__init__.py | 332 + .../site-packages/markupsafe/_native.py | 63 + .../site-packages/markupsafe/_speedups.c | 320 + .../site-packages/markupsafe/_speedups.pyi | 9 + .../site-packages/markupsafe/py.typed | 0 .../pip-22.2.2.dist-info/INSTALLER | 1 + .../pip-22.2.2.dist-info/LICENSE.txt | 20 + .../pip-22.2.2.dist-info/METADATA | 90 + .../site-packages/pip-22.2.2.dist-info/RECORD | 995 ++ .../pip-22.2.2.dist-info/REQUESTED | 0 .../site-packages/pip-22.2.2.dist-info/WHEEL | 5 + .../pip-22.2.2.dist-info/entry_points.txt | 4 + .../pip-22.2.2.dist-info/top_level.txt | 1 + .../site-packages/pip/.graalpy_bundled | 1 + .../python3.10/site-packages/pip/__init__.py | 16 + .../python3.10/site-packages/pip/__main__.py | 31 + .../site-packages/pip/__pip-runner__.py | 36 + .../site-packages/pip/_internal/__init__.py | 19 + .../site-packages/pip/_internal/build_env.py | 290 + .../site-packages/pip/_internal/cache.py | 289 + .../pip/_internal/cli/__init__.py | 4 + .../pip/_internal/cli/autocompletion.py | 171 + .../pip/_internal/cli/base_command.py | 223 + .../pip/_internal/cli/cmdoptions.py | 1062 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 70 + .../pip/_internal/cli/main_parser.py | 87 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 502 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../pip/_internal/commands/cache.py | 223 + .../pip/_internal/commands/check.py | 53 + .../pip/_internal/commands/completion.py | 126 + .../pip/_internal/commands/configuration.py | 276 + .../pip/_internal/commands/debug.py | 199 + .../pip/_internal/commands/download.py | 142 + .../pip/_internal/commands/freeze.py | 97 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 138 + .../pip/_internal/commands/inspect.py | 97 + .../pip/_internal/commands/install.py | 827 ++ .../pip/_internal/commands/list.py | 360 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 183 + .../pip/_internal/commands/uninstall.py | 106 + .../pip/_internal/commands/wheel.py | 178 + .../pip/_internal/configuration.py | 374 + .../pip/_internal/distributions/__init__.py | 21 + .../pip/_internal/distributions/base.py | 39 + .../pip/_internal/distributions/installed.py | 23 + .../pip/_internal/distributions/sdist.py | 150 + .../pip/_internal/distributions/wheel.py | 34 + .../site-packages/pip/_internal/exceptions.py | 658 ++ .../pip/_internal/index/__init__.py | 2 + .../pip/_internal/index/collector.py | 621 ++ .../pip/_internal/index/package_finder.py | 1030 ++ .../pip/_internal/index/sources.py | 224 + .../pip/_internal/locations/__init__.py | 528 + .../pip/_internal/locations/_distutils.py | 180 + .../pip/_internal/locations/_sysconfig.py | 218 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 105 + .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 670 ++ .../_internal/metadata/importlib/__init__.py | 4 + .../_internal/metadata/importlib/_compat.py | 43 + .../_internal/metadata/importlib/_dists.py | 206 + .../pip/_internal/metadata/importlib/_envs.py | 180 + .../pip/_internal/metadata/pkg_resources.py | 253 + .../pip/_internal/models/__init__.py | 2 + .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 212 + .../pip/_internal/models/format_control.py | 80 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 53 + .../pip/_internal/models/link.py | 314 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 129 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../pip/_internal/network/auth.py | 323 + .../pip/_internal/network/cache.py | 69 + .../pip/_internal/network/download.py | 187 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 518 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 60 + .../pip/_internal/operations/__init__.py | 0 .../_internal/operations/build/__init__.py | 0 .../operations/build/build_tracker.py | 124 + .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 149 + .../pip/_internal/operations/freeze.py | 254 + .../_internal/operations/install/__init__.py | 2 + .../operations/install/editable_legacy.py | 47 + .../_internal/operations/install/legacy.py | 120 + .../pip/_internal/operations/install/wheel.py | 739 ++ .../pip/_internal/operations/prepare.py | 614 ++ .../site-packages/pip/_internal/pyproject.py | 175 + .../pip/_internal/req/__init__.py | 94 + .../pip/_internal/req/constructors.py | 501 + .../pip/_internal/req/req_file.py | 540 ++ .../pip/_internal/req/req_install.py | 879 ++ .../pip/_internal/req/req_set.py | 82 + .../pip/_internal/req/req_uninstall.py | 640 ++ .../pip/_internal/resolution/__init__.py | 0 .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/resolver.py | 600 ++ .../resolution/resolvelib/__init__.py | 0 .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 556 ++ .../resolution/resolvelib/factory.py | 731 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 248 + .../resolution/resolvelib/reporter.py | 68 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 296 + .../pip/_internal/self_outdated_check.py | 239 + .../pip/_internal/utils/__init__.py | 0 .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/distutils_args.py | 43 + .../pip/_internal/utils/egg_link.py | 75 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 79 + .../pip/_internal/utils/filesystem.py | 153 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/graalpy.py | 194 + .../pip/_internal/utils/hashes.py | 144 + .../_internal/utils/inject_securetransport.py | 35 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 723 ++ .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 195 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 246 + .../pip/_internal/utils/unpacking.py | 259 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 136 + .../pip/_internal/vcs/__init__.py | 15 + .../site-packages/pip/_internal/vcs/bazaar.py | 101 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 ++ .../pip/_internal/wheel_builder.py | 383 + .../site-packages/pip/_vendor/__init__.py | 120 + .../pip/_vendor/cachecontrol/__init__.py | 18 + .../pip/_vendor/cachecontrol/_cmd.py | 61 + .../pip/_vendor/cachecontrol/adapter.py | 137 + .../pip/_vendor/cachecontrol/cache.py | 65 + .../_vendor/cachecontrol/caches/__init__.py | 9 + .../_vendor/cachecontrol/caches/file_cache.py | 188 + .../cachecontrol/caches/redis_cache.py | 39 + .../pip/_vendor/cachecontrol/compat.py | 32 + .../pip/_vendor/cachecontrol/controller.py | 439 + .../pip/_vendor/cachecontrol/filewrapper.py | 111 + .../pip/_vendor/cachecontrol/heuristics.py | 139 + .../pip/_vendor/cachecontrol/serialize.py | 190 + .../pip/_vendor/cachecontrol/wrapper.py | 33 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../pip/_vendor/certifi/cacert.pem | 4685 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 84 + .../pip/_vendor/chardet/__init__.py | 93 + .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 259 + .../pip/_vendor/chardet/charsetgroupprober.py | 109 + .../pip/_vendor/chardet/charsetprober.py | 138 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../pip/_vendor/chardet/cli/chardetect.py | 86 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 82 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 260 + .../pip/_vendor/chardet/eucjpprober.py | 95 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 302 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 +++++ .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 237 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 +++++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 +++++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 +++++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4380 +++++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 +++++++++ .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 56 + .../pip/_vendor/chardet/mbcssm.py | 660 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../pip/_vendor/chardet/metadata/languages.py | 351 + .../pip/_vendor/chardet/sbcharsetprober.py | 160 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 98 + .../pip/_vendor/chardet/universaldetector.py | 328 + .../pip/_vendor/chardet/utf1632prober.py | 223 + .../pip/_vendor/chardet/utf8prober.py | 80 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 266 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 23 + .../pip/_vendor/distlib/compat.py | 1116 +++ .../pip/_vendor/distlib/database.py | 1350 +++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1300 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 152 + .../pip/_vendor/distlib/metadata.py | 1076 +++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 437 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 107520 bytes .../site-packages/pip/_vendor/distlib/util.py | 1932 ++++ .../pip/_vendor/distlib/version.py | 739 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../pip/_vendor/distlib/wheel.py | 1082 +++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../pip/_vendor/distro/distro.py | 1374 +++ .../pip/_vendor/idna/__init__.py | 44 + .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 397 + .../pip/_vendor/idna/idnadata.py | 2137 +++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8512 +++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 524 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pep517/__init__.py | 6 + .../site-packages/pip/_vendor/pep517/build.py | 127 + .../site-packages/pip/_vendor/pep517/check.py | 207 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 51 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 171 + .../pip/_vendor/pep517/in_process/__init__.py | 17 + .../_vendor/pep517/in_process/_in_process.py | 363 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 375 + .../pip/_vendor/pkg_resources/__init__.py | 3296 +++++++ .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/platformdirs/__init__.py | 340 + .../pip/_vendor/platformdirs/__main__.py | 46 + .../pip/_vendor/platformdirs/android.py | 120 + .../pip/_vendor/platformdirs/api.py | 156 + .../pip/_vendor/platformdirs/macos.py | 64 + .../pip/_vendor/platformdirs/unix.py | 181 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 182 + .../pip/_vendor/pygments/__init__.py | 83 + .../pip/_vendor/pygments/__main__.py | 17 + .../pip/_vendor/pygments/cmdline.py | 663 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 937 ++ .../pip/_vendor/pygments/formatter.py | 94 + .../_vendor/pygments/formatters/__init__.py | 153 + .../_vendor/pygments/formatters/_mapping.py | 84 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 ++ .../pip/_vendor/pygments/formatters/img.py | 641 ++ .../pip/_vendor/pygments/formatters/irc.py | 179 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 882 ++ .../pip/_vendor/pygments/lexers/__init__.py | 345 + .../pip/_vendor/pygments/lexers/_mapping.py | 596 ++ .../pip/_vendor/pygments/lexers/python.py | 1191 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 69 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 155 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 93 + .../pip/_vendor/pygments/token.py | 212 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 308 + .../pip/_vendor/pyparsing/__init__.py | 331 + .../pip/_vendor/pyparsing/actions.py | 207 + .../pip/_vendor/pyparsing/common.py | 424 + .../pip/_vendor/pyparsing/core.py | 5814 +++++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 642 ++ .../pip/_vendor/pyparsing/exceptions.py | 267 + .../pip/_vendor/pyparsing/helpers.py | 1088 +++ .../pip/_vendor/pyparsing/results.py | 760 ++ .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 352 + .../pip/_vendor/pyparsing/util.py | 235 + .../pip/_vendor/requests/__init__.py | 182 + .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 48 + .../pip/_vendor/requests/adapters.py | 584 ++ .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 17 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 831 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1086 +++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 482 + .../pip/_vendor/resolvelib/structs.py | 165 + .../pip/_vendor/rich/__init__.py | 176 + .../pip/_vendor/rich/__main__.py | 282 + .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 78 + .../pip/_vendor/rich/_extension.py | 10 + .../pip/_vendor/rich/_inspect.py | 270 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 ++ .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 237 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 615 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2572 +++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 188 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 54 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 445 + .../site-packages/pip/_vendor/rich/live.py | 373 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 280 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 251 + .../site-packages/pip/_vendor/rich/pretty.py | 1010 ++ .../pip/_vendor/rich/progress.py | 1703 ++++ .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 152 + .../site-packages/pip/_vendor/rich/rule.py | 134 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 739 ++ .../site-packages/pip/_vendor/rich/spinner.py | 136 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 771 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 934 ++ .../site-packages/pip/_vendor/rich/table.py | 996 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1286 +++ .../site-packages/pip/_vendor/rich/theme.py | 112 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 679 ++ .../site-packages/pip/_vendor/rich/tree.py | 251 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 517 + .../pip/_vendor/tenacity/_asyncio.py | 92 + .../pip/_vendor/tenacity/_utils.py | 68 + .../pip/_vendor/tenacity/after.py | 46 + .../pip/_vendor/tenacity/before.py | 41 + .../pip/_vendor/tenacity/before_sleep.py | 58 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 213 + .../pip/_vendor/tenacity/stop.py | 96 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 191 + .../pip/_vendor/tomli/__init__.py | 11 + .../pip/_vendor/tomli/_parser.py | 691 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/typing_extensions.py | 2069 ++++ .../pip/_vendor/urllib3/__init__.py | 85 + .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 567 ++ .../pip/_vendor/urllib3/connectionpool.py | 1110 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 510 + .../urllib3/contrib/securetransport.py | 921 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 51 + .../pip/_vendor/urllib3/packages/six.py | 1076 +++ .../pip/_vendor/urllib3/poolmanager.py | 537 ++ .../pip/_vendor/urllib3/request.py | 170 + .../pip/_vendor/urllib3/response.py | 818 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 620 ++ .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 268 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 23 + .../pip/_vendor/webencodings/__init__.py | 342 + .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../lib/python3.10/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3296 +++++++ .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/importlib_resources/__init__.py | 36 + .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../pkg_resources/_vendor/jaraco/context.py | 213 + .../pkg_resources/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 ++ .../_vendor/more_itertools/__init__.py | 4 + .../_vendor/more_itertools/more.py | 4316 +++++++++ .../_vendor/more_itertools/recipes.py | 698 ++ .../_vendor/packaging/__about__.py | 26 + .../_vendor/packaging/__init__.py | 25 + .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 ++ .../pkg_resources/_vendor/packaging/tags.py | 487 + .../pkg_resources/_vendor/packaging/utils.py | 136 + .../_vendor/packaging/version.py | 504 + .../_vendor/pyparsing/__init__.py | 331 + .../_vendor/pyparsing/actions.py | 207 + .../pkg_resources/_vendor/pyparsing/common.py | 424 + .../pkg_resources/_vendor/pyparsing/core.py | 5812 +++++++++++ .../_vendor/pyparsing/diagram/__init__.py | 611 ++ .../_vendor/pyparsing/exceptions.py | 267 + .../_vendor/pyparsing/helpers.py | 1083 +++ .../_vendor/pyparsing/results.py | 760 ++ .../_vendor/pyparsing/testing.py | 331 + .../_vendor/pyparsing/unicode.py | 332 + .../pkg_resources/_vendor/pyparsing/util.py | 235 + .../pkg_resources/_vendor/zipp.py | 329 + .../pkg_resources/extern/__init__.py | 76 + .../setuptools-63.2.0.dist-info/INSTALLER | 1 + .../setuptools-63.2.0.dist-info/LICENSE | 19 + .../setuptools-63.2.0.dist-info/METADATA | 140 + .../setuptools-63.2.0.dist-info/RECORD | 469 + .../setuptools-63.2.0.dist-info/REQUESTED | 0 .../setuptools-63.2.0.dist-info/WHEEL | 5 + .../entry_points.txt | 56 + .../setuptools-63.2.0.dist-info/top_level.txt | 3 + .../site-packages/setuptools/.graalpy_bundled | 1 + .../site-packages/setuptools/__init__.py | 189 + .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 24 + .../setuptools/_distutils/_collections.py | 56 + .../setuptools/_distutils/_functools.py | 20 + .../setuptools/_distutils/_macos_compat.py | 12 + .../setuptools/_distutils/_msvccompiler.py | 591 ++ .../setuptools/_distutils/archive_util.py | 280 + .../setuptools/_distutils/bcppcompiler.py | 398 + .../setuptools/_distutils/ccompiler.py | 1193 +++ .../setuptools/_distutils/cmd.py | 434 + .../setuptools/_distutils/command/__init__.py | 32 + .../_distutils/command/_framework_compat.py | 55 + .../setuptools/_distutils/command/bdist.py | 155 + .../_distutils/command/bdist_dumb.py | 142 + .../_distutils/command/bdist_msi.py | 1114 +++ .../_distutils/command/bdist_rpm.py | 607 ++ .../_distutils/command/bdist_wininst.py | 418 + .../setuptools/_distutils/command/build.py | 152 + .../_distutils/command/build_clib.py | 208 + .../_distutils/command/build_ext.py | 780 ++ .../setuptools/_distutils/command/build_py.py | 408 + .../_distutils/command/build_scripts.py | 173 + .../setuptools/_distutils/command/check.py | 153 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 376 + .../setuptools/_distutils/command/install.py | 811 ++ .../_distutils/command/install_data.py | 84 + .../_distutils/command/install_egg_info.py | 87 + .../_distutils/command/install_headers.py | 45 + .../_distutils/command/install_lib.py | 238 + .../_distutils/command/install_scripts.py | 61 + .../_distutils/command/py37compat.py | 31 + .../setuptools/_distutils/command/register.py | 319 + .../setuptools/_distutils/command/sdist.py | 531 + .../setuptools/_distutils/command/upload.py | 205 + .../setuptools/_distutils/config.py | 139 + .../setuptools/_distutils/core.py | 283 + .../setuptools/_distutils/cygwinccompiler.py | 414 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 96 + .../setuptools/_distutils/dir_util.py | 239 + .../setuptools/_distutils/dist.py | 1286 +++ .../setuptools/_distutils/errors.py | 127 + .../setuptools/_distutils/extension.py | 248 + .../setuptools/_distutils/fancy_getopt.py | 468 + .../setuptools/_distutils/file_util.py | 245 + .../setuptools/_distutils/filelist.py | 371 + .../setuptools/_distutils/log.py | 80 + .../setuptools/_distutils/msvc9compiler.py | 820 ++ .../setuptools/_distutils/msvccompiler.py | 683 ++ .../setuptools/_distutils/py38compat.py | 8 + .../setuptools/_distutils/py39compat.py | 22 + .../setuptools/_distutils/spawn.py | 107 + .../setuptools/_distutils/sysconfig.py | 549 ++ .../setuptools/_distutils/text_file.py | 287 + .../setuptools/_distutils/unixccompiler.py | 382 + .../setuptools/_distutils/util.py | 520 + .../setuptools/_distutils/version.py | 358 + .../setuptools/_distutils/versionpredicate.py | 175 + .../site-packages/setuptools/_entry_points.py | 86 + .../site-packages/setuptools/_imp.py | 82 + .../site-packages/setuptools/_importlib.py | 47 + .../site-packages/setuptools/_itertools.py | 23 + .../site-packages/setuptools/_path.py | 7 + .../site-packages/setuptools/_reqs.py | 19 + .../setuptools/_vendor/__init__.py | 0 .../_vendor/importlib_metadata/__init__.py | 1047 ++ .../_vendor/importlib_metadata/_adapters.py | 68 + .../importlib_metadata/_collections.py | 30 + .../_vendor/importlib_metadata/_compat.py | 71 + .../_vendor/importlib_metadata/_functools.py | 104 + .../_vendor/importlib_metadata/_itertools.py | 73 + .../_vendor/importlib_metadata/_meta.py | 48 + .../_vendor/importlib_metadata/_text.py | 99 + .../_vendor/importlib_resources/__init__.py | 36 + .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../setuptools/_vendor/jaraco/__init__.py | 0 .../setuptools/_vendor/jaraco/context.py | 213 + .../setuptools/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 ++ .../_vendor/more_itertools/__init__.py | 4 + .../setuptools/_vendor/more_itertools/more.py | 3824 ++++++++ .../_vendor/more_itertools/recipes.py | 620 ++ .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 26 + .../setuptools/_vendor/packaging/__init__.py | 25 + .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../setuptools/_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 ++ .../setuptools/_vendor/packaging/tags.py | 487 + .../setuptools/_vendor/packaging/utils.py | 136 + .../setuptools/_vendor/packaging/version.py | 504 + .../setuptools/_vendor/pyparsing/__init__.py | 331 + .../setuptools/_vendor/pyparsing/actions.py | 207 + .../setuptools/_vendor/pyparsing/common.py | 424 + .../setuptools/_vendor/pyparsing/core.py | 5812 +++++++++++ .../_vendor/pyparsing/diagram/__init__.py | 611 ++ .../_vendor/pyparsing/exceptions.py | 267 + .../setuptools/_vendor/pyparsing/helpers.py | 1083 +++ .../setuptools/_vendor/pyparsing/results.py | 760 ++ .../setuptools/_vendor/pyparsing/testing.py | 331 + .../setuptools/_vendor/pyparsing/unicode.py | 332 + .../setuptools/_vendor/pyparsing/util.py | 235 + .../setuptools/_vendor/tomli/__init__.py | 11 + .../setuptools/_vendor/tomli/_parser.py | 691 ++ .../setuptools/_vendor/tomli/_re.py | 107 + .../setuptools/_vendor/tomli/_types.py | 10 + .../setuptools/_vendor/typing_extensions.py | 2296 +++++ .../site-packages/setuptools/_vendor/zipp.py | 329 + .../site-packages/setuptools/archive_util.py | 213 + .../site-packages/setuptools/build_meta.py | 304 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 0 -> 137216 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 8 + .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 457 + .../setuptools/command/bdist_rpm.py | 40 + .../site-packages/setuptools/command/build.py | 24 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 328 + .../setuptools/command/build_py.py | 298 + .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 69 + .../setuptools/command/easy_install.py | 2312 +++++ .../setuptools/command/egg_info.py | 752 ++ .../setuptools/command/install.py | 139 + .../setuptools/command/install_egg_info.py | 63 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 70 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 196 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 251 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 212 + .../setuptools/config/__init__.py | 35 + .../setuptools/config/_apply_pyprojecttoml.py | 377 + .../config/_validate_pyproject/__init__.py | 34 + .../_validate_pyproject/error_reporting.py | 318 + .../_validate_pyproject/extra_validations.py | 36 + .../fastjsonschema_exceptions.py | 51 + .../fastjsonschema_validations.py | 1035 ++ .../config/_validate_pyproject/formats.py | 257 + .../site-packages/setuptools/config/expand.py | 479 + .../setuptools/config/pyprojecttoml.py | 484 + .../setuptools/config/setupcfg.py | 713 ++ .../site-packages/setuptools/dep_util.py | 25 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/discovery.py | 588 ++ .../site-packages/setuptools/dist.py | 1222 +++ .../site-packages/setuptools/errors.py | 58 + .../site-packages/setuptools/extension.py | 140 + .../setuptools/extern/__init__.py | 76 + .../site-packages/setuptools/glob.py | 167 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 0 -> 137728 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 104 + .../site-packages/setuptools/launch.py | 36 + .../site-packages/setuptools/logging.py | 36 + .../site-packages/setuptools/monkey.py | 177 + .../site-packages/setuptools/msvc.py | 1805 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1126 +++ .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 213 + .../setuptools/windows_support.py | 29 + .../src/main/resources/venv/pyvenv.cfg | 3 + .../jinja/sql/JinjaSqlCompilerService.scala | 78 +- project/Dependencies.scala | 6 +- .../client/python/PythonCompilerService.scala | 42 +- .../truffle/Rql2TruffleCompilerService.scala | 4 + 814 files changed, 285328 insertions(+), 77 deletions(-) create mode 100644 jinja-sql-client/src/main/resources/venv/bin/Activate.ps1 create mode 100644 jinja-sql-client/src/main/resources/venv/bin/activate create mode 100644 jinja-sql-client/src/main/resources/venv/bin/activate.csh create mode 100644 jinja-sql-client/src/main/resources/venv/bin/activate.fish create mode 120000 jinja-sql-client/src/main/resources/venv/bin/graalpy create mode 100755 jinja-sql-client/src/main/resources/venv/bin/pip create mode 100755 jinja-sql-client/src/main/resources/venv/bin/pip3 create mode 100755 jinja-sql-client/src/main/resources/venv/bin/pip3.10 create mode 120000 jinja-sql-client/src/main/resources/venv/bin/python create mode 120000 jinja-sql-client/src/main/resources/venv/bin/python3 create mode 120000 jinja-sql-client/src/main/resources/venv/bin/python3.10 create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/INSTALLER create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/LICENSE.rst create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/METADATA create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/RECORD create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/REQUESTED create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/WHEEL create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/entry_points.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/top_level.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/PKG-INFO create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/SOURCES.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/dependency_links.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/installed-files.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/top_level.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/_distutils_hack/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/_distutils_hack/override.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/distutils-precedence.pth create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/_identifier.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/async_utils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/bccache.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/compiler.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/constants.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/debug.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/defaults.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/environment.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/exceptions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/ext.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/filters.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/idtracking.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/lexer.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/loaders.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/meta.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/nativetypes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/nodes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/optimizer.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/parser.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/py.typed create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/runtime.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/sandbox.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/tests.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/utils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/visitor.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/markupsafe/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/markupsafe/_native.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/markupsafe/_speedups.c create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/markupsafe/_speedups.pyi create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/markupsafe/py.typed create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip-22.2.2.dist-info/INSTALLER create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip-22.2.2.dist-info/LICENSE.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip-22.2.2.dist-info/METADATA create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip-22.2.2.dist-info/RECORD create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip-22.2.2.dist-info/REQUESTED create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip-22.2.2.dist-info/WHEEL create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip-22.2.2.dist-info/entry_points.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip-22.2.2.dist-info/top_level.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/.graalpy_bundled create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/__main__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/__pip-runner__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/build_env.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cache.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/base_command.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/command_context.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/main.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/parser.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/req_command.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/spinners.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/cli/status_codes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/cache.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/check.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/completion.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/configuration.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/debug.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/download.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/freeze.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/hash.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/help.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/index.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/inspect.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/install.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/list.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/search.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/show.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/commands/wheel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/configuration.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/distributions/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/distributions/base.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/distributions/installed.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/exceptions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/index/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/index/collector.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/index/package_finder.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/index/sources.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/locations/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/locations/_distutils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/locations/base.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/main.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/metadata/_json.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/metadata/base.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/candidate.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/direct_url.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/format_control.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/index.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/installation_report.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/link.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/scheme.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/search_scope.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/target_python.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/models/wheel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/network/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/network/auth.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/network/cache.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/network/download.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/network/session.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/network/utils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/check.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/freeze.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/operations/prepare.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/pyproject.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/req/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/req/constructors.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/req/req_file.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/req/req_install.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/req/req_set.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/base.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/_log.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/appdirs.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/datetime.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/deprecation.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/egg_link.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/encoding.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/filesystem.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/filetypes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/glibc.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/graalpy.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/hashes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/logging.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/misc.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/models.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/packaging.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/subprocess.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/unpacking.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/urls.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/utils/wheel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/vcs/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/vcs/git.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/vcs/subversion.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_internal/wheel_builder.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/certifi/core.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/enums.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/chardet/version.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/colorama/win32.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/database.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/index.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/locators.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/markers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/resources.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/version.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distro/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distro/__main__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/distro/distro.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/idna/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/idna/codec.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/idna/compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/idna/core.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/idna/intranges.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/idna/package_data.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/markers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/tags.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/utils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/packaging/version.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/build.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/check.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/meta.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/console.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/filter.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/style.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/token.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pygments/util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/__version__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/adapters.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/api.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/auth.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/certs.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/cookies.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/help.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/hooks.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/models.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/packages.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/sessions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/structures.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/requests/utils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/__main__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_extension.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_loop.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_pick.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_stack.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_timer.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_windows.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/abc.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/align.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/ansi.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/bar.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/box.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/cells.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/color.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/columns.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/console.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/constrain.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/containers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/control.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/emoji.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/errors.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/filesize.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/json.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/layout.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/live.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/live_render.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/logging.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/markup.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/measure.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/padding.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/pager.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/palette.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/panel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/pretty.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/progress.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/prompt.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/protocol.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/region.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/repr.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/rule.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/scope.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/screen.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/segment.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/spinner.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/status.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/style.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/styled.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/syntax.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/table.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/text.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/theme.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/themes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/traceback.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/rich/tree.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/six.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/after.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/before.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tomli/_re.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/tomli/_types.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/typing_extensions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/request.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/vendor.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pip/py.typed create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/_common.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/abc.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/readers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/simple.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/context.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/functools.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/more_itertools/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/more_itertools/more.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/more_itertools/recipes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_manylinux.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_musllinux.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/actions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/common.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/core.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/helpers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/results.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/testing.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/unicode.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/_vendor/zipp.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/pkg_resources/extern/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools-63.2.0.dist-info/INSTALLER create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools-63.2.0.dist-info/LICENSE create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools-63.2.0.dist-info/METADATA create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools-63.2.0.dist-info/RECORD create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools-63.2.0.dist-info/REQUESTED create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools-63.2.0.dist-info/WHEEL create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools-63.2.0.dist-info/entry_points.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools-63.2.0.dist-info/top_level.txt create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/.graalpy_bundled create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_deprecation_warning.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/_collections.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/_functools.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/_macos_compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/archive_util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/cmd.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/_framework_compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_msi.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_wininst.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/build.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/check.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/clean.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/config.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/register.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/command/upload.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/config.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/core.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/debug.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/dep_util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/dir_util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/dist.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/errors.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/extension.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/file_util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/filelist.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/log.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/py38compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/py39compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/spawn.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/text_file.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/version.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_entry_points.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_imp.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_importlib.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_itertools.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_path.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_reqs.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_collections.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_functools.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_meta.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_text.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/_adapters.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/_common.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/_compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/_itertools.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/_legacy.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/abc.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/readers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/simple.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/context.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/functools.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/text/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/_manylinux.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/actions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/common.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/core.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/exceptions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/helpers.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/results.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/testing.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/unicode.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/_parser.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/_re.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/_types.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/typing_extensions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/_vendor/zipp.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/archive_util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/build_meta.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/cli-32.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/cli-64.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/cli-arm64.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/cli.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/alias.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/bdist_egg.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/bdist_rpm.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/build.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/build_clib.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/build_ext.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/build_py.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/develop.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/dist_info.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/easy_install.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/egg_info.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/install.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/install_egg_info.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/install_lib.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/install_scripts.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/launcher manifest.xml create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/py36compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/register.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/rotate.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/saveopts.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/sdist.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/setopt.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/test.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/upload.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/command/upload_docs.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/_apply_pyprojecttoml.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/error_reporting.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/extra_validations.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/formats.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/expand.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/config/setupcfg.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/dep_util.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/depends.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/discovery.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/dist.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/errors.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/extension.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/extern/__init__.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/glob.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/gui-32.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/gui-64.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/gui-arm64.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/gui.exe create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/installer.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/launch.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/logging.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/monkey.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/msvc.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/namespaces.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/package_index.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/py34compat.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/sandbox.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/script (dev).tmpl create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/script.tmpl create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/unicode_utils.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/version.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/wheel.py create mode 100644 jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/setuptools/windows_support.py create mode 100644 jinja-sql-client/src/main/resources/venv/pyvenv.cfg diff --git a/build.sbt b/build.sbt index 3c665d8fb..40f2d017f 100644 --- a/build.sbt +++ b/build.sbt @@ -293,5 +293,5 @@ lazy val jinjaSqlClient = (project in file("jinja-sql-client")) commonSettings, missingInterpolatorCompileSettings, testSettings, - libraryDependencies += "org.graalvm.polyglot" % "python" % "23.1.0" % Provided + libraryDependencies += trufflePython ) diff --git a/client/src/main/scala/raw/client/api/CompilerService.scala b/client/src/main/scala/raw/client/api/CompilerService.scala index f2e23f912..76252d518 100644 --- a/client/src/main/scala/raw/client/api/CompilerService.scala +++ b/client/src/main/scala/raw/client/api/CompilerService.scala @@ -12,6 +12,7 @@ package raw.client.api +import com.fasterxml.jackson.annotation.JsonSubTypes.{Type => JsonType} import com.fasterxml.jackson.annotation.{JsonSubTypes, JsonTypeInfo} import org.graalvm.polyglot.{Engine, Value} import raw.utils.{RawException, RawService, RawSettings} @@ -19,7 +20,6 @@ import raw.utils.{RawException, RawService, RawSettings} import java.io.OutputStream import scala.collection.mutable import scala.util.control.NonFatal -import com.fasterxml.jackson.annotation.JsonSubTypes.{Type => JsonType} // Exception that wraps the underlying error so that it includes the extra debug info. final class CompilerServiceException( @@ -62,7 +62,9 @@ object CompilerService { // options.put("engine.CompilationFailureAction", "Diagnose") // options.put("compiler.LogInlinedTargets", "true") } - val engine = Engine.newBuilder().allowExperimentalOptions(true).options(options).build() + val engine = Engine.newBuilder() + .allowExperimentalOptions(true) + .options(options).build() enginesCache.put(settings, engine) (engine, true) } diff --git a/jinja-sql-client/src/main/java/module-info.java b/jinja-sql-client/src/main/java/module-info.java index 7764f090f..66a7c39d0 100644 --- a/jinja-sql-client/src/main/java/module-info.java +++ b/jinja-sql-client/src/main/java/module-info.java @@ -15,6 +15,7 @@ requires raw.client; requires raw.utils; requires org.slf4j; + requires org.graalvm.polyglot; provides raw.client.api.CompilerServiceBuilder with raw.client.jinja.sql.JinjaSqlCompilerServiceBuilder; diff --git a/jinja-sql-client/src/main/resources/python/rawjinja.py b/jinja-sql-client/src/main/resources/python/rawjinja.py index e98f564bf..4448b62a6 100644 --- a/jinja-sql-client/src/main/resources/python/rawjinja.py +++ b/jinja-sql-client/src/main/resources/python/rawjinja.py @@ -12,7 +12,7 @@ def message(self): def apply(code, args): template = env.from_string(code) - d = dict([(key, args.get(key)) for key in args.keySet()]) + d = {key: args.get(key) for key in args.keySet()} return template.render(d) def validate(code): diff --git a/jinja-sql-client/src/main/resources/venv/bin/Activate.ps1 b/jinja-sql-client/src/main/resources/venv/bin/Activate.ps1 new file mode 100644 index 000000000..b49d77ba4 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/jinja-sql-client/src/main/resources/venv/bin/activate b/jinja-sql-client/src/main/resources/venv/bin/activate new file mode 100644 index 000000000..9a1029027 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/activate @@ -0,0 +1,69 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/bgaidioz/IdeaProjects/snapi/jinja-sql-client/src/main/resources/venv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(venv) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(venv) " + export VIRTUAL_ENV_PROMPT +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/jinja-sql-client/src/main/resources/venv/bin/activate.csh b/jinja-sql-client/src/main/resources/venv/bin/activate.csh new file mode 100644 index 000000000..443602864 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/activate.csh @@ -0,0 +1,26 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/bgaidioz/IdeaProjects/snapi/jinja-sql-client/src/main/resources/venv" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = "(venv) $prompt" + setenv VIRTUAL_ENV_PROMPT "(venv) " +endif + +alias pydoc python -m pydoc + +rehash diff --git a/jinja-sql-client/src/main/resources/venv/bin/activate.fish b/jinja-sql-client/src/main/resources/venv/bin/activate.fish new file mode 100644 index 000000000..87ddc77e2 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/activate.fish @@ -0,0 +1,66 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/); you cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + functions -e fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/bgaidioz/IdeaProjects/snapi/jinja-sql-client/src/main/resources/venv" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) "(venv) " (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT "(venv) " +end diff --git a/jinja-sql-client/src/main/resources/venv/bin/graalpy b/jinja-sql-client/src/main/resources/venv/bin/graalpy new file mode 120000 index 000000000..0bca4f66b --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/graalpy @@ -0,0 +1 @@ +/Users/bgaidioz/.pyenv/versions/graalpy-23.1.2/bin/graalpy \ No newline at end of file diff --git a/jinja-sql-client/src/main/resources/venv/bin/pip b/jinja-sql-client/src/main/resources/venv/bin/pip new file mode 100755 index 000000000..b6ce27f91 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/pip @@ -0,0 +1,8 @@ +#!/Users/bgaidioz/IdeaProjects/snapi/jinja-sql-client/src/main/resources/venv/bin/graalpy +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/jinja-sql-client/src/main/resources/venv/bin/pip3 b/jinja-sql-client/src/main/resources/venv/bin/pip3 new file mode 100755 index 000000000..b6ce27f91 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/Users/bgaidioz/IdeaProjects/snapi/jinja-sql-client/src/main/resources/venv/bin/graalpy +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/jinja-sql-client/src/main/resources/venv/bin/pip3.10 b/jinja-sql-client/src/main/resources/venv/bin/pip3.10 new file mode 100755 index 000000000..b6ce27f91 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/pip3.10 @@ -0,0 +1,8 @@ +#!/Users/bgaidioz/IdeaProjects/snapi/jinja-sql-client/src/main/resources/venv/bin/graalpy +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/jinja-sql-client/src/main/resources/venv/bin/python b/jinja-sql-client/src/main/resources/venv/bin/python new file mode 120000 index 000000000..d03db347d --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/python @@ -0,0 +1 @@ +graalpy \ No newline at end of file diff --git a/jinja-sql-client/src/main/resources/venv/bin/python3 b/jinja-sql-client/src/main/resources/venv/bin/python3 new file mode 120000 index 000000000..d03db347d --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/python3 @@ -0,0 +1 @@ +graalpy \ No newline at end of file diff --git a/jinja-sql-client/src/main/resources/venv/bin/python3.10 b/jinja-sql-client/src/main/resources/venv/bin/python3.10 new file mode 120000 index 000000000..d03db347d --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/bin/python3.10 @@ -0,0 +1 @@ +graalpy \ No newline at end of file diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/INSTALLER b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/LICENSE.rst b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/LICENSE.rst new file mode 100644 index 000000000..c37cae49e --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/METADATA b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/METADATA new file mode 100644 index 000000000..56e942902 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/METADATA @@ -0,0 +1,105 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 3.1.3 +Summary: A very fast and expressive template engine. +Home-page: https://palletsprojects.com/p/jinja/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/jinja/ +Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: MarkupSafe >=2.0 +Provides-Extra: i18n +Requires-Dist: Babel >=2.7 ; extra == 'i18n' + +Jinja +===== + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Jinja2 + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +In A Nutshell +------------- + +.. code-block:: jinja + + {% extends "base.html" %} + {% block title %}Members{% endblock %} + {% block content %} + + {% endblock %} + + +Donate +------ + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://jinja.palletsprojects.com/ +- Changes: https://jinja.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Jinja2/ +- Source Code: https://github.com/pallets/jinja/ +- Issue Tracker: https://github.com/pallets/jinja/issues/ +- Chat: https://discord.gg/pallets diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/RECORD b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/RECORD new file mode 100644 index 000000000..54e0a0c94 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/RECORD @@ -0,0 +1,59 @@ +Jinja2-3.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-3.1.3.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-3.1.3.dist-info/METADATA,sha256=0cLNbRCI91jytc7Bzv3XAQfZzFDF2gxkJuH46eF5vew,3301 +Jinja2-3.1.3.dist-info/RECORD,, +Jinja2-3.1.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Jinja2-3.1.3.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +Jinja2-3.1.3.dist-info/entry_points.txt,sha256=zRd62fbqIyfUpsRtU7EVIFyiu1tPwfgO7EvPErnxgTE,59 +Jinja2-3.1.3.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=NTBwMwsECrdHmxeXF7seusHLzrh6Ldn1A9qhS5cDuf0,1927 +jinja2/__pycache__/__init__.graalpy231-310.pyc,, +jinja2/__pycache__/_identifier.graalpy231-310.pyc,, +jinja2/__pycache__/async_utils.graalpy231-310.pyc,, +jinja2/__pycache__/bccache.graalpy231-310.pyc,, +jinja2/__pycache__/compiler.graalpy231-310.pyc,, +jinja2/__pycache__/constants.graalpy231-310.pyc,, +jinja2/__pycache__/debug.graalpy231-310.pyc,, +jinja2/__pycache__/defaults.graalpy231-310.pyc,, +jinja2/__pycache__/environment.graalpy231-310.pyc,, +jinja2/__pycache__/exceptions.graalpy231-310.pyc,, +jinja2/__pycache__/ext.graalpy231-310.pyc,, +jinja2/__pycache__/filters.graalpy231-310.pyc,, +jinja2/__pycache__/idtracking.graalpy231-310.pyc,, +jinja2/__pycache__/lexer.graalpy231-310.pyc,, +jinja2/__pycache__/loaders.graalpy231-310.pyc,, +jinja2/__pycache__/meta.graalpy231-310.pyc,, +jinja2/__pycache__/nativetypes.graalpy231-310.pyc,, +jinja2/__pycache__/nodes.graalpy231-310.pyc,, +jinja2/__pycache__/optimizer.graalpy231-310.pyc,, +jinja2/__pycache__/parser.graalpy231-310.pyc,, +jinja2/__pycache__/runtime.graalpy231-310.pyc,, +jinja2/__pycache__/sandbox.graalpy231-310.pyc,, +jinja2/__pycache__/tests.graalpy231-310.pyc,, +jinja2/__pycache__/utils.graalpy231-310.pyc,, +jinja2/__pycache__/visitor.graalpy231-310.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=dFcmh6lMNfbh7eLKrBio8JqAKLHdZbpCuurFN4OERtY,2447 +jinja2/bccache.py,sha256=mhz5xtLxCcHRAa56azOhphIAe19u1we0ojifNMClDio,14061 +jinja2/compiler.py,sha256=PJzYdRLStlEOqmnQs1YxlizPrJoj3jTZuUleREn6AIQ,72199 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=iWJ432RadxJNnaMOPrjIDInz50UEgni3_HKuFXi2vuQ,6299 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=0qldX3VQKZcm6lgn7zHz94oRFow7YPYERiqkquomNjU,61253 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=5fnMpllaXkfm2P_93RIvi-OnK7Tk8mCW8Du-GcD12Hc,31844 +jinja2/filters.py,sha256=vYjKb2zaPShvYtn_LpSmqfS8SScbrA_KOanNibsMDIE,53862 +jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 +jinja2/lexer.py,sha256=DW2nX9zk-6MWp65YR2bqqj0xqCvLtD-u9NWT8AnFRxQ,29726 +jinja2/loaders.py,sha256=ayAwxfrA1SAffQta0nwSDm3TDT4KYiIGN_D9Z45B310,23085 +jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396 +jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 +jinja2/nodes.py,sha256=i34GPRAZexXMT6bwuf5SEyvdmS-bRCy9KMjwN5O6pjk,34550 +jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650 +jinja2/parser.py,sha256=Y199wPL-G67gJoi5G_5sHuu9uEP1PJkjjLEW_xTH8-k,39736 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=_6LkKIWFJjQdqlrgA3K39zBFQ-7Orm3wGDm96RwxQoE,33406 +jinja2/sandbox.py,sha256=Y0xZeXQnH6EX5VjaV2YixESxoepnRbW_3UeQosaBU3M,14584 +jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905 +jinja2/utils.py,sha256=IMwRIcN1SsTw2-jdQtlH2KzNABsXZBW_-tnFXafQBvY,23933 +jinja2/visitor.py,sha256=MH14C6yq24G_KVtWzjwaI7Wg14PCJIYlWW1kpkxYak0,3568 diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/REQUESTED b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/REQUESTED new file mode 100644 index 000000000..e69de29bb diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/WHEEL b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/WHEEL new file mode 100644 index 000000000..98c0d20b7 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.42.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/entry_points.txt b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/entry_points.txt new file mode 100644 index 000000000..7b9666c8e --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract[i18n] diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/top_level.txt b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/top_level.txt new file mode 100644 index 000000000..7f7afbf3b --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/PKG-INFO b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/PKG-INFO new file mode 100644 index 000000000..7f1daf7b1 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/PKG-INFO @@ -0,0 +1,94 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 2.1.5 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/markupsafe/ +Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/ +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + + >>> # escape replaces special characters and wraps in Markup + >>> escape("") + Markup('<script>alert(document.cookie);</script>') + + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup("Hello") + Markup('hello') + + >>> escape(Markup("Hello")) + Markup('hello') + + >>> # Markup is a str subclass + >>> # methods and operators escape their arguments + >>> template = Markup("Hello {name}") + >>> template.format(name='"World"') + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://markupsafe.palletsprojects.com/ +- Changes: https://markupsafe.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/MarkupSafe/ +- Source Code: https://github.com/pallets/markupsafe/ +- Issue Tracker: https://github.com/pallets/markupsafe/issues/ +- Chat: https://discord.gg/pallets diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/SOURCES.txt b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/SOURCES.txt new file mode 100644 index 000000000..8be9ba6fb --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/SOURCES.txt @@ -0,0 +1,35 @@ +CHANGES.rst +LICENSE.rst +MANIFEST.in +README.rst +setup.cfg +setup.py +tox.ini +docs/Makefile +docs/changes.rst +docs/conf.py +docs/escaping.rst +docs/formatting.rst +docs/html.rst +docs/index.rst +docs/license.rst +docs/make.bat +requirements/build.txt +requirements/dev.txt +requirements/docs.txt +requirements/tests.txt +requirements/typing.txt +src/MarkupSafe.egg-info/PKG-INFO +src/MarkupSafe.egg-info/SOURCES.txt +src/MarkupSafe.egg-info/dependency_links.txt +src/MarkupSafe.egg-info/top_level.txt +src/markupsafe/__init__.py +src/markupsafe/_native.py +src/markupsafe/_speedups.c +src/markupsafe/_speedups.pyi +src/markupsafe/py.typed +tests/conftest.py +tests/test_escape.py +tests/test_exception_custom_html.py +tests/test_leak.py +tests/test_markupsafe.py \ No newline at end of file diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/dependency_links.txt b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/dependency_links.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/installed-files.txt b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/installed-files.txt new file mode 100644 index 000000000..dc747b86d --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/installed-files.txt @@ -0,0 +1,11 @@ +../markupsafe/__init__.py +../markupsafe/__pycache__/__init__.graalpy231-310.pyc +../markupsafe/__pycache__/_native.graalpy231-310.pyc +../markupsafe/_native.py +../markupsafe/_speedups.c +../markupsafe/_speedups.pyi +../markupsafe/py.typed +PKG-INFO +SOURCES.txt +dependency_links.txt +top_level.txt diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/top_level.txt b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/top_level.txt new file mode 100644 index 000000000..75bf72925 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5-py3.10.egg-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/_distutils_hack/__init__.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/_distutils_hack/__init__.py new file mode 100644 index 000000000..5d2ce6f1e --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/_distutils_hack/__init__.py @@ -0,0 +1,226 @@ +# don't import any costly modules +import sys +import os + + +is_pypy = '__pypy__' in sys.builtin_module_names + + +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + if is_pypy and sys.version_info < (3, 7): + # PyPy for 3.6 unconditionally imports distutils, so bypass the warning + # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 + return + import warnings + + warnings.warn( + "Distutils was imported before Setuptools, but importing Setuptools " + "also replaces the `distutils` module in `sys.modules`. This may lead " + "to undesirable behaviors or errors. To avoid these issues, avoid " + "using distutils directly, ensure that setuptools is installed in the " + "traditional way (e.g. not an editable install), and/or make sure " + "that setuptools is always imported before distutils." + ) + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + import warnings + + warnings.warn("Setuptools is replacing distutils.") + mods = [ + name + for name in sys.modules + if name == "distutils" or name.startswith("distutils.") + ] + for name in mods: + del sys.modules[name] + + +def enabled(): + """ + Allow selection of distutils by environment variable. + """ + # which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') + # GraalVM change: default to stdlib + which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib') + return which == 'local' + + +def ensure_local_distutils(): + import importlib + + clear_distutils() + + # With the DistutilsMetaFinder in place, + # perform an import to cause distutils to be + # loaded from setuptools._distutils. Ref #2906. + with shim(): + importlib.import_module('distutils') + + # check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + assert 'setuptools._distutils.log' not in sys.modules + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + if enabled(): + warn_distutils_present() + ensure_local_distutils() + + +class _TrivialRe: + def __init__(self, *patterns): + self._patterns = patterns + + def match(self, string): + return all(pat in string for pat in self._patterns) + + +class DistutilsMetaFinder: + def find_spec(self, fullname, path, target=None): + # optimization: only consider top level modules and those + # found in the CPython test suite. + if path is not None and not fullname.startswith('test.'): + return + + method_name = 'spec_for_{fullname}'.format(**locals()) + method = getattr(self, method_name, lambda: None) + return method() + + def spec_for_distutils(self): + if self.is_cpython(): + return + + import importlib + import importlib.abc + import importlib.util + + try: + mod = importlib.import_module('setuptools._distutils') + except Exception: + # There are a couple of cases where setuptools._distutils + # may not be present: + # - An older Setuptools without a local distutils is + # taking precedence. Ref #2957. + # - Path manipulation during sitecustomize removes + # setuptools from the path but only after the hook + # has been loaded. Ref #2980. + # In either case, fall back to stdlib behavior. + return + + class DistutilsLoader(importlib.abc.Loader): + def create_module(self, spec): + mod.__name__ = 'distutils' + return mod + + def exec_module(self, module): + pass + + return importlib.util.spec_from_loader( + 'distutils', DistutilsLoader(), origin=mod.__file__ + ) + + @staticmethod + def is_cpython(): + """ + Suppress supplying distutils for CPython (build and tests). + Ref #2965 and #3007. + """ + return os.path.isfile('pybuilddir.txt') + + def spec_for_pip(self): + """ + Ensure stdlib distutils when running under pip. + See pypa/pip#8761 for rationale. + """ + if self.pip_imported_during_build(): + return + clear_distutils() + self.spec_for_distutils = lambda: None + + @classmethod + def pip_imported_during_build(cls): + """ + Detect if pip is being imported in a build script. Ref #2355. + """ + import traceback + + return any( + cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) + ) + + @staticmethod + def frame_file_is_setup(frame): + """ + Return True if the indicated frame suggests a setup.py file. + """ + # some frames may not have __file__ (#2940) + return frame.f_globals.get('__file__', '').endswith('setup.py') + + def spec_for_sensitive_tests(self): + """ + Ensure stdlib distutils when running select tests under CPython. + + python/cpython#91169 + """ + clear_distutils() + self.spec_for_distutils = lambda: None + + sensitive_tests = ( + [ + 'test.test_distutils', + 'test.test_peg_generator', + 'test.test_importlib', + ] + if sys.version_info < (3, 10) + else [ + 'test.test_distutils', + ] + ) + + +for name in DistutilsMetaFinder.sensitive_tests: + setattr( + DistutilsMetaFinder, + f'spec_for_{name}', + DistutilsMetaFinder.spec_for_sensitive_tests, + ) + + +DISTUTILS_FINDER = DistutilsMetaFinder() + + +def add_shim(): + if enabled(): + DISTUTILS_FINDER in sys.meta_path or insert_shim() + + +class shim: + def __enter__(self): + insert_shim() + + def __exit__(self, exc, value, tb): + remove_shim() + + +def insert_shim(): + if enabled(): + sys.meta_path.insert(0, DISTUTILS_FINDER) + + +def remove_shim(): + try: + sys.meta_path.remove(DISTUTILS_FINDER) + except ValueError: + pass diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/_distutils_hack/override.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/_distutils_hack/override.py new file mode 100644 index 000000000..2cc433a4a --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/_distutils_hack/override.py @@ -0,0 +1 @@ +__import__('_distutils_hack').do_override() diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/distutils-precedence.pth b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/distutils-precedence.pth new file mode 100644 index 000000000..7f009fe9b --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/distutils-precedence.pth @@ -0,0 +1 @@ +import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/__init__.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/__init__.py new file mode 100644 index 000000000..af5d4288d --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/__init__.py @@ -0,0 +1,37 @@ +"""Jinja is a template engine written in pure Python. It provides a +non-XML syntax that supports inline expressions and an optional +sandboxed environment. +""" +from .bccache import BytecodeCache as BytecodeCache +from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache +from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache +from .environment import Environment as Environment +from .environment import Template as Template +from .exceptions import TemplateAssertionError as TemplateAssertionError +from .exceptions import TemplateError as TemplateError +from .exceptions import TemplateNotFound as TemplateNotFound +from .exceptions import TemplateRuntimeError as TemplateRuntimeError +from .exceptions import TemplatesNotFound as TemplatesNotFound +from .exceptions import TemplateSyntaxError as TemplateSyntaxError +from .exceptions import UndefinedError as UndefinedError +from .loaders import BaseLoader as BaseLoader +from .loaders import ChoiceLoader as ChoiceLoader +from .loaders import DictLoader as DictLoader +from .loaders import FileSystemLoader as FileSystemLoader +from .loaders import FunctionLoader as FunctionLoader +from .loaders import ModuleLoader as ModuleLoader +from .loaders import PackageLoader as PackageLoader +from .loaders import PrefixLoader as PrefixLoader +from .runtime import ChainableUndefined as ChainableUndefined +from .runtime import DebugUndefined as DebugUndefined +from .runtime import make_logging_undefined as make_logging_undefined +from .runtime import StrictUndefined as StrictUndefined +from .runtime import Undefined as Undefined +from .utils import clear_caches as clear_caches +from .utils import is_undefined as is_undefined +from .utils import pass_context as pass_context +from .utils import pass_environment as pass_environment +from .utils import pass_eval_context as pass_eval_context +from .utils import select_autoescape as select_autoescape + +__version__ = "3.1.3" diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/_identifier.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/_identifier.py new file mode 100644 index 000000000..928c1503c --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/_identifier.py @@ -0,0 +1,6 @@ +import re + +# generated by scripts/generate_identifier_pattern.py +pattern = re.compile( + r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 +) diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/async_utils.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/async_utils.py new file mode 100644 index 000000000..715d70119 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/async_utils.py @@ -0,0 +1,84 @@ +import inspect +import typing as t +from functools import WRAPPER_ASSIGNMENTS +from functools import wraps + +from .utils import _PassArg +from .utils import pass_eval_context + +V = t.TypeVar("V") + + +def async_variant(normal_func): # type: ignore + def decorator(async_func): # type: ignore + pass_arg = _PassArg.from_obj(normal_func) + need_eval_context = pass_arg is None + + if pass_arg is _PassArg.environment: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].is_async) + + else: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].environment.is_async) + + # Take the doc and annotations from the sync function, but the + # name from the async function. Pallets-Sphinx-Themes + # build_function_directive expects __wrapped__ to point to the + # sync function. + async_func_attrs = ("__module__", "__name__", "__qualname__") + normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) + + @wraps(normal_func, assigned=normal_func_attrs) + @wraps(async_func, assigned=async_func_attrs, updated=()) + def wrapper(*args, **kwargs): # type: ignore + b = is_async(args) + + if need_eval_context: + args = args[1:] + + if b: + return async_func(*args, **kwargs) + + return normal_func(*args, **kwargs) + + if need_eval_context: + wrapper = pass_eval_context(wrapper) + + wrapper.jinja_async_variant = True + return wrapper + + return decorator + + +_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} + + +async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": + # Avoid a costly call to isawaitable + if type(value) in _common_primitives: + return t.cast("V", value) + + if inspect.isawaitable(value): + return await t.cast("t.Awaitable[V]", value) + + return t.cast("V", value) + + +async def auto_aiter( + iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> "t.AsyncIterator[V]": + if hasattr(iterable, "__aiter__"): + async for item in t.cast("t.AsyncIterable[V]", iterable): + yield item + else: + for item in iterable: + yield item + + +async def auto_to_list( + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> t.List["V"]: + return [x async for x in auto_aiter(value)] diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/bccache.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/bccache.py new file mode 100644 index 000000000..d0ddf56ef --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/bccache.py @@ -0,0 +1,406 @@ +"""The optional bytecode cache system. This is useful if you have very +complex template situations and the compilation of all those templates +slows down your application too much. + +Situations where this is useful are often forking web applications that +are initialized on the first request. +""" +import errno +import fnmatch +import marshal +import os +import pickle +import stat +import sys +import tempfile +import typing as t +from hashlib import sha1 +from io import BytesIO +from types import CodeType + +if t.TYPE_CHECKING: + import typing_extensions as te + from .environment import Environment + + class _MemcachedClient(te.Protocol): + def get(self, key: str) -> bytes: + ... + + def set(self, key: str, value: bytes, timeout: t.Optional[int] = None) -> None: + ... + + +bc_version = 5 +# Magic bytes to identify Jinja bytecode cache files. Contains the +# Python major and minor version to avoid loading incompatible bytecode +# if a project upgrades its Python version. +bc_magic = ( + b"j2" + + pickle.dumps(bc_version, 2) + + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) +) + + +class Bucket: + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + + The buckets get an internal checksum from the cache assigned and use this + to automatically reject outdated cache material. Individual bytecode + cache subclasses don't have to care about cache invalidation. + """ + + def __init__(self, environment: "Environment", key: str, checksum: str) -> None: + self.environment = environment + self.key = key + self.checksum = checksum + self.reset() + + def reset(self) -> None: + """Resets the bucket (unloads the bytecode).""" + self.code: t.Optional[CodeType] = None + + def load_bytecode(self, f: t.BinaryIO) -> None: + """Loads bytecode from a file or file like object.""" + # make sure the magic header is correct + magic = f.read(len(bc_magic)) + if magic != bc_magic: + self.reset() + return + # the source code of the file changed, we need to reload + checksum = pickle.load(f) + if self.checksum != checksum: + self.reset() + return + # if marshal_load fails then we need to reload + try: + self.code = marshal.load(f) + except (EOFError, ValueError, TypeError): + self.reset() + return + + def write_bytecode(self, f: t.IO[bytes]) -> None: + """Dump the bytecode into the file or file like object passed.""" + if self.code is None: + raise TypeError("can't write empty bucket") + f.write(bc_magic) + pickle.dump(self.checksum, f, 2) + marshal.dump(self.code, f) + + def bytecode_from_string(self, string: bytes) -> None: + """Load bytecode from bytes.""" + self.load_bytecode(BytesIO(string)) + + def bytecode_to_string(self) -> bytes: + """Return the bytecode as bytes.""" + out = BytesIO() + self.write_bytecode(out) + return out.getvalue() + + +class BytecodeCache: + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~jinja2.bccache.Bucket`. + + A very basic bytecode cache that saves the bytecode on the file system:: + + from os import path + + class MyCache(BytecodeCache): + + def __init__(self, directory): + self.directory = directory + + def load_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + if path.exists(filename): + with open(filename, 'rb') as f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + with open(filename, 'wb') as f: + bucket.write_bytecode(f) + + A more advanced version of a filesystem based bytecode cache is part of + Jinja. + """ + + def load_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to load bytecode into a + bucket. If they are not able to find code in the cache for the + bucket, it must not do anything. + """ + raise NotImplementedError() + + def dump_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to write the bytecode + from a bucket back to the cache. If it unable to do so it must not + fail silently but raise an exception. + """ + raise NotImplementedError() + + def clear(self) -> None: + """Clears the cache. This method is not used by Jinja but should be + implemented to allow applications to clear the bytecode cache used + by a particular environment. + """ + + def get_cache_key( + self, name: str, filename: t.Optional[t.Union[str]] = None + ) -> str: + """Returns the unique hash key for this template name.""" + hash = sha1(name.encode("utf-8")) + + if filename is not None: + hash.update(f"|{filename}".encode()) + + return hash.hexdigest() + + def get_source_checksum(self, source: str) -> str: + """Returns a checksum for the source.""" + return sha1(source.encode("utf-8")).hexdigest() + + def get_bucket( + self, + environment: "Environment", + name: str, + filename: t.Optional[str], + source: str, + ) -> Bucket: + """Return a cache bucket for the given template. All arguments are + mandatory but filename may be `None`. + """ + key = self.get_cache_key(name, filename) + checksum = self.get_source_checksum(source) + bucket = Bucket(environment, key, checksum) + self.load_bytecode(bucket) + return bucket + + def set_bucket(self, bucket: Bucket) -> None: + """Put the bucket into the cache.""" + self.dump_bytecode(bucket) + + +class FileSystemBytecodeCache(BytecodeCache): + """A bytecode cache that stores bytecode on the filesystem. It accepts + two arguments: The directory where the cache items are stored and a + pattern string that is used to build the filename. + + If no directory is specified a default cache directory is selected. On + Windows the user's temp directory is used, on UNIX systems a directory + is created for the user in the system temp directory. + + The pattern can be used to have multiple separate caches operate on the + same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` + is replaced with the cache key. + + >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') + + This bytecode cache supports clearing of the cache using the clear method. + """ + + def __init__( + self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" + ) -> None: + if directory is None: + directory = self._get_default_cache_dir() + self.directory = directory + self.pattern = pattern + + def _get_default_cache_dir(self) -> str: + def _unsafe_dir() -> "te.NoReturn": + raise RuntimeError( + "Cannot determine safe temp directory. You " + "need to explicitly provide one." + ) + + tmpdir = tempfile.gettempdir() + + # On windows the temporary directory is used specific unless + # explicitly forced otherwise. We can just use that. + if os.name == "nt": + return tmpdir + if not hasattr(os, "getuid"): + _unsafe_dir() + + dirname = f"_jinja2-cache-{os.getuid()}" + actual_dir = os.path.join(tmpdir, dirname) + + try: + os.mkdir(actual_dir, stat.S_IRWXU) + except OSError as e: + if e.errno != errno.EEXIST: + raise + try: + os.chmod(actual_dir, stat.S_IRWXU) + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + except OSError as e: + if e.errno != errno.EEXIST: + raise + + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + + return actual_dir + + def _get_cache_filename(self, bucket: Bucket) -> str: + return os.path.join(self.directory, self.pattern % (bucket.key,)) + + def load_bytecode(self, bucket: Bucket) -> None: + filename = self._get_cache_filename(bucket) + + # Don't test for existence before opening the file, since the + # file could disappear after the test before the open. + try: + f = open(filename, "rb") + except (FileNotFoundError, IsADirectoryError, PermissionError): + # PermissionError can occur on Windows when an operation is + # in progress, such as calling clear(). + return + + with f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket: Bucket) -> None: + # Write to a temporary file, then rename to the real name after + # writing. This avoids another process reading the file before + # it is fully written. + name = self._get_cache_filename(bucket) + f = tempfile.NamedTemporaryFile( + mode="wb", + dir=os.path.dirname(name), + prefix=os.path.basename(name), + suffix=".tmp", + delete=False, + ) + + def remove_silent() -> None: + try: + os.remove(f.name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + pass + + try: + with f: + bucket.write_bytecode(f) + except BaseException: + remove_silent() + raise + + try: + os.replace(f.name, name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + remove_silent() + except BaseException: + remove_silent() + raise + + def clear(self) -> None: + # imported lazily here because google app-engine doesn't support + # write access on the file system and the function does not exist + # normally. + from os import remove + + files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) + for filename in files: + try: + remove(os.path.join(self.directory, filename)) + except OSError: + pass + + +class MemcachedBytecodeCache(BytecodeCache): + """This class implements a bytecode cache that uses a memcache cache for + storing the information. It does not enforce a specific memcache library + (tummy's memcache or cmemcache) but will accept any class that provides + the minimal interface required. + + Libraries compatible with this class: + + - `cachelib `_ + - `python-memcached `_ + + (Unfortunately the django cache interface is not compatible because it + does not support storing binary data, only text. You can however pass + the underlying cache client to the bytecode cache which is available + as `django.core.cache.cache._client`.) + + The minimal interface for the client passed to the constructor is this: + + .. class:: MinimalClientInterface + + .. method:: set(key, value[, timeout]) + + Stores the bytecode in the cache. `value` is a string and + `timeout` the timeout of the key. If timeout is not provided + a default timeout or no timeout should be assumed, if it's + provided it's an integer with the number of seconds the cache + item should exist. + + .. method:: get(key) + + Returns the value for the cache key. If the item does not + exist in the cache the return value must be `None`. + + The other arguments to the constructor are the prefix for all keys that + is added before the actual cache key and the timeout for the bytecode in + the cache system. We recommend a high (or no) timeout. + + This bytecode cache does not support clearing of used items in the cache. + The clear method is a no-operation function. + + .. versionadded:: 2.7 + Added support for ignoring memcache errors through the + `ignore_memcache_errors` parameter. + """ + + def __init__( + self, + client: "_MemcachedClient", + prefix: str = "jinja2/bytecode/", + timeout: t.Optional[int] = None, + ignore_memcache_errors: bool = True, + ): + self.client = client + self.prefix = prefix + self.timeout = timeout + self.ignore_memcache_errors = ignore_memcache_errors + + def load_bytecode(self, bucket: Bucket) -> None: + try: + code = self.client.get(self.prefix + bucket.key) + except Exception: + if not self.ignore_memcache_errors: + raise + else: + bucket.bytecode_from_string(code) + + def dump_bytecode(self, bucket: Bucket) -> None: + key = self.prefix + bucket.key + value = bucket.bytecode_to_string() + + try: + if self.timeout is not None: + self.client.set(key, value, self.timeout) + else: + self.client.set(key, value) + except Exception: + if not self.ignore_memcache_errors: + raise diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/compiler.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/compiler.py new file mode 100644 index 000000000..ff95c807b --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/compiler.py @@ -0,0 +1,1956 @@ +"""Compiles nodes from the parser into Python code.""" +import typing as t +from contextlib import contextmanager +from functools import update_wrapper +from io import StringIO +from itertools import chain +from keyword import iskeyword as is_python_keyword + +from markupsafe import escape +from markupsafe import Markup + +from . import nodes +from .exceptions import TemplateAssertionError +from .idtracking import Symbols +from .idtracking import VAR_LOAD_ALIAS +from .idtracking import VAR_LOAD_PARAMETER +from .idtracking import VAR_LOAD_RESOLVE +from .idtracking import VAR_LOAD_UNDEFINED +from .nodes import EvalContext +from .optimizer import Optimizer +from .utils import _PassArg +from .utils import concat +from .visitor import NodeVisitor + +if t.TYPE_CHECKING: + import typing_extensions as te + from .environment import Environment + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +operators = { + "eq": "==", + "ne": "!=", + "gt": ">", + "gteq": ">=", + "lt": "<", + "lteq": "<=", + "in": "in", + "notin": "not in", +} + + +def optimizeconst(f: F) -> F: + def new_func( + self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any + ) -> t.Any: + # Only optimize if the frame is not volatile + if self.optimizer is not None and not frame.eval_ctx.volatile: + new_node = self.optimizer.visit(node, frame.eval_ctx) + + if new_node != node: + return self.visit(new_node, frame) + + return f(self, node, frame, **kwargs) + + return update_wrapper(t.cast(F, new_func), f) + + +def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed + and op in self.environment.intercepted_binops # type: ignore + ): + self.write(f"environment.call_binop(context, {op!r}, ") + self.visit(node.left, frame) + self.write(", ") + self.visit(node.right, frame) + else: + self.write("(") + self.visit(node.left, frame) + self.write(f" {op} ") + self.visit(node.right, frame) + + self.write(")") + + return visitor + + +def _make_unop( + op: str, +) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed + and op in self.environment.intercepted_unops # type: ignore + ): + self.write(f"environment.call_unop(context, {op!r}, ") + self.visit(node.node, frame) + else: + self.write("(" + op) + self.visit(node.node, frame) + + self.write(")") + + return visitor + + +def generate( + node: nodes.Template, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, +) -> t.Optional[str]: + """Generate the python source for a node tree.""" + if not isinstance(node, nodes.Template): + raise TypeError("Can't compile non template nodes") + + generator = environment.code_generator_class( + environment, name, filename, stream, defer_init, optimized + ) + generator.visit(node) + + if stream is None: + return generator.stream.getvalue() # type: ignore + + return None + + +def has_safe_repr(value: t.Any) -> bool: + """Does the node have a safe representation?""" + if value is None or value is NotImplemented or value is Ellipsis: + return True + + if type(value) in {bool, int, float, complex, range, str, Markup}: + return True + + if type(value) in {tuple, list, set, frozenset}: + return all(has_safe_repr(v) for v in value) + + if type(value) is dict: + return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) + + return False + + +def find_undeclared( + nodes: t.Iterable[nodes.Node], names: t.Iterable[str] +) -> t.Set[str]: + """Check if the names passed are accessed undeclared. The return value + is a set of all the undeclared names from the sequence of names found. + """ + visitor = UndeclaredNameVisitor(names) + try: + for node in nodes: + visitor.visit(node) + except VisitorExit: + pass + return visitor.undeclared + + +class MacroRef: + def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: + self.node = node + self.accesses_caller = False + self.accesses_kwargs = False + self.accesses_varargs = False + + +class Frame: + """Holds compile time information for us.""" + + def __init__( + self, + eval_ctx: EvalContext, + parent: t.Optional["Frame"] = None, + level: t.Optional[int] = None, + ) -> None: + self.eval_ctx = eval_ctx + + # the parent of this frame + self.parent = parent + + if parent is None: + self.symbols = Symbols(level=level) + + # in some dynamic inheritance situations the compiler needs to add + # write tests around output statements. + self.require_output_check = False + + # inside some tags we are using a buffer rather than yield statements. + # this for example affects {% filter %} or {% macro %}. If a frame + # is buffered this variable points to the name of the list used as + # buffer. + self.buffer: t.Optional[str] = None + + # the name of the block we're in, otherwise None. + self.block: t.Optional[str] = None + + else: + self.symbols = Symbols(parent.symbols, level=level) + self.require_output_check = parent.require_output_check + self.buffer = parent.buffer + self.block = parent.block + + # a toplevel frame is the root + soft frames such as if conditions. + self.toplevel = False + + # the root frame is basically just the outermost frame, so no if + # conditions. This information is used to optimize inheritance + # situations. + self.rootlevel = False + + # variables set inside of loops and blocks should not affect outer frames, + # but they still needs to be kept track of as part of the active context. + self.loop_frame = False + self.block_frame = False + + # track whether the frame is being used in an if-statement or conditional + # expression as it determines which errors should be raised during runtime + # or compile time. + self.soft_frame = False + + def copy(self) -> "Frame": + """Create a copy of the current one.""" + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.symbols = self.symbols.copy() + return rv + + def inner(self, isolated: bool = False) -> "Frame": + """Return an inner frame.""" + if isolated: + return Frame(self.eval_ctx, level=self.symbols.level + 1) + return Frame(self.eval_ctx, self) + + def soft(self) -> "Frame": + """Return a soft frame. A soft frame may not be modified as + standalone thing as it shares the resources with the frame it + was created of, but it's not a rootlevel frame any longer. + + This is only used to implement if-statements and conditional + expressions. + """ + rv = self.copy() + rv.rootlevel = False + rv.soft_frame = True + return rv + + __copy__ = copy + + +class VisitorExit(RuntimeError): + """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" + + +class DependencyFinderVisitor(NodeVisitor): + """A visitor that collects filter and test calls.""" + + def __init__(self) -> None: + self.filters: t.Set[str] = set() + self.tests: t.Set[str] = set() + + def visit_Filter(self, node: nodes.Filter) -> None: + self.generic_visit(node) + self.filters.add(node.name) + + def visit_Test(self, node: nodes.Test) -> None: + self.generic_visit(node) + self.tests.add(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting at blocks.""" + + +class UndeclaredNameVisitor(NodeVisitor): + """A visitor that checks if a name is accessed without being + declared. This is different from the frame visitor as it will + not stop at closure frames. + """ + + def __init__(self, names: t.Iterable[str]) -> None: + self.names = set(names) + self.undeclared: t.Set[str] = set() + + def visit_Name(self, node: nodes.Name) -> None: + if node.ctx == "load" and node.name in self.names: + self.undeclared.add(node.name) + if self.undeclared == self.names: + raise VisitorExit() + else: + self.names.discard(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting a blocks.""" + + +class CompilerExit(Exception): + """Raised if the compiler encountered a situation where it just + doesn't make sense to further process the code. Any block that + raises such an exception is not further processed. + """ + + +class CodeGenerator(NodeVisitor): + def __init__( + self, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, + ) -> None: + if stream is None: + stream = StringIO() + self.environment = environment + self.name = name + self.filename = filename + self.stream = stream + self.created_block_context = False + self.defer_init = defer_init + self.optimizer: t.Optional[Optimizer] = None + + if optimized: + self.optimizer = Optimizer(environment) + + # aliases for imports + self.import_aliases: t.Dict[str, str] = {} + + # a registry for all blocks. Because blocks are moved out + # into the global python scope they are registered here + self.blocks: t.Dict[str, nodes.Block] = {} + + # the number of extends statements so far + self.extends_so_far = 0 + + # some templates have a rootlevel extends. In this case we + # can safely assume that we're a child template and do some + # more optimizations. + self.has_known_extends = False + + # the current line number + self.code_lineno = 1 + + # registry of all filters and tests (global, not block local) + self.tests: t.Dict[str, str] = {} + self.filters: t.Dict[str, str] = {} + + # the debug information + self.debug_info: t.List[t.Tuple[int, int]] = [] + self._write_debug_info: t.Optional[int] = None + + # the number of new lines before the next write() + self._new_lines = 0 + + # the line number of the last written statement + self._last_line = 0 + + # true if nothing was written so far. + self._first_write = True + + # used by the `temporary_identifier` method to get new + # unique, temporary identifier + self._last_identifier = 0 + + # the current indentation + self._indentation = 0 + + # Tracks toplevel assignments + self._assign_stack: t.List[t.Set[str]] = [] + + # Tracks parameter definition blocks + self._param_def_block: t.List[t.Set[str]] = [] + + # Tracks the current context. + self._context_reference_stack = ["context"] + + @property + def optimized(self) -> bool: + return self.optimizer is not None + + # -- Various compilation helpers + + def fail(self, msg: str, lineno: int) -> "te.NoReturn": + """Fail with a :exc:`TemplateAssertionError`.""" + raise TemplateAssertionError(msg, lineno, self.name, self.filename) + + def temporary_identifier(self) -> str: + """Get a new unique identifier.""" + self._last_identifier += 1 + return f"t_{self._last_identifier}" + + def buffer(self, frame: Frame) -> None: + """Enable buffering for the frame from that point onwards.""" + frame.buffer = self.temporary_identifier() + self.writeline(f"{frame.buffer} = []") + + def return_buffer_contents( + self, frame: Frame, force_unescaped: bool = False + ) -> None: + """Return the buffer contents of the frame.""" + if not force_unescaped: + if frame.eval_ctx.volatile: + self.writeline("if context.eval_ctx.autoescape:") + self.indent() + self.writeline(f"return Markup(concat({frame.buffer}))") + self.outdent() + self.writeline("else:") + self.indent() + self.writeline(f"return concat({frame.buffer})") + self.outdent() + return + elif frame.eval_ctx.autoescape: + self.writeline(f"return Markup(concat({frame.buffer}))") + return + self.writeline(f"return concat({frame.buffer})") + + def indent(self) -> None: + """Indent by one.""" + self._indentation += 1 + + def outdent(self, step: int = 1) -> None: + """Outdent by step.""" + self._indentation -= step + + def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: + """Yield or write into the frame buffer.""" + if frame.buffer is None: + self.writeline("yield ", node) + else: + self.writeline(f"{frame.buffer}.append(", node) + + def end_write(self, frame: Frame) -> None: + """End the writing process started by `start_write`.""" + if frame.buffer is not None: + self.write(")") + + def simple_write( + self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None + ) -> None: + """Simple shortcut for start_write + write + end_write.""" + self.start_write(frame, node) + self.write(s) + self.end_write(frame) + + def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: + """Visit a list of nodes as block in a frame. If the current frame + is no buffer a dummy ``if 0: yield None`` is written automatically. + """ + try: + self.writeline("pass") + for node in nodes: + self.visit(node, frame) + except CompilerExit: + pass + + def write(self, x: str) -> None: + """Write a string into the output stream.""" + if self._new_lines: + if not self._first_write: + self.stream.write("\n" * self._new_lines) + self.code_lineno += self._new_lines + if self._write_debug_info is not None: + self.debug_info.append((self._write_debug_info, self.code_lineno)) + self._write_debug_info = None + self._first_write = False + self.stream.write(" " * self._indentation) + self._new_lines = 0 + self.stream.write(x) + + def writeline( + self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 + ) -> None: + """Combination of newline and write.""" + self.newline(node, extra) + self.write(x) + + def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: + """Add one or more newlines before the next write.""" + self._new_lines = max(self._new_lines, 1 + extra) + if node is not None and node.lineno != self._last_line: + self._write_debug_info = node.lineno + self._last_line = node.lineno + + def signature( + self, + node: t.Union[nodes.Call, nodes.Filter, nodes.Test], + frame: Frame, + extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + ) -> None: + """Writes a function call to the stream for the current node. + A leading comma is added automatically. The extra keyword + arguments may not include python keywords otherwise a syntax + error could occur. The extra keyword arguments should be given + as python dict. + """ + # if any of the given keyword arguments is a python keyword + # we have to make sure that no invalid call is created. + kwarg_workaround = any( + is_python_keyword(t.cast(str, k)) + for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) + ) + + for arg in node.args: + self.write(", ") + self.visit(arg, frame) + + if not kwarg_workaround: + for kwarg in node.kwargs: + self.write(", ") + self.visit(kwarg, frame) + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f", {key}={value}") + if node.dyn_args: + self.write(", *") + self.visit(node.dyn_args, frame) + + if kwarg_workaround: + if node.dyn_kwargs is not None: + self.write(", **dict({") + else: + self.write(", **{") + for kwarg in node.kwargs: + self.write(f"{kwarg.key!r}: ") + self.visit(kwarg.value, frame) + self.write(", ") + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f"{key!r}: {value}, ") + if node.dyn_kwargs is not None: + self.write("}, **") + self.visit(node.dyn_kwargs, frame) + self.write(")") + else: + self.write("}") + + elif node.dyn_kwargs is not None: + self.write(", **") + self.visit(node.dyn_kwargs, frame) + + def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: + """Find all filter and test names used in the template and + assign them to variables in the compiled namespace. Checking + that the names are registered with the environment is done when + compiling the Filter and Test nodes. If the node is in an If or + CondExpr node, the check is done at runtime instead. + + .. versionchanged:: 3.0 + Filters and tests in If and CondExpr nodes are checked at + runtime instead of compile time. + """ + visitor = DependencyFinderVisitor() + + for node in nodes: + visitor.visit(node) + + for id_map, names, dependency in (self.filters, visitor.filters, "filters"), ( + self.tests, + visitor.tests, + "tests", + ): + for name in sorted(names): + if name not in id_map: + id_map[name] = self.temporary_identifier() + + # add check during runtime that dependencies used inside of executed + # blocks are defined, as this step may be skipped during compile time + self.writeline("try:") + self.indent() + self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") + self.outdent() + self.writeline("except KeyError:") + self.indent() + self.writeline("@internalcode") + self.writeline(f"def {id_map[name]}(*unused):") + self.indent() + self.writeline( + f'raise TemplateRuntimeError("No {dependency[:-1]}' + f' named {name!r} found.")' + ) + self.outdent() + self.outdent() + + def enter_frame(self, frame: Frame) -> None: + undefs = [] + for target, (action, param) in frame.symbols.loads.items(): + if action == VAR_LOAD_PARAMETER: + pass + elif action == VAR_LOAD_RESOLVE: + self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") + elif action == VAR_LOAD_ALIAS: + self.writeline(f"{target} = {param}") + elif action == VAR_LOAD_UNDEFINED: + undefs.append(target) + else: + raise NotImplementedError("unknown load instruction") + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: + if not with_python_scope: + undefs = [] + for target in frame.symbols.loads: + undefs.append(target) + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: + return async_value if self.environment.is_async else sync_value + + def func(self, name: str) -> str: + return f"{self.choose_async()}def {name}" + + def macro_body( + self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame + ) -> t.Tuple[Frame, MacroRef]: + """Dump the function def of a macro or call block.""" + frame = frame.inner() + frame.symbols.analyze_node(node) + macro_ref = MacroRef(node) + + explicit_caller = None + skip_special_params = set() + args = [] + + for idx, arg in enumerate(node.args): + if arg.name == "caller": + explicit_caller = idx + if arg.name in ("kwargs", "varargs"): + skip_special_params.add(arg.name) + args.append(frame.symbols.ref(arg.name)) + + undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) + + if "caller" in undeclared: + # In older Jinja versions there was a bug that allowed caller + # to retain the special behavior even if it was mentioned in + # the argument list. However thankfully this was only really + # working if it was the last argument. So we are explicitly + # checking this now and error out if it is anywhere else in + # the argument list. + if explicit_caller is not None: + try: + node.defaults[explicit_caller - len(node.args)] + except IndexError: + self.fail( + "When defining macros or call blocks the " + 'special "caller" argument must be omitted ' + "or be given a default.", + node.lineno, + ) + else: + args.append(frame.symbols.declare_parameter("caller")) + macro_ref.accesses_caller = True + if "kwargs" in undeclared and "kwargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("kwargs")) + macro_ref.accesses_kwargs = True + if "varargs" in undeclared and "varargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("varargs")) + macro_ref.accesses_varargs = True + + # macros are delayed, they never require output checks + frame.require_output_check = False + frame.symbols.analyze_node(node) + self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) + self.indent() + + self.buffer(frame) + self.enter_frame(frame) + + self.push_parameter_definitions(frame) + for idx, arg in enumerate(node.args): + ref = frame.symbols.ref(arg.name) + self.writeline(f"if {ref} is missing:") + self.indent() + try: + default = node.defaults[idx - len(node.args)] + except IndexError: + self.writeline( + f'{ref} = undefined("parameter {arg.name!r} was not provided",' + f" name={arg.name!r})" + ) + else: + self.writeline(f"{ref} = ") + self.visit(default, frame) + self.mark_parameter_stored(ref) + self.outdent() + self.pop_parameter_definitions() + + self.blockvisit(node.body, frame) + self.return_buffer_contents(frame, force_unescaped=True) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + return frame, macro_ref + + def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: + """Dump the macro definition for the def created by macro_body.""" + arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) + name = getattr(macro_ref.node, "name", None) + if len(macro_ref.node.args) == 1: + arg_tuple += "," + self.write( + f"Macro(environment, macro, {name!r}, ({arg_tuple})," + f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," + f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" + ) + + def position(self, node: nodes.Node) -> str: + """Return a human readable position for the node.""" + rv = f"line {node.lineno}" + if self.name is not None: + rv = f"{rv} in {self.name!r}" + return rv + + def dump_local_context(self, frame: Frame) -> str: + items_kv = ", ".join( + f"{name!r}: {target}" + for name, target in frame.symbols.dump_stores().items() + ) + return f"{{{items_kv}}}" + + def write_commons(self) -> None: + """Writes a common preamble that is used by root and block functions. + Primarily this sets up common local helpers and enforces a generator + through a dead branch. + """ + self.writeline("resolve = context.resolve_or_missing") + self.writeline("undefined = environment.undefined") + self.writeline("concat = environment.concat") + # always use the standard Undefined class for the implicit else of + # conditional expressions + self.writeline("cond_expr_undefined = Undefined") + self.writeline("if 0: yield None") + + def push_parameter_definitions(self, frame: Frame) -> None: + """Pushes all parameter targets from the given frame into a local + stack that permits tracking of yet to be assigned parameters. In + particular this enables the optimization from `visit_Name` to skip + undefined expressions for parameters in macros as macros can reference + otherwise unbound parameters. + """ + self._param_def_block.append(frame.symbols.dump_param_targets()) + + def pop_parameter_definitions(self) -> None: + """Pops the current parameter definitions set.""" + self._param_def_block.pop() + + def mark_parameter_stored(self, target: str) -> None: + """Marks a parameter in the current parameter definitions as stored. + This will skip the enforced undefined checks. + """ + if self._param_def_block: + self._param_def_block[-1].discard(target) + + def push_context_reference(self, target: str) -> None: + self._context_reference_stack.append(target) + + def pop_context_reference(self) -> None: + self._context_reference_stack.pop() + + def get_context_ref(self) -> str: + return self._context_reference_stack[-1] + + def get_resolve_func(self) -> str: + target = self._context_reference_stack[-1] + if target == "context": + return "resolve" + return f"{target}.resolve" + + def derive_context(self, frame: Frame) -> str: + return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" + + def parameter_is_undeclared(self, target: str) -> bool: + """Checks if a given target is an undeclared parameter.""" + if not self._param_def_block: + return False + return target in self._param_def_block[-1] + + def push_assign_tracking(self) -> None: + """Pushes a new layer for assignment tracking.""" + self._assign_stack.append(set()) + + def pop_assign_tracking(self, frame: Frame) -> None: + """Pops the topmost level for assignment tracking and updates the + context variables if necessary. + """ + vars = self._assign_stack.pop() + if ( + not frame.block_frame + and not frame.loop_frame + and not frame.toplevel + or not vars + ): + return + public_names = [x for x in vars if x[:1] != "_"] + if len(vars) == 1: + name = next(iter(vars)) + ref = frame.symbols.ref(name) + if frame.loop_frame: + self.writeline(f"_loop_vars[{name!r}] = {ref}") + return + if frame.block_frame: + self.writeline(f"_block_vars[{name!r}] = {ref}") + return + self.writeline(f"context.vars[{name!r}] = {ref}") + else: + if frame.loop_frame: + self.writeline("_loop_vars.update({") + elif frame.block_frame: + self.writeline("_block_vars.update({") + else: + self.writeline("context.vars.update({") + for idx, name in enumerate(vars): + if idx: + self.write(", ") + ref = frame.symbols.ref(name) + self.write(f"{name!r}: {ref}") + self.write("})") + if not frame.block_frame and not frame.loop_frame and public_names: + if len(public_names) == 1: + self.writeline(f"context.exported_vars.add({public_names[0]!r})") + else: + names_str = ", ".join(map(repr, public_names)) + self.writeline(f"context.exported_vars.update(({names_str}))") + + # -- Statement Visitors + + def visit_Template( + self, node: nodes.Template, frame: t.Optional[Frame] = None + ) -> None: + assert frame is None, "no root frame allowed" + eval_ctx = EvalContext(self.environment, self.name) + + from .runtime import exported, async_exported + + if self.environment.is_async: + exported_names = sorted(exported + async_exported) + else: + exported_names = sorted(exported) + + self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) + + # if we want a deferred initialization we cannot move the + # environment into a local name + envenv = "" if self.defer_init else ", environment=environment" + + # do we have an extends tag at all? If not, we can save some + # overhead by just not processing any inheritance code. + have_extends = node.find(nodes.Extends) is not None + + # find all blocks + for block in node.find_all(nodes.Block): + if block.name in self.blocks: + self.fail(f"block {block.name!r} defined twice", block.lineno) + self.blocks[block.name] = block + + # find all imports and import them + for import_ in node.find_all(nodes.ImportedName): + if import_.importname not in self.import_aliases: + imp = import_.importname + self.import_aliases[imp] = alias = self.temporary_identifier() + if "." in imp: + module, obj = imp.rsplit(".", 1) + self.writeline(f"from {module} import {obj} as {alias}") + else: + self.writeline(f"import {imp} as {alias}") + + # add the load name + self.writeline(f"name = {self.name!r}") + + # generate the root render function. + self.writeline( + f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 + ) + self.indent() + self.write_commons() + + # process the root + frame = Frame(eval_ctx) + if "self" in find_undeclared(node.body, ("self",)): + ref = frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + frame.symbols.analyze_node(node) + frame.toplevel = frame.rootlevel = True + frame.require_output_check = have_extends and not self.has_known_extends + if have_extends: + self.writeline("parent_template = None") + self.enter_frame(frame) + self.pull_dependencies(node.body) + self.blockvisit(node.body, frame) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + # make sure that the parent root is called. + if have_extends: + if not self.has_known_extends: + self.indent() + self.writeline("if parent_template is not None:") + self.indent() + if not self.environment.is_async: + self.writeline("yield from parent_template.root_render_func(context)") + else: + self.writeline( + "async for event in parent_template.root_render_func(context):" + ) + self.indent() + self.writeline("yield event") + self.outdent() + self.outdent(1 + (not self.has_known_extends)) + + # at this point we now have the blocks collected and can visit them too. + for name, block in self.blocks.items(): + self.writeline( + f"{self.func('block_' + name)}(context, missing=missing{envenv}):", + block, + 1, + ) + self.indent() + self.write_commons() + # It's important that we do not make this frame a child of the + # toplevel template. This would cause a variety of + # interesting issues with identifier tracking. + block_frame = Frame(eval_ctx) + block_frame.block_frame = True + undeclared = find_undeclared(block.body, ("self", "super")) + if "self" in undeclared: + ref = block_frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + if "super" in undeclared: + ref = block_frame.symbols.declare_parameter("super") + self.writeline(f"{ref} = context.super({name!r}, block_{name})") + block_frame.symbols.analyze_node(block) + block_frame.block = name + self.writeline("_block_vars = {}") + self.enter_frame(block_frame) + self.pull_dependencies(block.body) + self.blockvisit(block.body, block_frame) + self.leave_frame(block_frame, with_python_scope=True) + self.outdent() + + blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) + self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) + debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) + self.writeline(f"debug_info = {debug_kv_str!r}") + + def visit_Block(self, node: nodes.Block, frame: Frame) -> None: + """Call a block and register it for the template.""" + level = 0 + if frame.toplevel: + # if we know that we are a child template, there is no need to + # check if we are one + if self.has_known_extends: + return + if self.extends_so_far > 0: + self.writeline("if parent_template is None:") + self.indent() + level += 1 + + if node.scoped: + context = self.derive_context(frame) + else: + context = self.get_context_ref() + + if node.required: + self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) + self.indent() + self.writeline( + f'raise TemplateRuntimeError("Required block {node.name!r} not found")', + node, + ) + self.outdent() + + if not self.environment.is_async and frame.buffer is None: + self.writeline( + f"yield from context.blocks[{node.name!r}][0]({context})", node + ) + else: + self.writeline( + f"{self.choose_async()}for event in" + f" context.blocks[{node.name!r}][0]({context}):", + node, + ) + self.indent() + self.simple_write("event", frame) + self.outdent() + + self.outdent(level) + + def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: + """Calls the extender.""" + if not frame.toplevel: + self.fail("cannot use extend from a non top-level scope", node.lineno) + + # if the number of extends statements in general is zero so + # far, we don't have to add a check if something extended + # the template before this one. + if self.extends_so_far > 0: + # if we have a known extends we just add a template runtime + # error into the generated code. We could catch that at compile + # time too, but i welcome it not to confuse users by throwing the + # same error at different times just "because we can". + if not self.has_known_extends: + self.writeline("if parent_template is not None:") + self.indent() + self.writeline('raise TemplateRuntimeError("extended multiple times")') + + # if we have a known extends already we don't need that code here + # as we know that the template execution will end here. + if self.has_known_extends: + raise CompilerExit() + else: + self.outdent() + + self.writeline("parent_template = environment.get_template(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + self.writeline("for name, parent_block in parent_template.blocks.items():") + self.indent() + self.writeline("context.blocks.setdefault(name, []).append(parent_block)") + self.outdent() + + # if this extends statement was in the root level we can take + # advantage of that information and simplify the generated code + # in the top level from this point onwards + if frame.rootlevel: + self.has_known_extends = True + + # and now we have one more + self.extends_so_far += 1 + + def visit_Include(self, node: nodes.Include, frame: Frame) -> None: + """Handles includes.""" + if node.ignore_missing: + self.writeline("try:") + self.indent() + + func_name = "get_or_select_template" + if isinstance(node.template, nodes.Const): + if isinstance(node.template.value, str): + func_name = "get_template" + elif isinstance(node.template.value, (tuple, list)): + func_name = "select_template" + elif isinstance(node.template, (nodes.Tuple, nodes.List)): + func_name = "select_template" + + self.writeline(f"template = environment.{func_name}(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + if node.ignore_missing: + self.outdent() + self.writeline("except TemplateNotFound:") + self.indent() + self.writeline("pass") + self.outdent() + self.writeline("else:") + self.indent() + + skip_event_yield = False + if node.with_context: + self.writeline( + f"{self.choose_async()}for event in template.root_render_func(" + "template.new_context(context.get_all(), True," + f" {self.dump_local_context(frame)})):" + ) + elif self.environment.is_async: + self.writeline( + "for event in (await template._get_default_module_async())" + "._body_stream:" + ) + else: + self.writeline("yield from template._get_default_module()._body_stream") + skip_event_yield = True + + if not skip_event_yield: + self.indent() + self.simple_write("event", frame) + self.outdent() + + if node.ignore_missing: + self.outdent() + + def _import_common( + self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame + ) -> None: + self.write(f"{self.choose_async('await ')}environment.get_template(") + self.visit(node.template, frame) + self.write(f", {self.name!r}).") + + if node.with_context: + f_name = f"make_module{self.choose_async('_async')}" + self.write( + f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" + ) + else: + self.write(f"_get_default_module{self.choose_async('_async')}(context)") + + def visit_Import(self, node: nodes.Import, frame: Frame) -> None: + """Visit regular imports.""" + self.writeline(f"{frame.symbols.ref(node.target)} = ", node) + if frame.toplevel: + self.write(f"context.vars[{node.target!r}] = ") + + self._import_common(node, frame) + + if frame.toplevel and not node.target.startswith("_"): + self.writeline(f"context.exported_vars.discard({node.target!r})") + + def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: + """Visit named imports.""" + self.newline(node) + self.write("included_template = ") + self._import_common(node, frame) + var_names = [] + discarded_names = [] + for name in node.names: + if isinstance(name, tuple): + name, alias = name + else: + alias = name + self.writeline( + f"{frame.symbols.ref(alias)} =" + f" getattr(included_template, {name!r}, missing)" + ) + self.writeline(f"if {frame.symbols.ref(alias)} is missing:") + self.indent() + message = ( + "the template {included_template.__name__!r}" + f" (imported on {self.position(node)})" + f" does not export the requested name {name!r}" + ) + self.writeline( + f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" + ) + self.outdent() + if frame.toplevel: + var_names.append(alias) + if not alias.startswith("_"): + discarded_names.append(alias) + + if var_names: + if len(var_names) == 1: + name = var_names[0] + self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") + else: + names_kv = ", ".join( + f"{name!r}: {frame.symbols.ref(name)}" for name in var_names + ) + self.writeline(f"context.vars.update({{{names_kv}}})") + if discarded_names: + if len(discarded_names) == 1: + self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") + else: + names_str = ", ".join(map(repr, discarded_names)) + self.writeline( + f"context.exported_vars.difference_update(({names_str}))" + ) + + def visit_For(self, node: nodes.For, frame: Frame) -> None: + loop_frame = frame.inner() + loop_frame.loop_frame = True + test_frame = frame.inner() + else_frame = frame.inner() + + # try to figure out if we have an extended loop. An extended loop + # is necessary if the loop is in recursive mode if the special loop + # variable is accessed in the body if the body is a scoped block. + extended_loop = ( + node.recursive + or "loop" + in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) + or any(block.scoped for block in node.find_all(nodes.Block)) + ) + + loop_ref = None + if extended_loop: + loop_ref = loop_frame.symbols.declare_parameter("loop") + + loop_frame.symbols.analyze_node(node, for_branch="body") + if node.else_: + else_frame.symbols.analyze_node(node, for_branch="else") + + if node.test: + loop_filter_func = self.temporary_identifier() + test_frame.symbols.analyze_node(node, for_branch="test") + self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) + self.indent() + self.enter_frame(test_frame) + self.writeline(self.choose_async("async for ", "for ")) + self.visit(node.target, loop_frame) + self.write(" in ") + self.write(self.choose_async("auto_aiter(fiter)", "fiter")) + self.write(":") + self.indent() + self.writeline("if ", node.test) + self.visit(node.test, test_frame) + self.write(":") + self.indent() + self.writeline("yield ") + self.visit(node.target, loop_frame) + self.outdent(3) + self.leave_frame(test_frame, with_python_scope=True) + + # if we don't have an recursive loop we have to find the shadowed + # variables at that point. Because loops can be nested but the loop + # variable is a special one we have to enforce aliasing for it. + if node.recursive: + self.writeline( + f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node + ) + self.indent() + self.buffer(loop_frame) + + # Use the same buffer for the else frame + else_frame.buffer = loop_frame.buffer + + # make sure the loop variable is a special one and raise a template + # assertion error if a loop tries to write to loop + if extended_loop: + self.writeline(f"{loop_ref} = missing") + + for name in node.find_all(nodes.Name): + if name.ctx == "store" and name.name == "loop": + self.fail( + "Can't assign to special loop variable in for-loop target", + name.lineno, + ) + + if node.else_: + iteration_indicator = self.temporary_identifier() + self.writeline(f"{iteration_indicator} = 1") + + self.writeline(self.choose_async("async for ", "for "), node) + self.visit(node.target, loop_frame) + if extended_loop: + self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") + else: + self.write(" in ") + + if node.test: + self.write(f"{loop_filter_func}(") + if node.recursive: + self.write("reciter") + else: + if self.environment.is_async and not extended_loop: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async and not extended_loop: + self.write(")") + if node.test: + self.write(")") + + if node.recursive: + self.write(", undefined, loop_render_func, depth):") + else: + self.write(", undefined):" if extended_loop else ":") + + self.indent() + self.enter_frame(loop_frame) + + self.writeline("_loop_vars = {}") + self.blockvisit(node.body, loop_frame) + if node.else_: + self.writeline(f"{iteration_indicator} = 0") + self.outdent() + self.leave_frame( + loop_frame, with_python_scope=node.recursive and not node.else_ + ) + + if node.else_: + self.writeline(f"if {iteration_indicator}:") + self.indent() + self.enter_frame(else_frame) + self.blockvisit(node.else_, else_frame) + self.leave_frame(else_frame) + self.outdent() + + # if the node was recursive we have to return the buffer contents + # and start the iteration code + if node.recursive: + self.return_buffer_contents(loop_frame) + self.outdent() + self.start_write(frame, node) + self.write(f"{self.choose_async('await ')}loop(") + if self.environment.is_async: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async: + self.write(")") + self.write(", loop)") + self.end_write(frame) + + # at the end of the iteration, clear any assignments made in the + # loop from the top level + if self._assign_stack: + self._assign_stack[-1].difference_update(loop_frame.symbols.stores) + + def visit_If(self, node: nodes.If, frame: Frame) -> None: + if_frame = frame.soft() + self.writeline("if ", node) + self.visit(node.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(node.body, if_frame) + self.outdent() + for elif_ in node.elif_: + self.writeline("elif ", elif_) + self.visit(elif_.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(elif_.body, if_frame) + self.outdent() + if node.else_: + self.writeline("else:") + self.indent() + self.blockvisit(node.else_, if_frame) + self.outdent() + + def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: + macro_frame, macro_ref = self.macro_body(node, frame) + self.newline() + if frame.toplevel: + if not node.name.startswith("_"): + self.write(f"context.exported_vars.add({node.name!r})") + self.writeline(f"context.vars[{node.name!r}] = ") + self.write(f"{frame.symbols.ref(node.name)} = ") + self.macro_def(macro_ref, macro_frame) + + def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: + call_frame, macro_ref = self.macro_body(node, frame) + self.writeline("caller = ") + self.macro_def(macro_ref, call_frame) + self.start_write(frame, node) + self.visit_Call(node.call, frame, forward_caller=True) + self.end_write(frame) + + def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: + filter_frame = frame.inner() + filter_frame.symbols.analyze_node(node) + self.enter_frame(filter_frame) + self.buffer(filter_frame) + self.blockvisit(node.body, filter_frame) + self.start_write(frame, node) + self.visit_Filter(node.filter, filter_frame) + self.end_write(frame) + self.leave_frame(filter_frame) + + def visit_With(self, node: nodes.With, frame: Frame) -> None: + with_frame = frame.inner() + with_frame.symbols.analyze_node(node) + self.enter_frame(with_frame) + for target, expr in zip(node.targets, node.values): + self.newline() + self.visit(target, with_frame) + self.write(" = ") + self.visit(expr, frame) + self.blockvisit(node.body, with_frame) + self.leave_frame(with_frame) + + def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: + self.newline(node) + self.visit(node.node, frame) + + class _FinalizeInfo(t.NamedTuple): + const: t.Optional[t.Callable[..., str]] + src: t.Optional[str] + + @staticmethod + def _default_finalize(value: t.Any) -> t.Any: + """The default finalize function if the environment isn't + configured with one. Or, if the environment has one, this is + called on that function's output for constants. + """ + return str(value) + + _finalize: t.Optional[_FinalizeInfo] = None + + def _make_finalize(self) -> _FinalizeInfo: + """Build the finalize function to be used on constants and at + runtime. Cached so it's only created once for all output nodes. + + Returns a ``namedtuple`` with the following attributes: + + ``const`` + A function to finalize constant data at compile time. + + ``src`` + Source code to output around nodes to be evaluated at + runtime. + """ + if self._finalize is not None: + return self._finalize + + finalize: t.Optional[t.Callable[..., t.Any]] + finalize = default = self._default_finalize + src = None + + if self.environment.finalize: + src = "environment.finalize(" + env_finalize = self.environment.finalize + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(env_finalize) # type: ignore + ) + finalize = None + + if pass_arg is None: + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(value)) + + else: + src = f"{src}{pass_arg}, " + + if pass_arg == "environment": + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(self.environment, value)) + + self._finalize = self._FinalizeInfo(finalize, src) + return self._finalize + + def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: + """Given a group of constant values converted from ``Output`` + child nodes, produce a string to write to the template module + source. + """ + return repr(concat(group)) + + def _output_child_to_const( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> str: + """Try to optimize a child of an ``Output`` node by trying to + convert it to constant, finalized data at compile time. + + If :exc:`Impossible` is raised, the node is not constant and + will be evaluated at runtime. Any other exception will also be + evaluated at runtime for easier debugging. + """ + const = node.as_const(frame.eval_ctx) + + if frame.eval_ctx.autoescape: + const = escape(const) + + # Template data doesn't go through finalize. + if isinstance(node, nodes.TemplateData): + return str(const) + + return finalize.const(const) # type: ignore + + def _output_child_pre( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code before visiting a child of an + ``Output`` node. + """ + if frame.eval_ctx.volatile: + self.write("(escape if context.eval_ctx.autoescape else str)(") + elif frame.eval_ctx.autoescape: + self.write("escape(") + else: + self.write("str(") + + if finalize.src is not None: + self.write(finalize.src) + + def _output_child_post( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code after visiting a child of an + ``Output`` node. + """ + self.write(")") + + if finalize.src is not None: + self.write(")") + + def visit_Output(self, node: nodes.Output, frame: Frame) -> None: + # If an extends is active, don't render outside a block. + if frame.require_output_check: + # A top-level extends is known to exist at compile time. + if self.has_known_extends: + return + + self.writeline("if parent_template is None:") + self.indent() + + finalize = self._make_finalize() + body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] + + # Evaluate constants at compile time if possible. Each item in + # body will be either a list of static data or a node to be + # evaluated at runtime. + for child in node.nodes: + try: + if not ( + # If the finalize function requires runtime context, + # constants can't be evaluated at compile time. + finalize.const + # Unless it's basic template data that won't be + # finalized anyway. + or isinstance(child, nodes.TemplateData) + ): + raise nodes.Impossible() + + const = self._output_child_to_const(child, frame, finalize) + except (nodes.Impossible, Exception): + # The node was not constant and needs to be evaluated at + # runtime. Or another error was raised, which is easier + # to debug at runtime. + body.append(child) + continue + + if body and isinstance(body[-1], list): + body[-1].append(const) + else: + body.append([const]) + + if frame.buffer is not None: + if len(body) == 1: + self.writeline(f"{frame.buffer}.append(") + else: + self.writeline(f"{frame.buffer}.extend((") + + self.indent() + + for item in body: + if isinstance(item, list): + # A group of constant data to join and output. + val = self._output_const_repr(item) + + if frame.buffer is None: + self.writeline("yield " + val) + else: + self.writeline(val + ",") + else: + if frame.buffer is None: + self.writeline("yield ", item) + else: + self.newline(item) + + # A node to be evaluated at runtime. + self._output_child_pre(item, frame, finalize) + self.visit(item, frame) + self._output_child_post(item, frame, finalize) + + if frame.buffer is not None: + self.write(",") + + if frame.buffer is not None: + self.outdent() + self.writeline(")" if len(body) == 1 else "))") + + if frame.require_output_check: + self.outdent() + + def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: + self.push_assign_tracking() + self.newline(node) + self.visit(node.target, frame) + self.write(" = ") + self.visit(node.node, frame) + self.pop_assign_tracking(frame) + + def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: + self.push_assign_tracking() + block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False + block_frame.symbols.analyze_node(node) + self.enter_frame(block_frame) + self.buffer(block_frame) + self.blockvisit(node.body, block_frame) + self.newline(node) + self.visit(node.target, frame) + self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") + if node.filter is not None: + self.visit_Filter(node.filter, block_frame) + else: + self.write(f"concat({block_frame.buffer})") + self.write(")") + self.pop_assign_tracking(frame) + self.leave_frame(block_frame) + + # -- Expression Visitors + + def visit_Name(self, node: nodes.Name, frame: Frame) -> None: + if node.ctx == "store" and ( + frame.toplevel or frame.loop_frame or frame.block_frame + ): + if self._assign_stack: + self._assign_stack[-1].add(node.name) + ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. + if node.ctx == "load": + load = frame.symbols.find_load(ref) + if not ( + load is not None + and load[0] == VAR_LOAD_PARAMETER + and not self.parameter_is_undeclared(ref) + ): + self.write( + f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" + ) + return + + self.write(ref) + + def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: + # NSRefs can only be used to store values; since they use the normal + # `foo.bar` notation they will be parsed as a normal attribute access + # when used anywhere but in a `set` context + ref = frame.symbols.ref(node.name) + self.writeline(f"if not isinstance({ref}, Namespace):") + self.indent() + self.writeline( + "raise TemplateRuntimeError" + '("cannot assign attribute on non-namespace object")' + ) + self.outdent() + self.writeline(f"{ref}[{node.attr!r}]") + + def visit_Const(self, node: nodes.Const, frame: Frame) -> None: + val = node.as_const(frame.eval_ctx) + if isinstance(val, float): + self.write(str(val)) + else: + self.write(repr(val)) + + def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: + try: + self.write(repr(node.as_const(frame.eval_ctx))) + except nodes.Impossible: + self.write( + f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" + ) + + def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: + self.write("(") + idx = -1 + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write(",)" if idx == 0 else ")") + + def visit_List(self, node: nodes.List, frame: Frame) -> None: + self.write("[") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write("]") + + def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: + self.write("{") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item.key, frame) + self.write(": ") + self.visit(item.value, frame) + self.write("}") + + visit_Add = _make_binop("+") + visit_Sub = _make_binop("-") + visit_Mul = _make_binop("*") + visit_Div = _make_binop("/") + visit_FloorDiv = _make_binop("//") + visit_Pow = _make_binop("**") + visit_Mod = _make_binop("%") + visit_And = _make_binop("and") + visit_Or = _make_binop("or") + visit_Pos = _make_unop("+") + visit_Neg = _make_unop("-") + visit_Not = _make_unop("not ") + + @optimizeconst + def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: + if frame.eval_ctx.volatile: + func_name = "(markup_join if context.eval_ctx.volatile else str_join)" + elif frame.eval_ctx.autoescape: + func_name = "markup_join" + else: + func_name = "str_join" + self.write(f"{func_name}((") + for arg in node.nodes: + self.visit(arg, frame) + self.write(", ") + self.write("))") + + @optimizeconst + def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: + self.write("(") + self.visit(node.expr, frame) + for op in node.ops: + self.visit(op, frame) + self.write(")") + + def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: + self.write(f" {operators[node.op]} ") + self.visit(node.expr, frame) + + @optimizeconst + def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getattr(") + self.visit(node.node, frame) + self.write(f", {node.attr!r})") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: + # slices bypass the environment getitem method. + if isinstance(node.arg, nodes.Slice): + self.visit(node.node, frame) + self.write("[") + self.visit(node.arg, frame) + self.write("]") + else: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getitem(") + self.visit(node.node, frame) + self.write(", ") + self.visit(node.arg, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: + if node.start is not None: + self.visit(node.start, frame) + self.write(":") + if node.stop is not None: + self.visit(node.stop, frame) + if node.step is not None: + self.write(":") + self.visit(node.step, frame) + + @contextmanager + def _filter_test_common( + self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool + ) -> t.Iterator[None]: + if self.environment.is_async: + self.write("(await auto_await(") + + if is_filter: + self.write(f"{self.filters[node.name]}(") + func = self.environment.filters.get(node.name) + else: + self.write(f"{self.tests[node.name]}(") + func = self.environment.tests.get(node.name) + + # When inside an If or CondExpr frame, allow the filter to be + # undefined at compile time and only raise an error if it's + # actually called at runtime. See pull_dependencies. + if func is None and not frame.soft_frame: + type_name = "filter" if is_filter else "test" + self.fail(f"No {type_name} named {node.name!r}.", node.lineno) + + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(func) # type: ignore + ) + + if pass_arg is not None: + self.write(f"{pass_arg}, ") + + # Back to the visitor function to handle visiting the target of + # the filter or test. + yield + + self.signature(node, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: + with self._filter_test_common(node, frame, True): + # if the filter node is None we are inside a filter block + # and want to write to the current buffer + if node.node is not None: + self.visit(node.node, frame) + elif frame.eval_ctx.volatile: + self.write( + f"(Markup(concat({frame.buffer}))" + f" if context.eval_ctx.autoescape else concat({frame.buffer}))" + ) + elif frame.eval_ctx.autoescape: + self.write(f"Markup(concat({frame.buffer}))") + else: + self.write(f"concat({frame.buffer})") + + @optimizeconst + def visit_Test(self, node: nodes.Test, frame: Frame) -> None: + with self._filter_test_common(node, frame, False): + self.visit(node.node, frame) + + @optimizeconst + def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: + frame = frame.soft() + + def write_expr2() -> None: + if node.expr2 is not None: + self.visit(node.expr2, frame) + return + + self.write( + f'cond_expr_undefined("the inline if-expression on' + f" {self.position(node)} evaluated to false and no else" + f' section was defined.")' + ) + + self.write("(") + self.visit(node.expr1, frame) + self.write(" if ") + self.visit(node.test, frame) + self.write(" else ") + write_expr2() + self.write(")") + + @optimizeconst + def visit_Call( + self, node: nodes.Call, frame: Frame, forward_caller: bool = False + ) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + if self.environment.sandboxed: + self.write("environment.call(context, ") + else: + self.write("context.call(") + self.visit(node.node, frame) + extra_kwargs = {"caller": "caller"} if forward_caller else None + loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} + block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} + if extra_kwargs: + extra_kwargs.update(loop_kwargs, **block_kwargs) + elif loop_kwargs or block_kwargs: + extra_kwargs = dict(loop_kwargs, **block_kwargs) + self.signature(node, frame, extra_kwargs) + self.write(")") + if self.environment.is_async: + self.write("))") + + def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: + self.write(node.key + "=") + self.visit(node.value, frame) + + # -- Unused nodes for extensions + + def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: + self.write("Markup(") + self.visit(node.expr, frame) + self.write(")") + + def visit_MarkSafeIfAutoescape( + self, node: nodes.MarkSafeIfAutoescape, frame: Frame + ) -> None: + self.write("(Markup if context.eval_ctx.autoescape else identity)(") + self.visit(node.expr, frame) + self.write(")") + + def visit_EnvironmentAttribute( + self, node: nodes.EnvironmentAttribute, frame: Frame + ) -> None: + self.write("environment." + node.name) + + def visit_ExtensionAttribute( + self, node: nodes.ExtensionAttribute, frame: Frame + ) -> None: + self.write(f"environment.extensions[{node.identifier!r}].{node.name}") + + def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: + self.write(self.import_aliases[node.importname]) + + def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: + self.write(node.name) + + def visit_ContextReference( + self, node: nodes.ContextReference, frame: Frame + ) -> None: + self.write("context") + + def visit_DerivedContextReference( + self, node: nodes.DerivedContextReference, frame: Frame + ) -> None: + self.write(self.derive_context(frame)) + + def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: + self.writeline("continue", node) + + def visit_Break(self, node: nodes.Break, frame: Frame) -> None: + self.writeline("break", node) + + def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: + scope_frame = frame.inner() + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + + def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: + ctx = self.temporary_identifier() + self.writeline(f"{ctx} = {self.derive_context(frame)}") + self.writeline(f"{ctx}.vars = ") + self.visit(node.context, frame) + self.push_context_reference(ctx) + + scope_frame = frame.inner(isolated=True) + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + self.pop_context_reference() + + def visit_EvalContextModifier( + self, node: nodes.EvalContextModifier, frame: Frame + ) -> None: + for keyword in node.options: + self.writeline(f"context.eval_ctx.{keyword.key} = ") + self.visit(keyword.value, frame) + try: + val = keyword.value.as_const(frame.eval_ctx) + except nodes.Impossible: + frame.eval_ctx.volatile = True + else: + setattr(frame.eval_ctx, keyword.key, val) + + def visit_ScopedEvalContextModifier( + self, node: nodes.ScopedEvalContextModifier, frame: Frame + ) -> None: + old_ctx_name = self.temporary_identifier() + saved_ctx = frame.eval_ctx.save() + self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") + self.visit_EvalContextModifier(node, frame) + for child in node.body: + self.visit(child, frame) + frame.eval_ctx.revert(saved_ctx) + self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/constants.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/constants.py new file mode 100644 index 000000000..41a1c23b0 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/constants.py @@ -0,0 +1,20 @@ +#: list of lorem ipsum words used by the lipsum() helper function +LOREM_IPSUM_WORDS = """\ +a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at +auctor augue bibendum blandit class commodo condimentum congue consectetuer +consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus +diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend +elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames +faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac +hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum +justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem +luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie +mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non +nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque +penatibus per pharetra phasellus placerat platea porta porttitor posuere +potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus +ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit +sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor +tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices +ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus +viverra volutpat vulputate""" diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/debug.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/debug.py new file mode 100644 index 000000000..7ed7e9297 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/debug.py @@ -0,0 +1,191 @@ +import sys +import typing as t +from types import CodeType +from types import TracebackType + +from .exceptions import TemplateSyntaxError +from .utils import internal_code +from .utils import missing + +if t.TYPE_CHECKING: + from .runtime import Context + + +def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: + """Rewrite the current exception to replace any tracebacks from + within compiled template code with tracebacks that look like they + came from the template source. + + This must be called within an ``except`` block. + + :param source: For ``TemplateSyntaxError``, the original source if + known. + :return: The original exception with the rewritten traceback. + """ + _, exc_value, tb = sys.exc_info() + exc_value = t.cast(BaseException, exc_value) + tb = t.cast(TracebackType, tb) + + if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: + exc_value.translated = True + exc_value.source = source + # Remove the old traceback, otherwise the frames from the + # compiler still show up. + exc_value.with_traceback(None) + # Outside of runtime, so the frame isn't executing template + # code, but it still needs to point at the template. + tb = fake_traceback( + exc_value, None, exc_value.filename or "", exc_value.lineno + ) + else: + # Skip the frame for the render function. + tb = tb.tb_next + + stack = [] + + # Build the stack of traceback object, replacing any in template + # code with the source file and line information. + while tb is not None: + # Skip frames decorated with @internalcode. These are internal + # calls that aren't useful in template debugging output. + if tb.tb_frame.f_code in internal_code: + tb = tb.tb_next + continue + + template = tb.tb_frame.f_globals.get("__jinja_template__") + + if template is not None: + lineno = template.get_corresponding_lineno(tb.tb_lineno) + fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) + stack.append(fake_tb) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + # Assign tb_next in reverse to avoid circular references. + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc_value.with_traceback(tb_next) + + +def fake_traceback( # type: ignore + exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int +) -> TracebackType: + """Produce a new traceback object that looks like it came from the + template source instead of the compiled code. The filename, line + number, and location name will point to the template, and the local + variables will be the current template context. + + :param exc_value: The original exception to be re-raised to create + the new traceback. + :param tb: The original traceback to get the local variables and + code info from. + :param filename: The template filename. + :param lineno: The line number in the template source. + """ + if tb is not None: + # Replace the real locals with the context that would be + # available at that point in the template. + locals = get_template_locals(tb.tb_frame.f_locals) + locals.pop("__jinja_exception__", None) + else: + locals = {} + + globals = { + "__name__": filename, + "__file__": filename, + "__jinja_exception__": exc_value, + } + # Raise an exception at the correct line number. + code: CodeType = compile( + "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" + ) + + # Build a new code object that points to the template file and + # replaces the location with a block name. + location = "template" + + if tb is not None: + function = tb.tb_frame.f_code.co_name + + if function == "root": + location = "top-level template code" + elif function.startswith("block_"): + location = f"block {function[6:]!r}" + + if sys.version_info >= (3, 8): + code = code.replace(co_name=location) + else: + code = CodeType( + code.co_argcount, + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + code.co_code, + code.co_consts, + code.co_names, + code.co_varnames, + code.co_filename, + location, + code.co_firstlineno, + code.co_lnotab, + code.co_freevars, + code.co_cellvars, + ) + + # Execute the new code, which is guaranteed to raise, and return + # the new traceback without this frame. + try: + exec(code, globals, locals) + except BaseException: + return sys.exc_info()[2].tb_next # type: ignore + + +def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: + """Based on the runtime locals, get the context that would be + available at that point in the template. + """ + # Start with the current template context. + ctx: "t.Optional[Context]" = real_locals.get("context") + + if ctx is not None: + data: t.Dict[str, t.Any] = ctx.get_all().copy() + else: + data = {} + + # Might be in a derived context that only sets local variables + # rather than pushing a context. Local variables follow the scheme + # l_depth_name. Find the highest-depth local that has a value for + # each name. + local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} + + for name, value in real_locals.items(): + if not name.startswith("l_") or value is missing: + # Not a template variable, or no longer relevant. + continue + + try: + _, depth_str, name = name.split("_", 2) + depth = int(depth_str) + except ValueError: + continue + + cur_depth = local_overrides.get(name, (-1,))[0] + + if cur_depth < depth: + local_overrides[name] = (depth, value) + + # Modify the context with any derived context. + for name, (_, value) in local_overrides.items(): + if value is missing: + data.pop(name, None) + else: + data[name] = value + + return data diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/defaults.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/defaults.py new file mode 100644 index 000000000..638cad3d2 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/defaults.py @@ -0,0 +1,48 @@ +import typing as t + +from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 +from .tests import TESTS as DEFAULT_TESTS # noqa: F401 +from .utils import Cycler +from .utils import generate_lorem_ipsum +from .utils import Joiner +from .utils import Namespace + +if t.TYPE_CHECKING: + import typing_extensions as te + +# defaults for the parser / lexer +BLOCK_START_STRING = "{%" +BLOCK_END_STRING = "%}" +VARIABLE_START_STRING = "{{" +VARIABLE_END_STRING = "}}" +COMMENT_START_STRING = "{#" +COMMENT_END_STRING = "#}" +LINE_STATEMENT_PREFIX: t.Optional[str] = None +LINE_COMMENT_PREFIX: t.Optional[str] = None +TRIM_BLOCKS = False +LSTRIP_BLOCKS = False +NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" +KEEP_TRAILING_NEWLINE = False + +# default filters, tests and namespace + +DEFAULT_NAMESPACE = { + "range": range, + "dict": dict, + "lipsum": generate_lorem_ipsum, + "cycler": Cycler, + "joiner": Joiner, + "namespace": Namespace, +} + +# default policies +DEFAULT_POLICIES: t.Dict[str, t.Any] = { + "compiler.ascii_str": True, + "urlize.rel": "noopener", + "urlize.target": None, + "urlize.extra_schemes": None, + "truncate.leeway": 5, + "json.dumps_function": None, + "json.dumps_kwargs": {"sort_keys": True}, + "ext.i18n.trimmed": False, +} diff --git a/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/environment.py b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/environment.py new file mode 100644 index 000000000..185d33246 --- /dev/null +++ b/jinja-sql-client/src/main/resources/venv/lib/python3.10/site-packages/jinja2/environment.py @@ -0,0 +1,1667 @@ +"""Classes for managing templates and their runtime and compile time +options. +""" +import os +import typing +import typing as t +import weakref +from collections import ChainMap +from functools import lru_cache +from functools import partial +from functools import reduce +from types import CodeType + +from markupsafe import Markup + +from . import nodes +from .compiler import CodeGenerator +from .compiler import generate +from .defaults import BLOCK_END_STRING +from .defaults import BLOCK_START_STRING +from .defaults import COMMENT_END_STRING +from .defaults import COMMENT_START_STRING +from .defaults import DEFAULT_FILTERS +from .defaults import DEFAULT_NAMESPACE +from .defaults import DEFAULT_POLICIES +from .defaults import DEFAULT_TESTS +from .defaults import KEEP_TRAILING_NEWLINE +from .defaults import LINE_COMMENT_PREFIX +from .defaults import LINE_STATEMENT_PREFIX +from .defaults import LSTRIP_BLOCKS +from .defaults import NEWLINE_SEQUENCE +from .defaults import TRIM_BLOCKS +from .defaults import VARIABLE_END_STRING +from .defaults import VARIABLE_START_STRING +from .exceptions import TemplateNotFound +from .exceptions import TemplateRuntimeError +from .exceptions import TemplatesNotFound +from .exceptions import TemplateSyntaxError +from .exceptions import UndefinedError +from .lexer import get_lexer +from .lexer import Lexer +from .lexer import TokenStream +from .nodes import EvalContext +from .parser import Parser +from .runtime import Context +from .runtime import new_context +from .runtime import Undefined +from .utils import _PassArg +from .utils import concat +from .utils import consume +from .utils import import_string +from .utils import internalcode +from .utils import LRUCache +from .utils import missing + +if t.TYPE_CHECKING: + import typing_extensions as te + from .bccache import BytecodeCache + from .ext import Extension + from .loaders import BaseLoader + +_env_bound = t.TypeVar("_env_bound", bound="Environment") + + +# for direct template usage we have up to ten living environments +@lru_cache(maxsize=10) +def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: + """Return a new spontaneous environment. A spontaneous environment + is used for templates created directly rather than through an + existing environment. + + :param cls: Environment class to create. + :param args: Positional arguments passed to environment. + """ + env = cls(*args) + env.shared = True + return env + + +def create_cache( + size: int, +) -> t.Optional[t.MutableMapping[t.Tuple[weakref.ref, str], "Template"]]: + """Return the cache class for the given size.""" + if size == 0: + return None + + if size < 0: + return {} + + return LRUCache(size) # type: ignore + + +def copy_cache( + cache: t.Optional[t.MutableMapping], +) -> t.Optional[t.MutableMapping[t.Tuple[weakref.ref, str], "Template"]]: + """Create an empty copy of the given cache.""" + if cache is None: + return None + + if type(cache) is dict: + return {} + + return LRUCache(cache.capacity) # type: ignore + + +def load_extensions( + environment: "Environment", + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], +) -> t.Dict[str, "Extension"]: + """Load the extensions from the list and bind it to the environment. + Returns a dict of instantiated extensions. + """ + result = {} + + for extension in extensions: + if isinstance(extension, str): + extension = t.cast(t.Type["Extension"], import_string(extension)) + + result[extension.identifier] = extension(environment) + + return result + + +def _environment_config_check(environment: "Environment") -> "Environment": + """Perform a sanity check on the environment.""" + assert issubclass( + environment.undefined, Undefined + ), "'undefined' must be a subclass of 'jinja2.Undefined'." + assert ( + environment.block_start_string + != environment.variable_start_string + != environment.comment_start_string + ), "block, variable and comment start strings must be different." + assert environment.newline_sequence in { + "\r", + "\r\n", + "\n", + }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." + return environment + + +class Environment: + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if + they are not shared and if no template was loaded so far. + Modifications on environments after the first template was loaded + will lead to surprising effects and undefined behavior. + + Here are the possible initialization parameters: + + `block_start_string` + The string marking the beginning of a block. Defaults to ``'{%'``. + + `block_end_string` + The string marking the end of a block. Defaults to ``'%}'``. + + `variable_start_string` + The string marking the beginning of a print statement. + Defaults to ``'{{'``. + + `variable_end_string` + The string marking the end of a print statement. Defaults to + ``'}}'``. + + `comment_start_string` + The string marking the beginning of a comment. Defaults to ``'{#'``. + + `comment_end_string` + The string marking the end of a comment. Defaults to ``'#}'``. + + `line_statement_prefix` + If given and a string, this will be used as prefix for line based + statements. See also :ref:`line-statements`. + + `line_comment_prefix` + If given and a string, this will be used as prefix for line based + comments. See also :ref:`line-statements`. + + .. versionadded:: 2.2 + + `trim_blocks` + If this is set to ``True`` the first newline after a block is + removed (block, not variable tag!). Defaults to `False`. + + `lstrip_blocks` + If this is set to ``True`` leading spaces and tabs are stripped + from the start of a line to a block. Defaults to `False`. + + `newline_sequence` + The sequence that starts a newline. Must be one of ``'\r'``, + ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a + useful default for Linux and OS X systems as well as web + applications. + + `keep_trailing_newline` + Preserve the trailing newline when rendering templates. + The default is ``False``, which causes a single newline, + if present, to be stripped from the end of the template. + + .. versionadded:: 2.7 + + `extensions` + List of Jinja extensions to use. This can either be import paths + as strings or extension classes. For more information have a + look at :ref:`the extensions documentation `. + + `optimized` + should the optimizer be enabled? Default is ``True``. + + `undefined` + :class:`Undefined` or a subclass of it that is used to represent + undefined values in the template. + + `finalize` + A callable that can be used to process the result of a variable + expression before it is output. For example one can convert + ``None`` implicitly into an empty string here. + + `autoescape` + If set to ``True`` the XML/HTML autoescaping feature is enabled by + default. For more details about autoescaping see + :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also + be a callable that is passed the template name and has to + return ``True`` or ``False`` depending on autoescape should be + enabled by default. + + .. versionchanged:: 2.4 + `autoescape` can now be a function + + `loader` + The template loader for this environment. + + `cache_size` + The size of the cache. Per default this is ``400`` which means + that if more than 400 templates are loaded the loader will clean + out the least recently used template. If the cache size is set to + ``0`` templates are recompiled all the time, if the cache size is + ``-1`` the cache will not be cleaned. + + .. versionchanged:: 2.8 + The cache size was increased to 400 from a low 50. + + `auto_reload` + Some loaders load templates from locations where the template + sources may change (ie: file system or database). If + ``auto_reload`` is set to ``True`` (default) every time a template is + requested the loader checks if the source changed and if yes, it + will reload the template. For higher performance it's possible to + disable that. + + `bytecode_cache` + If set to a bytecode cache object, this object will provide a + cache for the internal Jinja bytecode so that templates don't + have to be parsed if they were not changed. + + See :ref:`bytecode-cache` for more information. + + `enable_async` + If set to true this enables async template execution which + allows using async functions and generators. + """ + + #: if this environment is sandboxed. Modifying this variable won't make + #: the environment sandboxed though. For a real sandboxed environment + #: have a look at jinja2.sandbox. This flag alone controls the code + #: generation by the compiler. + sandboxed = False + + #: True if the environment is just an overlay + overlayed = False + + #: the environment this environment is linked to if it is an overlay + linked_to: t.Optional["Environment"] = None + + #: shared environments have this set to `True`. A shared environment + #: must not be modified + shared = False + + #: the class that is used for code generation. See + #: :class:`~jinja2.compiler.CodeGenerator` for more information. + code_generator_class: t.Type["CodeGenerator"] = CodeGenerator + + concat = "".join + + #: the context class that is used for templates. See + #: :class:`~jinja2.runtime.Context` for more information. + context_class: t.Type[Context] = Context + + template_class: t.Type["Template"] + + def __init__( + self, + block_start_string: str = BLOCK_START_STRING, + block_end_string: str = BLOCK_END_STRING, + variable_start_string: str = VARIABLE_START_STRING, + variable_end_string: str = VARIABLE_END_STRING, + comment_start_string: str = COMMENT_START_STRING, + comment_end_string: str = COMMENT_END_STRING, + line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, + line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, + trim_blocks: bool = TRIM_BLOCKS, + lstrip_blocks: bool = LSTRIP_BLOCKS, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, + keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), + optimized: bool = True, + undefined: t.Type[Undefined] = Undefined, + finalize: t.Optional[t.Callable[..., t.Any]] = None, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, + loader: t.Optional["BaseLoader"] = None, + cache_size: int = 400, + auto_reload: bool = True, + bytecode_cache: t.Optional["BytecodeCache"] = None, + enable_async: bool = False, + ): + # !!Important notice!! + # The constructor accepts quite a few arguments that should be + # passed by keyword rather than position. However it's important to + # not change the order of arguments because it's used at least + # internally in those cases: + # - spontaneous environments (i18n extension and Template) + # - unittests + # If parameter changes are required only add parameters at the end + # and don't change the arguments (or the defaults!) of the arguments + # existing already. + + # lexer / parser information + self.block_start_string = block_start_string + self.block_end_string = block_end_string + self.variable_start_string = variable_start_string + self.variable_end_string = variable_end_string + self.comment_start_string = comment_start_string + self.comment_end_string = comment_end_string + self.line_statement_prefix = line_statement_prefix + self.line_comment_prefix = line_comment_prefix + self.trim_blocks = trim_blocks + self.lstrip_blocks = lstrip_blocks + self.newline_sequence = newline_sequence + self.keep_trailing_newline = keep_trailing_newline + + # runtime information + self.undefined: t.Type[Undefined] = undefined + self.optimized = optimized + self.finalize = finalize + self.autoescape = autoescape + + # defaults + self.filters = DEFAULT_FILTERS.copy() + self.tests = DEFAULT_TESTS.copy() + self.globals = DEFAULT_NAMESPACE.copy() + + # set the loader provided + self.loader = loader + self.cache = create_cache(cache_size) + self.bytecode_cache = bytecode_cache + self.auto_reload = auto_reload + + # configurable policies + self.policies = DEFAULT_POLICIES.copy() + + # load extensions + self.extensions = load_extensions(self, extensions) + + self.is_async = enable_async + _environment_config_check(self) + + def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: + """Adds an extension after the environment was created. + + .. versionadded:: 2.5 + """ + self.extensions.update(load_extensions(self, [extension])) + + def extend(self, **attributes: t.Any) -> None: + """Add the items to the instance of the environment if they do not exist + yet. This is used by :ref:`extensions ` to register + callbacks and configuration values without breaking inheritance. + """ + for key, value in attributes.items(): + if not hasattr(self, key): + setattr(self, key, value) + + def overlay( + self, + block_start_string: str = missing, + block_end_string: str = missing, + variable_start_string: str = missing, + variable_end_string: str = missing, + comment_start_string: str = missing, + comment_end_string: str = missing, + line_statement_prefix: t.Optional[str] = missing, + line_comment_prefix: t.Optional[str] = missing, + trim_blocks: bool = missing, + lstrip_blocks: bool = missing, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, + keep_trailing_newline: bool = missing, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, + optimized: bool = missing, + undefined: t.Type[Undefined] = missing, + finalize: t.Optional[t.Callable[..., t.Any]] = missing, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, + loader: t.Optional["BaseLoader"] = missing, + cache_size: int = missing, + auto_reload: bool = missing, + bytecode_cache: t.Optional["BytecodeCache"] = missing, + enable_async: bool = False, + ) -> "Environment": + """Create a new overlay environment that shares all the data with the + current environment except for cache and the overridden attributes. + Extensions cannot be removed for an overlayed environment. An overlayed + environment automatically gets all the extensions of the environment it + is linked to plus optional extra extensions. + + Creating overlays should happen after the initial environment was set + up completely. Not all attributes are truly linked, some are just + copied over so modifications on the original environment may not shine + through. + + .. versionchanged:: 3.1.2 + Added the ``newline_sequence``,, ``keep_trailing_newline``, + and ``enable_async`` parameters to match ``__init__``. + """ + args = dict(locals()) + del args["self"], args["cache_size"], args["extensions"], args["enable_async"] + + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.overlayed = True + rv.linked_to = self + + for key, value in args.items(): + if value is not missing: + setattr(rv, key, value) + + if cache_size is not missing: + rv.cache = create_cache(cache_size) + else: + rv.cache = copy_cache(self.cache) + + rv.extensions = {} + for key, value in self.extensions.items(): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) + + if enable_async is not missing: + rv.is_async = enable_async + + return _environment_config_check(rv) + + @property + def lexer(self) -> Lexer: + """The lexer for this environment.""" + return get_lexer(self) + + def iter_extensions(self) -> t.Iterator["Extension"]: + """Iterates over the extensions by priority.""" + return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) + + def getitem( + self, obj: t.Any, argument: t.Union[str, t.Any] + ) -> t.Union[t.Any, Undefined]: + """Get an item or attribute of an object but prefer the item.""" + try: + return obj[argument] + except (AttributeError, TypeError, LookupError): + if isinstance(argument, str): + try: + attr = str(argument) + except Exception: + pass + else: + try: + return getattr(obj, attr) + except AttributeError: + pass + return self.undefined(obj=obj, name=argument) + + def getattr(self, obj: t.Any, attribute: str) -> t.Any: + """Get an item or attribute of an object but prefer the attribute. + Unlike :meth:`getitem` the attribute *must* be a string. + """ + try: + return getattr(obj, attribute) + except AttributeError: + pass + try: + return obj[attribute] + except (TypeError, LookupError, AttributeError): + return self.undefined(obj=obj, name=attribute) + + def _filter_test_common( + self, + name: t.Union[str, Undefined], + value: t.Any, + args: t.Optional[t.Sequence[t.Any]], + kwargs: t.Optional[t.Mapping[str, t.Any]], + context: t.Optional[Context], + eval_ctx: t.Optional[EvalContext], + is_filter: bool, + ) -> t.Any: + if is_filter: + env_map = self.filters + type_name = "filter" + else: + env_map = self.tests + type_name = "test" + + func = env_map.get(name) # type: ignore + + if func is None: + msg = f"No {type_name} named {name!r}." + + if isinstance(name, Undefined): + try: + name._fail_with_undefined_error() + except Exception as e: + msg = f"{msg} ({e}; did you forget to quote the callable name?)" + + raise TemplateRuntimeError(msg) + + args = [value, *(args if args is not None else ())] + kwargs = kwargs if kwargs is not None else {} + pass_arg = _PassArg.from_obj(func) + + if pass_arg is _PassArg.context: + if context is None: + raise TemplateRuntimeError( + f"Attempted to invoke a context {type_name} without context." + ) + + args.insert(0, context) + elif pass_arg is _PassArg.eval_context: + if eval_ctx is None: + if context is not None: + eval_ctx = context.eval_ctx + else: + eval_ctx = EvalContext(self) + + args.insert(0, eval_ctx) + elif pass_arg is _PassArg.environment: + args.insert(0, self) + + return func(*args, **kwargs) + + def call_filter( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a filter on a value the same way the compiler does. + + This might return a coroutine if the filter is running from an + environment in async mode and the filter supports async + execution. It's your responsibility to await this if needed. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, True + ) + + def call_test( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a test on a value the same way the compiler does. + + This might return a coroutine if the test is running from an + environment in async mode and the test supports async execution. + It's your responsibility to await this if needed. + + .. versionchanged:: 3.0 + Tests support ``@pass_context``, etc. decorators. Added + the ``context`` and ``eval_ctx`` parameters. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, False + ) + + @internalcode + def parse( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> nodes.Template: + """Parse the sourcecode and return the abstract syntax tree. This + tree of nodes is used by the compiler to convert the template into + executable source- or bytecode. This is useful for debugging or to + extract information from templates. + + If you are :ref:`developing Jinja extensions ` + this gives you a good overview of the node tree generated. + """ + try: + return self._parse(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def _parse( + self, source: str, name: t.Optional[str], filename: t.Optional[str] + ) -> nodes.Template: + """Internal parsing function used by `parse` and `compile`.""" + return Parser(self, source, name, filename).parse() + + def lex( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> t.Iterator[t.Tuple[int, str, str]]: + """Lex the given sourcecode and return a generator that yields + tokens as tuples in the form ``(lineno, token_type, value)``. + This can be useful for :ref:`extension development ` + and debugging templates. + + This does not perform preprocessing. If you want the preprocessing + of the extensions to be applied you have to filter source through + the :meth:`preprocess` method. + """ + source = str(source) + try: + return self.lexer.tokeniter(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def preprocess( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> str: + """Preprocesses the source with all extensions. This is automatically + called for all parsing and compiling methods but *not* for :meth:`lex` + because there you usually only want the actual source tokenized. + """ + return reduce( + lambda s, e: e.preprocess(s, name, filename), + self.iter_extensions(), + str(source), + ) + + def _tokenize( + self, + source: str, + name: t.Optional[str], + filename: t.Optional[str] = None, + state: t.Optional[str] = None, + ) -> TokenStream: + """Called by the parser to do the preprocessing and filtering + for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. + """ + source = self.preprocess(source, name, filename) + stream = self.lexer.tokenize(source, name, filename, state) + + for ext in self.iter_extensions(): + stream = ext.filter_stream(stream) # type: ignore + + if not isinstance(stream, TokenStream): + stream = TokenStream(stream, name, filename) # type: ignore + + return stream + + def _generate( + self, + source: nodes.Template, + name: t.Optional[str], + filename: t.Optional[str], + defer_init: bool = False, + ) -> str: + """Internal hook that can be overridden to hook a different generate + method in. + + .. versionadded:: 2.5 + """ + return generate( # type: ignore + source, + self, + name, + filename, + defer_init=defer_init, + optimized=self.optimized, + ) + + def _compile(self, source: str, filename: str) -> CodeType: + """Internal hook that can be overridden to hook a different compile + method in. + + .. versionadded:: 2.5 + """ + return compile(source, filename, "exec") + + @typing.overload + def compile( # type: ignore + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[False]" = False, + defer_init: bool = False, + ) -> CodeType: + ... + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[True]" = ..., + defer_init: bool = False, + ) -> str: + ... + + @internalcode + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: bool = False, + defer_init: bool = False, + ) -> t.Union[str, CodeType]: + """Compile a node or template source code. The `name` parameter is + the load name of the template after it was joined using + :meth:`join_path` if necessary, not the filename on the file system. + the `filename` parameter is the estimated filename of the template on + the file system. If the template came from a database or memory this + can be omitted. + + The return value of this method is a python code object. If the `raw` + parameter is `True` the return value will be a string with python + code equivalent to the bytecode returned otherwise. This method is + mainly used internally. + + `defer_init` is use internally to aid the module code generator. This + causes the generated code to be able to import without the global + environment variable to be set. + + .. versionadded:: 2.4 + `defer_init` parameter added. + """ + source_hint = None + try: + if isinstance(source, str): + source_hint = source + source = self._parse(source, name, filename) + source = self._generate(source, name, filename, defer_init=defer_init) + if raw: + return source + if filename is None: + filename = "