Mercurial > p > roundup > code
annotate roundup/mlink_expr.py @ 8472:224ccb8b49ca
refactor: change some classes to use __slots__
Speed up access to and reduce size of some low level classes. A few
classes in security.py, rest.py are heavily used. But for all, it
prevents adding random properties to lower level classes that people
shouldn't be mucking with. While doing this I found some test cases
accessing an invalid property name and this change caused the cases to
crash.
admin.py:
Use new method Role.props_dict() and Permission.props_dict() where
original code just referenced __dict__ when printing Role/Permission.
mlink_expr.py:
Add slots to multiple classes.
Classes Binary and Unary set real properties/attributes. Classes that
inherit from them (Equals, Empty, Not, Or, And) define empty slots
tuple to eliminate need for __dict__.
Class Expression also gets a slot.
rate_limit.py:
RateLimit and Gcra classes get slots.
A couple of pep8 fixes: sort imports, remove trailing spaces on a
line, remove unused noqa comment.
rest.py:
Add slots to class SimulateFieldStorageFromJson and FsValue
classes. The memory savings from this could be useful as well as
speedier access to the attributes.
security.py:
Add slots to Permission class. To prevent conflict between slot
limit_perm_to_props_only and the class variable of the same name,
rename the class variable to limit_perm_to_props_only_default.
Also define method props_dict() to allow other code to get a dict to
iterate over when checking permissions.
Add slots to class Role along with props_dict() method.
Add slots to class Security. Also have to add explicit __dict__ slot
to support test override of the hasPermission() method. Add
props_dict() method, currently unused, but added for symmetry.
support.py:
TruthDict and PrioList gets slots.
test/test_cgi.py:
Fix incorrect setting of permission property. Was setting
permissions. So testing may not have been doing what we thought it
was. Multiple places found with this typo.
Remove setting of permissions in some places where it should
have no effect on the test and looks like it was just copypasta.
test/test_xmlrpc.py
Remove setting of permissions in some places where it should
have no effect on the test and looks like it was just copypasta.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Mon, 03 Nov 2025 00:13:04 -0500 |
| parents | 741ea8a86012 |
| children |
| rev | line source |
|---|---|
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
1 # |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
2 # Copyright: 2010 Intevation GmbH. |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
3 # 2021 Ralf Schlatterbeck, rsc@runtux.com. |
|
6960
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
4 # |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
5 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
6 # This module is Free Software under the Roundup licensing, |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
7 # see the COPYING.txt file coming with Roundup. |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
8 # |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
9 |
|
8241
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
10 from roundup.exceptions import RoundupException |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
11 from roundup.i18n import _ |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
12 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
13 opcode_names = { |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
14 -2: "not", |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
15 -3: "and", |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
16 -4: "or", |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
17 } |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
18 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
19 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
20 class ExpressionError(RoundupException): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
21 """Takes two arguments. |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
22 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
23 ExpressionError(template, context={}) |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
24 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
25 The repr of ExpressionError is: |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
26 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
27 template % context |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
28 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
29 """ |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
30 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
31 # only works on python 3 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
32 #def __init__(self, *args, context=None): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
33 # super().__init__(*args) |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
34 # self.context = context if isinstance(context, dict) else {} |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
35 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
36 # works python 2 and 3 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
37 def __init__(self, *args, **kwargs): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
38 super(RoundupException, self).__init__(*args) |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
39 self.context = {} |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
40 if 'context' in kwargs and isinstance(kwargs['context'], dict): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
41 self.context = kwargs['context'] |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
42 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
43 # Skip testing for a bad call to ExpressionError |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
44 # keywords = [x for x in list(kwargs) if x != "context"] |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
45 #if len(keywords) != 0: |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
46 # raise ValueError("unknown keyword argument(s) passed to ExpressionError: %s" % keywords) |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
47 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
48 def __str__(self): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
49 try: |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
50 return self.args[0] % self.context |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
51 except KeyError: |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
52 return "%s: context=%s" % (self.args[0], self.context) |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
53 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
54 def __repr__(self): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
55 try: |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
56 return self.args[0] % self.context |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
57 except KeyError: |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
58 return "%s: context=%s" % (self.args[0], self.context) |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
59 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
60 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
61 class Binary: |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
62 |
|
8472
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
63 __slots__ = ("x", "y") |
|
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
64 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
65 def __init__(self, x, y): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
66 self.x = x |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
67 self.y = y |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
68 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
69 def visit(self, visitor): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
70 self.x.visit(visitor) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
71 self.y.visit(visitor) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
72 |
|
6960
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
73 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
74 class Unary: |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
75 |
|
8472
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
76 __slots__ = ("x",) |
|
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
77 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
78 def __init__(self, x): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
79 self.x = x |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
80 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
81 def generate(self, atom): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
82 return atom(self) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
83 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
84 def visit(self, visitor): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
85 self.x.visit(visitor) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
86 |
|
6960
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
87 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
88 class Equals(Unary): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
89 |
|
8472
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
90 __slots__ = () |
|
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
91 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
92 def evaluate(self, v): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
93 return self.x in v |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
94 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
95 def visit(self, visitor): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
96 visitor(self) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
97 |
|
8241
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
98 def __repr__(self): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
99 return "Value %s" % self.x |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
100 |
|
6960
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
101 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
102 class Empty(Unary): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
103 |
|
8472
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
104 __slots__ = () |
|
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
105 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
106 def evaluate(self, v): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
107 return not v |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
108 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
109 def visit(self, visitor): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
110 visitor(self) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
111 |
|
8241
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
112 def __repr__(self): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
113 return "ISEMPTY(-1)" |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
114 |
|
6960
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
115 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
116 class Not(Unary): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
117 |
|
8472
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
118 __slots__ = () |
|
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
119 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
120 def evaluate(self, v): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
121 return not self.x.evaluate(v) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
122 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
123 def generate(self, atom): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
124 return "NOT(%s)" % self.x.generate(atom) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
125 |
|
8241
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
126 def __repr__(self): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
127 return "NOT(%s)" % self.x |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
128 |
|
6960
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
129 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
130 class Or(Binary): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
131 |
|
8472
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
132 __slots__ = () |
|
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
133 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
134 def evaluate(self, v): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
135 return self.x.evaluate(v) or self.y.evaluate(v) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
136 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
137 def generate(self, atom): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
138 return "(%s)OR(%s)" % ( |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
139 self.x.generate(atom), |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
140 self.y.generate(atom)) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
141 |
|
8241
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
142 def __repr__(self): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
143 return "(%s OR %s)" % (self.y, self.x) |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
144 |
|
6960
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
145 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
146 class And(Binary): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
147 |
|
8472
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
148 __slots__ = () |
|
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
149 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
150 def evaluate(self, v): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
151 return self.x.evaluate(v) and self.y.evaluate(v) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
152 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
153 def generate(self, atom): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
154 return "(%s)AND(%s)" % ( |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
155 self.x.generate(atom), |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
156 self.y.generate(atom)) |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
157 |
|
8241
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
158 def __repr__(self): |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
159 return "(%s AND %s)" % (self.y, self.x) |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
160 |
|
6960
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
161 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
162 def compile_expression(opcodes): |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
163 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
164 stack = [] |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
165 push, pop = stack.append, stack.pop |
|
8241
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
166 try: |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
167 for position, opcode in enumerate(opcodes): # noqa: B007 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
168 if opcode == -1: push(Empty(opcode)) # noqa: E271,E701 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
169 elif opcode == -2: push(Not(pop())) # noqa: E701 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
170 elif opcode == -3: push(And(pop(), pop())) # noqa: E701 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
171 elif opcode == -4: push(Or(pop(), pop())) # noqa: E701 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
172 else: push(Equals(opcode)) # noqa: E701 |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
173 except IndexError: |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
174 raise ExpressionError( |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
175 _("There was an error searching %(class)s by %(attr)s using: " |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
176 "%(opcodes)s. " |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
177 "The operator %(opcode)s (%(opcodename)s) at position " |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
178 "%(position)d has too few arguments."), |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
179 context={ |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
180 "opcode": opcode, |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
181 "opcodename": opcode_names[opcode], |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
182 "position": position + 1, |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
183 "opcodes": opcodes, |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
184 }) |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
185 if len(stack) != 1: |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
186 # Too many arguments - I don't think stack can be zero length |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
187 raise ExpressionError( |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
188 _("There was an error searching %(class)s by %(attr)s using: " |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
189 "%(opcodes)s. " |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
190 "There are too many arguments for the existing operators. The " |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
191 "values on the stack are: %(stack)s"), |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
192 context={ |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
193 "opcodes": opcodes, |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
194 "stack": stack, |
|
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
195 }) |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
196 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
197 return pop() |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
198 |
|
6960
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
199 |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
200 class Expression: |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
201 |
|
8472
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
202 __slots__ = ("evaluate",) |
|
224ccb8b49ca
refactor: change some classes to use __slots__
John Rouillard <rouilj@ieee.org>
parents:
8241
diff
changeset
|
203 |
|
6412
a0c0ee3ed8b1
Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6401
diff
changeset
|
204 def __init__(self, v, is_link=False): |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
205 try: |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
206 opcodes = [int(x) for x in v] |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
207 if min(opcodes) >= -1: |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
208 raise ValueError() |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
209 |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
210 compiled = compile_expression(opcodes) |
|
6412
a0c0ee3ed8b1
Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6401
diff
changeset
|
211 if is_link: |
|
a0c0ee3ed8b1
Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6401
diff
changeset
|
212 self.evaluate = lambda x: compiled.evaluate( |
|
8241
741ea8a86012
fix: issue2551374. Error handling for filter expressions.
John Rouillard <rouilj@ieee.org>
parents:
6964
diff
changeset
|
213 (x and [int(x)]) or []) |
|
6412
a0c0ee3ed8b1
Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6401
diff
changeset
|
214 else: |
|
a0c0ee3ed8b1
Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6401
diff
changeset
|
215 self.evaluate = lambda x: compiled.evaluate([int(y) for y in x]) |
|
6964
87af08c75695
catch type error as well.
John Rouillard <rouilj@ieee.org>
parents:
6960
diff
changeset
|
216 except (ValueError, TypeError): |
|
6412
a0c0ee3ed8b1
Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6401
diff
changeset
|
217 if is_link: |
|
a0c0ee3ed8b1
Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6401
diff
changeset
|
218 v = [None if x == '-1' else x for x in v] |
|
a0c0ee3ed8b1
Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6401
diff
changeset
|
219 self.evaluate = lambda x: x in v |
|
a0c0ee3ed8b1
Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6401
diff
changeset
|
220 elif '-1' in v: |
|
6401
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
221 v = [x for x in v if int(x) > 0] |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
222 self.evaluate = lambda x: bool(set(x) & set(v)) or not x |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
223 else: |
|
8bc5faeb7677
Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents:
diff
changeset
|
224 self.evaluate = lambda x: bool(set(x) & set(v)) |
|
6960
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
225 except BaseException: |
|
7b090bb35c25
flake8 fixes - exception handling changed
John Rouillard <rouilj@ieee.org>
parents:
6412
diff
changeset
|
226 raise |
