Skip to content

Commit 51ac4b5

Browse files
author
Baz
authored
šŸ› Source Google Analytics (UA): fix discovery stage, when custom_reports is provided as single dict (#18965)
1 parent b194519 commit 51ac4b5

File tree

7 files changed

+32
-15
lines changed

7 files changed

+32
-15
lines changed

ā€Žairbyte-config/init/src/main/resources/seed/source_definitions.yamlā€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@
471471
- name: Google Analytics (Universal Analytics)
472472
sourceDefinitionId: eff3616a-f9c3-11eb-9a03-0242ac130003
473473
dockerRepository: airbyte/source-google-analytics-v4
474-
dockerImageTag: 0.1.31
474+
dockerImageTag: 0.1.32
475475
documentationUrl: https://docs.airbyte.com/integrations/sources/google-analytics-universal-analytics
476476
icon: google-analytics.svg
477477
sourceType: api

ā€Žairbyte-config/init/src/main/resources/seed/source_specs.yamlā€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4369,7 +4369,7 @@
43694369
oauthFlowOutputParameters:
43704370
- - "access_token"
43714371
- - "refresh_token"
4372-
- dockerImage: "airbyte/source-google-analytics-v4:0.1.31"
4372+
- dockerImage: "airbyte/source-google-analytics-v4:0.1.32"
43734373
spec:
43744374
documentationUrl: "https://docs.airbyte.com/integrations/sources/google-analytics-universal-analytics"
43754375
connectionSpecification:

ā€Žairbyte-integrations/connectors/source-google-analytics-v4/Dockerfileā€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ COPY main.py ./
1212
ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py"
1313
ENTRYPOINT ["python", "/airbyte/integration_code/main.py"]
1414

15-
LABEL io.airbyte.version=0.1.31
15+
LABEL io.airbyte.version=0.1.32
1616
LABEL io.airbyte.name=airbyte/source-google-analytics-v4

ā€Žairbyte-integrations/connectors/source-google-analytics-v4/source_google_analytics_v4/custom_reports_validator.pyā€Ž

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from dataclasses import dataclass
77
from typing import Dict, List, Optional, Union
88

9-
from pydantic import BaseModel, Field, ValidationError
9+
from pydantic import BaseModel, Field, ValidationError, validator
1010

1111

1212
class Model(BaseModel):
@@ -18,6 +18,16 @@ class Config:
1818
metrics: list[str]
1919
filter: Optional[str]
2020

21+
@validator("dimensions", "metrics")
22+
def check_field_reference_forrmat(cls, value):
23+
"""
24+
Defines rules for nested strings, for fields: dimensions, metrics.
25+
General rule: the `ga:` prefix is defined for each field
26+
"""
27+
for v in value:
28+
if "ga:" not in v:
29+
raise ValueError(v)
30+
2131

2232
class Explainer:
2333
"""
@@ -33,16 +43,21 @@ class Explainer:
3343
"value_error.missing": ("fields required", []),
3444
"value_error.extra": ("fields not permitted", []),
3545
"type_error": ("type errors", []),
46+
"value_error": ("incorrect field reference, expected format `ga:MY_FIELD_NAME`, but got", []),
3647
}
3748

3849
def parse(self, errors: List[Dict]) -> str:
3950
for error in errors:
40-
field_name, error_type = error.get("loc")[0], error.get("type")
51+
field_name, error_type, error_msg = error.get("loc")[0], error.get("type"), error.get("msg")
4152

4253
# general errors
4354
if error_type in self.errors_mapping:
44-
self.errors_mapping.get(error_type)[1].append(field_name)
45-
55+
# value errors
56+
if error_type == "value_error":
57+
self.errors_mapping.get(error_type)[1].append({"field": field_name, "reference": error_msg})
58+
# general errors
59+
else:
60+
self.errors_mapping.get(error_type)[1].append(field_name)
4661
# type errors
4762
if "type_error" in error_type:
4863
error_type, _type = error_type.split(".")

ā€Žairbyte-integrations/connectors/source-google-analytics-v4/source_google_analytics_v4/source.pyā€Ž

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -588,10 +588,8 @@ def check_connection(self, logger: logging.Logger, config: MutableMapping) -> Tu
588588
False,
589589
f"Please check the permissions for the requested view_id: {config['view_id']}. Cannot retrieve data from that view ID.",
590590
)
591-
592591
except ValueError as e:
593592
return False, f"Invalid custom reports json structure. {e}"
594-
595593
except requests.exceptions.RequestException as e:
596594
error_msg = e.response.json().get("error")
597595
if e.response.status_code == 403:
@@ -608,8 +606,10 @@ def streams(self, config: MutableMapping[str, Any]) -> List[Stream]:
608606

609607
reports = json.loads(pkgutil.get_data("source_google_analytics_v4", "defaults/default_reports.json"))
610608

611-
if config.get("custom_reports"):
612-
custom_reports = json.loads(config["custom_reports"])
609+
custom_reports = config.get("custom_reports")
610+
if custom_reports:
611+
custom_reports = json.loads(custom_reports)
612+
custom_reports = [custom_reports] if not isinstance(custom_reports, list) else custom_reports
613613
reports += custom_reports
614614

615615
config["ga_streams"] = reports

ā€Žairbyte-integrations/connectors/source-google-analytics-v4/unit_tests/test_custom_reports_validator.pyā€Ž

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@
1010
@pytest.mark.parametrize(
1111
"custom_reports, expected",
1212
(
13-
([{"name": [], "dimensions": ["test"], "metrics": ["test"]}], "errors: type errors"),
14-
([{"name": "test", "dimensions": ["test"], "metrics": ["test"], "added_field": "test"}], "errors: fields not permitted"),
15-
([{"missing_name": "test", "dimensions": ["test"], "metrics": ["test"]}], "errors: fields required"),
13+
([{"name": "test", "dimensions": ["ga+test"], "metrics": ["ga!test"]}], "errors: incorrect field reference"),
14+
([{"name": [], "dimensions": ["ga:test"], "metrics": ["ga:test"]}], "errors: type errors"),
15+
([{"name": "test", "dimensions": ["ga:test"], "metrics": ["ga:test"], "added_field": "test"}], "errors: fields not permitted"),
16+
([{"missing_name": "test", "dimensions": ["ga:test"], "metrics": ["ga:test"]}], "errors: fields required"),
1617
),
17-
ids=["type_error", "not_permitted", "missing"],
18+
ids=["incorrrect field reference", "type_error", "not_permitted", "missing"],
1819
)
1920
def test_custom_reports_validator(custom_reports, expected):
2021
try:

ā€Ždocs/integrations/sources/google-analytics-universal-analytics.mdā€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ Incremental sync is supported only if you add `ga:date` dimension to your custom
155155

156156
| Version | Date | Pull Request | Subject |
157157
|:--------|:-----------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------------|
158+
| 0.1.32 | 2022-11-04 | [18965](https://github.com/airbytehq/airbyte/pull/18965) | Fix for `discovery` stage, when `custom_reports` are provided with single stream as `dict` |
158159
| 0.1.31 | 2022-10-30 | [18670](https://github.com/airbytehq/airbyte/pull/18670) | Add `Custom Reports` schema validation on `check connection` |
159160
| 0.1.30 | 2022-10-13 | [17943](https://github.com/airbytehq/airbyte/pull/17943) | Fix pagination |
160161
| 0.1.29 | 2022-10-12 | [17905](https://github.com/airbytehq/airbyte/pull/17905) | Handle exceeded daily quota gracefully |

0 commit comments

Comments
Ā (0)