{ "info": { "author": "Davide Rosa", "author_email": "dddomodossola@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "\n
\n
\n
\n A Platform-independent Python GUI library for your applications\n
\n\n\nRemi is a GUI library for Python applications which transpiles an application's interface into HTML to be rendered in a web browser. This removes platform-specific dependencies and lets you easily develop cross-platform applications in Python!\n\n\nDo you need support? Reach us on:\n\nReddit - (subreddit RemiGUI)\n
\n\n\nThere is also a drag n drop GUI editor. Look at the [Editor](https://github.com/dddomodossola/remi/tree/master/editor) subfolder to download your copy, or try it first at:\n\nlive try GUI editor overview at repl.it\n
\n\n\nChangelog\n===\n*2019 April 1*\n\nEvent listener registration can now be done by the **do** instruction instead of **connect** (that stays available for compatibility reasons).\ni.e. \n```python\nmybutton.onclick.do(myevent_listener)\n```\n\n*Older changes*\n\nThe current branch includes improvements about resource files handling. \nApp constructor accepts **static_file_path** parameter. Its value have to be a dictionary, where elements represents named resources paths.\n\ni.e.\n```python\nsuper(MyApp, self).__init__(*args, static_file_path = {'my_resources':'./files/resources/', 'my_other_res':'./other/'})\n```\nTo address a specific resource, the user have to specify the resource folder key, prepending it to the filename in the format **'/key:'**\ni.e.\n```python\nmy_widget.attributes['background-image'] = \"url('/my_resources:image.png')\"\n```\nSubfolders are accepted, and so:\n```python\nmy_widget.attributes['background-image'] = \"url('/my_resources:subfolder/other_subfolder/image.png')\"\n```\n\nThe event TextInput.onenter is no more supported.\n\nThe events TextInput.onkeydown and TextInput.onkeyup are now different, and require a different listener format. There is an additional parameter keycode.\n\nThe TextInput.onchange event now occurs also in case of Enter key pressed, if TextInput is single_line.\n\n\nGetting Started\n===\nFor a **stable** version:\n```\npip install remi\n```\n\nFor the most updated **experimental** version [Download](https://github.com/dddomodossola/remi/archive/master.zip) or check out Remi from git and install\n\n```\npython setup.py install\n```\nor install directly using pip\n\n```\npip install git+https://github.com/dddomodossola/remi.git\n```\n\nThen start the test script:\n```\npython widgets_overview_app.py\n```\n\n\nRemi\n===\nPlatform independent Python GUI library. In less than 100 Kbytes of source code, perfect for your diet.\n\n\n
\n
return the root widget.\n\n```py\nclass MyApp(App):\n def __init__(self, *args):\n super(MyApp, self).__init__(*args)\n\n def main(self):\n lbl = gui.Label(\"Hello world!\", width=100, height=30)\n\n # return of the root widget\n return lbl\n```\n\nOutside the main class start the application calling the function `start` passing as parameter the name of the class you declared previously.\n\n```py\n# starts the webserver\nstart(MyApp)\n```\n\nRun the script. If all it's OK the GUI will be opened automatically in your browser, otherwise, you have to type in the address bar \"http://127.0.0.1:8081\".\n\nYou can customize optional parameters in the `start` call like.\n\n```py\nstart(MyApp,address='127.0.0.1', port=8081, multiple_instance=False, enable_file_cache=True, update_interval=0.1, start_browser=True)\n```\n\nParameters:\n- address: network interface IP\n- port: listen port\n- multiple_instance: boolean, if True multiple clients that connect to your script has different App instances (identified by unique cookie session identifier)\n- enable_file_cache: boolean, if True enable resource caching\n- update_interval: GUI update interval in seconds. If zero, the update happens at each change. If zero, the App.idle method is not called.\n- start_browser: boolean that defines if the browser should be opened automatically at startup\n- standalone: boolean, indicates where to run the application as a standard Desktop application with its own window. If False, the interface is shown in a browser webpage.\n\nAdditional Parameters:\n- username: for a basic HTTP authentication\n- password: for a basic HTTP authentication\n- certfile: SSL certificate filename\n- keyfile: SSL key file\n- ssl_version: authentication version (i.e. ssl.PROTOCOL_TLSv1_2). If None disables SSL encryption\n\nAll widgets constructors accept two standards**kwargs that are:\n- width: can be expressed as int (and is interpreted as a pixel) or as str (and you can specify the measuring unit like '10%')\n- height: can be expressed as int (and is interpreted as a pixel) or as str (and you can specify the measuring unit like '10%')\n\n\nEvents and callbacks\n===\nWidgets expose a set of events that happen during user interaction.\nSuch events are a convenient way to define the application behavior.\nEach widget has its own callbacks, depending on the type of user interaction it allows.\nThe specific callbacks for the widgets will be illustrated later.\n\nIn order to register a function as an event listener you have to call a function like eventname.do (i.e. onclick.do) passing as parameters the callback that will manage the event.\nFollows an example:\n\n```py\nimport remi.gui as gui\nfrom remi import start, App\n\nclass MyApp(App):\n def __init__(self, *args):\n super(MyApp, self).__init__(*args)\n\n def main(self):\n container = gui.VBox(width=120, height=100)\n self.lbl = gui.Label('Hello world!')\n self.bt = gui.Button('Press me!')\n\n # setting the listener for the onclick event of the button\n self.bt.onclick.do(self.on_button_pressed)\n\n # appending a widget to another, the first argument is a string key\n container.append(self.lbl)\n container.append(self.bt)\n\n # returning the root widget\n return container\n\n # listener function\n def on_button_pressed(self, widget):\n self.lbl.set_text('Button pressed!')\n self.bt.set_text('Hi!')\n\n# starts the web server\nstart(MyApp)\n```\n\nIn the shown example *self.bt.onclick.do(self.on_button_pressed)* registers the self's *on_button_pressed* function as a listener for the event *onclick* exposed by the Button widget.\nSimple, easy.\n\nListener's callbacks will receive the emitter's instance firstly, then all other parameters provided by the specific event.\n\n\nBesides the standard event registration (as aforementioned), it is possible to pass user parameters to listener functions. This can be achieves appending parameters to the *do* function call.\n\n```py\nimport remi.gui as gui\nfrom remi import start, App\n\nclass MyApp(App):\n def __init__(self, *args):\n super(MyApp, self).__init__(*args)\n\n def main(self):\n container = gui.VBox(width=120, height=100)\n self.lbl = gui.Label('Hello world!')\n self.bt = gui.Button('Hello name!')\n self.bt2 = gui.Button('Hello name surname!')\n\n # setting the listener for the onclick event of the buttons\n self.bt.onclick.do(self.on_button_pressed, \"Name\")\n self.bt2.onclick.do(self.on_button_pressed, \"Name\", \"Surname\")\n\n # appending a widget to another\n container.append(self.lbl)\n container.append(self.bt)\n container.append(self.bt2)\n\n # returning the root widget\n return container\n\n # listener function\n def on_button_pressed(self, widget, name='', surname=''):\n self.lbl.set_text('Button pressed!')\n widget.set_text('Hello ' + name + ' ' + surname)\n\n# starts the web server\nstart(MyApp)\n```\n\nThis allows great flexibility, getting different behaviors with the same event listener definition.\n\n\nHTML Attribute accessibility\n===\nSometimes could be required to access Widget's HTML representation in order to manipulate HTML attributes.\nThe library allows accessing this information easily.\n\nA simple example: It is the case where you would like to add a hover text to a widget. This can be achieved by the *title* attribute of an HTML tag.\nIn order to do this:\n\n```py\n widget_instance.attributes['title'] = 'Your title content'\n```\n\nA special case of HTML attribute is the *style*.\nThe style attributes can be altered in this way:\n\n```py\n widget_instance.style['color'] = 'red'\n```\n\nThe assignment of a new attribute automatically creates it.\n\nFor a reference list of HTML attributes, you can refer to https://www.w3schools.com/tags/ref_attributes.asp\n\nFor a reference list of style attributes, you can refer to https://www.w3schools.com/cssref/default.asp\n\nTake care about internally used attributes. These are:\n- **class**: It is used to store the Widget class name for styling purpose\n- **id**: It is used to store the instance id of the widget for callback management\n\n\nRemote access\n===\nIf you are using your REMI app remotely, with a DNS and behind a firewall, you can specify special parameters in the `start` call:\n- **port**: HTTP server port. Don't forget to NAT this port on your router;\n\n```py\nstart(MyApp, address='0.0.0.0', port=8081)\n```\n\n\nStandalone Execution\n===\nI suggest using the browser as a standard interface window.\n\nHowever, you can avoid using the browser.\nThis can be simply obtained joining REMI and [PyWebView](https://github.com/r0x0r/pywebview).\nHere is an example about this [standalone_app.py](https://github.com/dddomodossola/remi/blob/development/examples/standalone_app.py).\n\n**Be aware that PyWebView uses qt, gtk and so on to create the window. An outdated version of these libraries can cause UI problems. If you experience UI issues, update these libraries, or better avoid standalone execution.**\n\n\nAuthentication\n===\nIn order to limit the remote access to your interface, you can define a username and password. It consists of a simple authentication process.\nJust define the parameters **username** and **password** in the start call:\n```py\nstart(MyApp, username='myusername', password='mypassword')\n```\n\n\nStyling\n===\nIn order to define a new style for your app, you have to do the following.\nCreate a *res* folder and pass it to your App class constructor:\n```python\nclass MyApp(App):\n def __init__(self, *args):\n res_path = os.path.join(os.path.dirname(__file__), 'res')\n super(MyApp, self).__init__(*args, static_file_path={'res':res_path})\n```\n\nMake a copy the standard style.css from the remi folder and paste it inside your *res* folder. Edit it in order to customize.\nThis way the standard *style.css* file gets overridden by the one you created.\n\n\nCompatibility\n===\nRemi is made to be compatible from Python2.7 to Python3.X. Please notify compatibility issues.\n\n\nSecurity\n===\nRemi should be intended as a standard desktop GUI framework.\nThe library itself doesn't implement security strategies, and so it is advised to not expose its access to unsafe public networks.\n\nWhen loading data from external sources, consider protecting the application from potential javascript injection before displaying the content directly.\n\n\nSupporting the project\n===\n*Are you able to support the Remi project?*\n\nAre you aware that remi is on Patreon?\nThat's a brilliant way to support this project.\n\n**[SUPPORT Remi now](https://patreon.com/remigui)**\n\nAlso, a small amount is really welcome.\n\n\nContributors\n===\nThank you for collaborating with us to make Remi better!\n\nThe real power of opensource is contributors. Please feel free to participate in this project, and consider to add yourself to the following list.\nYes, I know that GitHub already provides a list of contributors, but I feel that I must mention who helps.\n\n[Davide Rosa](https://github.com/dddomodossola)\n\n[John Stowers](https://github.com/nzjrs)\n\n[Claudio Cannat\u00c3\u00a0](https://github.com/cyberpro4)\n\n[Sam Pfeiffer](https://github.com/awesomebytes)\n\n[Ken Thompson](https://github.com/KenT2)\n\n[Paarth Tandon](https://github.com/Paarthri)\n\n[Ally Weir](https://github.com/allyjweir)\n\n[Timothy Cyrus](https://github.com/tcyrus)\n\n[John Hunter Bowen](https://github.com/jhb188)\n\n[Martin Spasov](https://github.com/SuburbanFilth)\n\n[Wellington Castello](https://github.com/wcastello)\n\n[PURPORC](https://github.com/PURPORC)\n\n[ttufts](https://github.com/ttufts)\n\n[Chris Braun](https://github.com/cryzed)\n\n[Alan Yorinks](https://github.com/MrYsLab)\n\n[Bernhard E. Reiter](https://github.com/bernhardreiter)\n\n[saewoonam](https://github.com/saewoonam)\n\n\nProjects using Remi\n===\n[PySimpleGUI](https://github.com/PySimpleGUI/PySimpleGUI)\nLaunched in 2018 Actively developed and supported. Supports tkinter, Qt, WxPython, Remi (in browser). Create custom layout GUI's simply. Python 2.7 & 3 Support. 100+ Demo programs & Cookbook for rapid start. Extensive documentation.\n\n[Web based dynamic reconfigure for ROS robots](https://github.com/awesomebytes/web_dyn_reconf)\n\n[razmq](https://github.com/MrYsLab/razmq)\n\n[Espresso-ARM](http://hallee.github.io/espresso-arm/)\n\n[PiPresents](https://github.com/KenT2/pipresents-gapless)\n\n[The Python Banyan Framework](https://github.com/MrYsLab/python_banyan)\n\n[LightShowPi show manager](https://bitbucket.org/chrispizzi75/lightshowpishowmanager)\n\n[rElectrum](https://github.com/emanuelelaface/rElectrum)\nA powerful promising Electrum wallet manager for safe transactions.\n\nOther Implementations\n===\nHere are listed other implementations of this library:\n- [**cremi**](https://github.com/cyberpro4/cremi): (WIP) developed for your C++ projects by [Claudio Cannat\u00c3\u00a0](https://github.com/cyberpro4).\n\n\n",
"description_content_type": "text/markdown",
"docs_url": null,
"download_url": "https://github.com/dddomodossola/remi/archive/master.zip",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/dddomodossola/remi",
"keywords": "gui-library,remi,platform-independent,ui,gui",
"license": "Apache",
"maintainer": "",
"maintainer_email": "",
"name": "remi",
"package_url": "https://pypi.org/project/remi/",
"platform": "",
"project_url": "https://pypi.org/project/remi/",
"project_urls": {
"Download": "https://github.com/dddomodossola/remi/archive/master.zip",
"Homepage": "https://github.com/dddomodossola/remi"
},
"release_url": "https://pypi.org/project/remi/2019.9/",
"requires_dist": null,
"requires_python": "",
"summary": "Python REMote Interface library",
"version": "2019.9"
},
"last_serial": 5840847,
"releases": {
"0.1": [
{
"comment_text": "",
"digests": {
"md5": "b877c697322d9aa7fbf50e66c5debc7d",
"sha256": "e7fd720e3e8c2b85604372528cf17eb6c7a0ee19a4d992b1a14fc2b8149e7e1d"
},
"downloads": -1,
"filename": "remi-0.1.zip",
"has_sig": false,
"md5_digest": "b877c697322d9aa7fbf50e66c5debc7d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 331401,
"upload_time": "2017-03-02T21:34:54",
"url": "https://files.pythonhosted.org/packages/56/d7/2674b6f89d94362739b3b0928cf99c1d21a3a8e3a5d83c9766c4097d58f4/remi-0.1.zip"
}
],
"1.0": [
{
"comment_text": "",
"digests": {
"md5": "75c0a52f2511749e2658211d11693557",
"sha256": "eb9a9cfad77f9a4fd149471159b3c655b4bd4b4175a354bdcc89096f4124d9e4"
},
"downloads": -1,
"filename": "remi-1.0.zip",
"has_sig": false,
"md5_digest": "75c0a52f2511749e2658211d11693557",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 206593,
"upload_time": "2017-05-29T12:25:12",
"url": "https://files.pythonhosted.org/packages/a6/c5/eb584f8cc2ea3843c2253efaf439e643811a23c8015f73c2ad1eb8381ad8/remi-1.0.zip"
}
],
"1.1": [
{
"comment_text": "",
"digests": {
"md5": "debf2d0081b52a453f48d6cae8b89d1f",
"sha256": "9f5720010bab9c200c184671fa1a8f4fcc0c854d32ed17d5d08aecc9cd6d0078"
},
"downloads": -1,
"filename": "remi-1.1.tar.gz",
"has_sig": false,
"md5_digest": "debf2d0081b52a453f48d6cae8b89d1f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 201490,
"upload_time": "2018-04-16T13:15:15",
"url": "https://files.pythonhosted.org/packages/1f/92/cd9e1c19958bf4614e1ee7b64c690545c8b2e1feb9debc11295abe528988/remi-1.1.tar.gz"
}
],
"1.2": [
{
"comment_text": "",
"digests": {
"md5": "201ba8d32c3a113f6595be4fd2fa4541",
"sha256": "97d1011a7cf30c080893f2530e1c7e10e548a9aaa9b25971dc79b07264ea344a"
},
"downloads": -1,
"filename": "remi-1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "201ba8d32c3a113f6595be4fd2fa4541",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 217040,
"upload_time": "2018-06-26T08:02:28",
"url": "https://files.pythonhosted.org/packages/68/f0/c0278090a0f0feabf991ea0b61d0e9777f98414b7cb8ac758dca5cc0e248/remi-1.2-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "b74b046584cf86c120a4fd9ef1f9dfad",
"sha256": "3bf77568a8b29d90523463c4cd37aa0e49acb081534ca4241801b030e4489191"
},
"downloads": -1,
"filename": "remi-1.2.tar.gz",
"has_sig": false,
"md5_digest": "b74b046584cf86c120a4fd9ef1f9dfad",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 222894,
"upload_time": "2018-06-26T08:02:34",
"url": "https://files.pythonhosted.org/packages/fc/14/c5245644065d9168923491f3812c6f2f13ba694d91551ce621f53fd48874/remi-1.2.tar.gz"
}
],
"1.2.1": [
{
"comment_text": "",
"digests": {
"md5": "072230c8eec7cf564862f4009a64b347",
"sha256": "77923e9163c64334254f0401a0e744e27f5bda8348765d38badc194b2580f53c"
},
"downloads": -1,
"filename": "remi-1.2.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "072230c8eec7cf564862f4009a64b347",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 217515,
"upload_time": "2018-07-17T09:48:56",
"url": "https://files.pythonhosted.org/packages/3a/a5/df3cc4974f00666dab15c2f36ba8f05927417aca9aa6177b3792b04c952f/remi-1.2.1-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "a2b138be297328dacfe28c51ab8237bb",
"sha256": "71ea104783b607d0dffbb7c47733a879173334297f154cf33a56b81c3bfe163d"
},
"downloads": -1,
"filename": "remi-1.2.1.tar.gz",
"has_sig": false,
"md5_digest": "a2b138be297328dacfe28c51ab8237bb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 223371,
"upload_time": "2018-07-17T09:48:58",
"url": "https://files.pythonhosted.org/packages/e5/25/10a60b638a2004b04833d61cdf899587140cd6d4a151948154b6c50ce486/remi-1.2.1.tar.gz"
}
],
"1.2.2": [
{
"comment_text": "",
"digests": {
"md5": "f7460120b3305fb68d5cf5a595c67a14",
"sha256": "ae1bebcd0f4c84e012d57ff02492fbaafa40c1fef59b03c32f7026cbd6d5fd12"
},
"downloads": -1,
"filename": "remi-1.2.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f7460120b3305fb68d5cf5a595c67a14",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 217884,
"upload_time": "2018-09-11T10:00:15",
"url": "https://files.pythonhosted.org/packages/84/8e/3b1db819f25ca14c71fc2efebce32f5ee43265c911c72f9b2db4e231e221/remi-1.2.2-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "e25503760abffba057cdca78420e48cc",
"sha256": "6d6b610faab9beba95121d0755b4c36f8a40f474a0e701293fff9f33a0a0fe68"
},
"downloads": -1,
"filename": "remi-1.2.2.tar.gz",
"has_sig": false,
"md5_digest": "e25503760abffba057cdca78420e48cc",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 223629,
"upload_time": "2018-09-11T10:00:23",
"url": "https://files.pythonhosted.org/packages/aa/62/628b8d6badab2cf3e1411839da2840615f567378c30a31710360867a7823/remi-1.2.2.tar.gz"
}
],
"2018.11": [
{
"comment_text": "",
"digests": {
"md5": "8f84994d6c857a8d241d96c9ba4d45fd",
"sha256": "962c215b055323de2c593709c5aa1f911d4129e02566deb96c642e08d0f491a3"
},
"downloads": -1,
"filename": "remi-2018.11-py3-none-any.whl",
"has_sig": false,
"md5_digest": "8f84994d6c857a8d241d96c9ba4d45fd",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 338529,
"upload_time": "2018-11-26T16:32:51",
"url": "https://files.pythonhosted.org/packages/2d/96/66b8ca5b94005efe65f2ce0963c850533db7e9dd9b129c628fe0d6eef53e/remi-2018.11-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "0577a611714d1bdb6decdd6435d8a265",
"sha256": "bacaae5620e0d041358b70eb70b7d3d22218b2b0329e13d9057573013b2041dd"
},
"downloads": -1,
"filename": "remi-2018.11.tar.gz",
"has_sig": false,
"md5_digest": "0577a611714d1bdb6decdd6435d8a265",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 331577,
"upload_time": "2018-11-26T16:32:56",
"url": "https://files.pythonhosted.org/packages/22/dd/d6754fd4c83e0d395f935806c8995c6a983fbd2a72b302d919c28afeb74a/remi-2018.11.tar.gz"
}
],
"2018.11.27": [
{
"comment_text": "",
"digests": {
"md5": "73c12d8a62e3bd30b2291adbac6e1ea5",
"sha256": "13528190d11371fe866e407449d35910a9c91bcd5dea3926e25b876dbe4f8e6b"
},
"downloads": -1,
"filename": "remi-2018.11.27-py3-none-any.whl",
"has_sig": false,
"md5_digest": "73c12d8a62e3bd30b2291adbac6e1ea5",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 338572,
"upload_time": "2018-11-27T11:28:43",
"url": "https://files.pythonhosted.org/packages/9e/7a/7c564e0fec2c5cc9e91174d9fc04b5632a25fd764eb0ef3b5bc5938754a5/remi-2018.11.27-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "d047439453f314f71e773d80d3c22d3a",
"sha256": "7bbd30e2271b9935c36dbfa8b9d16feee7a04720464940b1cc14c206d839dc57"
},
"downloads": -1,
"filename": "remi-2018.11.27.tar.gz",
"has_sig": false,
"md5_digest": "d047439453f314f71e773d80d3c22d3a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 331627,
"upload_time": "2018-11-27T11:28:49",
"url": "https://files.pythonhosted.org/packages/08/ae/0caf1ce19335e2d97d1767d3dbcfc3c556f3f5c2a08aba52235bf482fba4/remi-2018.11.27.tar.gz"
}
],
"2018.12": [
{
"comment_text": "",
"digests": {
"md5": "84ac2e637ba127bcb219d50d58b9fb8a",
"sha256": "9f772482721927daf4c29d5fb66e4892f4cb3a6b19e8a13b67a3cec46e484163"
},
"downloads": -1,
"filename": "remi-2018.12-py3-none-any.whl",
"has_sig": false,
"md5_digest": "84ac2e637ba127bcb219d50d58b9fb8a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 338567,
"upload_time": "2018-12-13T15:53:23",
"url": "https://files.pythonhosted.org/packages/db/18/8c26a975e1d3c484d11098ce71e41041d201311fc5991dc11b17e5944f5b/remi-2018.12-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "72880692cf1fceccd527f7069b11cd38",
"sha256": "19ae8c05e38577160cda987108f74f0e11e2f74478e0e5689504c460580ef1fd"
},
"downloads": -1,
"filename": "remi-2018.12.tar.gz",
"has_sig": false,
"md5_digest": "72880692cf1fceccd527f7069b11cd38",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 331576,
"upload_time": "2018-12-13T15:53:30",
"url": "https://files.pythonhosted.org/packages/b5/f2/952ebccb35b065853eee772deac370a18878601ac62b6fb7852781f69c3c/remi-2018.12.tar.gz"
}
],
"2019.4": [
{
"comment_text": "",
"digests": {
"md5": "fcd589f553d4c0b76c4e005082257a55",
"sha256": "cd8eb2b972869bb5c2b5c0611fbddaa204a5356bef58169208ace7813186c4c4"
},
"downloads": -1,
"filename": "remi-2019.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "fcd589f553d4c0b76c4e005082257a55",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 338836,
"upload_time": "2019-04-01T09:48:59",
"url": "https://files.pythonhosted.org/packages/ed/66/83e6911ee5d0206dcb672c5cd6dda28f53d58c76e8586bc6a3ef647ec7d5/remi-2019.4-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "9710ff98e91026100b68577337284c0a",
"sha256": "ad87fafbefd5a8f3c34086a877828cceca3fc5be93703707baacc069dc39edd9"
},
"downloads": -1,
"filename": "remi-2019.4.tar.gz",
"has_sig": false,
"md5_digest": "9710ff98e91026100b68577337284c0a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 331987,
"upload_time": "2019-04-01T09:49:10",
"url": "https://files.pythonhosted.org/packages/c5/7d/e260383f67e180853bc87973a239fef543bf9598a8bf0fbd4256b9a9786b/remi-2019.4.tar.gz"
}
],
"2019.9": [
{
"comment_text": "",
"digests": {
"md5": "0c2ed9baa6685031ea0708cc2beef6a7",
"sha256": "cb539f9ebd9da415e14508fbdf3f8a61ba6da47e6af43cd01bbb3da6b3d38517"
},
"downloads": -1,
"filename": "remi-2019.9-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0c2ed9baa6685031ea0708cc2beef6a7",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 340603,
"upload_time": "2019-09-17T10:05:17",
"url": "https://files.pythonhosted.org/packages/3c/a8/96d796e1c3ee7c1e9d569c2891fb910a572d5323671d2c68d125aee6e0b6/remi-2019.9-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "f4c880d7059df488768ef92d26b66ed8",
"sha256": "db822b6f5e920432d0b1c0163d1c0951b5901d624c3d24ef147457519d7721d9"
},
"downloads": -1,
"filename": "remi-2019.9.tar.gz",
"has_sig": false,
"md5_digest": "f4c880d7059df488768ef92d26b66ed8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 333798,
"upload_time": "2019-09-17T10:05:24",
"url": "https://files.pythonhosted.org/packages/b9/9e/7ea910a1a2d427c1c1e82f2b9f726acf3c738785e73d33094cd7cb42662c/remi-2019.9.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "0c2ed9baa6685031ea0708cc2beef6a7",
"sha256": "cb539f9ebd9da415e14508fbdf3f8a61ba6da47e6af43cd01bbb3da6b3d38517"
},
"downloads": -1,
"filename": "remi-2019.9-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0c2ed9baa6685031ea0708cc2beef6a7",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 340603,
"upload_time": "2019-09-17T10:05:17",
"url": "https://files.pythonhosted.org/packages/3c/a8/96d796e1c3ee7c1e9d569c2891fb910a572d5323671d2c68d125aee6e0b6/remi-2019.9-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "f4c880d7059df488768ef92d26b66ed8",
"sha256": "db822b6f5e920432d0b1c0163d1c0951b5901d624c3d24ef147457519d7721d9"
},
"downloads": -1,
"filename": "remi-2019.9.tar.gz",
"has_sig": false,
"md5_digest": "f4c880d7059df488768ef92d26b66ed8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 333798,
"upload_time": "2019-09-17T10:05:24",
"url": "https://files.pythonhosted.org/packages/b9/9e/7ea910a1a2d427c1c1e82f2b9f726acf3c738785e73d33094cd7cb42662c/remi-2019.9.tar.gz"
}
]
}