Skip to content

Instantly share code, notes, and snippets.

@RickyCook
Last active January 3, 2016 07:29
Show Gist options
  • Save RickyCook/8429386 to your computer and use it in GitHub Desktop.
Save RickyCook/8429386 to your computer and use it in GitHub Desktop.
List a Django app's urlpatterns in a table
#
# General setup
# Import your app and set APP_URLS to your urlpatterns
#
import iss.urls
APP_URLS = iss.urls.urlpatterns
from url_levels import url_levels
out = url_levels(APP_URLS)
#
# IPython Notebook with pandas
#
import pandas
from IPython.display import HTML
HTML(pandas.DataFrame(out).to_html())
#
# Terminal
# See https://github.com/RickyCook/pptable for pptable.py
#
from pptable import pptable
pptable(out)
"""
List a Django app's urlpatterns.
This is better, in some ways, than ./manage.py show_urls, as it shows
the full regexes that match.
"""
def url_levels(pat, prefix=None):
"""
Compile a list of all Django url patterns in a formatted array
"""
if prefix is None:
prefix = []
try:
all = []
loop_list = pat
if hasattr(pat, 'url_patterns'):
loop_list = pat.url_patterns
for url in loop_list:
all += url_levels(url, prefix + [url.regex.pattern])
return all
except TypeError:
return [prefix]
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "URL Patterns"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": "import iss.urls\nAPP_URLS = iss.urls.urlpatterns ",
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "List a Django app's urlpatterns"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "This is better, in some ways, than `./manage.py show_urls`, as it shows the full regexes that match."
},
{
"cell_type": "code",
"collapsed": false,
"input": "def url_levels(pat, prefix=None):\n \"\"\"\n Compile a list of all Django url patterns in a formatted array\n \"\"\"\n if prefix is None:\n prefix = []\n try:\n all = []\n \n loop_list = pat\n if hasattr(pat, 'url_patterns'):\n loop_list = pat.url_patterns\n \n for url in loop_list:\n all += url_levels(url, prefix + [url.regex.pattern])\n \n return all\n except TypeError:\n return [prefix]",
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "IPython Notebook with pandas"
},
{
"cell_type": "code",
"collapsed": false,
"input": "import pandas\nfrom IPython.display import HTML\n\nHTML(pandas.DataFrame(url_levels(APP_URLS)).to_html())",
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "Terminal"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "`pptable` at https://gist.github.com/RickyCook/8428938"
},
{
"cell_type": "code",
"collapsed": false,
"input": "def getindex(lst, idx, default=None):\n \"\"\"\n Get index from list, or default\n \"\"\"\n try:\n return lst[idx]\n except IndexError:\n return default\n\ndef pprow(row, widths):\n \"\"\"\n Print a table row, padding columns where necessary\n \"\"\"\n print \"| \" + \" | \".join(\n \"{:{}}\".format(col_val, widths[col_idx])\n for col_idx, col_val\n in enumerate(row)\n ) + \" |\"\n\ndef pptable(table):\n \"\"\"\n Print a formatted table\n\n pptable([\n ('a', 'b', 'c'),\n ('aa', 'bb', 'cc'),\n ])\n\n | 0 | 1 | 2 |\n | a | b | c |\n | aa | bb | cc |\n \"\"\"\n max_cols = max(len(row) for row in table)\n col_indexes = xrange(0, max_cols)\n\n # Normalize the table columns\n table = [[getindex(row, idx, '') for idx in col_indexes]\n for row in table\n ]\n\n # Get col widths\n col_width = [max(len(row)\n for row\n in (i[j] for i in table)\n )\n for j in col_indexes\n ]\n\n # Print header, data\n pprow(col_indexes, col_width)\n for row in table:\n pprow(row, col_width)",
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": "pptable(url_levels(APP_URLS))",
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment