Logo

dev-resources.site

for different kinds of informations.

Collaborating to Slack as an Open-Source Developer: Part 2

Published at
11/20/2024
Categories
opensource
python
slack
slackapi
Author
htsagara
Categories
4 categories in total
opensource
open
python
open
slack
open
slackapi
open
Author
8 person written this
htsagara
open
Collaborating to Slack as an Open-Source Developer: Part 2

Recap of Part 1

In my first blog post, I shared my journey of contributing to the Slack SDK as an open-source developer. I tackled an issue related to ensuring the base URL for API requests had a trailing slash to simplify URL construction and prevent inconsistencies. If you haven’t read it yet, I recommend starting there to get the context for this follow-up.


A New Challenge Arises

After completing my first contribution, I was eager to tackle another issue in the same project. As I prepared to start, I noticed a problem in one of the authentication tests. The issue stemmed from the trailing slash feature I had previously implemented.

Here’s what happened: the base_url now always had a trailing slash appended during initialization. However, the api_method used in some test cases also started with a /. This combination caused a double slash (e.g., https://slack.com/api//auth.test), which broke some of the API requests.


Reporting the Issue

Realizing the significance of this bug, I quickly reported it to the maintainers and opened a new issue describing the problem. To ensure transparency and provide a clear solution path, I also submitted a pull request addressing the bug. However, the maintainers decided to revert my original merge to prevent disruptions in the main branch and asked me to submit a new PR with the necessary fixes and tests for edge cases.


The Fix and New Implementation

To address the problem, I reworked the _get_url function and added additional safeguards to prevent double slashes, even when both base_url and api_method contained trailing or leading slashes.

Here’s the updated implementation:

def _get_url(base_url: str, api_method: str) -> str:
    """Joins the base Slack URL and an API method to form an absolute URL.

    Args:
        base_url (str): The base URL (always ends with '/').
        api_method (str): The Slack Web API method. e.g., 'chat.postMessage'.

    Returns:
        str: The absolute API URL, e.g., 'https://slack.com/api/chat.postMessage'.
    """
    # Strip leading slash from api_method to prevent double slashes
    api_method = api_method.lstrip("/")
    return urljoin(base_url, api_method)
Enter fullscreen mode Exit fullscreen mode

Key adjustments

  1. Strip Leading Slash: By using .lstrip("/") on api_method, the function ensures no double slashes occur during concatenation.
  2. Test Case Enhancements: I expanded the test suite to cover scenarios such as:
    • base_url with and without a trailing slash.
    • api_method with and without a leading slash. Edge cases where both had slashes.

Here’s an example of the updated test:

def test_get_url_prevent_double_slash(self):
    api_url = _get_url("https://slack.com/api/", "/auth.test")
    self.assertEqual(api_url, "https://slack.com/api/auth.test", "Should prevent double slashes")

    api_url = _get_url("https://slack.com/api", "auth.test")
    self.assertEqual(api_url, "https://slack.com/api/auth.test", "Should handle base_url without trailing slash")

    api_url = _get_url("https://slack.com/api/", "auth.test")
    self.assertEqual(api_url, "https://slack.com/api/auth.test", "Should handle api_method without leading slash")

    api_url = _get_url("https://slack.com/api", "/auth.test")
    self.assertEqual(api_url, "https://slack.com/api/auth.test", "Should handle both inputs cleanly")
Enter fullscreen mode Exit fullscreen mode

Reflections on Testing and Edge Cases

This experience taught me the importance of thorough testing. Even though my original implementation passed all existing tests, it didn’t account for certain edge cases, such as leading slashes in api_method.

Here are my key takeaways:

1. Unit Tests Aren’t Foolproof: While unit tests help catch many issues, they might not cover all edge cases. A feature can still have loose ends, especially if the inputs vary widely.
2. Collaborate and Communicate: Reporting bugs promptly and discussing solutions with maintainers can prevent larger disruptions. Their decision to revert my changes emphasized the importance of keeping the main branch stable.
3. Iterate and Learn: Open-source contributions are iterative. Each step is an opportunity to improve, learn from feedback, and strengthen your coding practices.


Final Thoughts

Contributing to Slack’s SDK has been an invaluable experience. This journey, from implementing a new feature to resolving its unintended side effects, highlighted the complexities of real-world software development and the collaborative spirit of open source.

If you’re considering contributing to an open-source project, don’t let the fear of making mistakes hold you back. Every bug, every fix, and every test written is a step toward becoming a better developer.

What challenges have you faced in your open-source contributions? Let’s discuss in the comments below!

slack Article's
30 articles in total
Favicon
Open-Source Collaboration Progress
Favicon
Collaborating to Slack as an Open-Source Developer: Part 2
Favicon
Collaborating to Slack as an Open-Source Developer
Favicon
How to integrate Alerta into your Business
Favicon
[Apache Superset] Topic #5, Automated Alerts and Reporting via Slack/Email in Superset
Favicon
How to send a message to Slack workspace members using an SQL statement
Favicon
Enable Slack Notifications for Amplify Builds Directly to a Slack Channel
Favicon
How to use Slack for Beginners.
Favicon
How to make Slack Workflow input form
Favicon
Magento 2 Slack Notifier Module
Favicon
We Built our First SaaS - Sweet Kudos
Favicon
How to Customize Slack Fonts Using Stylus for Improved Readability
Favicon
10 Slack emojis that developers should use
Favicon
Format your Slack messages, please!
Favicon
ChatGPT Slack Bot
Favicon
Effortless Bug Tracking: Pcloudy’s Integration with Asana and Monday.com
Favicon
AI-Powered News Summaries for Slack
Favicon
Enhancing Decision-Making: AI In Microsoft Teams & Slack
Favicon
Slack vs. Discord: Choosing Your Tech Community's Playground
Favicon
Laravel 10 Send Notifications in Slack Channel
Favicon
Build a Slack app with SlackKit
Favicon
Automatically create Google Tasks from Slack/Cisco Webex Teams keywords with webMethods.io Integration
Favicon
How can you become an AWS Community Builder?
Favicon
Automate PagerDuty alerts in Slack/Cisco Webex Teams with webMethods.io Integration
Favicon
I developed a no-code tool that integrates Anthropic into Slack, Teams, and HubSpot
Favicon
"Community Communication: Slack vs. Discord - Deciding the Ideal Platform"
Favicon
Easier TypeScript API Testing with Vitest + MSW
Favicon
Further Tips on Slack's files.upload Deprecation
Favicon
New on Zeeve: Slack & Microsoft Teams Integration for Streamlined Deployment Alerts
Favicon
Rapid Bolt app development w/ Slack CLI and sandboxes

Featured ones: