{ "info": { "author": "Wei Ren", "author_email": "renwei2004@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: WSGI :: Application" ], "description": "pytwask\n=======\n\n**Source code and development docker image:** |Code Build Status|\n\n**Production docker image:** |Docker Build Status|\n\nA toy-twitter-clone frontend using Python and Flask.\n\nTo run this Flask application locally in the production mode,\n\n.. code:: bash\n\n $ pip install pytwask\n $ export FLASK_APP=autopytwask\n $ export PYTWASK_ENV=prod\n $ flask run\n\nFor how to run the application in the development mode, please refer to\n`Section 5 <#5-development>`__.\n\nFor how to deploy the application via docker, please refer to `Section\n4.2 <#42-deploy-the-flask-application-via-docker>`__.\n\nTable of Contents\n=================\n\n- `1. Features <#1-features>`__\n- `2. Backend database <#2-backend-database>`__\n- `3. MTV architecture <#3-mtv-architecture>`__\n- `4. Deployment <#4-deployment>`__\n\n - `4.1. Deploy the Flask application in the\n cloud. <#41-deploy-the-flask-application-in-the-cloud>`__\n\n - `4.1.1. Install Python 3.6, pip, pip3,\n virtualenvwrapper. <#411-install-python-36-pip-pip3-virtualenvwrapper>`__\n - `4.1.2. Create a separate user which will run the Flask\n application. <#412-create-a-separate-user-which-will-run-the-flask-application>`__\n - `4.1.3. Create the virtual environment for running the Flask\n application. <#413-create-the-virtual-environment-for-running-the-flask-application>`__\n - `4.1.4. Install the Python WSGI HTTP server Gunicorn and the\n Flask application pytwask in the above virtual environment\n flask-apps. <#414-install-the-python-wsgi-http-server-gunicorn-and-the-flask-application-pytwask-in-the-above-virtual-environment-flask-apps>`__\n - `4.1.5. Install and configure\n nginx. <#415-install-and-configure-nginx>`__\n - `4.1.6. Start a Gunicorn process to serve the Flask\n application. <#416-start-a-gunicorn-process-to-serve-the-flask-application>`__\n - `4.1.7. (Optional) Create a systemd unit file and enable the\n Gunicorn process as a\n service. <#417-optional-create-a-systemd-unit-file-and-enable-the-gunicorn-process-as-a-service>`__\n\n - `4.2. Deploy the Flask application via\n docker. <#42-deploy-the-flask-application-via-docker>`__\n\n - `4.2.1 Install docker and\n docker-compose. <#421-install-docker-and-docker-compose>`__\n - `4.2.2 Download the docker-compose yml\n file. <#422-download-the-docker-compose-yml-file>`__\n - `4.2.3 Build services. <#423-build-services>`__\n - `4.2.4 Create and start\n containers. <#424-create-and-start-containers>`__\n\n - `4.3. Troubleshooting <#43-troubleshooting>`__\n\n - `4.3.1. Errors while reloading .bashrc for\n virtualenvwrapper. <#431-errors-while-reloading-bashrc-for-virtualenvwrapper>`__\n - `4.3.2. Errors while installing\n nginx. <#432-errors-while-installing-nginx>`__\n\n- `5. Development <#5-development>`__\n- `6. PEP8 <#6-pep8>`__\n- `7. README.rst <#7-readmerst>`__\n\n1. Features\n===========\n\nThis module implements the frontend for a simplified Twitter clone based\non Flask.\n\nIt supports the following features:\n\n- Register new users\n- Log in/out\n- Change user password\n- Get user profile\n- Post tweets\n- Follower/Following\n- General timeline for anonymous user\n- User timeline\n- Get tweets posted by one user\n\nTODOs:\n\n- Search users\n- Delete a user\n- Recover user password\n- #hashtags\n- @mentions\n- Retweets\n- Replies\n- Conversations\n- Edit/Delete tweets\n- And more\n\n2. Backend database\n===================\n\nAlthough currently we only have Redis as the only type of backend\ndatabase, we can easily switch to another type of backend database as\nlong as the backend module conforms to the same interface as the Redis\nbackend module ``pytwis``.\n\nBy default this Flask application will connect to the Redis database via\na TCP/IP connection. To connect to a local Redis database via a UNIX\ndomain socket, define the environment variable ``REDIS_DB_SOCKET`` as\nthe socket file (e.g., ``/tmp/redis.sock``) before running the\napplication.\n\n.. code:: bash\n\n $ export REDIS_DB_SOCKET=\"/tmp/redis.sock\"\n $ export FLASK_APP=autopytwask\n $ flash run\n\nNote that the UNIX domain socket is by default disabled in Redis and you\nneed to manually enable it in the Redis configuration file (usually\n``/etc/redis/redis.conf``) before use it.\n\n3. MTV architecture\n===================\n\nThis Flask application follows the typical Flask Model-Template-View\npattern. Its directory layout follows the ones given at\n\n- http://flask.pocoo.org/docs/0.12/patterns/packages/\n- http://flask.pocoo.org/docs/0.12/patterns/appfactories/#app-factories\n- http://flask.pocoo.org/docs/0.12/cli/\n\nSpecifically,\n\n::\n\n .\n \u251c\u2500\u2500 autopytwask.py # The Flask script which creates this Flask application\n \u2514\u2500\u2500 pytwask\n \u251c\u2500\u2500 auth # The authentication blueprint\n \u251c\u2500\u2500 config.py # The Flask application configuration file\n \u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 main # The main blueprint\n \u251c\u2500\u2500 models.py # The data Model\n \u251c\u2500\u2500 static # The HTML resources (css, images, javascript)\n \u251c\u2500\u2500 templates # The HTML Templates\n \u2514\u2500\u2500 tweets # The tweets blueprint\n\n4. Deployment\n=============\n\n4.1. Deploy the Flask application in the cloud.\n-----------------------------------------------\n\nTake the Amazon Web Service (AWS) as an example. Assume that we have\ncreated an EC2 instance with Ubuntu 16.04LTS, exposed its HTTP port 80,\nand SSH\u2019ed into it.\n\n4.1.1. Install Python 3.6, pip, pip3, virtualenvwrapper.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n (1) Install Python 3.6 from source. \n\n.. code:: bash\n\n # Download the latest source release of Python 3.6.\n $ wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz\n\n # Unpack the downloaded archive.\n $ tar -xvf Python-3.6.5.tgz\n\n # Build and install.\n $ cd Python-3.6.5\n $ ./configure\n $ make\n $ make install\n\n # Verify the installation.\n $ python3.6 -V\n Python 3.6.5\n\n::\n\n (2) Install pip and pip3. \n\n.. code:: bash\n\n $ sudo apt install python-pip python3-pip\n\n::\n\n (3) Install virtualenvwrapper. \n\n.. code:: bash\n\n $ sudo pip3 install virtualenvwrapper\n\n4.1.2. Create a separate user which will run the Flask application.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWe should never run the Flask application as root. If we do that, once\nthe Flask application is compromised somehow, the attacker will gain\naccess to the entire system.\n\n.. code:: bash\n\n $ sudo adduser flask-apps\n\n4.1.3. Create the virtual environment for running the Flask application.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n (1) Set up `virtualenvwrapper` for the user `flask-apps`.\n\n.. code:: bash\n\n $ sudo su - flask-apps\n $ vi ~/.bashrc\n\nAdd the following lines in ``.bashrc``.\n\n::\n\n export WORKON_HOME=$HOME/.virtualenvs\n export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'\n source /usr/local/bin/virtualenvwrapper.sh\n\n::\n\n (2) Reload `.bashrc` and create a virtual environment for running the Flask application.\n\n.. code:: bash\n\n $ cd\n $ source .bashrc\n $ mkvirtualenv -p /usr/bin/python3.6 pytwask\n\nNote that the binary location of ``python3.6`` may vary on different\nmachines but it can be easily found by ``which python3.6``.\n\n4.1.4. Install the Python WSGI HTTP server ``Gunicorn`` and the Flask application ``pytwask`` in the above virtual environment ``flask-apps``.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: bash\n\n # After mkvirtualenv is done, the virtual environment flask-apps should be automatically activated. \n # But if not, we can manually activate it.\n $ workon pytwask\n\n (pytwask) $ pip install gunicorn pytwask\n\n4.1.5. Install and configure nginx.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n (1) Install nginx.\n\n.. code:: bash\n\n # Exit the user flask-apps\n $ exit\n\n $ sudo apt install nginx\n\n::\n\n (2) Configure nginx to proxy requests.\n\n * Optimize the nginx parameter `default_type` for the Flask application.\n\n According to http://www.patricksoftwareblog.com/how-to-configure-nginx-for-a-flask-web-application/, for a Flask application that is generating dynamic HTML files, the parameter `default_type` should be changed to: `default_type text/html;`.\n\n.. code:: bash\n\n $ sudo vi /etc/nginx/nginx.conf \n\n::\n\n http {\n ......\n\n include /etc/nginx/mime.types;\n default_type text/html; # was application/octet-stream\n\n ......\n }\n\n::\n\n * Create a configuration file for pytwask.\n\n.. code:: bash\n\n $ sudo vi /etc/nginx/sites-available/pytwask\n\nNote that we will pass requests to the socket we defined using the\n``proxy_pass`` directive.\n\n::\n\n server {\n listen 80;\n server_name [SERVER_DNS_NAME OR SERVER_IP];\n\n location / {\n include proxy_params;\n proxy_pass http://unix:/tmp/pytwask.sock;\n }\n }\n\n::\n\n * Enable the above server configuration by linking the file to the `sites-enabled` directory.\n\n.. code:: bash\n\n $ sudo ln -s /etc/nginx/sites-available/pytwask /etc/nginx/sites-enabled\n\n::\n\n * Test the configuration file for syntax error.\n\n.. code:: bash\n\n $ sudo nginx -t\n\n::\n\n * Restart nginx to load the new configuration.\n\n.. code:: bash\n\n $ sudo service nginx restart\n\n4.1.6. Start a Gunicorn process to serve the Flask application.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: bash\n\n $ sudo su - flask-apps\n\n # Here we use the UNIX domain socket to connect to the Redis database.\n # If you want to use the TCP/IP connection, then don't define the environment variable REDIS_DB_SOCKET.\n $ export PYTWASK_ENV=prod\n $ export REDIS_DB_SOCKET=\"/tmp/redis.sock\"\n $ export REDIS_DB_PASSWORD=\"[PASSWORD]\"\n\n $ workon pytwask\n (pytwask) $ gunicorn -b unix:/tmp/pytwask.sock -m 007 -w 4 autopytwask:app &\n\nNote that the ampersand \u201c&\u201d will set the Gunicorn process off running in\nthe background.\n\n4.1.7. (Optional) Create a systemd unit file and enable the Gunicorn process as a service.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n (1) Create a unit file ending in `.service` within the directory `/etc/systemd/system`.\n\n.. code:: bash\n\n $ sudo vi /etc/systemd/system/pytwask.service\n\n::\n\n (2) Add the section `[Unit]` to specify metadata and dependencies.\n\n::\n\n [Unit]\n Description=Gunicorn instance to serve pytwask\n After=network.target\n\n::\n\n (3) Add the section `[Service]` to specify:\n\n * the user `flask-apps` and group `www-data` that we want the process to run under;\n * the working directory and set various environment variables;\n * the command to start the service.\n\n Note that we give the group ownership to group `www-data` so that nginx can communicate easily with the Gunicorn process.\n\n::\n\n [Unit]\n Description=Gunicorn instance to serve pytwask\n After=network.target\n\n [Service]\n User=flask-apps\n Group=www-data\n WorkingDirectory=/home/flask-apps/.virtualenvs\n Environment=\"PATH=/home/flask-apps/.virtualenvs/pytwask/bin\"\n Environment=\"PYTWASK_ENV=prod\"\n Environment=\"REDIS_DB_SOCKET=/tmp/redis.sock\"\n Environment=\"REDIS_DB_PASSWORD=[PASSWORD]\"\n ExecStart=/home/flask-apps/.virtualenvs/pytwask/bin/gunicorn -b unix:/tmp/pytwask.sock -m 007 -w 4 autopytwask:app\n\n::\n\n (4) Add the section `[Install]` to tell systemd what to link this service to if we enable it to start at boot.\n\n::\n\n [Unit]\n Description=Gunicorn instance to serve pytwask\n After=network.target\n\n [Service]\n User=flask-apps\n Group=www-data\n WorkingDirectory=/home/flask-apps/.virtualenvs\n Environment=\"PATH=/home/flask-apps/.virtualenvs/pytwask/bin\"\n Environment=\"PYTWASK_ENV=prod\"\n Environment=\"REDIS_DB_SOCKET=/tmp/redis.sock\"\n Environment=\"REDIS_DB_PASSWORD=[PASSWORD]\"\n ExecStart=/home/flask-apps/.virtualenvs/pytwask/bin/gunicorn -b unix:/tmp/pytwask.sock -m 007 -w 4 autopytwask:app\n\n [Install]\n WantedBy=multi-user.target\n\n::\n\n (5) Start the Gunicorn service and enable it to start at boot.\n\n.. code:: bash\n\n $ sudo systemctl start pytwask\n $ sudo systemctl enable pytwask\n\n4.2. Deploy the Flask application via docker.\n---------------------------------------------\n\nVia docker, this flask application can be deployed not only on Linux but\nalso on Windows, but note that **when it is deployed on Docker for\nWindows, we need to switch to Linux containers**.\n\n4.2.1 Install docker and docker-compose.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFor docker, see https://docs.docker.com/install/.\n\nFor docker-compose, see\nhttps://docs.docker.com/compose/install/#install-compose.\n\n4.2.2 Download the docker-compose yml file.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: bash\n\n $ wget https://raw.githubusercontent.com/renweizhukov/docker-pytwask/master/docker-compose.yml\n\n4.2.3 Build services.\n~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: bash\n\n $ docker-compose build\n\n4.2.4 Create and start containers.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: bash\n\n $ docker-compose up -d\n\nTo stop and remove containers, networks, images, and volumes,\n\n.. code:: bash\n\n $ docker-compose down -v\n\n4.3. Troubleshooting\n--------------------\n\n4.3.1. `Errors while reloading .bashrc for virtualenvwrapper `__.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n /usr/bin/python3: Error while finding spec for 'virtualenvwrapper.hook_loader' (: No module named 'virtualenvwrapper')\n\nTo fix this, install ``python3-pip`` and then install\n``virtualenvwrapper`` from ``pip3``.\n\n.. code:: bash\n\n $ sudo apt install python3-pip\n $ sudo pip3 install virtualwrapperenv\n\n4.3.2. `Errors while installing nginx `__.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo fix this, stop apache2 before installing nginx.\n\n.. code:: bash\n\n $ sudo service apache2 stop\n\nAs a further step, we may disable apache2 from startup or even remove\napache2.\n\n.. code:: bash\n\n # To disable apache2\n $ sudo update-rc.d apache2 disable\n\n # To remove apache2\n $ sudo update-rc.d -f apache2 remove\n\n5. Development\n==============\n\nBy default, this Flask application will run in the development mode\nwhere the Flask DebugToolbar is enabled.\n\n.. code:: bash\n\n $ git clone https://github.com/renweizhukov/pytwask.git\n $ cd pytwask\n $ pip install -e .\n $ export FLASK_APP=autopytwask\n $ flask run\n\nTo launch the application in the development mode via docker, first\ninstall docker and docker-compose by following steps given in `Section\n4.2 <#42-deploy-the-flask-application-via-docker>`__, and then build\nservices, create and start containers.\n\n.. code:: bash\n\n $ git clone https://github.com/renweizhukov/pytwask.git\n\n # Build services.\n $ docker-compose -f docker-compose_dev.yml build\n\n # Create and start containers in the detach mode.\n $ docker-compose -f docker-compose_dev.yml up -d \n\nTo stop and remove containers, networks, images, and volumes,\n\n.. code:: bash\n\n $ docker-compose -f docker-compose_dev.yml down -v\n\n6. PEP8\n=======\n\nWe use ``pylint`` to enforce the Python Style Guide PEP8.\n\n.. code:: bash\n\n $ pylint pytwask\n\nWe have fixed all the convention violations, warnings, and errors in the\npackage ``pytwask``.\n\n7. README.rst\n=============\n\nREADME.rst is generated from README.md via ``pandoc``.\n\n.. code:: bash\n\n $ pandoc --from=markdown --to=rst --output=README.rst README.md\n\n.. |Code Build Status| image:: https://travis-ci.org/renweizhukov/pytwask.svg?branch=master\n :target: https://travis-ci.org/renweizhukov/pytwask\n.. |Docker Build Status| image:: https://travis-ci.org/renweizhukov/docker-pytwask.svg?branch=master\n :target: https://travis-ci.org/renweizhukov/docker-pytwask\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://renweizhukov.github.io/pytwask", "keywords": "flask twitter python3.6", "license": "", "maintainer": "", "maintainer_email": "", "name": "pytwask", "package_url": "https://pypi.org/project/pytwask/", "platform": "", "project_url": "https://pypi.org/project/pytwask/", "project_urls": { "Bug Reports": "https://github.com/renweizhukov/pytwask/issues", "Documentation": "https://renweizhukov.github.io/pytwask", "Homepage": "https://renweizhukov.github.io/pytwask", "Source": "https://github.com/renweizhukov/pytwask" }, "release_url": "https://pypi.org/project/pytwask/0.2.3/", "requires_dist": [ "Flask", "Flask-DebugToolbar", "Flask-Login", "Flask-Moment", "Flask-WTF", "WTForms", "itsdangerous", "pytwis", "setuptools" ], "requires_python": ">=3.6", "summary": "A twitter-toy-clone frontend using Python and Flask", "version": "0.2.3" }, "last_serial": 3946747, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "d6b87a139f71aeee2435415919636493", "sha256": "85090f78eb414ea478603e5f1859b039fd62d99469f55361e3b67c45e34edd88" }, "downloads": -1, "filename": "pytwask-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d6b87a139f71aeee2435415919636493", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 68779, "upload_time": "2018-04-07T01:01:37", "url": "https://files.pythonhosted.org/packages/f9/bd/a196383d518f505fad700053a9aaed4f2a33b17b97b384ae00f7a7b96a5b/pytwask-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "693f39b32d16b8e1b217ca0d1fd44d0b", "sha256": "eef33c6bc85280cdc60fa38d0c57902651cd1f6db1f7e9f5a1421b41744db378" }, "downloads": -1, "filename": "pytwask-0.1.0.tar.gz", "has_sig": false, "md5_digest": "693f39b32d16b8e1b217ca0d1fd44d0b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 58057, "upload_time": "2018-04-07T01:01:39", "url": "https://files.pythonhosted.org/packages/67/4d/2bfef6b6786ed75cecb1de352adb468deecdc5cbff158a4528050be2875f/pytwask-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "6133ea5d4b6a71b4b37a04f402dad39d", "sha256": "9b98c229f8ebb7785c2d32150c558116013f1b365c8ceaf9c3d84f5787a5a980" }, "downloads": -1, "filename": "pytwask-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6133ea5d4b6a71b4b37a04f402dad39d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 68890, "upload_time": "2018-04-07T07:52:04", "url": "https://files.pythonhosted.org/packages/00/74/30e86c276aeb74672ee64349d6c3147e25a90863f7be9fd54eb88eb50355/pytwask-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c518367c14718183ab7ec40aab0b5eef", "sha256": "d0fce8deadcb773169a110d8f4291db1892c205c3d8880ecbe1e59e08591259b" }, "downloads": -1, "filename": "pytwask-0.1.1.tar.gz", "has_sig": false, "md5_digest": "c518367c14718183ab7ec40aab0b5eef", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 58160, "upload_time": "2018-04-07T07:52:05", "url": "https://files.pythonhosted.org/packages/d8/32/423daffd8ed81ca35f55cb7fedb6b3d5ff75152dc9c58e6979c7b83ebd20/pytwask-0.1.1.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "7600fde85ac1c23628a9f5530889f279", "sha256": "3174e543c8783dc0ac570c0bfdb8739a9a200bf9bfb6a4f0a548a80bdb39dc25" }, "downloads": -1, "filename": "pytwask-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "7600fde85ac1c23628a9f5530889f279", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 68658, "upload_time": "2018-04-08T09:51:32", "url": "https://files.pythonhosted.org/packages/cb/46/277055a433799e586a19d04c7b473b928f421f7631843fb620bfce1c5999/pytwask-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e915d374786c64cac80891831f3f3f6a", "sha256": "5cd13a4fa23637f1c54060c788fef7e90279d90ba6ebbd1fae2e469eb50ebb61" }, "downloads": -1, "filename": "pytwask-0.1.4.tar.gz", "has_sig": false, "md5_digest": "e915d374786c64cac80891831f3f3f6a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 62754, "upload_time": "2018-04-08T09:51:33", "url": "https://files.pythonhosted.org/packages/23/87/8755f31bfdd3c9e9d77107a517f7a934f11406727d65078fbebb0a41d378/pytwask-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "aa4e74f4b591cfbbf5cade8178d46368", "sha256": "c9769948079242ce44e8f3e375fe8c2c4aff9190153b4017e9e12ba50602bf1f" }, "downloads": -1, "filename": "pytwask-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "aa4e74f4b591cfbbf5cade8178d46368", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 70889, "upload_time": "2018-04-11T21:58:28", "url": "https://files.pythonhosted.org/packages/f7/fe/6db8e0bc402223a3f8b1dc21034eef17bf38eb10f781dc75ea1c41705e38/pytwask-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4e854dab4a01c137139e4560d5aca9ba", "sha256": "018d23e74ce0ae8ca02f1260d0741ecfea16a03c1faddd287866c3003c5fceeb" }, "downloads": -1, "filename": "pytwask-0.1.5.tar.gz", "has_sig": false, "md5_digest": "4e854dab4a01c137139e4560d5aca9ba", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 67043, "upload_time": "2018-04-11T21:58:30", "url": "https://files.pythonhosted.org/packages/2e/60/7d85bbc841f23b36a2f0ae00214e72618794dd6cf575abbbc9c8a5114786/pytwask-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "29e004949536ed4b6ae618cedd67ec25", "sha256": "34249ec669c6d117fa51a0c02d43c1421b1ceeb1497f8d4973f244bb8d78cf84" }, "downloads": -1, "filename": "pytwask-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "29e004949536ed4b6ae618cedd67ec25", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 70886, "upload_time": "2018-04-11T22:03:04", "url": "https://files.pythonhosted.org/packages/a1/b6/1f67f6da6e643beda4d87c4031450c7b29fd212ce370666162e317730747/pytwask-0.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b2fa3c3b9dc711cf8480cd7c3474a6d7", "sha256": "46cedd2e26ac45566498f5931c19919bdd2079cb02665f64dbc617ea607fb9dd" }, "downloads": -1, "filename": "pytwask-0.1.6.tar.gz", "has_sig": false, "md5_digest": "b2fa3c3b9dc711cf8480cd7c3474a6d7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 67036, "upload_time": "2018-04-11T22:03:05", "url": "https://files.pythonhosted.org/packages/69/9a/e521115f7f44740ccae0a46963e840e1914178f58417d93fb741356d574f/pytwask-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "bdc173ee2af1068d3ea3a9fbe71f2a60", "sha256": "d0d64cb210eb3a2bfaba0cf12d8cb0e93653b8bbfb5807c38393d156c6fd916d" }, "downloads": -1, "filename": "pytwask-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "bdc173ee2af1068d3ea3a9fbe71f2a60", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 71398, "upload_time": "2018-06-08T05:46:40", "url": "https://files.pythonhosted.org/packages/29/de/533281830ab43ba87cf5717cca9e6c178af14d53f5844cdcbee4a985e153/pytwask-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7ea8082ff1156d7edce2336f7ec05542", "sha256": "92bfeba6137b893c955224db9ab7a4977e836ca713ea9ec97bea277747466d2c" }, "downloads": -1, "filename": "pytwask-0.1.7.tar.gz", "has_sig": false, "md5_digest": "7ea8082ff1156d7edce2336f7ec05542", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 68404, "upload_time": "2018-06-08T05:46:41", "url": "https://files.pythonhosted.org/packages/dd/e9/239cab517cfa0edd28db192247ca5906aecb38cf646b3c43e8abf4fc7879/pytwask-0.1.7.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "b028ddcea749678e5d66756d2dfbf633", "sha256": "6614caf7e097339e905fbb082776fca1386da0e868bbbaf5c6670f8a50b76556" }, "downloads": -1, "filename": "pytwask-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b028ddcea749678e5d66756d2dfbf633", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 72394, "upload_time": "2018-06-08T21:53:56", "url": "https://files.pythonhosted.org/packages/1f/e5/cb81444af3374d30e29ef98527264df59e04c23111a6256d70d29efeefeb/pytwask-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "43b095e3f78d276d0616608b970db0f6", "sha256": "3c895f5ecb979ac47cf8b4c75039137d8a69c86cb655bab8f578056172eff0c8" }, "downloads": -1, "filename": "pytwask-0.2.0.tar.gz", "has_sig": false, "md5_digest": "43b095e3f78d276d0616608b970db0f6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 72129, "upload_time": "2018-06-08T21:53:57", "url": "https://files.pythonhosted.org/packages/d8/e6/44b26ee77b7ccce1fa67a2996027f1a959d70de6274a1f41464c14974203/pytwask-0.2.0.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "e9c6d13924e4f3e348fbbbd063f46795", "sha256": "ee50db674a8c01e8afefc9f0a3481c64011061bb162cf6c6ae06bccda5fe7c78" }, "downloads": -1, "filename": "pytwask-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e9c6d13924e4f3e348fbbbd063f46795", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 72495, "upload_time": "2018-06-10T07:52:23", "url": "https://files.pythonhosted.org/packages/9e/bf/acf8735d53ce5847fef7ac4aa9ae37bd116a20cbe2db7f4a7df76f01ff13/pytwask-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8e239f2f8c12e1e902508052047e5e77", "sha256": "cf10d57d0a025001efa8ed865c649b1350c053f0424a05f40b0282bf376e422c" }, "downloads": -1, "filename": "pytwask-0.2.3.tar.gz", "has_sig": false, "md5_digest": "8e239f2f8c12e1e902508052047e5e77", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 75827, "upload_time": "2018-06-10T07:52:24", "url": "https://files.pythonhosted.org/packages/bc/86/77bf028122b194f2a757c8d38eb7ca3b120abb3ce236d5f53c5192872214/pytwask-0.2.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e9c6d13924e4f3e348fbbbd063f46795", "sha256": "ee50db674a8c01e8afefc9f0a3481c64011061bb162cf6c6ae06bccda5fe7c78" }, "downloads": -1, "filename": "pytwask-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e9c6d13924e4f3e348fbbbd063f46795", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 72495, "upload_time": "2018-06-10T07:52:23", "url": "https://files.pythonhosted.org/packages/9e/bf/acf8735d53ce5847fef7ac4aa9ae37bd116a20cbe2db7f4a7df76f01ff13/pytwask-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8e239f2f8c12e1e902508052047e5e77", "sha256": "cf10d57d0a025001efa8ed865c649b1350c053f0424a05f40b0282bf376e422c" }, "downloads": -1, "filename": "pytwask-0.2.3.tar.gz", "has_sig": false, "md5_digest": "8e239f2f8c12e1e902508052047e5e77", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 75827, "upload_time": "2018-06-10T07:52:24", "url": "https://files.pythonhosted.org/packages/bc/86/77bf028122b194f2a757c8d38eb7ca3b120abb3ce236d5f53c5192872214/pytwask-0.2.3.tar.gz" } ] }