django-users-iag-usp 0.1.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.
- django_users_iag_usp-0.1.0/.gitignore +11 -0
- django_users_iag_usp-0.1.0/.python-version +1 -0
- django_users_iag_usp-0.1.0/PKG-INFO +13 -0
- django_users_iag_usp-0.1.0/README.md +0 -0
- django_users_iag_usp-0.1.0/manage.py +31 -0
- django_users_iag_usp-0.1.0/pyproject.toml +37 -0
- django_users_iag_usp-0.1.0/src/__init__.py +0 -0
- django_users_iag_usp-0.1.0/src/ldap/__init__.py +0 -0
- django_users_iag_usp-0.1.0/src/ldap/admin.py +3 -0
- django_users_iag_usp-0.1.0/src/ldap/apps.py +7 -0
- django_users_iag_usp-0.1.0/src/ldap/migrations/0001_initial.py +46 -0
- django_users_iag_usp-0.1.0/src/ldap/migrations/0002_alter_ldapuser_created_at_alter_ldapuser_updated_at.py +23 -0
- django_users_iag_usp-0.1.0/src/ldap/migrations/__init__.py +0 -0
- django_users_iag_usp-0.1.0/src/ldap/models.py +14 -0
- django_users_iag_usp-0.1.0/tests/__init__.py +0 -0
- django_users_iag_usp-0.1.0/tests/conftest.py +55 -0
- django_users_iag_usp-0.1.0/tests/test_ldap_models.py +36 -0
- django_users_iag_usp-0.1.0/uv.lock +124 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: django-users-iag-usp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Add your description here
|
|
5
|
+
Author-email: Marcelo Schneider <schenider.fei@gmail.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: custom-user,django
|
|
8
|
+
Classifier: Framework :: Django
|
|
9
|
+
Classifier: Framework :: Django :: 4.2
|
|
10
|
+
Classifier: Framework :: Django :: 5.0
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Requires-Python: >=3.13
|
|
13
|
+
Requires-Dist: django>=6.0.1
|
|
File without changes
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
import django
|
|
4
|
+
from django.conf import settings
|
|
5
|
+
from django.core.management import execute_from_command_line
|
|
6
|
+
|
|
7
|
+
BASE_DIR = Path(__file__).resolve().parent
|
|
8
|
+
sys.path.insert(0, str(BASE_DIR / "src"))
|
|
9
|
+
|
|
10
|
+
if __name__ == "__main__":
|
|
11
|
+
if not settings.configured:
|
|
12
|
+
settings.configure(
|
|
13
|
+
DEBUG=True,
|
|
14
|
+
SECRET_KEY='dev-key',
|
|
15
|
+
DATABASES={
|
|
16
|
+
'default': {
|
|
17
|
+
'ENGINE': 'django.db.backends.sqlite3',
|
|
18
|
+
'NAME': BASE_DIR / 'db.sqlite3',
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
INSTALLED_APPS=[
|
|
22
|
+
'django.contrib.auth',
|
|
23
|
+
'django.contrib.contenttypes',
|
|
24
|
+
'ldap',
|
|
25
|
+
],
|
|
26
|
+
AUTH_USER_MODEL='ldap.LdapUser',
|
|
27
|
+
)
|
|
28
|
+
django.setup()
|
|
29
|
+
|
|
30
|
+
# Passa os argumentos do terminal para o Django
|
|
31
|
+
execute_from_command_line(sys.argv)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "django-users-iag-usp"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Add your description here"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.13"
|
|
7
|
+
license = { text = "MIT" }
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "Marcelo Schneider", email = "schenider.fei@gmail.com" }
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
keywords = ["django", "custom-user"]
|
|
13
|
+
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Framework :: Django",
|
|
16
|
+
"Framework :: Django :: 4.2",
|
|
17
|
+
"Framework :: Django :: 5.0",
|
|
18
|
+
"Programming Language :: Python :: 3",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
dependencies = [
|
|
22
|
+
"django>=6.0.1",
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
[dependency-groups]
|
|
26
|
+
dev = [
|
|
27
|
+
"pytest>=9.0.2",
|
|
28
|
+
]
|
|
29
|
+
[build-system]
|
|
30
|
+
requires = ["hatchling"]
|
|
31
|
+
build-backend = "hatchling.build"
|
|
32
|
+
|
|
33
|
+
[tool.pytest.ini_options]
|
|
34
|
+
pythonpath = ["src"]
|
|
35
|
+
|
|
36
|
+
[tool.hatch.build.targets.wheel]
|
|
37
|
+
packages = ["src/ldap"]
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Generated by Django 6.0.1 on 2026-01-20 13:05
|
|
2
|
+
|
|
3
|
+
import django.contrib.auth.models
|
|
4
|
+
import django.contrib.auth.validators
|
|
5
|
+
import django.utils.timezone
|
|
6
|
+
from django.db import migrations, models
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Migration(migrations.Migration):
|
|
10
|
+
|
|
11
|
+
initial = True
|
|
12
|
+
|
|
13
|
+
dependencies = [
|
|
14
|
+
('auth', '0012_alter_user_first_name_max_length'),
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
operations = [
|
|
18
|
+
migrations.CreateModel(
|
|
19
|
+
name='LdapUser',
|
|
20
|
+
fields=[
|
|
21
|
+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
22
|
+
('password', models.CharField(max_length=128, verbose_name='password')),
|
|
23
|
+
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
|
|
24
|
+
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
|
|
25
|
+
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
|
|
26
|
+
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
|
|
27
|
+
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
|
|
28
|
+
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
|
|
29
|
+
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
|
|
30
|
+
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
|
31
|
+
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
|
32
|
+
('groups', models.TextField()),
|
|
33
|
+
('created_at', models.DateField()),
|
|
34
|
+
('updated_at', models.DateField()),
|
|
35
|
+
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
|
|
36
|
+
],
|
|
37
|
+
options={
|
|
38
|
+
'verbose_name': 'user',
|
|
39
|
+
'verbose_name_plural': 'users',
|
|
40
|
+
'abstract': False,
|
|
41
|
+
},
|
|
42
|
+
managers=[
|
|
43
|
+
('objects', django.contrib.auth.models.UserManager()),
|
|
44
|
+
],
|
|
45
|
+
),
|
|
46
|
+
]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Generated by Django 6.0.1 on 2026-01-20 13:35
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
('ldap', '0001_initial'),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AlterField(
|
|
14
|
+
model_name='ldapuser',
|
|
15
|
+
name='created_at',
|
|
16
|
+
field=models.DateField(auto_now_add=True),
|
|
17
|
+
),
|
|
18
|
+
migrations.AlterField(
|
|
19
|
+
model_name='ldapuser',
|
|
20
|
+
name='updated_at',
|
|
21
|
+
field=models.DateField(auto_now=True),
|
|
22
|
+
),
|
|
23
|
+
]
|
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from django.contrib.auth.models import AbstractUser
|
|
2
|
+
from django.db import models
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class LdapUser(AbstractUser):
|
|
6
|
+
groups = models.TextField()
|
|
7
|
+
created_at = models.DateField(auto_now_add=True)
|
|
8
|
+
updated_at = models.DateField(auto_now=True)
|
|
9
|
+
|
|
10
|
+
def get_setor(self):
|
|
11
|
+
groups_striped = self.groups.replace(" ", "")
|
|
12
|
+
groups = groups_striped.split(",")
|
|
13
|
+
return groups
|
|
14
|
+
|
|
File without changes
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from django.conf import settings
|
|
5
|
+
from django.core.management import call_command
|
|
6
|
+
import django
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
def pytest_configure():
|
|
10
|
+
"""
|
|
11
|
+
Configura o Django antes da coleta de testes.
|
|
12
|
+
Isso evita o erro de 'AppRegistryNotReady' durante imports globais.
|
|
13
|
+
"""
|
|
14
|
+
base_dir = Path(__file__).resolve().parent
|
|
15
|
+
src_dir = base_dir / "src"
|
|
16
|
+
sys.path.insert(0, str(src_dir))
|
|
17
|
+
|
|
18
|
+
if not settings.configured:
|
|
19
|
+
settings.configure(
|
|
20
|
+
DEBUG=True,
|
|
21
|
+
SECRET_KEY='test-secret-key',
|
|
22
|
+
DATABASES={
|
|
23
|
+
'default': {
|
|
24
|
+
'ENGINE': 'django.db.backends.sqlite3',
|
|
25
|
+
'NAME': ':memory:',
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
INSTALLED_APPS=[
|
|
29
|
+
'django.contrib.auth',
|
|
30
|
+
'django.contrib.contenttypes',
|
|
31
|
+
'django.contrib.admin',
|
|
32
|
+
'django.contrib.messages',
|
|
33
|
+
'ldap',
|
|
34
|
+
],
|
|
35
|
+
# Ponto CRUCIAL para testar Custom Users:
|
|
36
|
+
AUTH_USER_MODEL='ldap.LdapUser',
|
|
37
|
+
|
|
38
|
+
# Necessário para admin e auth
|
|
39
|
+
MIDDLEWARE=[
|
|
40
|
+
'django.contrib.sessions.middleware.SessionMiddleware',
|
|
41
|
+
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
|
42
|
+
'django.contrib.messages.middleware.MessageMiddleware',
|
|
43
|
+
],
|
|
44
|
+
TEMPLATES=[{
|
|
45
|
+
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
|
46
|
+
'APP_DIRS': True,
|
|
47
|
+
}],
|
|
48
|
+
)
|
|
49
|
+
django.setup()
|
|
50
|
+
call_command("migrate", verbosity=0)
|
|
51
|
+
|
|
52
|
+
@pytest.fixture
|
|
53
|
+
def user_model():
|
|
54
|
+
from django.contrib.auth import get_user_model
|
|
55
|
+
return get_user_model()
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from ldap.models import LdapUser
|
|
2
|
+
from django.db.models import Model
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def test_is_instance_of_models():
|
|
6
|
+
assert issubclass(LdapUser, Model)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_model_has_attributes():
|
|
10
|
+
attributes = [
|
|
11
|
+
"username",
|
|
12
|
+
"first_name",
|
|
13
|
+
"last_name",
|
|
14
|
+
"email",
|
|
15
|
+
"groups",
|
|
16
|
+
"password",
|
|
17
|
+
"created_at",
|
|
18
|
+
"updated_at"
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
for attr in attributes:
|
|
22
|
+
assert hasattr(LdapUser, attr)
|
|
23
|
+
|
|
24
|
+
def test_get_setor():
|
|
25
|
+
user_data = {
|
|
26
|
+
"username": "3222233",
|
|
27
|
+
"first_name": "First",
|
|
28
|
+
"last_name": "Last",
|
|
29
|
+
"email": "first@test.com",
|
|
30
|
+
"groups": "GTI, PCA",
|
|
31
|
+
"password": "0982349"
|
|
32
|
+
}
|
|
33
|
+
user = LdapUser.objects.create(**user_data)
|
|
34
|
+
setor = user.get_setor()
|
|
35
|
+
assert setor == ["GTI", "PCA"]
|
|
36
|
+
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
version = 1
|
|
2
|
+
revision = 3
|
|
3
|
+
requires-python = ">=3.13"
|
|
4
|
+
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "asgiref"
|
|
7
|
+
version = "3.11.0"
|
|
8
|
+
source = { registry = "https://pypi.org/simple" }
|
|
9
|
+
sdist = { url = "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", hash = "sha256:13acff32519542a1736223fb79a715acdebe24286d98e8b164a73085f40da2c4", size = 37969, upload-time = "2025-11-19T15:32:20.106Z" }
|
|
10
|
+
wheels = [
|
|
11
|
+
{ url = "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", hash = "sha256:1db9021efadb0d9512ce8ffaf72fcef601c7b73a8807a1bb2ef143dc6b14846d", size = 24096, upload-time = "2025-11-19T15:32:19.004Z" },
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
[[package]]
|
|
15
|
+
name = "colorama"
|
|
16
|
+
version = "0.4.6"
|
|
17
|
+
source = { registry = "https://pypi.org/simple" }
|
|
18
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
|
|
19
|
+
wheels = [
|
|
20
|
+
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
[[package]]
|
|
24
|
+
name = "django"
|
|
25
|
+
version = "6.0.1"
|
|
26
|
+
source = { registry = "https://pypi.org/simple" }
|
|
27
|
+
dependencies = [
|
|
28
|
+
{ name = "asgiref" },
|
|
29
|
+
{ name = "sqlparse" },
|
|
30
|
+
{ name = "tzdata", marker = "sys_platform == 'win32'" },
|
|
31
|
+
]
|
|
32
|
+
sdist = { url = "https://files.pythonhosted.org/packages/b5/9b/016f7e55e855ee738a352b05139d4f8b278d0b451bd01ebef07456ef3b0e/django-6.0.1.tar.gz", hash = "sha256:ed76a7af4da21551573b3d9dfc1f53e20dd2e6c7d70a3adc93eedb6338130a5f", size = 11069565, upload-time = "2026-01-06T18:55:53.069Z" }
|
|
33
|
+
wheels = [
|
|
34
|
+
{ url = "https://files.pythonhosted.org/packages/95/b5/814ed98bd21235c116fd3436a7ed44d47560329a6d694ec8aac2982dbb93/django-6.0.1-py3-none-any.whl", hash = "sha256:a92a4ff14f664a896f9849009cb8afaca7abe0d6fc53325f3d1895a15253433d", size = 8338791, upload-time = "2026-01-06T18:55:46.175Z" },
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[[package]]
|
|
38
|
+
name = "django-users"
|
|
39
|
+
version = "0.1.0"
|
|
40
|
+
source = { virtual = "." }
|
|
41
|
+
dependencies = [
|
|
42
|
+
{ name = "django" },
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
[package.dev-dependencies]
|
|
46
|
+
dev = [
|
|
47
|
+
{ name = "pytest" },
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
[package.metadata]
|
|
51
|
+
requires-dist = [{ name = "django", specifier = ">=6.0.1" }]
|
|
52
|
+
|
|
53
|
+
[package.metadata.requires-dev]
|
|
54
|
+
dev = [{ name = "pytest", specifier = ">=9.0.2" }]
|
|
55
|
+
|
|
56
|
+
[[package]]
|
|
57
|
+
name = "iniconfig"
|
|
58
|
+
version = "2.3.0"
|
|
59
|
+
source = { registry = "https://pypi.org/simple" }
|
|
60
|
+
sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
|
|
61
|
+
wheels = [
|
|
62
|
+
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
[[package]]
|
|
66
|
+
name = "packaging"
|
|
67
|
+
version = "25.0"
|
|
68
|
+
source = { registry = "https://pypi.org/simple" }
|
|
69
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
|
|
70
|
+
wheels = [
|
|
71
|
+
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
[[package]]
|
|
75
|
+
name = "pluggy"
|
|
76
|
+
version = "1.6.0"
|
|
77
|
+
source = { registry = "https://pypi.org/simple" }
|
|
78
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
|
|
79
|
+
wheels = [
|
|
80
|
+
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
[[package]]
|
|
84
|
+
name = "pygments"
|
|
85
|
+
version = "2.19.2"
|
|
86
|
+
source = { registry = "https://pypi.org/simple" }
|
|
87
|
+
sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
|
|
88
|
+
wheels = [
|
|
89
|
+
{ url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
|
|
90
|
+
]
|
|
91
|
+
|
|
92
|
+
[[package]]
|
|
93
|
+
name = "pytest"
|
|
94
|
+
version = "9.0.2"
|
|
95
|
+
source = { registry = "https://pypi.org/simple" }
|
|
96
|
+
dependencies = [
|
|
97
|
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
98
|
+
{ name = "iniconfig" },
|
|
99
|
+
{ name = "packaging" },
|
|
100
|
+
{ name = "pluggy" },
|
|
101
|
+
{ name = "pygments" },
|
|
102
|
+
]
|
|
103
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
|
|
104
|
+
wheels = [
|
|
105
|
+
{ url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
|
|
106
|
+
]
|
|
107
|
+
|
|
108
|
+
[[package]]
|
|
109
|
+
name = "sqlparse"
|
|
110
|
+
version = "0.5.5"
|
|
111
|
+
source = { registry = "https://pypi.org/simple" }
|
|
112
|
+
sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" }
|
|
113
|
+
wheels = [
|
|
114
|
+
{ url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" },
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
[[package]]
|
|
118
|
+
name = "tzdata"
|
|
119
|
+
version = "2025.3"
|
|
120
|
+
source = { registry = "https://pypi.org/simple" }
|
|
121
|
+
sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" }
|
|
122
|
+
wheels = [
|
|
123
|
+
{ url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" },
|
|
124
|
+
]
|