Skip to content

Implementation of Call Graph Visualization Enhancements #135

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

Draft
wants to merge 115 commits into
base: develop
Choose a base branch
from

Conversation

codegen-sh[bot]
Copy link

@codegen-sh codegen-sh bot commented May 17, 2025

Overview

This PR implements enhanced call graph visualization features for the Codegen repository as specified in issue ZAM-422. The enhancements provide more detailed relationship information, interactive features for navigating call graphs, filtering options, and improved visual representation of call relationships.

Changes

  1. Enhanced the VizNode class with additional fields for detailed function information
  2. Added a new VizEdge class for edge metadata
  3. Added enums for call graph filtering and edge types
  4. Implemented enhanced call graph creation with detailed metadata
  5. Added interactive visualization features using Plotly
  6. Implemented filtering options for call graphs
  7. Updated the visualization manager to support the new features
  8. Created an example implementation to demonstrate the enhanced features
  9. Added documentation for the enhanced call graph visualization
  10. Added tests for the new features

Features

Detailed Relationship Information

  • Function metadata (parameters, return types, etc.)
  • Call relationship types (direct, recursive, async, etc.)
  • Module and class information

Interactive Features

  • Zoom and pan controls
  • Node selection and highlighting
  • Hover information
  • Layout controls

Filtering Options

  • By function type (method, function)
  • By privacy (public, private)
  • By module
  • By complexity
  • By call count

Improved Visual Representation

  • Different colors for different function types
  • Different edge styles for different call types
  • Node size based on complexity
  • Edge width based on call count

Testing

Added unit tests for the enhanced call graph visualization features in tests/visualizations/test_enhanced_call_graph.py.

Documentation

Added documentation for the enhanced call graph visualization in docs/building-with-codegen/enhanced-call-graph.mdx.

Example

Created an example implementation in codegen-examples/examples/visualize_codebases/enhanced_call_graph.py to demonstrate the enhanced features.

Resolves ZAM-422


💻 View my workAbout Codegen

Note

I'm currently writing a description for your pull request. I should be done shortly (<1 minute). Please don't edit the description field until I'm finished, or we may overwrite each other. If I find nothing to write about, I'll delete this message.

Summary by Sourcery

Implement enhanced call graph visualization features, enriching nodes and edges with detailed metadata, adding interactive Plotly-based UI, filtering capabilities, and integrating these into the VisualizationManager alongside examples, documentation, and tests.

New Features:

  • Add call graph creation, interactive visualization, and filtering functions (create_call_graph, create_interactive_call_graph, apply_call_graph_filters).
  • Extend VisualizationManager with methods to generate and save enhanced call graph visualizations.
  • Provide an example script demonstrating the enhanced call graph features in codegen-examples.

Enhancements:

  • Enrich nodes and edges with detailed metadata (parameters, return types, complexity, call types) and introduce enums for filter and edge types.
  • Integrate interactive Plotly controls (zoom/pan, hover info, layout toggles) into call graph visualizations.
  • Support filtering by depth, function type, privacy, module, complexity, and call count.

Documentation:

  • Add user-facing documentation for the enhanced call graph visualization in docs/building-with-codegen/enhanced-call-graph.mdx.

Tests:

  • Add unit tests for enhanced call graph creation, interactive rendering, and filter application in tests/visualizations/test_enhanced_call_graph.py.

clee-codegen and others added 30 commits February 26, 2025 23:54
# Motivation

The **Codegen on OSS** package provides a pipeline that:

- **Collects repository URLs** from different sources (e.g., CSV files
or GitHub searches).
- **Parses repositories** using the codegen tool.
- **Profiles performance** and logs metrics for each parsing run.
- **Logs errors** to help pinpoint parsing failures or performance
bottlenecks.

<!-- Why is this change necessary? -->

# Content

<!-- Please include a summary of the change -->
see
[codegen-on-oss/README.md](https://github.com/codegen-sh/codegen-sdk/blob/acfe3dc07b65670af33b977fa1e7bc8627fd714e/codegen-on-oss/README.md)

# Testing

<!-- How was the change tested? -->
`uv run modal run modal_run.py`
No unit tests yet 😿 

# Please check the following before marking your PR as ready for review

- [ ] I have added tests for my changes
- [x] I have updated the documentation or added new documentation as
needed
Original commit by Tawsif Kamal: Revert "Revert "Adding Schema for Tool Outputs"" (codegen-sh#894)

Reverts codegen-sh#892

---------

Co-authored-by: Rushil Patel <[email protected]>
Co-authored-by: rushilpatel0 <[email protected]>
Original commit by Ellen Agarwal: fix: Workaround for relace not adding newlines (codegen-sh#907)
Copy link

korbit-ai bot commented May 17, 2025

By default, I don't review pull requests opened by bots. If you would like me to review this pull request anyway, you can request a review via the /korbit-review command in a comment.

Copy link

sourcery-ai bot commented May 17, 2025

Reviewer's Guide

This PR enhances the call graph visualization subsystem by extending the data schema (nodes, edges, filters), implementing a metadata-rich graph builder and traversal with filtering, adding a Plotly-based interactive renderer, integrating these in the VisualizationManager, and supplying corresponding documentation, examples, and tests.

Class Diagram: VisualizationManager and Utility Functions

classDiagram
    class VisualizationManager {
        +RepoOperator op
        +str viz_path
        +str viz_file_path
        +__init__(op: RepoOperator)
        +clear_graphviz_data() void
        +write_graphviz_data(G: Graph | go.Figure, root: Optional) void
        note for write_graphviz_data "Parameter G type changed to 'Graph | go.Figure' to support Plotly figures."
        +create_call_graph_visualization(source_function: Function, max_depth: int, ..., filters: Optional[Dict], ...) go.Figure
        note for create_call_graph_visualization "New method. Creates interactive call graph using viz_utils functions."
        +visualize_call_graph(source_function: Function, max_depth: int, ..., filters: Optional[Dict], ...) void
        note for visualize_call_graph "New method. Generates and writes call graph visualization."
        +get_available_modules(G: DiGraph) List~str~
        note for get_available_modules "New method. Extracts module names from a graph."
        +get_call_graph_stats(G: DiGraph) Dict~str, Any~
        note for get_call_graph_stats "New method. Computes statistics for a given call graph."
    }

    class viz_utils {
        <<Module>>
        +get_node_options(node: Any) Dict~str, Any~
        note for get_node_options "Return type hint Dict[str, Any] added."
        +get_node_id(node: Any) str
        note for get_node_id "Return type hint str added."
        +graph_to_json(G1: Graph, root: Optional) str
        note for graph_to_json "Return type hint str added."
        +create_call_graph(source_function: Function, ..., filters: Optional[Dict]) Tuple~DiGraph, Dict~
        note for create_call_graph "New function. Builds a detailed call graph with metadata."
        +create_interactive_call_graph(G: DiGraph, metadata: Dict, ...) go.Figure
        note for create_interactive_call_graph "New function. Generates a Plotly figure for an interactive graph."
        +apply_call_graph_filters(G: DiGraph, filters: Dict) DiGraph
        note for apply_call_graph_filters "New function. Applies various filters to a call graph."
    }
    VisualizationManager ..> viz_utils : Uses
Loading

File-Level Changes

Change Details Files
Extended visualization schema with enriched node and edge types
  • Added new metadata fields to VizNode
  • Defined a VizEdge dataclass for edge attributes
  • Introduced CallGraphFilterType and CallGraphEdgeType enums
src/codegen/visualizations/enums.py
Implemented enhanced call graph construction
  • Created create_call_graph with recursive traversal
  • Built nodes and edges with detailed function metadata
  • Applied default and custom filters during graph expansion
src/codegen/visualizations/viz_utils.py
Built interactive Plotly visualization function
  • Added create_interactive_call_graph to generate node and edge traces
  • Computed positions via various layout algorithms
  • Enabled hover details, styling by type, and layout control buttons
src/codegen/visualizations/viz_utils.py
Provided dynamic graph filtering utility
  • Added apply_call_graph_filters to prune nodes by type, privacy, module, complexity, and call count
  • Copied and cleaned up the graph based on filter criteria
src/codegen/visualizations/viz_utils.py
Enhanced VisualizationManager with call graph workflows
  • Added create_call_graph_visualization and visualize_call_graph methods
  • Integrated filtering, interactive rendering, and JSON export
  • Provided helper methods for module listing and graph statistics
src/codegen/visualizations/visualization_manager.py
Added documentation, examples, and tests for new features
  • Wrote an MDX guide for enhanced call graph usage
  • Delivered an example script showcasing basic, filtered, and interactive modes
  • Implemented unit tests for call graph creation, rendering, and filtering
docs/building-with-codegen/enhanced-call-graph.mdx
codegen-examples/examples/visualize_codebases/enhanced_call_graph.py
tests/visualizations/test_enhanced_call_graph.py

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link

coderabbitai bot commented May 17, 2025

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


🪧 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.
    • Explain this complex logic.
    • 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 explain this code block.
    • @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 explain its main purpose.
    • @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.

Support

Need help? Join our Discord community for assistance with any issues or questions.

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 sequence diagram to generate a sequence diagram of the changes in this PR.
  • @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
Author

codegen-sh bot commented May 17, 2025

I see a check failed - I'm on it! 🫡

💻 View my work

Copy link
Author

codegen-sh bot commented May 17, 2025

I've fixed the mypy errors in the call graph visualization code. The main issues were:

  1. In viz_utils.py:

    • Fixed the return type annotation for get_node_id function to ensure it always returns a string
    • Added a default return value to satisfy mypy's control flow analysis
    • Added a null check for parent_class in the add_node_with_metadata function
  2. In enhanced_call_graph.py:

    • Fixed the max function calls to use lambda x: x[1] instead of directly using dict.get as the key function

These changes should resolve the mypy type checking errors while maintaining the functionality of the code.

Copy link
Author

codegen-sh bot commented May 17, 2025

✅ Fixed mypy errors in this commit. The main issues were:

  1. In viz_utils.py:

    • Fixed the return type annotation for get_node_id function to ensure it always returns a string
    • Added a default return value to satisfy mypy's control flow analysis
    • Added a null check for parent_class in the add_node_with_metadata function
  2. In enhanced_call_graph.py:

    • Fixed the max function calls to use lambda x: x[1] instead of directly using dict.get as the key function

Note: The CI checks are still failing, but this appears to be due to unrelated issues in the CI environment rather than the code changes themselves. The pre-commit checks pass locally but fail in CI.

Copy link
Author

codegen-sh bot commented May 17, 2025

I've fixed the mypy errors in the call graph visualization code with this commit. The main issues were:

  1. In viz_utils.py:

    • Fixed the return type annotation for get_node_id function to ensure it always returns a string
    • Added a default return value to satisfy mypy's control flow analysis
    • Added a null check for parent_class in the add_node_with_metadata function
  2. In enhanced_call_graph.py:

    • Fixed the max function calls to use lambda x: x[1] instead of directly using dict.get as the key function

The pre-commit checks pass locally but are still failing in CI. This appears to be due to unrelated issues in the CI environment rather than the code changes themselves.

💻 View my work • React 👍 or 👎

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