{"id":19951358,"url":"https://github.com/grimen/python-palmtree","last_synced_at":"2025-07-09T14:03:51.615Z","repository":{"id":57450337,"uuid":"168603681","full_name":"grimen/python-palmtree","owner":"grimen","description":"A pretty filesystem tree inspection utility - for Python.","archived":false,"fork":false,"pushed_at":"2019-07-10T18:08:12.000Z","size":50,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-12T12:52:35.638Z","etag":null,"topics":["colors","debug","debugger","directory","file","filesystem","folder","fs","inspect","inspector","link","meta","path","pretty","tree"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/palmtree","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/grimen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"MIT-LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-31T22:00:40.000Z","updated_at":"2020-04-01T04:03:54.000Z","dependencies_parsed_at":"2022-08-25T23:01:01.866Z","dependency_job_id":null,"html_url":"https://github.com/grimen/python-palmtree","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grimen%2Fpython-palmtree","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grimen%2Fpython-palmtree/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grimen%2Fpython-palmtree/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grimen%2Fpython-palmtree/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grimen","download_url":"https://codeload.github.com/grimen/python-palmtree/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241381520,"owners_count":19953749,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["colors","debug","debugger","directory","file","filesystem","folder","fs","inspect","inspector","link","meta","path","pretty","tree"],"created_at":"2024-11-13T01:07:46.218Z","updated_at":"2025-03-01T14:43:46.557Z","avatar_url":"https://github.com/grimen.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# `palmtree` [![PyPI version](https://badge.fury.io/py/palmtree.svg)](https://badge.fury.io/py/palmtree) [![Build Status](https://travis-ci.com/grimen/python-palmtree.svg?token=sspjPRWbecBSpceU8Jyn\u0026branch=master)](https://travis-ci.com/grimen/python-palmtree) [![Coverage Status](https://codecov.io/gh/grimen/python-palmtree/branch/master/graph/badge.svg)](https://codecov.io/gh/grimen/python-palmtree)\n\n*A pretty filesystem tree inspection utility - for Python 3.*\n\n![Screenshot](https://dvfr2lc5dhzsq.cloudfront.net/items/2C2w333H38250F1U3Z1i/Screen%20Shot%202019-03-08%20at%2016.15.29.png?X-CloudApp-Visitor-Id=675422)\n\n\n## Introduction\n\nTODO\n\n\n## Install\n\nInstall using **pip**:\n\n```sh\n$ pip install palmtree\n```\n\n\n## Use\n\nVery basic **[example](https://github.com/grimen/python-mybase/tree/master/examples/basic.py)**:\n\n```python\nimport palmtree # NOTE: Python 3 is required\n\nimport os\nimport stat\nimport time\nimport datetime\nimport json\nimport colorful as color\nimport inspecta as util\n\n\n# ==========================================================\n#       EXAMPLE: log plain colorized output\n# ----------------------------------------------------\n\nprint('[log/plain]: plain colorized output')\n\npalmtree.log('./palmtree/tests/__fixtures__/foo')\n\n\n# ==========================================================\n#       EXAMPLE: log detailed custom colorized output\n# -------------------------------------------------------\n\nprint('[log/detailed]: detailed custom colorized output')\n\ndef meta (item):\n    try:\n        item_stats = os.stat(item.resolved_path)\n\n        item_byte_size = item_stats[stat.ST_SIZE]\n        item_created_at_ms = item_stats[stat.ST_CTIME]\n        item_created_at = time.strftime('%a %b %d %Y %H:%M:%S GMT%z (%Z)', time.localtime(item_created_at_ms))\n        item_data = None\n\n        if item.is_file:\n            item_data = open(item.resolved_path, 'r').read()\n\n        return ''.join([\n            str(color.darkGray('- ')),\n            ' '.join([\n                str(color.white_on_darkMagenta(' {0} bytes '.format(item_byte_size))),\n                str(item_data and json.dumps({'data': item_data}) or ''),\n                str(color.darkCyan('{0}'.format(item_created_at))),\n            ])\n        ])\n\n    except Exception as error:\n        return color.yellow('(!) could not read/resolve')\n\npalmtree.log('./palmtree/tests/__fixtures__/foo', meta = meta)\n\n\n# ==========================================================\n#       EXAMPLE: inspect plain output\n# ----------------------------------------------------\n\nprint('[inspect/plain]: inspect plain colorized output')\n\ninspection = palmtree.inspect('./palmtree/tests/__fixtures__/foo')\n\nprint('[inspect/plain]: {0}'.format(inspection))\n\n\n# ==========================================================\n#       EXAMPLE: inspect detailed custom output\n# -------------------------------------------------------\n\nprint('[inspect/detailed]: inspect detailed custom colorized output')\n\ninspection = palmtree.inspect('./palmtree/tests/__fixtures__/foo', meta = meta)\n\nprint('[inspect/detailed]:', inspection)\n\n\n# ==========================================================\n#       EXAMPLE: get plain object\n# ----------------------------------------------------\n\nprint('[get/plain]: get plain object')\n\ntree = palmtree.get('./palmtree/tests/__fixtures__/foo')\n\nprint('[get/plain]:', json.dumps(tree, indent = 4))\n\n\n# ==========================================================\n#       EXAMPLE: get detailed object\n# -------------------------------------------------------\n\nprint('[get/plain]: get detailed object')\n\ntree = palmtree.get('./palmtree/tests/__fixtures__/foo', meta = meta)\n\nprint('[get/plain]:', json.dumps(tree, indent = 4))\n\n```\n\n**Output:**\n\n```sh\n[log/plain]: plain colorized output\n\n./palmtree/tests/__fixtures__/foo\n├── bar\n    ├── bar_1.txt\n    ├── bar_2.txt\n    └── baz\n        ├── baz_1.txt\n        └── baz_2.txt\n├── baz  ⟶   ../bar/baz\n├── baz_1.txt  ⟶   ../bar/baz/baz_1.txt\n├── foo_1.txt\n├── foo_2.txt\n├── xxx  ⟶   ?\n└── xxx.txt  ⟶   ?\n\n[log/detailed]: detailed custom colorized output\n\n./palmtree/tests/__fixtures__/foo\n├── bar -  160 bytes   Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n    ├── bar_1.txt -  6 bytes  {\"data\": \"bar_1\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n    ├── bar_2.txt -  6 bytes  {\"data\": \"bar_2\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n    └── baz -  128 bytes   Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n        ├── baz_1.txt -  6 bytes  {\"data\": \"baz_1\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n        └── baz_2.txt -  6 bytes  {\"data\": \"baz_2\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n├── baz  ⟶   ../bar/baz -  128 bytes   Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n├── baz_1.txt  ⟶   ../bar/baz/baz_1.txt -  6 bytes  {\"data\": \"baz_1\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n├── foo_1.txt -  6 bytes  {\"data\": \"foo_1\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n├── foo_2.txt -  6 bytes  {\"data\": \"foo_2\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n├── xxx  ⟶   ? (!) could not read/resolve\n└── xxx.txt  ⟶   ? (!) could not read/resolve\n\n[inspect/plain]: inspect plain colorized output\n[inspect/plain]:\n./palmtree/tests/__fixtures__/foo\n├── bar\n    ├── bar_1.txt\n    ├── bar_2.txt\n    └── baz\n        ├── baz_1.txt\n        └── baz_2.txt\n├── baz  ⟶   ../bar/baz\n├── baz_1.txt  ⟶   ../bar/baz/baz_1.txt\n├── foo_1.txt\n├── foo_2.txt\n├── xxx  ⟶   ?\n└── xxx.txt  ⟶   ?\n\n\n[inspect/detailed]: inspect detailed custom colorized output\n[inspect/detailed]:\n./palmtree/tests/__fixtures__/foo\n├── bar -  160 bytes   Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n    ├── bar_1.txt -  6 bytes  {\"data\": \"bar_1\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n    ├── bar_2.txt -  6 bytes  {\"data\": \"bar_2\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n    └── baz -  128 bytes   Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n        ├── baz_1.txt -  6 bytes  {\"data\": \"baz_1\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n        └── baz_2.txt -  6 bytes  {\"data\": \"baz_2\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n├── baz  ⟶   ../bar/baz -  128 bytes   Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n├── baz_1.txt  ⟶   ../bar/baz/baz_1.txt -  6 bytes  {\"data\": \"baz_1\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n├── foo_1.txt -  6 bytes  {\"data\": \"foo_1\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n├── foo_2.txt -  6 bytes  {\"data\": \"foo_2\\n\"} Thu Mar 07 2019 05:02:33 GMT-0500 (EST)\n├── xxx  ⟶   ? (!) could not read/resolve\n└── xxx.txt  ⟶   ? (!) could not read/resolve\n\n\n[get/plain]: get plain object\n[get/plain]: [\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar\",\n        \"relative_path\": \".\",\n        \"name\": \"bar\",\n        \"extension\": null,\n        \"key\": \"bar\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar\",\n        \"resolved_relative_path\": \".\",\n        \"resolved_name\": \"bar\",\n        \"resolved_extension\": null,\n        \"resolved_key\": \"bar\",\n        \"is_resolved_directory\": true,\n        \"is_resolved_file\": false,\n        \"is_resolved_link\": false,\n        \"is_directory\": true,\n        \"is_file\": false,\n        \"is_link\": false,\n        \"is_resolved\": true,\n        \"children\": [\n            {\n                \"level\": 1,\n                \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_1.txt\",\n                \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_1.txt\",\n                \"relative_path\": \".\",\n                \"name\": \"bar_1.txt\",\n                \"extension\": \".txt\",\n                \"key\": \"bar_1\",\n                \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_1.txt\",\n                \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_1.txt\",\n                \"resolved_relative_path\": \".\",\n                \"resolved_name\": \"bar_1.txt\",\n                \"resolved_extension\": \".txt\",\n                \"resolved_key\": \"bar_1\",\n                \"is_resolved_directory\": false,\n                \"is_resolved_file\": true,\n                \"is_resolved_link\": false,\n                \"is_directory\": false,\n                \"is_file\": true,\n                \"is_link\": false,\n                \"is_resolved\": true,\n                \"children\": null,\n                \"meta\": \"\"\n            },\n            {\n                \"level\": 1,\n                \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_2.txt\",\n                \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_2.txt\",\n                \"relative_path\": \".\",\n                \"name\": \"bar_2.txt\",\n                \"extension\": \".txt\",\n                \"key\": \"bar_2\",\n                \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_2.txt\",\n                \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_2.txt\",\n                \"resolved_relative_path\": \".\",\n                \"resolved_name\": \"bar_2.txt\",\n                \"resolved_extension\": \".txt\",\n                \"resolved_key\": \"bar_2\",\n                \"is_resolved_directory\": false,\n                \"is_resolved_file\": true,\n                \"is_resolved_link\": false,\n                \"is_directory\": false,\n                \"is_file\": true,\n                \"is_link\": false,\n                \"is_resolved\": true,\n                \"children\": null,\n                \"meta\": \"\"\n            },\n            {\n                \"level\": 1,\n                \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n                \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n                \"relative_path\": \".\",\n                \"name\": \"baz\",\n                \"extension\": null,\n                \"key\": \"baz\",\n                \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n                \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n                \"resolved_relative_path\": \".\",\n                \"resolved_name\": \"baz\",\n                \"resolved_extension\": null,\n                \"resolved_key\": \"baz\",\n                \"is_resolved_directory\": true,\n                \"is_resolved_file\": false,\n                \"is_resolved_link\": false,\n                \"is_directory\": true,\n                \"is_file\": false,\n                \"is_link\": false,\n                \"is_resolved\": true,\n                \"children\": [\n                    {\n                        \"level\": 2,\n                        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n                        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n                        \"relative_path\": \".\",\n                        \"name\": \"baz_1.txt\",\n                        \"extension\": \".txt\",\n                        \"key\": \"baz_1\",\n                        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n                        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n                        \"resolved_relative_path\": \".\",\n                        \"resolved_name\": \"baz_1.txt\",\n                        \"resolved_extension\": \".txt\",\n                        \"resolved_key\": \"baz_1\",\n                        \"is_resolved_directory\": false,\n                        \"is_resolved_file\": true,\n                        \"is_resolved_link\": false,\n                        \"is_directory\": false,\n                        \"is_file\": true,\n                        \"is_link\": false,\n                        \"is_resolved\": true,\n                        \"children\": null,\n                        \"meta\": \"\"\n                    },\n                    {\n                        \"level\": 2,\n                        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_2.txt\",\n                        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_2.txt\",\n                        \"relative_path\": \".\",\n                        \"name\": \"baz_2.txt\",\n                        \"extension\": \".txt\",\n                        \"key\": \"baz_2\",\n                        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_2.txt\",\n                        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_2.txt\",\n                        \"resolved_relative_path\": \".\",\n                        \"resolved_name\": \"baz_2.txt\",\n                        \"resolved_extension\": \".txt\",\n                        \"resolved_key\": \"baz_2\",\n                        \"is_resolved_directory\": false,\n                        \"is_resolved_file\": true,\n                        \"is_resolved_link\": false,\n                        \"is_directory\": false,\n                        \"is_file\": true,\n                        \"is_link\": false,\n                        \"is_resolved\": true,\n                        \"children\": null,\n                        \"meta\": \"\"\n                    }\n                ],\n                \"meta\": \"\"\n            }\n        ],\n        \"meta\": \"\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/baz\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/baz\",\n        \"relative_path\": \".\",\n        \"name\": \"baz\",\n        \"extension\": null,\n        \"key\": \"baz\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n        \"resolved_relative_path\": \"../bar/baz\",\n        \"resolved_name\": \"baz\",\n        \"resolved_extension\": null,\n        \"resolved_key\": \"baz\",\n        \"is_resolved_directory\": true,\n        \"is_resolved_file\": false,\n        \"is_resolved_link\": false,\n        \"is_directory\": true,\n        \"is_file\": false,\n        \"is_link\": true,\n        \"is_resolved\": true,\n        \"children\": null,\n        \"meta\": \"\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/baz_1.txt\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/baz_1.txt\",\n        \"relative_path\": \".\",\n        \"name\": \"baz_1.txt\",\n        \"extension\": \".txt\",\n        \"key\": \"baz_1\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n        \"resolved_relative_path\": \"../bar/baz/baz_1.txt\",\n        \"resolved_name\": \"baz_1.txt\",\n        \"resolved_extension\": \".txt\",\n        \"resolved_key\": \"baz_1\",\n        \"is_resolved_directory\": false,\n        \"is_resolved_file\": true,\n        \"is_resolved_link\": false,\n        \"is_directory\": false,\n        \"is_file\": true,\n        \"is_link\": true,\n        \"is_resolved\": true,\n        \"children\": null,\n        \"meta\": \"\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_1.txt\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_1.txt\",\n        \"relative_path\": \".\",\n        \"name\": \"foo_1.txt\",\n        \"extension\": \".txt\",\n        \"key\": \"foo_1\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_1.txt\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_1.txt\",\n        \"resolved_relative_path\": \".\",\n        \"resolved_name\": \"foo_1.txt\",\n        \"resolved_extension\": \".txt\",\n        \"resolved_key\": \"foo_1\",\n        \"is_resolved_directory\": false,\n        \"is_resolved_file\": true,\n        \"is_resolved_link\": false,\n        \"is_directory\": false,\n        \"is_file\": true,\n        \"is_link\": false,\n        \"is_resolved\": true,\n        \"children\": null,\n        \"meta\": \"\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_2.txt\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_2.txt\",\n        \"relative_path\": \".\",\n        \"name\": \"foo_2.txt\",\n        \"extension\": \".txt\",\n        \"key\": \"foo_2\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_2.txt\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_2.txt\",\n        \"resolved_relative_path\": \".\",\n        \"resolved_name\": \"foo_2.txt\",\n        \"resolved_extension\": \".txt\",\n        \"resolved_key\": \"foo_2\",\n        \"is_resolved_directory\": false,\n        \"is_resolved_file\": true,\n        \"is_resolved_link\": false,\n        \"is_directory\": false,\n        \"is_file\": true,\n        \"is_link\": false,\n        \"is_resolved\": true,\n        \"children\": null,\n        \"meta\": \"\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx\",\n        \"relative_path\": \".\",\n        \"name\": \"xxx\",\n        \"extension\": null,\n        \"key\": \"xxx\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx\",\n        \"resolved_relative_path\": \".\",\n        \"resolved_name\": \"xxx\",\n        \"resolved_extension\": null,\n        \"resolved_key\": \"xxx\",\n        \"is_resolved_directory\": false,\n        \"is_resolved_file\": false,\n        \"is_resolved_link\": true,\n        \"is_directory\": false,\n        \"is_file\": false,\n        \"is_link\": true,\n        \"is_resolved\": false,\n        \"children\": null,\n        \"meta\": \"\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx.txt\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx.txt\",\n        \"relative_path\": \".\",\n        \"name\": \"xxx.txt\",\n        \"extension\": \".txt\",\n        \"key\": \"xxx\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx.txt\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx.txt\",\n        \"resolved_relative_path\": \".\",\n        \"resolved_name\": \"xxx.txt\",\n        \"resolved_extension\": \".txt\",\n        \"resolved_key\": \"xxx\",\n        \"is_resolved_directory\": false,\n        \"is_resolved_file\": false,\n        \"is_resolved_link\": true,\n        \"is_directory\": false,\n        \"is_file\": false,\n        \"is_link\": true,\n        \"is_resolved\": false,\n        \"children\": null,\n        \"meta\": \"\"\n    }\n]\n[get/plain]: get detailed object\n[get/plain]: [\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar\",\n        \"relative_path\": \".\",\n        \"name\": \"bar\",\n        \"extension\": null,\n        \"key\": \"bar\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar\",\n        \"resolved_relative_path\": \".\",\n        \"resolved_name\": \"bar\",\n        \"resolved_extension\": null,\n        \"resolved_key\": \"bar\",\n        \"is_resolved_directory\": true,\n        \"is_resolved_file\": false,\n        \"is_resolved_link\": false,\n        \"is_directory\": true,\n        \"is_file\": false,\n        \"is_link\": false,\n        \"is_resolved\": true,\n        \"children\": [\n            {\n                \"level\": 1,\n                \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_1.txt\",\n                \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_1.txt\",\n                \"relative_path\": \".\",\n                \"name\": \"bar_1.txt\",\n                \"extension\": \".txt\",\n                \"key\": \"bar_1\",\n                \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_1.txt\",\n                \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_1.txt\",\n                \"resolved_relative_path\": \".\",\n                \"resolved_name\": \"bar_1.txt\",\n                \"resolved_extension\": \".txt\",\n                \"resolved_key\": \"bar_1\",\n                \"is_resolved_directory\": false,\n                \"is_resolved_file\": true,\n                \"is_resolved_link\": false,\n                \"is_directory\": false,\n                \"is_file\": true,\n                \"is_link\": false,\n                \"is_resolved\": true,\n                \"children\": null,\n                \"meta\": \"\\u001b[38;5;248m- \\u001b[39m\\u001b[38;5;231m\\u001b[48;5;127m 6 bytes \\u001b[39m\\u001b[49m {\\\"data\\\": \\\"bar_1\\\\n\\\"} \\u001b[38;5;37mThu Mar 07 2019 05:02:33 GMT-0500 (EST)\\u001b[39m\"\n            },\n            {\n                \"level\": 1,\n                \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_2.txt\",\n                \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_2.txt\",\n                \"relative_path\": \".\",\n                \"name\": \"bar_2.txt\",\n                \"extension\": \".txt\",\n                \"key\": \"bar_2\",\n                \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_2.txt\",\n                \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/bar_2.txt\",\n                \"resolved_relative_path\": \".\",\n                \"resolved_name\": \"bar_2.txt\",\n                \"resolved_extension\": \".txt\",\n                \"resolved_key\": \"bar_2\",\n                \"is_resolved_directory\": false,\n                \"is_resolved_file\": true,\n                \"is_resolved_link\": false,\n                \"is_directory\": false,\n                \"is_file\": true,\n                \"is_link\": false,\n                \"is_resolved\": true,\n                \"children\": null,\n                \"meta\": \"\\u001b[38;5;248m- \\u001b[39m\\u001b[38;5;231m\\u001b[48;5;127m 6 bytes \\u001b[39m\\u001b[49m {\\\"data\\\": \\\"bar_2\\\\n\\\"} \\u001b[38;5;37mThu Mar 07 2019 05:02:33 GMT-0500 (EST)\\u001b[39m\"\n            },\n            {\n                \"level\": 1,\n                \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n                \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n                \"relative_path\": \".\",\n                \"name\": \"baz\",\n                \"extension\": null,\n                \"key\": \"baz\",\n                \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n                \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n                \"resolved_relative_path\": \".\",\n                \"resolved_name\": \"baz\",\n                \"resolved_extension\": null,\n                \"resolved_key\": \"baz\",\n                \"is_resolved_directory\": true,\n                \"is_resolved_file\": false,\n                \"is_resolved_link\": false,\n                \"is_directory\": true,\n                \"is_file\": false,\n                \"is_link\": false,\n                \"is_resolved\": true,\n                \"children\": [\n                    {\n                        \"level\": 2,\n                        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n                        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n                        \"relative_path\": \".\",\n                        \"name\": \"baz_1.txt\",\n                        \"extension\": \".txt\",\n                        \"key\": \"baz_1\",\n                        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n                        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n                        \"resolved_relative_path\": \".\",\n                        \"resolved_name\": \"baz_1.txt\",\n                        \"resolved_extension\": \".txt\",\n                        \"resolved_key\": \"baz_1\",\n                        \"is_resolved_directory\": false,\n                        \"is_resolved_file\": true,\n                        \"is_resolved_link\": false,\n                        \"is_directory\": false,\n                        \"is_file\": true,\n                        \"is_link\": false,\n                        \"is_resolved\": true,\n                        \"children\": null,\n                        \"meta\": \"\\u001b[38;5;248m- \\u001b[39m\\u001b[38;5;231m\\u001b[48;5;127m 6 bytes \\u001b[39m\\u001b[49m {\\\"data\\\": \\\"baz_1\\\\n\\\"} \\u001b[38;5;37mThu Mar 07 2019 05:02:33 GMT-0500 (EST)\\u001b[39m\"\n                    },\n                    {\n                        \"level\": 2,\n                        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_2.txt\",\n                        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_2.txt\",\n                        \"relative_path\": \".\",\n                        \"name\": \"baz_2.txt\",\n                        \"extension\": \".txt\",\n                        \"key\": \"baz_2\",\n                        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_2.txt\",\n                        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_2.txt\",\n                        \"resolved_relative_path\": \".\",\n                        \"resolved_name\": \"baz_2.txt\",\n                        \"resolved_extension\": \".txt\",\n                        \"resolved_key\": \"baz_2\",\n                        \"is_resolved_directory\": false,\n                        \"is_resolved_file\": true,\n                        \"is_resolved_link\": false,\n                        \"is_directory\": false,\n                        \"is_file\": true,\n                        \"is_link\": false,\n                        \"is_resolved\": true,\n                        \"children\": null,\n                        \"meta\": \"\\u001b[38;5;248m- \\u001b[39m\\u001b[38;5;231m\\u001b[48;5;127m 6 bytes \\u001b[39m\\u001b[49m {\\\"data\\\": \\\"baz_2\\\\n\\\"} \\u001b[38;5;37mThu Mar 07 2019 05:02:33 GMT-0500 (EST)\\u001b[39m\"\n                    }\n                ],\n                \"meta\": \"\\u001b[38;5;248m- \\u001b[39m\\u001b[38;5;231m\\u001b[48;5;127m 128 bytes \\u001b[39m\\u001b[49m  \\u001b[38;5;37mThu Mar 07 2019 05:02:33 GMT-0500 (EST)\\u001b[39m\"\n            }\n        ],\n        \"meta\": \"\\u001b[38;5;248m- \\u001b[39m\\u001b[38;5;231m\\u001b[48;5;127m 160 bytes \\u001b[39m\\u001b[49m  \\u001b[38;5;37mThu Mar 07 2019 05:02:33 GMT-0500 (EST)\\u001b[39m\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/baz\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/baz\",\n        \"relative_path\": \".\",\n        \"name\": \"baz\",\n        \"extension\": null,\n        \"key\": \"baz\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz\",\n        \"resolved_relative_path\": \"../bar/baz\",\n        \"resolved_name\": \"baz\",\n        \"resolved_extension\": null,\n        \"resolved_key\": \"baz\",\n        \"is_resolved_directory\": true,\n        \"is_resolved_file\": false,\n        \"is_resolved_link\": false,\n        \"is_directory\": true,\n        \"is_file\": false,\n        \"is_link\": true,\n        \"is_resolved\": true,\n        \"children\": null,\n        \"meta\": \"\\u001b[38;5;248m- \\u001b[39m\\u001b[38;5;231m\\u001b[48;5;127m 128 bytes \\u001b[39m\\u001b[49m  \\u001b[38;5;37mThu Mar 07 2019 05:02:33 GMT-0500 (EST)\\u001b[39m\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/baz_1.txt\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/baz_1.txt\",\n        \"relative_path\": \".\",\n        \"name\": \"baz_1.txt\",\n        \"extension\": \".txt\",\n        \"key\": \"baz_1\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/bar/baz/baz_1.txt\",\n        \"resolved_relative_path\": \"../bar/baz/baz_1.txt\",\n        \"resolved_name\": \"baz_1.txt\",\n        \"resolved_extension\": \".txt\",\n        \"resolved_key\": \"baz_1\",\n        \"is_resolved_directory\": false,\n        \"is_resolved_file\": true,\n        \"is_resolved_link\": false,\n        \"is_directory\": false,\n        \"is_file\": true,\n        \"is_link\": true,\n        \"is_resolved\": true,\n        \"children\": null,\n        \"meta\": \"\\u001b[38;5;248m- \\u001b[39m\\u001b[38;5;231m\\u001b[48;5;127m 6 bytes \\u001b[39m\\u001b[49m {\\\"data\\\": \\\"baz_1\\\\n\\\"} \\u001b[38;5;37mThu Mar 07 2019 05:02:33 GMT-0500 (EST)\\u001b[39m\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_1.txt\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_1.txt\",\n        \"relative_path\": \".\",\n        \"name\": \"foo_1.txt\",\n        \"extension\": \".txt\",\n        \"key\": \"foo_1\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_1.txt\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_1.txt\",\n        \"resolved_relative_path\": \".\",\n        \"resolved_name\": \"foo_1.txt\",\n        \"resolved_extension\": \".txt\",\n        \"resolved_key\": \"foo_1\",\n        \"is_resolved_directory\": false,\n        \"is_resolved_file\": true,\n        \"is_resolved_link\": false,\n        \"is_directory\": false,\n        \"is_file\": true,\n        \"is_link\": false,\n        \"is_resolved\": true,\n        \"children\": null,\n        \"meta\": \"\\u001b[38;5;248m- \\u001b[39m\\u001b[38;5;231m\\u001b[48;5;127m 6 bytes \\u001b[39m\\u001b[49m {\\\"data\\\": \\\"foo_1\\\\n\\\"} \\u001b[38;5;37mThu Mar 07 2019 05:02:33 GMT-0500 (EST)\\u001b[39m\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_2.txt\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_2.txt\",\n        \"relative_path\": \".\",\n        \"name\": \"foo_2.txt\",\n        \"extension\": \".txt\",\n        \"key\": \"foo_2\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_2.txt\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/foo_2.txt\",\n        \"resolved_relative_path\": \".\",\n        \"resolved_name\": \"foo_2.txt\",\n        \"resolved_extension\": \".txt\",\n        \"resolved_key\": \"foo_2\",\n        \"is_resolved_directory\": false,\n        \"is_resolved_file\": true,\n        \"is_resolved_link\": false,\n        \"is_directory\": false,\n        \"is_file\": true,\n        \"is_link\": false,\n        \"is_resolved\": true,\n        \"children\": null,\n        \"meta\": \"\\u001b[38;5;248m- \\u001b[39m\\u001b[38;5;231m\\u001b[48;5;127m 6 bytes \\u001b[39m\\u001b[49m {\\\"data\\\": \\\"foo_2\\\\n\\\"} \\u001b[38;5;37mThu Mar 07 2019 05:02:33 GMT-0500 (EST)\\u001b[39m\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx\",\n        \"relative_path\": \".\",\n        \"name\": \"xxx\",\n        \"extension\": null,\n        \"key\": \"xxx\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx\",\n        \"resolved_relative_path\": \".\",\n        \"resolved_name\": \"xxx\",\n        \"resolved_extension\": null,\n        \"resolved_key\": \"xxx\",\n        \"is_resolved_directory\": false,\n        \"is_resolved_file\": false,\n        \"is_resolved_link\": true,\n        \"is_directory\": false,\n        \"is_file\": false,\n        \"is_link\": true,\n        \"is_resolved\": false,\n        \"children\": null,\n        \"meta\": \"\\u001b[38;5;226m(!) could not read/resolve\\u001b[39m\"\n    },\n    {\n        \"level\": 0,\n        \"path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx.txt\",\n        \"absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx.txt\",\n        \"relative_path\": \".\",\n        \"name\": \"xxx.txt\",\n        \"extension\": \".txt\",\n        \"key\": \"xxx\",\n        \"resolved_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx.txt\",\n        \"resolved_absolute_path\": \"/Users/grimen/Dev/Private/python-palmtree/palmtree/tests/__fixtures__/foo/xxx.txt\",\n        \"resolved_relative_path\": \".\",\n        \"resolved_name\": \"xxx.txt\",\n        \"resolved_extension\": \".txt\",\n        \"resolved_key\": \"xxx\",\n        \"is_resolved_directory\": false,\n        \"is_resolved_file\": false,\n        \"is_resolved_link\": true,\n        \"is_directory\": false,\n        \"is_file\": false,\n        \"is_link\": true,\n        \"is_resolved\": false,\n        \"children\": null,\n        \"meta\": \"\\u001b[38;5;226m(!) could not read/resolve\\u001b[39m\"\n    }\n]\n```\n\n\n## Test\n\nClone down source code:\n\n```sh\n$ make install\n```\n\nRun **colorful tests**, with only native environment (dependency sandboxing up to you):\n\n```sh\n$ make test\n```\n\nRun **less colorful tests**, with **multi-environment** (using **tox**):\n\n```sh\n$ make test-tox\n```\n\n\n## Related\n\n- [**`node-palmtree`**](https://github.com/grimen/node-palmtree) - *\"A pretty filesystem tree inspection utility - for Node.js\"*\n\n\n## About\n\nThis project was mainly initiated - in lack of solid existing alternatives - to be used at our work at **[Markable.ai](https://markable.ai)** to have common code conventions between various programming environments where **Python** (research, CV, AI) is heavily used.\n\n\n## License\n\nReleased under the MIT license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrimen%2Fpython-palmtree","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrimen%2Fpython-palmtree","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrimen%2Fpython-palmtree/lists"}