semvec/pypi-packages huggingface dataset:
mahler 0.1.0
Web browser automation wrapper.
Requires Python: <4.0,>=3.12

# 🎵 mahler

![PyPI - Version](https://img.shields.io/pypi/v/mahler)


Web browser automation wrapper.

## About

`mahler` is a web browser automation wrapper that offers a standard API regardless
of what automation suite is being used.

This allows for swapping between automation solutions (playwright, selenium)
without having to rewrite the actual browser control code.

`mahler` is named after [Gustav Mahler](https://en.wikipedia.org/wiki/Gustav_Mahler),
a 19th century composer that wrote some [sweet bass solos](https://www.youtube.com/watch?v=JEP2pA6srnk).

## Documentation

See the full [documentation](https://mahler.readthedocs.io/en/latest/index.html).

## Quickstart

Run `pip install mahler` to install package.

Let's launch a browser, visit a site, and click the first link on the page.

```python
from mahler import Controller


controller = Controller(
    "playwright",
    "chrome",
    headless=False,
)
controller.goto("https://example.com")
link = controller.query_selector_all("a")
link.click()
```

Nice! Now let's change 1 line of code to do it in a different automation suite.

```python
from mahler import Controller

controller = Controller(
    "selenium",  # Changed
    "chrome",
    headless=False,
)
controller.goto("https://example.com")
link = controller.query_selector_all("a")
link.click()
```

A slightly more involved example. Let's login to a website! (Don't worry, these aren't real credentials.)

```python
from mahler import Controller

controller = Controller(
    "selenium",
    "firefox",
    headless=False,
)
controller.goto("https://www.scrapethissite.com/login/")
email_field = controller.query_selector("input#email")
email_field.type_on("jeanluc@ufop.org")
password_field = controller.query_selector("//input[@id='password']")
password_field.type_on("makeitso", delay=0.05)
login_button = controller.query_selector("input[type='submit']")
login_button.click()
```

Let's change 2 arguments to do it in a different automation suite with
a different browser type.

```python
from mahler import Controller

controller = Controller(
    "playwright",  # Changed
    "chrome",  # Changed
    headless=False,
)
controller.goto("https://www.scrapethissite.com/login/")
email_field = controller.query_selector("input#email")
email_field.type_on("jeanluc@ufop.org")
password_field = controller.query_selector("//input[@id='password']")
password_field.type_on("makeitso", delay=0.05)
login_button = controller.query_selector("input[type='submit']")
login_button.click()
```

## To Do

- Expand fingerprint dataclass and usage to capture and apply full browser fingerprint.
- Add some blackbox functional tests for browser engines.
- Async browser support. Selenium doesn't have a native async implementation and [`selenium-async`](https://github.com/munro/python-selenium-async)
is no longer maintained.
- Support request interception. [`selenium-wire`](https://github.com/wkeeling/selenium-wire) is no longer maintained.
- Support [mokr](https://github.com/michaeleveringham/mokr) when it is fully released.
WikiClosetClient 0.0.7
Tools for wiki.gg staff
Requires Python: >=3.6

## WikiClosetClient

### Warning

**This library will only work for wiki.gg staff. No one else has the allowed credentials.**

### About

**WikiClosetClient** is meant to be used with wiki.gg's in-house extension WikiCloset, although it's possible to use it with other domains too.

Currently the only function is to get a list of all wikis on the platform.
mcp-smarthub 0.2.9
SmartHub MCP extension for Goose
Requires Python: >=3.10

# SmartHub MCP Extension

A Goose extension for natural language interaction with SmartHub data and portfolio management.

## Installation

Install the package using uvx:

```bash
uvx mcp_smarthub@latest
```

## Configuration

Add the extension to Goose using either the UI or configuration file.

### Using Goose Desktop UI

1. Open Goose Desktop
2. Click menu (top right) → Settings → Extensions
3. Click "Add Extension"
4. Use these settings:

```yaml
Type: Standard IO
ID: smarthubdata
Name: SmartHub Extension
Description: Natural language interface for SmartHub data and portfolio management
Command: uvx mcp_smarthub@latest
```

### Using Configuration File

Add to `~/.config/goose/config.yaml`:

```yaml
extensions:
  smarthubdata:
    type: standard_io
    command: uvx mcp_smarthub@latest
```

### Using Goose CLI

```bash
goose session --with-extension "uvx mcp_smarthub@latest"
```

## Authentication

The extension uses SSO for Snowflake authentication at Block. No additional credentials are required.

## Features

- Natural language queries for SmartHub data
- Portfolio management capabilities
- Custom pricing analysis
- Winter 2025 features (churn model, variable comp)

## Testing

After installation:
1. Restart Goose
2. Ask Goose: "Can you test the SmartHub extension connection to Snowflake?"

## Troubleshooting

1. Verify installation: `uvx mcp_smarthub@latest --version`
2. Verify SSO is working by testing Snowflake access in another tool
3. Check that you're on the Block network or VPN
4. If you have issues with uvx, ensure your ~/.config/uv/uv.toml is configured:
   ```toml
   index-url = "https://artifactory.global.square/artifactory/api/pypi/block-pypi/simple"
   native-tls = true
   ```

## Support

- GitHub Issues: https://github.com/squareup/smarthub-extension/issues
- Contact: goose@squareup.com

## Development

See [DEVELOPMENT.md](DEVELOPMENT.md) for instructions on local development and testing.

## License

MIT License - see LICENSE file for details