Metadata-Version: 2.4
Name: skinnycal
Version: 0.1.6
Summary: A Plotly Dash wrapper for FullCalendar with premium (Scheduler) plugins bundled
Author-email: Pepijn Wissing <pepijn.wissing@cqm.nl>
License: MIT License
        
        Copyright (c) 2025 Scott Kilgore
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
        
Project-URL: Homepage, https://github.com/PepijnWissing/skinnyCal
Project-URL: Repository, https://github.com/PepijnWissing/skinnyCal
Project-URL: Issues, https://github.com/PepijnWissing/skinnyCal/issues
Keywords: dash,plotly,fullcalendar,scheduler,calendar
Classifier: Framework :: Dash
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Operating System :: OS Independent
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: dash>=2.0.0
Dynamic: license-file

# skinnycal

A lightweight Plotly Dash wrapper around **[@fullcalendar/react](https://fullcalendar.io/docs/react)**, with the FullCalendar **Premium (Scheduler)** plugins statically bundled so resource views work out of the box.

Forked from [`dash-fullcalendar`](https://github.com/ScottTpirate/dash-fullcalendar). See [`PREMIUM_FORK_CHANGES.md`](PREMIUM_FORK_CHANGES.md) for the full rationale and diff notes.

---

## Installation

```bash
pip install skinnycal
```

PyPI distribution and Python import name are both `skinnycal`.

---

## Quick start

```python
from dash import Dash, html
import skinnycal as dcal

app = Dash(__name__)

app.layout = html.Div([
    dcal.FullCalendar(
        id="cal",
        initialView="dayGridMonth",
        editable=True,
        selectable=True,
        events=[
            {"title": "Audit", "date": "2025-08-01"},
            {"title": "Go-Live", "date": "2025-08-10"},
        ],
    )
])

if __name__ == "__main__":
    app.run(debug=True)
```

Open <http://127.0.0.1:8050> in your browser.

### Premium (Scheduler) views

Pass a valid `schedulerLicenseKey` and request a resource view — the premium plugins are already in the bundle, no async chunk fetch:

```python
dcal.FullCalendar(
    id="cal",
    schedulerLicenseKey="GPL-My-Project-Is-Open-Source",  # or your commercial key
    plugins=["resourceTimeline", "interaction"],
    initialView="resourceTimelineWeek",
    resources=[{"id": "a", "title": "Room A"}, {"id": "b", "title": "Room B"}],
    events=[{"resourceId": "a", "title": "Kickoff", "start": "2025-08-01"}],
)
```

---

## Repository layout

| Path | Purpose |
|------|---------|
| `skinnycal/` | Python package published to PyPI. Contains generated Dash component classes and pre-compiled JS assets (`_js_dist`). |
| `src/` | Raw React source for the wrapper. |
| `package.json`, `webpack.config.js` | JS build pipeline (`npm run build`). |
| `usage.py` | Minimal Dash demo. |
| `tests/` | Integration tests with `dash[testing]` & `pytest`. |
| `.github/workflows/` | CI workflow that builds and publishes to PyPI on push to `main`. |

---

## Development

1. **Clone** and install dependencies

   ```bash
   git clone https://github.com/PepijnWissing/skinnyCal.git
   cd skinnyCal
   npm install
   python -m venv .venv && . .venv/Scripts/activate   # POSIX: source .venv/bin/activate
   pip install -r requirements.txt
   ```

2. **Build** and run the example

   ```bash
   npm run build        # webpack + dash-generate-components
   pip install -e .
   python usage.py      # open http://localhost:8050
   ```

3. **Run tests**

   ```bash
   pytest -q
   ```

---

## Releasing

Publishing is automated: any push to `main` triggers `.github/workflows/publish.yml`, which builds an sdist + wheel and uploads to PyPI via [Trusted Publishing (OIDC)](https://docs.pypi.org/trusted-publishers/). Pushes that don't bump the version are no-ops (`skip-existing: true`).

To cut a release, bump the version in **all three** places (they must stay in sync — `__version__` is read from `package-info.json` at import time):

- `pyproject.toml` → `[project].version`
- `skinnycal/package-info.json` → `version`
- `package.json` → `version`

Then commit and push to `main`.

---

## License

MIT © Scott Kilgore (upstream wrapper). Bundled `@fullcalendar` premium plugin code is governed by [FullCalendar's own license](https://fullcalendar.io/license) — commercial production use requires a purchased Scheduler license.
