Name | gilknocker JSON |
Version |
0.4.1
JSON |
| download |
home_page | |
Summary | Knock on the Python GIL, determine how busy it is. |
upload_time | 2023-04-05 08:31:58 |
maintainer | |
docs_url | None |
author | Miles Granger <miles59923@gmail.com> |
requires_python | >=3.7 |
license | MIT |
keywords |
gil
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
## GIL Knocker
`pip install gilknocker`
[![Code Style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black)
[![CI](https://github.com/milesgranger/gilknocker/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/milesgranger/gilknocker/actions/workflows/CI.yml)
[![PyPI](https://img.shields.io/pypi/v/gilknocker.svg)](https://pypi.org/project/gilknocker)
![PyPI - Wheel](https://img.shields.io/pypi/wheel/gilknocker)
[![Downloads](https://pepy.tech/badge/gilknocker/month)](https://pepy.tech/project/gilknocker)
When you thought the GIL was available, and you find yourself suspecting it might be spending time
with another.
You probably want [py-spy](https://github.com/benfred/py-spy), however if you're
looking for a quick-and-dirty way to slip in a GIL contention metric within a specific
chunk of code, this might help you.
### How?
Unfortunately, there doesn't appear to be any explicit C-API for checking how busy
the GIL is. [PyGILState_Check](https://docs.python.org/3/c-api/init.html#c.PyGILState_Check)
won't really work, that's limited to the current thread.
[PyInterpreterState](https://docs.python.org/3/c-api/init.html#c.PyGILState_Check)
is an opaque struct, and the [PyRuntimeState](https://github.com/python/cpython/blob/main/Include/internal/pycore_pystate.h)
and other goodies are private in CPython.
So, in ~200 lines of Rusty code, I've conjured up a basic metric that seems
to align with what is reported by `py-spy` when running the same [test case](./tests/test_knockknock.py).
This works by spawning a thread which, at regular intervals, re-acquires the GIL and checks
how long it took for the GIL to answer.
Note, the `polling_interval_micros`, `sampling_interval_micros`, and `sleeping_interval_micros`
are configurable.
- `polling_interval_micros`
- How frequently to re-acquire the GIL and measure how long it took to acquire. The more frequent, the
more likely the contention metric will represent accurate GIL contention. A good value for this is 1-1000.
- `sampling_interval_micros`
- How _long_ to run the polling routine. If this is 1ms, then for 1ms it will try to re-acquire the GIL
at `polling_interval_micros` frequency. Defaults to 10x `sampling_interval_micros`
- `sleeping_interval_micros`
- How long to sleep between sampling routines. Defaults to 100x `polling_interval_micros`
### Use
Look at the [tests](./tests)
```python
from gilknocker import KnockKnock
# These two are equivalent.
knocker = KnockKnock(1_000)
knocker = KnockKnock(
polling_interval_micros=1_000,
sampling_interval_micros=10_000,
sleeping_interval_micros=100_000
)
knocker.start()
... smart code here ...
knocker.contention_metric # float between 0-1 indicating roughly how busy the GIL was.
knocker.reset_contention_metric() # reset timers and meteric calculation
... some more smart code ...
knocker.stop()
knocker.stop() # Idempodent stopping behavior
knocker.contention_metric # will stay the same after `stop()` is called.
knocker.is_running # If you're ever in doubt
```
### How will this impact my program?
Short answer, it depends, but probably not much. As stated above, the more frequent the
polling and sampling interval, the more likely non-GIL bound programs will be affected, since there is
more room for contention. In GIL heavy programs, the monitoring thread will spend most of its
time simply waiting for a lock. This is demonstrated in the [benchmarks](./benchmarks) testing.
In general, it appears that `polling_interval_micros=1_000` is a good tradeoff in terms of accurate
GIL contention metric and the resulting `sampling_interval_micros=10_000` (defaults to 10x polling interval)
is high enough to relax performance impact a bit when combined with `sleeping_interval_micros=100_000`
(defaults to 100x polling interval); but feel free to play with these to conform to your needs.
Below is a summary of benchmarking two different
functions, one which uses the GIL, and one which releases it. For `interval=None` this means
no polling was used, effectively just running the function without `gilknocker`. Otherwise,
the interval represents the value passed to `KnockKnock(polling_interval_micros=interval)`
`python -m pytest -v --benchmark-only benchmarks/ --benchmark-histogram`
```
------------------------------------------------------------------------------------ benchmark: 18 tests -------------------------------------------------------------------------------------
Name (time in s) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_bench[a_little_gil-100000] 1.5368 (2.07) 1.6596 (2.23) 1.5968 (2.14) 0.0476 (130.12) 1.5943 (2.14) 0.0719 (140.14) 2;0 0.6262 (0.47) 5 1
test_bench[a_little_gil-10000] 1.5321 (2.06) 1.5989 (2.14) 1.5618 (2.09) 0.0289 (78.95) 1.5610 (2.09) 0.0510 (99.52) 2;0 0.6403 (0.48) 5 1
test_bench[a_little_gil-1000] 1.5246 (2.05) 1.5298 (2.05) 1.5271 (2.05) 0.0019 (5.12) 1.5269 (2.05) 0.0021 (4.00) 2;0 0.6549 (0.49) 5 1
test_bench[a_little_gil-100] 1.5505 (2.09) 1.5543 (2.08) 1.5528 (2.08) 0.0014 (3.96) 1.5533 (2.08) 0.0018 (3.60) 2;0 0.6440 (0.48) 5 1
test_bench[a_little_gil-10] 1.5863 (2.13) 1.6074 (2.16) 1.5928 (2.14) 0.0088 (23.94) 1.5896 (2.13) 0.0111 (21.60) 1;0 0.6278 (0.47) 5 1
test_bench[a_little_gil-None] 1.5043 (2.02) 1.5067 (2.02) 1.5051 (2.02) 0.0011 (2.95) 1.5044 (2.02) 0.0016 (3.17) 1;0 0.6644 (0.50) 5 1
test_bench[a_lotta_gil-100000] 0.7450 (1.00) 0.7458 (1.0) 0.7455 (1.0) 0.0004 (1.0) 0.7457 (1.0) 0.0005 (1.0) 1;0 1.3413 (1.0) 5 1
test_bench[a_lotta_gil-10000] 0.7471 (1.00) 0.8104 (1.09) 0.7601 (1.02) 0.0281 (76.94) 0.7472 (1.00) 0.0168 (32.82) 1;1 1.3156 (0.98) 5 1
test_bench[a_lotta_gil-1000] 0.7436 (1.0) 0.7472 (1.00) 0.7463 (1.00) 0.0015 (4.11) 0.7470 (1.00) 0.0013 (2.54) 1;1 1.3400 (1.00) 5 1
test_bench[a_lotta_gil-100] 0.7558 (1.02) 0.7680 (1.03) 0.7640 (1.02) 0.0050 (13.56) 0.7644 (1.03) 0.0061 (11.97) 1;0 1.3089 (0.98) 5 1
test_bench[a_lotta_gil-10] 0.7542 (1.01) 0.7734 (1.04) 0.7649 (1.03) 0.0084 (23.05) 0.7669 (1.03) 0.0151 (29.45) 2;0 1.3074 (0.97) 5 1
test_bench[a_lotta_gil-None] 0.7437 (1.00) 0.8490 (1.14) 0.8006 (1.07) 0.0501 (137.15) 0.8074 (1.08) 0.0969 (189.03) 1;0 1.2490 (0.93) 5 1
test_bench[some_gil-100000] 1.4114 (1.90) 1.4131 (1.89) 1.4122 (1.89) 0.0007 (1.81) 1.4121 (1.89) 0.0010 (2.00) 2;0 0.7081 (0.53) 5 1
test_bench[some_gil-10000] 1.4115 (1.90) 1.4258 (1.91) 1.4167 (1.90) 0.0059 (16.03) 1.4141 (1.90) 0.0083 (16.19) 1;0 0.7058 (0.53) 5 1
test_bench[some_gil-1000] 1.4169 (1.91) 1.5793 (2.12) 1.4618 (1.96) 0.0690 (188.82) 1.4232 (1.91) 0.0769 (150.04) 1;0 0.6841 (0.51) 5 1
test_bench[some_gil-100] 1.4468 (1.95) 1.6261 (2.18) 1.5701 (2.11) 0.0752 (205.83) 1.5998 (2.15) 0.1004 (195.70) 1;0 0.6369 (0.47) 5 1
test_bench[some_gil-10] 1.5269 (2.05) 1.9894 (2.67) 1.7037 (2.29) 0.1895 (518.49) 1.7301 (2.32) 0.2692 (524.96) 1;0 0.5870 (0.44) 5 1
test_bench[some_gil-None] 1.4115 (1.90) 1.4267 (1.91) 1.4155 (1.90) 0.0063 (17.33) 1.4136 (1.90) 0.0053 (10.24) 1;1 0.7065 (0.53) 5 1
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
```
![](./benchmarks/histogram.svg)
---
### License
[Unlicense](LICENSE) or [MIT](LICENSE-MIT), at your discretion.
Raw data
{
"_id": null,
"home_page": "",
"name": "gilknocker",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": "",
"keywords": "GIL",
"author": "Miles Granger <miles59923@gmail.com>",
"author_email": "Miles Granger <miles59923@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/49/7a/03b79a537b98ad71b9522d72df7e357097e13db4e08dc45b8328fe1442db/gilknocker-0.4.1.tar.gz",
"platform": null,
"description": "## GIL Knocker\n\n\n`pip install gilknocker`\n\n\n[![Code Style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black)\n[![CI](https://github.com/milesgranger/gilknocker/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/milesgranger/gilknocker/actions/workflows/CI.yml)\n[![PyPI](https://img.shields.io/pypi/v/gilknocker.svg)](https://pypi.org/project/gilknocker)\n![PyPI - Wheel](https://img.shields.io/pypi/wheel/gilknocker)\n[![Downloads](https://pepy.tech/badge/gilknocker/month)](https://pepy.tech/project/gilknocker)\n\n\nWhen you thought the GIL was available, and you find yourself suspecting it might be spending time\nwith another. \n\nYou probably want [py-spy](https://github.com/benfred/py-spy), however if you're\nlooking for a quick-and-dirty way to slip in a GIL contention metric within a specific\nchunk of code, this might help you.\n\n### How?\n\nUnfortunately, there doesn't appear to be any explicit C-API for checking how busy\nthe GIL is. [PyGILState_Check](https://docs.python.org/3/c-api/init.html#c.PyGILState_Check) \nwon't really work, that's limited to the current thread. \n[PyInterpreterState](https://docs.python.org/3/c-api/init.html#c.PyGILState_Check) \nis an opaque struct, and the [PyRuntimeState](https://github.com/python/cpython/blob/main/Include/internal/pycore_pystate.h)\nand other goodies are private in CPython.\n\nSo, in ~200 lines of Rusty code, I've conjured up a basic metric that seems \nto align with what is reported by `py-spy` when running the same [test case](./tests/test_knockknock.py).\nThis works by spawning a thread which, at regular intervals, re-acquires the GIL and checks \nhow long it took for the GIL to answer.\n\nNote, the `polling_interval_micros`, `sampling_interval_micros`, and `sleeping_interval_micros` \nare configurable. \n\n- `polling_interval_micros`\n - How frequently to re-acquire the GIL and measure how long it took to acquire. The more frequent, the\n more likely the contention metric will represent accurate GIL contention. A good value for this is 1-1000.\n\n- `sampling_interval_micros`\n - How _long_ to run the polling routine. If this is 1ms, then for 1ms it will try to re-acquire the GIL \n at `polling_interval_micros` frequency. Defaults to 10x `sampling_interval_micros`\n\n- `sleeping_interval_micros`\n - How long to sleep between sampling routines. Defaults to 100x `polling_interval_micros`\n\n\n### Use\n\nLook at the [tests](./tests)\n\n```python\n\nfrom gilknocker import KnockKnock\n\n# These two are equivalent. \nknocker = KnockKnock(1_000) \nknocker = KnockKnock(\n polling_interval_micros=1_000, \n sampling_interval_micros=10_000, \n sleeping_interval_micros=100_000\n)\nknocker.start()\n\n... smart code here ...\n\nknocker.contention_metric # float between 0-1 indicating roughly how busy the GIL was.\nknocker.reset_contention_metric() # reset timers and meteric calculation\n\n... some more smart code ...\n\nknocker.stop()\nknocker.stop() # Idempodent stopping behavior\n\nknocker.contention_metric # will stay the same after `stop()` is called.\n\nknocker.is_running # If you're ever in doubt\n\n```\n\n### How will this impact my program?\n\nShort answer, it depends, but probably not much. As stated above, the more frequent the \npolling and sampling interval, the more likely non-GIL bound programs will be affected, since there is \nmore room for contention. In GIL heavy programs, the monitoring thread will spend most of its \ntime simply waiting for a lock. This is demonstrated in the [benchmarks](./benchmarks) testing.\n\nIn general, it appears that `polling_interval_micros=1_000` is a good tradeoff in terms of accurate\nGIL contention metric and the resulting `sampling_interval_micros=10_000` (defaults to 10x polling interval)\nis high enough to relax performance impact a bit when combined with `sleeping_interval_micros=100_000` \n(defaults to 100x polling interval); but feel free to play with these to conform to your needs.\n\nBelow is a summary of benchmarking two different \nfunctions, one which uses the GIL, and one which releases it. For `interval=None` this means \nno polling was used, effectively just running the function without `gilknocker`. Otherwise, \nthe interval represents the value passed to `KnockKnock(polling_interval_micros=interval)`\n\n`python -m pytest -v --benchmark-only benchmarks/ --benchmark-histogram`\n\n```\n------------------------------------------------------------------------------------ benchmark: 18 tests -------------------------------------------------------------------------------------\nName (time in s) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations\n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\ntest_bench[a_little_gil-100000] 1.5368 (2.07) 1.6596 (2.23) 1.5968 (2.14) 0.0476 (130.12) 1.5943 (2.14) 0.0719 (140.14) 2;0 0.6262 (0.47) 5 1\ntest_bench[a_little_gil-10000] 1.5321 (2.06) 1.5989 (2.14) 1.5618 (2.09) 0.0289 (78.95) 1.5610 (2.09) 0.0510 (99.52) 2;0 0.6403 (0.48) 5 1\ntest_bench[a_little_gil-1000] 1.5246 (2.05) 1.5298 (2.05) 1.5271 (2.05) 0.0019 (5.12) 1.5269 (2.05) 0.0021 (4.00) 2;0 0.6549 (0.49) 5 1\ntest_bench[a_little_gil-100] 1.5505 (2.09) 1.5543 (2.08) 1.5528 (2.08) 0.0014 (3.96) 1.5533 (2.08) 0.0018 (3.60) 2;0 0.6440 (0.48) 5 1\ntest_bench[a_little_gil-10] 1.5863 (2.13) 1.6074 (2.16) 1.5928 (2.14) 0.0088 (23.94) 1.5896 (2.13) 0.0111 (21.60) 1;0 0.6278 (0.47) 5 1\ntest_bench[a_little_gil-None] 1.5043 (2.02) 1.5067 (2.02) 1.5051 (2.02) 0.0011 (2.95) 1.5044 (2.02) 0.0016 (3.17) 1;0 0.6644 (0.50) 5 1\ntest_bench[a_lotta_gil-100000] 0.7450 (1.00) 0.7458 (1.0) 0.7455 (1.0) 0.0004 (1.0) 0.7457 (1.0) 0.0005 (1.0) 1;0 1.3413 (1.0) 5 1\ntest_bench[a_lotta_gil-10000] 0.7471 (1.00) 0.8104 (1.09) 0.7601 (1.02) 0.0281 (76.94) 0.7472 (1.00) 0.0168 (32.82) 1;1 1.3156 (0.98) 5 1\ntest_bench[a_lotta_gil-1000] 0.7436 (1.0) 0.7472 (1.00) 0.7463 (1.00) 0.0015 (4.11) 0.7470 (1.00) 0.0013 (2.54) 1;1 1.3400 (1.00) 5 1\ntest_bench[a_lotta_gil-100] 0.7558 (1.02) 0.7680 (1.03) 0.7640 (1.02) 0.0050 (13.56) 0.7644 (1.03) 0.0061 (11.97) 1;0 1.3089 (0.98) 5 1\ntest_bench[a_lotta_gil-10] 0.7542 (1.01) 0.7734 (1.04) 0.7649 (1.03) 0.0084 (23.05) 0.7669 (1.03) 0.0151 (29.45) 2;0 1.3074 (0.97) 5 1\ntest_bench[a_lotta_gil-None] 0.7437 (1.00) 0.8490 (1.14) 0.8006 (1.07) 0.0501 (137.15) 0.8074 (1.08) 0.0969 (189.03) 1;0 1.2490 (0.93) 5 1\ntest_bench[some_gil-100000] 1.4114 (1.90) 1.4131 (1.89) 1.4122 (1.89) 0.0007 (1.81) 1.4121 (1.89) 0.0010 (2.00) 2;0 0.7081 (0.53) 5 1\ntest_bench[some_gil-10000] 1.4115 (1.90) 1.4258 (1.91) 1.4167 (1.90) 0.0059 (16.03) 1.4141 (1.90) 0.0083 (16.19) 1;0 0.7058 (0.53) 5 1\ntest_bench[some_gil-1000] 1.4169 (1.91) 1.5793 (2.12) 1.4618 (1.96) 0.0690 (188.82) 1.4232 (1.91) 0.0769 (150.04) 1;0 0.6841 (0.51) 5 1\ntest_bench[some_gil-100] 1.4468 (1.95) 1.6261 (2.18) 1.5701 (2.11) 0.0752 (205.83) 1.5998 (2.15) 0.1004 (195.70) 1;0 0.6369 (0.47) 5 1\ntest_bench[some_gil-10] 1.5269 (2.05) 1.9894 (2.67) 1.7037 (2.29) 0.1895 (518.49) 1.7301 (2.32) 0.2692 (524.96) 1;0 0.5870 (0.44) 5 1\ntest_bench[some_gil-None] 1.4115 (1.90) 1.4267 (1.91) 1.4155 (1.90) 0.0063 (17.33) 1.4136 (1.90) 0.0053 (10.24) 1;1 0.7065 (0.53) 5 1\n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n```\n\n![](./benchmarks/histogram.svg)\n\n---\n\n### License\n\n[Unlicense](LICENSE) or [MIT](LICENSE-MIT), at your discretion.\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Knock on the Python GIL, determine how busy it is.",
"version": "0.4.1",
"split_keywords": [
"gil"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "085b987578840388b12dcd3ec0b9cd5972b0904dd28dd0bcb86272a26e1b9600",
"md5": "c41ea1882fd062df5e962a949881afb5",
"sha256": "094ee864032e54fafa8e0c87edf62ccc70fcc6322bea76ddf890e9564d1b758e"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp310-cp310-macosx_10_7_x86_64.whl",
"has_sig": false,
"md5_digest": "c41ea1882fd062df5e962a949881afb5",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 274791,
"upload_time": "2023-04-05T08:31:16",
"upload_time_iso_8601": "2023-04-05T08:31:16.303007Z",
"url": "https://files.pythonhosted.org/packages/08/5b/987578840388b12dcd3ec0b9cd5972b0904dd28dd0bcb86272a26e1b9600/gilknocker-0.4.1-cp310-cp310-macosx_10_7_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5ebbd109aa03dd6416d590892f0b9b85720165197c38aac580015776a70a5f29",
"md5": "07f3ec06eda3dce68beee69300330214",
"sha256": "50450a1adf10df257dc68baf9c67437b26e1b85914a79e2b5e7b7c1ae8542dcc"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
"has_sig": false,
"md5_digest": "07f3ec06eda3dce68beee69300330214",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 533037,
"upload_time": "2023-04-05T08:31:18",
"upload_time_iso_8601": "2023-04-05T08:31:18.034690Z",
"url": "https://files.pythonhosted.org/packages/5e/bb/d109aa03dd6416d590892f0b9b85720165197c38aac580015776a70a5f29/gilknocker-0.4.1-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e89a3380ee80148d29811410dd433c80f925633a0675f9b9d54bdf5265fd2185",
"md5": "c6e9c445bd03c9b4f48c21935fc5d946",
"sha256": "2421eb3723c32be4f6f1896a8a54a0e761cab3347b236a02b542478f700b8a62"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "c6e9c445bd03c9b4f48c21935fc5d946",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 632180,
"upload_time": "2023-04-05T08:31:19",
"upload_time_iso_8601": "2023-04-05T08:31:19.122968Z",
"url": "https://files.pythonhosted.org/packages/e8/9a/3380ee80148d29811410dd433c80f925633a0675f9b9d54bdf5265fd2185/gilknocker-0.4.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fa2ddff96152c4891c5d56e35d38446afe4cf68b8435e71ab0f2072874cbc5fe",
"md5": "484a53b34a20d13a2f145adc85893cfb",
"sha256": "1ba6a363be7994631bc497c33d26f9782d72db4d7e75ba0c08db20d04204c3fd"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "484a53b34a20d13a2f145adc85893cfb",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 613331,
"upload_time": "2023-04-05T08:31:20",
"upload_time_iso_8601": "2023-04-05T08:31:20.433453Z",
"url": "https://files.pythonhosted.org/packages/fa/2d/dff96152c4891c5d56e35d38446afe4cf68b8435e71ab0f2072874cbc5fe/gilknocker-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5c892378ba46b827d4dc0f3f90ff4c957511583f5dc4802236e5d5814dcec145",
"md5": "bc19bfd26f4e184e1e417506d0c2b8b5",
"sha256": "8aae0a07bf76de63d2adf299e3a342e03dad11df3b8cea65f0c2e74411824dae"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp310-none-win32.whl",
"has_sig": false,
"md5_digest": "bc19bfd26f4e184e1e417506d0c2b8b5",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 154889,
"upload_time": "2023-04-05T08:31:22",
"upload_time_iso_8601": "2023-04-05T08:31:22.235354Z",
"url": "https://files.pythonhosted.org/packages/5c/89/2378ba46b827d4dc0f3f90ff4c957511583f5dc4802236e5d5814dcec145/gilknocker-0.4.1-cp310-none-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b52ee9474028df7d018fdeabfaa53b5c3bc4166207cfa5b5a5b68d4e1b03dd18",
"md5": "ede54f865fba4569e916149d1b1a5aeb",
"sha256": "34446b914b2831df22594ea24179bb55897f48b93a2efcf9b869cd01aad5f3bd"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp310-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "ede54f865fba4569e916149d1b1a5aeb",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 162695,
"upload_time": "2023-04-05T08:31:23",
"upload_time_iso_8601": "2023-04-05T08:31:23.781691Z",
"url": "https://files.pythonhosted.org/packages/b5/2e/e9474028df7d018fdeabfaa53b5c3bc4166207cfa5b5a5b68d4e1b03dd18/gilknocker-0.4.1-cp310-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "28ad8643f2fca13934d64244c61127cc5eca80bea5d407bda9b04b8f0f2c761b",
"md5": "f02561074e48384e8e50b79a6e54ef0f",
"sha256": "0a291450033eb9c404ba0b80fd5f522bfe9bf1805a23f88bd665abc32587ac39"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp311-cp311-macosx_10_7_x86_64.whl",
"has_sig": false,
"md5_digest": "f02561074e48384e8e50b79a6e54ef0f",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 274789,
"upload_time": "2023-04-05T08:31:24",
"upload_time_iso_8601": "2023-04-05T08:31:24.775470Z",
"url": "https://files.pythonhosted.org/packages/28/ad/8643f2fca13934d64244c61127cc5eca80bea5d407bda9b04b8f0f2c761b/gilknocker-0.4.1-cp311-cp311-macosx_10_7_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "068b0aa8ed71ecf01a1008cf41526e5041c68bc8fd63faf392d87695632cb8eb",
"md5": "20ae5ac539104d8d452dcead967382de",
"sha256": "66a4eb863229e8f99a867ca7ef57e34f9e757ca3599b4e4e554795370cfb30a6"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
"has_sig": false,
"md5_digest": "20ae5ac539104d8d452dcead967382de",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 533031,
"upload_time": "2023-04-05T08:31:26",
"upload_time_iso_8601": "2023-04-05T08:31:26.422935Z",
"url": "https://files.pythonhosted.org/packages/06/8b/0aa8ed71ecf01a1008cf41526e5041c68bc8fd63faf392d87695632cb8eb/gilknocker-0.4.1-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "55912083c80ba690c7604e40170d5764523095e5022681d4c34394426fc5964b",
"md5": "71313d2c80b71b63e71b040cb5c623d8",
"sha256": "90ddf44dde01578801a7fb52421766c7e0dde343b2b220f97f3f3f1f05c4e604"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "71313d2c80b71b63e71b040cb5c623d8",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 632177,
"upload_time": "2023-04-05T08:31:28",
"upload_time_iso_8601": "2023-04-05T08:31:28.056289Z",
"url": "https://files.pythonhosted.org/packages/55/91/2083c80ba690c7604e40170d5764523095e5022681d4c34394426fc5964b/gilknocker-0.4.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ced9fddceebc2ea8410677e4c3865607332fed2c623d74671c84076f612a05e3",
"md5": "ea3e21a817abee708a70d9bdbe9df3fc",
"sha256": "de32005922d3d8044835dcb2374761b96abc7498e8e1510e13e4c052ac0d545e"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "ea3e21a817abee708a70d9bdbe9df3fc",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 613331,
"upload_time": "2023-04-05T08:31:29",
"upload_time_iso_8601": "2023-04-05T08:31:29.087057Z",
"url": "https://files.pythonhosted.org/packages/ce/d9/fddceebc2ea8410677e4c3865607332fed2c623d74671c84076f612a05e3/gilknocker-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6730a4ac7e21f87a651ba142caffc80d0e71c9dbe21e2e2dcc527dfde7b0fb6a",
"md5": "b3a95d32bf8d57de4f3381a07ad467c4",
"sha256": "d2818d2945d019c94a8853e42b930afb3d27aab2674636792f77ed32fedcae4b"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp311-none-win32.whl",
"has_sig": false,
"md5_digest": "b3a95d32bf8d57de4f3381a07ad467c4",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 154886,
"upload_time": "2023-04-05T08:31:30",
"upload_time_iso_8601": "2023-04-05T08:31:30.681068Z",
"url": "https://files.pythonhosted.org/packages/67/30/a4ac7e21f87a651ba142caffc80d0e71c9dbe21e2e2dcc527dfde7b0fb6a/gilknocker-0.4.1-cp311-none-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "566eceff9daefe21564e9115030fa522b1abdc45a7ecd883da35b84160f9b8d4",
"md5": "3ed732022da0963c56d0e2dc9239d88b",
"sha256": "b433f8aea88fa001475b644afb44e8932ec44362282e5ad76d21ee1ef4b9ea8f"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp311-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "3ed732022da0963c56d0e2dc9239d88b",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 162696,
"upload_time": "2023-04-05T08:31:32",
"upload_time_iso_8601": "2023-04-05T08:31:32.244122Z",
"url": "https://files.pythonhosted.org/packages/56/6e/ceff9daefe21564e9115030fa522b1abdc45a7ecd883da35b84160f9b8d4/gilknocker-0.4.1-cp311-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "26acfaea38c3243dddf7a452b7a5ba06243ecf7c348ba65a4dad0285e3ea6c96",
"md5": "b17251df00a8b2ad2552757ac3e9f46b",
"sha256": "f987a0c37f0b44eb4f45051ab33cb0c5ae1381bdfacffdb06c89b28bab03a409"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp37-cp37m-macosx_10_7_x86_64.whl",
"has_sig": false,
"md5_digest": "b17251df00a8b2ad2552757ac3e9f46b",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 275497,
"upload_time": "2023-04-05T08:31:33",
"upload_time_iso_8601": "2023-04-05T08:31:33.315479Z",
"url": "https://files.pythonhosted.org/packages/26/ac/faea38c3243dddf7a452b7a5ba06243ecf7c348ba65a4dad0285e3ea6c96/gilknocker-0.4.1-cp37-cp37m-macosx_10_7_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "82e4f06a95ed0b3cbbae91e0c8595d78a73174e6d7d55ea45f9c67eb9bb3564a",
"md5": "fbac45cc58cdce8f108d571b85f00bc2",
"sha256": "8e2436acccdf75bb8622d35ea5af693d2fdcc9e63567a8424af6e863973a917f"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "fbac45cc58cdce8f108d571b85f00bc2",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 632836,
"upload_time": "2023-04-05T08:31:34",
"upload_time_iso_8601": "2023-04-05T08:31:34.413169Z",
"url": "https://files.pythonhosted.org/packages/82/e4/f06a95ed0b3cbbae91e0c8595d78a73174e6d7d55ea45f9c67eb9bb3564a/gilknocker-0.4.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "eed1dc910f8b7507de4389772dda85fd7a9b80c3cbc9b8b0ce14478cce23f946",
"md5": "5ef14b9d63e459e2cb5481f67d1ac4d9",
"sha256": "9ff2f4b7e09efb3aa316ecc3d6df7df1c8d50053919e5c8e933ddc85aa932148"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "5ef14b9d63e459e2cb5481f67d1ac4d9",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 613762,
"upload_time": "2023-04-05T08:31:36",
"upload_time_iso_8601": "2023-04-05T08:31:36.678890Z",
"url": "https://files.pythonhosted.org/packages/ee/d1/dc910f8b7507de4389772dda85fd7a9b80c3cbc9b8b0ce14478cce23f946/gilknocker-0.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "750b592055a63c9a7c95483e226c8ef769677ace60b0cfac5a7f06b4bc9be096",
"md5": "315ee0113778e6549ea6b222b4514c37",
"sha256": "c228837d176cbc601ee30962c9b79d1336ed350f7ac7ef67dc889afb09eb1979"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp37-none-win32.whl",
"has_sig": false,
"md5_digest": "315ee0113778e6549ea6b222b4514c37",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 155315,
"upload_time": "2023-04-05T08:31:38",
"upload_time_iso_8601": "2023-04-05T08:31:38.220201Z",
"url": "https://files.pythonhosted.org/packages/75/0b/592055a63c9a7c95483e226c8ef769677ace60b0cfac5a7f06b4bc9be096/gilknocker-0.4.1-cp37-none-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6cdfeca18cee2653fec4c110e8147731e55a5c6d1ab02489d6c7acc902016347",
"md5": "dac8dff2351a1245c3091a91b1948ba5",
"sha256": "0f929bb718bde531608f9da9317d0e06bcc6b64d78021c1ba43782f0ab02d763"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp37-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "dac8dff2351a1245c3091a91b1948ba5",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 163113,
"upload_time": "2023-04-05T08:31:39",
"upload_time_iso_8601": "2023-04-05T08:31:39.798742Z",
"url": "https://files.pythonhosted.org/packages/6c/df/eca18cee2653fec4c110e8147731e55a5c6d1ab02489d6c7acc902016347/gilknocker-0.4.1-cp37-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0ab01933fcf956e978452af445287096acbfab195fd7060a2d41ffe8bbd635f8",
"md5": "309d1d80ce71925fd95d3f3a903bf0b9",
"sha256": "a83d4a1fb1501c45ac1c7f6fec55b2f7ad6efea4c1f31504055f2b7bac62792a"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp38-cp38-macosx_10_7_x86_64.whl",
"has_sig": false,
"md5_digest": "309d1d80ce71925fd95d3f3a903bf0b9",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 275451,
"upload_time": "2023-04-05T08:31:40",
"upload_time_iso_8601": "2023-04-05T08:31:40.837230Z",
"url": "https://files.pythonhosted.org/packages/0a/b0/1933fcf956e978452af445287096acbfab195fd7060a2d41ffe8bbd635f8/gilknocker-0.4.1-cp38-cp38-macosx_10_7_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b8c0ab2c1930c598b6906e5bd2dfe9a87f1c77f964acee1cb00d51f42ba7454d",
"md5": "9ac23a701edc63c4b5da2c282c6a47ab",
"sha256": "7a37ad5f0ea74627a2adf392e7d1ff5930c44275a47e65e2853719a43c441707"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
"has_sig": false,
"md5_digest": "9ac23a701edc63c4b5da2c282c6a47ab",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 534461,
"upload_time": "2023-04-05T08:31:41",
"upload_time_iso_8601": "2023-04-05T08:31:41.956171Z",
"url": "https://files.pythonhosted.org/packages/b8/c0/ab2c1930c598b6906e5bd2dfe9a87f1c77f964acee1cb00d51f42ba7454d/gilknocker-0.4.1-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d2b371c08de83e7a17ae73807d568d72d4390a232daae39178b64d988dbcd0ef",
"md5": "07ad9f0770cd6300c96dd6ab27728922",
"sha256": "9b9d43848f015e95d6f1645f52d96e5994efbb96456c57161acb164adbdc53d9"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "07ad9f0770cd6300c96dd6ab27728922",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 632849,
"upload_time": "2023-04-05T08:31:43",
"upload_time_iso_8601": "2023-04-05T08:31:43.523854Z",
"url": "https://files.pythonhosted.org/packages/d2/b3/71c08de83e7a17ae73807d568d72d4390a232daae39178b64d988dbcd0ef/gilknocker-0.4.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "890acff63e0d98c83a36e7c708443e6ad3c6dfb2a8440785ba35052deb269171",
"md5": "6f5368f3d818ef8b6d7b9eb4f11735e8",
"sha256": "2288fbb606c457b3103306c9e72f124782ccc7a48b1fff5dd0b0ea379f2ee6cc"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "6f5368f3d818ef8b6d7b9eb4f11735e8",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 613698,
"upload_time": "2023-04-05T08:31:45",
"upload_time_iso_8601": "2023-04-05T08:31:45.388099Z",
"url": "https://files.pythonhosted.org/packages/89/0a/cff63e0d98c83a36e7c708443e6ad3c6dfb2a8440785ba35052deb269171/gilknocker-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3c7c9d1ea49cc2b2059acaca3d32ccfa48b5c8efa453ee9e14d39ee386e12008",
"md5": "a9fe715d62639f81759c989e534d1b0c",
"sha256": "b2a56dec5155968c12b9463c662b1cfaec87329ba59b6bbba4944907e6e7bb10"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp38-none-win32.whl",
"has_sig": false,
"md5_digest": "a9fe715d62639f81759c989e534d1b0c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 155284,
"upload_time": "2023-04-05T08:31:47",
"upload_time_iso_8601": "2023-04-05T08:31:47.934360Z",
"url": "https://files.pythonhosted.org/packages/3c/7c/9d1ea49cc2b2059acaca3d32ccfa48b5c8efa453ee9e14d39ee386e12008/gilknocker-0.4.1-cp38-none-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4929016eaf2427584544a3deefed4f6300caf85bdf8c45ebac4bc8c6ecc9e713",
"md5": "271c71e3e1d77f68657cf063afb9a21b",
"sha256": "9e82fcb264663edcf4d2478d929be873c3633ea339fe676a915b1f468499b39a"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp38-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "271c71e3e1d77f68657cf063afb9a21b",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 163133,
"upload_time": "2023-04-05T08:31:49",
"upload_time_iso_8601": "2023-04-05T08:31:49.707486Z",
"url": "https://files.pythonhosted.org/packages/49/29/016eaf2427584544a3deefed4f6300caf85bdf8c45ebac4bc8c6ecc9e713/gilknocker-0.4.1-cp38-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d75f5c627a4f9a6892f7237437f748a7e08c2868e8c8dc173a44ce4a10a2aa03",
"md5": "662772299821801b147f1f48980bd427",
"sha256": "ca95db3f4a73d60cfbfecdea6aacea9a10931ae8bfe010db70bad214eebad55c"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp39-cp39-macosx_10_7_x86_64.whl",
"has_sig": false,
"md5_digest": "662772299821801b147f1f48980bd427",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 275191,
"upload_time": "2023-04-05T08:31:50",
"upload_time_iso_8601": "2023-04-05T08:31:50.813578Z",
"url": "https://files.pythonhosted.org/packages/d7/5f/5c627a4f9a6892f7237437f748a7e08c2868e8c8dc173a44ce4a10a2aa03/gilknocker-0.4.1-cp39-cp39-macosx_10_7_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bd8edd8fd6a6aeebbb45bec877c8fbbfa29135277bb757c1bb8f4a435062f6d2",
"md5": "31f5d3ecc03ba68f9663ff0252ffeb43",
"sha256": "8b38a0e2f9231e7324c832099dcad3ec4c2f5b3a48105ba8e1d2496cf245feb0"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
"has_sig": false,
"md5_digest": "31f5d3ecc03ba68f9663ff0252ffeb43",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 533941,
"upload_time": "2023-04-05T08:31:51",
"upload_time_iso_8601": "2023-04-05T08:31:51.894433Z",
"url": "https://files.pythonhosted.org/packages/bd/8e/dd8fd6a6aeebbb45bec877c8fbbfa29135277bb757c1bb8f4a435062f6d2/gilknocker-0.4.1-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "25bf48f4a0be6549bf7e4ea83ff5273f226b190f9b006e6a2d15b492116e98c2",
"md5": "67bfe7c005649a01ac9d3a945b27b6fa",
"sha256": "8e6386b21256a3ab35d97df9f151b716278ee3f6e99ca2b4b587bb43d60d1516"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "67bfe7c005649a01ac9d3a945b27b6fa",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 632589,
"upload_time": "2023-04-05T08:31:53",
"upload_time_iso_8601": "2023-04-05T08:31:53.507784Z",
"url": "https://files.pythonhosted.org/packages/25/bf/48f4a0be6549bf7e4ea83ff5273f226b190f9b006e6a2d15b492116e98c2/gilknocker-0.4.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "34d4ee3c0d07e5b3f6f2745d04c5bf5af48ad605fc56375faa2573ca56f7afb2",
"md5": "3e46c29d943b7a64d63f22d403309d49",
"sha256": "c2bc4daceb5934cecfec12c703ebe584528f2af57ef475697d7d3d50ce0e1757"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "3e46c29d943b7a64d63f22d403309d49",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 613495,
"upload_time": "2023-04-05T08:31:54",
"upload_time_iso_8601": "2023-04-05T08:31:54.579461Z",
"url": "https://files.pythonhosted.org/packages/34/d4/ee3c0d07e5b3f6f2745d04c5bf5af48ad605fc56375faa2573ca56f7afb2/gilknocker-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "83325e2bcd0200e77c52eaedc1eeb633368c25e458348b6f3c8baaad4618f329",
"md5": "d522208b2e56fedeff95196f6944c064",
"sha256": "f0c87669639439c5073ad4aae30ea70c00f2567f56cf8623f43a7062217a732c"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp39-none-win32.whl",
"has_sig": false,
"md5_digest": "d522208b2e56fedeff95196f6944c064",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 155100,
"upload_time": "2023-04-05T08:31:55",
"upload_time_iso_8601": "2023-04-05T08:31:55.632583Z",
"url": "https://files.pythonhosted.org/packages/83/32/5e2bcd0200e77c52eaedc1eeb633368c25e458348b6f3c8baaad4618f329/gilknocker-0.4.1-cp39-none-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a9adda29d5eb78a1626077e6c1a87f4cff61f86382ba9e0f3b379228cb9661fd",
"md5": "2f9523cde3ae6aa45332f6d916a407c8",
"sha256": "d0636b90a0256c2b3e7fa58deb8e7d55e6a1fe90133c2715fec47a26b999d366"
},
"downloads": -1,
"filename": "gilknocker-0.4.1-cp39-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "2f9523cde3ae6aa45332f6d916a407c8",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 162971,
"upload_time": "2023-04-05T08:31:56",
"upload_time_iso_8601": "2023-04-05T08:31:56.788140Z",
"url": "https://files.pythonhosted.org/packages/a9/ad/da29d5eb78a1626077e6c1a87f4cff61f86382ba9e0f3b379228cb9661fd/gilknocker-0.4.1-cp39-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "497a03b79a537b98ad71b9522d72df7e357097e13db4e08dc45b8328fe1442db",
"md5": "eff26a25b7fcf79cd87e77268d582c5c",
"sha256": "0a9ce42b50221e8ea9572e28847ec46a1a527124a25e6f6f7a0f1d2668c9241c"
},
"downloads": -1,
"filename": "gilknocker-0.4.1.tar.gz",
"has_sig": false,
"md5_digest": "eff26a25b7fcf79cd87e77268d582c5c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 26813,
"upload_time": "2023-04-05T08:31:58",
"upload_time_iso_8601": "2023-04-05T08:31:58.468535Z",
"url": "https://files.pythonhosted.org/packages/49/7a/03b79a537b98ad71b9522d72df7e357097e13db4e08dc45b8328fe1442db/gilknocker-0.4.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-04-05 08:31:58",
"github": false,
"gitlab": false,
"bitbucket": false,
"lcname": "gilknocker"
}