Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ from py2vega import py2vega, Variable

py2vega('3 if value > 0 else 4', whitelist=['value']) # Returns "value > 0 ? 3 : 4"
py2vega('3 if my_variable > 0 else 4', whitelist=['value']) # Raises a SyntaxError, `my_variable` is not whitelisted

# Allow any member access on `value`
py2vega('3 if value.member1 > value.member2 else 4', whitelist=[Variable('value')]) # Returns "value.member1 > value.member2 ? 3 : 4"

# Restrict member access explicitly
py2vega('3 if value.member1 > value.member2 else 4', whitelist=[Variable('value', ['member1', 'member2'])]) # Returns "value.member1 > value.member2 ? 3 : 4"
py2vega('3 if value.member3 > 0 else 4', whitelist=[Variable('value', ['member1', 'member2'])]) # Raises a SyntaxError, `value.member3` is not whitelisted`
```
Expand Down
12 changes: 10 additions & 2 deletions py2vega/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,13 @@
class Variable():
"""Helper class for defining a variable in whitelisting."""

def __init__(self, name, members):
"""Construct a Variable, given its name and available members."""
def __init__(self, name, members=None):
"""Construct a Variable, given its name and available members.

If members is None, all direct members are allowed. This is useful for
dynamic objects such as Vega's `datum`, where available field names are
data-dependent and not known ahead of time."""

self.name = name
self.members = members

Expand Down Expand Up @@ -76,6 +81,9 @@ def validate(nodes, origin_node):

def valid_attribute_impl(node, var):
"""Check the attribute access validity. Returns True if the member access is valid, False otherwise."""
if var.members is None:
return True

if node.value.id == var.name and node.attr in var.members:
return True

Expand Down
3 changes: 3 additions & 0 deletions test/test_py2vega.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,9 @@ def test_attribute():

assert py2vega('3 if value.member1 > value.member2 else 4', whitelist=[Variable('value', ['member1', 'member2'])]) == "((value.member1 > value.member2) ? 3 : 4)"

# Variable without explicit members# Variable without explicit members
assert py2vega("'red' if datum.code > 80 else 'blue'", whitelist=[Variable("datum")], ) == "((datum.code > 80) ? 'red' : 'blue')"

# Nested member access
whitelisted_vars = [Variable('nested_var', [Variable('var', ['test']), 'x'])]

Expand Down
Loading