ComposioHQ / composio

Composio equip's your AI agents & LLMs with 100+ high-quality integrations via function calling
https://docs.composio.dev
Other
7.48k stars 2.33k forks source link

Pass scope for oauth #347

Closed kaavee315 closed 1 month ago

kaavee315 commented 1 month ago

PR Type

Enhancement


Description


Changes walkthrough ๐Ÿ“

Relevant files
Enhancement
add.py
Add support for OAuth scopes in integration functions       

python/composio/cli/add.py
  • Added scopes parameter to add_integration and _handle_oauth functions.
  • Updated _handle_oauth to pass scopes to _get_auth_config.
  • +3/-0     

    ๐Ÿ’ก PR-Agent usage: Comment /help on the PR to get a list of all available PR-Agent tools and their descriptions

    codiumai-pr-agent-pro[bot] commented 1 month ago

    PR Reviewer Guide ๐Ÿ”

    โฑ๏ธ Estimated effort to review: 2 ๐Ÿ”ต๐Ÿ”ตโšชโšชโšช
    ๐Ÿงช No relevant tests
    ๐Ÿ”’ No security concerns identified
    โšก Key issues to review

    Type Consistency
    Ensure that the `scopes` parameter type is consistently handled across functions. The `_handle_oauth` function defines `scopes` as an optional tuple of strings, but it's unclear how this type is expected or handled in the `add_integration` function and `_get_auth_config`.
    codiumai-pr-agent-pro[bot] commented 1 month ago

    PR Code Suggestions โœจ

    CategorySuggestion                                                                                                                                    Score
    Security
    Add validation for the 'scopes' parameter to enhance security ___ **Ensure that the scopes parameter is properly validated or sanitized before it is
    used to prevent potential security vulnerabilities such as injection attacks.
    Consider adding a validation function that checks the format and legitimacy of the
    provided scopes.** [python/composio/cli/add.py [243]](https://github.com/ComposioHQ/composio/pull/347/files#diff-81ec0bffc6a41cf112d6e13aaf2faba926086272436c26d342ad4e05de75cf24R243-R243) ```diff -scopes=scopes, +scopes=validate_scopes(scopes), ``` - [ ] **Apply this suggestion**
    Suggestion importance[1-10]: 9 Why: Adding validation for the 'scopes' parameter is crucial for preventing potential security vulnerabilities such as injection attacks. This suggestion addresses a significant security concern.
    9
    Possible issue
    Handle potential None value for 'scopes' in '_get_auth_config' ___ **It's recommended to handle the case where scopes might be None in the
    _get_auth_config function. This can prevent the function from failing if no scopes
    are provided. Consider implementing a default value or a conditional check within
    the function.** [python/composio/cli/add.py [275]](https://github.com/ComposioHQ/composio/pull/347/files#diff-81ec0bffc6a41cf112d6e13aaf2faba926086272436c26d342ad4e05de75cf24R275-R275) ```diff -auth_config=_get_auth_config(scopes=scopes), +auth_config=_get_auth_config(scopes=scopes if scopes is not None else default_scopes), ``` - [ ] **Apply this suggestion**
    Suggestion importance[1-10]: 8 Why: Handling the case where 'scopes' might be None prevents potential runtime errors and improves the robustness of the code. This is a good practice for ensuring the function handles all possible input scenarios.
    8
    Documentation
    Update the docstring to include the 'scopes' parameter ___ **Since the scopes parameter is now part of the function signature, update the
    docstring of _handle_oauth to include this parameter. This helps maintain accurate
    documentation and assists other developers in understanding the function's
    requirements.** [python/composio/cli/add.py [270]](https://github.com/ComposioHQ/composio/pull/347/files#diff-81ec0bffc6a41cf112d6e13aaf2faba926086272436c26d342ad4e05de75cf24R270-R270) ```diff -"""Handle basic auth.""" +"""Handle basic auth. +Args: + app_name (str): Name of the app. + no_browser (bool): Flag to prevent opening the browser automatically. + integration (Optional[IntegrationModel]): Integration model instance. + scopes (Optional[Tuple[str, ...]]): OAuth scopes required for the connection. +""" + ```
    Suggestion importance[1-10]: 7 Why: Updating the docstring to include the 'scopes' parameter helps maintain accurate documentation and assists other developers in understanding the function's requirements. This is important for code maintainability and clarity.
    7
    Maintainability
    Use a more descriptive variable name for 'scopes' ___ **To improve code readability and maintainability, consider using a more descriptive
    variable name than scopes. A name like oauth_scopes would provide more context about
    the type of scopes being handled.** [python/composio/cli/add.py [268]](https://github.com/ComposioHQ/composio/pull/347/files#diff-81ec0bffc6a41cf112d6e13aaf2faba926086272436c26d342ad4e05de75cf24R268-R268) ```diff -scopes: t.Optional[t.Tuple[str, ...]] = None, +oauth_scopes: t.Optional[t.Tuple[str, ...]] = None, ```
    Suggestion importance[1-10]: 6 Why: Using a more descriptive variable name like 'oauth_scopes' improves code readability and maintainability. However, this is a minor improvement compared to functional or security-related changes.
    6
    codiumai-pr-agent-pro[bot] commented 1 month ago

    CI Failure Feedback ๐Ÿง

    (Checks updated until commit https://github.com/ComposioHQ/composio/commit/44672f8f2545b565da24eda2b25eb3c83f3b7834)

    **Action:** test (ubuntu-latest, 3.11)
    **Failed stage:** [Unittests](https://github.com/ComposioHQ/composio/actions/runs/10018230459/job/27693380599) [โŒ]
    **Failed test name:** test_action_enum
    **Failure summary:** The action failed because the test test_action_enum in the file tests/test_client/test_enum.py
    encountered a ValueError.
  • The error message was: "Invalid value GITHUB_ISSUES_LIST for Action".
  • This indicates that the value GITHUB_ISSUES_LIST is not a valid entry for the Action enum.
  • Relevant error logs: ```yaml 1: ##[group]Operating System 2: Ubuntu ... 506: * [new branch] fix/readme -> origin/fix/readme 507: * [new branch] fix/readme-logo -> origin/fix/readme-logo 508: * [new branch] fix/swe-agent -> origin/fix/swe-agent 509: * [new branch] ft-add-better-help-text -> origin/ft-add-better-help-text 510: * [new branch] ft-apps-id -> origin/ft-apps-id 511: * [new branch] ft-bring-back-core-sdk -> origin/ft-bring-back-core-sdk 512: * [new branch] ft-custom-base-url-js-sdk -> origin/ft-custom-base-url-js-sdk 513: * [new branch] ft-did-you-mean -> origin/ft-did-you-mean 514: * [new branch] ft-error-tracking -> origin/ft-error-tracking ... 929: tests/test_cli/test_actions.py::TestListActions::test_list_all[arguments3-exptected_outputs3-unexptected_outputs3] PASSED [ 17%] 930: tests/test_cli/test_actions.py::TestListActions::test_tag_not_found PASSED [ 19%] 931: tests/test_cli/test_actions.py::TestListActions::test_limit SKIPPED [ 21%] 932: tests/test_cli/test_actions.py::TestListActions::test_copy PASSED [ 23%] 933: tests/test_cli/test_add.py::TestComposioAdd::test_no_auth PASSED [ 25%] 934: tests/test_cli/test_apps.py::TestList::test_list PASSED [ 27%] 935: tests/test_cli/test_apps.py::TestUpdate::test_update_not_required PASSED [ 29%] 936: tests/test_cli/test_apps.py::TestUpdate::test_update SKIPPED (Needs 937: investigation, this test fails in CI) [ 31%] ... 945: tests/test_client/test_client.py::test_raise_invalid_api_key PASSED [ 48%] 946: tests/test_client/test_collections.py::TestTriggerNamesSerialization::test_converts_trigger_objects_to_comma_separated_string PASSED [ 51%] 947: tests/test_client/test_collections.py::TestTriggerNamesSerialization::test_converts_trigger_strings_to_comma_separated_string PASSED [ 53%] 948: tests/test_client/test_collections.py::TestTriggerNamesSerialization::test_converts_mix_of_trigger_objects_and_strings PASSED [ 55%] 949: tests/test_client/test_collections.py::test_trigger_subscription PASSED [ 57%] 950: tests/test_client/test_endpoints.py::test_endpoint PASSED [ 59%] 951: tests/test_client/test_enum.py::test_tag_enum PASSED [ 61%] 952: tests/test_client/test_enum.py::test_app_enum PASSED [ 63%] 953: tests/test_client/test_enum.py::test_action_enum FAILED [ 65%] ... 962: tests/test_tools/test_local/test_workspace.py::test_stderr PASSED [ 85%] 963: tests/test_tools/test_local/test_workspace.py::test_workspace PASSED [ 87%] 964: tests/test_utils/test_decorators.py::test_deprecated PASSED [ 89%] 965: tests/test_utils/test_git.py::test_get_git_user_info PASSED [ 91%] 966: tests/test_utils/test_shared.py::test_get_pydantic_signature_format_from_schema_params PASSED [ 93%] 967: tests/test_utils/test_shared.py::test_json_schema_to_pydantic_field PASSED [ 95%] 968: tests/test_utils/test_shared.py::test_json_schema_to_fields_dict PASSED [ 97%] 969: tests/test_utils/test_url.py::test_get_web_url PASSED [100%] 970: =================================== FAILURES =================================== ... 980: self = 981: value = 'GITHUB_ISSUES_LIST' 982: def __init__(self, value: t.Union[str, te.Self]) -> None: 983: """Create an Enum""" 984: if isinstance(value, _AnnotatedEnum): 985: value = value._slug 986: value = t.cast(str, value).upper() 987: if value not in self.__annotations__ and value not in _runtime_actions: 988: > raise ValueError(f"Invalid value `{value}` for `{self.__class__.__name__}`") 989: E ValueError: Invalid value `GITHUB_ISSUES_LIST` for `Action` 990: composio/client/enums/base.py:112: ValueError 991: =============================== warnings summary =============================== 992: composio/client/http.py:20 993: /home/runner/work/composio/composio/python/composio/client/http.py:20: DeprecationWarning: Inheritance class AsyncHttpClient from ClientSession is discouraged 994: class AsyncHttpClient(AsyncSession, logging.WithLogger): 995: .tox/unittests/lib/python3.11/site-packages/pydantic/_internal/_config.py:291 996: .tox/unittests/lib/python3.11/site-packages/pydantic/_internal/_config.py:291 997: /home/runner/work/composio/composio/python/.tox/unittests/lib/python3.11/site-packages/pydantic/_internal/_config.py:291: PydanticDeprecatedSince20: Support for class-based `config` is deprecated, use ConfigDict instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.8/migration/ ... 1187: composio/utils/shared.py 118 84 29% 44, 47-51, 54-58, 61-77, 83, 101-104, 153-158, 174-221, 247-293 1188: composio/utils/url.py 10 1 90% 35 1189: examples/crewai_ci_chart.py 15 15 0% 1-38 1190: -------------------------------------------------------------------------------------------------------------- 1191: TOTAL 9934 2267 77% 1192: Coverage HTML written to dir htmlcov 1193: Coverage XML written to file coverage.xml 1194: =========================== short test summary info ============================ 1195: FAILED tests/test_client/test_enum.py::test_action_enum - ValueError: Invalid value `GITHUB_ISSUES_LIST` for `Action` 1196: ============= 1 failed, 41 passed, 5 skipped, 3 warnings in 40.73s ============= 1197: unittests: exit 1 (41.63 seconds) /home/runner/work/composio/composio/python> pytest -vvv -rfE --doctest-modules composio/ tests/ --cov=composio --cov=examples --cov-report=html --cov-report=xml --cov-report=term --cov-report=term-missing --cov-config=.coveragerc pid=5630 1198: .pkg: _exit> python /opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__ 1199: unittests: FAIL code 1 (89.95=setup[42.64]+cmd[5.68,41.63] seconds) 1200: evaluation failed :( (90.02 seconds) 1201: ##[error]Process completed with exit code 1. ```

    โœจ CI feedback usage guide:
    The CI feedback tool (`/checks)` automatically triggers when a PR has a failed check. The tool analyzes the failed checks and provides several feedbacks: - Failed stage - Failed test name - Failure summary - Relevant error logs In addition to being automatically triggered, the tool can also be invoked manually by commenting on a PR: ``` /checks "https://github.com/{repo_name}/actions/runs/{run_number}/job/{job_number}" ``` where `{repo_name}` is the name of the repository, `{run_number}` is the run number of the failed check, and `{job_number}` is the job number of the failed check. #### Configuration options - `enable_auto_checks_feedback` - if set to true, the tool will automatically provide feedback when a check is failed. Default is true. - `excluded_checks_list` - a list of checks to exclude from the feedback, for example: ["check1", "check2"]. Default is an empty list. - `enable_help_text` - if set to true, the tool will provide a help message with the feedback. Default is true. - `persistent_comment` - if set to true, the tool will overwrite a previous checks comment with the new feedback. Default is true. - `final_update_message` - if `persistent_comment` is true and updating a previous checks message, the tool will also create a new message: "Persistent checks updated to latest commit". Default is true. See more information about the `checks` tool in the [docs](https://pr-agent-docs.codium.ai/tools/ci_feedback/).