Skip to content

release: 0.7.0 - #29

Merged
kriptoburak merged 1 commit into
mainfrom
release-please--branches--main--changes--next
Jul 31, 2026
Merged

release: 0.7.0#29
kriptoburak merged 1 commit into
mainfrom
release-please--branches--main--changes--next

Conversation

@stainless-app

@stainless-app stainless-app Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Automated Release PR

0.7.0 (2026-07-31)

Full Changelog: v0.6.1...v0.7.0

Features

  • api: align reply extraction contracts (d03581f)

This pull request is managed by Stainless's GitHub App.

The semver version number is based on included commit messages. Alternatively, you can manually set the version number in the title of this pull request.

For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request.

🔗 Stainless website
📚 Read the docs
🙋 Reach out for help or questions


Summary by cubic

Release 0.7.0 aligns reply extraction and adds richer tweet/media fields and typed account unions for clearer, more reliable integrations. It also introduces a typed replies response with diagnostics and updates install docs to 0.7.0.

  • New Features

    • Added X::TweetGetRepliesResponse with diagnostic and nested_replies.
    • Replies params: mode=complete and limit; unified page_size docs.
    • Expanded tweet models (EmbeddedTweet, SearchTweet, X::TweetDetail): article, card, community_note, edit, and richer TweetMedia.
    • Typed unions for account connect flows; X::Accounts#create now returns X::AccountCreateResponse.
    • Trends now include promoted_content, tweet_volume, and url.
  • Migration

    • Support tickets: required fields tightened (tickets, created_at, messages, public_id); status is now an enum.
    • Account models: status is :active (Symbol); connection attempt variants renamed and discriminated by status.
    • X::TweetAuthor requires followers and verified.
    • Removed fields: ContentDisclosure::AIGenerated.can_edit, XGetArticleResponse::Author.can_dm, community is_member and role.

Written for commit 0e18e37. Summary will update on new commits.

Review in cubic

Note

Release version 0.7.0 of the x_twitter_scraper gem

Bumps XTwitterScraper::VERSION from 0.6.1 to 0.7.0 and updates the README installation snippet to reference ~> 0.7.0. Updates CHANGELOG.md with a 0.7.0 features entry and comparison link.

Macroscope summarized 0e18e37.

Summary by CodeRabbit

  • New Features

    • Added support for tweet metadata including articles, cards, community notes, edits, translations, and places.
    • Expanded tweet reply retrieval with complete-mode collection and diagnostic metrics for coverage analysis.
    • Enhanced media metadata with identifiers, accessibility info, dimensions, and crop data.
    • Added trend data fields for promoted content and tweet volume.
    • Extended user profile data with verification, subscription, and affiliation information.
  • Bug Fixes

    • Improved support ticket response models with required fields and typed status enums.

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Version 0.7.0 updates public API models and type contracts. The release adds tweet metadata, typed account and support responses, complete reply extraction parameters and diagnostics, revised pagination documentation, and corresponding runtime, RBI, RBS, and test updates.

Changes

API contract and model updates

Layer / File(s) Summary
Tweet, media, profile, and trend models
lib/x_twitter_scraper/models/*, rbi/x_twitter_scraper/models/*, sig/x_twitter_scraper/models/*
Models now expose additional tweet, media, profile, and trend metadata. Matching constructors, serialization shapes, RBI declarations, and RBS signatures were updated.
Reply extraction response
lib/x_twitter_scraper/models/x/tweet_get_replies_*, rbi/x_twitter_scraper/models/x/tweet_get_replies_*, sig/x_twitter_scraper/models/x/tweet_get_replies_*, lib/x_twitter_scraper/resources/x/tweets.rb, rbi/x_twitter_scraper/resources/x/tweets.rbi, sig/x_twitter_scraper/resources/x/tweets.rbs
get_replies now accepts limit and complete mode, returns TweetGetRepliesResponse, and exposes diagnostic, nested-reply, richness, strategy, and stop-reason data.
Account response contracts
lib/x_twitter_scraper/models/x/account_*, rbi/x_twitter_scraper/models/x/account_*, sig/x_twitter_scraper/models/x/account_*, lib/x_twitter_scraper/resources/x/accounts.rb, rbi/x_twitter_scraper/resources/x/accounts.rbi, sig/x_twitter_scraper/resources/x/accounts.rbs
Account creation now uses a typed union. Connection-attempt variants were renamed, and fixed status values use symbols.
Support response contracts
lib/x_twitter_scraper/models/support/*, rbi/x_twitter_scraper/models/support/*, sig/x_twitter_scraper/models/support/*
Ticket response fields are required. Ticket status and message sender fields use typed enums.
Release, pagination, and validation updates
.release-please-manifest.json, .stats.yml, CHANGELOG.md, README.md, lib/x_twitter_scraper/version.rb, lib/x_twitter_scraper/resources/x/*, rbi/x_twitter_scraper/resources/x/*, test/x_twitter_scraper/resources/**/*
The package version and specification reference were updated. Pagination documentation now describes source, filter, and credit limits. Tests validate the revised response shapes.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant TweetsResource
  participant ReplyCollector
  participant TweetGetRepliesResponse

  Caller->>TweetsResource: get_replies(limit, mode)
  TweetsResource->>ReplyCollector: collect replies
  ReplyCollector->>TweetGetRepliesResponse: build replies and diagnostics
  TweetGetRepliesResponse-->>Caller: paginated response
Loading

Suggested reviewers: kriptoburak, furkanerday

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 30.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies this as the 0.7.0 release, which matches the primary purpose of the pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release-please--branches--main--changes--next

Comment @coderabbitai help to get the list of available commands.

@socket-security

socket-security Bot commented Jul 31, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatedx-twitter-scraper@​0.6.1 ⏵ 0.7.0N/AN/AN/AN/AN/A

View full report

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@test/x_twitter_scraper/resources/x/account_connection_attempts_test.rb`:
- Line 37: Wrap the long hash pattern in the pattern match around the
requires_email_code case across multiple lines, matching the multiline
formatting used by the Failed pattern above and keeping all existing keys and
types unchanged.

In `@test/x_twitter_scraper/resources/x/users_test.rb`:
- Line 48: Resolve the Layout/LineLength offense for the generated profile_bio
assertion by updating the generator’s formatting width or the applicable RuboCop
configuration, rather than editing users_test.rb directly. Ensure generated test
output stays within the configured 110-character limit.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 0f4cef06-e36a-449b-89f6-40a9ca18166e

📥 Commits

Reviewing files that changed from the base of the PR and between 9b2e7d9 and 5d78d6a.

⛔ Files ignored due to path filters (1)
  • Gemfile.lock is excluded by !**/*.lock
📒 Files selected for processing (112)
  • .release-please-manifest.json
  • .stats.yml
  • CHANGELOG.md
  • README.md
  • lib/x_twitter_scraper.rb
  • lib/x_twitter_scraper/internal/type/union.rb
  • lib/x_twitter_scraper/models/content_disclosure.rb
  • lib/x_twitter_scraper/models/embedded_tweet.rb
  • lib/x_twitter_scraper/models/paginated_tweets.rb
  • lib/x_twitter_scraper/models/search_tweet.rb
  • lib/x_twitter_scraper/models/support/ticket_list_response.rb
  • lib/x_twitter_scraper/models/support/ticket_retrieve_response.rb
  • lib/x_twitter_scraper/models/support/ticket_update_response.rb
  • lib/x_twitter_scraper/models/trend_list_response.rb
  • lib/x_twitter_scraper/models/tweet_media.rb
  • lib/x_twitter_scraper/models/user_profile.rb
  • lib/x_twitter_scraper/models/x/account_connection_attempt_retrieve_response.rb
  • lib/x_twitter_scraper/models/x/account_connection_challenge_submit_response.rb
  • lib/x_twitter_scraper/models/x/account_create_response.rb
  • lib/x_twitter_scraper/models/x/account_reauth_response.rb
  • lib/x_twitter_scraper/models/x/communities/tweet_list_by_community_params.rb
  • lib/x_twitter_scraper/models/x/communities/tweet_list_params.rb
  • lib/x_twitter_scraper/models/x/community_retrieve_info_response.rb
  • lib/x_twitter_scraper/models/x/community_retrieve_search_params.rb
  • lib/x_twitter_scraper/models/x/list_retrieve_tweets_params.rb
  • lib/x_twitter_scraper/models/x/tweet_author.rb
  • lib/x_twitter_scraper/models/x/tweet_detail.rb
  • lib/x_twitter_scraper/models/x/tweet_get_quotes_params.rb
  • lib/x_twitter_scraper/models/x/tweet_get_replies_params.rb
  • lib/x_twitter_scraper/models/x/tweet_get_replies_response.rb
  • lib/x_twitter_scraper/models/x/tweet_get_thread_params.rb
  • lib/x_twitter_scraper/models/x/user_retrieve_likes_params.rb
  • lib/x_twitter_scraper/models/x/user_retrieve_media_params.rb
  • lib/x_twitter_scraper/models/x/user_retrieve_mentions_params.rb
  • lib/x_twitter_scraper/models/x/user_retrieve_replies_params.rb
  • lib/x_twitter_scraper/models/x/user_retrieve_tweets_params.rb
  • lib/x_twitter_scraper/models/x_get_article_response.rb
  • lib/x_twitter_scraper/models/x_get_trends_response.rb
  • lib/x_twitter_scraper/resources/x/account_connection_attempts.rb
  • lib/x_twitter_scraper/resources/x/accounts.rb
  • lib/x_twitter_scraper/resources/x/communities.rb
  • lib/x_twitter_scraper/resources/x/communities/tweets.rb
  • lib/x_twitter_scraper/resources/x/lists.rb
  • lib/x_twitter_scraper/resources/x/tweets.rb
  • lib/x_twitter_scraper/resources/x/users.rb
  • lib/x_twitter_scraper/version.rb
  • rbi/x_twitter_scraper/models/content_disclosure.rbi
  • rbi/x_twitter_scraper/models/embedded_tweet.rbi
  • rbi/x_twitter_scraper/models/paginated_tweets.rbi
  • rbi/x_twitter_scraper/models/search_tweet.rbi
  • rbi/x_twitter_scraper/models/support/ticket_list_response.rbi
  • rbi/x_twitter_scraper/models/support/ticket_retrieve_response.rbi
  • rbi/x_twitter_scraper/models/support/ticket_update_response.rbi
  • rbi/x_twitter_scraper/models/trend_list_response.rbi
  • rbi/x_twitter_scraper/models/tweet_media.rbi
  • rbi/x_twitter_scraper/models/user_profile.rbi
  • rbi/x_twitter_scraper/models/x/account_connection_attempt_retrieve_response.rbi
  • rbi/x_twitter_scraper/models/x/account_connection_challenge_submit_response.rbi
  • rbi/x_twitter_scraper/models/x/account_create_response.rbi
  • rbi/x_twitter_scraper/models/x/account_reauth_response.rbi
  • rbi/x_twitter_scraper/models/x/communities/tweet_list_by_community_params.rbi
  • rbi/x_twitter_scraper/models/x/communities/tweet_list_params.rbi
  • rbi/x_twitter_scraper/models/x/community_retrieve_info_response.rbi
  • rbi/x_twitter_scraper/models/x/community_retrieve_search_params.rbi
  • rbi/x_twitter_scraper/models/x/list_retrieve_tweets_params.rbi
  • rbi/x_twitter_scraper/models/x/tweet_author.rbi
  • rbi/x_twitter_scraper/models/x/tweet_detail.rbi
  • rbi/x_twitter_scraper/models/x/tweet_get_quotes_params.rbi
  • rbi/x_twitter_scraper/models/x/tweet_get_replies_params.rbi
  • rbi/x_twitter_scraper/models/x/tweet_get_replies_response.rbi
  • rbi/x_twitter_scraper/models/x/tweet_get_thread_params.rbi
  • rbi/x_twitter_scraper/models/x/user_retrieve_likes_params.rbi
  • rbi/x_twitter_scraper/models/x/user_retrieve_media_params.rbi
  • rbi/x_twitter_scraper/models/x/user_retrieve_mentions_params.rbi
  • rbi/x_twitter_scraper/models/x/user_retrieve_replies_params.rbi
  • rbi/x_twitter_scraper/models/x/user_retrieve_tweets_params.rbi
  • rbi/x_twitter_scraper/models/x_get_article_response.rbi
  • rbi/x_twitter_scraper/models/x_get_trends_response.rbi
  • rbi/x_twitter_scraper/resources/x/accounts.rbi
  • rbi/x_twitter_scraper/resources/x/communities.rbi
  • rbi/x_twitter_scraper/resources/x/communities/tweets.rbi
  • rbi/x_twitter_scraper/resources/x/lists.rbi
  • rbi/x_twitter_scraper/resources/x/tweets.rbi
  • rbi/x_twitter_scraper/resources/x/users.rbi
  • sig/x_twitter_scraper/models/content_disclosure.rbs
  • sig/x_twitter_scraper/models/embedded_tweet.rbs
  • sig/x_twitter_scraper/models/search_tweet.rbs
  • sig/x_twitter_scraper/models/support/ticket_list_response.rbs
  • sig/x_twitter_scraper/models/support/ticket_retrieve_response.rbs
  • sig/x_twitter_scraper/models/support/ticket_update_response.rbs
  • sig/x_twitter_scraper/models/trend_list_response.rbs
  • sig/x_twitter_scraper/models/tweet_media.rbs
  • sig/x_twitter_scraper/models/user_profile.rbs
  • sig/x_twitter_scraper/models/x/account_connection_attempt_retrieve_response.rbs
  • sig/x_twitter_scraper/models/x/account_connection_challenge_submit_response.rbs
  • sig/x_twitter_scraper/models/x/account_create_response.rbs
  • sig/x_twitter_scraper/models/x/account_reauth_response.rbs
  • sig/x_twitter_scraper/models/x/community_retrieve_info_response.rbs
  • sig/x_twitter_scraper/models/x/tweet_author.rbs
  • sig/x_twitter_scraper/models/x/tweet_detail.rbs
  • sig/x_twitter_scraper/models/x/tweet_get_replies_params.rbs
  • sig/x_twitter_scraper/models/x/tweet_get_replies_response.rbs
  • sig/x_twitter_scraper/models/x_get_article_response.rbs
  • sig/x_twitter_scraper/models/x_get_trends_response.rbs
  • sig/x_twitter_scraper/resources/x/accounts.rbs
  • sig/x_twitter_scraper/resources/x/tweets.rbs
  • test/x_twitter_scraper/resources/support/tickets_test.rb
  • test/x_twitter_scraper/resources/x/account_connection_attempts_test.rb
  • test/x_twitter_scraper/resources/x/account_connection_challenges_test.rb
  • test/x_twitter_scraper/resources/x/accounts_test.rb
  • test/x_twitter_scraper/resources/x/tweets_test.rb
  • test/x_twitter_scraper/resources/x/users_test.rb
💤 Files with no reviewable changes (4)
  • sig/x_twitter_scraper/models/x/community_retrieve_info_response.rbs
  • sig/x_twitter_scraper/models/x_get_article_response.rbs
  • rbi/x_twitter_scraper/models/x_get_article_response.rbi
  • rbi/x_twitter_scraper/models/x/community_retrieve_info_response.rbi

retryable: XTwitterScraper::Internal::Type::Boolean,
reason: String | nil
}
in {status: :requires_email_code, id: String, expires_at: Time, message: String, object: Symbol, username: String}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Wrap the long pattern-match hash to satisfy the line-length lint rule.

Line 37 exceeds the configured RuboCop line length limit (120 characters, limit is 110). Wrap the hash pattern across multiple lines, consistent with the Failed pattern above it.

🔧 Proposed fix to wrap the long line
-      in {status: :requires_email_code, id: String, expires_at: Time, message: String, object: Symbol, username: String}
+      in {
+        status: :requires_email_code,
+        id: String,
+        expires_at: Time,
+        message: String,
+        object: Symbol,
+        username: String
+      }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
in {status: :requires_email_code, id: String, expires_at: Time, message: String, object: Symbol, username: String}
in {
status: :requires_email_code,
id: String,
expires_at: Time,
message: String,
object: Symbol,
username: String
}
🧰 Tools
🪛 RuboCop (1.88.2)

[convention] 37-37: Line is too long. [120/110]

(Layout/LineLength)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/x_twitter_scraper/resources/x/account_connection_attempts_test.rb` at
line 37, Wrap the long hash pattern in the pattern match around the
requires_email_code case across multiple lines, matching the multiline
formatting used by the Failed pattern above and keeping all existing keys and
types unchanged.

Source: Linters/SAST tools

parody_commentary_fan_label: String | nil,
pinned_tweet_ids: ^(XTwitterScraper::Internal::Type::ArrayOf[String]) | nil,
possibly_sensitive: XTwitterScraper::Internal::Type::Boolean | nil,
profile_bio: ^(XTwitterScraper::Internal::Type::HashOf[XTwitterScraper::Internal::Type::Unknown]) | nil,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Resolve the RuboCop Layout/LineLength offense on the profile_bio assertion.

Line 48 is 112 characters and exceeds the configured limit of 110. RuboCop 1.88.2 reports this as a convention offense. If the lint job covers test/, this fails CI. Because this file is generated, fix it in configuration or in the generator formatting width rather than by hand editing.

🔧 Option: exclude generated tests from Layout/LineLength
 Layout/LineLength:
   Max: 110
+  Exclude:
+    - "test/**/*_test.rb"
🧰 Tools
🪛 RuboCop (1.88.2)

[convention] 48-48: Line is too long. [112/110]

(Layout/LineLength)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/x_twitter_scraper/resources/x/users_test.rb` at line 48, Resolve the
Layout/LineLength offense for the generated profile_bio assertion by updating
the generator’s formatting width or the applicable RuboCop configuration, rather
than editing users_test.rb directly. Ensure generated test output stays within
the configured 110-character limit.

Source: Linters/SAST tools

@kriptoburak
kriptoburak force-pushed the release-please--branches--main--changes--next branch from 5d78d6a to 0e18e37 Compare July 31, 2026 14:50
@kriptoburak
kriptoburak merged commit b7bce9f into main Jul 31, 2026
12 checks passed
@stainless-app

stainless-app Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant