changeset 7:8b9133467904

add unequality operators to filter
author sheep@wintermute
date Wed, 14 Apr 2010 12:38:51 +0200
parents ba0f10adb44b
children 1ad7cf9159dd
files jpath.py
diffstat 1 files changed, 17 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/jpath.py	Wed Apr 14 12:14:55 2010 +0200
+++ b/jpath.py	Wed Apr 14 12:38:51 2010 +0200
@@ -144,16 +144,25 @@
 class FilterToken(Token):
     """(foo=3)"""
 
-    regexp = (r'[(](?P<filter_path>[^(=)]+)\s*=\s*'
+    regexp = (r'[(](?P<filter_path>[^(<=>)!]+)'
+              r'\s*(?P<filter_operator>[<=>]|>=|<=|!=)\s*'
               r'(?P<filter_value>"([^"]|\\")*"|-?[0-9]|true|false)[)]')
     name = '_filter'
     priority = 50
+    op = {
+        '=': operator.eq,
+        '>': operator.gt,
+        '<': operator.lt,
+        '!=': operator.ne,
+        '>=': operator.ge,
+        '<=': operator.le,
+    }
 
-    def __init__(self, _filter, filter_path, filter_value):
+    def __init__(self, _filter, filter_path, filter_operator,  filter_value):
         """
-        >>> FilterToken(r'(foo="b\"ar")', r'foo', r'"b\"ar"').value
+        >>> FilterToken(r'(foo="b\"ar")', r'foo', r'=', r'"b\"ar"').value
         'b"ar'
-        >>> FilterToken(r'(bar=-1)', r'bar', r'-1').value
+        >>> FilterToken(r'(bar=-1)', r'bar', r'=', r'-1').value
         -1
         """
         self.path = filter_path
@@ -163,6 +172,7 @@
             self.value = filter_value == 'true'
         else:
             self.value = int(filter_value)
+        self.operator = filter_operator
 
     def parse(self, tokens, data):
         try:
@@ -175,7 +185,7 @@
         except AttributeError:
             pass
         for item in data:
-            if get(self.path, item) == self.value:
+            if self.op[self.operator](get(self.path, item), self.value):
                 try:
                     for value in token.parse(tokens, item):
                         yield value
@@ -325,6 +335,8 @@
     [[1, 3]]
     >>> get_all('(x=1).y', [{'x':1, 'y':2}, {'x':0, 'y':3}, {'x':1, 'y':4}])
     [2, 4]
+    >>> get_all('(x>0).y', [{'x':1, 'y':2}, {'x':0, 'y':3}, {'x':1, 'y':4}])
+    [2, 4]
     >>> get_all('(x=1).y', [{'x':1, 'y':2}, {'x':0, 'y':3}, {'x':1}])
     [2]
     >>> get_all('..', {'a':1, 'x':[2], 'c':[{'b': '3'}]})