Skip to content

docs/pyumya guides and deploy workflow - #19

Merged
wolfiesch merged 3 commits into
masterfrom
docs/pyumya-guides-and-deploy-workflow
Feb 14, 2026
Merged

docs/pyumya guides and deploy workflow#19
wolfiesch merged 3 commits into
masterfrom
docs/pyumya-guides-and-deploy-workflow

Conversation

@wolfiesch

@wolfiesch wolfiesch commented Feb 14, 2026

Copy link
Copy Markdown
Collaborator
  • chore(ci): fix vercel deploy invocation and trigger on deploy/index.html
  • docs(pyumya): add guides and improve mkdocs navigation

Greptile Overview

Greptile Summary

This PR makes two changes: (1) fixes the Vercel deploy workflow by switching from vercel deploy deploy/ to vercel deploy --cwd deploy and adding deploy/index.html as a trigger path, and (2) adds seven new pyumya documentation guides covering Phase 1 features (merged cells, comments, hyperlinks, freeze panes, images, data validation, conditional formatting) along with mkdocs navigation improvements (minify plugin, emoji support, social links, restructured nav).

  • CI fix: The --cwd flag is the correct way to specify the deploy directory for newer Vercel CLI versions. Adding deploy/index.html to trigger paths ensures manual dashboard edits also trigger deployment.
  • Docs guides: All seven guides follow a consistent structure (reading, writing, reference table, tips/notes) and align with the Phase 1 features listed in index.md and limitations.md.
  • mkdocs.yml: Navigation restructured into Home / Getting Started / Guides / Reference sections. New plugins and extensions added (minify, emoji, attr_list, md_in_html). The mkdocs-minify-plugin dependency is already declared in pyproject.toml.
  • Minor issue: index.md is referenced twice in the nav (as "Home" and as "Getting Started > Installation"), creating a redundant navigation entry.

Confidence Score: 4/5

  • This PR is safe to merge — it only adds documentation files and a minor CI fix with no production code changes.
  • Score of 4 reflects that the changes are low-risk (docs + CI config only) with one minor navigation issue (duplicate index.md in mkdocs nav). The CI fix is correct and the guide content is well-structured. Deducted one point for the duplicate nav entry which will produce build warnings.
  • docs/pyumya/mkdocs.yml has a duplicate index.md reference in the nav section that should be addressed.

Important Files Changed

Filename Overview
.github/workflows/deploy-dashboard.yml Adds deploy/index.html to trigger paths and fixes Vercel CLI invocation from vercel deploy deploy/ to vercel deploy --cwd deploy. Both changes are correct.
docs/pyumya/mkdocs.yml Adds navigation features, plugins (minify, emoji), social links, and restructured nav. Has duplicate index.md reference in nav (Home and Getting Started > Installation point to same page).
docs/pyumya/docs/guides/merged-cells.md New guide for merged cells feature. Well-structured with read/write examples and edge cases documentation.
docs/pyumya/docs/guides/comments.md New guide for cell comments. Clean examples for reading and writing comments with best practices.
docs/pyumya/docs/guides/hyperlinks.md New guide for hyperlinks covering web URLs, email, internal references, and file links. Clear examples and type reference table.
docs/pyumya/docs/guides/freeze-panes.md New guide for freeze panes. Includes common patterns table mapping settings to Excel equivalents.
docs/pyumya/docs/guides/images.md New guide for embedding images. Covers supported formats, positioning notes, and best practices.
docs/pyumya/docs/guides/data-validation.md New guide for data validation. Covers dropdown lists, numeric constraints, date ranges, and operator reference.
docs/pyumya/docs/guides/conditional-formatting.md New guide for conditional formatting. Covers cell value rules, color scales, data bars with rule type reference table.

Flowchart

flowchart TD
    A["mkdocs.yml nav"] --> B["Home\n(index.md)"]
    A --> C["Getting Started"]
    C --> D["Installation\n(index.md) ⚠️ duplicate"]
    A --> E["Guides"]
    E --> F["Merged Cells"]
    E --> G["Comments"]
    E --> H["Hyperlinks"]
    E --> I["Freeze Panes"]
    E --> J["Images"]
    E --> K["Data Validation"]
    E --> L["Conditional Formatting"]
    A --> M["Reference"]
    M --> N["API Reference"]
    M --> O["Limitations"]

    style D fill:#fff3cd,stroke:#ffc107
Loading

Last reviewed commit: 4c486e8

Copilot AI review requested due to automatic review settings February 14, 2026 10:29
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @wolfiesch, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request substantially enhances the pyumya documentation by introducing detailed guides for various Excel functionalities, making it easier for users to understand and implement features like comments, conditional formatting, and data validation. Concurrently, the MkDocs site's structure and presentation have been refined for improved navigability and content display, alongside a critical fix to the continuous integration deployment process.

Highlights

  • Documentation Expansion: Comprehensive new guides have been added for pyumya, covering advanced Excel features such as cell comments, conditional formatting, data validation, freeze panes, hyperlinks, images, and merged cells.
  • MkDocs Configuration Update: The MkDocs navigation and theme settings have been significantly improved to integrate the new guides, enhance user experience, and enable additional Markdown extensions for richer content rendering.
  • CI Workflow Fix: The Vercel deployment invocation and trigger mechanism have been fixed to ensure correct deployment upon changes to deploy/index.html.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • docs/pyumya/docs/guides/comments.md
    • Added a new guide detailing how to read and write cell comments in Excel workbooks using pyumya.
  • docs/pyumya/docs/guides/conditional-formatting.md
    • Added a new guide explaining how to apply and read conditional formatting rules in Excel.
  • docs/pyumya/docs/guides/data-validation.md
    • Added a new guide covering the implementation of data validation rules, including dropdown lists and numeric constraints.
  • docs/pyumya/docs/guides/freeze-panes.md
    • Added a new guide on how to set and read freeze pane settings in Excel.
  • docs/pyumya/docs/guides/hyperlinks.md
    • Added a new guide demonstrating how to add and read hyperlinks within Excel cells.
  • docs/pyumya/docs/guides/images.md
    • Added a new guide for embedding and reading images in Excel worksheets.
  • docs/pyumya/docs/guides/merged-cells.md
    • Added a new guide explaining how to merge and unmerge cell ranges in Excel.
  • docs/pyumya/mkdocs.yml
    • Updated the MkDocs configuration to include the newly added guides in the navigation.
    • Enabled additional theme features like navigation.top and navigation.indexes.
    • Integrated new Markdown extensions such as pymdownx.emoji, attr_list, and md_in_html for improved content rendering.
    • Added social links for GitHub.
Ignored Files
  • Ignored by pattern: .github/workflows/** (1)
    • .github/workflows/deploy-dashboard.yml
Activity
  • No specific activity (comments, reviews, etc.) was provided in the context.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request significantly expands the documentation by adding several guides for pyumya features and improving the mkdocs configuration. The new guides are well-written and provide useful examples. My review focuses on improving the clarity and usability of the code examples in the new guides and refining the site navigation structure for a better user experience.

Comment on lines +18 to +81
## Writing Conditional Formats

### Cell Value Rules

```python
book = UmyaBook()
book.add_sheet("Sales")

# Highlight cells greater than 1000
book.add_conditional_format("Sales", {
"ranges": ["B2:B50"],
"type": "cellIs",
"operator": "greaterThan",
"formula": "1000",
"format": {"bg_color": "#C6EFCE", "font_color": "#006100"}, # green
})

# Highlight cells below target
book.add_conditional_format("Sales", {
"ranges": ["B2:B50"],
"type": "cellIs",
"operator": "lessThan",
"formula": "500",
"format": {"bg_color": "#FFC7CE", "font_color": "#9C0006"}, # red
})

book.save("output.xlsx")
```

### Color Scales

```python
# 2-color scale (red to green)
book.add_conditional_format("Sales", {
"ranges": ["C2:C50"],
"type": "colorScale",
"color_scale": {
"min_color": "#FF0000",
"max_color": "#00FF00",
},
})

# 3-color scale (red / yellow / green)
book.add_conditional_format("Sales", {
"ranges": ["D2:D50"],
"type": "colorScale",
"color_scale": {
"min_color": "#FF0000",
"mid_color": "#FFFF00",
"max_color": "#00FF00",
},
})
```

### Data Bars

```python
book.add_conditional_format("Sales", {
"ranges": ["E2:E50"],
"type": "dataBar",
"data_bar": {"color": "#638EC6"},
})
```

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The code examples under "Writing Conditional Formats" are structured in a way that could be confusing. The first example is a complete, runnable script that ends with book.save(), but the following examples for "Color Scales" and "Data Bars" are snippets that would fail if run independently. Given that UmyaBook.save() can only be called once per instance, this structure is misleading.

To improve clarity and user experience, I suggest combining all writing examples into a single, complete code block. This would demonstrate how to add multiple types of formatting in one go and ensure the code is copy-paste friendly. The subheadings for different rule types can be converted into comments within the code block for clarity.

## Writing Conditional Formats

The following is a complete example showing how to add various conditional formatting rules to a worksheet.

```python
from excelbench_rust import UmyaBook

book = UmyaBook()
book.add_sheet("Sales")

# --- Cell Value Rules ---
# Highlight cells greater than 1000
book.add_conditional_format("Sales", {
    "ranges": ["B2:B50"],
    "type": "cellIs",
    "operator": "greaterThan",
    "formula": "1000",
    "format": {"bg_color": "#C6EFCE", "font_color": "#006100"},  # green
})

# Highlight cells below target
book.add_conditional_format("Sales", {
    "ranges": ["B2:B50"],
    "type": "cellIs",
    "operator": "lessThan",
    "formula": "500",
    "format": {"bg_color": "#FFC7CE", "font_color": "#9C0006"},  # red
})


# --- Color Scales ---
# 2-color scale (red to green)
book.add_conditional_format("Sales", {
    "ranges": ["C2:C50"],
    "type": "colorScale",
    "color_scale": {
        "min_color": "#FF0000",
        "max_color": "#00FF00",
    },
})

# 3-color scale (red / yellow / green)
book.add_conditional_format("Sales", {
    "ranges": ["D2:D50"],
    "type": "colorScale",
    "color_scale": {
        "min_color": "#FF0000",
        "mid_color": "#FFFF00",
        "max_color": "#00FF00",
    },
})


# --- Data Bars ---
book.add_conditional_format("Sales", {
    "ranges": ["E2:E50"],
    "type": "dataBar",
    "data_bar": {"color": "#638EC6"},
})

book.save("output.xlsx")

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Good call. Updated the guide to use a single runnable write example (single save) and aligned the payload/keys to the actual UmyaBook API. Fixed in 4c54a1d.

Comment on lines +18 to +63
## Writing Validations

### Dropdown List

```python
book = UmyaBook()
book.add_sheet("Form")

# Create a dropdown list
book.add_data_validation("Form", {
"ranges": ["B2:B100"],
"type": "list",
"formula1": "Option A,Option B,Option C",
"show_dropdown": True,
})

book.save("output.xlsx")
```

### Numeric Constraints

```python
# Whole number between 1 and 100
book.add_data_validation("Form", {
"ranges": ["C2:C50"],
"type": "whole",
"operator": "between",
"formula1": "1",
"formula2": "100",
"error_title": "Invalid Input",
"error_message": "Enter a number between 1 and 100",
})
```

### Date Range

```python
# Dates in 2026 only
book.add_data_validation("Form", {
"ranges": ["D2:D50"],
"type": "date",
"operator": "between",
"formula1": "2026-01-01",
"formula2": "2026-12-31",
})
```

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The code examples under "Writing Validations" could be more user-friendly. The first example for "Dropdown List" is a complete script with book.save(), but the subsequent "Numeric Constraints" and "Date Range" examples are incomplete snippets. This is confusing because UmyaBook.save() can only be called once.

I recommend combining these into a single, runnable code block to show how multiple validations can be added to a sheet before saving. This makes the documentation clearer and easier for users to follow.

## Writing Validations

The following is a complete example showing how to add various data validation rules to a worksheet.

```python
from excelbench_rust import UmyaBook

book = UmyaBook()
book.add_sheet("Form")

# --- Dropdown List ---
book.add_data_validation("Form", {
    "ranges": ["B2:B100"],
    "type": "list",
    "formula1": "Option A,Option B,Option C",
    "show_dropdown": True,
})

# --- Numeric Constraints ---
# Whole number between 1 and 100
book.add_data_validation("Form", {
    "ranges": ["C2:C50"],
    "type": "whole",
    "operator": "between",
    "formula1": "1",
    "formula2": "100",
    "error_title": "Invalid Input",
    "error_message": "Enter a number between 1 and 100",
})

# --- Date Range ---
# Dates in 2026 only
book.add_data_validation("Form", {
    "ranges": ["D2:D50"],
    "type": "date",
    "operator": "between",
    "formula1": "2026-01-01",
    "formula2": "2026-12-31",
})

book.save("output.xlsx")

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Agreed. Combined the write examples into one runnable block (single save) and updated to the binding's dict keys. Fixed in 4c54a1d.

Comment thread docs/pyumya/docs/guides/freeze-panes.md Outdated
Comment on lines +21 to +28
# Freeze top row (headers stay visible)
book.set_freeze_panes("Data", {"row": 1, "column": 0})

# Freeze first column
book.set_freeze_panes("Data", {"row": 0, "column": 1})

# Freeze both (top-left corner stays fixed)
book.set_freeze_panes("Data", {"row": 1, "column": 1})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The code example for writing freeze panes is a bit misleading. It shows three consecutive calls to set_freeze_panes for the same sheet. Since each call will overwrite the previous one, only the last setting ({"row": 1, "column": 1}) will be applied when the workbook is saved.

To make it clear that these are alternative options, I suggest commenting out the first two examples and leaving the last one active. This shows the user different possibilities while providing a runnable example.

Suggested change
# Freeze top row (headers stay visible)
book.set_freeze_panes("Data", {"row": 1, "column": 0})
# Freeze first column
book.set_freeze_panes("Data", {"row": 0, "column": 1})
# Freeze both (top-left corner stays fixed)
book.set_freeze_panes("Data", {"row": 1, "column": 1})
# To freeze the top row (headers stay visible):
# book.set_freeze_panes("Data", {"row": 1, "column": 0})
# To freeze the first column:
# book.set_freeze_panes("Data", {"row": 0, "column": 1})
# To freeze both (top-left corner stays fixed):
book.set_freeze_panes("Data", {"row": 1, "column": 1})

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Good catch. Updated the guide to treat the examples as alternatives (only one active call) and aligned the settings dict to mode/top_left_cell. Fixed in 4c54a1d.

Comment thread docs/pyumya/mkdocs.yml Outdated
Comment on lines +68 to +69
- Getting Started:
- Installation: index.md

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The navigation structure has a redundant entry. Both "Home" and the nested "Installation" under "Getting Started" point to index.md. This will create two top-level navigation items pointing to the same page, which can be confusing for users.

Since index.md serves as the main landing page with installation instructions, the "Getting Started" section is redundant. I recommend removing it to simplify the navigation.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Yep. Removed the duplicate nav entry so index.md only appears once in the nav. Fixed in 4c54a1d.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

9 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

Comment thread docs/pyumya/mkdocs.yml Outdated
Comment on lines +67 to +69
- Home: index.md
- API Reference: api-reference.md
- Limitations: limitations.md
# Guides added as Phase 1 features land:
# - Merged Cells: guides/merged-cells.md
# - Comments: guides/comments.md
# - Hyperlinks: guides/hyperlinks.md
# etc.
- Getting Started:
- Installation: index.md

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Duplicate index.md in nav

Both "Home" (line 67) and "Getting Started > Installation" (line 69) point to index.md. This creates a duplicate entry in the navigation — clicking either link renders the same page. With navigation.indexes enabled, mkdocs-material will also emit a build warning about the duplicate.

Consider either giving "Getting Started > Installation" its own dedicated page (e.g., getting-started.md) or removing the "Getting Started" section entirely since the installation instructions already live on the Home page.

Suggested change
- Home: index.md
- API Reference: api-reference.md
- Limitations: limitations.md
# Guides added as Phase 1 features land:
# - Merged Cells: guides/merged-cells.md
# - Comments: guides/comments.md
# - Hyperlinks: guides/hyperlinks.md
# etc.
- Getting Started:
- Installation: index.md
- Home: index.md
- Guides:
Prompt To Fix With AI
This is a comment left during a code review.
Path: docs/pyumya/mkdocs.yml
Line: 67:69

Comment:
**Duplicate `index.md` in nav**

Both "Home" (line 67) and "Getting Started > Installation" (line 69) point to `index.md`. This creates a duplicate entry in the navigation — clicking either link renders the same page. With `navigation.indexes` enabled, mkdocs-material will also emit a build warning about the duplicate.

Consider either giving "Getting Started > Installation" its own dedicated page (e.g., `getting-started.md`) or removing the "Getting Started" section entirely since the installation instructions already live on the Home page.

```suggestion
  - Home: index.md
  - Guides:
```

How can I resolve this? If you propose a fix, please make it concise.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Agreed. Dropped the redundant Getting Started > Installation entry (kept Home as index.md). Fixed in 4c54a1d.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: df1326bd7c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/pyumya/docs/guides/merged-cells.md Outdated
from excelbench_rust import UmyaBook

book = UmyaBook.open("report.xlsx")
merged = book.read_merged_cells("Sheet1")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Use exported merged-range API name in guide

The guide calls book.read_merged_cells("Sheet1"), but UmyaBook exposes read_merged_ranges (see rust/excelbench_rust/src/umya/merged_cells.rs, pub fn read_merged_ranges). Users following this snippet will hit AttributeError immediately, so the first read example in this page is not runnable.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated the guide to call UmyaBook.read_merged_ranges (exported API name) and clarified unmerge is not exposed. Fixed in 4c54a1d.

Comment thread docs/pyumya/docs/guides/comments.md Outdated
book.add_sheet("Data")

book.write_cell_value("Data", "A1", {"type": "number", "value": 42.0})
book.add_comment("Data", "A1", {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Pass comment payload in documented add_comment shape

This example passes three positional arguments to add_comment, but the binding takes only (sheet, comment_dict) and requires cell inside the dict (rust/excelbench_rust/src/umya/comments.rs, pub fn add_comment). As written, the snippet raises a Python argument error before writing anything.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated add_comment example to match the binding signature (sheet, dict with required cell). Fixed in 4c54a1d.

Comment on lines +28 to +29
"ranges": ["B2:B100"],
"type": "list",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Use validation keys expected by add_data_validation

The payload uses ranges and type, but the Rust binding reads range and validation_type (rust/excelbench_rust/src/umya/data_validation.rs, get_item("range") / get_item("validation_type")). Copying this example leaves the validation target/type unset, so the generated rule will not match what the guide describes.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated the examples to use range + validation_type (matching add_data_validation). Fixed in 4c54a1d.

Comment thread docs/pyumya/docs/guides/freeze-panes.md Outdated
book.add_sheet("Data")

# Freeze top row (headers stay visible)
book.set_freeze_panes("Data", {"row": 1, "column": 0})

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Document freeze-pane settings with supported fields

The write example uses {"row": ..., "column": ...}, but set_freeze_panes parses mode plus top_left_cell/split fields (rust/excelbench_rust/src/umya/freeze_panes.rs), not row/column. With this payload, users won't actually configure the freeze state shown in the guide.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated freeze pane docs to match the supported settings dict (mode + top_left_cell / split fields). Fixed in 4c54a1d.

book = UmyaBook.open("dashboard.xlsx")
rules = book.read_conditional_formats("Sheet1")
for r in rules:
print(f"{r['ranges']}: {r['type']}")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Read conditional-format keys that the API returns

The read loop indexes r['ranges'] and r['type'], but read_conditional_formats returns range and rule_type (rust/excelbench_rust/src/umya/conditional_fmt.rs). Running this snippet raises KeyError, so the documented read path for this feature is broken.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated read example to use the API-returned keys (range, rule_type). Fixed in 4c54a1d.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the pyumya documentation site configuration and adds a set of new “Guides” pages, while also adjusting the GitHub Actions deploy workflow to trigger on changes to deploy/index.html and to change the Vercel deploy invocation.

Changes:

  • Expanded MkDocs Material configuration (navigation features, plugins, social/repo icons) and reorganized navigation to include a Guides section.
  • Added multiple new pyumya guide pages (merged cells, comments, hyperlinks, freeze panes, images, data validation, conditional formatting).
  • Updated the dashboard deploy workflow trigger paths and the Vercel deploy command.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 11 comments.

Show a summary per file
File Description
docs/pyumya/mkdocs.yml Enables additional MkDocs Material features/plugins and restructures nav to surface new Guides/Reference sections.
docs/pyumya/docs/guides/merged-cells.md Adds merged-cells guide content (but examples currently don’t match the binding API).
docs/pyumya/docs/guides/comments.md Adds comments guide content (but write example signature doesn’t match the binding API).
docs/pyumya/docs/guides/hyperlinks.md Adds hyperlinks guide content (but write example signature doesn’t match the binding API).
docs/pyumya/docs/guides/freeze-panes.md Adds freeze panes guide content (but read/write shapes don’t match the binding API).
docs/pyumya/docs/guides/images.md Adds images guide content (but read/write shapes don’t match the binding API).
docs/pyumya/docs/guides/data-validation.md Adds data validation guide content (but field names don’t match the binding API).
docs/pyumya/docs/guides/conditional-formatting.md Adds conditional formatting guide content (but return/payload keys and supported fields don’t match the binding API).
.github/workflows/deploy-dashboard.yml Triggers on deploy/index.html changes and adjusts how Vercel deploy is executed.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread docs/pyumya/docs/guides/merged-cells.md Outdated
Comment on lines +3 to +12
Merge and unmerge cell ranges in Excel workbooks.

## Reading Merged Ranges

```python
from excelbench_rust import UmyaBook

book = UmyaBook.open("report.xlsx")
merged = book.read_merged_cells("Sheet1")
print(merged) # ["A1:D1", "B3:B5"]

Copilot AI Feb 14, 2026

Copy link

Choose a reason for hiding this comment

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

The guide uses a non-existent API and claims unmerge support. The Rust binding exposes UmyaBook.read_merged_ranges(sheet) (not read_merged_cells), and there is no unmerge method in the binding—please update the text and example so it matches the actual public API.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated merged-cells guide to the actual API (read_merged_ranges) and removed the unmerge claim (added a note instead). Fixed in 4c54a1d.

Comment thread docs/pyumya/docs/guides/freeze-panes.md Outdated

book = UmyaBook.open("dashboard.xlsx")
panes = book.read_freeze_panes("Sheet1")
print(panes) # {"row": 1, "column": 0} (top row frozen)

Copilot AI Feb 14, 2026

Copy link

Choose a reason for hiding this comment

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

read_freeze_panes returns a dict describing the pane state (e.g., mode, top_left_cell, and for split panes x_split/y_split), not row/column. The example output shape here doesn’t match the binding and will confuse readers—please update it to reflect the actual return value.

Suggested change
print(panes) # {"row": 1, "column": 0} (top row frozen)
print(panes) # {"mode": "frozen", "top_left_cell": "A2", "x_split": 0, "y_split": 1} (top row frozen)

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated read_freeze_panes example to reflect the actual return shape (mode/top_left_cell/etc.). Fixed in 4c54a1d.

Comment thread docs/pyumya/docs/guides/freeze-panes.md Outdated
Comment on lines +21 to +29
# Freeze top row (headers stay visible)
book.set_freeze_panes("Data", {"row": 1, "column": 0})

# Freeze first column
book.set_freeze_panes("Data", {"row": 0, "column": 1})

# Freeze both (top-left corner stays fixed)
book.set_freeze_panes("Data", {"row": 1, "column": 1})

Copilot AI Feb 14, 2026

Copy link

Choose a reason for hiding this comment

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

set_freeze_panes expects a settings dict with at least mode (e.g., freeze/split) and typically top_left_cell (e.g., "B2"). The examples use {row, column} which the binding does not read, so these calls will not produce the intended result—please adjust to the supported settings keys.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated set_freeze_panes examples to use mode/top_left_cell (and clarified overwrite semantics). Fixed in 4c54a1d.

Comment on lines +11 to +15
rules = book.read_conditional_formats("Sheet1")
for r in rules:
print(f"{r['ranges']}: {r['type']}")
# ['A1:A100']: cellIs
# ['B1:B100']: colorScale

Copilot AI Feb 14, 2026

Copy link

Choose a reason for hiding this comment

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

read_conditional_formats returns items with keys like range and rule_type (plus optional operator, formula, etc.). The example uses r['ranges']/r['type'], which will raise KeyError—please align the guide with the binding’s actual return shape.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Aligned conditional format read payload keys to range/rule_type (+ operator/formula/format). Fixed in 4c54a1d.

Comment on lines +27 to +33
book.add_conditional_format("Sales", {
"ranges": ["B2:B50"],
"type": "cellIs",
"operator": "greaterThan",
"formula": "1000",
"format": {"bg_color": "#C6EFCE", "font_color": "#006100"}, # green
})

Copilot AI Feb 14, 2026

Copy link

Choose a reason for hiding this comment

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

add_conditional_format expects a single dict with keys like range and rule_type (not ranges/type). As written, this example won’t match the binding’s expected input payload, so it will either error or silently omit settings—please update the payload keys to the supported names.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Aligned add_conditional_format payload to range/rule_type (not ranges/type). Fixed in 4c54a1d.

Comment thread docs/pyumya/docs/guides/comments.md Outdated
book.add_sheet("Data")

book.write_cell_value("Data", "A1", {"type": "number", "value": 42.0})
book.add_comment("Data", "A1", {

Copilot AI Feb 14, 2026

Copy link

Choose a reason for hiding this comment

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

UmyaBook.add_comment in the Rust binding takes (sheet, comment_dict) where comment_dict includes a required cell field. The example currently passes the cell as a separate positional argument, which will raise a Python argument error—please adjust the example payload shape to match the actual signature.

Suggested change
book.add_comment("Data", "A1", {
book.add_comment("Data", {
"cell": "A1",

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated add_comment usage to pass a dict including cell/text/author (no extra positional arg). Fixed in 4c54a1d.

Comment thread docs/pyumya/docs/guides/hyperlinks.md Outdated
Comment on lines +26 to +38
book.add_hyperlink("Links", "A1", {
"target": "https://example.com",
"display": "Visit Example",
})

# Email link
book.add_hyperlink("Links", "A2", {
"target": "mailto:support@example.com",
"display": "Email Support",
})

# Internal reference (another sheet)
book.add_hyperlink("Links", "A3", {

Copilot AI Feb 14, 2026

Copy link

Choose a reason for hiding this comment

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

UmyaBook.add_hyperlink is defined as (sheet, link_dict) with required cell and target keys (plus optional display, tooltip, internal). The example currently passes the cell as a separate positional argument, which doesn't match the binding’s signature and will fail at runtime.

Suggested change
book.add_hyperlink("Links", "A1", {
"target": "https://example.com",
"display": "Visit Example",
})
# Email link
book.add_hyperlink("Links", "A2", {
"target": "mailto:support@example.com",
"display": "Email Support",
})
# Internal reference (another sheet)
book.add_hyperlink("Links", "A3", {
book.add_hyperlink("Links", {
"cell": "A1",
"target": "https://example.com",
"display": "Visit Example",
})
# Email link
book.add_hyperlink("Links", {
"cell": "A2",
"target": "mailto:support@example.com",
"display": "Email Support",
})
# Internal reference (another sheet)
book.add_hyperlink("Links", {
"cell": "A3",

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated add_hyperlink examples to match the binding signature (sheet, dict with required cell/target). Fixed in 4c54a1d.

Comment thread docs/pyumya/docs/guides/images.md Outdated
Comment on lines +13 to +14
print(f"Cell {img['cell']}: {img['format']} ({len(img['data'])} bytes)")
# Cell A1: png (24576 bytes)

Copilot AI Feb 14, 2026

Copy link

Choose a reason for hiding this comment

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

UmyaBook.read_images currently returns anchor metadata (e.g., cell, anchor, offset, etc.) and does not include image bytes or a format field. The example iterates img['format'] and img['data'], which will raise KeyError—please update the example to match the actual return shape.

Suggested change
print(f"Cell {img['cell']}: {img['format']} ({len(img['data'])} bytes)")
# Cell A1: png (24576 bytes)
print(f"Image at {img['cell']}: anchor={img['anchor']}, offset={img['offset']}")
# Image at A1: anchor=oneCell, offset=(0, 0)

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated read_images example to match the current return shape (anchor metadata; no bytes/format). Fixed in 4c54a1d.

Comment thread docs/pyumya/docs/guides/images.md Outdated
Comment on lines +26 to +29
# Embed an image from file
book.add_image("Report", "B2", {
"data": Path("logo.png").read_bytes(),
"format": "png",

Copilot AI Feb 14, 2026

Copy link

Choose a reason for hiding this comment

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

UmyaBook.add_image expects an image dict containing a file path and cell (it does not accept raw data bytes or a format field). As written, this example will fail input validation in the binding—please update the example to pass path/cell (and adjust surrounding text accordingly).

Suggested change
# Embed an image from file
book.add_image("Report", "B2", {
"data": Path("logo.png").read_bytes(),
"format": "png",
# Embed an image by file path
book.add_image("Report", {
"path": "logo.png",
"cell": "B2",

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated add_image example to match the binding signature (sheet, dict with path + cell). Fixed in 4c54a1d.

Comment on lines +11 to +16
validations = book.read_data_validations("Sheet1")
for v in validations:
print(f"{v['ranges']}: {v['type']} — {v.get('formula1', '')}")
# ['B2:B100']: list — "Option A,Option B,Option C"
# ['C2:C100']: whole — 1
```

Copilot AI Feb 14, 2026

Copy link

Choose a reason for hiding this comment

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

The data validation examples use field names that don’t match the Rust binding. read_data_validations returns keys like range and validation_type (and error, not error_message), and add_data_validation expects the same (range, validation_type, etc.), whereas the guide uses ranges/type and other non-existent keys.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Updated both read and write examples to match the binding keys (range, validation_type, error, etc.). Fixed in 4c54a1d.

@wolfiesch
wolfiesch merged commit 04175bc into master Feb 14, 2026
4 checks passed
@wolfiesch
wolfiesch deleted the docs/pyumya-guides-and-deploy-workflow branch February 14, 2026 10:44
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