airbyte-source-github 1.8.1__tar.gz → 1.8.3__tar.gz

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.
Files changed (63) hide show
  1. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/PKG-INFO +3 -4
  2. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/pyproject.toml +3 -3
  3. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/errors_handlers.py +9 -0
  4. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/streams.py +14 -2
  5. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/README.md +0 -0
  6. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/__init__.py +0 -0
  7. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/backoff_strategies.py +0 -0
  8. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/config_migrations.py +0 -0
  9. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/constants.py +0 -0
  10. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/github_schema.py +0 -0
  11. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/graphql.py +0 -0
  12. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/run.py +0 -0
  13. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/assignees.json +0 -0
  14. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/branches.json +0 -0
  15. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/collaborators.json +0 -0
  16. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/comments.json +0 -0
  17. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/commit_comment_reactions.json +0 -0
  18. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/commit_comments.json +0 -0
  19. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/commits.json +0 -0
  20. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/contributor_activity.json +0 -0
  21. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/deployments.json +0 -0
  22. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/events.json +0 -0
  23. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/issue_comment_reactions.json +0 -0
  24. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/issue_events.json +0 -0
  25. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/issue_labels.json +0 -0
  26. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/issue_milestones.json +0 -0
  27. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/issue_reactions.json +0 -0
  28. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/issue_timeline_events.json +0 -0
  29. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/issues.json +0 -0
  30. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/organizations.json +0 -0
  31. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/project_cards.json +0 -0
  32. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/project_columns.json +0 -0
  33. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/projects.json +0 -0
  34. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/projects_v2.json +0 -0
  35. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/pull_request_comment_reactions.json +0 -0
  36. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/pull_request_commits.json +0 -0
  37. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/pull_request_stats.json +0 -0
  38. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/pull_requests.json +0 -0
  39. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/releases.json +0 -0
  40. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/repositories.json +0 -0
  41. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/review_comments.json +0 -0
  42. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/reviews.json +0 -0
  43. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/shared/events/comment.json +0 -0
  44. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/shared/events/commented.json +0 -0
  45. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/shared/events/committed.json +0 -0
  46. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/shared/events/cross_referenced.json +0 -0
  47. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/shared/events/reviewed.json +0 -0
  48. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/shared/reaction.json +0 -0
  49. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/shared/reactions.json +0 -0
  50. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/shared/user.json +0 -0
  51. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/shared/user_graphql.json +0 -0
  52. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/stargazers.json +0 -0
  53. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/tags.json +0 -0
  54. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/team_members.json +0 -0
  55. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/team_memberships.json +0 -0
  56. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/teams.json +0 -0
  57. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/users.json +0 -0
  58. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/workflow_jobs.json +0 -0
  59. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/workflow_runs.json +0 -0
  60. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/schemas/workflows.json +0 -0
  61. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/source.py +0 -0
  62. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/spec.json +0 -0
  63. {airbyte_source_github-1.8.1 → airbyte_source_github-1.8.3}/source_github/utils.py +0 -0
@@ -1,18 +1,17 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-source-github
3
- Version: 1.8.1
3
+ Version: 1.8.3
4
4
  Summary: Source implementation for GitHub.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
7
7
  Author: Airbyte
8
8
  Author-email: contact@airbyte.io
9
- Requires-Python: >=3.9,<3.12
9
+ Requires-Python: >=3.10,<3.12
10
10
  Classifier: License :: OSI Approved :: MIT License
11
11
  Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.9
13
12
  Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
- Requires-Dist: airbyte-cdk (>=3,<4)
14
+ Requires-Dist: airbyte-cdk (>=4,<5)
16
15
  Requires-Dist: sgqlc (==16.3)
17
16
  Project-URL: Documentation, https://docs.airbyte.com/integrations/sources/github
18
17
  Project-URL: Repository, https://github.com/airbytehq/airbyte
@@ -5,7 +5,7 @@ requires = [
5
5
  build-backend = "poetry.core.masonry.api"
6
6
 
7
7
  [tool.poetry]
8
- version = "1.8.1"
8
+ version = "1.8.3"
9
9
  name = "airbyte-source-github"
10
10
  description = "Source implementation for GitHub."
11
11
  authors = [
@@ -21,8 +21,8 @@ packages = [
21
21
  ]
22
22
 
23
23
  [tool.poetry.dependencies]
24
- python = "^3.9,<3.12"
25
- airbyte-cdk = "^3"
24
+ python = "^3.10,<3.12"
25
+ airbyte-cdk = "^4"
26
26
  sgqlc = "==16.3"
27
27
 
28
28
  [tool.poetry.scripts]
@@ -90,6 +90,15 @@ class GithubStreamABCErrorHandler(HttpStatusErrorHandler):
90
90
 
91
91
 
92
92
  class ContributorActivityErrorHandler(HttpStatusErrorHandler):
93
+ """
94
+ This custom error handler is needed for streams based on repository statistics endpoints like ContributorActivity because
95
+ when requesting data that hasn't been cached yet when the request is made, you'll receive a 202 response. And these requests
96
+ need to retried to get the actual results.
97
+
98
+ See the docs for more info:
99
+ https://docs.github.com/en/rest/metrics/statistics?apiVersion=2022-11-28#a-word-about-caching
100
+ """
101
+
93
102
  def interpret_response(self, response_or_exception: Optional[Union[requests.Response, Exception]] = None) -> ErrorResolution:
94
103
  if isinstance(response_or_exception, requests.Response) and response_or_exception.status_code == requests.codes.ACCEPTED:
95
104
  return ErrorResolution(
@@ -9,10 +9,11 @@ from urllib import parse
9
9
 
10
10
  import pendulum
11
11
  import requests
12
- from airbyte_cdk import BackoffStrategy
12
+ from airbyte_cdk import BackoffStrategy, StreamSlice
13
13
  from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, Level, SyncMode
14
14
  from airbyte_cdk.models import Type as MessageType
15
15
  from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy
16
+ from airbyte_cdk.sources.streams.checkpoint.substream_resumable_full_refresh_cursor import SubstreamResumableFullRefreshCursor
16
17
  from airbyte_cdk.sources.streams.core import CheckpointMixin, Stream
17
18
  from airbyte_cdk.sources.streams.http import HttpStream
18
19
  from airbyte_cdk.sources.streams.http.error_handlers import ErrorHandler, ErrorResolution, HttpStatusErrorHandler, ResponseAction
@@ -57,6 +58,9 @@ class GithubStreamABC(HttpStream, ABC):
57
58
  self.api_url = api_url
58
59
  self.state = {}
59
60
 
61
+ if not self.supports_incremental:
62
+ self.cursor = SubstreamResumableFullRefreshCursor()
63
+
60
64
  @property
61
65
  def url_base(self) -> str:
62
66
  return self.api_url
@@ -1613,7 +1617,8 @@ class ContributorActivity(GithubStream):
1613
1617
  return record
1614
1618
 
1615
1619
  def get_error_handler(self) -> Optional[ErrorHandler]:
1616
- return ContributorActivityErrorHandler(logger=self.logger, max_retries=self.max_retries, error_mapping=GITHUB_DEFAULT_ERROR_MAPPING)
1620
+
1621
+ return ContributorActivityErrorHandler(logger=self.logger, max_retries=5, error_mapping=GITHUB_DEFAULT_ERROR_MAPPING)
1617
1622
 
1618
1623
  def get_backoff_strategy(self) -> Optional[Union[BackoffStrategy, List[BackoffStrategy]]]:
1619
1624
  return ContributorActivityBackoffStrategy()
@@ -1645,6 +1650,13 @@ class ContributorActivity(GithubStream):
1645
1650
  message=f"Syncing `{self.__class__.__name__}` " f"stream isn't available for repository `{repository}`.",
1646
1651
  ),
1647
1652
  )
1653
+
1654
+ # In order to retain the existing stream behavior before we added RFR to this stream, we need to close out the
1655
+ # partition after we give up the maximum number of retries on the 202 response. This does lead to the question
1656
+ # of if we should prematurely exit in the first place, but for now we're going to aim for feature parity
1657
+ partition_obj = stream_slice.get("partition")
1658
+ if self.cursor and partition_obj:
1659
+ self.cursor.close_slice(StreamSlice(cursor_slice={}, partition=partition_obj))
1648
1660
  else:
1649
1661
  raise e
1650
1662