diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 5df108f..040c9ff 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -17,6 +17,7 @@ RUN if [ "${REINSTALL_CMAKE_VERSION_FROM_SOURCE}" != "none" ]; then \ # [Optional] Uncomment this section to install additional packages. # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ # && apt-get -y install --no-install-recommends -RUN apt update && export DEBIAN_FRONTEND=noninteractive && apt -y install clangd-19 clang-tidy-19 python3-pip +RUN apt update && export DEBIAN_FRONTEND=noninteractive && apt -y install clangd-19 clang-tidy-19 python3-pip python3.12-venv RUN update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-19 100 RUN update-alternatives --install /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-19 100 + diff --git a/py/requirements.txt b/py/requirements.txt index 321477a..ddf155b 100644 --- a/py/requirements.txt +++ b/py/requirements.txt @@ -1,2 +1,2 @@ semver >= 3.0 -jsonlogic-py == 0.2 +jsonlogic-py == 0.2.1 \ No newline at end of file diff --git a/py/src/clippy/backends/serialization.py b/py/src/clippy/backends/serialization.py index 7a8f626..f1f8257 100644 --- a/py/src/clippy/backends/serialization.py +++ b/py/src/clippy/backends/serialization.py @@ -118,7 +118,7 @@ def encode_clippy_json(o: Any) -> Any: json encoder that is clippy-object aware. """ if isinstance(o, jl.Operand): # expression or variable - return {"expression_type": "jsonlogic", "rule": o.prepare()} + return {"expression_type": "jsonlogic", "rule": o._prepare()} return o diff --git a/py/src/clippy/selectors.py b/py/src/clippy/selectors.py index 5854606..f30d7c4 100644 --- a/py/src/clippy/selectors.py +++ b/py/src/clippy/selectors.py @@ -13,51 +13,51 @@ class Selector(jl.Variable): def __init__(self, parent: Selector | None, name: str, docstr: str): super().__init__(name, docstr) # op and o2 are None to represent this as a variable. - self.parent = parent - self.name = name - self.fullname: str = self.name if self.parent is None else f"{self.parent.fullname}.{self.name}" - self.subselectors: set[Selector] = set() + self._parent = parent + self._name = name + self._fullname: str = self._name if self._parent is None else f"{self._parent._fullname}.{self._name}" + self._subselectors: set[Selector] = set() def __hash__(self): - return hash(self.fullname) + return hash(self._fullname) - def prepare(self): - return {"var": self.fullname} + def _prepare(self): + return {"var": self._fullname} - def hierarchy(self, acc: list[tuple[str, str]] | None = None): + def _hierarchy(self, acc: list[tuple[str, str]] | None = None): if acc is None: acc = [] - acc.append((self.fullname, self.__doc__ or "")) - for subsel in self.subselectors: - subsel.hierarchy(acc) + acc.append((self._fullname, self.__doc__ or "")) + for subsel in self._subselectors: + subsel._hierarchy(acc) return acc - def describe(self): - hier = self.hierarchy() + def _describe(self): + hier = self._hierarchy() maxlen = max(len(sub_desc[0]) for sub_desc in hier) return "\n".join(f"{sub_desc[0]:<{maxlen + 2}} {sub_desc[1]}" for sub_desc in hier) def __str__(self): - return repr(self.prepare()) + return repr(self._prepare()) - def to_serial(self): - return {"var": self.fullname} + def _to_serial(self): + return {"var": self._fullname} def _add_subselector(self, name: str, docstr: str): """add a subselector to this selector""" subsel = Selector(self, name, docstr) setattr(self, name, subsel) - self.subselectors.add(subsel) + self._subselectors.add(subsel) def _del_subselector(self, name: str): delattr(self, name) - self.subselectors.remove(getattr(self, name)) + self._subselectors.remove(getattr(self, name)) def _clear_subselectors(self): """removes all subselectors""" - for subsel in self.subselectors: - delattr(self, subsel.name) - self.subselectors = set() + for subsel in self._subselectors: + delattr(self, subsel._name) + self._subselectors = set() def _import_from_dict(self, d: AnyDict, merge: bool = False): """Imports subselectors from a dictionary.