Skip to content

Commit b8990f9

Browse files
authoredMar 18, 2025··
Remove codecovopentelem integration (#1212)
1 parent b4563c1 commit b8990f9

File tree

11 files changed

+118
-481
lines changed

11 files changed

+118
-481
lines changed
 

‎api/internal/tests/test_charts.py

+17-25
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66

77
import pytest
88
from dateutil.relativedelta import relativedelta
9-
from ddf import G
109
from django.test import TestCase, override_settings
1110
from django.utils import timezone
1211
from factory.faker import faker
1312
from pytz import UTC
1413
from rest_framework.exceptions import ValidationError
1514
from rest_framework.reverse import reverse
16-
from shared.django_apps.core.tests.factories import OwnerFactory, RepositoryFactory
15+
from shared.django_apps.core.tests.factories import (
16+
CommitFactory,
17+
OwnerFactory,
18+
RepositoryFactory,
19+
)
1720

1821
from api.internal.chart.filters import apply_default_filters, apply_simple_filters
1922
from api.internal.chart.helpers import (
@@ -84,8 +87,7 @@ def setup_commits(
8487
ci_passed = True if meets_default_filters else False
8588
deleted = False if meets_default_filters else True
8689

87-
G(
88-
Commit,
90+
CommitFactory(
8991
repository=repo,
9092
branch=branch,
9193
timestamp=timestamp,
@@ -340,8 +342,7 @@ def test_apply_simple_filters_branch_filtering(self):
340342

341343
def test_annotate_commits_with_totals(self):
342344
with_complexity_commitid = "i230tky2"
343-
G(
344-
Commit,
345+
CommitFactory(
345346
commitid=with_complexity_commitid,
346347
totals={"n": 0, "h": 0, "p": 0, "m": 0, "c": 0, "C": 0, "N": 1},
347348
)
@@ -361,8 +362,7 @@ def test_annotate_commits_with_totals(self):
361362

362363
def test_annotate_commit_with_totals_no_complexity_sets_ratio_to_None(self):
363364
no_complexity_commitid = "sdfkjwepj42"
364-
G(
365-
Commit,
365+
CommitFactory(
366366
commitid=no_complexity_commitid,
367367
totals={"n": 0, "h": 0, "p": 0, "m": 0, "c": 0, "C": 0, "N": 0},
368368
)
@@ -524,22 +524,19 @@ def setUp(self):
524524
self.repo4.repoid,
525525
]
526526
)
527-
self.commit1 = G(
528-
model=Commit,
527+
self.commit1 = CommitFactory(
529528
repository=self.repo1,
530529
totals={"h": 100, "n": 120, "p": 10, "m": 10},
531530
branch=self.repo1.branch,
532531
state="complete",
533532
)
534-
self.commit2 = G(
535-
model=Commit,
533+
self.commit2 = CommitFactory(
536534
repository=self.repo2,
537535
totals={"h": 14, "n": 25, "p": 6, "m": 5},
538536
branch=self.repo2.branch,
539537
state="complete",
540538
)
541-
self.commit3 = G(
542-
model=Commit,
539+
self.commit3 = CommitFactory(
543540
repository=self.repo3,
544541
totals={"h": 14, "n": 25, "p": 6, "m": 5},
545542
branch=self.repo3.branch,
@@ -751,21 +748,19 @@ def test_first_complete_commit_date_returns_date_of_first_complete_commit_in_rep
751748
)
752749
self.user.permission = [repo1.repoid, repo2.repoid]
753750
self.user.save()
754-
G(
755-
model=Commit,
751+
CommitFactory(
756752
repository=repo1,
757753
branch=repo1.branch,
758754
state="pending",
759755
timestamp=timezone.now() - timedelta(days=7),
760756
)
761-
commit1 = G(
762-
model=Commit,
757+
commit1 = CommitFactory(
763758
repository=repo1,
764759
branch=repo1.branch,
765760
state="complete",
766761
timestamp=timezone.now() - timedelta(days=3),
767762
)
768-
G(model=Commit, repository=repo2, branch=repo2.branch, state="complete")
763+
CommitFactory(repository=repo2, branch=repo2.branch, state="complete")
769764

770765
qr = ChartQueryRunner(
771766
self.user,
@@ -795,8 +790,7 @@ def test_start_date(self):
795790
repo = RepositoryFactory(author=self.org, active=True)
796791
self.user.permission = [repo.repoid]
797792
self.user.save()
798-
commit = G(
799-
model=Commit,
793+
commit = CommitFactory(
800794
repository=repo,
801795
branch=repo.branch,
802796
state="complete",
@@ -957,15 +951,13 @@ def setUp(self):
957951
self.current_owner = OwnerFactory(
958952
permission=[self.repo1.repoid, self.repo2.repoid]
959953
)
960-
self.commit1 = G(
961-
model=Commit,
954+
self.commit1 = CommitFactory(
962955
repository=self.repo1,
963956
totals={"h": 100, "n": 120, "p": 10, "m": 10},
964957
branch=self.repo1.branch,
965958
state="complete",
966959
)
967-
self.commit2 = G(
968-
model=Commit,
960+
self.commit2 = CommitFactory(
969961
repository=self.repo2,
970962
totals={"h": 14, "n": 25, "p": 6, "m": 5},
971963
branch=self.repo2.branch,

‎api/public/v2/compare/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from distutils.util import strtobool
21
from drf_spectacular.types import OpenApiTypes
32
from drf_spectacular.utils import OpenApiParameter, extend_schema
43
from rest_framework import mixins
@@ -15,6 +14,7 @@
1514
)
1615
from services.components import ComponentComparison, commit_components
1716
from services.decorators import torngit_safe
17+
from utils import strtobool
1818

1919
from .serializers import ComparisonSerializer, ComponentComparisonSerializer
2020

‎codecov/wsgi.py

-8
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,5 @@
1414
from utils.config import get_settings_module
1515

1616
os.environ.setdefault("DJANGO_SETTINGS_MODULE", get_settings_module())
17-
if (
18-
os.getenv("OPENTELEMETRY_ENDPOINT")
19-
and os.getenv("OPENTELEMETRY_TOKEN")
20-
and os.getenv("OPENTELEMETRY_CODECOV_RATE")
21-
):
22-
from open_telemetry import instrument
23-
24-
instrument()
2517

2618
application = get_wsgi_application()

‎codecov_auth/views/bitbucket_server.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import threading
44
from urllib.parse import urlencode
55

6-
import oauth2 as oauth
76
from asgiref.sync import async_to_sync
87
from django.conf import settings
98
from django.shortcuts import redirect
@@ -28,7 +27,7 @@ async def fetch_user_data(self, token):
2827
key=settings.BITBUCKET_SERVER_CLIENT_ID,
2928
secret=settings.BITBUCKET_SERVER_CLIENT_SECRET,
3029
),
31-
token=oauth.Token(token["key"], token["secret"]),
30+
token=token,
3231
)
3332
# Whoami? Get the user
3433
# https://answers.atlassian.com/questions/9379031/answers/9379803
@@ -103,7 +102,7 @@ async def actual_login_step(self, request):
103102
cookie_key, cookie_secret = [
104103
base64.b64decode(i).decode() for i in request_cookie.split("|")
105104
]
106-
token = oauth.Token(cookie_key, cookie_secret)
105+
token = {"key": cookie_key, "secret": cookie_secret}
107106
repo_service = BitbucketServer(
108107
oauth_consumer_token=dict(
109108
key=settings.BITBUCKET_SERVER_CLIENT_ID,

‎graphql_api/types/config/config.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
from ariadne import ObjectType
44
from asgiref.sync import sync_to_async
5-
from distutils.util import strtobool
65
from django.conf import settings
76
from graphql.type.definition import GraphQLResolveInfo
87

98
import services.self_hosted as self_hosted
109
from graphql_api.types.enums.enums import LoginProvider, SyncProvider
10+
from utils import strtobool
1111

1212
config_bindable = ObjectType("Config")
1313

‎open_telemetry.py

-191
This file was deleted.

‎pyproject.toml

-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ dependencies = [
1515
"django-cors-headers==3.7.0",
1616
"django-csp==3.8.0",
1717
"django-cursor-pagination==0.3.0",
18-
"django-dynamic-fixture==3.1.1",
1918
"django-filter==2.4.0",
2019
"django-model-utils==4.5.1",
2120
"django-postgres-extra>=2.0.8",
@@ -30,9 +29,6 @@ dependencies = [
3029
"idna>=3.7",
3130
"minio==7.1.13",
3231
"multidict>=6.1.0",
33-
"oauth2==1.9.0.post1",
34-
"opentelemetry-instrumentation-django>=0.45b0",
35-
"opentelemetry-sdk>=1.24.0",
3632
"polars==1.12.0",
3733
"psycopg2-binary>=2.9.10",
3834
"pydantic>=2.9.0",

‎upload/tests/test_upload.py

+71-67
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import pytest
88
import requests
99
import rest_framework
10-
from ddf import G
1110
from django.core.exceptions import MultipleObjectsReturned
1211
from django.test import TestCase, override_settings
1312
from django.utils import timezone
@@ -17,16 +16,21 @@
1716
from rest_framework.reverse import reverse
1817
from rest_framework.test import APITestCase
1918
from shared.api_archive.archive import ArchiveService
20-
from shared.django_apps.core.tests.factories import OwnerFactory
19+
from shared.django_apps.codecov_auth.tests.factories import PlanFactory, TierFactory
20+
from shared.django_apps.core.tests.factories import (
21+
CommitFactory,
22+
OwnerFactory,
23+
RepositoryFactory,
24+
)
25+
from shared.plan.constants import TierName
2126
from shared.torngit.exceptions import (
2227
TorngitClientGeneralError,
2328
TorngitObjectNotFoundError,
2429
TorngitRateLimitError,
2530
)
2631
from simplejson import JSONDecodeError
2732

28-
from codecov_auth.models import Owner
29-
from core.models import Commit, Repository
33+
from core.models import Commit
3034
from reports.tests.factories import CommitReportFactory, UploadFactory
3135
from upload.helpers import (
3236
determine_repo_for_upload,
@@ -297,8 +301,8 @@ def test_get_global_tokens(self, mock_get_config):
297301

298302
def test_determine_repo_upload(self):
299303
with self.subTest("token found"):
300-
org = G(Owner)
301-
repo = G(Repository, author=org)
304+
org = OwnerFactory()
305+
repo = RepositoryFactory(author=org)
302306

303307
params = {
304308
"version": "v4",
@@ -309,8 +313,8 @@ def test_determine_repo_upload(self):
309313
assert repo == determine_repo_for_upload(params)
310314

311315
with self.subTest("token not found"):
312-
org = G(Owner)
313-
repo = G(Repository, author=org)
316+
org = OwnerFactory()
317+
repo = RepositoryFactory(author=org)
314318

315319
params = {
316320
"version": "v4",
@@ -329,8 +333,8 @@ def test_determine_repo_upload(self):
329333

330334
@patch.object(requests, "get")
331335
def test_determine_repo_upload_tokenless(self, mock_get):
332-
org = G(Owner, username="codecov", service="github")
333-
repo = G(Repository, author=org)
336+
org = OwnerFactory(username="codecov", service="github")
337+
repo = RepositoryFactory(author=org)
334338
expected_response = {
335339
"id": 732059764,
336340
"finishTime": f"{datetime.now()}",
@@ -498,12 +502,11 @@ def test_determine_upload_commit_to_use(
498502
}
499503

500504
with self.subTest("not a github commit"):
501-
org = G(
502-
Owner,
505+
org = OwnerFactory(
503506
service="bitbucket",
504507
oauth_token=encryptor.encode("hahahahaha").decode(),
505508
)
506-
repo = G(Repository, author=org)
509+
repo = RepositoryFactory(author=org)
507510
upload_params = {
508511
"service": "bitbucket",
509512
"commit": "3be5c52bd748c508a7e96993c02cf3518c816e84",
@@ -514,12 +517,11 @@ def test_determine_upload_commit_to_use(
514517
)
515518

516519
with self.subTest("merge commit"):
517-
org = G(
518-
Owner,
520+
org = OwnerFactory(
519521
service="github",
520522
oauth_token=encryptor.encode("hahahahaha").decode(),
521523
)
522-
repo = G(Repository, author=org)
524+
repo = RepositoryFactory(author=org)
523525
upload_params = {
524526
"service": "github",
525527
"commit": "3084886b7ff869dcf327ad1d28a8b7d34adc7584",
@@ -531,8 +533,8 @@ def test_determine_upload_commit_to_use(
531533
)
532534

533535
with self.subTest("just no bot available"):
534-
org = G(Owner, service="github", oauth_token=None)
535-
repo = G(Repository, author=org, private=True)
536+
org = OwnerFactory(service="github", oauth_token=None)
537+
repo = RepositoryFactory(author=org, private=True)
536538
upload_params = {
537539
"service": "github",
538540
"commit": "3084886b7ff869dcf327ad1d28a8b7d34adc7584",
@@ -544,12 +546,11 @@ def test_determine_upload_commit_to_use(
544546
)
545547

546548
with self.subTest("merge commit with did_change_merge_commit argument"):
547-
org = G(
548-
Owner,
549+
org = OwnerFactory(
549550
service="github",
550551
oauth_token=encryptor.encode("hahahahaha").decode(),
551552
)
552-
repo = G(Repository, author=org)
553+
repo = RepositoryFactory(author=org)
553554
upload_params = {
554555
"service": "github",
555556
"commit": "3084886b7ff869dcf327ad1d28a8b7d34adc7584",
@@ -563,8 +564,8 @@ def test_determine_upload_commit_to_use(
563564

564565
with self.subTest("use repo bot token when available"):
565566
bot = OwnerFactory()
566-
org = G(Owner, service="github")
567-
repo = G(Repository, author=org, bot=bot)
567+
org = OwnerFactory(service="github")
568+
repo = RepositoryFactory(author=org, bot=bot)
568569

569570
upload_params = {
570571
"service": "github",
@@ -581,8 +582,8 @@ def test_determine_upload_commit_to_use(
581582
mock_async.side_effect = [TorngitClientGeneralError(500, None, None)]
582583

583584
with self.subTest("HTTP error"):
584-
org = G(Owner, service="github")
585-
repo = G(Repository, author=org)
585+
org = OwnerFactory(service="github")
586+
repo = RepositoryFactory(author=org)
586587
upload_params = {
587588
"service": "github",
588589
"commit": "3084886b7ff869dcf327ad1d28a8b7d34adc7584",
@@ -596,8 +597,8 @@ def test_determine_upload_commit_to_use(
596597
mock_async.side_effect = [TorngitObjectNotFoundError(500, None)]
597598

598599
with self.subTest("HTTP error"):
599-
org = G(Owner, service="github")
600-
repo = G(Repository, author=org)
600+
org = OwnerFactory(service="github")
601+
repo = RepositoryFactory(author=org)
601602
upload_params = {
602603
"service": "github",
603604
"commit": "3084886b7ff869dcf327ad1d28a8b7d34adc7584",
@@ -609,8 +610,8 @@ def test_determine_upload_commit_to_use(
609610
)
610611

611612
def test_insert_commit(self):
612-
org = G(Owner)
613-
repo = G(Repository, author=org)
613+
org = OwnerFactory()
614+
repo = RepositoryFactory(author=org)
614615

615616
with self.subTest("newly created"):
616617
insert_commit(
@@ -628,8 +629,7 @@ def test_insert_commit(self):
628629
assert commit.parent_commit_id is None
629630

630631
with self.subTest("commit already in database"):
631-
G(
632-
Commit,
632+
CommitFactory(
633633
commitid="1c78206f1a46dc6db8412a491fc770eb7d0f8a47",
634634
branch="apples",
635635
pullid="456",
@@ -656,7 +656,7 @@ def test_insert_commit(self):
656656
assert commit.parent_commit_id == "different_parent_commit"
657657

658658
with self.subTest("parent provided"):
659-
parent = G(Commit)
659+
parent = CommitFactory()
660660
insert_commit(
661661
"8458a8c72aafb5fb4c5cd58f467a2f71298f1b61",
662662
"test",
@@ -715,9 +715,9 @@ def test_parse_request_headers(self):
715715

716716
def test_validate_upload_repository_moved(self):
717717
redis = MockRedis()
718-
owner = G(Owner, plan="users-free")
719-
repo = G(Repository, author=owner, name="")
720-
commit = G(Commit)
718+
owner = OwnerFactory(plan="users-free")
719+
repo = RepositoryFactory(author=owner, name="")
720+
commit = CommitFactory()
721721

722722
with self.assertRaises(ValidationError) as err:
723723
validate_upload({"commit": commit.commitid}, repo, redis)
@@ -729,9 +729,9 @@ def test_validate_upload_repository_moved(self):
729729

730730
def test_validate_upload_empty_totals(self):
731731
redis = MockRedis()
732-
owner = G(Owner, plan="5m")
733-
repo = G(Repository, author=owner)
734-
commit = G(Commit, totals=None, repository=repo)
732+
owner = OwnerFactory(plan="5m")
733+
repo = RepositoryFactory(author=owner)
734+
commit = CommitFactory(totals=None, repository=repo)
735735

736736
validate_upload({"commit": commit.commitid}, repo, redis)
737737
repo.refresh_from_db()
@@ -741,9 +741,9 @@ def test_validate_upload_empty_totals(self):
741741

742742
def test_validate_upload_too_many_uploads_for_commit(self):
743743
redis = MockRedis()
744-
owner = G(Owner, plan="users-free")
745-
repo = G(Repository, author=owner)
746-
commit = G(Commit, totals={"s": 151}, repository=repo)
744+
owner = OwnerFactory(plan="users-free")
745+
repo = RepositoryFactory(author=owner)
746+
commit = CommitFactory(totals={"s": 151}, repository=repo)
747747
report = CommitReportFactory.create(commit=commit)
748748
for i in range(151):
749749
UploadFactory.create(report=report)
@@ -754,9 +754,9 @@ def test_validate_upload_too_many_uploads_for_commit(self):
754754

755755
def test_validate_upload_repository_blacklisted(self):
756756
redis = MockRedis(blacklisted=True)
757-
owner = G(Owner, plan="users-free")
758-
repo = G(Repository, author=owner)
759-
commit = G(Commit)
757+
owner = OwnerFactory(plan="users-free")
758+
repo = RepositoryFactory(author=owner)
759+
commit = CommitFactory()
760760

761761
with self.assertRaises(ValidationError) as err:
762762
validate_upload({"commit": commit.commitid}, repo, redis)
@@ -767,10 +767,12 @@ def test_validate_upload_repository_blacklisted(self):
767767

768768
def test_validate_upload_per_repo_billing_invalid(self):
769769
redis = MockRedis()
770-
owner = G(Owner, plan="1m")
771-
G(Repository, author=owner, private=True, activated=True, active=True)
772-
repo = G(Repository, author=owner, private=True, activated=False, active=False)
773-
commit = G(Commit)
770+
owner = OwnerFactory(plan="1m")
771+
RepositoryFactory(author=owner, private=True, activated=True, active=True)
772+
repo = RepositoryFactory(
773+
author=owner, private=True, activated=False, active=False
774+
)
775+
commit = CommitFactory()
774776

775777
with self.assertRaises(ValidationError) as err:
776778
validate_upload({"commit": commit.commitid}, repo, redis)
@@ -781,22 +783,22 @@ def test_validate_upload_per_repo_billing_invalid(self):
781783

782784
def test_validate_upload_gitlab_subgroups(self):
783785
redis = MockRedis()
784-
parent_group = G(Owner, plan="1m", parent_service_id=None, service="gitlab")
785-
top_subgroup = G(
786-
Owner,
786+
parent_group = OwnerFactory(plan="1m", parent_service_id=None, service="gitlab")
787+
top_subgroup = OwnerFactory(
787788
plan="1m",
788789
parent_service_id=parent_group.service_id,
789790
service="gitlab",
790791
)
791-
bottom_subgroup = G(
792-
Owner,
792+
bottom_subgroup = OwnerFactory(
793793
plan="1m",
794794
parent_service_id=top_subgroup.service_id,
795795
service="gitlab",
796796
)
797-
G(Repository, author=parent_group, private=True, activated=True, active=True)
798-
repo = G(Repository, author=bottom_subgroup, private=True, activated=False)
799-
commit = G(Commit)
797+
RepositoryFactory(
798+
author=parent_group, private=True, activated=True, active=True
799+
)
800+
repo = RepositoryFactory(author=bottom_subgroup, private=True, activated=False)
801+
commit = CommitFactory()
800802

801803
with self.assertRaises(ValidationError) as err:
802804
validate_upload({"commit": commit.commitid}, repo, redis)
@@ -807,16 +809,15 @@ def test_validate_upload_gitlab_subgroups(self):
807809

808810
def test_validate_upload_valid_upload_repo_not_activated(self):
809811
redis = MockRedis()
810-
owner = G(Owner, plan="users-free")
811-
repo = G(
812-
Repository,
812+
owner = OwnerFactory(plan="users-free")
813+
repo = RepositoryFactory(
813814
author=owner,
814815
private=True,
815816
activated=False,
816817
deleted=False,
817818
active=False,
818819
)
819-
commit = G(Commit)
820+
commit = CommitFactory()
820821

821822
with patch(
822823
"services.analytics.AnalyticsService.account_activated_repository_on_upload"
@@ -831,9 +832,9 @@ def test_validate_upload_valid_upload_repo_not_activated(self):
831832

832833
def test_validate_upload_valid_upload_repo_activated(self):
833834
redis = MockRedis()
834-
owner = G(Owner, plan="5m")
835-
repo = G(Repository, author=owner, private=True, activated=True)
836-
commit = G(Commit)
835+
owner = OwnerFactory(plan="5m")
836+
repo = RepositoryFactory(author=owner, private=True, activated=True)
837+
commit = CommitFactory()
837838

838839
with patch(
839840
"services.analytics.AnalyticsService.account_activated_repository_on_upload"
@@ -849,7 +850,7 @@ def test_validate_upload_valid_upload_repo_activated(self):
849850
@freeze_time("2023-01-01T00:00:00")
850851
@patch("services.task.TaskService.upload")
851852
def test_dispatch_upload_task(self, upload):
852-
repo = G(Repository)
853+
repo = RepositoryFactory()
853854
task_arguments = {
854855
"commit": "commit123",
855856
"version": "v4",
@@ -914,9 +915,12 @@ def _post_slash(
914915
return self.client.post(url, data=data, content_type=content_type, **headers)
915916

916917
def setUp(self):
917-
self.org = G(Owner, username="codecovtest", service="github")
918-
self.repo = G(
919-
Repository,
918+
tier = TierFactory(tier_name=TierName.BASIC.value)
919+
plan = PlanFactory(tier=tier, is_active=True)
920+
self.org = OwnerFactory(
921+
plan=plan.name, username="codecovtest", service="github"
922+
)
923+
self.repo = RepositoryFactory(
920924
author=self.org,
921925
name="upload-test-repo",
922926
upload_token="a03e5d02-9495-4413-b0d8-05651bb2e842",

‎upload/tests/test_upload_download.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from unittest.mock import patch
22

33
import minio
4-
from ddf import G
54
from rest_framework.test import APITestCase
5+
from shared.django_apps.codecov_auth.tests.factories import OwnerFactory
6+
from shared.django_apps.core.tests.factories import RepositoryFactory
67

7-
from codecov_auth.models import Owner
8-
from core.models import Repository
8+
from utils.test_utils import Client
99

1010

1111
class UploadDownloadHelperTest(APITestCase):
@@ -14,16 +14,17 @@ def _get(self, kwargs={}, data={}):
1414
return self.client.get(path, data=data)
1515

1616
def setUp(self):
17-
self.org = G(Owner, username="codecovtest", service="github")
18-
self.repo = G(
19-
Repository,
17+
self.org = OwnerFactory(username="codecovtest", service="github")
18+
self.repo = RepositoryFactory(
2019
author=self.org,
2120
name="upload-test-repo",
2221
upload_token="a03e5d02-9495-4413-b0d8-05651bb2e842",
2322
)
24-
self.repo = G(
25-
Repository, author=self.org, name="private-upload-test-repo", private=True
23+
self.repo = RepositoryFactory(
24+
author=self.org, name="private-upload-test-repo", private=True
2625
)
26+
self.client = Client()
27+
self.client.force_login_owner(self.org)
2728

2829
def test_no_path_param(self):
2930
response = self._get(

‎utils/__init__.py

+17
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,20 @@ def round_decimals_down(number: float, decimals: int = 2) -> float:
2424

2525
factor = 10**decimals
2626
return math.floor(number * factor) / factor
27+
28+
29+
# Copied from <https://github.com/python/cpython/blob/v3.11.2/Lib/distutils/util.py#L308>
30+
def strtobool(val: Any) -> int:
31+
"""Convert a string representation of truth to true (1) or false (0).
32+
33+
True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
34+
are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if
35+
'val' is anything else.
36+
"""
37+
val = val.lower()
38+
if val in ("y", "yes", "t", "true", "on", "1"):
39+
return 1
40+
elif val in ("n", "no", "f", "false", "off", "0"):
41+
return 0
42+
else:
43+
raise ValueError("invalid truth value %r" % (val,))

‎uv.lock

-173
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.