diff --git a/.changeset/0000-django60-support.md b/.changeset/0000-django60-support.md new file mode 100644 index 0000000..48ad7b7 --- /dev/null +++ b/.changeset/0000-django60-support.md @@ -0,0 +1,5 @@ +--- +type: minor +--- + +Add Django 6.0 compatibility. Django 6.0 removed `id` and `name` from template context in `BaseGeometryWidget.get_context()`. Re-inject these in `BasePointFieldInteractiveWidget.get_context()` for all interactive widgets (Google Maps, Leaflet, Mapbox). Also lift `js_widget_data` and `is_formset_empty_form_template` attrs to top-level context in `PointFieldInlineWidgetMixin.get_context()` for inline formset widgets. diff --git a/.claude/commands/add-widget.md b/.claude/commands/add-widget.md new file mode 100644 index 0000000..1117ce2 --- /dev/null +++ b/.claude/commands/add-widget.md @@ -0,0 +1,45 @@ +# /add-widget — Add a new map widget + +Scaffold a new map widget across all required files (Python, JS, CSS, templates, docs). + +## What it does +Interactively prompts for widget details, then generates: +1. **Python widget class** in `mapwidgets/widgets/.py` + - Extends `BasePointFieldInteractiveWidget` or `BaseStaticWidget` + - Registers in widget's `__init__.py` and main `__init__.py` + +2. **Settings** in `mapwidgets/settings.py` + - Adds provider config to `DEFAULT_SETTINGS` + - Includes apiKey, mapOptions, media paths + +3. **JavaScript** in `mapwidgets/static/mapwidgets/js/pointfield/interactive//` + - Creates `mw_pointfield.js` (unminified) + - Runs `/minify` to generate `.min.js` + +4. **CSS** in `mapwidgets/static/mapwidgets/css/` (if needed) + +5. **HTML template** in `mapwidgets/templates/mapwidgets/` + - Django form widget template + +6. **Documentation** stub in `docs/widgets/` + - Includes provider name, installation, configuration, usage examples + +## Usage +``` +/add-widget +``` + +Prompts you for: +- **Provider name** (e.g., "Google Maps", "Mapbox", "Leaflet") +- **Widget types** to create (interactive, static, inline formsets) +- **API/auth requirements** (apiKey, token, etc.) + +## Follow-up +After running, you should: +- Update widget JS logic for your specific provider +- Test widget rendering in demo project +- Run `/minify` if JS was modified +- Commit changes with meaningful message + +## Reference +See `docs/contribution/index.rst` for the full new widget checklist. diff --git a/.claude/commands/minify.md b/.claude/commands/minify.md new file mode 100644 index 0000000..67e65a9 --- /dev/null +++ b/.claude/commands/minify.md @@ -0,0 +1,20 @@ +# /minify — Minify JS & CSS assets + +Minify all JavaScript and CSS files in the mapwidgets static assets using the build script. + +## What it does +- Runs `python scripts.py` to minify JS files in `mapwidgets/static/mapwidgets/js/` +- Minifies CSS in `mapwidgets/static/mapwidgets/css/` +- Generates `.min.js` and `.min.css` files +- Verifies all minified assets were created successfully + +## Usage +``` +/minify +``` + +## When to use +- After creating a new widget JS file +- After modifying any `.js` or `.css` files in `mapwidgets/static/` +- Before committing changes to static assets +- As part of the release process diff --git a/.claude/commands/release.md b/.claude/commands/release.md new file mode 100644 index 0000000..69fe02a --- /dev/null +++ b/.claude/commands/release.md @@ -0,0 +1,37 @@ +# /release — Cut a new release + +Automate the release process for PyPI and GitHub. + +## What it does +1. **Bump version** in `setup.py` (prompts for semver: patch/minor/major) +2. **Create changeset** in `.changeset/` directory + - Auto-generates filename `0000--release.md` with semver and changelog +3. **Update docs** in `docs/releases/` with release notes +4. **Git operations** + - Stage changes + - Commit with message: "release: v{version}" + - Create git tag: `v{version}` + - Push to remote +5. **Create GitHub Release** + - Creates release on GitHub with changelog from changeset + - Marks as latest if on main branch + +## Usage +``` +/release +``` + +Prompts you for: +- **Semver type**: patch, minor, or major +- **Release notes**: changes, fixes, new features + +## Reference +- Current version in `setup.py` +- Changelog format follows `.changeset/` convention +- Requires `gh` CLI for GitHub operations +- Public repo: `erdem/django-map-widgets` + +## Notes +- Will not push if CI checks haven't passed +- Always creates a new commit (never amends) +- Version string synced with `pyproject.toml` if needed diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95e9589..68a459e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,10 +14,10 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: "3.12" @@ -27,14 +27,14 @@ jobs: - name: Install Poetry run: | python -m pip install --upgrade pip - pip install poetry + pip install --upgrade poetry - name: Configure Poetry run: | poetry config virtualenvs.in-project true - name: Cache Poetry virtualenv - uses: actions/cache@v2 + uses: actions/cache@v4 id: cache with: path: .venv @@ -47,7 +47,7 @@ jobs: run: poetry install - name: Validate Poetry lock file - run: poetry lock --check + run: poetry check --lock - name: Run isort run: poetry run isort . diff --git a/mapwidgets/static/mapwidgets/css/map_widgets.css b/mapwidgets/static/mapwidgets/css/map_widgets.css index 2dfc5c5..f68e216 100644 --- a/mapwidgets/static/mapwidgets/css/map_widgets.css +++ b/mapwidgets/static/mapwidgets/css/map_widgets.css @@ -274,7 +274,7 @@ -moz-user-select: none; -ms-user-select: none; user-select: none; - text-decoration: none; + text-decoration: none !important; } .mw-btn:focus, diff --git a/mapwidgets/static/mapwidgets/css/map_widgets.min.css b/mapwidgets/static/mapwidgets/css/map_widgets.min.css index fb2b68a..e69de29 100644 --- a/mapwidgets/static/mapwidgets/css/map_widgets.min.css +++ b/mapwidgets/static/mapwidgets/css/map_widgets.min.css @@ -1 +0,0 @@ -@font-face{font-family:'fontello';src:url('../font/fontello.eot?93477804');src:url('../font/fontello.eot?93477804#iefix') format('embedded-opentype'),url('../font/fontello.woff2?93477804') format('woff2'),url('../font/fontello.woff?93477804') format('woff'),url('../font/fontello.ttf?93477804') format('truetype'),url('../font/fontello.svg?93477804#fontello') format('svg');font-weight:normal;font-style:normal}.mw-wrap input:focus{outline:0}.mw-wrap [class^="icon-"]:before,.mw-wrap [class*=" icon-"]:before{font-family:"fontello";font-style:normal;font-weight:normal;speak:never;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mw-wrap .icon-location:before{content:'\e800'}.mw-wrap .icon-down-dir:before{content:'\e801'}.mw-wrap .icon-trash-empty:before{content:'\e802'}.mw-wrap .icon-down-open:before{content:'\e803'}.mw-wrap .icon-up-open:before{content:'\e804'}.mw-wrap .icon-up-dir:before{content:'\e805'}.mw-wrap .icon-direction:before{content:'\f124'}.mw-wrap{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;width:80%;min-width:500px;margin-bottom:10px;display:block;overflow:hidden}.tabular td .mw-wrap{width:100%}.mw-wrap .form-control,.mw-wrap .mapboxgl-ctrl-geocoder--input{border:1px solid #ccc;font-family:inherit;margin:0;box-sizing:border-box;display:block;width:100%;height:33px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}@media screen and (min-width:640px){.mw-wrap .mapboxgl-ctrl-geocoder{width:100%;max-width:100%}}@media screen and (max-width:1024px){.mw-wrap .button-text{display:none}}.mw-wrap .mapboxgl-ctrl-geocoder--icon{display:none}.mw-wrap .mapboxgl-ctrl-geocoder{z-index:10}.mw-wrap .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.mw-wrap *{border-radius:0 !important}.mw-header{margin-bottom:6px}.mw-header .mw-adress-input-wrap{width:35%}.mw-header .mw-coordinates-wrap{position:relative;display:inline-block}.mw-coordinates-overlay{width:180px;background:#e7e7e7;margin-top:3px;position:absolute;z-index:10000;padding:10px;-webkit-box-shadow:0 6px 20px rgba(0,0,0,.325);box-shadow:0 6px 20px rgba(0,0,0,.325)}.mw-coordinates-overlay label{float:none;width:100%;height:60px;font-weight:500;color:#36454f;overflow:hidden}.mw-coordinates-overlay input.form-control.error{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.mw-coordinates-overlay input.error:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.mw-header .mw-coordinates-container label{cursor:pointer}.mw-map{height:360px;display:block}.mw-footer{padding:10px 0}.mw-map-wrapper{height:360px;position:relative}.mw-loader{background:url("../images/ripple.gif") no-repeat center center;background-size:cover;width:64px;height:64px;position:absolute;left:50%;top:50%;margin:-32px 0 0 -32px}.mw-loader-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:99999;background:rgba(255,255,255,.7);text-align:center}.mw-map.click,.mw-map.click div{cursor:crosshair}.mw-map.click div.gmnoprint div{cursor:pointer}.mw-help-text.help-text{font-size:11px;color:#5c5c5c}.mw-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none}.mw-btn:focus,.mw-btn:active:focus,.mw-btn.active:focus,.mw-btn.focus,.mw-btn:active.focus,.mw-btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.mw-btn:hover,.mw-btn:focus,.mw-btn.focus{color:#333;text-decoration:none}.mw-btn:active,.mw-btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.mw-btn.disabled,.mw-btn[disabled],fieldset[disabled] .mw-btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.mw-btn.disabled,fieldset[disabled] a.mw-btn{pointer-events:none}.mw-btn-default{color:#333;background-color:#f8f9fa;border-color:#ccc;text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.mw-btn-default:focus,.mw-btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.mw-btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.mw-btn-default:active,.mw-btn-default.active,.open>.dropdown-toggle.mw-btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.mw-btn-default:active:hover,.mw-btn-default.active:hover,.open>.dropdown-toggle.mw-btn-default:hover,.mw-btn-default:active:focus,.mw-btn-default.active:focus,.open>.dropdown-toggle.mw-btn-default:focus,.mw-btn-default:active.focus,.mw-btn-default.active.focus,.open>.dropdown-toggle.mw-btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.mw-btn-default:active,.mw-btn-default.active,.open>.dropdown-toggle.mw-btn-default{background-image:none}.mw-btn-default.disabled:hover,.mw-btn-default[disabled]:hover,fieldset[disabled] .mw-btn-default:hover,.mw-btn-default.disabled:focus,.mw-btn-default[disabled]:focus,fieldset[disabled] .mw-btn-default:focus,.mw-btn-default.disabled.focus,.mw-btn-default[disabled].focus,fieldset[disabled] .mw-btn-default.focus{background-color:#fff;border-color:#ccc}.mw-btn-default .badge{color:#fff;background-color:#333}.mw-btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.mw-btn-primary:focus,.mw-btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.mw-btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.mw-btn-primary:active,.mw-btn-primary.active,.open>.dropdown-toggle.mw-btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.mw-btn-primary:active:hover,.mw-btn-primary.active:hover,.open>.dropdown-toggle.mw-btn-primary:hover,.mw-btn-primary:active:focus,.mw-btn-primary.active:focus,.open>.dropdown-toggle.mw-btn-primary:focus,.mw-btn-primary:active.focus,.mw-btn-primary.active.focus,.open>.dropdown-toggle.mw-btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.mw-btn-primary:active,.mw-btn-primary.active,.open>.dropdown-toggle.mw-btn-primary{background-image:none}.mw-btn-primary.disabled:hover,.mw-btn-primary[disabled]:hover,fieldset[disabled] .mw-btn-primary:hover,.mw-btn-primary.disabled:focus,.mw-btn-primary[disabled]:focus,fieldset[disabled] .mw-btn-primary:focus,.mw-btn-primary.disabled.focus,.mw-btn-primary[disabled].focus,fieldset[disabled] .mw-btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.mw-btn-primary .badge{color:#337ab7;background-color:#fff}.mw-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.mw-btn-success:focus,.mw-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.mw-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.mw-btn-success:active,.mw-btn-success.active,.open>.dropdown-toggle.mw-btn-success{color:#fff;background-color:#449d44;border-color:#398439}.mw-btn-success:active:hover,.mw-btn-success.active:hover,.open>.dropdown-toggle.mw-btn-success:hover,.mw-btn-success:active:focus,.mw-btn-success.active:focus,.open>.dropdown-toggle.mw-btn-success:focus,.mw-btn-success:active.focus,.mw-btn-success.active.focus,.open>.dropdown-toggle.mw-btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.mw-btn-success:active,.mw-btn-success.active,.open>.dropdown-toggle.mw-btn-success{background-image:none}.mw-btn-success.disabled:hover,.mw-btn-success[disabled]:hover,fieldset[disabled] .mw-btn-success:hover,.mw-btn-success.disabled:focus,.mw-btn-success[disabled]:focus,fieldset[disabled] .mw-btn-success:focus,.mw-btn-success.disabled.focus,.mw-btn-success[disabled].focus,fieldset[disabled] .mw-btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.mw-btn-success .badge{color:#5cb85c;background-color:#fff}.mw-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.mw-btn-info:focus,.mw-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.mw-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.mw-btn-info:active,.mw-btn-info.active,.open>.dropdown-toggle.mw-btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.mw-btn-info:active:hover,.mw-btn-info.active:hover,.open>.dropdown-toggle.mw-btn-info:hover,.mw-btn-info:active:focus,.mw-btn-info.active:focus,.open>.dropdown-toggle.mw-btn-info:focus,.mw-btn-info:active.focus,.mw-btn-info.active.focus,.open>.dropdown-toggle.mw-btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.mw-btn-info:active,.mw-btn-info.active,.open>.dropdown-toggle.mw-btn-info{background-image:none}.mw-btn-info.disabled:hover,.mw-btn-info[disabled]:hover,fieldset[disabled] .mw-btn-info:hover,.mw-btn-info.disabled:focus,.mw-btn-info[disabled]:focus,fieldset[disabled] .mw-btn-info:focus,.mw-btn-info.disabled.focus,.mw-btn-info[disabled].focus,fieldset[disabled] .mw-btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.mw-btn-info .badge{color:#5bc0de;background-color:#fff}.mw-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.mw-btn-warning:focus,.mw-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.mw-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.mw-btn-warning:active,.mw-btn-warning.active,.open>.dropdown-toggle.mw-btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.mw-btn-warning:active:hover,.mw-btn-warning.active:hover,.open>.dropdown-toggle.mw-btn-warning:hover,.mw-btn-warning:active:focus,.mw-btn-warning.active:focus,.open>.dropdown-toggle.mw-btn-warning:focus,.mw-btn-warning:active.focus,.mw-btn-warning.active.focus,.open>.dropdown-toggle.mw-btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.mw-btn-warning:active,.mw-btn-warning.active,.open>.dropdown-toggle.mw-btn-warning{background-image:none}.mw-btn-warning.disabled:hover,.mw-btn-warning[disabled]:hover,fieldset[disabled] .mw-btn-warning:hover,.mw-btn-warning.disabled:focus,.mw-btn-warning[disabled]:focus,fieldset[disabled] .mw-btn-warning:focus,.mw-btn-warning.disabled.focus,.mw-btn-warning[disabled].focus,fieldset[disabled] .mw-btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.mw-btn-warning .badge{color:#f0ad4e;background-color:#fff}.mw-btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.mw-btn-danger:focus,.mw-btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.mw-btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.mw-btn-danger:active,.mw-btn-danger.active,.open>.dropdown-toggle.mw-btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.mw-btn-danger:active:hover,.mw-btn-danger.active:hover,.open>.dropdown-toggle.mw-btn-danger:hover,.mw-btn-danger:active:focus,.mw-btn-danger.active:focus,.open>.dropdown-toggle.mw-btn-danger:focus,.mw-btn-danger:active.focus,.mw-btn-danger.active.focus,.open>.dropdown-toggle.mw-btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.mw-btn-danger:active,.mw-btn-danger.active,.open>.dropdown-toggle.mw-btn-danger{background-image:none}.mw-btn-danger.disabled:hover,.mw-btn-danger[disabled]:hover,fieldset[disabled] .mw-btn-danger:hover,.mw-btn-danger.disabled:focus,.mw-btn-danger[disabled]:focus,fieldset[disabled] .mw-btn-danger:focus,.mw-btn-danger.disabled.focus,.mw-btn-danger[disabled].focus,fieldset[disabled] .mw-btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.mw-btn-danger .badge{color:#d9534f;background-color:#fff}.mw-btn-link{color:#337ab7;font-weight:normal;border-radius:0}.mw-btn-link,.mw-btn-link:active,.mw-btn-link.active,.mw-btn-link[disabled],fieldset[disabled] .mw-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.mw-btn-link,.mw-btn-link:hover,.mw-btn-link:focus,.mw-btn-link:active{border-color:transparent}.mw-btn-link:hover,.mw-btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.mw-btn-link[disabled]:hover,fieldset[disabled] .mw-btn-link:hover,.mw-btn-link[disabled]:focus,fieldset[disabled] .mw-btn-link:focus{color:#777;text-decoration:none}.mw-btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.mw-btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.mw-btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.mw-btn-block{display:block;width:100%}.mw-btn-block+.mw-btn-block{margin-top:5px}.mw-btn.active,.mw-btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.mw-btn-warning.active,.mw-btn-warning:active{color:#fff;border-color:#d58512;background:#ec971f none}.map-widget-overlay-link{cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in;border-bottom:0;display:inline-block}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block} diff --git a/mapwidgets/widgets/base.py b/mapwidgets/widgets/base.py index 1cd49d6..2b83156 100644 --- a/mapwidgets/widgets/base.py +++ b/mapwidgets/widgets/base.py @@ -54,6 +54,11 @@ def geos_to_dict(self, geom: GEOSGeometry): def get_context(self, name, value, attrs): context = super().get_context(name, value, attrs) + # Django 6.0 removed id and name from context; re-inject them + context["name"] = name + widget_attrs = context.get("widget", {}).get("attrs", {}) + context["id"] = widget_attrs.get("id", name) + field_value = context["serialized"] if field_value: field_value = self.geos_to_dict(self.deserialize(field_value)) diff --git a/mapwidgets/widgets/mixins.py b/mapwidgets/widgets/mixins.py index f37dbf2..3db0ef8 100644 --- a/mapwidgets/widgets/mixins.py +++ b/mapwidgets/widgets/mixins.py @@ -39,6 +39,18 @@ def get_js_widget_data(self, name, element_id): } return js_widget_params + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + # Django 6.0 buries attrs in context["widget"]["attrs"]; lift to top-level + widget_attrs = context.get("widget", {}).get("attrs", {}) + if "js_widget_data" in widget_attrs: + context["js_widget_data"] = widget_attrs["js_widget_data"] + if "is_formset_empty_form_template" in widget_attrs: + context["is_formset_empty_form_template"] = widget_attrs[ + "is_formset_empty_form_template" + ] + return context + def render(self, name, value, attrs=None, renderer=None): if not attrs: attrs = dict() diff --git a/poetry.lock b/poetry.lock index 34a2f9c..e88ddb4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "alabaster" @@ -6,6 +6,7 @@ version = "0.7.16" description = "A light, configurable Sphinx theme" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, @@ -13,17 +14,18 @@ files = [ [[package]] name = "asgiref" -version = "3.8.1" +version = "3.11.1" description = "ASGI specs, helper code, and adapters" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, - {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, + {file = "asgiref-3.11.1-py3-none-any.whl", hash = "sha256:e8667a091e69529631969fd45dc268fa79b99c92c5fcdda727757e52146ec133"}, + {file = "asgiref-3.11.1.tar.gz", hash = "sha256:5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce"}, ] [package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] +tests = ["mypy (>=1.14.0)", "pytest", "pytest-asyncio"] [[package]] name = "asttokens" @@ -31,6 +33,7 @@ version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, @@ -40,8 +43,8 @@ files = [ six = ">=1.12.0" [package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +astroid = ["astroid (>=1,<2) ; python_version < \"3\"", "astroid (>=2,<4) ; python_version >= \"3\""] +test = ["astroid (>=1,<2) ; python_version < \"3\"", "astroid (>=2,<4) ; python_version >= \"3\"", "pytest"] [[package]] name = "babel" @@ -49,6 +52,7 @@ version = "2.15.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, @@ -63,6 +67,7 @@ version = "1.0" description = "Backport of new features in Python's tempfile module" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "backports.tempfile-1.0-py2.py3-none-any.whl", hash = "sha256:05aa50940946f05759696156a8c39be118169a0e0f94a49d0bb106503891ff54"}, {file = "backports.tempfile-1.0.tar.gz", hash = "sha256:1c648c452e8770d759bdc5a5e2431209be70d25484e1be24876cf2168722c762"}, @@ -77,6 +82,7 @@ version = "1.0.post1" description = "Backport of new features in Python's weakref module" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "backports.weakref-1.0.post1-py2.py3-none-any.whl", hash = "sha256:81bc9b51c0abc58edc76aefbbc68c62a787918ffe943a37947e162c3f8e19e82"}, {file = "backports.weakref-1.0.post1.tar.gz", hash = "sha256:bc4170a29915f8b22c9e7c4939701859650f2eb84184aee80da329ac0b9825c2"}, @@ -88,6 +94,7 @@ version = "4.1.3" description = "Modern password hashing for your software and your servers" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "bcrypt-4.1.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:48429c83292b57bf4af6ab75809f8f4daf52aa5d480632e53707805cc1ce9b74"}, {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a8bea4c152b91fd8319fef4c6a790da5c07840421c2b785084989bf8bbb7455"}, @@ -128,6 +135,7 @@ version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, @@ -162,7 +170,7 @@ platformdirs = ">=2" [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +d = ["aiohttp (>=3.7.4) ; sys_platform != \"win32\" or implementation_name != \"pypy\"", "aiohttp (>=3.7.4,!=3.9.0) ; sys_platform == \"win32\" and implementation_name == \"pypy\""] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -172,6 +180,7 @@ version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, @@ -183,6 +192,7 @@ version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, @@ -247,6 +257,7 @@ version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -258,6 +269,7 @@ version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" +groups = ["dev"] files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, @@ -357,6 +369,7 @@ version = "2.3.2" description = "Interact with shell locally or over different connection types (telnet, ssh, serial, adb)" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "citizenshell-2.3.2-py2-none-any.whl", hash = "sha256:b8e60a19013d6f46f01f085ca7bf85ad1a423ee58bfcdc9b7ab24e66ab9cb2f1"}, {file = "citizenshell-2.3.2.tar.gz", hash = "sha256:d67b2f631943c7d8d28a16395939f46ec162adffd221ff40e0d661597508a323"}, @@ -376,6 +389,7 @@ version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, @@ -390,6 +404,8 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] +markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -401,6 +417,7 @@ version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, @@ -455,6 +472,7 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -466,6 +484,7 @@ version = "0.3.8" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, @@ -473,23 +492,24 @@ files = [ [[package]] name = "django" -version = "5.0.6" +version = "6.0.3" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false -python-versions = ">=3.10" +python-versions = ">=3.12" +groups = ["main"] files = [ - {file = "Django-5.0.6-py3-none-any.whl", hash = "sha256:8363ac062bb4ef7c3f12d078f6fa5d154031d129a15170a1066412af49d30905"}, - {file = "Django-5.0.6.tar.gz", hash = "sha256:ff1b61005004e476e0aeea47c7f79b85864c70124030e95146315396f1e7951f"}, + {file = "django-6.0.3-py3-none-any.whl", hash = "sha256:2e5974441491ddb34c3f13d5e7a9f97b07ba03bf70234c0a9c68b79bbb235bc3"}, + {file = "django-6.0.3.tar.gz", hash = "sha256:90be765ee756af8a6cbd6693e56452404b5ad15294f4d5e40c0a55a0f4870fe1"}, ] [package.dependencies] -asgiref = ">=3.7.0,<4" -sqlparse = ">=0.3.1" +asgiref = ">=3.9.1" +sqlparse = ">=0.5.0" tzdata = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] -argon2 = ["argon2-cffi (>=19.1.0)"] -bcrypt = ["bcrypt"] +argon2 = ["argon2-cffi (>=23.1.0)"] +bcrypt = ["bcrypt (>=4.1.1)"] [[package]] name = "docutils" @@ -497,6 +517,7 @@ version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, @@ -508,13 +529,14 @@ version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] [[package]] name = "filelock" @@ -522,6 +544,7 @@ version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, @@ -530,7 +553,7 @@ files = [ [package.extras] docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] -typing = ["typing-extensions (>=4.8)"] +typing = ["typing-extensions (>=4.8) ; python_version < \"3.11\""] [[package]] name = "identify" @@ -538,6 +561,7 @@ version = "2.5.36" description = "File identification library for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, @@ -552,6 +576,7 @@ version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, @@ -563,6 +588,7 @@ version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] files = [ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, @@ -574,6 +600,7 @@ version = "0.13.13" description = "IPython-enabled pdb" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] files = [ {file = "ipdb-0.13.13-py3-none-any.whl", hash = "sha256:45529994741c4ab6d2388bfa5d7b725c2cf7fe9deffabdb8a6113aa5ed449ed4"}, {file = "ipdb-0.13.13.tar.gz", hash = "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726"}, @@ -589,6 +616,7 @@ version = "8.25.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" +groups = ["dev"] files = [ {file = "ipython-8.25.0-py3-none-any.whl", hash = "sha256:53eee7ad44df903a06655871cbab66d156a051fd86f3ec6750470ac9604ac1ab"}, {file = "ipython-8.25.0.tar.gz", hash = "sha256:c6ed726a140b6e725b911528f80439c534fac915246af3efc39440a6b0f9d716"}, @@ -608,7 +636,7 @@ traitlets = ">=5.13.0" [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing-extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -625,6 +653,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -639,6 +668,7 @@ version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, @@ -658,6 +688,7 @@ version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, @@ -675,6 +706,7 @@ version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, @@ -744,6 +776,7 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, @@ -758,6 +791,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -769,6 +803,7 @@ version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -780,6 +815,7 @@ version = "24.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -791,6 +827,7 @@ version = "3.4.0" description = "SSH2 protocol library" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "paramiko-3.4.0-py3-none-any.whl", hash = "sha256:43f0b51115a896f9c00f59618023484cb3a14b98bbceab43394a39c6739b7ee7"}, {file = "paramiko-3.4.0.tar.gz", hash = "sha256:aac08f26a31dc4dffd92821527d1682d99d52f9ef6851968114a8728f3c274d3"}, @@ -802,8 +839,8 @@ cryptography = ">=3.3" pynacl = ">=1.5" [package.extras] -all = ["gssapi (>=1.4.1)", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] -gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] +all = ["gssapi (>=1.4.1) ; platform_system != \"Windows\"", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8) ; platform_system == \"Windows\""] +gssapi = ["gssapi (>=1.4.1) ; platform_system != \"Windows\"", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8) ; platform_system == \"Windows\""] invoke = ["invoke (>=2.0)"] [[package]] @@ -812,6 +849,7 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -827,6 +865,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -838,6 +877,8 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, @@ -852,6 +893,7 @@ version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, @@ -868,6 +910,7 @@ version = "3.7.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, @@ -886,6 +929,7 @@ version = "3.0.47" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" +groups = ["dev"] files = [ {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, @@ -900,6 +944,7 @@ version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, @@ -981,6 +1026,8 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -992,6 +1039,7 @@ version = "0.2.2" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, @@ -1006,6 +1054,7 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -1017,6 +1066,7 @@ version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, @@ -1031,6 +1081,7 @@ version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, @@ -1057,6 +1108,7 @@ version = "3.5" description = "Python Serial Port Extension" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, @@ -1071,6 +1123,7 @@ version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, @@ -1131,6 +1184,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -1152,6 +1206,7 @@ version = "0.15.0" description = "scp module for paramiko" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "scp-0.15.0-py2.py3-none-any.whl", hash = "sha256:9e7f721e5ac563c33eb0831d0f949c6342f1c28c3bdc3b02f39d77b5ea20df7e"}, {file = "scp-0.15.0.tar.gz", hash = "sha256:f1b22e9932123ccf17eebf19e0953c6e9148f589f93d91b872941a696305c83f"}, @@ -1166,6 +1221,7 @@ version = "70.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "setuptools-70.1.0-py3-none-any.whl", hash = "sha256:d9b8b771455a97c8a9f3ab3448ebe0b29b5e105f1228bba41028be116985a267"}, {file = "setuptools-70.1.0.tar.gz", hash = "sha256:01a1e793faa5bd89abc851fa15d0a0db26f160890c7102cd8dce643e886b47f5"}, @@ -1173,7 +1229,7 @@ files = [ [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov ; platform_python_implementation != \"PyPy\"", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-ruff (>=0.3.2) ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -1181,6 +1237,7 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["dev"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1192,6 +1249,7 @@ version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, @@ -1203,6 +1261,7 @@ version = "7.3.7" description = "Python documentation generator" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, @@ -1237,6 +1296,7 @@ version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, @@ -1253,6 +1313,7 @@ version = "1.0.6" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, @@ -1269,6 +1330,7 @@ version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, @@ -1285,6 +1347,7 @@ version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, @@ -1299,6 +1362,7 @@ version = "1.0.7" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, @@ -1315,6 +1379,7 @@ version = "1.1.10" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, @@ -1331,6 +1396,7 @@ version = "0.5.0" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, @@ -1346,6 +1412,7 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, @@ -1365,6 +1432,7 @@ version = "2.4.0" description = "ANSI color formatting for output in terminal" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, @@ -1379,6 +1447,7 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -1394,6 +1463,8 @@ version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] +markers = "sys_platform == \"win32\"" files = [ {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, @@ -1405,6 +1476,7 @@ version = "4.0.3" description = "URI parsing, classification and composition" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "uritools-4.0.3-py3-none-any.whl", hash = "sha256:bae297d090e69a0451130ffba6f2f1c9477244aa0a5543d66aed2d9f77d0dd9c"}, {file = "uritools-4.0.3.tar.gz", hash = "sha256:ee06a182a9c849464ce9d5fa917539aacc8edd2a4924d1b7aabeeecabcae3bc2"}, @@ -1416,13 +1488,14 @@ version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -1433,6 +1506,7 @@ version = "20.26.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, @@ -1445,7 +1519,7 @@ platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "wcwidth" @@ -1453,12 +1527,13 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.12" -content-hash = "16a2e954b45c222a1598c97547b23a9904d3c216b144498570003a3fe352639f" +content-hash = "fb0a42ccf52c0704d3ddc78949bdb62dd9c73f277ea0fd3685d3266a3fe906b6" diff --git a/pyproject.toml b/pyproject.toml index fdc1b6c..83ecf2a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.12" -django = "^5.0.4" +django = ">=4.0,<7.0" [tool.poetry.group.dev.dependencies] black = "^24.4.2"