|
10 | 10 |
|
11 | 11 | from .exception import ParserException |
12 | 12 | from .device_identifier import DeviceIdentifier |
13 | | - |
| 13 | +from .driver import Driver |
| 14 | +from .cache import * |
| 15 | +import fnmatch |
14 | 16 |
|
15 | 17 | class Device: |
16 | 18 | def __init__(self, |
17 | 19 | identifier: DeviceIdentifier, |
18 | 20 | device_file): |
19 | 21 | self._identifier = identifier.copy() |
20 | | - self.naming_schema = identifier.naming_schema |
21 | 22 | self.partname = identifier.string |
22 | | - self.device_file = device_file |
23 | | - |
| 23 | + self._device_file = device_file |
24 | 24 | self.__properties = None |
25 | 25 |
|
26 | 26 | @property |
27 | 27 | def _properties(self): |
28 | 28 | if self.__properties is None: |
29 | | - self.__properties = self.device_file.get_properties(self._identifier) |
| 29 | + self.__properties = self._device_file.get_properties(self._identifier) |
30 | 30 | return self.__properties |
31 | 31 |
|
32 | | - @property |
33 | | - def identifier(self): |
34 | | - return self._identifier |
35 | | - |
36 | | - def get_all_drivers(self, name): |
37 | | - parts = name.split(":") |
| 32 | + def _find_drivers(self, *patterns): |
38 | 33 | results = [] |
| 34 | + for pattern in patterns: |
| 35 | + parts = pattern.split(":") |
39 | 36 |
|
40 | | - if len(parts) == 1: |
41 | | - results = [d for d in self._properties["driver"] if d["name"] == parts[0]] |
42 | | - elif len(parts) == 2: |
43 | | - find_all = (parts[1][-1] == '*') |
44 | | - for driver in self._properties["driver"]: |
45 | | - if driver["name"] == parts[0] and \ |
46 | | - ((find_all and driver["type"].startswith(parts[1][:-1])) or |
47 | | - (not find_all and driver["type"] == parts[1])): |
48 | | - results.append(driver) |
49 | | - else: |
50 | | - raise ParserException("Invalid driver name '{}'. " |
51 | | - "The name must contain no or one ':' to " |
52 | | - "separate type and name.".format(name)) |
| 37 | + if len(parts) == 1: |
| 38 | + results.extend(d for d in self._properties["driver"] |
| 39 | + if fnmatch.fnmatch(d["name"], parts[0])) |
| 40 | + elif len(parts) == 2: |
| 41 | + results.extend(d for d in self._properties["driver"] |
| 42 | + if (fnmatch.fnmatch(d["name"], parts[0]) and |
| 43 | + fnmatch.fnmatch(d["type"], parts[1]))) |
| 44 | + else: |
| 45 | + raise ParserException("Invalid driver pattern '{}'. " |
| 46 | + "The name must contain no or one ':' to " |
| 47 | + "separate `name:type` pattern.".format(parts)) |
53 | 48 |
|
54 | 49 | return results |
55 | 50 |
|
56 | | - def get_driver(self, name): |
57 | | - results = self.get_all_drivers(name) |
| 51 | + def _find_first_driver(self, *patterns): |
| 52 | + results = self._find_drivers(*patterns) |
58 | 53 | return results[0] if len(results) else None |
59 | 54 |
|
60 | | - def has_driver(self, name, type: list = []): |
61 | | - if len(type) == 0: |
62 | | - return self.get_driver(name) is not None |
| 55 | + @property |
| 56 | + def did(self): |
| 57 | + return self._identifier |
| 58 | + |
| 59 | + @cached_function |
| 60 | + def driver(self, name): |
| 61 | + return Driver(self, self._find_first_driver(name)) |
| 62 | + |
| 63 | + def drivers(self, *names): |
| 64 | + return [Driver(self, d) for d in self._find_drivers(*names)] |
63 | 65 |
|
64 | | - if ':' in name: |
65 | | - raise ParserException("Invalid driver name '{}'. " |
66 | | - "The name must contain no ':' when using the " |
67 | | - "compatible argument.".format(name)) |
| 66 | + def has_driver(self, *names): |
| 67 | + return len(self._find_drivers(*names)) |
68 | 68 |
|
69 | | - return any(self.get_driver(name + ':' + c) is not None for c in type) |
| 69 | + # Deprecated stuff |
| 70 | + def get_driver(self, pattern): |
| 71 | + return self._find_first_driver(pattern) |
70 | 72 |
|
71 | | - def __str__(self): |
72 | | - return self.partname |
| 73 | + def get_all_drivers(self, *patterns): |
| 74 | + return self._find_drivers(*patterns) |
| 75 | + |
| 76 | + @property |
| 77 | + def identifier(self): |
| 78 | + return self.did |
0 commit comments