Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add AccountLimitExceeded error #63

Merged
merged 4 commits into from
Jan 31, 2025
Merged

Add AccountLimitExceeded error #63

merged 4 commits into from
Jan 31, 2025

Conversation

glensc
Copy link
Owner

@glensc glensc commented Jan 28, 2025

@glensc glensc self-assigned this Jan 28, 2025
Copy link

coderabbitai bot commented Jan 28, 2025

Walkthrough

The pull request introduces a new exception class AccountLimitExceeded in the Trakt library's error handling module. This specialized exception is designed to handle HTTP status code 420, which indicates an account-specific limit has been exceeded. The new class extends the existing RateLimitException and provides a mechanism to retrieve account limit details from response headers. Additionally, the __all__ list is updated to include this new exception for easier import.

Changes

File Change Summary
trakt/errors.py Added AccountLimitExceeded exception class that extends RateLimitException, with HTTP status code 420 and a method to access account limit headers. Updated __all__ list to include the new exception.

Possibly related PRs

  • Fix: Add max retries to token refresh #60: The changes in this PR involve error handling in the TokenAuth class, which may relate to the new AccountLimitExceeded exception in the main PR as both deal with managing limits and errors in API interactions.
  • Fix: Set max retries to 1 #61: This PR modifies the MAX_RETRIES constant in the same TokenAuth class, which is relevant to the error handling context introduced by the AccountLimitExceeded exception in the main PR.

Poem

🐰 A rabbit's tale of limits tight,
Code 420 brings a warning's might!
Exceptions dance with headers clear,
Trakt's limits now are crystal near.
Hop along, dev, with knowledge bright! 🚦

✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
trakt/errors.py (1)

147-155: Good implementation, consider adding property documentation and error handling.

The implementation follows module patterns well and makes a good choice inheriting from RateLimitException. Consider these improvements:

  1. Add docstring for the account_limit property explaining the header's purpose and possible values
  2. Handle missing headers consistently with other properties
 class AccountLimitExceeded(RateLimitException):
     """TraktException type to be raised when a 420 return code is received"""
     http_code = 420
     message = 'Account Limit Exceeded - list count, item count, etc'

     @property
     def account_limit(self):
+        """Get the account limit details from response headers.
+        
+        Returns:
+            str|None: The value of x-account-limit header or None if not present
+        """
-        return self.response.headers.get("x-account-limit")
+        return self.response.headers.get("x-account-limit", None)
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 42b6ccc and 3b05e37.

📒 Files selected for processing (1)
  • trakt/errors.py (2 hunks)
🔇 Additional comments (2)
trakt/errors.py (2)

18-18: LGTM! Export of new exception class follows module patterns.

The addition to __all__ maintains alphabetical ordering and correctly exposes the new exception class.


147-155: Verify HTTP 420 status code in Trakt API documentation.

The implementation assumes HTTP 420 for account limits, but this isn't listed in the status codes comment at the top of the file (which references https://trakt.docs.apiary.io/#introduction/status-codes).

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (3)
trakt/errors.py (3)

18-18: Maintain consistent organization in __all__ list.

The new exception should be grouped with other HTTP status code exceptions to maintain the existing organization pattern.

Move the AccountLimitExceeded entry after the comment "# Exceptions by HTTP status code" to maintain consistency:

-    'AccountLimitExceeded',
     # Exceptions by HTTP status code
     # https://trakt.docs.apiary.io/#introduction/status-codes
+    'AccountLimitExceeded',
     'BadRequestException',

152-154: Consider handling missing headers.

The account_limit property should handle cases where the header is missing, similar to how the parent class's details property handles invalid JSON.

Consider adding a default value:

     @property
     def account_limit(self):
-        return self.response.headers.get("x-account-limit")
+        return self.response.headers.get("x-account-limit", None)

155-156: Remove extra blank line.

There's an unnecessary extra blank line before the next class definition.

     def account_limit(self):
         return self.response.headers.get("x-account-limit")

-

 class TraktInternalException(TraktException):
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3b05e37 and cf50333.

📒 Files selected for processing (1)
  • trakt/errors.py (2 hunks)
🔇 Additional comments (1)
trakt/errors.py (1)

147-154: LGTM! Well-structured exception class.

The implementation is clean and follows the module's patterns. Good choice inheriting from RateLimitException to reuse existing rate limit functionality.

@glensc glensc marked this pull request as ready for review January 28, 2025 12:58
@simonc56
Copy link
Collaborator

Tested successfully ✅

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
trakt/errors.py (1)

18-18: Reorder exceptions list by HTTP status codes.

The AccountLimitExceeded exception should be placed between LockedUserAccountException (423) and RateLimitException (429) to maintain the existing ordering by HTTP status codes.

     # Exceptions by HTTP status code
     # https://trakt.docs.apiary.io/#introduction/status-codes
-    'AccountLimitExceeded',
     'BadRequestException',
     'OAuthException',
     'ForbiddenException',
     'NotFoundException',
     'MethodNotAllowedException',
     'ConflictException',
     'ProcessException',
     'LockedUserAccountException',
+    'AccountLimitExceeded',
     'RateLimitException',
     'TraktInternalException',
     'TraktBadGateway',
     'TraktUnavailable',
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cf50333 and 17b3e9c.

📒 Files selected for processing (1)
  • trakt/errors.py (2 hunks)
🔇 Additional comments (1)
trakt/errors.py (1)

147-160: LGTM! Well-structured exception class.

The implementation is clean, well-documented, and follows the module's patterns. The class correctly inherits from RateLimitException and adds the account_limit property for accessing the response header.

@glensc glensc merged commit 811da1e into main Jan 31, 2025
9 checks passed
@glensc glensc deleted the err-420 branch January 31, 2025 07:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants