Skip to content

Fix: simplify parsing of Apprise config in AppriseHook #53441

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

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

mrohith3693
Copy link

Simplify Parsing of apprise_default Connection ID in AppriseHook

This PR improves the robustness of AppriseHook.get_config_from_conn() to correctly handle cases where the config field is either:

  • A valid JSON string (escaped), or
  • A parsed Python dictionary (via environment variable like AIRFLOW_CONN_APPRISE_DEFAULT)

Problem

Currently, if the connection extra field already contains a dictionary (not a string), Airflow raises:

TypeError: the JSON object must be str, bytes or bytearray, not dict

This happens because the method always calls json.loads() on the config field without checking its type. This fails when config is already a dictionary (e.g., injected via env vars in Docker).

✅ What This PR Changes

  • Updates get_config_from_conn() to:
    • Return the config directly if it's already a dictionary.
    • Otherwise, parse it using json.loads() if it's a string.
  • Maintains backward compatibility with escaped JSON strings.
  • Adds robust unit tests to validate both scenarios.
  • Ensures better developer experience when using environment-based Airflow connections.

🧪 How It Was Tested

  • Added a failing unit test (test_get_config_from_conn_with_dict_should_fail) to reproduce the bug.
  • Applied the fix and verified the test passes.
  • Confirmed that other existing test cases still pass.
  • Verified the functionality with both types of config input:
    • JSON string
    • Direct Python dictionary

🔍 Context

  • Airflow Version: 2.8.1
  • Apprise Provider: 1.2.1
  • Deployment: Docker-Compose (Ubuntu 20.04.6 LTS)
  • Related issue: Parsing fails if quotes not escaped or config is dict

📌 Why This Matters

This change allows developers to use intuitive and clean environment variable formats when configuring Apprise connections. It removes the need to escape quotes manually in JSON strings and makes the hook more robust to varying input formats.

🧼 Clean-up

Also removed some duplicate imports and cleaned up unused variables in tests to align with Airflow's style guide.


^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in airflow-core/newsfragments.

Copy link

boring-cyborg bot commented Jul 17, 2025

Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide (https://github.com/apache/airflow/blob/main/contributing-docs/README.rst)
Here are some useful points:

  • Pay attention to the quality of your code (ruff, mypy and type annotations). Our pre-commits will help you with that.
  • In case of a new feature add useful documentation (in docstrings or in docs/ directory). Adding a new operator? Check this short guide Consider adding an example DAG that shows how users should use it.
  • Consider using Breeze environment for testing locally, it's a heavy docker but it ships with a working Airflow and a lot of integrations.
  • Be patient and persistent. It might take some time to get a review or get the final approval from Committers.
  • Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.
  • Be sure to read the Airflow Coding style.
  • Always keep your Pull Requests rebased, otherwise your build might fail due to changes not related to your commits.
    Apache Airflow is a community-driven project and together we are making it better 🚀.
    In case of doubts contact the developers at:
    Mailing List: [email protected]
    Slack: https://s.apache.org/airflow-slack

@boring-cyborg boring-cyborg bot added area:dev-tools backport-to-v3-0-test Mark PR with this label to backport to v3-0-test branch labels Jul 17, 2025
@mrohith3693
Copy link
Author

Hi 👋 This PR fixes a TypeError in AppriseHook.get_config_from_conn() caused when the Apprise connection's config is already a dictionary (e.g. from env vars like AIRFLOW_CONN_APPRISE_DEFAULT). It now supports both string and dict types.

Let me know if anything else is needed! Thanks for reviewing 

# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
Copy link
Contributor

Choose a reason for hiding this comment

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

Why did you remove the license headers?

Copy link
Author

Choose a reason for hiding this comment

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

Thank you for pointing that out. The license header was removed
unintentionally during a merge conflict. I’ve now restored it in the test
file. Please let me know if anything else is needed.

@mrohith3693 mrohith3693 force-pushed the fix/apprise-config-parsing branch from 031c09a to e3f1f54 Compare July 17, 2025 10:17
@mrohith3693
Copy link
Author

mrohith3693 commented Jul 17, 2025 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:dev-tools backport-to-v3-0-test Mark PR with this label to backport to v3-0-test branch
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants