release: 0.7.0 - #29
Conversation
📝 WalkthroughWalkthroughVersion 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. ChangesAPI contract and model updates
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
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
There was a problem hiding this comment.
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
⛔ Files ignored due to path filters (1)
Gemfile.lockis excluded by!**/*.lock
📒 Files selected for processing (112)
.release-please-manifest.json.stats.ymlCHANGELOG.mdREADME.mdlib/x_twitter_scraper.rblib/x_twitter_scraper/internal/type/union.rblib/x_twitter_scraper/models/content_disclosure.rblib/x_twitter_scraper/models/embedded_tweet.rblib/x_twitter_scraper/models/paginated_tweets.rblib/x_twitter_scraper/models/search_tweet.rblib/x_twitter_scraper/models/support/ticket_list_response.rblib/x_twitter_scraper/models/support/ticket_retrieve_response.rblib/x_twitter_scraper/models/support/ticket_update_response.rblib/x_twitter_scraper/models/trend_list_response.rblib/x_twitter_scraper/models/tweet_media.rblib/x_twitter_scraper/models/user_profile.rblib/x_twitter_scraper/models/x/account_connection_attempt_retrieve_response.rblib/x_twitter_scraper/models/x/account_connection_challenge_submit_response.rblib/x_twitter_scraper/models/x/account_create_response.rblib/x_twitter_scraper/models/x/account_reauth_response.rblib/x_twitter_scraper/models/x/communities/tweet_list_by_community_params.rblib/x_twitter_scraper/models/x/communities/tweet_list_params.rblib/x_twitter_scraper/models/x/community_retrieve_info_response.rblib/x_twitter_scraper/models/x/community_retrieve_search_params.rblib/x_twitter_scraper/models/x/list_retrieve_tweets_params.rblib/x_twitter_scraper/models/x/tweet_author.rblib/x_twitter_scraper/models/x/tweet_detail.rblib/x_twitter_scraper/models/x/tweet_get_quotes_params.rblib/x_twitter_scraper/models/x/tweet_get_replies_params.rblib/x_twitter_scraper/models/x/tweet_get_replies_response.rblib/x_twitter_scraper/models/x/tweet_get_thread_params.rblib/x_twitter_scraper/models/x/user_retrieve_likes_params.rblib/x_twitter_scraper/models/x/user_retrieve_media_params.rblib/x_twitter_scraper/models/x/user_retrieve_mentions_params.rblib/x_twitter_scraper/models/x/user_retrieve_replies_params.rblib/x_twitter_scraper/models/x/user_retrieve_tweets_params.rblib/x_twitter_scraper/models/x_get_article_response.rblib/x_twitter_scraper/models/x_get_trends_response.rblib/x_twitter_scraper/resources/x/account_connection_attempts.rblib/x_twitter_scraper/resources/x/accounts.rblib/x_twitter_scraper/resources/x/communities.rblib/x_twitter_scraper/resources/x/communities/tweets.rblib/x_twitter_scraper/resources/x/lists.rblib/x_twitter_scraper/resources/x/tweets.rblib/x_twitter_scraper/resources/x/users.rblib/x_twitter_scraper/version.rbrbi/x_twitter_scraper/models/content_disclosure.rbirbi/x_twitter_scraper/models/embedded_tweet.rbirbi/x_twitter_scraper/models/paginated_tweets.rbirbi/x_twitter_scraper/models/search_tweet.rbirbi/x_twitter_scraper/models/support/ticket_list_response.rbirbi/x_twitter_scraper/models/support/ticket_retrieve_response.rbirbi/x_twitter_scraper/models/support/ticket_update_response.rbirbi/x_twitter_scraper/models/trend_list_response.rbirbi/x_twitter_scraper/models/tweet_media.rbirbi/x_twitter_scraper/models/user_profile.rbirbi/x_twitter_scraper/models/x/account_connection_attempt_retrieve_response.rbirbi/x_twitter_scraper/models/x/account_connection_challenge_submit_response.rbirbi/x_twitter_scraper/models/x/account_create_response.rbirbi/x_twitter_scraper/models/x/account_reauth_response.rbirbi/x_twitter_scraper/models/x/communities/tweet_list_by_community_params.rbirbi/x_twitter_scraper/models/x/communities/tweet_list_params.rbirbi/x_twitter_scraper/models/x/community_retrieve_info_response.rbirbi/x_twitter_scraper/models/x/community_retrieve_search_params.rbirbi/x_twitter_scraper/models/x/list_retrieve_tweets_params.rbirbi/x_twitter_scraper/models/x/tweet_author.rbirbi/x_twitter_scraper/models/x/tweet_detail.rbirbi/x_twitter_scraper/models/x/tweet_get_quotes_params.rbirbi/x_twitter_scraper/models/x/tweet_get_replies_params.rbirbi/x_twitter_scraper/models/x/tweet_get_replies_response.rbirbi/x_twitter_scraper/models/x/tweet_get_thread_params.rbirbi/x_twitter_scraper/models/x/user_retrieve_likes_params.rbirbi/x_twitter_scraper/models/x/user_retrieve_media_params.rbirbi/x_twitter_scraper/models/x/user_retrieve_mentions_params.rbirbi/x_twitter_scraper/models/x/user_retrieve_replies_params.rbirbi/x_twitter_scraper/models/x/user_retrieve_tweets_params.rbirbi/x_twitter_scraper/models/x_get_article_response.rbirbi/x_twitter_scraper/models/x_get_trends_response.rbirbi/x_twitter_scraper/resources/x/accounts.rbirbi/x_twitter_scraper/resources/x/communities.rbirbi/x_twitter_scraper/resources/x/communities/tweets.rbirbi/x_twitter_scraper/resources/x/lists.rbirbi/x_twitter_scraper/resources/x/tweets.rbirbi/x_twitter_scraper/resources/x/users.rbisig/x_twitter_scraper/models/content_disclosure.rbssig/x_twitter_scraper/models/embedded_tweet.rbssig/x_twitter_scraper/models/search_tweet.rbssig/x_twitter_scraper/models/support/ticket_list_response.rbssig/x_twitter_scraper/models/support/ticket_retrieve_response.rbssig/x_twitter_scraper/models/support/ticket_update_response.rbssig/x_twitter_scraper/models/trend_list_response.rbssig/x_twitter_scraper/models/tweet_media.rbssig/x_twitter_scraper/models/user_profile.rbssig/x_twitter_scraper/models/x/account_connection_attempt_retrieve_response.rbssig/x_twitter_scraper/models/x/account_connection_challenge_submit_response.rbssig/x_twitter_scraper/models/x/account_create_response.rbssig/x_twitter_scraper/models/x/account_reauth_response.rbssig/x_twitter_scraper/models/x/community_retrieve_info_response.rbssig/x_twitter_scraper/models/x/tweet_author.rbssig/x_twitter_scraper/models/x/tweet_detail.rbssig/x_twitter_scraper/models/x/tweet_get_replies_params.rbssig/x_twitter_scraper/models/x/tweet_get_replies_response.rbssig/x_twitter_scraper/models/x_get_article_response.rbssig/x_twitter_scraper/models/x_get_trends_response.rbssig/x_twitter_scraper/resources/x/accounts.rbssig/x_twitter_scraper/resources/x/tweets.rbstest/x_twitter_scraper/resources/support/tickets_test.rbtest/x_twitter_scraper/resources/x/account_connection_attempts_test.rbtest/x_twitter_scraper/resources/x/account_connection_challenges_test.rbtest/x_twitter_scraper/resources/x/accounts_test.rbtest/x_twitter_scraper/resources/x/tweets_test.rbtest/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} |
There was a problem hiding this comment.
📐 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.
| 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, |
There was a problem hiding this comment.
📐 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
5d78d6a to
0e18e37
Compare
|
🤖 Release is at https://github.com/Xquik-dev/x-twitter-scraper-ruby/releases/tag/v0.7.0 🌻 |
Automated Release PR
0.7.0 (2026-07-31)
Full Changelog: v0.6.1...v0.7.0
Features
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
X::TweetGetRepliesResponsewithdiagnosticandnested_replies.mode=completeandlimit; unifiedpage_sizedocs.EmbeddedTweet,SearchTweet,X::TweetDetail):article,card,community_note,edit, and richerTweetMedia.X::Accounts#createnow returnsX::AccountCreateResponse.promoted_content,tweet_volume, andurl.Migration
tickets,created_at,messages,public_id);statusis now an enum.statusis:active(Symbol); connection attempt variants renamed and discriminated bystatus.X::TweetAuthorrequiresfollowersandverified.ContentDisclosure::AIGenerated.can_edit,XGetArticleResponse::Author.can_dm, communityis_memberandrole.Written for commit 0e18e37. Summary will update on new commits.
Note
Release version 0.7.0 of the
x_twitter_scrapergemBumps
XTwitterScraper::VERSIONfrom0.6.1to0.7.0and 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
Bug Fixes