From a82844dfa577a7000dacd1c2307e4f45aeb23040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Fri, 9 Feb 2024 17:22:13 +0900 Subject: [PATCH] update schema MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- dist/compatible/openapi-3.0.yaml | 536 +++++++++++++++++++++++++++++- dist/docs/openapi-3.0.yaml | 536 +++++++++++++++++++++++++++++- src/openapi/schemas/content.yaml | 67 +++- src/openapi/schemas/tweet.yaml | 407 ++++++++++++++++++++++- src/openapi/schemas/typename.yaml | 7 + src/openapi/schemas/user.yaml | 89 ++++- test/python/test_serialize.py | 72 ++-- 7 files changed, 1679 insertions(+), 35 deletions(-) diff --git a/dist/compatible/openapi-3.0.yaml b/dist/compatible/openapi-3.0.yaml index 3277882..3ac3dbe 100644 --- a/dist/compatible/openapi-3.0.yaml +++ b/dist/compatible/openapi-3.0.yaml @@ -2,10 +2,45 @@ components: schemas: AdditionalMediaInfo: properties: + call_to_actions: + $ref: '#/components/schemas/AdditionalMediaInfoCallToActions' + description: + type: string + embeddable: + type: boolean monetizable: type: boolean + source_user: + $ref: '#/components/schemas/UserResultCore' + title: + type: string required: - monetizable + AdditionalMediaInfoCallToActions: + properties: + visit_site: + $ref: '#/components/schemas/AdditionalMediaInfoCallToActionsVisitSite' + required: + - visit_site + AdditionalMediaInfoCallToActionsVisitSite: + properties: + url: + format: uri + type: string + required: + - url + AuthorCommunityRelationship: + properties: + community_results: + $ref: '#/components/schemas/Community' + role: + enum: + - Member + type: string + user_results: + $ref: '#/components/schemas/UserResults' + required: + - community_results BirdwatchEntity: properties: fromIndex: @@ -136,6 +171,201 @@ components: required: - create type: object + Community: + properties: + result: + $ref: '#/components/schemas/CommunityData' + required: + - result + CommunityActions: + properties: + delete_action_result: + $ref: '#/components/schemas/CommunityDeleteActionResult' + join_action_result: + $ref: '#/components/schemas/CommunityJoinActionResult' + leave_action_result: + $ref: '#/components/schemas/CommunityLeaveActionResult' + pin_action_result: + $ref: '#/components/schemas/CommunityPinActionResult' + required: + - delete_action_result + - join_action_result + - leave_action_result + - pin_action_result + CommunityData: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + actions: + $ref: '#/components/schemas/CommunityActions' + admin_results: + $ref: '#/components/schemas/UserResults' + created_at: + type: integer + creator_results: + $ref: '#/components/schemas/UserResults' + custom_banner_media: + additionalProperties: true + type: object + default_banner_media: + additionalProperties: true + type: object + description: + type: string + id_str: + pattern: ^[0-9]+$ + type: string + invites_policy: + enum: + - MemberInvitesAllowed + type: string + invites_result: + $ref: '#/components/schemas/CommunityInvitesResult' + is_pinned: + type: boolean + join_policy: + enum: + - Open + type: string + join_requests_result: + $ref: '#/components/schemas/CommunityJoinRequestsResult' + member_count: + type: integer + members_facepile_results: + items: + $ref: '#/components/schemas/UserResults' + type: array + moderator_count: + type: integer + name: + type: string + primary_community_topic: + $ref: '#/components/schemas/PrimaryCommunityTopic' + question: + type: string + role: + enum: + - NonMember + type: string + rules: + items: + $ref: '#/components/schemas/CommunityRule' + type: array + search_tags: + items: + type: string + type: array + show_only_users_to_display: + items: + type: string + type: array + urls: + $ref: '#/components/schemas/CommunityUrls' + viewer_relationship: + additionalProperties: true + type: object + required: + - __typename + - id_str + - name + - description + - question + - search_tags + - primary_community_topic + - actions + - admin_results + - creator_results + - invites_result + - join_policy + - invites_policy + - is_pinned + - members_facepile_results + - moderator_count + - member_count + - role + - rules + CommunityDeleteActionResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + reason: + enum: + - Unavailable + type: string + required: + - __typename + - reason + CommunityInvitesResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + message: + type: string + reason: + enum: + - Unavailable + type: string + required: + - __typename + - reason + - message + CommunityJoinActionResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + required: + - __typename + CommunityJoinRequestsResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + required: + - __typename + CommunityLeaveActionResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + message: + type: string + reason: + enum: + - ViewerNotMember + type: string + required: + - __typename + - reason + - message + CommunityPinActionResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + required: + - __typename + CommunityRule: + properties: + description: + type: string + name: + type: string + rest_id: + pattern: ^[0-9]+$ + type: string + required: + - rest_id + - name + CommunityUrls: + properties: + permalink: + $ref: '#/components/schemas/CommunityUrlsPermalink' + required: + - permalink + CommunityUrlsPermalink: + properties: + url: + format: uri + type: string + required: + - url ContentEntryType: enum: - TimelineTimelineItem @@ -291,6 +521,13 @@ components: type: object required: - tweet_results + DisplayTreatment: + properties: + actionText: + type: string + required: + - actionText + type: object Entities: properties: hashtags: @@ -479,6 +716,15 @@ components: Hashtag: additionalProperties: true type: object + Highlight: + properties: + textHighlights: + items: + $ref: '#/components/schemas/TextHighlight' + type: array + required: + - textHighlights + type: object HomeTimelineHome: properties: home_timeline_urt: @@ -589,6 +835,8 @@ components: expanded_url: format: uri type: string + ext_alt_text: + type: string ext_media_availability: $ref: '#/components/schemas/ExtMediaAvailability' features: @@ -609,6 +857,12 @@ components: $ref: '#/components/schemas/MediaOriginalInfo' sizes: $ref: '#/components/schemas/MediaSizes' + source_status_id_str: + pattern: ^[0-9]+$ + type: string + source_user_id_str: + pattern: ^[0-9]+$ + type: string type: enum: - photo @@ -643,6 +897,8 @@ components: expanded_url: format: uri type: string + ext_alt_text: + type: string ext_media_availability: $ref: '#/components/schemas/ExtMediaAvailability' features: @@ -665,6 +921,12 @@ components: $ref: '#/components/schemas/MediaOriginalInfo' sizes: $ref: '#/components/schemas/MediaSizes' + source_status_id_str: + pattern: ^[0-9]+$ + type: string + source_user_id_str: + pattern: ^[0-9]+$ + type: string type: enum: - photo @@ -884,6 +1146,16 @@ components: Session: $ref: '#/components/schemas/Session' type: object + PrimaryCommunityTopic: + properties: + topic_id: + pattern: ^[0-9]+$ + type: string + topic_name: + type: string + required: + - topic_id + - topic_name ProfileResponse: properties: data: @@ -896,6 +1168,37 @@ components: $ref: '#/components/schemas/UserResultByScreenName' required: - user_result_by_screen_name + QuotedRefResult: + properties: + result: + $ref: '#/components/schemas/QuotedRefResultData' + required: + - result + QuotedRefResultData: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + rest_id: + pattern: ^[0-9]+$ + type: string + required: + - __typename + - rest_id + QuotedStatusPermalink: + properties: + display: + format: uri + type: string + expanded: + format: uri + type: string + url: + format: uri + type: string + required: + - url + - expanded + - display Retweet: properties: legacy: @@ -1011,14 +1314,38 @@ components: type: object SocialContextLandingUrl: properties: - Url: + url: format: uri type: string urlType: enum: - DeepLink + - UrtEndpoint type: string + urtEndpointOptions: + $ref: '#/components/schemas/UrtEndpointOptions' type: object + SuperFollowsReplyUserResult: + properties: + result: + $ref: '#/components/schemas/SuperFollowsReplyUserResultData' + required: + - result + SuperFollowsReplyUserResultData: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + legacy: + $ref: '#/components/schemas/SuperFollowsReplyUserResultLegacy' + required: + - __typename + - legacy + SuperFollowsReplyUserResultLegacy: + properties: + screen_name: + type: string + required: + - screen_name Symbol: additionalProperties: true type: object @@ -1062,6 +1389,16 @@ components: - type - url - urlType + TextHighlight: + properties: + endIndex: + type: integer + startIndex: + type: integer + required: + - startIndex + - endIndex + type: object Timeline: properties: instructions: @@ -1273,6 +1610,8 @@ components: $ref: '#/components/schemas/TypeName' cursorType: $ref: '#/components/schemas/CursorType' + displayTreatment: + $ref: '#/components/schemas/DisplayTreatment' entryType: $ref: '#/components/schemas/ContentEntryType' itemType: @@ -1331,6 +1670,9 @@ components: items: $ref: '#/components/schemas/ModuleItem' type: array + metadata: + additionalProperties: true + type: object required: - __typename - entryType @@ -1340,6 +1682,8 @@ components: properties: __typename: $ref: '#/components/schemas/TypeName' + highlights: + $ref: '#/components/schemas/Highlight' itemType: $ref: '#/components/schemas/ContentItemType' promotedMetadata: @@ -1395,6 +1739,8 @@ components: properties: __typename: $ref: '#/components/schemas/TypeName' + author_community_relationship: + $ref: '#/components/schemas/AuthorCommunityRelationship' birdwatch_pivot: $ref: '#/components/schemas/BirdwatchPivot' card: @@ -1405,6 +1751,8 @@ components: $ref: '#/components/schemas/TweetEditControl' edit_prespective: $ref: '#/components/schemas/TweetEditPrespective' + has_birdwatch_notes: + type: boolean is_translatable: default: false type: boolean @@ -1412,8 +1760,12 @@ components: $ref: '#/components/schemas/TweetLegacy' note_tweet: $ref: '#/components/schemas/NoteTweet' + previous_counts: + $ref: '#/components/schemas/TweetPreviousCounts' quick_promote_eligibility: type: object + quotedRefResult: + $ref: '#/components/schemas/QuotedRefResult' quoted_status_result: $ref: '#/components/schemas/ItemResult' rest_id: @@ -1421,6 +1773,8 @@ components: type: string source: type: string + superFollowsReplyUserResult: + $ref: '#/components/schemas/SuperFollowsReplyUserResult' unified_card: $ref: '#/components/schemas/UnifiedCard' unmention_data: @@ -1451,6 +1805,10 @@ components: type: string url: type: string + user_refs_results: + items: + $ref: '#/components/schemas/UserResults' + type: array required: - binding_values - name @@ -1468,14 +1826,36 @@ components: properties: boolean_value: type: boolean + image_color_value: + additionalProperties: true + type: object + image_value: + $ref: '#/components/schemas/TweetCardLegacyBindingValueDataImage' scribe_key: type: string string_value: type: string type: type: string + user_value: + $ref: '#/components/schemas/UserValue' required: - type + TweetCardLegacyBindingValueDataImage: + properties: + alt: + type: string + height: + type: integer + url: + format: uri + type: string + width: + type: integer + required: + - height + - width + - url TweetCardPlatform: properties: audience: @@ -1585,6 +1965,8 @@ components: type: integer bookmarked: type: boolean + conversation_control: + additionalProperties: true conversation_id_str: pattern: ^[0-9]+$ type: string @@ -1619,6 +2001,14 @@ components: type: boolean lang: type: string + limited_actions: + enum: + - limited_replies + - community_tweet_non_member_public_community + - non_compliant + type: string + place: + additionalProperties: true possibly_sensitive: default: false type: boolean @@ -1627,6 +2017,11 @@ components: type: boolean quote_count: type: integer + quoted_status_id_str: + pattern: ^[0-9]+$ + type: string + quoted_status_permalink: + $ref: '#/components/schemas/QuotedStatusPermalink' reply_count: type: integer retweet_count: @@ -1666,6 +2061,24 @@ components: type: boolean required: - followers + TweetPreviousCounts: + properties: + bookmark_count: + type: integer + favorite_count: + type: integer + quote_count: + type: integer + reply_count: + type: integer + retweet_count: + type: integer + required: + - bookmark_count + - favorite_count + - quote_count + - reply_count + - retweet_count TweetResultByRestIdData: properties: tweetResult: @@ -1721,11 +2134,15 @@ components: properties: __typename: $ref: '#/components/schemas/TypeName' + limitedActionResults: + additionalProperties: true + type: object tweet: $ref: '#/components/schemas/Tweet' required: - __typename - tweet + - limitedActionResults TwitterTimeFormat: example: Sat Dec 31 23:59:59 +0000 2023 pattern: '^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) @@ -1748,6 +2165,13 @@ components: - Tweet - User - UserUnavailable + - Community + - CommunityDeleteActionUnavailable + - CommunityJoinAction + - CommunityLeaveActionUnavailable + - CommunityTweetPinActionUnavailable + - CommunityInvitesUnavailable + - CommunityJoinRequestsUnavailable type: string UnfavoriteTweet: properties: @@ -1789,6 +2213,28 @@ components: - expanded_url - display_url type: object + UrtEndpointOptions: + properties: + requestParams: + items: + $ref: '#/components/schemas/UrtEndpointRequestParams' + type: array + title: + type: string + required: + - title + - requestParams + type: object + UrtEndpointRequestParams: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object User: properties: __typename: @@ -1799,11 +2245,15 @@ components: business_account: additionalProperties: true type: object + creator_subscriptions_count: + type: integer has_graduated_access: type: boolean has_nft_avatar: default: false type: boolean + highlights_info: + $ref: '#/components/schemas/UserHighlightsInfo' id: pattern: ^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$ type: string @@ -1831,6 +2281,10 @@ components: super_following: default: false type: boolean + user_seed_tweet_count: + type: integer + verification_info: + $ref: '#/components/schemas/UserVerificationInfo' required: - __typename - affiliates_highlighted_label @@ -1849,6 +2303,15 @@ components: required: - mediatool_studio_library type: object + UserHighlightsInfo: + properties: + can_highlight_tweets: + type: boolean + highlighted_tweets: + type: string + required: + - can_highlight_tweets + - highlighted_tweets UserHighlightsTweetsData: properties: user: @@ -1990,10 +2453,15 @@ components: verified_type: enum: - Business + - Government type: string want_retweets: default: false type: boolean + withheld_in_countries: + items: + type: string + type: array required: - blocked_by - blocking @@ -2038,6 +2506,7 @@ components: professional_type: enum: - Business + - Creator type: string rest_id: pattern: ^[0-9]+$ @@ -2172,6 +2641,71 @@ components: oneOf: - $ref: '#/components/schemas/User' - $ref: '#/components/schemas/UserUnavailable' + UserValue: + properties: + id_str: + pattern: ^[0-9]+$ + type: string + required: + - id_str + UserVerificationInfo: + properties: + is_identity_verified: + default: false + type: boolean + reason: + $ref: '#/components/schemas/UserVerificationInfoReason' + required: + - is_identity_verified + - reason + UserVerificationInfoReason: + properties: + description: + $ref: '#/components/schemas/UserVerificationInfoReasonDescription' + override_verified_year: + type: integer + verified_since_msec: + pattern: ^-?[0-9]+$ + type: string + required: + - description + - verified_since_msec + - override_verified_year + UserVerificationInfoReasonDescription: + properties: + entities: + items: + $ref: '#/components/schemas/UserVerificationInfoReasonDescriptionEntities' + type: array + text: + type: string + required: + - text + - entities + UserVerificationInfoReasonDescriptionEntities: + properties: + from_index: + type: integer + ref: + $ref: '#/components/schemas/UserVerificationInfoReasonDescriptionEntitiesRef' + to_index: + type: integer + required: + - from_index + - to_index + - ref + UserVerificationInfoReasonDescriptionEntitiesRef: + properties: + url: + format: uri + type: string + url_type: + enum: + - ExternalUrl + type: string + required: + - url + - url_type UsersResponse: properties: data: diff --git a/dist/docs/openapi-3.0.yaml b/dist/docs/openapi-3.0.yaml index 078fc17..3830361 100644 --- a/dist/docs/openapi-3.0.yaml +++ b/dist/docs/openapi-3.0.yaml @@ -2,10 +2,45 @@ components: schemas: AdditionalMediaInfo: properties: + call_to_actions: + $ref: '#/components/schemas/AdditionalMediaInfoCallToActions' + description: + type: string + embeddable: + type: boolean monetizable: type: boolean + source_user: + $ref: '#/components/schemas/UserResultCore' + title: + type: string required: - monetizable + AdditionalMediaInfoCallToActions: + properties: + visit_site: + $ref: '#/components/schemas/AdditionalMediaInfoCallToActionsVisitSite' + required: + - visit_site + AdditionalMediaInfoCallToActionsVisitSite: + properties: + url: + format: uri + type: string + required: + - url + AuthorCommunityRelationship: + properties: + community_results: + $ref: '#/components/schemas/Community' + role: + enum: + - Member + type: string + user_results: + $ref: '#/components/schemas/UserResults' + required: + - community_results BirdwatchEntity: properties: fromIndex: @@ -136,6 +171,201 @@ components: required: - create type: object + Community: + properties: + result: + $ref: '#/components/schemas/CommunityData' + required: + - result + CommunityActions: + properties: + delete_action_result: + $ref: '#/components/schemas/CommunityDeleteActionResult' + join_action_result: + $ref: '#/components/schemas/CommunityJoinActionResult' + leave_action_result: + $ref: '#/components/schemas/CommunityLeaveActionResult' + pin_action_result: + $ref: '#/components/schemas/CommunityPinActionResult' + required: + - delete_action_result + - join_action_result + - leave_action_result + - pin_action_result + CommunityData: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + actions: + $ref: '#/components/schemas/CommunityActions' + admin_results: + $ref: '#/components/schemas/UserResults' + created_at: + type: integer + creator_results: + $ref: '#/components/schemas/UserResults' + custom_banner_media: + additionalProperties: true + type: object + default_banner_media: + additionalProperties: true + type: object + description: + type: string + id_str: + pattern: ^[0-9]+$ + type: string + invites_policy: + enum: + - MemberInvitesAllowed + type: string + invites_result: + $ref: '#/components/schemas/CommunityInvitesResult' + is_pinned: + type: boolean + join_policy: + enum: + - Open + type: string + join_requests_result: + $ref: '#/components/schemas/CommunityJoinRequestsResult' + member_count: + type: integer + members_facepile_results: + items: + $ref: '#/components/schemas/UserResults' + type: array + moderator_count: + type: integer + name: + type: string + primary_community_topic: + $ref: '#/components/schemas/PrimaryCommunityTopic' + question: + type: string + role: + enum: + - NonMember + type: string + rules: + items: + $ref: '#/components/schemas/CommunityRule' + type: array + search_tags: + items: + type: string + type: array + show_only_users_to_display: + items: + type: string + type: array + urls: + $ref: '#/components/schemas/CommunityUrls' + viewer_relationship: + additionalProperties: true + type: object + required: + - __typename + - id_str + - name + - description + - question + - search_tags + - primary_community_topic + - actions + - admin_results + - creator_results + - invites_result + - join_policy + - invites_policy + - is_pinned + - members_facepile_results + - moderator_count + - member_count + - role + - rules + CommunityDeleteActionResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + reason: + enum: + - Unavailable + type: string + required: + - __typename + - reason + CommunityInvitesResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + message: + type: string + reason: + enum: + - Unavailable + type: string + required: + - __typename + - reason + - message + CommunityJoinActionResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + required: + - __typename + CommunityJoinRequestsResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + required: + - __typename + CommunityLeaveActionResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + message: + type: string + reason: + enum: + - ViewerNotMember + type: string + required: + - __typename + - reason + - message + CommunityPinActionResult: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + required: + - __typename + CommunityRule: + properties: + description: + type: string + name: + type: string + rest_id: + pattern: ^[0-9]+$ + type: string + required: + - rest_id + - name + CommunityUrls: + properties: + permalink: + $ref: '#/components/schemas/CommunityUrlsPermalink' + required: + - permalink + CommunityUrlsPermalink: + properties: + url: + format: uri + type: string + required: + - url ContentEntryType: enum: - TimelineTimelineItem @@ -291,6 +521,13 @@ components: type: object required: - tweet_results + DisplayTreatment: + properties: + actionText: + type: string + required: + - actionText + type: object Entities: properties: hashtags: @@ -479,6 +716,15 @@ components: Hashtag: additionalProperties: true type: object + Highlight: + properties: + textHighlights: + items: + $ref: '#/components/schemas/TextHighlight' + type: array + required: + - textHighlights + type: object HomeTimelineHome: properties: home_timeline_urt: @@ -589,6 +835,8 @@ components: expanded_url: format: uri type: string + ext_alt_text: + type: string ext_media_availability: $ref: '#/components/schemas/ExtMediaAvailability' features: @@ -609,6 +857,12 @@ components: $ref: '#/components/schemas/MediaOriginalInfo' sizes: $ref: '#/components/schemas/MediaSizes' + source_status_id_str: + pattern: ^[0-9]+$ + type: string + source_user_id_str: + pattern: ^[0-9]+$ + type: string type: enum: - photo @@ -643,6 +897,8 @@ components: expanded_url: format: uri type: string + ext_alt_text: + type: string ext_media_availability: $ref: '#/components/schemas/ExtMediaAvailability' features: @@ -665,6 +921,12 @@ components: $ref: '#/components/schemas/MediaOriginalInfo' sizes: $ref: '#/components/schemas/MediaSizes' + source_status_id_str: + pattern: ^[0-9]+$ + type: string + source_user_id_str: + pattern: ^[0-9]+$ + type: string type: enum: - photo @@ -884,6 +1146,16 @@ components: Session: $ref: '#/components/schemas/Session' type: object + PrimaryCommunityTopic: + properties: + topic_id: + pattern: ^[0-9]+$ + type: string + topic_name: + type: string + required: + - topic_id + - topic_name ProfileResponse: properties: data: @@ -896,6 +1168,37 @@ components: $ref: '#/components/schemas/UserResultByScreenName' required: - user_result_by_screen_name + QuotedRefResult: + properties: + result: + $ref: '#/components/schemas/QuotedRefResultData' + required: + - result + QuotedRefResultData: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + rest_id: + pattern: ^[0-9]+$ + type: string + required: + - __typename + - rest_id + QuotedStatusPermalink: + properties: + display: + format: uri + type: string + expanded: + format: uri + type: string + url: + format: uri + type: string + required: + - url + - expanded + - display Retweet: properties: legacy: @@ -1011,14 +1314,38 @@ components: type: object SocialContextLandingUrl: properties: - Url: + url: format: uri type: string urlType: enum: - DeepLink + - UrtEndpoint type: string + urtEndpointOptions: + $ref: '#/components/schemas/UrtEndpointOptions' type: object + SuperFollowsReplyUserResult: + properties: + result: + $ref: '#/components/schemas/SuperFollowsReplyUserResultData' + required: + - result + SuperFollowsReplyUserResultData: + properties: + __typename: + $ref: '#/components/schemas/TypeName' + legacy: + $ref: '#/components/schemas/SuperFollowsReplyUserResultLegacy' + required: + - __typename + - legacy + SuperFollowsReplyUserResultLegacy: + properties: + screen_name: + type: string + required: + - screen_name Symbol: additionalProperties: true type: object @@ -1062,6 +1389,16 @@ components: - type - url - urlType + TextHighlight: + properties: + endIndex: + type: integer + startIndex: + type: integer + required: + - startIndex + - endIndex + type: object Timeline: properties: instructions: @@ -1273,6 +1610,8 @@ components: $ref: '#/components/schemas/TypeName' cursorType: $ref: '#/components/schemas/CursorType' + displayTreatment: + $ref: '#/components/schemas/DisplayTreatment' entryType: $ref: '#/components/schemas/ContentEntryType' itemType: @@ -1331,6 +1670,9 @@ components: items: $ref: '#/components/schemas/ModuleItem' type: array + metadata: + additionalProperties: true + type: object required: - __typename - entryType @@ -1340,6 +1682,8 @@ components: properties: __typename: $ref: '#/components/schemas/TypeName' + highlights: + $ref: '#/components/schemas/Highlight' itemType: $ref: '#/components/schemas/ContentItemType' promotedMetadata: @@ -1395,6 +1739,8 @@ components: properties: __typename: $ref: '#/components/schemas/TypeName' + author_community_relationship: + $ref: '#/components/schemas/AuthorCommunityRelationship' birdwatch_pivot: $ref: '#/components/schemas/BirdwatchPivot' card: @@ -1405,6 +1751,8 @@ components: $ref: '#/components/schemas/TweetEditControl' edit_prespective: $ref: '#/components/schemas/TweetEditPrespective' + has_birdwatch_notes: + type: boolean is_translatable: default: false type: boolean @@ -1412,8 +1760,12 @@ components: $ref: '#/components/schemas/TweetLegacy' note_tweet: $ref: '#/components/schemas/NoteTweet' + previous_counts: + $ref: '#/components/schemas/TweetPreviousCounts' quick_promote_eligibility: type: object + quotedRefResult: + $ref: '#/components/schemas/QuotedRefResult' quoted_status_result: $ref: '#/components/schemas/ItemResult' rest_id: @@ -1421,6 +1773,8 @@ components: type: string source: type: string + superFollowsReplyUserResult: + $ref: '#/components/schemas/SuperFollowsReplyUserResult' unified_card: $ref: '#/components/schemas/UnifiedCard' unmention_data: @@ -1451,6 +1805,10 @@ components: type: string url: type: string + user_refs_results: + items: + $ref: '#/components/schemas/UserResults' + type: array required: - binding_values - name @@ -1468,14 +1826,36 @@ components: properties: boolean_value: type: boolean + image_color_value: + additionalProperties: true + type: object + image_value: + $ref: '#/components/schemas/TweetCardLegacyBindingValueDataImage' scribe_key: type: string string_value: type: string type: type: string + user_value: + $ref: '#/components/schemas/UserValue' required: - type + TweetCardLegacyBindingValueDataImage: + properties: + alt: + type: string + height: + type: integer + url: + format: uri + type: string + width: + type: integer + required: + - height + - width + - url TweetCardPlatform: properties: audience: @@ -1585,6 +1965,8 @@ components: type: integer bookmarked: type: boolean + conversation_control: + additionalProperties: true conversation_id_str: pattern: ^[0-9]+$ type: string @@ -1619,6 +2001,14 @@ components: type: boolean lang: type: string + limited_actions: + enum: + - limited_replies + - community_tweet_non_member_public_community + - non_compliant + type: string + place: + additionalProperties: true possibly_sensitive: default: false type: boolean @@ -1627,6 +2017,11 @@ components: type: boolean quote_count: type: integer + quoted_status_id_str: + pattern: ^[0-9]+$ + type: string + quoted_status_permalink: + $ref: '#/components/schemas/QuotedStatusPermalink' reply_count: type: integer retweet_count: @@ -1666,6 +2061,24 @@ components: type: boolean required: - followers + TweetPreviousCounts: + properties: + bookmark_count: + type: integer + favorite_count: + type: integer + quote_count: + type: integer + reply_count: + type: integer + retweet_count: + type: integer + required: + - bookmark_count + - favorite_count + - quote_count + - reply_count + - retweet_count TweetResultByRestIdData: properties: tweetResult: @@ -1721,11 +2134,15 @@ components: properties: __typename: $ref: '#/components/schemas/TypeName' + limitedActionResults: + additionalProperties: true + type: object tweet: $ref: '#/components/schemas/Tweet' required: - __typename - tweet + - limitedActionResults TwitterTimeFormat: example: Sat Dec 31 23:59:59 +0000 2023 pattern: '^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) @@ -1748,6 +2165,13 @@ components: - Tweet - User - UserUnavailable + - Community + - CommunityDeleteActionUnavailable + - CommunityJoinAction + - CommunityLeaveActionUnavailable + - CommunityTweetPinActionUnavailable + - CommunityInvitesUnavailable + - CommunityJoinRequestsUnavailable type: string UnfavoriteTweet: properties: @@ -1789,6 +2213,28 @@ components: - expanded_url - display_url type: object + UrtEndpointOptions: + properties: + requestParams: + items: + $ref: '#/components/schemas/UrtEndpointRequestParams' + type: array + title: + type: string + required: + - title + - requestParams + type: object + UrtEndpointRequestParams: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object User: properties: __typename: @@ -1799,11 +2245,15 @@ components: business_account: additionalProperties: true type: object + creator_subscriptions_count: + type: integer has_graduated_access: type: boolean has_nft_avatar: default: false type: boolean + highlights_info: + $ref: '#/components/schemas/UserHighlightsInfo' id: pattern: ^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$ type: string @@ -1831,6 +2281,10 @@ components: super_following: default: false type: boolean + user_seed_tweet_count: + type: integer + verification_info: + $ref: '#/components/schemas/UserVerificationInfo' required: - __typename - affiliates_highlighted_label @@ -1849,6 +2303,15 @@ components: required: - mediatool_studio_library type: object + UserHighlightsInfo: + properties: + can_highlight_tweets: + type: boolean + highlighted_tweets: + type: string + required: + - can_highlight_tweets + - highlighted_tweets UserHighlightsTweetsData: properties: user: @@ -1990,10 +2453,15 @@ components: verified_type: enum: - Business + - Government type: string want_retweets: default: false type: boolean + withheld_in_countries: + items: + type: string + type: array required: - blocked_by - blocking @@ -2038,6 +2506,7 @@ components: professional_type: enum: - Business + - Creator type: string rest_id: pattern: ^[0-9]+$ @@ -2172,6 +2641,71 @@ components: oneOf: - $ref: '#/components/schemas/User' - $ref: '#/components/schemas/UserUnavailable' + UserValue: + properties: + id_str: + pattern: ^[0-9]+$ + type: string + required: + - id_str + UserVerificationInfo: + properties: + is_identity_verified: + default: false + type: boolean + reason: + $ref: '#/components/schemas/UserVerificationInfoReason' + required: + - is_identity_verified + - reason + UserVerificationInfoReason: + properties: + description: + $ref: '#/components/schemas/UserVerificationInfoReasonDescription' + override_verified_year: + type: integer + verified_since_msec: + pattern: ^-?[0-9]+$ + type: string + required: + - description + - verified_since_msec + - override_verified_year + UserVerificationInfoReasonDescription: + properties: + entities: + items: + $ref: '#/components/schemas/UserVerificationInfoReasonDescriptionEntities' + type: array + text: + type: string + required: + - text + - entities + UserVerificationInfoReasonDescriptionEntities: + properties: + from_index: + type: integer + ref: + $ref: '#/components/schemas/UserVerificationInfoReasonDescriptionEntitiesRef' + to_index: + type: integer + required: + - from_index + - to_index + - ref + UserVerificationInfoReasonDescriptionEntitiesRef: + properties: + url: + format: uri + type: string + url_type: + enum: + - ExternalUrl + type: string + required: + - url + - url_type UsersResponse: properties: data: diff --git a/src/openapi/schemas/content.yaml b/src/openapi/schemas/content.yaml index 78cf6ce..edc31f5 100644 --- a/src/openapi/schemas/content.yaml +++ b/src/openapi/schemas/content.yaml @@ -71,10 +71,12 @@ components: header: type: object additionalProperties: true # todo - clientEventInfo: type: object additionalProperties: true # todo + metadata: + type: object + additionalProperties: true # todo TimelineTimelineCursor: required: @@ -96,6 +98,16 @@ components: stopOnEmptyResponse: type: boolean default: false + displayTreatment: + $ref: "#/components/schemas/DisplayTreatment" + + DisplayTreatment: + type: object + required: + - "actionText" + properties: + actionText: + type: string # ================= Module ================= @@ -172,6 +184,8 @@ components: promotedMetadata: type: object additionalProperties: true # todo + highlights: + $ref: "#/components/schemas/Highlight" TimelineUser: required: @@ -218,10 +232,57 @@ components: properties: urlType: type: string # enum - enum: ["DeepLink"] - Url: + enum: ["DeepLink", "UrtEndpoint"] + url: type: string # twitter://user?id=900282258736545792 format: uri + urtEndpointOptions: + $ref: "#/components/schemas/UrtEndpointOptions" + + UrtEndpointOptions: + type: object + required: + - "title" + - "requestParams" + properties: + title: + type: string + requestParams: + type: array + items: + $ref: "#/components/schemas/UrtEndpointRequestParams" + + UrtEndpointRequestParams: + type: object + required: + - "key" + - "value" + properties: + key: + type: string + value: + type: string + + Highlight: + type: object + required: + - "textHighlights" + properties: + textHighlights: + type: array + items: + $ref: "#/components/schemas/TextHighlight" + + TextHighlight: + type: object + required: + - "startIndex" + - "endIndex" + properties: + startIndex: + type: integer + endIndex: + type: integer TimelinePrompt: properties: diff --git a/src/openapi/schemas/tweet.yaml b/src/openapi/schemas/tweet.yaml index 1284ca5..4d84b53 100644 --- a/src/openapi/schemas/tweet.yaml +++ b/src/openapi/schemas/tweet.yaml @@ -23,11 +23,15 @@ components: required: - "__typename" - "tweet" + - "limitedActionResults" properties: __typename: $ref: "./typename.yaml#/components/schemas/TypeName" # TweetWithVisibilityResults tweet: $ref: "#/components/schemas/Tweet" + limitedActionResults: + type: object + additionalProperties: true # todo TweetTombstone: #remove tweet properties: @@ -45,7 +49,6 @@ components: # - "source" # - "legacy" - "views" - properties: __typename: $ref: "./typename.yaml#/components/schemas/TypeName" # null | Tweet @@ -82,6 +85,16 @@ components: type: object unified_card: $ref: "#/components/schemas/UnifiedCard" + previous_counts: + $ref: "#/components/schemas/TweetPreviousCounts" + quotedRefResult: + $ref: "#/components/schemas/QuotedRefResult" + superFollowsReplyUserResult: + $ref: "#/components/schemas/SuperFollowsReplyUserResult" + has_birdwatch_notes: + type: boolean + author_community_relationship: + $ref: "#/components/schemas/AuthorCommunityRelationship" TweetEditControl: properties: @@ -230,6 +243,291 @@ components: type: string enum: [NoCard] + TweetPreviousCounts: + required: + - "bookmark_count" + - "favorite_count" + - "quote_count" + - "reply_count" + - "retweet_count" + properties: + bookmark_count: + type: integer + favorite_count: + type: integer + quote_count: + type: integer + reply_count: + type: integer + retweet_count: + type: integer + + QuotedRefResult: + required: + - "result" + properties: + result: + $ref: "#/components/schemas/QuotedRefResultData" + + QuotedRefResultData: + required: + - "__typename" + - "rest_id" + properties: + __typename: + $ref: "./typename.yaml#/components/schemas/TypeName" # Tweet + rest_id: + type: string + pattern: "^[0-9]+$" + + SuperFollowsReplyUserResult: + required: + - "result" + properties: + result: + $ref: "#/components/schemas/SuperFollowsReplyUserResultData" + + SuperFollowsReplyUserResultData: + required: + - "__typename" + - "legacy" + properties: + __typename: + $ref: "./../schemas/typename.yaml#/components/schemas/TypeName" # User + legacy: + $ref: "#/components/schemas/SuperFollowsReplyUserResultLegacy" + + SuperFollowsReplyUserResultLegacy: + required: + - "screen_name" + properties: + screen_name: + type: string + + AuthorCommunityRelationship: + required: + - "community_results" + properties: + community_results: + $ref: "#/components/schemas/Community" + role: + type: string + enum: [Member] + user_results: + $ref: "user.yaml#/components/schemas/UserResults" + + Community: + required: + - "result" + properties: + result: + $ref: "#/components/schemas/CommunityData" + + CommunityData: + required: + - "__typename" + - "id_str" + - "name" + - "description" + - "question" + - "search_tags" + - "primary_community_topic" + - "actions" + - "admin_results" + - "creator_results" + - "invites_result" + - "join_policy" + - "invites_policy" + - "is_pinned" + - "members_facepile_results" + - "moderator_count" + - "member_count" + - "role" + - "rules" + properties: + __typename: + $ref: "./typename.yaml#/components/schemas/TypeName" # Community + id_str: + type: string + pattern: "^[0-9]+$" + name: + type: string + description: + type: string + created_at: + type: integer + question: + type: string + search_tags: + type: array + items: + type: string + primary_community_topic: + $ref: "#/components/schemas/PrimaryCommunityTopic" + actions: + $ref: "#/components/schemas/CommunityActions" + admin_results: + $ref: "user.yaml#/components/schemas/UserResults" + creator_results: + $ref: "user.yaml#/components/schemas/UserResults" + invites_result: + $ref: "#/components/schemas/CommunityInvitesResult" + join_requests_result: + $ref: "#/components/schemas/CommunityJoinRequestsResult" + join_policy: + type: string + enum: [Open] + invites_policy: + type: string + enum: [MemberInvitesAllowed] + is_pinned: + type: boolean + members_facepile_results: + type: array + items: + $ref: "user.yaml#/components/schemas/UserResults" + moderator_count: + type: integer + member_count: + type: integer + role: + type: string + enum: [NonMember] + rules: + type: array + items: + $ref: "#/components/schemas/CommunityRule" + show_only_users_to_display: + type: array + items: + type: string + urls: + $ref: "#/components/schemas/CommunityUrls" + default_banner_media: + type: object + additionalProperties: true # todo + custom_banner_media: + type: object + additionalProperties: true # todo + viewer_relationship: + type: object + additionalProperties: true # todo + + PrimaryCommunityTopic: + required: + - "topic_id" + - "topic_name" + properties: + topic_id: + type: string + pattern: "^[0-9]+$" + topic_name: + type: string + + CommunityActions: + required: + - "delete_action_result" + - "join_action_result" + - "leave_action_result" + - "pin_action_result" + properties: + delete_action_result: + $ref: "#/components/schemas/CommunityDeleteActionResult" + join_action_result: + $ref: "#/components/schemas/CommunityJoinActionResult" + leave_action_result: + $ref: "#/components/schemas/CommunityLeaveActionResult" + pin_action_result: + $ref: "#/components/schemas/CommunityPinActionResult" + + CommunityDeleteActionResult: + required: + - "__typename" + - "reason" + properties: + __typename: + $ref: "./typename.yaml#/components/schemas/TypeName" # CommunityDeleteActionUnavailable + reason: + type: string + enum: [Unavailable] + + CommunityJoinActionResult: + required: + - "__typename" + properties: + __typename: + $ref: "./typename.yaml#/components/schemas/TypeName" # CommunityJoinAction + + CommunityLeaveActionResult: + required: + - "__typename" + - "reason" + - "message" + properties: + __typename: + $ref: "./typename.yaml#/components/schemas/TypeName" # CommunityLeaveActionUnavailable + reason: + type: string + enum: [ViewerNotMember] + message: + type: string + + CommunityPinActionResult: + required: + - "__typename" + properties: + __typename: + $ref: "./typename.yaml#/components/schemas/TypeName" # CommunityTweetPinActionUnavailable + + CommunityInvitesResult: + required: + - "__typename" + - "reason" + - "message" + properties: + __typename: + $ref: "./typename.yaml#/components/schemas/TypeName" # CommunityInvitesUnavailable + reason: + type: string + enum: [Unavailable] + message: + type: string + + CommunityJoinRequestsResult: + required: + - "__typename" + properties: + __typename: + $ref: "./typename.yaml#/components/schemas/TypeName" # CommunityJoinRequestsUnavailable + + CommunityRule: + required: + - "rest_id" + - "name" + properties: + rest_id: + type: string + pattern: "^[0-9]+$" + name: + type: string + description: + type: string + + CommunityUrls: + required: + - "permalink" + properties: + permalink: + $ref: "#/components/schemas/CommunityUrlsPermalink" + + CommunityUrlsPermalink: + required: + - "url" + properties: + url: + type: string + format: uri + BirdwatchPivot: required: - "destinationUrl" @@ -346,6 +644,10 @@ components: # {'platform': {'audience': {'name': 'production'}, 'device': {'name': 'Swift', 'version': '12'}}} card_platform: $ref: "#/components/schemas/TweetCardPlatformData" + user_refs_results: + type: array + items: + $ref: "user.yaml#/components/schemas/UserResults" TweetCardPlatformData: required: @@ -405,6 +707,37 @@ components: type: string type: type: string + image_value: + $ref: "#/components/schemas/TweetCardLegacyBindingValueDataImage" + image_color_value: + type: object + additionalProperties: true # todo + user_value: + $ref: "#/components/schemas/UserValue" + + UserValue: + required: + - "id_str" + properties: + id_str: + type: string + pattern: "^[0-9]+$" + + TweetCardLegacyBindingValueDataImage: + required: + - "height" + - "width" + - "url" + properties: + height: + type: integer + width: + type: integer + url: + type: string + format: uri + alt: + type: string TweetLegacy: required: @@ -487,6 +820,21 @@ components: in_reply_to_user_id_str: type: string pattern: "^[0-9]+$" + quoted_status_permalink: + $ref: "#/components/schemas/QuotedStatusPermalink" + quoted_status_id_str: + type: string + pattern: "^[0-9]+$" + conversation_control: + additionalProperties: true # todo + limited_actions: + type: string + enum: + - "limited_replies" + - "community_tweet_non_member_public_community" + - "non_compliant" + place: + additionalProperties: true # todo SelfThread: required: @@ -607,6 +955,14 @@ components: additional_media_info: type: object additionalProperties: true # todo + source_user_id_str: + type: string + pattern: "^[0-9]+$" + source_status_id_str: + type: string + pattern: "^[0-9]+$" + ext_alt_text: + type: string TweetLegacyScopes: required: @@ -615,6 +971,22 @@ components: followers: type: boolean + QuotedStatusPermalink: + required: + - "url" + - "expanded" + - "display" + properties: + url: + type: string + format: uri + expanded: + type: string + format: uri + display: + type: string + format: uri + ExtendedEntities: required: - "media" @@ -677,6 +1049,14 @@ components: $ref: "#/components/schemas/MediaOriginalInfo" video_info: $ref: "#/components/schemas/MediaVideoInfo" + source_user_id_str: + type: string + pattern: "^[0-9]+$" + source_status_id_str: + type: string + pattern: "^[0-9]+$" + ext_alt_text: + type: string MediaOriginalInfo: required: @@ -744,6 +1124,31 @@ components: properties: monetizable: type: boolean + source_user: + $ref: "./user.yaml#/components/schemas/UserResultCore" + title: # null character + type: string + description: # null character + type: string + embeddable: + type: boolean + call_to_actions: + $ref: "#/components/schemas/AdditionalMediaInfoCallToActions" + + AdditionalMediaInfoCallToActions: + required: + - "visit_site" + properties: + visit_site: + $ref: "#/components/schemas/AdditionalMediaInfoCallToActionsVisitSite" + + AdditionalMediaInfoCallToActionsVisitSite: + required: + - "url" + properties: + url: + type: string + format: uri MediaStats: required: diff --git a/src/openapi/schemas/typename.yaml b/src/openapi/schemas/typename.yaml index ee88b92..78b66d3 100644 --- a/src/openapi/schemas/typename.yaml +++ b/src/openapi/schemas/typename.yaml @@ -23,4 +23,11 @@ components: Tweet, User, UserUnavailable, + Community, + CommunityDeleteActionUnavailable, + CommunityJoinAction, + CommunityLeaveActionUnavailable, + CommunityTweetPinActionUnavailable, + CommunityInvitesUnavailable, + CommunityJoinRequestsUnavailable, ] diff --git a/src/openapi/schemas/user.yaml b/src/openapi/schemas/user.yaml index 7bfc027..d43d695 100644 --- a/src/openapi/schemas/user.yaml +++ b/src/openapi/schemas/user.yaml @@ -81,6 +81,14 @@ components: - "Square" professional: $ref: "#/components/schemas/UserProfessional" + user_seed_tweet_count: + type: integer + highlights_info: + $ref: "#/components/schemas/UserHighlightsInfo" + creator_subscriptions_count: + type: integer + verification_info: + $ref: "#/components/schemas/UserVerificationInfo" UserProfessional: required: @@ -93,7 +101,7 @@ components: pattern: "^[0-9]+$" professional_type: type: string - enum: ["Business"] + enum: ["Business", "Creator"] category: type: array items: @@ -112,6 +120,79 @@ components: icon_name: type: string # IconBriefcaseStroke ? + UserHighlightsInfo: + required: + - "can_highlight_tweets" + - "highlighted_tweets" + properties: + can_highlight_tweets: + type: boolean + highlighted_tweets: + type: string + + UserVerificationInfo: + required: + - "is_identity_verified" + - "reason" + + properties: + is_identity_verified: + type: boolean + default: false + reason: + $ref: "#/components/schemas/UserVerificationInfoReason" + + UserVerificationInfoReason: + required: + - "description" + - "verified_since_msec" + - "override_verified_year" + properties: + description: + $ref: "#/components/schemas/UserVerificationInfoReasonDescription" + verified_since_msec: + type: string + pattern: "^-?[0-9]+$" + override_verified_year: + type: integer + + UserVerificationInfoReasonDescription: + required: + - "text" + - "entities" + properties: + text: + type: string + entities: + type: array + items: + $ref: "#/components/schemas/UserVerificationInfoReasonDescriptionEntities" + + UserVerificationInfoReasonDescriptionEntities: + required: + - "from_index" + - "to_index" + - "ref" + properties: + from_index: + type: integer + to_index: + type: integer + ref: + $ref: "#/components/schemas/UserVerificationInfoReasonDescriptionEntitiesRef" + + UserVerificationInfoReasonDescriptionEntitiesRef: + required: + - "url" + - "url_type" + properties: + url: + type: string + format: uri + url_type: + type: string + enum: ["ExternalUrl"] + UserLegacy: required: - "blocked_by" @@ -259,7 +340,11 @@ components: default: false verified_type: type: string - enum: ["Business"] + enum: ["Business", "Government"] + withheld_in_countries: + type: array + items: + type: string # enum DE UserUnavailable: required: diff --git a/test/python/test_serialize.py b/test/python/test_serialize.py index 565a160..5c538b0 100644 --- a/test/python/test_serialize.py +++ b/test/python/test_serialize.py @@ -65,12 +65,25 @@ def get_kwargs(key, additional): return kwargs -def match_rate_zero(a, b, key, fn): - fn(a, b, key) +def match_rate_zero(a, b, base, key): + def get(obj, key): + if isinstance(obj, list): + return get(obj[key[0]], key[1:]) + if obj.__dict__.get("actual_instance") is not None: + return get(obj.actual_instance, key) + if len(key) == 0: + return obj + return get(super_get(obj.__dict__, key[0]), key[1:]) + + if STRICT_MODE: + obj_name = type(get(base, key[:-1])) + obj_key = f"{obj_name.__name__}.{key[-1]}" + raise Exception(f"Not defined: {obj_key}\nContents: {b}") + return 0 -def match_rate(a, b, key="", fn=lambda x: None): +def match_rate(a, b, base, key=""): if isinstance(a, aenum.Enum): a = a.value if isinstance(b, aenum.Enum): @@ -83,22 +96,26 @@ def match_rate(a, b, key="", fn=lambda x: None): return 1 if isinstance(a, list) and b is None and len(a) == 0: return 1 + if a is None and isinstance(b, dict) and len(b) == 0: + return 1 + if isinstance(a, dict) and b is None and len(a) == 0: + return 1 if isinstance(a, dict) and isinstance(b, dict): if len(a) == 0 and len(b) == 0: return 1 marge_key = set(a.keys()) | set(b.keys()) - data = [match_rate(a.get(k), b.get(k), [*key, k], fn) for k in marge_key] + data = [match_rate(a.get(k), b.get(k), base, [*key, k]) for k in marge_key] return sum(data) / len(b) if isinstance(a, list) and isinstance(b, list): if len(a) == 0 and len(b) == 0: return 1 if len(a) != len(b): - return match_rate_zero(a, b, key, fn) - data = [match_rate(a[i], b[i], [*key, i], fn) for i in range(len(a))] + return match_rate_zero(a, b, base, key) + data = [match_rate(a[i], b[i], base, [*key, i]) for i in range(len(a))] return sum(data) / len(a) if a == b: return 1 - return match_rate_zero(a, b, key, fn) + return match_rate_zero(a, b, base, key) def save_cache(data): @@ -126,25 +143,10 @@ def task_callback(file, thread=True): cache = json.load(f) data = pt.__dict__[cache["type"]].from_json(cache["raw"]) - def get(obj, key): - if isinstance(obj, list): - return get(obj[key[0]], key[1:]) - if obj.__dict__.get("actual_instance") is not None: - return get(obj.actual_instance, key) - if len(key) == 0: - return obj - return get(super_get(obj.__dict__, key[0]), key[1:]) - - def match_rate_hook(a, b, key): - if STRICT_MODE: - obj_name = type(get(data, key[:-1])) - obj_key = f"{obj_name.__name__}.{key[-1]}" - raise Exception(f"Not defined: {obj_key}\nContents: {b}") - rate = match_rate( data.to_dict(), json.loads(cache["raw"]), - fn=match_rate_hook, + base=data, ) return rate, file except Exception: @@ -254,7 +256,11 @@ if __name__ == "__main__": new_cursor = set(get_cursor(data, find_cursor)) - cursor_history cursor_list.update(new_cursor) - rate = match_rate(data, json.loads(res.raw_data)) + rate = match_rate( + data, + json.loads(res.raw_data), + res.data, + ) logger.info(f"Match rate: {rate}") if data.get("errors") is not None: @@ -275,7 +281,11 @@ if __name__ == "__main__": res = pt.UserApi(api_client).get_user_by_screen_name_with_http_info(**kwargs) data = res.data.to_dict() - rate = match_rate(data, json.loads(res.raw_data)) + rate = match_rate( + data, + json.loads(res.raw_data), + res.data, + ) logger.info(f"Match rate: {rate}") screen_name = data["data"]["user"]["result"]["legacy"]["screen_name"] if not screen_name == "a810810931931": @@ -290,7 +300,11 @@ if __name__ == "__main__": res = pt.TweetApi(api_client).get_user_tweets_with_http_info(**kwargs) data = res.data.to_dict() - rate = match_rate(data, json.loads(res.raw_data)) + rate = match_rate( + data, + json.loads(res.raw_data), + res.data, + ) logger.info(f"Match rate: {rate}") except Exception as e: @@ -309,7 +323,11 @@ if __name__ == "__main__": res = pt.TweetApi(api_client).get_tweet_detail_with_http_info(**kwargs) data = res.data.to_dict() - rate = match_rate(data, json.loads(res.raw_data)) + rate = match_rate( + data, + json.loads(res.raw_data), + res.data, + ) logger.info(f"Match rate: {rate}") except Exception as e: error_dump(e)