plain.models 0.43.0__tar.gz → 0.45.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 (136) hide show
  1. {plain_models-0.43.0 → plain_models-0.45.0}/.gitignore +0 -2
  2. {plain_models-0.43.0 → plain_models-0.45.0}/PKG-INFO +1 -1
  3. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/CHANGELOG.md +21 -0
  4. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/sqlite3/base.py +7 -1
  5. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/sqlite3/features.py +1 -0
  6. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backups/clients.py +31 -13
  7. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/base.py +1 -0
  8. {plain_models-0.43.0 → plain_models-0.45.0}/pyproject.toml +1 -1
  9. {plain_models-0.43.0 → plain_models-0.45.0}/LICENSE +0 -0
  10. {plain_models-0.43.0 → plain_models-0.45.0}/README.md +0 -0
  11. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/AGENTS.md +0 -0
  12. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/README.md +0 -0
  13. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/__init__.py +0 -0
  14. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/aggregates.py +0 -0
  15. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/__init__.py +0 -0
  16. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/base/__init__.py +0 -0
  17. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/base/base.py +0 -0
  18. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/base/client.py +0 -0
  19. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/base/creation.py +0 -0
  20. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/base/features.py +0 -0
  21. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/base/introspection.py +0 -0
  22. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/base/operations.py +0 -0
  23. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/base/schema.py +0 -0
  24. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/base/validation.py +0 -0
  25. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/ddl_references.py +0 -0
  26. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/mysql/__init__.py +0 -0
  27. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/mysql/base.py +0 -0
  28. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/mysql/client.py +0 -0
  29. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/mysql/compiler.py +0 -0
  30. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/mysql/creation.py +0 -0
  31. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/mysql/features.py +0 -0
  32. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/mysql/introspection.py +0 -0
  33. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/mysql/operations.py +0 -0
  34. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/mysql/schema.py +0 -0
  35. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/mysql/validation.py +0 -0
  36. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/postgresql/__init__.py +0 -0
  37. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/postgresql/base.py +0 -0
  38. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/postgresql/client.py +0 -0
  39. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/postgresql/creation.py +0 -0
  40. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/postgresql/features.py +0 -0
  41. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/postgresql/introspection.py +0 -0
  42. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/postgresql/operations.py +0 -0
  43. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/postgresql/schema.py +0 -0
  44. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/sqlite3/__init__.py +0 -0
  45. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/sqlite3/_functions.py +0 -0
  46. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/sqlite3/client.py +0 -0
  47. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/sqlite3/creation.py +0 -0
  48. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/sqlite3/introspection.py +0 -0
  49. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/sqlite3/operations.py +0 -0
  50. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/sqlite3/schema.py +0 -0
  51. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backends/utils.py +0 -0
  52. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backups/__init__.py +0 -0
  53. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backups/cli.py +0 -0
  54. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/backups/core.py +0 -0
  55. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/cli.py +0 -0
  56. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/config.py +0 -0
  57. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/connections.py +0 -0
  58. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/constants.py +0 -0
  59. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/constraints.py +0 -0
  60. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/database_url.py +0 -0
  61. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/db.py +0 -0
  62. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/default_settings.py +0 -0
  63. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/deletion.py +0 -0
  64. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/entrypoints.py +0 -0
  65. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/enums.py +0 -0
  66. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/exceptions.py +0 -0
  67. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/expressions.py +0 -0
  68. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/fields/__init__.py +0 -0
  69. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/fields/json.py +0 -0
  70. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/fields/mixins.py +0 -0
  71. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/fields/related.py +0 -0
  72. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/fields/related_descriptors.py +0 -0
  73. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/fields/related_lookups.py +0 -0
  74. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/fields/related_managers.py +0 -0
  75. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/fields/reverse_related.py +0 -0
  76. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/forms.py +0 -0
  77. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/functions/__init__.py +0 -0
  78. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/functions/comparison.py +0 -0
  79. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/functions/datetime.py +0 -0
  80. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/functions/math.py +0 -0
  81. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/functions/mixins.py +0 -0
  82. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/functions/text.py +0 -0
  83. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/functions/window.py +0 -0
  84. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/indexes.py +0 -0
  85. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/lookups.py +0 -0
  86. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/__init__.py +0 -0
  87. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/autodetector.py +0 -0
  88. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/exceptions.py +0 -0
  89. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/executor.py +0 -0
  90. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/graph.py +0 -0
  91. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/loader.py +0 -0
  92. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/migration.py +0 -0
  93. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/operations/__init__.py +0 -0
  94. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/operations/base.py +0 -0
  95. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/operations/fields.py +0 -0
  96. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/operations/models.py +0 -0
  97. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/operations/special.py +0 -0
  98. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/optimizer.py +0 -0
  99. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/questioner.py +0 -0
  100. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/recorder.py +0 -0
  101. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/serializer.py +0 -0
  102. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/state.py +0 -0
  103. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/utils.py +0 -0
  104. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/migrations/writer.py +0 -0
  105. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/options.py +0 -0
  106. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/otel.py +0 -0
  107. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/preflight.py +0 -0
  108. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/query.py +0 -0
  109. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/query_utils.py +0 -0
  110. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/registry.py +0 -0
  111. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/sql/__init__.py +0 -0
  112. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/sql/compiler.py +0 -0
  113. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/sql/constants.py +0 -0
  114. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/sql/datastructures.py +0 -0
  115. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/sql/query.py +0 -0
  116. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/sql/subqueries.py +0 -0
  117. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/sql/where.py +0 -0
  118. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/test/__init__.py +0 -0
  119. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/test/pytest.py +0 -0
  120. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/test/utils.py +0 -0
  121. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/transaction.py +0 -0
  122. {plain_models-0.43.0 → plain_models-0.45.0}/plain/models/utils.py +0 -0
  123. {plain_models-0.43.0 → plain_models-0.45.0}/tests/app/examples/migrations/0001_initial.py +0 -0
  124. {plain_models-0.43.0 → plain_models-0.45.0}/tests/app/examples/migrations/0002_test_field_removed.py +0 -0
  125. {plain_models-0.43.0 → plain_models-0.45.0}/tests/app/examples/migrations/0003_deleteparent_childsetnull_childsetdefault_and_more.py +0 -0
  126. {plain_models-0.43.0 → plain_models-0.45.0}/tests/app/examples/migrations/__init__.py +0 -0
  127. {plain_models-0.43.0 → plain_models-0.45.0}/tests/app/examples/models.py +0 -0
  128. {plain_models-0.43.0 → plain_models-0.45.0}/tests/app/settings.py +0 -0
  129. {plain_models-0.43.0 → plain_models-0.45.0}/tests/app/urls.py +0 -0
  130. {plain_models-0.43.0 → plain_models-0.45.0}/tests/test_database_url.py +0 -0
  131. {plain_models-0.43.0 → plain_models-0.45.0}/tests/test_delete_behaviors.py +0 -0
  132. {plain_models-0.43.0 → plain_models-0.45.0}/tests/test_exceptions.py +0 -0
  133. {plain_models-0.43.0 → plain_models-0.45.0}/tests/test_manager_assignment.py +0 -0
  134. {plain_models-0.43.0 → plain_models-0.45.0}/tests/test_models.py +0 -0
  135. {plain_models-0.43.0 → plain_models-0.45.0}/tests/test_related_descriptors.py +0 -0
  136. {plain_models-0.43.0 → plain_models-0.45.0}/tests/test_related_manager_api.py +0 -0
@@ -11,8 +11,6 @@ plain*/tests/.plain
11
11
  # Ottobot
12
12
  .aider*
13
13
 
14
- /llms-full.txt
15
-
16
14
  # Plain temp dirs
17
15
  .plain
18
16
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain.models
3
- Version: 0.43.0
3
+ Version: 0.45.0
4
4
  Summary: Model your data and store it in a database.
5
5
  Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
6
6
  License-File: LICENSE
@@ -1,5 +1,26 @@
1
1
  # plain-models changelog
2
2
 
3
+ ## [0.45.0](https://github.com/dropseed/plain/releases/plain-models@0.45.0) (2025-09-21)
4
+
5
+ ### What's changed
6
+
7
+ - Added unlimited varchar support to SQLite - CharField fields without a max_length now generate `varchar` columns instead of `varchar()` with no length specified ([c5c0c3a](https://github.com/dropseed/plain/commit/c5c0c3a743))
8
+
9
+ ### Upgrade instructions
10
+
11
+ - No changes required
12
+
13
+ ## [0.44.0](https://github.com/dropseed/plain/releases/plain-models@0.44.0) (2025-09-19)
14
+
15
+ ### What's changed
16
+
17
+ - PostgreSQL backup restoration now drops and recreates the database instead of using `pg_restore --clean`, providing more reliable restoration by terminating active connections and ensuring a completely clean database state ([a8865fe](https://github.com/dropseed/plain/commit/a8865fe5d6))
18
+ - Added `_meta` type annotation to the `Model` class for improved type checking and IDE support ([387b92e](https://github.com/dropseed/plain/commit/387b92e08b))
19
+
20
+ ### Upgrade instructions
21
+
22
+ - No changes required
23
+
3
24
  ## [0.43.0](https://github.com/dropseed/plain/releases/plain-models@0.43.0) (2025-09-12)
4
25
 
5
26
  ### What's changed
@@ -39,6 +39,12 @@ def adapt_datetime(val):
39
39
  return val.isoformat(" ")
40
40
 
41
41
 
42
+ def _get_varchar_column(data):
43
+ if data["max_length"] is None:
44
+ return "varchar"
45
+ return "varchar({max_length})".format(**data)
46
+
47
+
42
48
  Database.register_converter("bool", b"1".__eq__)
43
49
  Database.register_converter("date", decoder(parse_date))
44
50
  Database.register_converter("time", decoder(parse_time))
@@ -60,7 +66,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
60
66
  "PrimaryKeyField": "integer",
61
67
  "BinaryField": "BLOB",
62
68
  "BooleanField": "bool",
63
- "CharField": "varchar(%(max_length)s)",
69
+ "CharField": _get_varchar_column,
64
70
  "DateField": "date",
65
71
  "DateTimeField": "datetime",
66
72
  "DecimalField": "decimal",
@@ -31,6 +31,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
31
31
  supports_json_field_contains = False
32
32
  supports_update_conflicts = Database.sqlite_version_info >= (3, 24, 0)
33
33
  supports_update_conflicts_with_target = supports_update_conflicts
34
+ supports_unlimited_charfield = True
34
35
 
35
36
  @cached_property
36
37
  def supports_atomic_references_rename(self):
@@ -64,29 +64,47 @@ class PostgresBackupClient:
64
64
  cmd, env={**os.environ, **self.get_env()}, check=True, shell=True
65
65
  )
66
66
 
67
- def restore_backup(self, backup_path, *, pg_restore="pg_restore"):
67
+ def restore_backup(self, backup_path, *, pg_restore="pg_restore", psql="psql"):
68
68
  settings_dict = self.connection.settings_dict
69
69
 
70
- args = pg_restore.split()
71
- options = settings_dict.get("OPTIONS", {})
72
-
73
70
  host = settings_dict.get("HOST")
74
71
  port = settings_dict.get("PORT")
75
72
  dbname = settings_dict.get("NAME")
76
73
  user = settings_dict.get("USER")
77
- service = options.get("service")
78
74
 
79
- if not dbname and not service:
80
- # Connect to the default 'postgres' db.
81
- dbname = "postgres"
75
+ # Build common connection args
76
+ conn_args = []
82
77
  if user:
83
- args += ["-U", user]
78
+ conn_args += ["-U", user]
84
79
  if host:
85
- args += ["-h", host]
80
+ conn_args += ["-h", host]
86
81
  if port:
87
- args += ["-p", str(port)]
88
-
89
- args += ["--clean"] # Drop existing tables
82
+ conn_args += ["-p", str(port)]
83
+
84
+ # First, drop and recreate the database
85
+ # Connect to 'template1' database to do this (works for all databases including 'postgres')
86
+ drop_create_cmds = [
87
+ f"SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '{dbname}' AND pid <> pg_backend_pid()",
88
+ f'DROP DATABASE IF EXISTS "{dbname}"',
89
+ f'CREATE DATABASE "{dbname}"',
90
+ ]
91
+
92
+ for cmd in drop_create_cmds:
93
+ psql_args = (
94
+ psql.split()
95
+ + conn_args
96
+ + [
97
+ "-d",
98
+ "template1", # Always use template1
99
+ "-c",
100
+ cmd,
101
+ ]
102
+ )
103
+ subprocess.run(psql_args, env={**os.environ, **self.get_env()}, check=True)
104
+
105
+ # Now restore into the fresh database
106
+ args = pg_restore.split()
107
+ args += conn_args
90
108
  args += ["-d", dbname]
91
109
 
92
110
  # Using stdin/stdout let's us use executables from within a docker container too
@@ -193,6 +193,7 @@ class ModelState:
193
193
 
194
194
 
195
195
  class Model(metaclass=ModelBase):
196
+ _meta: Options
196
197
  DoesNotExist: type[ObjectDoesNotExist]
197
198
  MultipleObjectsReturned: type[MultipleObjectsReturned]
198
199
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plain.models"
3
- version = "0.43.0"
3
+ version = "0.45.0"
4
4
  description = "Model your data and store it in a database."
5
5
  authors = [{name = "Dave Gaeddert", email = "dave.gaeddert@dropseed.dev"}]
6
6
  readme = "README.md"
File without changes
File without changes