diff --git a/python/ql/lib/semmle/python/frameworks/Invoke.qll b/python/ql/lib/semmle/python/frameworks/Invoke.qll index 30637610ac9..0f00198db80 100644 --- a/python/ql/lib/semmle/python/frameworks/Invoke.qll +++ b/python/ql/lib/semmle/python/frameworks/Invoke.qll @@ -7,12 +7,15 @@ private import python private import semmle.python.dataflow.new.DataFlow private import semmle.python.Concepts private import semmle.python.ApiGraphs +private import semmle.python.frameworks.data.ModelsAsData /** + * INTERNAL: Do not use. + * * Provides models for the `invoke` PyPI package. * See https://www.pyinvoke.org/. */ -private module Invoke { +module Invoke { // --------------------------------------------------------------------------- // invoke // --------------------------------------------------------------------------- @@ -30,6 +33,8 @@ private module Invoke { result = API::moduleImport("invoke").getMember("context").getMember("Context") or result = API::moduleImport("invoke").getMember("Context") + or + result = ModelOutput::getATypeNode("invoke.context.Context~Subclass").getASubclass*() } /** Gets a reference to an instance of `invoke.context.Context`. */ diff --git a/python/ql/src/meta/ClassHierarchy/Find.ql b/python/ql/src/meta/ClassHierarchy/Find.ql index 6244cf1db0e..23057c1bfc5 100644 --- a/python/ql/src/meta/ClassHierarchy/Find.ql +++ b/python/ql/src/meta/ClassHierarchy/Find.ql @@ -19,6 +19,7 @@ private import semmle.python.frameworks.ClickhouseDriver private import semmle.python.frameworks.Aiohttp private import semmle.python.frameworks.Fabric private import semmle.python.frameworks.Httpx +private import semmle.python.frameworks.Invoke import semmle.python.frameworks.data.internal.ApiGraphModelsExtensions as Extensions class FlaskViewClasses extends FindSubclassesSpec { @@ -294,6 +295,14 @@ class HttpxClient extends FindSubclassesSpec { override API::Node getAlreadyModeledClass() { result = HttpxModel::Client::classRef() } } +class InvokeContext extends FindSubclassesSpec { + InvokeContext() { this = "invoke.context.Context~Subclass" } + + override API::Node getAlreadyModeledClass() { + result = Invoke::InvokeModule::Context::ContextClass::classRef() + } +} + bindingset[fullyQualified] predicate fullyQualifiedToYamlFormat(string fullyQualified, string type2, string path) { exists(int firstDot | firstDot = fullyQualified.indexOf(".", 0, 0) |