python-sql 1.5.1__tar.gz → 1.6.0__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 (53) hide show
  1. {python_sql-1.5.1 → python_sql-1.6.0}/.gitlab-ci.yml +1 -1
  2. {python_sql-1.5.1 → python_sql-1.6.0}/.hgtags +2 -0
  3. {python_sql-1.5.1 → python_sql-1.6.0}/CHANGELOG +10 -0
  4. {python_sql-1.5.1 → python_sql-1.6.0}/COPYRIGHT +3 -3
  5. {python_sql-1.5.1 → python_sql-1.6.0}/PKG-INFO +23 -11
  6. {python_sql-1.5.1 → python_sql-1.6.0}/README.rst +9 -9
  7. {python_sql-1.5.1 → python_sql-1.6.0}/python_sql.egg-info/PKG-INFO +23 -11
  8. {python_sql-1.5.1 → python_sql-1.6.0}/python_sql.egg-info/SOURCES.txt +7 -0
  9. {python_sql-1.5.1 → python_sql-1.6.0}/setup.py +1 -0
  10. {python_sql-1.5.1 → python_sql-1.6.0}/sql/__init__.py +178 -105
  11. {python_sql-1.5.1 → python_sql-1.6.0}/sql/aggregate.py +21 -6
  12. {python_sql-1.5.1 → python_sql-1.6.0}/sql/functions.py +9 -8
  13. {python_sql-1.5.1 → python_sql-1.6.0}/sql/operators.py +6 -3
  14. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/__init__.py +1 -1
  15. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_aggregate.py +25 -1
  16. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_alias.py +15 -0
  17. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_collate.py +0 -5
  18. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_combining_query.py +5 -1
  19. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_delete.py +21 -1
  20. python_sql-1.6.0/sql/tests/test_excluded.py +15 -0
  21. python_sql-1.6.0/sql/tests/test_expression.py +17 -0
  22. python_sql-1.6.0/sql/tests/test_flavor.py +46 -0
  23. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_for.py +4 -0
  24. python_sql-1.6.0/sql/tests/test_from.py +25 -0
  25. python_sql-1.6.0/sql/tests/test_from_item.py +46 -0
  26. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_functions.py +17 -1
  27. python_sql-1.6.0/sql/tests/test_grouping.py +13 -0
  28. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_insert.py +57 -1
  29. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_join.py +23 -0
  30. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_lateral.py +1 -1
  31. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_merge.py +43 -5
  32. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_operators.py +20 -1
  33. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_order.py +16 -7
  34. python_sql-1.6.0/sql/tests/test_rollup.py +13 -0
  35. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_select.py +69 -3
  36. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_update.py +8 -0
  37. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_window.py +24 -0
  38. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_with.py +4 -0
  39. {python_sql-1.5.1 → python_sql-1.6.0}/tox.ini +2 -2
  40. {python_sql-1.5.1 → python_sql-1.6.0}/.flake8 +0 -0
  41. {python_sql-1.5.1 → python_sql-1.6.0}/.isort.cfg +0 -0
  42. {python_sql-1.5.1 → python_sql-1.6.0}/MANIFEST.in +0 -0
  43. {python_sql-1.5.1 → python_sql-1.6.0}/python_sql.egg-info/dependency_links.txt +0 -0
  44. {python_sql-1.5.1 → python_sql-1.6.0}/python_sql.egg-info/top_level.txt +0 -0
  45. {python_sql-1.5.1 → python_sql-1.6.0}/setup.cfg +0 -0
  46. {python_sql-1.5.1 → python_sql-1.6.0}/sql/conditionals.py +0 -0
  47. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_as.py +0 -0
  48. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_cast.py +0 -0
  49. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_column.py +0 -0
  50. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_conditionals.py +0 -0
  51. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_literal.py +0 -0
  52. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_table.py +0 -0
  53. {python_sql-1.5.1 → python_sql-1.6.0}/sql/tests/test_values.py +0 -0
@@ -57,7 +57,7 @@ test-tox-python:
57
57
  - tox -e "py${PYTHON_VERSION/./}" -- -v --output-file junit.xml
58
58
  parallel:
59
59
  matrix:
60
- - PYTHON_VERSION: ["3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
60
+ - PYTHON_VERSION: ["3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
61
61
 
62
62
  test-tox-pypy:
63
63
  extends: .test-tox
@@ -19,3 +19,5 @@ fcb64787b51db2068061eb4aa13825abc1134916 1.4.2
19
19
  111e3e86865360f83a65c04fa48c55f3d2957ee3 1.4.3
20
20
  6f9066b83fe3a8c4699a8555ad1bc406f18974ff 1.5.0
21
21
  79a69b0bbbd35a8d95e1b754ed3feb03df23fb70 1.5.1
22
+ 41b0aaa68f5e5bab3889fa1ef57ef44c6c21cacf 1.5.2
23
+ 475502ba46eba3b7e141e8fbceaf495b545bcddb 1.6.0
@@ -1,3 +1,13 @@
1
+ Version 1.6.0 - 2025-05-02
2
+ * Fix position of order_by parameters in Select query
3
+ * Add support for weak reference on SQL objects
4
+ * Add support for Python 3.13
5
+
6
+ Version 1.5.2 - 2024-09-30
7
+ * Use parameter for unary operator
8
+ * Support default values when inserting not matched merge
9
+ * Replace assert by ValueError
10
+
1
11
  Version 1.5.1 - 2024-05-28
2
12
  * Use parameter for start and end of WINDOW FRAME
3
13
  * Use parameter for limit and offset
@@ -1,6 +1,6 @@
1
- Copyright (c) 2011-2023, Cédric Krier
2
- Copyright (c) 2013-2023, Nicolas Évrard
3
- Copyright (c) 2011-2023, B2CK
1
+ Copyright (c) 2011-2025, Cédric Krier
2
+ Copyright (c) 2013-2025, Nicolas Évrard
3
+ Copyright (c) 2011-2025, B2CK
4
4
  All rights reserved.
5
5
 
6
6
  Redistribution and use in source and binary forms, with or without
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: python-sql
3
- Version: 1.5.1
3
+ Version: 1.6.0
4
4
  Summary: Library to write SQL queries
5
5
  Home-page: https://pypi.org/project/python-sql/
6
6
  Download-URL: https://downloads.tryton.org/python-sql/
@@ -24,9 +24,21 @@ Classifier: Programming Language :: Python :: 3.9
24
24
  Classifier: Programming Language :: Python :: 3.10
25
25
  Classifier: Programming Language :: Python :: 3.11
26
26
  Classifier: Programming Language :: Python :: 3.12
27
+ Classifier: Programming Language :: Python :: 3.13
27
28
  Classifier: Topic :: Database
28
29
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
29
30
  Requires-Python: >=3.5
31
+ Dynamic: author
32
+ Dynamic: author-email
33
+ Dynamic: classifier
34
+ Dynamic: description
35
+ Dynamic: download-url
36
+ Dynamic: home-page
37
+ Dynamic: keywords
38
+ Dynamic: license
39
+ Dynamic: project-url
40
+ Dynamic: requires-python
41
+ Dynamic: summary
30
42
 
31
43
  python-sql
32
44
  ==========
@@ -136,23 +148,23 @@ Select on other schema::
136
148
  Insert query with default values::
137
149
 
138
150
  >>> tuple(user.insert())
139
- ('INSERT INTO "user" AS "a" DEFAULT VALUES', ())
151
+ ('INSERT INTO "user" DEFAULT VALUES', ())
140
152
 
141
153
  Insert query with values::
142
154
 
143
155
  >>> tuple(user.insert(columns=[user.name, user.login],
144
156
  ... values=[['Foo', 'foo']]))
145
- ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
157
+ ('INSERT INTO "user" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
146
158
  >>> tuple(user.insert(columns=[user.name, user.login],
147
159
  ... values=[['Foo', 'foo'], ['Bar', 'bar']]))
148
- ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s), (%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
160
+ ('INSERT INTO "user" ("name", "login") VALUES (%s, %s), (%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
149
161
 
150
162
  Insert query with query::
151
163
 
152
164
  >>> passwd = Table('passwd')
153
165
  >>> select = passwd.select(passwd.login, passwd.passwd)
154
166
  >>> tuple(user.insert(values=select))
155
- ('INSERT INTO "user" AS "b" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
167
+ ('INSERT INTO "user" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
156
168
 
157
169
  Update query with values::
158
170
 
@@ -196,23 +208,23 @@ Flavors::
196
208
  >>> select.offset = 10
197
209
  >>> Flavor.set(Flavor())
198
210
  >>> tuple(select)
199
- ('SELECT * FROM "user" AS "a" OFFSET 10', ())
211
+ ('SELECT * FROM "user" AS "a" OFFSET %s', (10,))
200
212
  >>> Flavor.set(Flavor(max_limit=18446744073709551615))
201
213
  >>> tuple(select)
202
- ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET 10', ())
214
+ ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET %s', (10,))
203
215
  >>> Flavor.set(Flavor(max_limit=-1))
204
216
  >>> tuple(select)
205
- ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET 10', ())
217
+ ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET %s', (10,))
206
218
 
207
219
  Limit style::
208
220
 
209
221
  >>> select = user.select(limit=10, offset=20)
210
222
  >>> Flavor.set(Flavor(limitstyle='limit'))
211
223
  >>> tuple(select)
212
- ('SELECT * FROM "user" AS "a" LIMIT 10 OFFSET 20', ())
224
+ ('SELECT * FROM "user" AS "a" LIMIT %s OFFSET %s', (10, 20))
213
225
  >>> Flavor.set(Flavor(limitstyle='fetch'))
214
226
  >>> tuple(select)
215
- ('SELECT * FROM "user" AS "a" OFFSET (20) ROWS FETCH FIRST (10) ROWS ONLY', ())
227
+ ('SELECT * FROM "user" AS "a" OFFSET (%s) ROWS FETCH FIRST (%s) ROWS ONLY', (20, 10))
216
228
  >>> Flavor.set(Flavor(limitstyle='rownum'))
217
229
  >>> tuple(select)
218
230
  ('SELECT "a".* FROM (SELECT "b".*, ROWNUM AS "rnum" FROM (SELECT * FROM "user" AS "c") AS "b" WHERE (ROWNUM <= %s)) AS "a" WHERE ("rnum" > %s)', (30, 20))
@@ -106,23 +106,23 @@ Select on other schema::
106
106
  Insert query with default values::
107
107
 
108
108
  >>> tuple(user.insert())
109
- ('INSERT INTO "user" AS "a" DEFAULT VALUES', ())
109
+ ('INSERT INTO "user" DEFAULT VALUES', ())
110
110
 
111
111
  Insert query with values::
112
112
 
113
113
  >>> tuple(user.insert(columns=[user.name, user.login],
114
114
  ... values=[['Foo', 'foo']]))
115
- ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
115
+ ('INSERT INTO "user" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
116
116
  >>> tuple(user.insert(columns=[user.name, user.login],
117
117
  ... values=[['Foo', 'foo'], ['Bar', 'bar']]))
118
- ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s), (%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
118
+ ('INSERT INTO "user" ("name", "login") VALUES (%s, %s), (%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
119
119
 
120
120
  Insert query with query::
121
121
 
122
122
  >>> passwd = Table('passwd')
123
123
  >>> select = passwd.select(passwd.login, passwd.passwd)
124
124
  >>> tuple(user.insert(values=select))
125
- ('INSERT INTO "user" AS "b" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
125
+ ('INSERT INTO "user" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
126
126
 
127
127
  Update query with values::
128
128
 
@@ -166,23 +166,23 @@ Flavors::
166
166
  >>> select.offset = 10
167
167
  >>> Flavor.set(Flavor())
168
168
  >>> tuple(select)
169
- ('SELECT * FROM "user" AS "a" OFFSET 10', ())
169
+ ('SELECT * FROM "user" AS "a" OFFSET %s', (10,))
170
170
  >>> Flavor.set(Flavor(max_limit=18446744073709551615))
171
171
  >>> tuple(select)
172
- ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET 10', ())
172
+ ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET %s', (10,))
173
173
  >>> Flavor.set(Flavor(max_limit=-1))
174
174
  >>> tuple(select)
175
- ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET 10', ())
175
+ ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET %s', (10,))
176
176
 
177
177
  Limit style::
178
178
 
179
179
  >>> select = user.select(limit=10, offset=20)
180
180
  >>> Flavor.set(Flavor(limitstyle='limit'))
181
181
  >>> tuple(select)
182
- ('SELECT * FROM "user" AS "a" LIMIT 10 OFFSET 20', ())
182
+ ('SELECT * FROM "user" AS "a" LIMIT %s OFFSET %s', (10, 20))
183
183
  >>> Flavor.set(Flavor(limitstyle='fetch'))
184
184
  >>> tuple(select)
185
- ('SELECT * FROM "user" AS "a" OFFSET (20) ROWS FETCH FIRST (10) ROWS ONLY', ())
185
+ ('SELECT * FROM "user" AS "a" OFFSET (%s) ROWS FETCH FIRST (%s) ROWS ONLY', (20, 10))
186
186
  >>> Flavor.set(Flavor(limitstyle='rownum'))
187
187
  >>> tuple(select)
188
188
  ('SELECT "a".* FROM (SELECT "b".*, ROWNUM AS "rnum" FROM (SELECT * FROM "user" AS "c") AS "b" WHERE (ROWNUM <= %s)) AS "a" WHERE ("rnum" > %s)', (30, 20))
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: python-sql
3
- Version: 1.5.1
3
+ Version: 1.6.0
4
4
  Summary: Library to write SQL queries
5
5
  Home-page: https://pypi.org/project/python-sql/
6
6
  Download-URL: https://downloads.tryton.org/python-sql/
@@ -24,9 +24,21 @@ Classifier: Programming Language :: Python :: 3.9
24
24
  Classifier: Programming Language :: Python :: 3.10
25
25
  Classifier: Programming Language :: Python :: 3.11
26
26
  Classifier: Programming Language :: Python :: 3.12
27
+ Classifier: Programming Language :: Python :: 3.13
27
28
  Classifier: Topic :: Database
28
29
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
29
30
  Requires-Python: >=3.5
31
+ Dynamic: author
32
+ Dynamic: author-email
33
+ Dynamic: classifier
34
+ Dynamic: description
35
+ Dynamic: download-url
36
+ Dynamic: home-page
37
+ Dynamic: keywords
38
+ Dynamic: license
39
+ Dynamic: project-url
40
+ Dynamic: requires-python
41
+ Dynamic: summary
30
42
 
31
43
  python-sql
32
44
  ==========
@@ -136,23 +148,23 @@ Select on other schema::
136
148
  Insert query with default values::
137
149
 
138
150
  >>> tuple(user.insert())
139
- ('INSERT INTO "user" AS "a" DEFAULT VALUES', ())
151
+ ('INSERT INTO "user" DEFAULT VALUES', ())
140
152
 
141
153
  Insert query with values::
142
154
 
143
155
  >>> tuple(user.insert(columns=[user.name, user.login],
144
156
  ... values=[['Foo', 'foo']]))
145
- ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
157
+ ('INSERT INTO "user" ("name", "login") VALUES (%s, %s)', ('Foo', 'foo'))
146
158
  >>> tuple(user.insert(columns=[user.name, user.login],
147
159
  ... values=[['Foo', 'foo'], ['Bar', 'bar']]))
148
- ('INSERT INTO "user" AS "a" ("name", "login") VALUES (%s, %s), (%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
160
+ ('INSERT INTO "user" ("name", "login") VALUES (%s, %s), (%s, %s)', ('Foo', 'foo', 'Bar', 'bar'))
149
161
 
150
162
  Insert query with query::
151
163
 
152
164
  >>> passwd = Table('passwd')
153
165
  >>> select = passwd.select(passwd.login, passwd.passwd)
154
166
  >>> tuple(user.insert(values=select))
155
- ('INSERT INTO "user" AS "b" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
167
+ ('INSERT INTO "user" SELECT "a"."login", "a"."passwd" FROM "passwd" AS "a"', ())
156
168
 
157
169
  Update query with values::
158
170
 
@@ -196,23 +208,23 @@ Flavors::
196
208
  >>> select.offset = 10
197
209
  >>> Flavor.set(Flavor())
198
210
  >>> tuple(select)
199
- ('SELECT * FROM "user" AS "a" OFFSET 10', ())
211
+ ('SELECT * FROM "user" AS "a" OFFSET %s', (10,))
200
212
  >>> Flavor.set(Flavor(max_limit=18446744073709551615))
201
213
  >>> tuple(select)
202
- ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET 10', ())
214
+ ('SELECT * FROM "user" AS "a" LIMIT 18446744073709551615 OFFSET %s', (10,))
203
215
  >>> Flavor.set(Flavor(max_limit=-1))
204
216
  >>> tuple(select)
205
- ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET 10', ())
217
+ ('SELECT * FROM "user" AS "a" LIMIT -1 OFFSET %s', (10,))
206
218
 
207
219
  Limit style::
208
220
 
209
221
  >>> select = user.select(limit=10, offset=20)
210
222
  >>> Flavor.set(Flavor(limitstyle='limit'))
211
223
  >>> tuple(select)
212
- ('SELECT * FROM "user" AS "a" LIMIT 10 OFFSET 20', ())
224
+ ('SELECT * FROM "user" AS "a" LIMIT %s OFFSET %s', (10, 20))
213
225
  >>> Flavor.set(Flavor(limitstyle='fetch'))
214
226
  >>> tuple(select)
215
- ('SELECT * FROM "user" AS "a" OFFSET (20) ROWS FETCH FIRST (10) ROWS ONLY', ())
227
+ ('SELECT * FROM "user" AS "a" OFFSET (%s) ROWS FETCH FIRST (%s) ROWS ONLY', (20, 10))
216
228
  >>> Flavor.set(Flavor(limitstyle='rownum'))
217
229
  >>> tuple(select)
218
230
  ('SELECT "a".* FROM (SELECT "b".*, ROWNUM AS "rnum" FROM (SELECT * FROM "user" AS "c") AS "b" WHERE (ROWNUM <= %s)) AS "a" WHERE ("rnum" > %s)', (30, 20))
@@ -27,8 +27,14 @@ sql/tests/test_column.py
27
27
  sql/tests/test_combining_query.py
28
28
  sql/tests/test_conditionals.py
29
29
  sql/tests/test_delete.py
30
+ sql/tests/test_excluded.py
31
+ sql/tests/test_expression.py
32
+ sql/tests/test_flavor.py
30
33
  sql/tests/test_for.py
34
+ sql/tests/test_from.py
35
+ sql/tests/test_from_item.py
31
36
  sql/tests/test_functions.py
37
+ sql/tests/test_grouping.py
32
38
  sql/tests/test_insert.py
33
39
  sql/tests/test_join.py
34
40
  sql/tests/test_lateral.py
@@ -36,6 +42,7 @@ sql/tests/test_literal.py
36
42
  sql/tests/test_merge.py
37
43
  sql/tests/test_operators.py
38
44
  sql/tests/test_order.py
45
+ sql/tests/test_rollup.py
39
46
  sql/tests/test_select.py
40
47
  sql/tests/test_table.py
41
48
  sql/tests/test_update.py
@@ -48,6 +48,7 @@ setup(name='python-sql',
48
48
  'Programming Language :: Python :: 3.10',
49
49
  'Programming Language :: Python :: 3.11',
50
50
  'Programming Language :: Python :: 3.12',
51
+ 'Programming Language :: Python :: 3.13',
51
52
  'Topic :: Database',
52
53
  'Topic :: Software Development :: Libraries :: Python Modules',
53
54
  ],