{ "info": { "author": "Brian Bruggeman", "author_email": "brian.m.bruggeman@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Intended Audience :: Education", "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Operating System :: OS Independent", "Operating System :: POSIX", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Multimedia :: Graphics", "Topic :: Multimedia :: Graphics :: 3D Rendering", "Topic :: Multimedia :: Graphics :: Viewers", "Topic :: Software Development :: User Interfaces" ], "description": "GLFW-CFFI\n---------\n[![Build Status](https://travis-ci.org/brianbruggeman/glfw-cffi.svg)](https://travis-ci.org/brianbruggeman/glfw-cffi)\n[![PyPI version](https://img.shields.io/pypi/v/glfw-cffi.svg)](https://pypi.python.org/pypi/glfw-cffi)\n[![Status](https://img.shields.io/pypi/status/glfw-cffi.svg)](https://pypi.python.org/pypi/glfw-cffi)\n[![Python Compatibility](https://img.shields.io/pypi/pyversions/glfw-cffi.svg)](https://pypi.python.org/pypi/glfw-cffi)\n[![Downloads](https://img.shields.io/pypi/dm/glfw-cffi.svg?period=week)](https://pypi.python.org/pypi/glfw-cffi)\n[![Coverage Status](https://coveralls.io/repos/brianbruggeman/glfw-cffi/badge.svg?branch=develop&service=github)](https://coveralls.io/github/brianbruggeman/glfw-cffi?branch=develop)\n\nA wrapper for GLFW3 using Python's CFFI.\n\n## Motivation:\n\nAfter being frustrated with the options available, I decided to roll my\nown version of glfw3 using cffi for python. This package inspects the\nheader file for glfw's api, and then creates python-wrapped functions.\n\nFor the most part, this should be transparent. However, I have not\ntested the package well enough to know where the bugs are. So you may\nuse at your own risk.\n\nAdditionally, I have provided a straight copy of the GLFW3 api directly\navailable from the module. So the module has python friendly functions\nas well as the direct C-library calls. Note that the latter API requires\nmore setup to use because you must manage the object conversion from\nPython into C and back.\n\nThe goal for this package is that the user won't know they're using\na C library underneath and the package interface will feel completely\nnatural within Python.\n\n## License:\n\nThis package is released as Apache 2.0 license.\n\nHowever, at your option, you may apply any OSI approved free software\nlicense you choose provided that you adhere to the free software license\nchosen and additionally follow these criteria:\n\n a. list the author's name of this software as a contributor to your\n final product\n\n b. provide credit to your end user of your product or software without\n your end user asking for where you obtained your software\n\n c. notify the author of this software that you are using this software\n\n d. If you believe there can be some benefit in providing your changes\n upstream, you'll submit a change request. While this criteria is\n completely optional, please consider not being a dick.\n\n## Installation:\n\nGLFW-CFFI uses GLFW3 and attempts to find the header file associated with your\nspecific library version to autogenerate the FFI interface. So a version of\nGLFW3 must be available during installation. If a development version is\nunavailable, then a version of the `glfw3.h` is included within the `glfw-cffi`\npackage itself.\n\n### Installing via pip\n\nInstall via `pip install glfw-cffi`.\n\n### Installing GLFW3\n\nGLFW3 is available for several different platforms:\n\n- Ubuntu/Debian: `sudo apt-get install -y libglfw3-dev`\n- Fedora/Red Hat: `sudo yum install -y libglfw3-dev`\n- Mac OS X with Homebrew: `brew install glfw3`\n- Windows: There is are pre-compiled binaries available\n [64-bit Windows](https://github.com/glfw/glfw/releases/download/3.1.2/glfw-3.1.2.bin.WIN64.zip) or\n [32-bit Windows](https://github.com/glfw/glfw/releases/download/3.1.2/glfw-3.1.2.bin.WIN32.zip)\n\nGLFW3 is relatively new, so some older installations of Linux may not have\n`libglfw` directly available. You may check out the [travis.yml](https://github.com/brianbruggeman/glfw-cffi/blob/master/.travis.yml#L34-L52)\nfile within our github repo for more information on setup on older systems.\n\n#### A special note for installing GLFW3 on Windows\n\nThe current state requires that an environment variable, 'GLFW_LIBRARY', be set\nand pointing to a compiled .dll found within a known path. In addition,\nglfw-cffi expects that a header file be present within an 'include' folder\nwithin the same folder structure as the .dll. So for example, if the\nlibrary binary were added to:\n\n C:\\GLFW\\lib\\glfw3.dll\n\nThe python library, glfw-cffi, would search for a glfw3.h file within any of\nthese folders:\n\n C:\\GLFW\\lib\\include\n C:\\GLFW\\include\n C:\\include\n\nWhen testing, we used the 32-bit binary and lib-mingw on a 64-bit Windows 10\nsystem.\n\n## Usage:\n\n### Sample Usage:\n\nThis is the required code to produce a window on the screen:\n\n import glfw\n\n # Initialize glfw\n if not glfw.init():\n glfw.terminate() # Cleans up if necessary\n raise RuntimeError('Could not initialize GLFW3')\n\n # Create window and set OpenGL Context\n win = glfw.create_window(title='Simple Window', width=640, height=480)\n glfw.make_context_current(win)\n\n # Main Loop\n while not glfw.window_should_close(win):\n glfw.swap_buffers(win)\n # To handle/process events use:\n glfw.poll_events() # for continuous rendering (like in games)\n # or use:\n # glfw.wait_events() # for on-event UIs (like an editing tool)\n\n # Proper shutdown\n glfw.terminate()\n\nA more complex window example can be found within the examples folder on the github repo.\n\n### Decorators\n\nExtra decorators have been added to aid with developing a full user interface, including:\n\n- keyboard handling\n- mouse handling\n- joystick handling\n- window events\n- text events\n- path drop callbacks (for drag and drop)\n- error callbacks\n\nEach decorator may be used with a standalone function or decorating a class method.\nExamples of each type are found in the subsections below. When decorating a class\nmethod, use: @[staticmethod](https://docs.python.org/2/library/functions.html#staticmethod).\n\nWhat follows is only the more commonly used. Better documentation on callbacks can\nbe found on the [glfw website](http://www.glfw.org/docs/latest/).\n\n#### Handling keyboard events\n\nKeyboard events have a single decorator:\n\n- keyboard event: glfw.decorators.key_callback\n\nExample:\n\n import glfw\n\n @glfw.decorators.key_callback\n def on_key(win, key, code, action, mods):\n '''Converts key into an event'''\n if key in [glfw.KEY_ESCAPE] and action in [glfw.PRESS]:\n glfw.set_window_should_close(win, gl.GL_TRUE)\n\n\nIn addition, helper functions have been added to convert data into strings:\n\n\n def display_data(key, action, mods):\n '''Converts keystroke into string data'''\n # Convert data\n key_action = glfw.get_key_string(key)\n action_string = glfw.get_action_string(action)\n mods_string = glfw.get_mod_string(mods)\n # Display data\n print('key: {key} -> \"{string}\"'.format(key=key, string=key_string))\n print('action: {action} -> \"{string}\"'.format(action=action, string=action_string))\n print('mods: {mods} -> \"{string}\"'.format(mods=mods, string=mods_string))\n\n\nFinally, sometimes keystroke handling may make sense to be included within a class.\n\n\n import glfw\n from OpenGL import GL as gl\n\n class Foo(object):\n\n @staticmethod\n @glfw.decorators.key_callback\n def on_key(win, key, code, action, mods):\n '''Handles a key event'''\n if key in [glfw.KEY_ESCAPE] and action in [glfw.PRESS]:\n glfw.set_window_should_close(win, gl.GL_TRUE)\n # Display what just happened\n key = glfw.get_key_string(key)\n amapping = {'press': '+', 'release': '-', 'repeat': '*'}\n action = amapping.get(glfw.get_action_string(action))\n mods = glfw.get_mod_string(mods)\n string = '{}|{}'.format(action[0], '+'.join(str(_) for _ in (mods, key) if _))\n print(string)\n\n\n#### Handling mouse events\n\nMouse events have three decorators:\n\n- mouse button click: glfw.decorators.mouse_button_callback\n- mouse wheel/scroll: glfw.decorators.scroll_callback\n- mouse movement: glfw.decorators.cursor_pos_callback\n\nExample:\n\n import glfw\n from OpenGL import GL as gl\n\n\n class Foo(object):\n\n @staticmethod\n @glfw.decorators.mouse_button_callback\n def on_mouse_button(win, button, action, mods):\n '''Handles a mouse button event'''\n # Not used here, but having the position where the mouse was at the\n # time of the click can be useful.\n position = glfw.get_cursor_pos(win)\n # Handle button\n if button in [glfw.MOUSE_BUTTON_1] and action in [glfw.PRESS]:\n glfw.set_window_should_close(win, gl.GL_TRUE)\n # Display what just happened\n button = glfw.get_mouse_button_string(button)\n amapping = {'press': '+', 'release': '-', 'repeat': '*'}\n action = amapping.get(glfw.get_action_string(action))\n mods = glfw.get_mod_string(mods)\n position = '({:>.0f}, {:>.0f})'.format(*position)\n string = '{} {}|{}'.format(position, action[0], '+'.join(str(_) for _ in (mods, button) if _))\n print(string)\n\n @staticmethod\n @glfw.decorators.scroll_callback\n def on_mouse_scroll(win, x_offset, y_offset):\n '''Handles a mouse scroll/wheel event'''\n\n @staticmethod\n @glfw.decorators.cursor_pos_callback\n def on_mouse_move(win, x_offset, y_offset):\n '''Handles a mouse move event'''\n\n\n\n#### Handling window events\n\nThere are other available decorators that handle window events.\n\n##### Gaining and Losing Focus\n\nWindows client areas may gain or lose focus and an event is\ntriggered each time.\n\n- client focus: glfw.decorators.cursor_enter_callback\n- window focus: glfw.decorators.window_focus_callback\n\nExample:\n\n import glfw\n\n\n class Foo(object):\n\n @staticmethod\n @glfw.decorators.cursor_enter_callback\n def on_enter(win, status):\n '''Handles focus event for a window client area\n\n status is a boolean: True for focused and False for unfocused\n '''\n\n @staticmethod\n @glfw.decorators.window_focus_callback\n def on_enter(win, status):\n '''Handles focus event for a window\n\n status is a boolean: True for focused and False for unfocused\n '''\n\n##### Resizing\n\nWindows may be resized.\n\n- resize: glfw.decorators.window_size_callback\n\nExample:\n\n import glfw\n\n\n class Foo(object):\n\n @staticmethod\n @glfw.decorators.window_size_callback\n def on_enter(win, width, height):\n '''Handles resize event'''\n\n\n## Examples:\n\nMore examples can be within the github repo under the [examples/](https://github.com/brianbruggeman/glfw-cffi/tree/develop/examples) folder.\n\nSome of the examples require more packages to be installed:\n\n- [docopt](https://pypi.python.org/pypi/docopt): Creates beautiful command-line interfaces\n- [numpy](https://pypi.python.org/pypi/numpy): is a general-purpose array-processing package designed to efficiently manipulate large multi-dimensional arrays of arbitrary records without sacrificing too much speed for small multi-dimensional arrays\n- [freetype-py](https://pypi.python.org/pypi/freetype-py/): Freetype python provides bindings for the FreeType library. Only the high-level API is bound.\n\n\n## Contributions:\n\nContributions are welcome. When opening a PR, please keep the following guidelines in mind:\n\n- Before implementing, please open an issue for discussion.\n- Make sure you have tests for the new logic.\n- Make sure your code passes `flake8`\n- Add yourself to contributors at `README.md` and/or your contributions.\n\n## Contributors\n\n* [Brian Bruggeman](https://github.com/brianbruggeman) - Originator\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/brianbruggeman/glfw-cffi.git", "keywords": "GLFW", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "glfw-cffi", "package_url": "https://pypi.org/project/glfw-cffi/", "platform": "any", "project_url": "https://pypi.org/project/glfw-cffi/", "project_urls": { "Homepage": "https://github.com/brianbruggeman/glfw-cffi.git" }, "release_url": "https://pypi.org/project/glfw-cffi/0.2.0/", "requires_dist": null, "requires_python": "", "summary": "Foreign Function Interface wrapper for GLFW v3.x", "version": "0.2.0" }, "last_serial": 2481911, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "ad9c06b554a1ce24b092ff505982c136", "sha256": "55b9049d60a662725c34993feedb31c0248a2ab376fa3dac56ec06c714aa3471" }, "downloads": -1, "filename": "glfw-cffi-0.1.0.tar.gz", "has_sig": false, "md5_digest": "ad9c06b554a1ce24b092ff505982c136", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4886, "upload_time": "2015-12-27T15:33:55", "url": "https://files.pythonhosted.org/packages/b7/63/1e0cad2180788fa00f980131e992f0b36f854287b2b21f295dcf74dc958d/glfw-cffi-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "06dec9edf3a167d2980b65606377e540", "sha256": "6ef2b6f1beb8172681f5a6af3d3b06c3c4eef98c2e0a96b85ff65b4bebb82236" }, "downloads": -1, "filename": "glfw-cffi-0.1.1.tar.gz", "has_sig": false, "md5_digest": "06dec9edf3a167d2980b65606377e540", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5960, "upload_time": "2015-12-29T00:55:22", "url": "https://files.pythonhosted.org/packages/cf/4a/b199b65652b11de17187991345cdd26d0bfd8f3191af2014c6c281199af7/glfw-cffi-0.1.1.tar.gz" } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "425f9665338cb76d37badc12c8ffc623", "sha256": "cece0651831998957e175864e5c4d49c62591f68fc8a364830632a13163f1d78" }, "downloads": -1, "filename": "glfw-cffi-0.1.10.tar.gz", "has_sig": false, "md5_digest": "425f9665338cb76d37badc12c8ffc623", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 110762, "upload_time": "2016-02-22T04:52:38", "url": "https://files.pythonhosted.org/packages/c9/4c/3159086a00efaf6d887a4b1afa6cda59beb18b30fd8c3b236c4ca51a696d/glfw-cffi-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "d81b2bd14df44596acee758512233d2a", "sha256": "55d07cd9466bb1b6b0f554600b1b7c234121c5a4106e14b35b7b406d3a84b286" }, "downloads": -1, "filename": "glfw-cffi-0.1.11.tar.gz", "has_sig": false, "md5_digest": "d81b2bd14df44596acee758512233d2a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 110734, "upload_time": "2016-02-22T05:19:09", "url": "https://files.pythonhosted.org/packages/ef/4c/43e9b3d147759825c2fd63ddb3d0660f05f873344262f9d5e11ea9c931bb/glfw-cffi-0.1.11.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "75147e0694c84312507daffa39bafaf9", "sha256": "66c4d5191dad9c326310eec224c8d1ca5fa93de062d06f00e0f5a37e548168ae" }, "downloads": -1, "filename": "glfw-cffi-0.1.2.tar.gz", "has_sig": false, "md5_digest": "75147e0694c84312507daffa39bafaf9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 98014, "upload_time": "2016-01-04T23:41:51", "url": "https://files.pythonhosted.org/packages/e1/54/70e7f28ebd900a3020fae41407607ad0dbf535e624aebc9e1d43f614ae5d/glfw-cffi-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "be8ce5a04f612a8dcae28004c81a3eaf", "sha256": "97e87b57f2f9bc71887745164ebd223746a475c98a54c3fee5e9a25c3937b2da" }, "downloads": -1, "filename": "glfw-cffi-0.1.3.tar.gz", "has_sig": false, "md5_digest": "be8ce5a04f612a8dcae28004c81a3eaf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 101960, "upload_time": "2016-01-05T12:22:57", "url": "https://files.pythonhosted.org/packages/6e/62/c512e2d9ea2f67f4695a0ab551c54a34544744ebb37bfb9564d084b056e9/glfw-cffi-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "a6735477382747f5059d3f1a167822c1", "sha256": "66c942c3d2da874397e9058c1792e68384c904a086d0d7b2fb360ea52bcec5c3" }, "downloads": -1, "filename": "glfw-cffi-0.1.4.tar.gz", "has_sig": false, "md5_digest": "a6735477382747f5059d3f1a167822c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 102051, "upload_time": "2016-01-05T18:55:48", "url": "https://files.pythonhosted.org/packages/2c/a4/9241c10e42843b2034b40f650e00c5763be69344847f6b22089ec4234851/glfw-cffi-0.1.4.tar.gz" } ], "0.1.5": [], "0.1.6": [ { "comment_text": "", "digests": { "md5": "663933e22cb12c46f9bc29d96992805e", "sha256": "300fe5f5d64e4ea3f2314a527cae093aafa688bcb3d2bd60f5cfb751a44ea83b" }, "downloads": -1, "filename": "glfw_cffi-0.1.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "663933e22cb12c46f9bc29d96992805e", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 39421, "upload_time": "2016-01-06T18:55:42", "url": "https://files.pythonhosted.org/packages/63/df/e82d8c30fc84c72d007137930d42fef7a3e9551f3384efee208a63e5e599/glfw_cffi-0.1.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5cd9e00aa0fda158a4f7a83ce125099", "sha256": "7a5d73bffbeac098f98d1ebea6ea48205bf98c88dbefcd4357a8951fac0b26a9" }, "downloads": -1, "filename": "glfw-cffi-0.1.6.tar.gz", "has_sig": false, "md5_digest": "b5cd9e00aa0fda158a4f7a83ce125099", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 103046, "upload_time": "2016-01-06T17:23:56", "url": "https://files.pythonhosted.org/packages/db/e9/582e96697e9ef66caf7012a1da4cce193cad68b380c6c112b67572af7470/glfw-cffi-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "1ca38abcd4ea971e07bb142009be41ad", "sha256": "6f10650f09ee3e450ee89058582f43f5e30aebacc0f757e646bd191f926ae0cf" }, "downloads": -1, "filename": "glfw_cffi-0.1.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1ca38abcd4ea971e07bb142009be41ad", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 40103, "upload_time": "2016-01-11T01:42:53", "url": "https://files.pythonhosted.org/packages/43/fc/210de19acf9f3caa87d872420cb3ebb8b744c4aac40675d60a055126124e/glfw_cffi-0.1.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0623810bbbeeeb63c67a81d228029483", "sha256": "3c2a9d959476d446a3cb473acc455eaa764a2fdcfca3a638c6775f6ed9fab83e" }, "downloads": -1, "filename": "glfw-cffi-0.1.7.tar.gz", "has_sig": false, "md5_digest": "0623810bbbeeeb63c67a81d228029483", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 129300, "upload_time": "2016-01-11T01:40:23", "url": "https://files.pythonhosted.org/packages/2e/3e/5e6d85bb89c9d87fbc32fb4f7db800fbd403c13f98d8e3de0a1279e74816/glfw-cffi-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "907780e0ea95f9ca3d1a7cc90a4f21aa", "sha256": "6a2d83f10422064b9e992b6f9e1dc22a8d85ec42333f98a21667a876dba1447d" }, "downloads": -1, "filename": "glfw-cffi-0.1.8.tar.gz", "has_sig": false, "md5_digest": "907780e0ea95f9ca3d1a7cc90a4f21aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 108460, "upload_time": "2016-01-20T05:44:51", "url": "https://files.pythonhosted.org/packages/b5/a1/79009b0adf4edf44d519e399725847eb26e50dcaec0e4f4a231660c83ca4/glfw-cffi-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "73cb7d2bc3d1799f80c71b236bf2d4c2", "sha256": "b306b5a0636d52124be7278bcc5b716030ef5797c4179065b2289db17d9114cb" }, "downloads": -1, "filename": "glfw-cffi-0.1.9.tar.gz", "has_sig": false, "md5_digest": "73cb7d2bc3d1799f80c71b236bf2d4c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 105233, "upload_time": "2016-02-22T04:27:31", "url": "https://files.pythonhosted.org/packages/d4/e1/30c4da68c27e4bdf1da1eee9ff83aa6216b4a935cb93dbd8c6c33ce73850/glfw-cffi-0.1.9.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "d508bfe182987858a845f95eff347e2b", "sha256": "8e7e5e70cbe649b6a4862c87d2f6d4722c9957b01fe928a4e12820fb2812260f" }, "downloads": -1, "filename": "glfw-cffi-0.2.0.tar.gz", "has_sig": false, "md5_digest": "d508bfe182987858a845f95eff347e2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 118294, "upload_time": "2016-11-25T03:59:34", "url": "https://files.pythonhosted.org/packages/ef/4d/72ce6c1bd056b10a4b42fa5532a35fac8e95cd775a0aaeea4c74da7c9787/glfw-cffi-0.2.0.tar.gz" } ], "0.2.0.dev0": [ { "comment_text": "", "digests": { "md5": "97bbced0e86330a5cf5d7314380f83b8", "sha256": "3e3c86d216d242bbe01b744b24188a089ebdcdc0bcaa12fc7bec7b5696bee261" }, "downloads": -1, "filename": "glfw-cffi-0.2.0.dev0.tar.gz", "has_sig": false, "md5_digest": "97bbced0e86330a5cf5d7314380f83b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 118280, "upload_time": "2016-11-25T03:50:26", "url": "https://files.pythonhosted.org/packages/e8/6c/ea2c9997c5aec5b7cb8549ebdb2679c04d2aa0ca6d5dbbd0cf5cb2cc0fa9/glfw-cffi-0.2.0.dev0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d508bfe182987858a845f95eff347e2b", "sha256": "8e7e5e70cbe649b6a4862c87d2f6d4722c9957b01fe928a4e12820fb2812260f" }, "downloads": -1, "filename": "glfw-cffi-0.2.0.tar.gz", "has_sig": false, "md5_digest": "d508bfe182987858a845f95eff347e2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 118294, "upload_time": "2016-11-25T03:59:34", "url": "https://files.pythonhosted.org/packages/ef/4d/72ce6c1bd056b10a4b42fa5532a35fac8e95cd775a0aaeea4c74da7c9787/glfw-cffi-0.2.0.tar.gz" } ] }