Skip to content

Commit 0530c96

Browse files
committed
!squash move to query
1 parent 61a5a97 commit 0530c96

File tree

2 files changed

+104
-102
lines changed

2 files changed

+104
-102
lines changed

libvcs/projects/git.py

Lines changed: 1 addition & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@
1515
- [`GitProject.get_git_version`](libvcs.git.GitProject.get_git_version)
1616
""" # NOQA: E501
1717
import dataclasses
18-
import functools
1918
import logging
2019
import pathlib
2120
import re
22-
from typing import Any, Dict, Generic, Optional, TypedDict, TypeVar, Union
21+
from typing import Dict, Optional, TypedDict, Union
2322
from urllib import parse as urlparse
2423

2524
from .. import exc
@@ -28,106 +27,6 @@
2827
logger = logging.getLogger(__name__)
2928

3029

31-
T = TypeVar("T", Any, Any)
32-
33-
34-
def parse_lookup(path, lookup):
35-
"""mykey__endswith("mykey") -> "mykey" else None"""
36-
try:
37-
return path.endswith(lookup) and path.rsplit(lookup)[0]
38-
except Exception:
39-
return None
40-
41-
42-
@functools.total_ordering
43-
@dataclasses.dataclass(eq=False)
44-
class ListQuery(Generic[T]):
45-
data: list[T]
46-
47-
def __eq__(self, other):
48-
return set(self.data) == set(other.data)
49-
50-
def __lt__(self, other):
51-
return set(self.data).issubset(set(other.data))
52-
53-
def filter(self, **kwargs):
54-
if len(kwargs.values()) == 0:
55-
return self
56-
57-
def _filter(obj) -> bool:
58-
for query_lookup, v in kwargs.items():
59-
if (
60-
field := obj.get(parse_lookup(query_lookup, "__contains"), None)
61-
) is not None:
62-
if not field.contains(v):
63-
return False
64-
elif (
65-
field := obj.get(parse_lookup(query_lookup, "__icontains"), None)
66-
) is not None:
67-
if not field.lower().contains(v.lower()):
68-
return False
69-
elif (
70-
field := obj.get(parse_lookup(query_lookup, "__in"), None)
71-
) is not None:
72-
if field not in v:
73-
return False
74-
elif (
75-
field := obj.get(parse_lookup(query_lookup, "__nin"), None)
76-
) is not None:
77-
if field in v:
78-
return False
79-
elif (
80-
field := obj.get(parse_lookup(query_lookup, "__startswith"), None)
81-
) is not None:
82-
if not field.startswith(v):
83-
return False
84-
elif (
85-
field := obj.get(parse_lookup(query_lookup, "__istartswith"), None)
86-
) is not None:
87-
if not obj.lower().startswith(v.lower()):
88-
return False
89-
elif (
90-
field := obj.get(parse_lookup(query_lookup, "__endswith"), None)
91-
) is not None:
92-
if not field.endswith(v):
93-
return False
94-
elif (
95-
field := obj.get(parse_lookup(query_lookup, "__iendswith"), None)
96-
) is not None:
97-
if not field.lower().endswith(v.lower()):
98-
return False
99-
elif (
100-
field := obj.get(parse_lookup(query_lookup, "__regex"), None)
101-
) is not None:
102-
if not re.search(field, v):
103-
return False
104-
elif (
105-
field := obj.get(parse_lookup(query_lookup, "__iregex"), None)
106-
) is not None:
107-
if not re.search(field, v, re.IGNORECASE):
108-
return false
109-
elif (
110-
field := obj.get(parse_lookup(query_lookup, "__iexact"), None)
111-
) is not None:
112-
if not field.lower() != v.lower():
113-
return False
114-
elif (
115-
field := obj.get(parse_lookup(query_lookup, "__exact"), None)
116-
) is not None: # same as else
117-
if field != obj:
118-
return False
119-
else:
120-
if (
121-
field := obj.get(parse_lookup(query_lookup, "__exact"), None)
122-
) is not None: # same as else
123-
if v != obj:
124-
return False
125-
126-
return True
127-
128-
return dataclasses.replace(self, data=[k for k in self.data if _filter(k)])
129-
130-
13130
class GitRemoteDict(TypedDict):
13231
"""For use when hydrating GitProject via dict."""
13332

libvcs/query.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import dataclasses
2+
import functools
3+
import re
4+
from typing import Any, Generic, TypeVar
5+
6+
T = TypeVar("T", Any, Any)
7+
8+
9+
def parse_lookup(path, lookup):
10+
"""mykey__endswith("mykey") -> "mykey" else None"""
11+
try:
12+
return path.endswith(lookup) and path.rsplit(lookup)[0]
13+
except Exception:
14+
return None
15+
16+
17+
@functools.total_ordering
18+
@dataclasses.dataclass(eq=False)
19+
class ListQuery(Generic[T]):
20+
data: list[T]
21+
22+
def __eq__(self, other):
23+
return set(self.data) == set(other.data)
24+
25+
def __lt__(self, other):
26+
return set(self.data).issubset(set(other.data))
27+
28+
def filter(self, **kwargs):
29+
if len(kwargs.values()) == 0:
30+
return self
31+
32+
def _filter(obj) -> bool:
33+
for query_lookup, v in kwargs.items():
34+
if (
35+
field := obj.get(parse_lookup(query_lookup, "__contains"), None)
36+
) is not None:
37+
if not field.contains(v):
38+
return False
39+
elif (
40+
field := obj.get(parse_lookup(query_lookup, "__icontains"), None)
41+
) is not None:
42+
if not field.lower().contains(v.lower()):
43+
return False
44+
elif (
45+
field := obj.get(parse_lookup(query_lookup, "__in"), None)
46+
) is not None:
47+
if field not in v:
48+
return False
49+
elif (
50+
field := obj.get(parse_lookup(query_lookup, "__nin"), None)
51+
) is not None:
52+
if field in v:
53+
return False
54+
elif (
55+
field := obj.get(parse_lookup(query_lookup, "__startswith"), None)
56+
) is not None:
57+
if not field.startswith(v):
58+
return False
59+
elif (
60+
field := obj.get(parse_lookup(query_lookup, "__istartswith"), None)
61+
) is not None:
62+
if not obj.lower().startswith(v.lower()):
63+
return False
64+
elif (
65+
field := obj.get(parse_lookup(query_lookup, "__endswith"), None)
66+
) is not None:
67+
if not field.endswith(v):
68+
return False
69+
elif (
70+
field := obj.get(parse_lookup(query_lookup, "__iendswith"), None)
71+
) is not None:
72+
if not field.lower().endswith(v.lower()):
73+
return False
74+
elif (
75+
field := obj.get(parse_lookup(query_lookup, "__regex"), None)
76+
) is not None:
77+
if not re.search(field, v):
78+
return False
79+
elif (
80+
field := obj.get(parse_lookup(query_lookup, "__iregex"), None)
81+
) is not None:
82+
if not re.search(field, v, re.IGNORECASE):
83+
return False
84+
elif (
85+
field := obj.get(parse_lookup(query_lookup, "__iexact"), None)
86+
) is not None:
87+
if not field.lower() != v.lower():
88+
return False
89+
elif (
90+
field := obj.get(parse_lookup(query_lookup, "__exact"), None)
91+
) is not None: # same as else
92+
if field != obj:
93+
return False
94+
else:
95+
if (
96+
field := obj.get(parse_lookup(query_lookup, "__exact"), None)
97+
) is not None: # same as else
98+
if v != obj:
99+
return False
100+
101+
return True
102+
103+
return dataclasses.replace(self, data=[k for k in self.data if _filter(k)])

0 commit comments

Comments
 (0)