{ "info": { "author": "Chris Tippett", "author_email": "chris.tippett@servian.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries", "Topic :: Utilities" ], "description": "# BigQuery View Analyzer\n[![PyPI version](https://img.shields.io/pypi/v/bigquery-view-analyzer.svg)](https://pypi.python.org/pypi/bigquery-view-analyzer)\n[![Python versions](https://img.shields.io/pypi/pyversions/bigquery-view-analyzer.svg)](https://pypi.python.org/pypi/bigquery-view-analyzer)\n[![Build status](https://img.shields.io/travis/servian/bigquery-view-analyzer.svg)](https://travis-ci.org/servian/bigquery-view-analyzer)\n[![Github license](https://img.shields.io/github/license/servian/bigquery-view-analyzer.svg)](https://github.com/servian/bigquery-view-analyzer)\n\n## Description\n`bigquery-view-analyzer` is a command-line tool for visualizing dependencies and managing permissions between BigQuery views.\n\nTo authorize a view, permissions must be granted at a dataset level for every view/table referenced in the view definition. This requirement cascades down to every view that's referenced by the parent view, they too must have permissions granted for every view/table they reference - and so on. This can quickly become difficult to manage if you have many nested views across multiple datasets and/or projects.\n\n`bigquery-view-analyzer` automatically resolves these dependencies and applies the relevant permissions to all views and datasets referenced by the parent view.\n\n\n## Installation\n\n```bash\n$ pip install bigquery-view-analyzer\n```\n\n## Usage\n\n```bash\n$ bqva --help\n```\n\n[![asciicast](https://asciinema.org/a/252724.svg)](https://asciinema.org/a/252724)\n\n\n### Example\n\n![Example tree](/docs/example.png)\n\nGiven the above datasets and tables in BigQuery, to authorize `bqva-demo:dataset_4.shared_view`, the following views would need to be authorized with each of the following datasets:\n\n- Authorized views for **`dataset_1`**\n - `bqva-demo:dataset_3.view_a_b_c_d`\n- Authorized views for **`dataset_2`**\n - `bqva-demo:dataset_3.view_a_b_c_d`\n - `bqva-demo:dataset_1.view_c`\n- Authorized views for **`dataset_3`**\n - `bqva-demo:dataset_2.view_d`\n - `bqva-demo:dataset_4.shared_view`\n\nYou can easily visualize the above view hierarchy using the `bqva tree` command.\n\n```bash\n# View dependency tree and authorization status for 'bqva-demo:dataset_4.shared_view'\n$ bqva tree --status --no-key --view \"bqva-demo:dataset_4.shared_view\"\nbqva-demo:dataset_4.shared_view\n\u2514\u2500\u2500 bqva-demo:dataset_3.view_a_b_c_d (\u2a2f)\n \u251c\u2500\u2500 bqva-demo:dataset_1.table_a (\u2a2f)\n \u251c\u2500\u2500 bqva-demo:dataset_1.table_b (\u2a2f)\n \u251c\u2500\u2500 bqva-demo:dataset_1.view_c (\u2a2f)\n \u2502 \u2514\u2500\u2500 bqva-demo:dataset_2.table_c (\u2a2f)\n \u2514\u2500\u2500 bqva-demo:dataset_2.view_d (\u2a2f)\n \u2514\u2500\u2500 bqva-demo:dataset_3.table_d (\u2a2f)\n```\n\nPermissions can be applied automatically to all datasets referenced by the parent view using the `bqva authorize` command.\n\n```bash\n# Apply all permissions required by 'bqva-demo:dataset_4.shared_view'\n$ bqva authorize --view \"bqva-demo:dataset_4.shared_view\"\nbqva-demo:dataset_4.shared_view\n\u2514\u2500\u2500 bqva-demo:dataset_3.view_a_b_c_d (\u2713)\n \u251c\u2500\u2500 bqva-demo:dataset_1.table_a (\u2713)\n \u251c\u2500\u2500 bqva-demo:dataset_1.table_b (\u2713)\n \u251c\u2500\u2500 bqva-demo:dataset_1.view_c (\u2713)\n \u2502 \u2514\u2500\u2500 bqva-demo:dataset_2.table_c (\u2713)\n \u2514\u2500\u2500 bqva-demo:dataset_2.view_d (\u2713)\n \u2514\u2500\u2500 bqva-demo:dataset_3.table_d (\u2713)\n```\n\nIf you want to revoke permissions for a view, you can do that too!\n\n```bash\n# Revoke all permissions granted to 'bqva-demo:dataset_4.shared_view'\n$ bqva revoke --view \"bqva-demo:dataset_4.shared_view\"\nbqva-demo:dataset_4.shared_view\n\u2514\u2500\u2500 bqva-demo:dataset_3.view_a_b_c_d (\u2a2f)\n \u251c\u2500\u2500 bqva-demo:dataset_1.table_a (\u2a2f)\n \u251c\u2500\u2500 bqva-demo:dataset_1.table_b (\u2a2f)\n \u251c\u2500\u2500 bqva-demo:dataset_1.view_c (\u2a2f)\n \u2502 \u2514\u2500\u2500 bqva-demo:dataset_2.table_c (\u2a2f)\n \u2514\u2500\u2500 bqva-demo:dataset_2.view_d (\u2a2f)\n \u2514\u2500\u2500 bqva-demo:dataset_3.table_d (\u2a2f)\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/servian/bigquery-view-analyzer/", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "bigquery-view-analyzer", "package_url": "https://pypi.org/project/bigquery-view-analyzer/", "platform": "", "project_url": "https://pypi.org/project/bigquery-view-analyzer/", "project_urls": { "Homepage": "http://github.com/servian/bigquery-view-analyzer/" }, "release_url": "https://pypi.org/project/bigquery-view-analyzer/19.8.0/", "requires_dist": [ "google-cloud-bigquery", "anytree", "colorama", "yaspin", "click" ], "requires_python": "", "summary": "A command-line tool for visualizing dependencies and managing permissions between BigQuery views", "version": "19.8.0" }, "last_serial": 5676123, "releases": { "19.6.0": [ { "comment_text": "", "digests": { "md5": "81eabc630ddb7132fd4be1221ba7d6a5", "sha256": "b649f551a01c1c59ecd43c42b6c615447ddf95068aeeea73802d040d75ad3043" }, "downloads": -1, "filename": "bigquery_view_analyzer-19.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "81eabc630ddb7132fd4be1221ba7d6a5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5942, "upload_time": "2019-06-20T01:40:41", "url": "https://files.pythonhosted.org/packages/a8/8c/f289567e0514ba345a89cd57fe1902c519b281f6a52afd45e4da50742825/bigquery_view_analyzer-19.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9466e7a0ec4b3d205f2337873a0ce2b2", "sha256": "c4d47fe161a0fd883aa3e22d952b0dd9d321c59a1cec03cc9300b8c88f6dc522" }, "downloads": -1, "filename": "bigquery-view-analyzer-19.6.0.tar.gz", "has_sig": false, "md5_digest": "9466e7a0ec4b3d205f2337873a0ce2b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4059, "upload_time": "2019-06-20T01:40:43", "url": "https://files.pythonhosted.org/packages/af/46/525bbe2a168ec814fc7dadade722ee10038b2760c81389f67681175f68e8/bigquery-view-analyzer-19.6.0.tar.gz" } ], "19.6.1": [ { "comment_text": "", "digests": { "md5": "81cde727b0e74a46d49a3c5173f625bf", "sha256": "059129e3462a2039157adb3158235c0db28c57a4326c2a85a7b9a91d1bfd50dc" }, "downloads": -1, "filename": "bigquery_view_analyzer-19.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "81cde727b0e74a46d49a3c5173f625bf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6773, "upload_time": "2019-06-20T05:56:47", "url": "https://files.pythonhosted.org/packages/fe/62/932323acbeb5a0f9a6f8e114deab50bf4207941fb7d5b1eb0ac6e04346bb/bigquery_view_analyzer-19.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "05ee1e3695e34354fcb6f636854a45e4", "sha256": "601e3e4645c88258e8993286bd7f2062d4c6c8a26419b90859d7cb6c3c7a4213" }, "downloads": -1, "filename": "bigquery-view-analyzer-19.6.1.tar.gz", "has_sig": false, "md5_digest": "05ee1e3695e34354fcb6f636854a45e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5084, "upload_time": "2019-06-20T05:56:48", "url": "https://files.pythonhosted.org/packages/fc/46/b1a5542c69c7caac721205f2c393cc1ca54886b28141f6e3da5226442082/bigquery-view-analyzer-19.6.1.tar.gz" } ], "19.6.2": [ { "comment_text": "", "digests": { "md5": "6ff9298e715cb82ce0db8f0b4e3dffcf", "sha256": "9ee8baa5b2cd8a55838c8fc1af7a499d393e292a1ed0651b827faf69370a2200" }, "downloads": -1, "filename": "bigquery_view_analyzer-19.6.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6ff9298e715cb82ce0db8f0b4e3dffcf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6825, "upload_time": "2019-06-27T06:00:23", "url": "https://files.pythonhosted.org/packages/bb/82/1ee66c1ff46c22681543ff08d1077456280f1080058922630da7f04cb6ca/bigquery_view_analyzer-19.6.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e1d87ba7831794f568bb6be823e88894", "sha256": "e58a0f06e677bc68944e72e490072bb814c1c42ace7cc0de87fe93759440a227" }, "downloads": -1, "filename": "bigquery-view-analyzer-19.6.2.tar.gz", "has_sig": false, "md5_digest": "e1d87ba7831794f568bb6be823e88894", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5131, "upload_time": "2019-06-27T06:00:24", "url": "https://files.pythonhosted.org/packages/b5/b0/d0c810033cbf46127b26716d229799e0f0f1cb5ee3bc6a8670b6610bab5f/bigquery-view-analyzer-19.6.2.tar.gz" } ], "19.8.0": [ { "comment_text": "", "digests": { "md5": "321d58f8b561810a22c3c8aa45a67c03", "sha256": "303cd5a1cc3b33487e48e7c7a5d4fd3d8192a8119e860435d2f48b1759eaa792" }, "downloads": -1, "filename": "bigquery_view_analyzer-19.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "321d58f8b561810a22c3c8aa45a67c03", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6947, "upload_time": "2019-08-14T09:54:31", "url": "https://files.pythonhosted.org/packages/a2/02/dd66147259d2cdf54ed7573b88538633a9730dd1ae34704ea89044a732b8/bigquery_view_analyzer-19.8.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76d72ae636971aa638cba9358cec0b6c", "sha256": "47d50ed84f2340bcb4dfd7110c430580f964119c7ca109bf50c47a607bd02c34" }, "downloads": -1, "filename": "bigquery-view-analyzer-19.8.0.tar.gz", "has_sig": false, "md5_digest": "76d72ae636971aa638cba9358cec0b6c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5250, "upload_time": "2019-08-14T09:54:32", "url": "https://files.pythonhosted.org/packages/1d/3d/e1871d336e9ddb1bb450c5f1620f37d5cbf69b33bb4c89d58c20b55ec1c3/bigquery-view-analyzer-19.8.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "321d58f8b561810a22c3c8aa45a67c03", "sha256": "303cd5a1cc3b33487e48e7c7a5d4fd3d8192a8119e860435d2f48b1759eaa792" }, "downloads": -1, "filename": "bigquery_view_analyzer-19.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "321d58f8b561810a22c3c8aa45a67c03", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6947, "upload_time": "2019-08-14T09:54:31", "url": "https://files.pythonhosted.org/packages/a2/02/dd66147259d2cdf54ed7573b88538633a9730dd1ae34704ea89044a732b8/bigquery_view_analyzer-19.8.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76d72ae636971aa638cba9358cec0b6c", "sha256": "47d50ed84f2340bcb4dfd7110c430580f964119c7ca109bf50c47a607bd02c34" }, "downloads": -1, "filename": "bigquery-view-analyzer-19.8.0.tar.gz", "has_sig": false, "md5_digest": "76d72ae636971aa638cba9358cec0b6c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5250, "upload_time": "2019-08-14T09:54:32", "url": "https://files.pythonhosted.org/packages/1d/3d/e1871d336e9ddb1bb450c5f1620f37d5cbf69b33bb4c89d58c20b55ec1c3/bigquery-view-analyzer-19.8.0.tar.gz" } ] }