airbyte-source-github 1.8.29.dev202506231149__py3-none-any.whl → 1.8.29.dev202506231532__py3-none-any.whl
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.
- {airbyte_source_github-1.8.29.dev202506231149.dist-info → airbyte_source_github-1.8.29.dev202506231532.dist-info}/METADATA +1 -1
- {airbyte_source_github-1.8.29.dev202506231149.dist-info → airbyte_source_github-1.8.29.dev202506231532.dist-info}/RECORD +6 -6
- source_github/errors_handlers.py +14 -15
- source_github/streams.py +19 -10
- {airbyte_source_github-1.8.29.dev202506231149.dist-info → airbyte_source_github-1.8.29.dev202506231532.dist-info}/WHEEL +0 -0
- {airbyte_source_github-1.8.29.dev202506231149.dist-info → airbyte_source_github-1.8.29.dev202506231532.dist-info}/entry_points.txt +0 -0
@@ -2,7 +2,7 @@ source_github/__init__.py,sha256=punPc3v0mXEYOun7cbkfM5KUhgjv72B9DgDhI4VtzcQ,113
|
|
2
2
|
source_github/backoff_strategies.py,sha256=ChkWEmqZL7Qrr1zidOfjZWlMWIVRVO2yqZ7QE_HaZP8,2287
|
3
3
|
source_github/config_migrations.py,sha256=H58hHqAnuvb0B8IXHW4aEDZ3HotEg7HdA2rXDG9XW7A,3832
|
4
4
|
source_github/constants.py,sha256=Hj3Q4y7OoU-Iff4m9gEC2CjwmWJYXhNbHVNjg8EBLmQ,238
|
5
|
-
source_github/errors_handlers.py,sha256=
|
5
|
+
source_github/errors_handlers.py,sha256=wAaihlPrYqPXhso2oCubje1p8yW79ol8t2g0zgQ30Wo,7052
|
6
6
|
source_github/github_schema.py,sha256=2AXmTN_s_VqvZAR1GPqus5HhSXWokS4N7HMQQqefaYw,1600315
|
7
7
|
source_github/graphql.py,sha256=edd7EoXwD5rRDHrjm4ZBy5VGkruTScL_Xipy4CBmTFc,11625
|
8
8
|
source_github/run.py,sha256=onA-rP2aVhWHvDquKZdR1381CU66rnzqJ7EFMS5dd4Q,407
|
@@ -56,9 +56,9 @@ source_github/schemas/workflow_runs.json,sha256=XDmIsjtzka-ItEonImD3ZATZjxRNkbFo
|
|
56
56
|
source_github/schemas/workflows.json,sha256=gSNw8WZaVKbX4AL97PbjZHzvxcOltXqv9Ao1RNQOFXM,1470
|
57
57
|
source_github/source.py,sha256=1o8eayigi4xSUeNHdCd-mhNswGUq_XQrVk2eihTjm1o,14246
|
58
58
|
source_github/spec.json,sha256=7LOQm01fP_RvPF-HifhNPJ7i0AxT2LTNPaLAA3uOfNY,7443
|
59
|
-
source_github/streams.py,sha256=
|
59
|
+
source_github/streams.py,sha256=oL91L04kf0NANfdAJbXghvg2G-InAfjOFFqKF7rDb2s,77308
|
60
60
|
source_github/utils.py,sha256=Ztd8VWwzTNUg_A96_8R9XSKorIcBa8wJ6aYUqygRkyk,5492
|
61
|
-
airbyte_source_github-1.8.29.
|
62
|
-
airbyte_source_github-1.8.29.
|
63
|
-
airbyte_source_github-1.8.29.
|
64
|
-
airbyte_source_github-1.8.29.
|
61
|
+
airbyte_source_github-1.8.29.dev202506231532.dist-info/METADATA,sha256=RA_9qGWOu4OBbHUkqhr67po9hEFHCvUPZ-m7QIIiKNA,5218
|
62
|
+
airbyte_source_github-1.8.29.dev202506231532.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
63
|
+
airbyte_source_github-1.8.29.dev202506231532.dist-info/entry_points.txt,sha256=gYhqVrTAZvMwuYByg0b_-o115yUFLLcfNxMrLZmiW9k,55
|
64
|
+
airbyte_source_github-1.8.29.dev202506231532.dist-info/RECORD,,
|
source_github/errors_handlers.py
CHANGED
@@ -43,6 +43,13 @@ GITHUB_DEFAULT_ERROR_MAPPING = DEFAULT_ERROR_MAPPING | {
|
|
43
43
|
}
|
44
44
|
|
45
45
|
|
46
|
+
def is_conflict_with_empty_repository(response_or_exception: Optional[Union[requests.Response, Exception]] = None) -> bool:
|
47
|
+
if isinstance(response_or_exception, requests.Response) and response_or_exception.status_code == requests.codes.CONFLICT:
|
48
|
+
response_data = response_or_exception.json()
|
49
|
+
return response_data.get("message") == "Git Repository is empty."
|
50
|
+
return False
|
51
|
+
|
52
|
+
|
46
53
|
class GithubStreamABCErrorHandler(HttpStatusErrorHandler):
|
47
54
|
def __init__(self, stream: HttpStream, **kwargs): # type: ignore # noqa
|
48
55
|
self.stream = stream
|
@@ -88,6 +95,13 @@ class GithubStreamABCErrorHandler(HttpStatusErrorHandler):
|
|
88
95
|
error_message=f"Response status code: {response_or_exception.status_code}. Retrying...",
|
89
96
|
)
|
90
97
|
|
98
|
+
if is_conflict_with_empty_repository(response_or_exception=response_or_exception):
|
99
|
+
return ErrorResolution(
|
100
|
+
response_action=ResponseAction.IGNORE,
|
101
|
+
failure_type=FailureType.config_error,
|
102
|
+
error_message="Git Repository is empty.",
|
103
|
+
)
|
104
|
+
|
91
105
|
return super().interpret_response(response_or_exception)
|
92
106
|
|
93
107
|
|
@@ -135,18 +149,3 @@ class GitHubGraphQLErrorHandler(GithubStreamABCErrorHandler):
|
|
135
149
|
)
|
136
150
|
|
137
151
|
return super().interpret_response(response_or_exception)
|
138
|
-
|
139
|
-
|
140
|
-
class CommitsErrorHandler(GithubStreamABCErrorHandler):
|
141
|
-
def interpret_response(self, response_or_exception: Optional[Union[requests.Response, Exception]] = None) -> ErrorResolution:
|
142
|
-
if isinstance(response_or_exception, requests.Response):
|
143
|
-
if response_or_exception.status_code == requests.codes.CONFLICT:
|
144
|
-
response_data = response_or_exception.json()
|
145
|
-
if response_data.get("message") == "Git Repository is empty.":
|
146
|
-
return ErrorResolution(
|
147
|
-
response_action=ResponseAction.IGNORE,
|
148
|
-
failure_type=FailureType.config_error,
|
149
|
-
error_message="Git Repository is empty.",
|
150
|
-
)
|
151
|
-
|
152
|
-
return super().interpret_response(response_or_exception)
|
source_github/streams.py
CHANGED
@@ -26,10 +26,10 @@ from . import constants
|
|
26
26
|
from .backoff_strategies import ContributorActivityBackoffStrategy, GithubStreamABCBackoffStrategy
|
27
27
|
from .errors_handlers import (
|
28
28
|
GITHUB_DEFAULT_ERROR_MAPPING,
|
29
|
-
CommitsErrorHandler,
|
30
29
|
ContributorActivityErrorHandler,
|
31
30
|
GitHubGraphQLErrorHandler,
|
32
31
|
GithubStreamABCErrorHandler,
|
32
|
+
is_conflict_with_empty_repository,
|
33
33
|
)
|
34
34
|
from .graphql import (
|
35
35
|
CursorStorage,
|
@@ -101,10 +101,6 @@ class GithubStreamABC(HttpStream, ABC):
|
|
101
101
|
stream_slice: Mapping[str, Any] = None,
|
102
102
|
next_page_token: Mapping[str, Any] = None,
|
103
103
|
) -> Iterable[Mapping]:
|
104
|
-
if response.status_code == 409:
|
105
|
-
response_data = response.json()
|
106
|
-
if response_data.get("message") == "Git Repository is empty.":
|
107
|
-
return
|
108
104
|
for record in response.json(): # GitHub puts records in an array.
|
109
105
|
yield self.transform(record=record, stream_slice=stream_slice)
|
110
106
|
|
@@ -222,6 +218,24 @@ class GithubStream(GithubStreamABC):
|
|
222
218
|
record["repository"] = stream_slice["repository"]
|
223
219
|
return record
|
224
220
|
|
221
|
+
def parse_response(
|
222
|
+
self,
|
223
|
+
response: requests.Response,
|
224
|
+
stream_state: Mapping[str, Any],
|
225
|
+
stream_slice: Mapping[str, Any] = None,
|
226
|
+
next_page_token: Mapping[str, Any] = None,
|
227
|
+
) -> Iterable[Mapping]:
|
228
|
+
if is_conflict_with_empty_repository(response):
|
229
|
+
# I would expect that this should be handled (skipped) by the error handler, but it seems like
|
230
|
+
# ignored this error but continue to processing records. This may be fixed in latest CDK versions.
|
231
|
+
return
|
232
|
+
yield from super().parse_response(
|
233
|
+
response=response,
|
234
|
+
stream_state=stream_state,
|
235
|
+
stream_slice=stream_slice,
|
236
|
+
next_page_token=next_page_token,
|
237
|
+
)
|
238
|
+
|
225
239
|
|
226
240
|
class SemiIncrementalMixin(CheckpointMixin):
|
227
241
|
"""
|
@@ -668,11 +682,6 @@ class Commits(IncrementalMixin, GithubStream):
|
|
668
682
|
self.branches_stream = Branches(**kwargs)
|
669
683
|
self.repositories_stream = RepositoryStats(**kwargs)
|
670
684
|
|
671
|
-
def get_error_handler(self) -> Optional[ErrorHandler]:
|
672
|
-
return CommitsErrorHandler(
|
673
|
-
logger=self.logger, max_retries=self.max_retries, error_mapping=GITHUB_DEFAULT_ERROR_MAPPING, stream=self
|
674
|
-
)
|
675
|
-
|
676
685
|
def request_params(self, stream_state: Mapping[str, Any], stream_slice: Mapping[str, Any] = None, **kwargs) -> MutableMapping[str, Any]:
|
677
686
|
params = super(IncrementalMixin, self).request_params(stream_state=stream_state, stream_slice=stream_slice, **kwargs)
|
678
687
|
since = self.get_starting_point(stream_state=stream_state, stream_slice=stream_slice)
|
File without changes
|