david8 0.dev4__tar.gz → 0.dev5__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 (42) hide show
  1. {david8-0.dev4 → david8-0.dev5}/PKG-INFO +17 -1
  2. david8-0.dev5/README.md +17 -0
  3. {david8-0.dev4 → david8-0.dev5}/david8/predicates.py +1 -1
  4. {david8-0.dev4 → david8-0.dev5}/david8.egg-info/PKG-INFO +17 -1
  5. {david8-0.dev4 → david8-0.dev5}/pyproject.toml +1 -1
  6. {david8-0.dev4 → david8-0.dev5}/tests/test_predicates.py +5 -5
  7. {david8-0.dev4 → david8-0.dev5}/tests/test_where_predicates.py +34 -13
  8. david8-0.dev4/README.md +0 -1
  9. {david8-0.dev4 → david8-0.dev5}/LICENSE +0 -0
  10. {david8-0.dev4 → david8-0.dev5}/david8/__init__.py +0 -0
  11. {david8-0.dev4 → david8-0.dev5}/david8/core/__init__.py +0 -0
  12. {david8-0.dev4 → david8-0.dev5}/david8/core/base_aliased.py +0 -0
  13. {david8-0.dev4 → david8-0.dev5}/david8/core/base_dialect.py +0 -0
  14. {david8-0.dev4 → david8-0.dev5}/david8/core/base_dml.py +0 -0
  15. {david8-0.dev4 → david8-0.dev5}/david8/core/base_params.py +0 -0
  16. {david8-0.dev4 → david8-0.dev5}/david8/core/base_query_builder.py +0 -0
  17. {david8-0.dev4 → david8-0.dev5}/david8/core/fn_generator.py +0 -0
  18. {david8-0.dev4 → david8-0.dev5}/david8/core/log.py +0 -0
  19. {david8-0.dev4 → david8-0.dev5}/david8/core/sql_92_join.py +0 -0
  20. {david8-0.dev4 → david8-0.dev5}/david8/expressions.py +0 -0
  21. {david8-0.dev4 → david8-0.dev5}/david8/functions.py +0 -0
  22. {david8-0.dev4 → david8-0.dev5}/david8/joins.py +0 -0
  23. {david8-0.dev4 → david8-0.dev5}/david8/logical_operators.py +0 -0
  24. {david8-0.dev4 → david8-0.dev5}/david8/param_styles.py +0 -0
  25. {david8-0.dev4 → david8-0.dev5}/david8/protocols/__init__.py +0 -0
  26. {david8-0.dev4 → david8-0.dev5}/david8/protocols/dialect.py +0 -0
  27. {david8-0.dev4 → david8-0.dev5}/david8/protocols/dml.py +0 -0
  28. {david8-0.dev4 → david8-0.dev5}/david8/protocols/query_builder.py +0 -0
  29. {david8-0.dev4 → david8-0.dev5}/david8/protocols/sql.py +0 -0
  30. {david8-0.dev4 → david8-0.dev5}/david8.egg-info/SOURCES.txt +0 -0
  31. {david8-0.dev4 → david8-0.dev5}/david8.egg-info/dependency_links.txt +0 -0
  32. {david8-0.dev4 → david8-0.dev5}/david8.egg-info/top_level.txt +0 -0
  33. {david8-0.dev4 → david8-0.dev5}/setup.cfg +0 -0
  34. {david8-0.dev4 → david8-0.dev5}/tests/test_expressions.py +0 -0
  35. {david8-0.dev4 → david8-0.dev5}/tests/test_functions.py +0 -0
  36. {david8-0.dev4 → david8-0.dev5}/tests/test_group_by.py +0 -0
  37. {david8-0.dev4 → david8-0.dev5}/tests/test_join.py +0 -0
  38. {david8-0.dev4 → david8-0.dev5}/tests/test_logical_operators.py +0 -0
  39. {david8-0.dev4 → david8-0.dev5}/tests/test_order_by.py +0 -0
  40. {david8-0.dev4 → david8-0.dev5}/tests/test_select.py +0 -0
  41. {david8-0.dev4 → david8-0.dev5}/tests/test_union.py +0 -0
  42. {david8-0.dev4 → david8-0.dev5}/tests/test_with_select.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: david8
3
- Version: 0.dev4
3
+ Version: 0.dev5
4
4
  Summary: Lightweight Python SQL query builder with support for multiple dialects: ClickHouse and PostgreSQL
5
5
  Author-email: Danila Ganchar <danila.ganchar@gmail.com>
6
6
  Maintainer-email: Danila Ganchar <danila.ganchar@gmail.com>
@@ -24,3 +24,19 @@ License-File: LICENSE
24
24
  Dynamic: license-file
25
25
 
26
26
  # david8
27
+
28
+ A fast, lightweight, and elegant SQL query builder for Python.
29
+ Designed with clarity and minimalism in mind, it provides a clean, expressive interface for constructing
30
+ SQL queries without sacrificing control or performance.
31
+
32
+ The builder automatically generates safe parameter placeholders and binds parameters for you, keeping your code
33
+ concise and secure.
34
+
35
+ Whether you're assembling simple filters or composing complex queries, this query builder gives you a
36
+ predictable and ergonomic workflow
37
+
38
+ - Zero dependencies
39
+ - Zero global objects
40
+ - Built-in base support for ClickHouse, PostgreSQL, DuckDB, and MySQL
41
+
42
+ See [Wiki](https://github.com/d-ganchar/david8/wiki)
@@ -0,0 +1,17 @@
1
+ # david8
2
+
3
+ A fast, lightweight, and elegant SQL query builder for Python.
4
+ Designed with clarity and minimalism in mind, it provides a clean, expressive interface for constructing
5
+ SQL queries without sacrificing control or performance.
6
+
7
+ The builder automatically generates safe parameter placeholders and binds parameters for you, keeping your code
8
+ concise and secure.
9
+
10
+ Whether you're assembling simple filters or composing complex queries, this query builder gives you a
11
+ predictable and ergonomic workflow
12
+
13
+ - Zero dependencies
14
+ - Zero global objects
15
+ - Built-in base support for ClickHouse, PostgreSQL, DuckDB, and MySQL
16
+
17
+ See [Wiki](https://github.com/d-ganchar/david8/wiki)
@@ -97,7 +97,7 @@ def le(column: str, value: int | float | ExprProtocol) -> PredicateProtocol:
97
97
  def ne(column: str, value: int | float | str | ExprProtocol) -> PredicateProtocol:
98
98
  return _LeftColRightParamPredicate(column, value, '!=')
99
99
 
100
- def between_c(
100
+ def between(
101
101
  column: str,
102
102
  start: str | float | int | ExprProtocol,
103
103
  end: str | float | int | ExprProtocol
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: david8
3
- Version: 0.dev4
3
+ Version: 0.dev5
4
4
  Summary: Lightweight Python SQL query builder with support for multiple dialects: ClickHouse and PostgreSQL
5
5
  Author-email: Danila Ganchar <danila.ganchar@gmail.com>
6
6
  Maintainer-email: Danila Ganchar <danila.ganchar@gmail.com>
@@ -24,3 +24,19 @@ License-File: LICENSE
24
24
  Dynamic: license-file
25
25
 
26
26
  # david8
27
+
28
+ A fast, lightweight, and elegant SQL query builder for Python.
29
+ Designed with clarity and minimalism in mind, it provides a clean, expressive interface for constructing
30
+ SQL queries without sacrificing control or performance.
31
+
32
+ The builder automatically generates safe parameter placeholders and binds parameters for you, keeping your code
33
+ concise and secure.
34
+
35
+ Whether you're assembling simple filters or composing complex queries, this query builder gives you a
36
+ predictable and ergonomic workflow
37
+
38
+ - Zero dependencies
39
+ - Zero global objects
40
+ - Built-in base support for ClickHouse, PostgreSQL, DuckDB, and MySQL
41
+
42
+ See [Wiki](https://github.com/d-ganchar/david8/wiki)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "david8"
3
- version = "0.dev.4"
3
+ version = "0.dev.5"
4
4
  description = "Lightweight Python SQL query builder with support for multiple dialects: ClickHouse and PostgreSQL"
5
5
  authors = [{name = "Danila Ganchar", email = "danila.ganchar@gmail.com"}]
6
6
  maintainers = [{name = "Danila Ganchar", email = "danila.ganchar@gmail.com"}]
@@ -2,7 +2,7 @@ from parameterized import parameterized
2
2
 
3
3
  from david8.expressions import param, val
4
4
  from david8.predicates import (
5
- between_c,
5
+ between,
6
6
  eq,
7
7
  eq_c,
8
8
  eq_e,
@@ -30,14 +30,14 @@ class TestPredicates(BaseTest):
30
30
  @parameterized.expand([
31
31
  # between
32
32
  (
33
- between_c('age', 14, 18).as_('is_valid'),
33
+ between('age', 14, 18).as_('is_valid'),
34
34
  'SELECT age BETWEEN %(p1)s AND %(p2)s AS is_valid',
35
- {'p1': 14, 'p2': 18}
35
+ {'p1': 14, 'p2': 18}
36
36
  ),
37
37
  (
38
- between_c('created_day', val('2025-01-01'), val('2026-01-01')),
38
+ between('created_day', val('2025-01-01'), val('2026-01-01')),
39
39
  "SELECT created_day BETWEEN '2025-01-01' AND '2026-01-01'",
40
- {}
40
+ {}
41
41
  ),
42
42
  # eq
43
43
  (
@@ -1,5 +1,8 @@
1
+ from parameterized import parameterized
2
+
3
+ from david8.expressions import col, val
1
4
  from david8.predicates import (
2
- between_c,
5
+ between,
3
6
  eq,
4
7
  ge,
5
8
  gt,
@@ -7,6 +10,7 @@ from david8.predicates import (
7
10
  lt,
8
11
  ne,
9
12
  )
13
+ from david8.protocols.sql import PredicateProtocol
10
14
  from tests.base_test import BaseTest
11
15
 
12
16
 
@@ -23,14 +27,13 @@ class TestWherePredicates(BaseTest):
23
27
  gt('weight', 3.1),
24
28
  lt('weight', 3.9),
25
29
  ne('gender', 'f'),
26
- between_c('last_visit', '2023', '2024'),
27
30
  )
28
31
  )
29
32
 
30
33
  self.assertEqual(
31
34
  query.get_sql(),
32
35
  "SELECT * FROM cats WHERE color = %(p1)s AND age >= %(p2)s AND age <= %(p3)s AND weight > %(p4)s AND "
33
- "weight < %(p5)s AND gender != %(p6)s AND last_visit BETWEEN %(p7)s AND %(p8)s"
36
+ "weight < %(p5)s AND gender != %(p6)s"
34
37
  )
35
38
 
36
39
  self.assertEqual(
@@ -41,8 +44,6 @@ class TestWherePredicates(BaseTest):
41
44
  'p4': 3.1,
42
45
  'p5': 3.9,
43
46
  'p6': 'f',
44
- 'p7': '2023',
45
- 'p8': '2024',
46
47
  },
47
48
  query.get_parameters()
48
49
  )
@@ -57,30 +58,50 @@ class TestWherePredicates(BaseTest):
57
58
  gt('weight', 3.1),
58
59
  lt('weight', 3.9),
59
60
  ne('gender', 'f'),
60
- between_c('last_visit', '2023-01-01', '2024-01-01'),
61
- between_c('sociality', 69, 96),
62
61
  ]:
63
62
  query.where(predicate)
64
63
 
65
64
  self.assertEqual(
66
65
  query.get_sql(),
67
66
  'SELECT * FROM cats WHERE color = %(p1)s AND age >= %(p2)s AND age <= %(p3)s AND weight > %(p4)s AND '
68
- 'weight < %(p5)s AND gender != %(p6)s AND last_visit BETWEEN %(p7)s AND %(p8)s AND sociality '
69
- 'BETWEEN %(p9)s AND %(p10)s'
67
+ 'weight < %(p5)s AND gender != %(p6)s'
70
68
  )
71
69
 
72
70
  self.assertEqual(
73
71
  {
74
72
  'p1': 'ginger',
75
- 'p10': 96,
76
73
  'p2': 2,
77
74
  'p3': 3,
78
75
  'p4': 3.1,
79
76
  'p5': 3.9,
80
77
  'p6': 'f',
81
- 'p7': '2023-01-01',
82
- 'p8': '2024-01-01',
83
- 'p9': 69,
84
78
  },
85
79
  query.get_parameters(),
86
80
  )
81
+
82
+ @parameterized.expand([
83
+ (
84
+ between('last_visit', '2023-01-01', '2024-01-01'),
85
+ 'SELECT last_visit BETWEEN %(p1)s AND %(p2)s',
86
+ {'p1': '2023-01-01', 'p2': '2024-01-01'},
87
+ ),
88
+ (
89
+ between('sociality', 69, 96).as_('soc_level'),
90
+ 'SELECT sociality BETWEEN %(p1)s AND %(p2)s AS soc_level',
91
+ {'p1': 69, 'p2': 96},
92
+ ),
93
+ (
94
+ between('price', col('account_balance_free'), col('account_balance_total')),
95
+ 'SELECT price BETWEEN account_balance_free AND account_balance_total',
96
+ {},
97
+ ),
98
+ (
99
+ between('price', val(0.1), val(0.9)),
100
+ 'SELECT price BETWEEN 0.1 AND 0.9',
101
+ {},
102
+ )
103
+ ])
104
+ def test_between(self, b_expr: PredicateProtocol, exp_sql: str, exp_params: dict):
105
+ query = self.qb.select(b_expr)
106
+ self.assertEqual(query.get_sql(), exp_sql)
107
+ self.assertEqual(query.get_parameters(), exp_params)
david8-0.dev4/README.md DELETED
@@ -1 +0,0 @@
1
- # david8
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes