ransacklib 1.1.0.dev2__tar.gz → 1.1.0.dev3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. {ransacklib-1.1.0.dev2/ransacklib.egg-info → ransacklib-1.1.0.dev3}/PKG-INFO +1 -1
  2. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/pyproject.toml +1 -1
  3. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/operator.py +26 -0
  4. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/transformer.py +30 -0
  5. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3/ransacklib.egg-info}/PKG-INFO +1 -1
  6. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/LICENSE +0 -0
  7. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/README.rst +0 -0
  8. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/__init__.py +0 -0
  9. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/exceptions.py +0 -0
  10. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/function.py +0 -0
  11. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/parser.py +0 -0
  12. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/py.typed +0 -0
  13. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransacklib.egg-info/SOURCES.txt +0 -0
  14. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransacklib.egg-info/dependency_links.txt +0 -0
  15. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransacklib.egg-info/requires.txt +0 -0
  16. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransacklib.egg-info/top_level.txt +0 -0
  17. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/setup.cfg +0 -0
  18. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/tests/test_operator.py +0 -0
  19. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/tests/test_parser.py +0 -0
  20. {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/tests/test_transformer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ransacklib
3
- Version: 1.1.0.dev2
3
+ Version: 1.1.0.dev3
4
4
  Summary: A modern, extensible language for manipulation with structured data
5
5
  Author-email: "Rajmund H. Hruška" <rajmund.hruska@cesnet.cz>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ransacklib"
7
- version = "1.1.0.dev2"
7
+ version = "1.1.0.dev3"
8
8
  description = "A modern, extensible language for manipulation with structured data"
9
9
  license = "MIT"
10
10
  readme = "README.rst"
@@ -546,10 +546,36 @@ def _operator_map_sql(op, l_sql, r_sql, t1, t2) -> tuple[str, Any]:
546
546
  "or": {(bool, bool): f"{l_sql} OR {r_sql}"},
547
547
  "contains": {(str, str): f"position({r_sql} in {l_sql})>0"},
548
548
  }
549
+ d2: dict[str, dict] = {
550
+ "+": {
551
+ (Number, Number): (f"{l_sql} + {r_sql}", Number),
552
+ (datetime, timedelta): (f"{l_sql} + {r_sql}", datetime),
553
+ (timedelta, timedelta): (f"{l_sql} + {r_sql}", timedelta),
554
+ },
555
+ "-": {
556
+ (Number, Number): (f"{l_sql} - {r_sql}", Number),
557
+ (datetime, timedelta): (f"{l_sql} - {r_sql}", datetime),
558
+ (timedelta, timedelta): (f"{l_sql} - {r_sql}", timedelta),
559
+ (datetime, datetime): (f"{l_sql} - {r_sql}", timedelta),
560
+ },
561
+ "*": {
562
+ (timedelta, Number): (f"{l_sql} * {r_sql}", timedelta),
563
+ (Number, Number): (f"{l_sql} * {r_sql}", Number),
564
+ },
565
+ "/": {
566
+ (timedelta, timedelta): (f"{l_sql} / {r_sql}", timedelta),
567
+ (Number, Number): (f"{l_sql} / {r_sql}", Number),
568
+ },
569
+ "%": {
570
+ (Number, Number): (f"{l_sql} % {r_sql}", timedelta),
571
+ },
572
+ }
549
573
  if op == "==":
550
574
  return (f"{l_sql} = {r_sql}", bool)
551
575
  if op == "in":
552
576
  return (d["="][(t1, t2)], bool)
577
+ if op in d2:
578
+ return d2[op][(t1, t2)]
553
579
  return (d[op][(t1, t2)], bool)
554
580
 
555
581
 
@@ -924,6 +924,21 @@ class SQLInterpreter(Interpreter):
924
924
 
925
925
  return binary_operation_sql(operator, l_sql, r_sql, l_type, r_type)
926
926
 
927
+ def add(self, l_tree: Tree, r_tree: Tree) -> tuple[str, Any]:
928
+ return self._binary_operation("+", l_tree, r_tree)
929
+
930
+ def sub(self, l_tree: Tree, r_tree: Tree) -> tuple[str, Any]:
931
+ return self._binary_operation("-", l_tree, r_tree)
932
+
933
+ def mul(self, l_tree: Tree, r_tree: Tree) -> tuple[str, Any]:
934
+ return self._binary_operation("*", l_tree, r_tree)
935
+
936
+ def div(self, l_tree: Tree, r_tree: Tree) -> tuple[str, Any]:
937
+ return self._binary_operation("/", l_tree, r_tree)
938
+
939
+ def mod(self, l_tree: Tree, r_tree: Tree) -> tuple[str, Any]:
940
+ return self._binary_operation("-", l_tree, r_tree)
941
+
927
942
  def eq(self, l_tree: Tree, r_tree: Tree) -> tuple[str, type[bool]]:
928
943
  return self._binary_operation("==", l_tree, r_tree)
929
944
 
@@ -966,3 +981,18 @@ class SQLInterpreter(Interpreter):
966
981
  var, _ = self.var_from_data(TokenWrapper(path, path))
967
982
  sql, type_ = self.visit(default)
968
983
  return f"COALESCE({var!s}, {sql})", type_
984
+
985
+ def function_(self, name: TokenWrapper, args: Tree | None) -> tuple[str, Any]:
986
+ function_name = cast("str", name.real_value)
987
+ args = [self.visit(x) for x in (args.children if args else [])] # type: ignore
988
+ if function_name == "now":
989
+ return "localtimestamp", datetime
990
+ raise EvaluationError(
991
+ f"Function '{name.real_value}' was not found.",
992
+ line=name.line,
993
+ column=name.column,
994
+ start_pos=name.start_pos,
995
+ end_line=name.end_line,
996
+ end_column=name.end_column,
997
+ end_pos=name.end_pos,
998
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ransacklib
3
- Version: 1.1.0.dev2
3
+ Version: 1.1.0.dev3
4
4
  Summary: A modern, extensible language for manipulation with structured data
5
5
  Author-email: "Rajmund H. Hruška" <rajmund.hruska@cesnet.cz>
6
6
  License-Expression: MIT
File without changes