Skip to content

Instantly share code, notes, and snippets.

@kurtbrose
Created July 17, 2013 09:20
Show Gist options
  • Select an option

  • Save kurtbrose/6019068 to your computer and use it in GitHub Desktop.

Select an option

Save kurtbrose/6019068 to your computer and use it in GitHub Desktop.
parsley RESTful parameter grammar
import parsley
GRAMMAR = '''
digit = :x ?(x in '0123456789') -> x
digit1_9 = :x ?(x in '123456789') -> x
digits = (digit1_9:first <digit*>:rest -> first + rest) | '0'
integer = ('-' | -> ''):sign digits:ds -> int(sign + ds)
alpha_ = :x ?(x.isalpha() or x == '_') -> x
alphanum_ = :x ?(x.isalnum() or x == '_') -> x
varname = alpha_:first <alphanum_*>:rest -> first + rest
index = '[' integer:i ']' -> i
pathseg = varname:name index?:i -> (name, i)
path = pathseg:first ('.' pathseg)*:rest -> [first] + rest
urlchar = :a ?(a not in "{}/?&") -> a
urlseg = <urlchar+>:e | '{' path:e '}' -> e
query_param = varname:name '={' path:dest '}' -> (name, dest)
query_part = '?' query_param:first ('&' query_param)*:rest -> dict([first] + rest)
url = urlseg:first ('/' urlseg)*:rest query_part?:query -> [first] + rest + [query]
'''
g = parsley.makeGrammar(GRAMMAR, {})
print g("url1/{a1[-3].b2[-3].c3.d4}/url2?a={b}&c={d}").url()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment