{"id":34922734,"url":"https://github.com/peterkuma/pst","last_synced_at":"2026-04-05T20:41:34.816Z","repository":{"id":44454256,"uuid":"169165559","full_name":"peterkuma/pst","owner":"peterkuma","description":"Plain Structured Text (PST)","archived":false,"fork":false,"pushed_at":"2024-12-22T11:28:59.000Z","size":113,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-11T01:07:01.173Z","etag":null,"topics":["bash","command-line","data-format","json","python","yaml"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/peterkuma.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-02-04T23:25:54.000Z","updated_at":"2024-12-22T11:29:03.000Z","dependencies_parsed_at":"2024-12-22T12:21:47.637Z","dependency_job_id":"3db1d3af-93c8-4fd1-b6ba-a4fe9f6f8a18","html_url":"https://github.com/peterkuma/pst","commit_stats":{"total_commits":58,"total_committers":3,"mean_commits":"19.333333333333332","dds":0.5172413793103448,"last_synced_commit":"dfa5497700994a027568454b6062bc99ef3faa72"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/peterkuma/pst","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterkuma%2Fpst","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterkuma%2Fpst/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterkuma%2Fpst/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterkuma%2Fpst/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peterkuma","download_url":"https://codeload.github.com/peterkuma/pst/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterkuma%2Fpst/sbom","scorecard":{"id":729019,"data":{"date":"2025-08-11","repo":{"name":"github.com/peterkuma/pst","commit":"95dd950f949f5fb9f302d394f804474c63cc8fea"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: The Unlicense: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-22T13:51:10.724Z","repository_id":44454256,"created_at":"2025-08-22T13:51:10.724Z","updated_at":"2025-08-22T13:51:10.724Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31449835,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T15:22:31.103Z","status":"ssl_error","status_checked_at":"2026-04-05T15:22:00.205Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["bash","command-line","data-format","json","python","yaml"],"created_at":"2025-12-26T13:56:25.886Z","updated_at":"2026-04-05T20:41:34.810Z","avatar_url":"https://github.com/peterkuma.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Plain Structured Text (PST)\n===========================\n\nPST is a format for encoding structured text similar to Bourne shell formatting\nand JSON. PST supports strings, numbers (integers and floating-point), bool,\nmissing values (`none`), arrays, objects (key-value pairs),\nsingle-character flags (`-x`), and string flags (`--abc`).\nRelative to JSON, PST is simpler, while supporting much of its features.\nPST aims to be human and machine readable, and suitable for command-line\nargument formatting, standard input/output and configuration file\nformatting. PST is similar to YAML, but supporting one-line expressions\n(indentation does not matter).\n\nImplementations of PST as a command-line program and a Python 3 function\nare available.\n\nComplex example\n---------------\n\nThis example is adapted from Wikipedia and is licensed under the\n[CC BY-SA 3.0](https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License)\nlicense.\n\nPST:\n\n```\nfirstName: John\nlastName: Smith\nisAlive: true\nage: 27\naddress: {{\n\tstreetAddress: \"21 2nd Street\"\n\tcity: \"New York\"\n\tstate: NY\n\tpostalCode: 10021-3100\n}}\nphoneNumbers: {\n\t{{ type: home number: \"212 555-1234\" }}\n\t{{ type: office number: \"646 555-4567\" }}\n\t{{ type: mobile number: \"123 456-7890\" }}\n}\nchildren: { }\nspouse: none\n```\n\nJSON:\n\n```json\n{\n  \"firstName\": \"John\",\n  \"lastName\": \"Smith\",\n  \"isAlive\": true,\n  \"age\": 27,\n  \"address\": {\n    \"streetAddress\": \"21 2nd Street\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"postalCode\": \"10021-3100\"\n  },\n  \"phoneNumbers\": [\n    {\n      \"type\": \"home\",\n      \"number\": \"212 555-1234\"\n    },\n    {\n      \"type\": \"office\",\n      \"number\": \"646 555-4567\"\n    },\n    {\n      \"type\": \"mobile\",\n      \"number\": \"123 456-7890\"\n    }\n  ],\n  \"children\": [],\n  \"spouse\": null\n}\n```\n\nThe same PST could be supplied as command-line arguments (albeit very long):\n\n```sh\npst firstName: John lastName: Smith isAlive: true age: 27 address: {{ \\\nstreetAddress: \"21 2nd Street\" city: \"New York\" state: NY postalCode: \\\n10021-3100 }} phoneNumbers: { {{ type: home number: \"212 555-1234\" }} \\\n{{ type: office number: \"646 555-4567\" }} {{ type: mobile number: \\\n\"123 456-7890\" }} } children: { } spouse: none\n```\n\nwould output the following JSON:\n\n```json\n{\"children\": [], \"phoneNumbers\": [{\"number\": \"212 555-1234\", \"type\": \"home\"}, {\"number\": \"646 555-4567\", \"type\": \"office\"}, {\"number\": \"123 456-7890\", \"type\": \"mobile\"}], \"firstName\": \"John\", \"isAlive\": true, \"spouse\": null, \"age\": 27, \"lastName\": \"Smith\", \"address\": {\"state\": \"NY\", \"streetAddress\": \"21 2nd Street\", \"city\": \"New York\", \"postalCode\": \"10021-3100\"}}\n```\n\nInformal description\n--------------------\n\nPST is composed of a sequence of words, which encode elementary types\nsuch as strings, integers, floating-point numbers or arbitrarily nested complex\ntypes such as arrays (list) and objects (dict).\n\nStrings do not need to be\nquoted unless they contain white space, special characters which could be\ninterpreted as a number or bracket. Words composed of digits are implicitly\nconverted to numbers unless quoted.\n\nCurly brackets enclose arrays. Double curly brackets enclose explicit objects.\nObjects are composed of key-value pairs, which can be located inline\n(implicit objects) or inside double curly brackets (explicit objects).\nUnlike implicit objects, it is possible to use explicit objects as the value of\na key-value pair. Flags beginning with a dash and double dash are converted\nto key-value pairs.\n\nAny amount of white space or indentation is equivalent to a single space.\nSeparation between words, brackets, special characters such as `:` in the key of\na key-value pair matters.\n\n8-bit ASCII-compatible character encoding is assumed. Strings can contain any\nbinary data by using escape characters. Conversion from UTF-8 character\nencoding to Unicode is supported by the Python PST API.\n\nPST is designed to be compatible with JSON, while also being suitable for\ncommand-line argument passing. For example, special characters which would\nclash with other uses are not used: `(`, `)` have special interpretation\nin Bash, `[`, `]` are commonly used in documentation of command-line programs\nto denote optional arguments. Implicit objects make it easy to denote named\ncommand-line arguments. Flags ensure established syntax can be used to express\ncommand-line arguments. Arrays and objects enable complex\ncommand-line arguments. No need for quoting common strings and no commas make\nit easier to write PST than JSON.\n\nExamples\n--------\n\n```\n# Empty\nPST:\nJSON: null\n\n# Single string\nPST: a\nJSON: [\"a\"]\n\n# Quoted string\nPST: \"a b\"\nJSON: \"a b\"\n\n# Partially-quoted string\nPST: a\"b c\"\nJSON: \"ab c\"\n\n# Two strings\nPST: a b\nJSON: [\"a\", \"b\"]\n\n# Two strings separated by a newline\nPST:\na\nb\nJSON: [\"a\", \"b\"]\n\n# Key-value pair\nPST: a: 1\nJSON: {\"a\": 1}\n\n# Sequence of key-value pairs\nPST: a: 1 b: 2\nJSON: {\"a\": 1, \"b\": 2}\n\n# Sequence of key-value pairs and a string\nPST: a: 1 b: 2 c\nJSON: [{\"a\": 1, \"b\": 2}, \"c\"]\n\n# Empty array\nPST: { }\nJSON: []\n\n# String and an empty array\nPST: a { }\nJSON: [\"a\", []]\n\n# Empty object\nPST: {{ }}\nJSON: {}\n\n# String and an empty object\nPST: a {{ }}\nJSON: [\"a\", {}]\n\n# String and an array\nPST: a { b c }\nJSON: [\"a\", [\"b\", \"c\"]]\n\n# An array as value followed by a string\nPST: a: { b c } d\nJSON: [{\"a\": [\"b\", \"c\"]}, \"d\"]\n\n# Literals\nPST: true false none\nJSON: [true, false, null]\n\n# Single-character flags\nPST: -ab\nJSON {\"a\": true, \"b\": true}\n\n# String flag\nPST: --ab\nJSON: {\"ab\": true}\n```\n\nUsage\n-----\n\n### Command line interface\n\n#### pst\n\n```sh\npst \u003cpst\u003e...\n```\n\nConvert PST-formatted arguments to JSON. Prints JSON to the standard output.\n\n#### pstf\n\n```\npstf \u003c input.pst\n```\n\nConvert PST-formatted standard input to JSON. Prints JSON to the standard\noutput.\n\n### Python interface\n\n```python\nimport pst\n```\n\n#### decode\n\n```python\npst.decode(s, as_unicode=False)\n```\n\nDecode PST. `s` is PST (binary string) or a list of PST. If `as_unicode` (bool)\nis `True`, convert strings to Unicode on output by assuming the UTF-8 encoding.\nInvalid UTF-8 bytes are encoded using the \"surrogateescape\" encoding in the\nU+DCxx Unicode range.\n\n#### decode_argv\n\n```python\npst.decode_argv(argv, delim=True, **kwargs)\n```\n\nDecode PST and split the resulting list into positional and named arguments.\n`argv` is a list such as `sys.argv` and `kwargs` are keyword arguments passed\nto `pst.decode`. Returns a tuple (`args`, `opts`), where `args` are positional\narguments and `opts` are named arguments. If `delim` is True, interpret a\nstandalone double-dash argument (`--`) in `argv` as an end of options delimiter,\nafter which all arguments are treated as literal string arguments.\n\n#### encode\n\n```python\npst.encode(x, encoder=None, indent=False, indent_len='tab', flags=False, short_flags=False, long_flags=False, escape=False)\n```\n\nEncode Python structure `x` consisting of list, tuple, dict, byte, str, int and\nfloat as PST (either as scalars or nested). Returns bytes. `encoder` is a\nuser-defined function to transform individual elements of the structure to one\nof the above types before they are read by the encoder. If `indent` is true,\noutput indentation is applied. `indent_len` is the number of space characters\nused for indentation or `tab` for indentation with the tab character. If\n`flags` is true, key-value pairs with a value of true are encoded as flags. If\n`short_flags` is true, key-value pairs with a value of true and\nsingle-character key are encoded as single-character flags. If `long_flags` is\ntrue, key-value pairs with a value of true and multiple-character key are\nencoded as string flags. If `escape` is true, non-printable ASCII characters in\nstrings are encoded as escape sequences.\n\nInstallation\n------------\n\n### Linux\n\n1. Install the required system packages. On Debian-derived distributions\n   (Ubuntu, Devuan, ...):\n\n   ```sh\n   apt install python3-full python3-pip pipx\n   ```\n\n   On Fedora:\n\n   ```sh\n   sudo yum install python3 python3-pip pipx\n   ```\n\n2. Install PST. If you indend to only use the command-line interface, you can\n   install PST with pipx:\n\n   ```sh\n   pipx install pst-format\n   ```\n\n   You might have to add `$HOME/.local/bin` to the PATH environment variable\n   if not present already in order to access the pst and pstf commands. This\n   can be done with `pipx ensurepath`.\n\n   If you indend to use the Python interface, you can install in the home\n   directory with pip3:\n\n   ```sh\n   pip3 install pst-format\n   ```\n\n   Replace pip3 with pip if pip3 is not available. Add `--break-system-packages`\n   if your distribution does not allow installing into the home directory but\n   you want to anyway.\n\n   Alternatively, install into a Python virtual environment with:\n\n   ```sh\n   python3 -m venv venv\n   . venv/bin/activate\n   pip3 install pst-format\n   ```\n\n   You can then use the PST Python interface from within the virtual\n   environment. Deactivate the environment with `deactivate`.\n\nYou should now be able to run the commands `pst` and `pstf`.\n\n### Windows\n\n1. Install [Python](https://www.python.org/). In the installer, tick `Add\n   python.exe to PATH`.\n\n2. Open the Command Prompt from the Start menu. Install PST with:\n\n    ```sh\n\tpip3 install pst-format\n\t```\n\nYou should now be able to run the commands `pst` and `pstf`.\n\n### macOS\n\n**Important:** On macOS the pst command should be used with the command line\nshell bash, not the default zsh, which is not compatible with the argument\nsyntax.\n\nOpen the Terminal. Install PST with:\n\n```sh\npython3 -m pip install pst-format\n```\n\nMake sure that `/Users/\u003cuser\u003e/Library/Python/\u003cversion\u003e/bin` is included in the\n`PATH` environment variable if not already, where `\u003cuser\u003e` is your system\nuser name and `\u003cversion\u003e` is the Python version. This path should be printed\nby the above command. This can be done by adding this line to the file\n`.zprofile` in your home directory and restart the Terminal:\n\n```sh\nPATH=\"$PATH:/Users/\u003cuser\u003e/Library/Python/\u003cversion\u003e/bin\"\n```\n\nYou should now be able to run the commands `pst` and `pstf`.\n\n### Uninstallation\n\nTo uninstall if installed with pipx:\n\n```sh\npipx uninstall pst-format\n```\n\nTo uninstall if installed with pip3 or pip:\n\n```sh\npip3 uninstall pst-format\n```\n\nReplace pip3 with pip if pip3 is not available.\n\nShell compatibility\n-------------------\n\n```sh\nmkdir example\ncd example\nmkdir a b\npst *\n[\"a\", \"b\"]\ntouch a/1 a/2 b/3 b/4\npst a: { a/* } b: { b/* }\n[{\"a\": [\"a/1\", \"a/2\"], \"b\": [\"b/3\", \"b/4\"]}]\n\n# Better\npst a: { $(ls a/* --quoting-style c) } b: { $(ls b/* --quoting-style c) }\n[{\"a\": [\"1\", \"2\"], \"b\": [\"3\", \"4\"]}]\n```\n\nSyntax\n------\n\n### PST\n\nPST is a sequence of words separated by white space, encoded in 8-bit ASCII.\n\n### White space characters\n\nWhite space characters are space (` `), form-feed (`\\f`), newline (`\\n`),\ncarriage return (`\\r`), horizontal tab (`\\t`), and vertical tab (`\\v`).\n\n### White space\n\nWhite space is a sequence of white space characters.\n\n### Word\n\nA word is a sequence of non-white space characters, and white space\ncharacters if they are inside a quoted part. A quoted part of a word is a part\nof a word enclosed in double quotes (`\"`). A character inside a word preceded by\nbackslash (`\\`) is escaped, and is treated literally (loses its special meaning),\nunless it is one of the ANSI C quotes, in which case it is translated to the\ncorresponding 8-bit ASCII character:\n\n- `\\a`: alert/bell (7)\n- `\\b`: backspace (8)\n- `\\e`: escape (27)\n- `\\f`: form feed (12)\n- `\\n`: newline (10)\n- `\\r`: carriage return (13)\n- `\\t`: horizontal tab (9)\n- `\\v`: vertical tab (11)\n- `\\nnn`: octal value *nnn*, one to three digits\n\n### Literal\n\nNon-quoted words `true`, `false`, `none` are literals, and are interpreted as\ntrue, false, null (respectively).\n\n### Integer\n\nAn integer is a word composed of non-quoted digits.\n\n### Floating-point number\n\nA floating-point number is a words composed of non-quoted digits and a\nnon-quoted dot (`.`), beginning with a digit.\n\n### Number\n\nA number is an integer or a floating-point number.\n\n### Bracket\n\nA bracket is a word which is a non-quoted opening or closing curly\nbracket (`{`, `}`).\n\n### Double bracket\n\nA double bracket is a word which is a non-quoted opening or closing double\ncurly bracket (`{{`, `}}`).\n\n### Key\n\nA word ending with a non-quoted colon (`:`) is a key.\n\n### String\n\nA string is a word which is not a key, literal, number, bracket,\ndouble bracket, single-character flag or a string flag.\n\n### Array\n\nAn array is a PST enclosed in square brackets.\n\n### Value\n\nA value is a string, literal, number, or array following a key.\n\n### Key-value pair\n\nA key followed by a value is a key-value pair.\n\n### Implicit object\n\nAn implicit object is a sequence of one or more key-value pairs not enclosed\nin brackets. An implicit object cannot be the value in a key-value pair.\n\n### Explicit object\n\nAn explicit object is a sequence of zero or more key-value pairs enclosed\nin double brackets. An explicit object can be the value in a key-value pair.\nWords inside the brackets which are not key-value pairs are ignored.\n\n### Single-character flag\n\nSingle-character flags are characters in a word beginning with an non-quoted\ndash (`-`). Single-character flag is interpreted as an implicit object\n`{c: True}`, where `c` is the character.\n\n### String flag\n\nA string flag is a string in a word beginning with an non-quoted double-dash\n(`--`). String flag is interpreted as an implicit object `{s: True}`, where `s`\nis the string.\n\nChangelog\n---------\n\n### 2.1.0 (2023-09-07)\n\n- Improved installation.\n\n### 2.0.0 (2022-11-21)\n\n- Added a double-dash (`--`) delimiter option to decode\\_argv and this is now the default (potentially breaks compatibility).\n- Removed obsolete Python 2.7 code.\n\n### 1.2.1 (2022-10-12)\n\n- Fixed Unicode encoding.\n- Fixed indentation of empty objects.\n- Fixed application of encoder.\n- Dropped support for Python 2.7.\n\n### 1.2.0 (2022-07-30)\n\n- Added encode function.\n- Fixed parsing of empty strings.\n- Fixed closing of implicit object inside list.\n- Improved documentation.\n- Dropped support for Python 2.\n\n### 1.1.1 (2019-10-28)\n\n- Added pstf.\n\n### 1.0.0 (2019-10-28)\n\n- Support for explicit objects.\n\n### 0.1.0 (2019-02-05)\n\nInitial release.\n\nLicense\n-------\n\nPublic domain. See [LICENSE.md](LICENSE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeterkuma%2Fpst","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeterkuma%2Fpst","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeterkuma%2Fpst/lists"}