Skip to content

Commit 4e9b472

Browse files
committed
Add frontend-required info to code references spec
1 parent 9eda4b1 commit 4e9b472

5 files changed

Lines changed: 28 additions & 9 deletions

File tree

api/projects/code_references/models.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,14 @@
22
from django.db import models
33
from django.db.models.expressions import Func
44

5-
from projects.code_references.types import JSONCodeReference
5+
from projects.code_references.types import JSONCodeReference, VCSProvider
66

77

88
class FeatureFlagCodeReferencesScan(models.Model):
99
"""
1010
A scan of feature flag code references in a repository
1111
"""
1212

13-
class Providers(models.TextChoices):
14-
GITHUB = "github", "GitHub"
15-
1613
project = models.ForeignKey(
1714
"projects.Project",
1815
on_delete=models.CASCADE,
@@ -24,8 +21,8 @@ class Providers(models.TextChoices):
2421

2522
vcs_provider = models.CharField(
2623
max_length=50,
27-
choices=Providers.choices,
28-
default=Providers.GITHUB, # TODO: Remove when adding other providers
24+
choices=VCSProvider.choices,
25+
default=VCSProvider.GITHUB, # TODO: Remove when adding other providers
2926
)
3027
revision = models.CharField(max_length=100)
3128
code_references = models.JSONField[list[JSONCodeReference]](default=list)

api/projects/code_references/serializers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from projects.code_references.types import (
55
CodeReference,
66
FeatureFlagCodeReferences,
7+
VCSProvider,
78
)
89

910

@@ -17,9 +18,11 @@ class _CodeReferenceSubmitSerializer(_BaseCodeReferenceSerializer):
1718

1819

1920
class _CodeReferenceDetailSerializer(_BaseCodeReferenceSerializer):
20-
permalink = serializers.URLField()
2121
scanned_at = serializers.DateTimeField()
22+
vcs_provider = serializers.ChoiceField(choices=VCSProvider.choices)
23+
repository_url = serializers.URLField()
2224
revision = serializers.CharField()
25+
permalink = serializers.URLField()
2326

2427

2528
class FeatureFlagCodeReferencesScanSerializer(

api/projects/code_references/types.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
from datetime import datetime
33
from typing import TypedDict
44

5+
from django.db.models import TextChoices
6+
7+
8+
class VCSProvider(TextChoices):
9+
GITHUB = "github", "GitHub"
10+
511

612
class JSONCodeReference(TypedDict):
713
feature_name: str
@@ -12,6 +18,8 @@ class JSONCodeReference(TypedDict):
1218
@dataclass
1319
class CodeReference:
1420
scanned_at: datetime
21+
vcs_provider: VCSProvider
22+
repository_url: str
1523
revision: str
1624
feature_name: str
1725
file_path: str

api/projects/code_references/views.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from projects.code_references.types import (
2020
CodeReference,
2121
FeatureFlagCodeReferences,
22+
VCSProvider,
2223
)
2324

2425

@@ -92,17 +93,20 @@ def _get_code_references(self) -> list[CodeReference]:
9293

9394
return [
9495
CodeReference(
96+
scanned_at=scan.created_at,
97+
vcs_provider=scan.vcs_provider,
98+
repository_url=scan.repository_url,
99+
revision=scan.revision,
95100
feature_name=feature.name,
96101
file_path=reference["file_path"],
97102
line_number=reference["line_number"],
98103
permalink=self._get_permalink(
104+
provider=scan.vcs_provider,
99105
repository_url=scan.repository_url,
100106
revision=scan.revision,
101107
file_path=reference["file_path"],
102108
line_number=reference["line_number"],
103109
),
104-
scanned_at=scan.created_at,
105-
revision=scan.revision,
106110
)
107111
for scan in last_scans_of_each_repository
108112
for reference in scan.code_references
@@ -111,6 +115,7 @@ def _get_code_references(self) -> list[CodeReference]:
111115

112116
def _get_permalink(
113117
self,
118+
provider: VCSProvider,
114119
repository_url: str,
115120
revision: str,
116121
file_path: str,

api/tests/unit/projects/code_references/test_unit_projects_code_references_views.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ def test_FeatureCodeReferencesDetailAPIView__responds_200_with_code_references_f
192192
assert response.data["last_scanned_at"] == "2099-01-02T11:00:00Z"
193193
assert len(references := response.data["code_references"]) == 3
194194
assert references[0]["scanned_at"] == "2099-01-01T10:00:00Z"
195+
assert references[0]["vcs_provider"] == "github"
196+
assert references[0]["repository_url"] == "https://github.flagsmith.com/backend/"
195197
assert references[0]["revision"] == "backend-1"
196198
assert references[1]["scanned_at"] == "2099-01-02T11:00:00Z"
197199
assert references[0]["file_path"] == "backend/file1.py"
@@ -200,13 +202,17 @@ def test_FeatureCodeReferencesDetailAPIView__responds_200_with_code_references_f
200202
"https://github.flagsmith.com/backend/blob/backend-1/backend/file1.py#L20"
201203
)
202204
assert references[1]["scanned_at"] == "2099-01-02T11:00:00Z"
205+
assert references[1]["vcs_provider"] == "github"
206+
assert references[1]["repository_url"] == "https://github.flagsmith.com/frontend/"
203207
assert references[1]["revision"] == "frontend-2"
204208
assert references[1]["file_path"] == "frontend/file1.js"
205209
assert references[1]["line_number"] == 12
206210
assert references[1]["permalink"] == (
207211
"https://github.flagsmith.com/frontend/blob/frontend-2/frontend/file1.js#L12"
208212
)
209213
assert references[2]["scanned_at"] == "2099-01-02T11:00:00Z"
214+
assert references[2]["vcs_provider"] == "github"
215+
assert references[2]["repository_url"] == "https://github.flagsmith.com/frontend/"
210216
assert references[2]["revision"] == "frontend-2"
211217
assert references[2]["file_path"] == "frontend/file2.js"
212218
assert references[2]["line_number"] == 5

0 commit comments

Comments
 (0)