pax_global_header 0000666 0000000 0000000 00000000064 14527504627 0014526 g ustar 00root root 0000000 0000000 52 comment=c45ab0ac9216bb6595d655400e4e7dcf0d05b506
klaasnicolaas-python-gridnet-c45ab0a/ 0000775 0000000 0000000 00000000000 14527504627 0017765 5 ustar 00root root 0000000 0000000 klaasnicolaas-python-gridnet-c45ab0a/.devcontainer/ 0000775 0000000 0000000 00000000000 14527504627 0022524 5 ustar 00root root 0000000 0000000 klaasnicolaas-python-gridnet-c45ab0a/.devcontainer/devcontainer.json 0000664 0000000 0000000 00000004712 14527504627 0026104 0 ustar 00root root 0000000 0000000 {
"name": "${containerWorkspaceFolderBasename}",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"customizations": {
"codespaces": {
"openFiles": ["README.md"]
},
"vscode": {
"extensions": [
"GitHub.copilot",
"GitHub.vscode-github-actions",
"GitHub.vscode-pull-request-github",
"Tyriar.sort-lines",
"charliermarsh.ruff",
"esbenp.prettier-vscode",
"mhutchie.git-graph",
"ms-python.python",
"oderwat.indent-rainbow",
"redhat.vscode-yaml",
"ryanluker.vscode-coverage-gutters"
],
"settings": {
"[python]": {
"editor.codeActionsOnSave": {
"source.fixAll": true,
"source.organizeImports": true
}
},
"coverage-gutters.customizable.context-menu": true,
"coverage-gutters.customizable.status-bar-toggler-watchCoverageAndVisibleEditors-enabled": true,
"coverage-gutters.showGutterCoverage": false,
"coverage-gutters.showLineCoverage": true,
"coverage-gutters.xmlname": "coverage.xml",
"python.analysis.extraPaths": ["${workspaceFolder}/src"],
"python.defaultInterpreterPath": ".venv/bin/python",
"python.formatting.provider": "black",
"python.linting.enabled": true,
"python.linting.mypyEnabled": true,
"python.linting.pylintEnabled": true,
"python.testing.cwd": "${workspaceFolder}",
"python.testing.pytestArgs": ["--cov-report=xml"],
"python.testing.pytestEnabled": true,
"ruff.importStrategy": "fromEnvironment",
"ruff.interpreter": [".venv/bin/python"],
"terminal.integrated.defaultProfile.linux": "zsh"
}
}
},
"features": {
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/devcontainers-contrib/features/poetry:2": {},
"ghcr.io/devcontainers-contrib/features/pre-commit:2": {},
"ghcr.io/devcontainers/features/common-utils:2": {
"installOhMyZsh": true
},
"ghcr.io/devcontainers-contrib/features/zsh-plugins:0": {
"plugins": "git zsh-autosuggestions zsh-syntax-highlighting zsh-completions",
"omzPlugins": "https://github.com/zsh-users/zsh-autosuggestions.git https://github.com/zsh-users/zsh-syntax-highlighting.git https://github.com/zsh-users/zsh-completions.git"
},
"ghcr.io/devcontainers/features/python:1": {
"installTools": false
}
}
}
klaasnicolaas-python-gridnet-c45ab0a/.gitattributes 0000664 0000000 0000000 00000000052 14527504627 0022655 0 ustar 00root root 0000000 0000000 * text=auto eol=lf
*.py whitespace=error
klaasnicolaas-python-gridnet-c45ab0a/.github/ 0000775 0000000 0000000 00000000000 14527504627 0021325 5 ustar 00root root 0000000 0000000 klaasnicolaas-python-gridnet-c45ab0a/.github/CODEOWNERS 0000664 0000000 0000000 00000000031 14527504627 0022712 0 ustar 00root root 0000000 0000000 .github/* @klaasnicolaas
klaasnicolaas-python-gridnet-c45ab0a/.github/FUNDING.yml 0000664 0000000 0000000 00000000032 14527504627 0023135 0 ustar 00root root 0000000 0000000 ---
github: klaasnicolaas
klaasnicolaas-python-gridnet-c45ab0a/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 14527504627 0023510 5 ustar 00root root 0000000 0000000 klaasnicolaas-python-gridnet-c45ab0a/.github/ISSUE_TEMPLATE/bug_report.yml 0000664 0000000 0000000 00000003070 14527504627 0026403 0 ustar 00root root 0000000 0000000 ---
name: ๐ Bug Report
description: File a bug/issue
title: "
"
labels:
- bug
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please search to see if an issue already exists for the bug you encountered.
options:
- label: I have searched the existing issues
required: true
- type: textarea
attributes:
label: Current Behavior
description: A concise description of what you're experiencing.
validations:
required: false
- type: textarea
attributes:
label: Expected Behavior
description: A concise description of what you expected to happen.
validations:
required: false
- type: textarea
attributes:
label: Steps To Reproduce
description: Steps to reproduce the behavior.
placeholder: |
1. In this environment...
2. With this config...
3. Run '...'
4. See error...
validations:
required: false
- type: textarea
attributes:
label: Environment
description: |
Please describe your execution environment providing as much detail as possible
render: Markdown
validations:
required: false
- type: textarea
attributes:
label: Anything else?
description: |
Links? References? Anything that will give us more context about the issue you are encountering!
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
validations:
required: false
klaasnicolaas-python-gridnet-c45ab0a/.github/ISSUE_TEMPLATE/config.yml 0000664 0000000 0000000 00000000402 14527504627 0025474 0 ustar 00root root 0000000 0000000 ---
blank_issues_enabled: true
contact_links:
- name: โ Ask a Question
url: https://github.com/klaasnicolaas/python-gridnet/discussions/new/choose
about: We use GitHub issues for tracking bugs / feature requests, check discussions for questions.
klaasnicolaas-python-gridnet-c45ab0a/.github/ISSUE_TEMPLATE/feature_request.yml 0000664 0000000 0000000 00000002267 14527504627 0027445 0 ustar 00root root 0000000 0000000 ---
name: ๐ Feature Request
description: Request a new feature or enhancement
title: ""
labels:
- enhancement
- new-feature
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please search to see if an issue already exists for the feature you want.
options:
- label: I have searched the existing issues
required: true
- type: textarea
attributes:
label: How would this feature be useful?
description: Describe any use cases this solves or frustrations it alleviates.
validations:
required: false
- type: textarea
attributes:
label: Describe the solution you'd like
description: If you have an idea on how to do this, let us know here!
validations:
required: false
- type: textarea
attributes:
label: Describe alternatives you've considered
description: If there's some workaround or alternative solutions, let us know here!
validations:
required: false
- type: textarea
attributes:
label: Anything else?
description: Any other relevant information or background.
validations:
required: false
klaasnicolaas-python-gridnet-c45ab0a/.github/PULL_REQUEST_TEMPLATE.md 0000664 0000000 0000000 00000001410 14527504627 0025122 0 ustar 00root root 0000000 0000000 ## Proposed change
## Additional information
- This PR fixes or closes issue: fixes #
## Checklist
- [ ] I have updated the documentation if needed.
- [ ] I have updated the tests if needed.
klaasnicolaas-python-gridnet-c45ab0a/.github/labels.yml 0000664 0000000 0000000 00000006243 14527504627 0023317 0 ustar 00root root 0000000 0000000 ---
- name: "breaking-change"
color: d93f0b
description: "A breaking change for existing users."
- name: "bug"
color: fc2929
description: "Inconsistencies or issues which will cause a problem for users."
- name: "bugfix"
color: ededed
description: "Fixing a bug."
- name: "documentation"
color: 0052cc
description: "Solely about the documentation of the project."
- name: "enhancement"
color: 1d76db
description: "Enhancement of the code, not introducing new features."
- name: "refactor"
color: 1d76db
description: "Improvement of existing code, not introducing new features."
- name: "performance"
color: 1d76db
description: "Improving performance, not introducing new features."
- name: "new-feature"
color: 0e8a16
description: "New features or request."
- name: "maintenance"
color: 2af79e
description: "Generic maintenance tasks."
- name: "ci"
color: 1d76db
description: "Work that improves the continue integration."
- name: "dependencies"
color: 1d76db
description: "Upgrade or downgrade of project dependencies."
- name: "in-progress"
color: fbca04
description: "Issue is currently being resolved by a developer."
- name: "stale"
color: fef2c0
description: "There has not been activity on this issue or PR for quite some time."
- name: "no-stale"
color: fef2c0
description: "This issue or PR is exempted from the stable bot."
- name: "wontfix"
color: ffffff
description: "This issue or PR will not be fixed."
- name: "cleanup"
color: ef75d5
description: "Cleanup of code."
- name: "sync"
color: 00a6ed
description: "Syncing with upstream github config repository."
- name: "security"
color: ee0701
description: "Marks a security issue that needs to be resolved asap."
- name: "incomplete"
color: fef2c0
description: "Marks a PR or issue that is missing information."
- name: "invalid"
color: fef2c0
description: "Marks a PR or issue that is missing information."
- name: "duplicate"
color: cfd3d7
description: "This issue or pull request already exists."
- name: "beginner-friendly"
color: 0e8a16
description: "Good first issue for people wanting to contribute to the project."
- name: "help-wanted"
color: 0e8a16
description: "We need some extra helping hands or expertise in order to resolve this."
- name: "hacktoberfest"
description: "Issues/PRs are participating in the Hacktoberfest."
color: fbca04
- name: "hacktoberfest-accepted"
description: "Issues/PRs are participating in the Hacktoberfest."
color: fbca04
- name: "priority-critical"
color: ee0701
description: "This should be dealt with ASAP. Not fixing this issue would be a serious error."
- name: "priority-high"
color: b60205
description: "After critical issues are fixed, these should be dealt with before any further issues."
- name: "priority-medium"
color: 0e8a16
description: "This issue may be useful, and needs some attention."
- name: "priority-low"
color: e4ea8a
description: "Nice addition, maybe... someday..."
- name: "major"
color: b60205
description: "This PR causes a major version bump in the version number."
- name: "minor"
color: 0e8a16
description: "This PR causes a minor version bump in the version number."
klaasnicolaas-python-gridnet-c45ab0a/.github/release-drafter.yml 0000664 0000000 0000000 00000002275 14527504627 0025123 0 ustar 00root root 0000000 0000000 ---
name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"
change-template: "- #$NUMBER $TITLE @$AUTHOR"
sort-direction: ascending
categories:
- title: "๐จ Breaking changes"
labels:
- "breaking-change"
- title: "โจ New features"
labels:
- "new-feature"
- title: "๐ Bug fixes"
labels:
- "bugfix"
- title: "๐ Enhancements"
labels:
- "enhancement"
- "refactor"
- "performance"
- title: "๐งฐ Maintenance"
labels:
- "maintenance"
- "ci"
- title: "๐ Documentation"
labels:
- "documentation"
- title: "โฌ๏ธ Dependency updates"
collapse-after: 5
labels:
- "dependencies"
exclude-labels:
- "sync"
version-resolver:
major:
labels:
- "major"
- "breaking-change"
minor:
labels:
- "minor"
- "new-feature"
patch:
labels:
- "bugfix"
- "chore"
- "ci"
- "dependencies"
- "documentation"
- "enhancement"
- "performance"
- "refactor"
default: patch
template: |
## What's changed
$CHANGES
**Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION
klaasnicolaas-python-gridnet-c45ab0a/.github/renovate.json 0000664 0000000 0000000 00000002070 14527504627 0024042 0 ustar 00root root 0000000 0000000 {
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"timezone": "Europe/Amsterdam",
"schedule": ["before 6am every weekday"],
"rebaseWhen": "behind-base-branch",
"dependencyDashboard": true,
"labels": ["dependencies"],
"lockFileMaintenance": {
"enabled": true,
"automerge": true
},
"commitMessagePrefix": "โฌ๏ธ",
"packageRules": [
{
"matchManagers": ["poetry"],
"addLabels": ["python"]
},
{
"matchManagers": ["poetry"],
"matchDepTypes": ["dev"],
"rangeStrategy": "pin"
},
{
"matchManagers": ["poetry"],
"matchUpdateTypes": ["minor", "patch"],
"automerge": true
},
{
"matchManagers": ["github-actions"],
"addLabels": ["github_actions"],
"rangeStrategy": "pin",
"extractVersion": "^(?v\\d+\\.\\d+\\.\\d+)$",
"versioning": "regex:^v(?\\d+)(\\.(?\\d+)\\.(?\\d+))?$"
},
{
"matchManagers": ["github-actions"],
"matchUpdateTypes": ["minor", "patch"],
"automerge": true
}
]
}
klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/ 0000775 0000000 0000000 00000000000 14527504627 0023362 5 ustar 00root root 0000000 0000000 klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/codeql.yaml 0000664 0000000 0000000 00000000766 14527504627 0025526 0 ustar 00root root 0000000 0000000 ---
name: "CodeQL"
# yamllint disable-line rule:truthy
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: "30 1 * * 0"
jobs:
codeql:
name: Scanning
runs-on: ubuntu-latest
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Initialize CodeQL
uses: github/codeql-action/init@v2.22.7
- name: ๐ Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2.22.7
klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/labels.yaml 0000664 0000000 0000000 00000001012 14527504627 0025502 0 ustar 00root root 0000000 0000000 ---
name: Sync labels
# yamllint disable-line rule:truthy
on:
push:
branches:
- main
paths:
- .github/labels.yml
workflow_dispatch:
jobs:
labels:
name: โป๏ธ Sync labels
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Run Label Syncer
uses: micnncim/action-label-syncer@v1.3.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/linting.yaml 0000664 0000000 0000000 00000014115 14527504627 0025714 0 ustar 00root root 0000000 0000000 ---
name: Linting
# yamllint disable-line rule:truthy
on:
push:
pull_request:
workflow_dispatch:
env:
DEFAULT_PYTHON: "3.11"
jobs:
codespell:
name: codespell
runs-on: ubuntu-latest
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Set up Poetry
run: pipx install poetry
- name: ๐ Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache: "poetry"
- name: ๐ Install workflow dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
- name: ๐ Install Python dependencies
run: poetry install --no-interaction
- name: ๐ Check code for common misspellings
run: poetry run pre-commit run codespell --all-files
ruff:
name: Ruff
runs-on: ubuntu-latest
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Set up Poetry
run: pipx install poetry
- name: ๐ Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache: "poetry"
- name: ๐ Install workflow dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
- name: ๐ Install Python dependencies
run: poetry install --no-interaction
- name: ๐ Run Ruff linter
run: poetry run ruff check --output-format=github .
- name: ๐ Run Ruff formatter
run: poetry run ruff format --check .
black:
name: black
runs-on: ubuntu-latest
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Set up Poetry
run: pipx install poetry
- name: ๐ Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache: "poetry"
- name: ๐ Install workflow dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
- name: ๐ Install Python dependencies
run: poetry install --no-interaction
- name: ๐ Run black on docs
run: poetry run blacken-docs
pre-commit-hooks:
name: pre-commit-hooks
runs-on: ubuntu-latest
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Set up Poetry
run: pipx install poetry
- name: ๐ Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache: "poetry"
- name: ๐ Install workflow dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
- name: ๐ Install Python dependencies
run: poetry install --no-interaction
- name: ๐ Check Python AST
run: poetry run pre-commit run check-ast --all-files
- name: ๐ Check for case conflicts
run: poetry run pre-commit run check-case-conflict --all-files
- name: ๐ Check docstring is first
run: poetry run pre-commit run check-docstring-first --all-files
- name: ๐ Check that executables have shebangs
run: poetry run pre-commit run check-executables-have-shebangs --all-files
- name: ๐ Check JSON files
run: poetry run pre-commit run check-json --all-files
- name: ๐ Check for merge conflicts
run: poetry run pre-commit run check-merge-conflict --all-files
- name: ๐ Check for broken symlinks
run: poetry run pre-commit run check-symlinks --all-files
- name: ๐ Check TOML files
run: poetry run pre-commit run check-toml --all-files
- name: ๐ Check XML files
run: poetry run pre-commit run check-xml --all-files
- name: ๐ Check YAML files
run: poetry run pre-commit run check-yaml --all-files
- name: ๐ Detect Private Keys
run: poetry run pre-commit run detect-private-key --all-files
- name: ๐ Check End of Files
run: poetry run pre-commit run end-of-file-fixer --all-files
- name: ๐ Trim Trailing Whitespace
run: poetry run pre-commit run trailing-whitespace --all-files
pylint:
name: pylint
runs-on: ubuntu-latest
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Set up Poetry
run: pipx install poetry
- name: ๐ Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache: "poetry"
- name: ๐ Install workflow dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
- name: ๐ Install Python dependencies
run: poetry install --no-interaction
- name: ๐ Run pylint
run: poetry run pre-commit run pylint --all-files
yamllint:
name: yamllint
runs-on: ubuntu-latest
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Set up Poetry
run: pipx install poetry
- name: ๐ Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache: "poetry"
- name: ๐ Install workflow dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
- name: ๐ Install Python dependencies
run: poetry install --no-interaction
- name: ๐ Run yamllint
run: poetry run yamllint .
klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/lock.yaml 0000664 0000000 0000000 00000000665 14527504627 0025205 0 ustar 00root root 0000000 0000000 ---
name: Lock
# yamllint disable-line rule:truthy
on:
schedule:
- cron: "0 4 * * *"
workflow_dispatch:
jobs:
lock:
name: ๐ Lock closed issues and PRs
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v5.0.1
with:
github-token: ${{ github.token }}
issue-inactive-days: "30"
issue-lock-reason: ""
pr-inactive-days: "1"
pr-lock-reason: ""
klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/pr-labels.yaml 0000664 0000000 0000000 00000001310 14527504627 0026122 0 ustar 00root root 0000000 0000000 ---
name: PR Labels
# yamllint disable-line rule:truthy
on:
pull_request_target:
types:
- opened
- labeled
- unlabeled
- synchronize
workflow_call:
jobs:
pr_labels:
name: Verify
runs-on: ubuntu-latest
steps:
- name: ๐ท Verify PR has a valid label
uses: jesusvasquez333/verify-pr-label-action@v1.4.0
with:
pull-request-number: "${{ github.event.pull_request.number }}"
github-token: "${{ secrets.GITHUB_TOKEN }}"
valid-labels: >-
breaking-change, bugfix, documentation, enhancement, sync,
refactor, performance, new-feature, maintenance, ci, dependencies
disable-reviews: true
klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/release-drafter.yaml 0000664 0000000 0000000 00000000676 14527504627 0027324 0 ustar 00root root 0000000 0000000 ---
name: Release Drafter
# yamllint disable-line rule:truthy
on:
push:
branches:
- main
workflow_dispatch:
jobs:
update_release_draft:
name: โ๏ธ Draft release
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: read
steps:
- name: ๐ Run Release Drafter
uses: release-drafter/release-drafter@v5.25.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/release.yaml 0000664 0000000 0000000 00000004442 14527504627 0025672 0 ustar 00root root 0000000 0000000 ---
name: Release
# yamllint disable rule:line-length
# yamllint disable-line rule:truthy
on:
release:
types:
- published
env:
DEFAULT_PYTHON: "3.11"
jobs:
release:
name: Releasing to PyPi
runs-on: ubuntu-latest
environment: release
permissions:
id-token: write
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Set up Poetry
run: pipx install poetry
- name: ๐ Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache: "poetry"
- name: ๐ Install workflow dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
- name: ๐ Install dependencies
run: poetry install --no-interaction
- name: ๐ Set package version
run: |
version="${{ github.event.release.tag_name }}"
version="${version,,}"
version="${version#v}"
poetry version --no-interaction "${version}"
- name: ๐ Build package
run: poetry build --no-interaction
- name: ๐ Publish package to PyPi
uses: pypa/gh-action-pypi-publish@release/v1
twitter:
name: ๐ฆ Tweet the release
runs-on: ubuntu-latest
needs: release
steps:
- uses: Eomm/why-don-t-you-tweet@v1.1.0
with:
# GitHub event payload
# https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release
tweet-message: |
โฌ๏ธ ${{ github.event.release.tag_name }} of ${{ github.event.repository.name }} just released ๐ #update @klaasnicolaas #python #package #net2grid #energy #release #bot #assistant
Check out the release notes here: ${{ github.event.release.html_url }}
env:
# Get your tokens from https://developer.twitter.com/apps
TWITTER_CONSUMER_API_KEY: ${{ secrets.TWITTER_CONSUMER_API_KEY }}
TWITTER_CONSUMER_API_SECRET: ${{ secrets.TWITTER_CONSUMER_API_SECRET }}
TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }}
TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/stale.yaml 0000664 0000000 0000000 00000002554 14527504627 0025364 0 ustar 00root root 0000000 0000000 ---
name: Stale
# yamllint disable-line rule:truthy
on:
schedule:
- cron: "0 3 * * *"
workflow_dispatch:
jobs:
stale:
name: ๐งน Clean up stale issues and PRs
runs-on: ubuntu-latest
steps:
- name: ๐ Run stale
uses: actions/stale@v8
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 30
days-before-close: 7
remove-stale-when-updated: true
stale-issue-label: "stale"
exempt-issue-labels: "no-stale,help-wanted"
stale-issue-message: >
There hasn't been any activity on this issue recently, so we
clean up some of the older and inactive issues.
Please make sure to update to the latest version and
check if that solves the issue. Let us know if that works for you
by leaving a comment ๐
This issue has now been marked as stale and will be closed if no
further activity occurs. Thanks!
stale-pr-label: "stale"
exempt-pr-labels: "no-stale"
stale-pr-message: >
There hasn't been any activity on this pull request recently. This
pull request has been automatically marked as stale because of that
and will be closed if no further activity occurs within 7 days.
Thank you for your contributions.
klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/tests.yaml 0000664 0000000 0000000 00000004227 14527504627 0025415 0 ustar 00root root 0000000 0000000 ---
name: Testing
# yamllint disable-line rule:truthy
on:
push:
pull_request:
workflow_dispatch:
env:
DEFAULT_PYTHON: "3.11"
jobs:
pytest:
name: Python ${{ matrix.python }}
runs-on: ubuntu-latest
strategy:
matrix:
python: ["3.11", "3.12"]
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Set up Poetry
run: pipx install poetry
- name: ๐ Set up Python ${{ matrix.python }}
id: python
uses: actions/setup-python@v4.7.1
with:
python-version: ${{ matrix.python }}
cache: "poetry"
- name: ๐ Install workflow dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
- name: ๐ Install dependencies
run: poetry install --no-interaction
- name: ๐ Run pytest
run: poetry run pytest --cov src tests
- name: โฌ๏ธ Upload coverage artifact
uses: actions/upload-artifact@v3.1.3
with:
name: coverage-${{ matrix.python }}
path: .coverage
coverage:
runs-on: ubuntu-latest
needs: pytest
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
with:
fetch-depth: 0
- name: โฌ๏ธ Download coverage data
uses: actions/download-artifact@v3.0.2
- name: ๐ Set up Poetry
run: pipx install poetry
- name: ๐ Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache: "poetry"
- name: ๐ Install workflow dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
- name: ๐ Install dependencies
run: poetry install --no-interaction
- name: ๐ Process coverage results
run: |
poetry run coverage combine coverage*/.coverage*
poetry run coverage xml -i
- name: ๐ Upload coverage report
uses: codecov/codecov-action@v3.1.4
klaasnicolaas-python-gridnet-c45ab0a/.github/workflows/typing.yaml 0000664 0000000 0000000 00000001573 14527504627 0025566 0 ustar 00root root 0000000 0000000 ---
name: Typing
# yamllint disable-line rule:truthy
on:
push:
pull_request:
workflow_dispatch:
env:
DEFAULT_PYTHON: "3.11"
jobs:
mypy:
name: mypy
runs-on: ubuntu-latest
steps:
- name: โคต๏ธ Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: ๐ Set up Poetry
run: pipx install poetry
- name: ๐ Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
with:
python-version: ${{ env.DEFAULT_PYTHON }}
cache: "poetry"
- name: ๐ Install workflow dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
- name: ๐ Install dependencies
run: poetry install --no-interaction
- name: ๐ Run mypy
run: poetry run mypy examples src tests
klaasnicolaas-python-gridnet-c45ab0a/.gitignore 0000664 0000000 0000000 00000003323 14527504627 0021756 0 ustar 00root root 0000000 0000000 # Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
# Visual Studio Code
.vscode
# ruff
.ruff_cache
# Pyre type checker
.pyre/
setup.py
.python-version
klaasnicolaas-python-gridnet-c45ab0a/.pre-commit-config.yaml 0000664 0000000 0000000 00000010054 14527504627 0024246 0 ustar 00root root 0000000 0000000 ---
repos:
- repo: local
hooks:
- id: ruff-check
name: ๐ถ Ruff Linter
language: system
types: [python]
entry: poetry run ruff check --fix
require_serial: true
stages: [commit, push, manual]
- id: ruff-format
name: ๐ถ Ruff Formatter
language: system
types: [python]
entry: poetry run ruff format
require_serial: true
stages: [commit, push, manual]
- id: blacken-docs
name: โ๏ธ Format documentation examples using black
language: system
files: '\.(rst|md|markdown|py|tex)$'
entry: poetry run blacken-docs
require_serial: true
- id: check-ast
name: ๐ Check Python AST
language: system
types: [python]
entry: poetry run check-ast
- id: check-case-conflict
name: ๐ Check for case conflicts
language: system
entry: poetry run check-case-conflict
- id: check-docstring-first
name: โน๏ธ Check docstring is first
language: system
types: [python]
entry: poetry run check-docstring-first
- id: check-executables-have-shebangs
name: ๐ง Check that executables have shebangs
language: system
types: [text, executable]
entry: poetry run check-executables-have-shebangs
stages: [commit, push, manual]
- id: check-json
name: ๏ฝ Check JSON files
language: system
types: [json]
entry: poetry run check-json
- id: check-merge-conflict
name: ๐ฅ Check for merge conflicts
language: system
types: [text]
entry: poetry run check-merge-conflict
- id: check-symlinks
name: ๐ Check for broken symlinks
language: system
types: [symlink]
entry: poetry run check-symlinks
- id: check-toml
name: โ
Check TOML files
language: system
types: [toml]
entry: poetry run check-toml
- id: check-xml
name: โ
Check XML files
entry: poetry run check-xml
language: system
types: [xml]
- id: check-yaml
name: โ
Check YAML files
language: system
types: [yaml]
entry: poetry run check-yaml
- id: codespell
name: โ
Check code for common misspellings
language: system
types: [text]
exclude: ^poetry\.lock$
entry: poetry run codespell
- id: detect-private-key
name: ๐ต๏ธ Detect Private Keys
language: system
types: [text]
entry: poetry run detect-private-key
- id: end-of-file-fixer
name: โฎ Fix End of Files
language: system
types: [text]
entry: poetry run end-of-file-fixer
stages: [commit, push, manual]
- id: mypy
name: ๐ Static type checking using mypy
language: system
types: [python]
entry: poetry run mypy
- id: no-commit-to-branch
name: ๐ Don't commit to main branch
language: system
entry: poetry run no-commit-to-branch
pass_filenames: false
always_run: true
args:
- --branch=main
- id: poetry
name: ๐ Check pyproject with Poetry
language: system
entry: poetry check
pass_filenames: false
always_run: true
- id: pylint
name: ๐ Starring code with pylint
language: system
types: [python]
entry: poetry run pylint
- id: pytest
name: ๐งช Running tests and test coverage with pytest
language: system
types: [python]
entry: poetry run pytest
pass_filenames: false
- id: trailing-whitespace
name: โ Trim Trailing Whitespace
language: system
types: [text]
entry: poetry run trailing-whitespace-fixer
stages: [commit, push, manual]
- id: yamllint
name: ๐ Check YAML files with yamllint
language: system
types: [yaml]
entry: poetry run yamllint
klaasnicolaas-python-gridnet-c45ab0a/.yamllint 0000664 0000000 0000000 00000002432 14527504627 0021620 0 ustar 00root root 0000000 0000000 ---
ignore: |
.venv/lib
.copier-answers.yml
rules:
braces:
level: error
min-spaces-inside: 0
max-spaces-inside: 1
min-spaces-inside-empty: -1
max-spaces-inside-empty: -1
brackets:
level: error
min-spaces-inside: 0
max-spaces-inside: 0
min-spaces-inside-empty: -1
max-spaces-inside-empty: -1
colons:
level: error
max-spaces-before: 0
max-spaces-after: 1
commas:
level: error
max-spaces-before: 0
min-spaces-after: 1
max-spaces-after: 1
comments:
level: error
require-starting-space: true
min-spaces-from-content: 1
comments-indentation:
level: error
document-end:
level: error
present: false
document-start:
level: error
present: true
empty-lines:
level: error
max: 1
max-start: 0
max-end: 1
hyphens:
level: error
max-spaces-after: 1
indentation:
level: error
spaces: 2
indent-sequences: true
check-multi-line-strings: false
key-duplicates:
level: error
line-length:
level: warning
max: 120
allow-non-breakable-words: true
allow-non-breakable-inline-mappings: true
new-line-at-end-of-file:
level: error
new-lines:
level: error
type: unix
trailing-spaces:
level: error
truthy:
level: error
klaasnicolaas-python-gridnet-c45ab0a/CODE_OF_CONDUCT.md 0000664 0000000 0000000 00000012546 14527504627 0022574 0 ustar 00root root 0000000 0000000 # Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or
advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
hello@student-techlife.com.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][mozilla coc].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][faq]. Translations are available
at [https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
[mozilla coc]: https://github.com/mozilla/diversity
[faq]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
klaasnicolaas-python-gridnet-c45ab0a/CONTRIBUTING.md 0000664 0000000 0000000 00000002231 14527504627 0022214 0 ustar 00root root 0000000 0000000 # Contributing
When contributing to this repository, please first discuss the change you wish
to make via issue, email, or any other method with the owners of this repository
before making a change.
Please note we have a code of conduct, please follow it in all your interactions
with the project.
## Issues and feature requests
You've found a bug in the source code, a mistake in the documentation or maybe
you'd like a new feature? You can help us by submitting an issue to our
[GitHub Repository][github]. Before you create an issue, make sure you search
the archive, maybe your question was already answered.
Even better: You could submit a pull request with a fix / new feature!
## Pull request process
1. Search our repository for open or closed [pull requests][prs] that relates
to your submission. You don't want to duplicate effort.
1. You may merge the pull request in once you have the sign-off of two other
developers, or if you do not have permission to do that, you may request
the second reviewer to merge it for you.
[github]: https://github.com/klaasnicolaas/python-gridnet/issues
[prs]: https://github.com/klaasnicolaas/python-gridnet/pulls
klaasnicolaas-python-gridnet-c45ab0a/LICENSE 0000664 0000000 0000000 00000002065 14527504627 0020775 0 ustar 00root root 0000000 0000000 # MIT License
Copyright (c) 2021-2023 Klaas Schoute
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.
klaasnicolaas-python-gridnet-c45ab0a/README.md 0000664 0000000 0000000 00000016305 14527504627 0021251 0 ustar 00root root 0000000 0000000

[![GitHub Release][releases-shield]][releases]
[![Python Versions][python-versions-shield]][pypi]
![Project Stage][project-stage-shield]
![Project Maintenance][maintenance-shield]
[![License][license-shield]](LICENSE)
[![GitHub Activity][commits-shield]][commits-url]
[![PyPi Downloads][downloads-shield]][downloads-url]
[![GitHub Last Commit][last-commit-shield]][commits-url]
[![Open in Dev Containers][devcontainer-shield]][devcontainer]
[![Code Quality][code-quality-shield]][code-quality]
[![Build Status][build-shield]][build-url]
[![Typing Status][typing-shield]][typing-url]
[![Maintainability][maintainability-shield]][maintainability-url]
[![Code Coverage][codecov-shield]][codecov-url]
Asynchronous Python client for Net2Grid devices.
## About
A python package with which you can read the data from a [NET2GRID][net2grid] device
via a local api. Net2Grid supplies energy hardware to brands, that can market it as a
white label product.
## Supported SmartBridges
- SBWF3102 ([Pure Energie][pure-energie])
## Installation
```bash
pip install gridnet
```
## Usage
```py
import asyncio
from gridnet import GridNet
async def main():
"""Show example on getting data from your device."""
async with GridNet(
host="127.0.0.1",
) as client:
device = await client.device()
smartbridge = await client.smartbridge()
print(device)
print(smartbridge)
if __name__ == "__main__":
asyncio.run(main())
```
## Data
You can read the following data with this package, the `power flow` entity can also
give a negative value. The `energy` entities are total values of both low and high
tariff together.
### Device
- ID
- Model
- Batch
- Firmware version
- Hardware version
- Manufacturer
### SmartBridge
- Power Flow (W)
- Energy Consumption (kWh)
- Energy Production (kWh)
## Contributing
This is an active open-source project. We are always open to people who want to
use the code or contribute to it.
We've set up a separate document for our
[contribution guidelines](CONTRIBUTING.md).
Thank you for being involved! :heart_eyes:
## Setting up development environment
The simplest way to begin is by utilizing the [Dev Container][devcontainer]
feature of Visual Studio Code or by opening a CodeSpace directly on GitHub.
By clicking the button below you immediately start a Dev Container in Visual Studio Code.
[![Open in Dev Containers][devcontainer-shield]][devcontainer]
This Python project relies on [Poetry][poetry] as its dependency manager,
providing comprehensive management and control over project dependencies.
You need at least:
- Python 3.11+
- [Poetry][poetry-install]
Install all packages, including all development requirements:
```bash
poetry install
```
Poetry creates by default an virtual environment where it installs all
necessary pip packages, to enter or exit the venv run the following commands:
```bash
poetry shell
exit
```
Setup the pre-commit check, you must run this inside the virtual environment:
```bash
pre-commit install
```
*Now you're all set to get started!*
As this repository uses the [pre-commit][pre-commit] framework, all changes
are linted and tested with each commit. You can run all checks and tests
manually, using the following command:
```bash
poetry run pre-commit run --all-files
```
To run just the Python tests:
```bash
poetry run pytest
```
## Trademark Legal Notices
All product names, trademarks and registered trademarks in this repository, are
property of their respective owners, and are used by the author for identification
purposes only. The use of these names, trademarks and brands, do not imply endorsement
or affiliation.
## License
MIT License
Copyright (c) 2021-2023 Klaas Schoute
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.
[pure-energie]: https://pure-energie.nl
[net2grid]: https://www.net2grid.com
[build-shield]: https://github.com/klaasnicolaas/python-gridnet/actions/workflows/tests.yaml/badge.svg
[build-url]: https://github.com/klaasnicolaas/python-gridnet/actions/workflows/tests.yaml
[code-quality-shield]: https://github.com/klaasnicolaas/python-gridnet/actions/workflows/codeql.yaml/badge.svg
[code-quality]: https://github.com/klaasnicolaas/python-gridnet/actions/workflows/codeql.yaml
[commits-shield]: https://img.shields.io/github/commit-activity/y/klaasnicolaas/python-gridnet.svg
[commits-url]: https://github.com/klaasnicolaas/python-gridnet/commits/main
[codecov-shield]: https://codecov.io/gh/klaasnicolaas/python-gridnet/branch/main/graph/badge.svg?token=CXCSJBsRPE
[codecov-url]: https://codecov.io/gh/klaasnicolaas/python-gridnet
[devcontainer-shield]: https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode
[devcontainer]: https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/klaasnicolaas/python-gridnet
[downloads-shield]: https://img.shields.io/pypi/dm/gridnet
[downloads-url]: https://pypistats.org/packages/gridnet
[license-shield]: https://img.shields.io/github/license/klaasnicolaas/python-gridnet.svg
[last-commit-shield]: https://img.shields.io/github/last-commit/klaasnicolaas/python-gridnet.svg
[maintenance-shield]: https://img.shields.io/maintenance/yes/2023.svg
[maintainability-shield]: https://api.codeclimate.com/v1/badges/0b3297077cbc525a837e/maintainability
[maintainability-url]: https://codeclimate.com/github/klaasnicolaas/python-gridnet/maintainability
[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg
[pypi]: https://pypi.org/project/gridnet/
[python-versions-shield]: https://img.shields.io/pypi/pyversions/gridnet
[typing-shield]: https://github.com/klaasnicolaas/python-gridnet/actions/workflows/typing.yaml/badge.svg
[typing-url]: https://github.com/klaasnicolaas/python-gridnet/actions/workflows/typing.yaml
[releases-shield]: https://img.shields.io/github/release/klaasnicolaas/python-gridnet.svg
[releases]: https://github.com/klaasnicolaas/python-gridnet/releases
[poetry-install]: https://python-poetry.org/docs/#installation
[poetry]: https://python-poetry.org
[pre-commit]: https://pre-commit.com
klaasnicolaas-python-gridnet-c45ab0a/assets/ 0000775 0000000 0000000 00000000000 14527504627 0021267 5 ustar 00root root 0000000 0000000 klaasnicolaas-python-gridnet-c45ab0a/assets/header_gridnet-min.png 0000664 0000000 0000000 00001012172 14527504627 0025526 0 ustar 00root root 0000000 0000000 PNG
IHDR ช ธด)> gAMA ฑa sRGB ฎฮ้ pHYs PLTEGpL1/"1/"ed^ie\~~}TQK]\Whe^, #;8))"+#% *## +~&!%(":7(A,-%-#86(=+?*~D.=(F-vre52#ฝQW>5%,!5. E1[B#J22-พT:'H/64&xtg4,V;Z=N5{@.G41)&1"aD8(.'tpb20"B:(e^N5(F;%Q8'L5W9H69-eHM1R7rn_H9!QK8B1cJ$XR>jK^@ZTA mhX\VD)kfVR:gbR:+oj[>9*VJ2tU&L=$M91%K: =1pl]TO<#
C*
81!
=-PA&c\JidTQD+.+OH3UB%C5jN$oO WF*`N2>7&O; `V?_YFXN7
oS&94$KE2uW~vปP.
haOR>"\AD=,TH/wZ+WTM
}rKA*ZE'C7#GA/*&นM_YJ=4"^F$]R9~d3eU9;(fYA[J-R3|zm=2eD}`-dN+_I*{xibT&nZ9@7VIUSLpB`E<|Z'a\MZQ$w^2h^HhT1wkM~mp`A}qRgn8pX.HByyy9!
MH+
zBqbHPA}[~h:~IRN#mfRTQJV~Pw`:vgEuLw9xr_[VLtttvmX๊ๆใyS~wb๔๓๒ฮหวHF?7rคA?7าChhgฑญงnnmทLpH}k.กฟผตcbab9owฺึฎคฌ๊ษน|Xฤf6M44ฬ{Sีs>eฬฉ@L3XฅLwะ
tRNS ิ(ะวK๖อ ๐IDATxฺิฝ}pึๅ๗mทํLหฆภE ขOธาผๅ&บ>i0ไ"$ฉ@^"(ิL\I#ภซeฦ{บ+#Uถฝงฬบ3: 8;๗8มั๎aแฮsผ็qฎ+/tซvฯ๋%WฎผaOพ๙฿ใ8nป-๎|็๛๗ญo%๑ษคำ=๑ฯเ)าูก็เมsgฯ=}๚w1uๆฬณfอzฯKcg๗5sๆtfร9?ญ~ฑEEeำI๑/๘aJJ๐๛>๎Rเฑ?19Iฑ$:๘0ฎ1~UNา๗ภS_o_ธ'๋๑fฯ.>{[ZJK้qZJ[เถ๎แโฯศฆ={๖์ฺCงENiFKฉ;+๑ฌXQปBฮR9SแฬOM7o๒R๓๔รฯk๎่0N>^ผษIฦ3mZ๒ดrๆ>:w.}tฮฉsฆ๎้=?
๓ฬoก๗ 8}๎ษ๐๕๒๓ss๑3฿โโโ}p^ฦณN'๕๋ืwาuฝwฎ๏tgฏ๚จ๑ใแำภ_|K3๐ณ7v
ฌ[ืฐmฆสๆ๕{_Wผkp`` xีพ๖ว]ธpแ๔ฑ#6ํo๏๏_ต
6ฐชฟ๘SOyฮ๙3;ฮ์ุ๑์ณ็ฯ๑;็?๚่ใz๗w?ฦ๓๎[๏.|๎อ3Oํฺฅ฿๕มฎ.{ืWt๏.ฎช++มsฮ|หI+,ซซช+LืN8pเนxเtพ฿้y'๐~์๗ฤy ัyฮ>'ไ๏ษ8ix
แ555ีีีUUUUWทตตีภ)sj๛ฉS๏ฆณa๗๐๕
ปใสJธV๒Cy๗รทร'
OฟคNj9U|๏~๛฿นmโ๓w฿B๚-*๒ิ(zB'F4a. Pผfฆ;ฎgฮ"o๕_(Y+ธ
ุg๘.๘W:ฃ8