Skip to main content

A tool to syntactically query Python source code

Project description

Presearch

A Python program to syntactically query Python source code

Instalation

  1. Clone the repository by running git clone https://github.com/dignissimus/presearch
  2. Install the requirements using pip install -r requirements.txt

Usage

Currently the program can be run by executing python -m presearch

usage: presearch [-h] --file FILE directory

Syntactically query python source code

positional arguments:
  directory             The directory containing the source code to query

options:
  -h, --help            show this help message and exit
  --file FILE, -f FILE  The file containing query to execute

Examples

Finding files that import the ast library

The following query matches files that import the ast library

from presearch.query import MatchQuery

# Matches files that import the `ast` library
query = MatchQuery(lambda module: module.imports("ast"))

Finding classes that explicitly define __init__

The following query searches for class definitions, then reports back with the number of those class definitions that explicitly define __init__.

from presearch.tree import ClassDef
from presearch.query import Domain, StatisticalQuery

# Calculates the percentage of classes that define `__init__`
query = StatisticalQuery(
    lambda klass: klass.defines("__init__"),
    domain=Domain(ClassDef),
    domain_description="class definitions",
    match_description="classes that explicitly define __init__",
)

Finding __init__ definitions that directly store all of their non-self arguments as attributes

This query finds all classes that define __init__ then reports the number of __init__ definitions that assign all of its arguments to attributes (i.e. run self.argument = argument for all arguments)

from presearch.query import Domain, StatisticalQuery
from presearch.constraints import ContainsMethodDefinition
from presearch.tree import ClassDef, Self


def assigns_all_arguments_to_attributes(class_def):
    init_function = class_def.function("__init__")
    for argument in init_function.non_self_arguments:
        if not init_function.contains(Self.attribute(argument.name).assign(argument)):
            return False

    return True


# Calculates the proportion of class `__init__` definitions
# that assign all their non-self arguments as attributes
query = StatisticalQuery(
    assigns_all_arguments_to_attributes,
    domain=Domain(ClassDef, constraints=[ContainsMethodDefinition("__init__")]),
    domain_description="classes defining __init__",
    match_description="classes whose __init__ functions assigned all non-self arguments as attributes",
)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

presearch-0.0.1.tar.gz (18.6 kB view hashes)

Uploaded Source

Built Distribution

presearch-0.0.1-py3-none-any.whl (19.4 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page