Skip to main content

RegEx based router

Project description

A RegEx based router

rerouter routes string commands to annotated functions.

How to define the 'grammar':

"Grammar" is the pattern that tells rerouter which handler a string command should be routed to.

For example, github slack client supports slash commands like:

subscribe user/repo +label:"teams/designers" +label:"urgent"
subscribe user/repo commits:myBranch author:"hotfix"
close [issue link]
open [pull request link]

Suppose we want to build a router that routes various command to different handlers, we can do:

router = RegExRouter()


@router.route("subscribe <user_repo> [<option(+label|commits|author)>:<value>]+")
def handle_subscribe(rns, *args, **kwargs):
    """Handle commands like:

    subscribe user/repo +label:"teams/designers" +label:"urgent"
    subscribe user/repo commits:myBranch author:"hotfix"    
    """
    pass


@router.route("(close|open) [link:<link_url>]+")
def handle_open_close(rns, *args, **kwargs):
    """Handle commands like:
    
    close [issue link]
    open [pull request link]    
    """
    pass

More examples:

@router.route("settings (set|get|delete) project:<jira_project>")
def f_settings(rns, *args, **kwargs):
   """Matches:
   
   settings set project:TEST-PROJ
   settings get project:TEST-PROJ
   settings delete project:TEST-PROJ
   """
   pass


@router.routex(
    ("(subscribe)", ""),
    ("(?P<feature>reviews|pushes|checks)", ""),
    (
        "(?P<filter_name>[+-]path|[+-]fork|[+-]branch|[+-]reviewer):(?P<filter_value>[^:]+)",  # noqa
        "+",
    ),
)
def f_subscribe(rns):
   """Matches:
   
   subscribe reviews +path:foo/bar/* -fork:main/release +path:infra/tools/*
   subscribe pushes path:foo/bar/* fork:main/release path:infra/tools/*  
   """
   pass


@router.route("a+ b")
@router.route("a* c* b")
def f_abc(rns, *args, **kwargs):
   """Matches:
   
   aa
   ab
   aab
   aaab
   acb
   aacb
   cb
   ccb
   """
   pass

How to start routing:

This is done by calling the RegExRouter::route_to method, example:

router = RegExRouter()


@router.route("hello <user>")
def handle_subscribe(rns, *args, **kwargs):
    return rns.named("user")

res = router.route_to("hello world") # res == 'world'

Behind the scene, rerouter translates the routing syntax into a list of regex patterns, aka:

grammar: (close|open) [link:<link_url>]+
re patterns: 1. (close|open);
2. (link):(^(?P<{link_url}>[^:]+)$)

In the callback function, the rns is a RegExRouteMatch object which has the following properties:

  1. conclusion: bool: whether the grammar match the command. (for annotation use cases, this is always true)
  2. matches: a list of RegEx match objects, for example, command: close https://example.com will be routed to handle_open_close(...)and the matches will be
    1. <re.Match object, match='close'>
    2. <re.Match object, match='http://example.com''>
  3. grammar: the grammar which the command matches, in our example, its value is (close|open) [link:<link_url>]+

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

rerouter-0.0.2.tar.gz (13.6 kB view details)

Uploaded Source

Built Distribution

rerouter-0.0.2-py3-none-any.whl (10.4 kB view details)

Uploaded Python 3

File details

Details for the file rerouter-0.0.2.tar.gz.

File metadata

  • Download URL: rerouter-0.0.2.tar.gz
  • Upload date:
  • Size: 13.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for rerouter-0.0.2.tar.gz
Algorithm Hash digest
SHA256 ae867eee6f7d8f7ec6e2d3fed8979f8492988936d5585ba673a32f7b6587c8e2
MD5 909c130152022c92e026b763392ab741
BLAKE2b-256 dd617e88839a0bd9cd9418d0a994e0fbd2d55ca50f93d88121abb89f7ad5e590

See more details on using hashes here.

File details

Details for the file rerouter-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: rerouter-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 10.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for rerouter-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 95903bf2af7630340a5362b478b41886a9abdd112a7f4fe116091c49179a13f9
MD5 afb842a954c9ab9134d70588f1388e36
BLAKE2b-256 9f4b19d4bcbc138e0add515728666dc3199e5256dd194598692a9893c38c66b6

See more details on using hashes here.

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