Skip to content

Commit f6d2ae8

Browse files
committed
chore: address PR review feedback from khvn26
- Rename `string_value` field to `value` in FeatureValueSerializer - Remove "(V1)" from operation_summary (internal detail confusing to users) - Remove redundant doc line "Feature must belong to environment's project" - Simplify swagger tags to just "experimental" - Update all tests to use new `value` field name
1 parent 3704c9c commit f6d2ae8

4 files changed

Lines changed: 54 additions & 56 deletions

File tree

api/features/feature_states/serializers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,11 @@ class FeatureValueSerializer(serializers.Serializer): # type: ignore[type-arg]
6363
type = serializers.ChoiceField(
6464
choices=["integer", "string", "boolean"], required=True
6565
)
66-
string_value = serializers.CharField(required=True, allow_blank=True)
66+
value = serializers.CharField(required=True, allow_blank=True)
6767

6868
def validate(self, data: dict) -> dict: # type: ignore[type-arg]
6969
value_type = data["type"]
70-
string_val = data["string_value"]
70+
string_val = data["value"]
7171

7272
if value_type == "integer":
7373
try:
@@ -104,7 +104,7 @@ def flag_change_set(self) -> FlagChangeSet:
104104

105105
change_set = FlagChangeSet(
106106
enabled=validated_data["enabled"],
107-
feature_state_value=value_data["string_value"],
107+
feature_state_value=value_data["value"],
108108
type_=value_data["type"],
109109
segment_id=segment_data.get("id") if segment_data else None,
110110
segment_priority=segment_data.get("priority") if segment_data else None,
@@ -169,15 +169,15 @@ def change_set_v2(self) -> FlagChangeSetV2:
169169
segment_override = SegmentOverrideChangeSet(
170170
segment_id=override_data["segment_id"],
171171
enabled=override_data["enabled"],
172-
feature_state_value=value_data["string_value"],
172+
feature_state_value=value_data["value"],
173173
type_=value_data["type"],
174174
priority=override_data.get("priority"),
175175
)
176176
segment_overrides.append(segment_override)
177177

178178
change_set = FlagChangeSetV2(
179179
environment_default_enabled=env_default["enabled"],
180-
environment_default_value=env_value_data["string_value"],
180+
environment_default_value=env_value_data["value"],
181181
environment_default_type=env_value_data["type"],
182182
segment_overrides=segment_overrides,
183183
)

api/features/feature_states/views.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def _check_workflow_not_enabled(environment: Environment) -> None:
2323

2424
@swagger_auto_schema(
2525
method="post",
26-
operation_summary="Update single feature state (V1)",
26+
operation_summary="Update single feature state",
2727
operation_description="""
2828
**EXPERIMENTAL ENDPOINT** - Subject to change without notice.
2929
@@ -33,16 +33,15 @@ def _check_workflow_not_enabled(environment: Environment) -> None:
3333
3434
**Feature Identification:**
3535
- Use `feature.name` OR `feature.id` (mutually exclusive)
36-
- Feature must belong to the environment's project
3736
3837
**Value Format:**
39-
- Always use `string_value` field (value is always a string)
38+
- The `value` field is always a string representation
4039
- The `type` field tells the server how to parse it
4140
- Available types: integer, string, boolean
4241
- Examples:
43-
- `{"type": "integer", "string_value": "42"}`
44-
- `{"type": "boolean", "string_value": "true"}`
45-
- `{"type": "string", "string_value": "hello"}`
42+
- `{"type": "integer", "value": "42"}`
43+
- `{"type": "boolean", "value": "true"}`
44+
- `{"type": "string", "value": "hello"}`
4645
4746
**Segment Priority:**
4847
- Optional `segment.priority` field controls ordering
@@ -64,7 +63,7 @@ def _check_workflow_not_enabled(environment: Environment) -> None:
6463
description="Feature state updated successfully (no content returned)"
6564
)
6665
},
67-
tags=["Experimental - Feature States"],
66+
tags=["experimental"],
6867
) # type: ignore[misc]
6968
@api_view(http_method_names=["POST"])
7069
@permission_classes([IsAuthenticated, EnvironmentUpdateFeatureStatePermission])
@@ -99,16 +98,15 @@ def update_flag_v1(request: Request, environment_key: str) -> Response:
9998
10099
**Feature Identification:**
101100
- Use `feature.name` OR `feature.id` (mutually exclusive)
102-
- Feature must belong to the environment's project
103101
104102
**Value Format:**
105-
- Always use `string_value` field (value is always a string)
103+
- The `value` field is always a string representation
106104
- The `type` field tells the server how to parse it
107105
- Available types: integer, string, boolean
108106
- Examples:
109-
- `{"type": "string", "string_value": "production"}`
110-
- `{"type": "integer", "string_value": "100"}`
111-
- `{"type": "boolean", "string_value": "false"}`
107+
- `{"type": "string", "value": "production"}`
108+
- `{"type": "integer", "value": "100"}`
109+
- `{"type": "boolean", "value": "false"}`
112110
113111
**Segment Overrides:**
114112
- Provide array of segment override configurations
@@ -132,7 +130,7 @@ def update_flag_v1(request: Request, environment_key: str) -> Response:
132130
description="Feature states updated successfully (no content returned)"
133131
)
134132
},
135-
tags=["Experimental - Feature States"],
133+
tags=["experimental"],
136134
) # type: ignore[misc]
137135
@api_view(http_method_names=["POST"])
138136
@permission_classes([IsAuthenticated, EnvironmentUpdateFeatureStatePermission])

api/tests/unit/features/feature_states/test_serializers.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def test_get_feature_raises_error_when_environment_not_in_context(
2222
data={
2323
"feature": {"name": feature.name},
2424
"enabled": True,
25-
"value": {"type": "string", "string_value": "test"},
25+
"value": {"type": "string", "value": "test"},
2626
},
2727
context={}, # No environment
2828
)
@@ -50,7 +50,7 @@ def test_validate_segment_overrides_returns_empty_list() -> None:
5050
def test_feature_value_serializer_rejects_invalid_integer() -> None:
5151
# Given
5252
serializer = FeatureValueSerializer(
53-
data={"type": "integer", "string_value": "not_a_number"}
53+
data={"type": "integer", "value": "not_a_number"}
5454
)
5555

5656
# When
@@ -63,7 +63,7 @@ def test_feature_value_serializer_rejects_invalid_integer() -> None:
6363

6464
def test_feature_value_serializer_rejects_invalid_boolean() -> None:
6565
# Given
66-
serializer = FeatureValueSerializer(data={"type": "boolean", "string_value": "yes"})
66+
serializer = FeatureValueSerializer(data={"type": "boolean", "value": "yes"})
6767

6868
# When
6969
is_valid = serializer.is_valid()
@@ -82,7 +82,7 @@ def test_feature_value_serializer_rejects_invalid_boolean() -> None:
8282
"feature": {"name": feature.name},
8383
"segment": {"id": segment_id},
8484
"enabled": True,
85-
"value": {"type": "string", "string_value": "test"},
85+
"value": {"type": "string", "value": "test"},
8686
},
8787
),
8888
(
@@ -91,13 +91,13 @@ def test_feature_value_serializer_rejects_invalid_boolean() -> None:
9191
"feature": {"name": feature.name},
9292
"environment_default": {
9393
"enabled": True,
94-
"value": {"type": "string", "string_value": "default"},
94+
"value": {"type": "string", "value": "default"},
9595
},
9696
"segment_overrides": [
9797
{
9898
"segment_id": segment_id,
9999
"enabled": True,
100-
"value": {"type": "string", "string_value": "test"},
100+
"value": {"type": "string", "value": "test"},
101101
},
102102
],
103103
},
@@ -133,7 +133,7 @@ def test_serializer_rejects_nonexistent_segment(
133133
"feature": {"name": feature.name},
134134
"segment": {"id": segment_id},
135135
"enabled": True,
136-
"value": {"type": "string", "string_value": "test"},
136+
"value": {"type": "string", "value": "test"},
137137
},
138138
),
139139
(
@@ -142,13 +142,13 @@ def test_serializer_rejects_nonexistent_segment(
142142
"feature": {"name": feature.name},
143143
"environment_default": {
144144
"enabled": True,
145-
"value": {"type": "string", "string_value": "default"},
145+
"value": {"type": "string", "value": "default"},
146146
},
147147
"segment_overrides": [
148148
{
149149
"segment_id": segment_id,
150150
"enabled": True,
151-
"value": {"type": "string", "string_value": "test"},
151+
"value": {"type": "string", "value": "test"},
152152
},
153153
],
154154
},

0 commit comments

Comments
 (0)