{ "info": { "author": "Ali Rathore", "author_email": "ali1rathore@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5" ], "description": "===========\nSNAP Studio\n===========\n\n\n.. image:: https://img.shields.io/pypi/v/snap_studio.svg\n :target: https://pypi.python.org/pypi/snap_studio\n\n.. image:: https://img.shields.io/travis/ali--/snap_studio.svg\n :target: https://travis-ci.org/ali--/snap_studio\n\n.. image:: https://readthedocs.org/projects/snap-studio/badge/?version=latest\n :target: https://snap-studio.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. image:: https://pyup.io/repos/github/ali--/snap_studio/shield.svg\n :target: https://pyup.io/repos/github/ali--/snap_studio/\n :alt: Updates\n\n\nSparklineData SNAP Studio\n\n\n* Free software: GNU General Public License v3\n* Documentation: https://snap-studio.readthedocs.io.\n\n\nFeatures\n--------\n\n* TODO\n\n# SNAP Cube Modeler\n\n> **Note:** This repository is private, the Docker image is public.\n\n| **Latest release** | [0.0.1 alpha](https://gitlab.com/SparklineData/snap-modeler) | \n| -- | -- |\n| **Wiki** | [Public facing documentation](https://gitlab.com/SparklineData/snap-modeler/wikis/home) |\n| **Continuous Integration** | [![Build Status](https://gitlab.com/SparklineData/snap-modeler/badges/master/build.svg)](https://gitlab.com/SparklineData/snap-modeler/commits/master) |\n| **Issues** | Issues are tracked in the [SNAP repo](https://gitlab.com/SparklineData/snap/issues?scope=all&utf8=%E2%9C%93&state=opened&label_name[]=modeler) |\n

\n\n# Quick Start\n\n\nUse the prebuilt snap-modeler image.\n\n```\ndocker run -it --net=host --name snap-modeler registry.gitlab.com/sparklinedata/snap-modeler\n```\n\n### Without docker \n\nRequires Python 3.4+\n\n(Ubuntu only) Install sasl dependancies\n\n```\napt-get install -y libsasl2-modules libsasl2-dev\n```\n\nStart the modeling server:\n\n```\npip install -r requirements.txt\nFLASK_APP=app.py flask run --host=0.0.0.0 --port=8888\n```\n\n# Using Docker\n\n\nBuild the image\n\n```\ndocker build -t snap-modeler .\n```\n\nRun the container\n\n```\ndocker run -it --net=host --name snap-modeler snap-modeler\n```\n\n## Design Decisions:\n\n#### Highest priority is User Experience\n\n * Use strong visuals to provide guidance \n * **absolutely no runtime exceptions in the UI**\n * **amazing hints, suggestions, guidance and error messages** while modeling\n * tooltips, green/red colors, tourguide for various steps\n * always show progress of background operations\n * no operation should block user interaction\n * see notes on user facing language\n\n#### Next priority is Developer Experience\nModeler UI's are famously complex applications and become difficult to modify\nor refactor over time and require developers to learn a new framework before being productive.\nThis project hopes to enable rapid refactoring and modification of the modeler UI.\n\n\nThe choice of Elm for the frontend language is due to:\n* only 1 way to do anything.\n* strong compile time static type checking.\n* requires less testing due to immutability and types\n* easy for new developers to learn\n* guarantees no runtime exceptions.\n* provides a single framework for MVC.\n\n#### All modeler logic is in a statically compiled, functional, strongly-typed frontend language\n* minimizes need for interaction with backend\n* enables highly interactive UI for the user\n* (most importantly) make impossible states and impossible user-interactions impossible at compile time.\n (for example, it should be impossible to choose a column without choosing a table.\n We can guarantee this at compile time instead of having runtime validation)\n\n#### Enable various scenarios such as:\n* different data sources (S3, Athena, Redshift, Spark, Teradata, Druid, Files)\n* data profiling can be done without the modeler to calculate potential benefits\n\n\n## Frontend:\n\nElm 0.18 + MaterialDesignLite\n\n#### Main.elm \nentrypoint and boilerplate\n\n#### UserText.elm\nAll text displayed to user is contained in this file. This included:\n* ErrorMessage - messages about issues unrelated to cube modeling. Usually related to somthing wrong with in the real world.\n * for example: no connection\n* Hints - messages presenting suggestions to user\n * positive hint - tells user to do somthing they have not yet done\n * negitive hint - tells user to not do somthing they are doing\n* Content - titles, headers, notes, descriptions, buttons, labels, tabs, icons, etc \n\n#### CubeModeler.elm\nAll the logic for creating a SNAP Cube from a set of TableInfos and ColumnInfos\n\n#### CubeModelerView.elm\nAll of the user-facing logic\n\n#### DatatableView.elm\nA pure Elm implementation of searchable, sortable, selectable datatable.\n\n#### BackendClient.elm \ndefinitions for messages sent to/from from server.\n* TableInfo\n* getAllTableInfos\n* ColumnInfo\n* getColumnInfos\n\n## Backend:\n\nContains the logic for connecting to a data source and profiling\nthe data and knows nothing about cubes or modeling.\n\n#### app.py\nA simple Flask backend server\n* hosts the modeler frontend\n* acts as HTTP to HiveThriftServer bridge\n\n## Getting Started:\n\n#### Starting the Modeler\n\n elm-make Main.elm --output=static/index.js\n pip install -r requirements.txt\n FLASK_APP=app.py flask run --host=0.0.0.0 --port=8888\n\n#### Development\nUse elm-reactor to work on the Elm source with live-reloading\n\nUse Flask debugger to work on the Python source with live-reloading\n\n FLASK_DEBUG=1 FLASK_APP=app.py flask run --host=0.0.0.0 --port=8888 --debugger\n \n\n## Notes on User-Facing language\n\nAll user-facing language should be consistent.\n\n* Avoid jargon and specific terms at all costs, provide definitions where possible\n* Avoid long content and lots of details. Reveal increasing detail about features while user explores them and actually needs the information.\n* For every message displayed to user ask \"Does user really need to know this\"\n* Write in small, scannable segments to facilitate discovery.\n* Keep sentances less that 30 words\n* Use Future Tense to describe an action (do \"Message sent\" instead of \"Message has been sent\")\n* Dont mix \"Me/My\" with \"You/Your\"\n * dont: \"Change **your** preferences in **My** Account\"\n * do: \"Change personal preference in My Account\"\n* Dont use words for numbers (do \"You have 3 messages\")\n* Focus on what the user can do with the app, rather than what the app is doing for user\n * Don\u2019t: \u201cTo get you started, we\u2019re showing you popular posts on Facebook.\u201d\n * Do: \u201cGet started with these popular posts on Facebook.\u201d\n * However, there\u2019s an exception for this rule\u200a\u2014\u200awhen a human actually does take action for a user, such as reviewing an appeal or responding to a suggestion. In such case, the use of \u201cwe\u201d is appropriate.\n * Don\u2019t: \u201cYour appeal will be reviewed, and you will receive a response within a few days.\u201d\n * Do: \u201cWe\u2019ll review your appeal and respond within a few days.\u201d\n* Use sentence-style caps for all titles, headings, labels, menu items.\n * Don\u2019t: \u201cSEARCH SETTINGS\u201d\n * Do: \u201cSearch settings\u201d\n* Exclamation points should be avoided as they could come across as shouting.\n * Don\u2019t: \u201cLearn about the new features of the app!\u201d\n * Do: \u201cWelcome\u201d\n* Cut out the wordiness. You should use simple, direct language that is easy for users to understand. All extra or common introductory phrases such as \u2018you must,\u2019 \u2018due to the fact that\u2019, \u2018in order to\u2019 should be omitted.\n * Don\u2019t: \u201cWould you like to save your changes?\u201d\n * Do: \u201cSave changes?\u201d\n * Don\u2019t: \u201cAre you sure you want to delete this photo?\u201d\n * Do: \u201cDelete this photo?\u201d\n * Don\u2019t: \u201cOK|Cancel\u201d \n * Do: \u201cRemove|Keep\u201d\n* Error messages are an inevitability. But you should make them a seamless part of user experience.\n Your error messages sound like they\u2019ve been written for humans and in order to achieve this your messages should clearly state:\n * What went wrong and possibly why.\n * What\u2019s the next step the user should take to fix the error.\n* Write the message so that the user isn\u2019t directly blamed for the error. Focus on the user problem, not the error itself.\n * Don\u2019t: \u201cYou\u2019ve provided an incorrect email.\u201d\n * Do: \u201cThis email address cannot be used. Please ensure that the spelling is correct.\u201d \n \n\nCredits\n---------\n\nThis package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template.\n\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage\n\n\n\n=======\nHistory\n=======\n\n0.1.0 (2017-12-15)\n------------------\n\n* First release on PyPI.\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://gitlab.com/SparklineData/Public/snap-studio", "keywords": "snap_studio", "license": "GNU General Public License v3", "maintainer": "", "maintainer_email": "", "name": "snap_studio", "package_url": "https://pypi.org/project/snap_studio/", "platform": "", "project_url": "https://pypi.org/project/snap_studio/", "project_urls": { "Homepage": "https://gitlab.com/SparklineData/Public/snap-studio" }, "release_url": "https://pypi.org/project/snap_studio/0.0.3/", "requires_dist": null, "requires_python": "", "summary": "SparklineData SNAP Studio", "version": "0.0.3" }, "last_serial": 3424403, "releases": { "0.0.0.1": [ { "comment_text": "", "digests": { "md5": "4434e04735ed83685d3a82ac52f3f03f", "sha256": "5912c97e6f15b568c473cc2c7b8851a7e8e0d3427b34841a316c27c4a2319f23" }, "downloads": -1, "filename": "snap_studio-0.0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4434e04735ed83685d3a82ac52f3f03f", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 149945, "upload_time": "2017-12-17T12:18:41", "url": "https://files.pythonhosted.org/packages/c9/a3/58d5e9f0d4c35e84136b9cafcad2584239cb42149f56178e91a9b8e453dc/snap_studio-0.0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f81581ba99c4fe9c05b9702ca49480ba", "sha256": "22a000681c444b933f373c0cfbe047c2de368e94318e5f16a257c685447fd1b6" }, "downloads": -1, "filename": "snap_studio-0.0.0.1.tar.gz", "has_sig": false, "md5_digest": "f81581ba99c4fe9c05b9702ca49480ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155311, "upload_time": "2017-12-17T12:18:36", "url": "https://files.pythonhosted.org/packages/e3/f1/ef15ecfbda1ba95ab21524a4d27152e74d76b0327c2954329ba1fbb9740e/snap_studio-0.0.0.1.tar.gz" } ], "0.0.1": [ { "comment_text": "", "digests": { "md5": "15a14fb60b17fc90ca1a2de53e5a8f0a", "sha256": "5e9f6fd75a0e85ab0f690e5f5b62404b1840ca7c7e997b6493a2a259cc3771d2" }, "downloads": -1, "filename": "snap_studio-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "15a14fb60b17fc90ca1a2de53e5a8f0a", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 149883, "upload_time": "2017-12-17T11:52:49", "url": "https://files.pythonhosted.org/packages/da/ee/2dac948ffc78dba3318949cd40ced3a3c45a2b6b19d0c478717ff4fffa9e/snap_studio-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d135be02241a59698bc29feccb301f5c", "sha256": "4eaea0ec22a4b41a79693c7979ef5c207b61703d2f091b087a5ab1f0116b6399" }, "downloads": -1, "filename": "snap_studio-0.0.1.tar.gz", "has_sig": false, "md5_digest": "d135be02241a59698bc29feccb301f5c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155295, "upload_time": "2017-12-17T11:52:43", "url": "https://files.pythonhosted.org/packages/55/6b/f184baca438ae8434a366dff433f2db7ef68d4880e7f2d9db814ad9222d9/snap_studio-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "9f8ef02e7f3891345bccf5f654f5da78", "sha256": "0de34d7e16cca0555d0e45730a53b719b2627be75c5b0d6fb4476b4a00902290" }, "downloads": -1, "filename": "snap_studio-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9f8ef02e7f3891345bccf5f654f5da78", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 149840, "upload_time": "2017-12-18T07:07:54", "url": "https://files.pythonhosted.org/packages/06/42/03b859c8cc5c013a3defa3c8553ae18fc57f3b4fd8347ed75b46a0642d31/snap_studio-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fe40018ce0fb41f6208c67995d6a1484", "sha256": "c56f926cba21d88a0c49e40bc2f204996506583169221e13829f90a9afe9791c" }, "downloads": -1, "filename": "snap_studio-0.0.2.tar.gz", "has_sig": false, "md5_digest": "fe40018ce0fb41f6208c67995d6a1484", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155209, "upload_time": "2017-12-18T07:07:51", "url": "https://files.pythonhosted.org/packages/0d/b9/809f3cb8cd070216df192b1beafafaa18ca4b422e00aac74ccb60b91f12c/snap_studio-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "79c8c84057a4de1837388416a63516e1", "sha256": "a55d445ac25ec66b5ead6feef0fc8a30c63c9bd1003892ee633b4c21e18cd0b0" }, "downloads": -1, "filename": "snap_studio-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "79c8c84057a4de1837388416a63516e1", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 150003, "upload_time": "2017-12-18T08:36:40", "url": "https://files.pythonhosted.org/packages/93/c9/d0a27ca8727cf998001377cef0c138ff4dfb62cabfeabd7e4cac7c81ca24/snap_studio-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cc1a1d133e1604fd65be4b4f3d26b551", "sha256": "e321b719749f86179cbed4952d9780fdce72bf2b19054fad3428f13986fa169e" }, "downloads": -1, "filename": "snap_studio-0.0.3.tar.gz", "has_sig": false, "md5_digest": "cc1a1d133e1604fd65be4b4f3d26b551", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155473, "upload_time": "2017-12-18T08:36:35", "url": "https://files.pythonhosted.org/packages/cf/fc/3a51b8b170c13a814e7de6700de5a59418e760e0c48f5c24666b49c4b1bb/snap_studio-0.0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "79c8c84057a4de1837388416a63516e1", "sha256": "a55d445ac25ec66b5ead6feef0fc8a30c63c9bd1003892ee633b4c21e18cd0b0" }, "downloads": -1, "filename": "snap_studio-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "79c8c84057a4de1837388416a63516e1", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 150003, "upload_time": "2017-12-18T08:36:40", "url": "https://files.pythonhosted.org/packages/93/c9/d0a27ca8727cf998001377cef0c138ff4dfb62cabfeabd7e4cac7c81ca24/snap_studio-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cc1a1d133e1604fd65be4b4f3d26b551", "sha256": "e321b719749f86179cbed4952d9780fdce72bf2b19054fad3428f13986fa169e" }, "downloads": -1, "filename": "snap_studio-0.0.3.tar.gz", "has_sig": false, "md5_digest": "cc1a1d133e1604fd65be4b4f3d26b551", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155473, "upload_time": "2017-12-18T08:36:35", "url": "https://files.pythonhosted.org/packages/cf/fc/3a51b8b170c13a814e7de6700de5a59418e760e0c48f5c24666b49c4b1bb/snap_studio-0.0.3.tar.gz" } ] }