ransacklib 1.1.0.dev10__tar.gz → 1.1.0.dev11__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.dev10/ransacklib.egg-info → ransacklib-1.1.0.dev11}/PKG-INFO +1 -1
  2. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/pyproject.toml +1 -1
  3. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransack/operator.py +14 -2
  4. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11/ransacklib.egg-info}/PKG-INFO +1 -1
  5. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/tests/test_transformer.py +18 -3
  6. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/LICENSE +0 -0
  7. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/README.rst +0 -0
  8. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransack/__init__.py +0 -0
  9. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransack/exceptions.py +0 -0
  10. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransack/function.py +0 -0
  11. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransack/parser.py +0 -0
  12. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransack/py.typed +0 -0
  13. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransack/transformer.py +0 -0
  14. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransacklib.egg-info/SOURCES.txt +0 -0
  15. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransacklib.egg-info/dependency_links.txt +0 -0
  16. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransacklib.egg-info/requires.txt +0 -0
  17. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/ransacklib.egg-info/top_level.txt +0 -0
  18. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/setup.cfg +0 -0
  19. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/tests/test_operator.py +0 -0
  20. {ransacklib-1.1.0.dev10 → ransacklib-1.1.0.dev11}/tests/test_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ransacklib
3
- Version: 1.1.0.dev10
3
+ Version: 1.1.0.dev11
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.dev10"
7
+ version = "1.1.0.dev11"
8
8
  description = "A modern, extensible language for manipulation with structured data"
9
9
  license = "MIT"
10
10
  readme = "README.rst"
@@ -578,9 +578,21 @@ def _operator_map_sql(op, l_sql, r_sql, t1, t2) -> tuple[str, Any, bool]:
578
578
  "and": {(bool, bool): (f"{l_sql} AND {r_sql}", False)},
579
579
  "or": {(bool, bool): (f"({l_sql} OR {r_sql})", False)},
580
580
  "contains": {
581
- (str, str): (f"{l_sql} like '%' || {r_sql} || '%'", False),
581
+ (str, str): (
582
+ (
583
+ f"{l_sql} like '%%' || "
584
+ f"REPLACE(REPLACE(REPLACE({r_sql}, '\\', '\\\\'),"
585
+ f" '%%', '\\%%'), '_', '\\_')"
586
+ f" || '%%' ESCAPE '\\'"
587
+ ),
588
+ False,
589
+ ),
582
590
  (list, str): (
583
- f"array_to_string({l_sql}, ',') like '%' || {r_sql} || '%'",
591
+ (
592
+ f"EXISTS (SELECT 1 FROM unnest({l_sql}) AS element "
593
+ f"WHERE element LIKE '%%' || REPLACE(REPLACE(REPLACE({r_sql}, "
594
+ f"'\\', '\\\\'), '%%', '\\%%'), '_', '\\_') || '%%' ESCAPE '\\')"
595
+ ),
584
596
  False,
585
597
  ),
586
598
  },
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ransacklib
3
- Version: 1.1.0.dev10
3
+ Version: 1.1.0.dev11
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
@@ -738,15 +738,30 @@ class TestSQLInterpreter:
738
738
  ("a_int??", '"a" IS NOT NULL', []),
739
739
  ("a_int??14", 'COALESCE("a", %s)', [14]),
740
740
  # Test contains operator.
741
- ("'abcdf' contains 'bcd'", "%s like '%' || %s || '%'", ["abcdf", "bcd"]),
741
+ (
742
+ "'abcdf' contains 'bcd'",
743
+ (
744
+ "%s like '%%' || REPLACE(REPLACE(REPLACE(%s, '\\', '\\\\'),"
745
+ " '%%', '\\%%'), '_', '\\_') || '%%' ESCAPE '\\'"
746
+ ),
747
+ ["abcdf", "bcd"],
748
+ ),
742
749
  (
743
750
  "Category contains 'Attempt'",
744
- "array_to_string(\"category\", ',') like '%' || %s || '%'",
751
+ (
752
+ 'EXISTS (SELECT 1 FROM unnest("category") AS element WHERE '
753
+ "element LIKE '%%' || REPLACE(REPLACE(REPLACE(%s, '\\', '\\\\'),"
754
+ " '%%', '\\%%'), '_', '\\_') || '%%' ESCAPE '\\')"
755
+ ),
745
756
  ["Attempt"],
746
757
  ),
747
758
  (
748
759
  "['abcdfg', 'qwerty', 'azerty'] contains 'bcd'",
749
- "array_to_string(ARRAY[%s, %s, %s], ',') like '%' || %s || '%'",
760
+ (
761
+ "EXISTS (SELECT 1 FROM unnest(ARRAY[%s, %s, %s]) AS element "
762
+ "WHERE element LIKE '%%' || REPLACE(REPLACE(REPLACE(%s, '\\', "
763
+ "'\\\\'), '%%', '\\%%'), '_', '\\_') || '%%' ESCAPE '\\')"
764
+ ),
750
765
  ["abcdfg", "qwerty", "azerty", "bcd"],
751
766
  ),
752
767
  # Test = operator.