{"id":42764066,"url":"https://github.com/globality-corp/globality-black","last_synced_at":"2026-01-29T21:06:57.218Z","repository":{"id":212917624,"uuid":"720254821","full_name":"globality-corp/globality-black","owner":"globality-corp","description":"Globality Black","archived":false,"fork":false,"pushed_at":"2025-05-13T20:07:14.000Z","size":430,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-08-21T14:49:59.675Z","etag":null,"topics":["black","codeformatter","formatter","python"],"latest_commit_sha":null,"homepage":"","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/globality-corp.png","metadata":{"files":{"readme":"README.md","changelog":"HISTORY.rst","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-11-17T23:46:18.000Z","updated_at":"2025-05-13T20:07:17.000Z","dependencies_parsed_at":"2023-12-17T10:22:33.551Z","dependency_job_id":"2b4c20ad-1cc1-4d5e-a9e7-a894ff94915e","html_url":"https://github.com/globality-corp/globality-black","commit_stats":{"total_commits":61,"total_committers":13,"mean_commits":"4.6923076923076925","dds":0.3770491803278688,"last_synced_commit":"57b596fe7a37482df0d6167b423cc8e51a4b6f93"},"previous_names":["globality-corp/globality-black"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/globality-corp/globality-black","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/globality-corp%2Fglobality-black","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/globality-corp%2Fglobality-black/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/globality-corp%2Fglobality-black/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/globality-corp%2Fglobality-black/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/globality-corp","download_url":"https://codeload.github.com/globality-corp/globality-black/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/globality-corp%2Fglobality-black/sbom","scorecard":{"id":429961,"data":{"date":"2025-08-11","repo":{"name":"github.com/globality-corp/globality-black","commit":"d530c3716ea4bc1c9b5b3df1e0c0452a97c88c7f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.9,"checks":[{"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":"Token-Permissions","score":9,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:40","Info: jobLevel 'packages' permission set to 'read': .github/workflows/codeql.yml:36","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql.yml:39","Warn: no topLevel permission defined: .github/workflows/codeql.yml:1","Info: no jobLevel write permissions found"],"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":"Code-Review","score":6,"reason":"Found 2/3 approved changesets -- score normalized to 6","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":"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/globality-corp/globality-black/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/globality-corp/globality-black/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:96: update your workflow using https://app.stepsecurity.io/secureworkflow/globality-corp/globality-black/codeql.yml/master?enable=pin","Warn: pipCommand not pinned by hash: entrypoint.sh:28","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned"],"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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"}},{"name":"SAST","score":8,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 1 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T03:06:21.823Z","repository_id":212917624,"created_at":"2025-08-19T03:06:21.823Z","updated_at":"2025-08-19T03:06:21.823Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28884880,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-29T21:06:44.224Z","status":"ssl_error","status_checked_at":"2026-01-29T21:06:42.160Z","response_time":59,"last_error":"SSL_read: 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":["black","codeformatter","formatter","python"],"created_at":"2026-01-29T21:06:56.396Z","updated_at":"2026-01-29T21:06:57.210Z","avatar_url":"https://github.com/globality-corp.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Globality black\n===============\n\n[DISCLAIMER](./DISCLAIMER.md)\n\n[Tech talk](https://docs.google.com/presentation/d/1Lp0jLSI5YJYOXEntxSvaHeOALAlndlgu/edit?usp=sharing\u0026ouid=102083878154902570127\u0026rtpof=true\u0026sd=true)\n\nA wrapper for [black](https://github.com/psf/black), adding pre- and post-processing\nto better align with Globality conventions.\n\n`globality-black` performs the following steps:\n\n - pre-processing: to protect from black actions\n - black\n - postprocessing: to revert / correct black actions\n\nNote: if you are not familiar with black (or need a refresh), please\nread our [Black refresh](#black-refresh).\n\n\n# Table of contents\n- [Globality black](#globality-black)\n- [Table of contents](#table-of-contents)\n- [Installation](#installation)\n- [Usage](#usage)\n  - [CLI](#cli)\n  - [Pycharm](#pycharm)\n  - [JupyterLab](#jupyterlab)\n  - [VScode](#vscode)\n    - [Working with remotes](#working-with-remotes)\n    - [Shortcuts](#shortcuts)\n    - [Working with notebooks](#working-with-notebooks)\n- [Features](#features)\n  - [Blank lines](#blank-lines)\n  - [Dotted chains](#dotted-chains)\n  - [Length one tuples](#length-one-tuples)\n  - [Comprehensions](#comprehensions)\n    - [Before globality-black](#before-globality-black)\n    - [After globality-black](#after-globality-black)\n  - [Partially disable globality-black](#partially-disable-globality-black)\n- [Pending / Future work](#pending--future-work)\n- [Black refresh](#black-refresh)\n  - [Magic comma](#magic-comma)\n- [FAQ](#faq)\n- [Tests](#tests)\n- [Contributing](#contributing)\n  - [Submit and issue](#submit-and-issue)\n  - [Submit a pull request](#submit-a-pull-request)\n  - [Code of Conduct](#code-of-conduct)\n\n\n# Installation\n-----\n\n`pip install globality-black`\n\n# Usage\n-----\n\nThere are two ways to use `globality-black`, via CLI, or importing the helpers in the library.\nNext, we show some typical use cases:\n\n## CLI\n\nPlease see command line arguments running `globality-black --help`.\n\n## Pycharm\n\nTo use `globality-black` in PyCharm, go to PyCharm -\u003e Preferences... -\u003e Tools -\u003e External Tools -\u003e Click + symbol\nto add new external tool.\n\n![img](docs/pycharm-external-tools.png)\nRecommended configuration to format the current file:\n* Program: path to `globality-black`, e.g. `/Users/marty-mcfly/miniconda3/envs/gb/bin/globality-black`\n* Arguments: `$FilePath$`\n* Working directory: `$ProjectFileDir$`\n\nRecommended configuration to check the whole repo (but not formatting it it):\n* Program: path to `globality-black`, e.g. `/Users/marty-mcfly/miniconda3/envs/gb/bin/globality-black`\n* Arguments: `. --check`\n* Working directory: `$ProjectFileDir$`\n\nNext, configure a keymap, as in [here](https://www.jetbrains.com/help/pycharm/configuring-keyboard-and-mouse-shortcuts.html).\n\n![img](docs/pycharm-shortcuts.png)\n\n## JupyterLab\n\nWe can leverage [this](https://jupyterlab-code-formatter.readthedocs.io/en/latest/how-to-use.html#custom-formatter) extension,\nwith a custom formatter. Here we explain how to get the following options:\n\n![img](docs/jupyter-lab-new-buttons.png)\n\n\nThere are two ways to apply `globality-black`, see left-hand-side, or by clicking on the button next to \"Code\". We will configure\nthe extension to make it apply the `isort + globality-black` pipeline when clicking such button.\n\nTo do so, install the extension, generate the config for jupyter lab and edit it:\n\n```shell script\npip install jupyterlab_code_formatter\njupyter lab --generate-config\nvim ~/.jupyter/jupyter_lab_config.py\n```\n\nYou might already have some config in `jupyter_lab_config`. If so, you might want to omit\n the second command above, and edit it (vim) instead.\n\nIn any case, we will add the following code:\n\n```python\nfrom jupyterlab_code_formatter.formatters import SERVER_FORMATTERS\nfrom globality_black.jupyter_formatter import GlobalityBlackFormatter\nSERVER_FORMATTERS['globality-black'] = GlobalityBlackFormatter(line_length=100)\n```\n\nThen, go to the extension preferences, and add:\n\n```json\n{\n    \"preferences\": {\n        \"default_formatter\": {\n            \"python\": [\n                \"isort\",\n                \"globality-black\",\n            ],\n        }\n    },\n    \"isort\": {\n           \"combine_as_imports\": true,\n           \"force_grid_wrap\": 4,\n           \"force_to_top\": \"true\",\n           \"include_trailing_comma\": true,\n           \"known_third_party\": [\"wandb\", \"tqdm\"],\n           \"line_length\": 100,\n           \"lines_after_imports\": 2,\n           \"multi_line_output\": 3,\n    }\n}\n```\n\nNotes:\n - The last step above translates into user settings saved in\n`~/.jupyter/lab/user-settings/@ryantam626/`.\n - The extension is applied to all cells in the notebook. It can be configured to be applied just to\n the current cell, if interested.\n - The extension is applied to each cell in isolation. Hence, if multiple imports appear in different\n cells, they won't be merged together on top of the notebook.\n\n\n## VScode\n\nTo use `globality-black` in VScode, install the extension\n[External formatters](https://marketplace.visualstudio.com/items?itemName=SteefH.external-formatters).\n\nThen, go to Preferences: Settings (JSON). A file `settings.json` will open. Add this to the file:\n```json\n\"[python]\": {\n        \"editor.codeActionsOnSave\": {\n            \"source.organizeImports\": true\n        },\n        \"editor.defaultFormatter\": \"SteefH.external-formatters\",\n    },\n    \"isort.args\":[\"--profile\", \"black\"],\n```\nThis will configure isort to run when saving, and glo-black as the default\nformatter. Add also this\n```json\n[\n    \"externalFormatters.languages\": {\n        \"python\": {\n            \"command\": \"$PATH_TO_ENV/bin/globality-black\",\n            \"arguments\": [\n                \"-\",\n            ]\n        }\n    },\n    \"isort.interpreter\": [\n        \"$PATH_TO_ENV/bin/python\"\n    ],\n]\n```\nsetting or replacing `$PATH_TO_ENV` with whatever you need to get to the\n`globality-black` Python env.\n\n### Working with remotes\nImportant: these two paths have to be absolute paths, and need to be the\nsame everywhere you use VScode. This means that if you use VScode on remotes (e.g. an EC2 instance),\nthe same paths needs to exist. Obviosuly, that's not possible, since e.g.\nin EC2 you'll have `/home/ubuntu/...` and in your machine `/Users/john/...`. A workaround for this is to create a symbolic link in your instance, e.g:\n```bash\nsudo ln -s /home/ubuntu /Users/john\n```\n\n### Shortcuts\n\n To configure shortcuts, go to `Preferences: Keyboard Shortcuts (JSON)` from the Palette (command+shift+p). The file `keybindings.json` will open.\n Add to this file:\n```json\n[\n    {\n        \"key\": \"cmd+shift+j\",\n        \"command\": \"editor.action.formatDocument\",\n        \"when\": \"editorHasDocumentFormattingProvider \u0026\u0026 editorTextFocus \u0026\u0026 !editorReadonly \u0026\u0026 !inCompositeEditor\"\n    }\n]\n```\nThis will allow you to run `globality-black` on the currently open file,\npassing the content of the file via stdin.\n\n### Working with notebooks\n\nTo format notebooks, there is a shortcut\n```json\n{\n    \"key\": \"shift+alt+f\",\n    \"command\": \"notebook.formatCell\",\n    \"when\": \"editorHasDocumentFormattingProvider \u0026\u0026 editorTextFocus \u0026\u0026 inCompositeEditor \u0026\u0026 notebookEditable \u0026\u0026 !editorReadonly \u0026\u0026 activeEditor == 'workbench.editor.notebook'\",\n}\n```\nthat you can modify if you don't like this combination. This will format the\ncurrent cell with the default formatter. I did not find a way to run isort\nthough. There is a \"format notebook on save\" option, but it's not exactly what\n we configured for python files. That would run isort + glo-black.\n\n\n# Features\n--------\n\n## Blank lines\n\nBlack would remove those blank lines after `wandb` and `scikit-learn` below:\n\n```\ngraph.use(\n    \"wandb\",\n\n    \"scikit-learn\",\n\n    # we love pandas\n    \"pandas\",\n)\n```\n\n`globality-black` protects those assuming the developer added them for readability.\n\n\n## Dotted chains\n\nIn a similar fashion to the \"blank lines\" feature, \"dotted chains\" allows to keep the block:\n\n```python\nreturn (\n    df_field[COLUMNS_PER_FIELD[name]]\n    .dropna(subset=[\"column\"])\n    .reset_index(drop=True)\n    .assign(mapped_type=MAP_DICT[name])\n)\n\nLABELS = set(\n    df[df.labels.apply(len) \u003e 0]\n    .flag.apply(curate)\n    .apply(normalize)\n    .unique()\n)\n```\n\nthe same. In this feature, **we don't explode anything** but rather protect code assuming it was\nwritten by this in purpose for readability.\n\n## Length one tuples\n\nThis is a very simple and specific feature. Black (at least up to 21.9b0) has a bug so that tuples\nwith one element are compressed as in\n\n```python\nx = (\n    3,\n)\n```\nbecomes\n```python\nx = (3,)\n```\nSee https://github.com/psf/black/issues/1139#issuecomment-951014094. With globality-black,\nwill protect these.\n\n\n## Comprehensions\n\nExplode comprehensions\n* all dict comprehensions\n* any comprehension with an if\n* any comprehension with multiple for loops (see examples below)\n* list / set comprehensions where the element:\n   - has a ternary operator (see examples below)\n   - has another comprehension\n\nFor everything else, we rely on `black`. Examples:\n\n### Before globality-black\n\n```\n[3 for _ in range(10)]\n\n[3 for i in range(10) if i \u003c 4]\n\n{\"a\": 3 for _ in range(4)}\n\n{\"a\": 3 for _ in range(4) if i \u003c 4}\n\n[\"odd\" if i %% 2 == 0 else \"even\" for _ in range(10)]\n\ndouble_comp1 = [3*i*j for i in range(10) for j in range(4)]\n\ndouble_comp2 = [[i for i in range(7) if i \u003c 5] for j in range(10)]\n\ndouble_comp3 = {i: [i for i in range(7) if i \u003c 5] for j in range(10) if i \u003c 2}\n```\n\n### After globality-black\n\n```\n[3 for _ in range(10)]\n\n[\n    3\n    for i in range(10)\n    if i \u003c 4\n]\n\n{\n    \"a\": 3\n    for _ in range(4)\n}\n\n{\n    \"a\": 3\n    for _ in range(4)\n    if i \u003c 4\n}\n\n[\n    \"odd\" if i %% 2 == 0 else \"even\"\n    for _ in range(10)\n]\n\ndouble_comp1 = [\n    3 * i * j\n    for i in range(10)\n    for j in range(4)\n]\n\ndouble_comp2 = [\n    [i for i in range(7) if i \u003c 5]\n    for j in range(10)\n]\n\ndouble_comp3 = {\n    i: [i for i in range(7) if i \u003c 5]\n    for j in range(10)\n    if i \u003c 2\n}\n```\n\nNote that in the last two comprehensions, the nested comprehensions are not exploded even though\nhaving an if. This is a limitation of `globality-black`, but we believe not very frequent\nin everyday cases. If you really want to explode those and make `globality-black` respect it,\nplease use the feature explained next.\n\n## Partially disable globality-black\n\nIf you see some block where you don't want to apply `globality-black`, wrap it\nwith `# fmt.off` and `# fmt:on` and it will be ignored. Note that this is the same syntax as\nfor `black`. For example, for readability you might want to do something as:\n\n```\n# fmt: off\nfiles_to_read = [\n    (f\"{key1}_{key2}\", key1, key2, key1 + key2)\n    for key1 in range(10)\n]\n# fmt: on\n```\n\nNote that as a default (same as `black`), `globality-black` will write the expression above as a\none-liner.\n\n# Pending / Future work\n------------\n\n- Explode ternary operators under some criteria\n- Nested comprehensions\n- Magic comma for single element subscripts, due to [this](https://github.com/psf/black/pull/2942/files#diff-31972cba2ef33b6d8853302bec17d8c60e796566d67ce57e5d233f17a0c6f5a4R17-R18)\n\nPlease give us feedback if you find any issues, and check `known_failed`\n\n\n# Black refresh\n--------\n\n`black` is an opinionated Python formatter that tries to save as much vertical space as possible. In\nthis regard, it compresses lines to the maximum character length that has been configured. `black`'s\ndefault is 88, whereas in `globality-black` we use a default of 100 characters, as agreed for\nGlobality repos globally. If you want to have a custom max character length, add a `pyproject.toml`\nfile to the root of your repo. This works the same way as in `black`, and `globality-black` will\ntake your config from there.\n\nSee how `black` works in their [README](https://github.com/psf/black). It is especially useful to\nreview [this section](https://github.com/psf/black/blob/master/docs/the_black_code_style.md), where\nimportant recent features are explained.\n\n## Magic comma\n\n`black` added a feature at the end of 2020 that we used to call the \"magic comma\". It's one of the\nfirst examples where `black` is giving a bit of freedom to the developer on how the final code will\nlook like (apart from `fmt:off` and `fmt:on` to ignore `black` entirely). Read more about it\n[here](https://github.com/psf/black/blob/main/docs/the_black_code_style/current_style.md#the-magic-trailing-comma).\n\n# FAQ\n---\n\nHere we list a number of questions and solutions raised when presenting this project to other teams:\n\n**I like this project, but this would destroy all our git history and git blames**\n\nOur recommendation is:\n 1. Create a big PR for all your repo, and do the effort of reviewing the changes just once.\n 1. Add a `.git-blame-ignore-revs` file to your repo, ignoring the bulk commit where\n `globality-black` is applied. See\n [here](https://www.moxio.com/blog/43/ignoring-bulk-change-commits-with-git-blame)\n for more details.\n\n**I like most of the changes, but in some places I really prefer the way I write the code**\n\nNo problem, for those specific cases where you like more your style, just wrap the block with\n`fmt:off` and `fmt:on`, see the\n[Partially disable Globality Black](#partially-disable-globality-black) section.\n\n**100 characters per line is too short / too long for me**\n\nJust add a `pyproject.toml` to the root of your repo (as the one in this very own\nproject) and specify your preferred length, see the [Black refresh](#black-refresh) section.\n\n**I want to know what will be changed before applying the changes**\n\nPlease use the `--diff` option from the CLI, see the [CLI](#cli) section.\n\n**I want to explode list of arguments, but `globality-black` is compressing them into one line**\n\nPlease use the magic comma feature, see [Magic comma](#magic-comma).\n\n# Tests\n\nRun the tests as in\n\n```\nbash entrypoint.sh test\n```\nor simply\n```\npytest .\n```\n\nSome options:\n* `-s` to show prints and be able to debug\n* `--pdb` to trigger debugger when having an exception\n* `pytest route_to_test` to test a specific test file\n* `pytest route_to_test::test_function` to test a specific test function\n* `pytest route_to_test::test_function[test_case]`\n* ` --cov-report term` to show coverage\n\nYou might find other code inspectors in `entrypoint.sh`. Note that these are run\nagainst your code if opening a pull request.\n\n# Contributing\n\nAll contributions, bug reports, security issues, bug fixes, documentation improvements, enhancements, and ideas are welcome. This section is adapted and simplified\nfrom [pandas contribution guide](https://pandas.pydata.org/docs/development/contributing.html).\n\n## Submit and issue\n\nBug reports, security issues, and enhancement requests are an important part of making open-source software more stable and are curated through Github issues. When reporting and issue or request, please fill out the issue form fully to ensure others and the core development team can fully understand the scope of the issue.\n\nThe issue will then show up to the community and be open to comments/ideas from others.\n\n## Submit a pull request\n\n`deboiler` is hosted on GitHub, and to contribute, you will need to sign up for a free GitHub account. We use Git for version control to allow many people to work together on the project. If you are new to Git, you can reference some of the resources in the pandas contribution guide cited above.\n\nAlso, the project follows a standard forking workflow whereby contributors fork the repository, make changes, create a feature branch, push changes, and then create a pull request. To avoid redundancy, please follow all the instructions in the pandas contribution guide  cited above.\n\n## Code of Conduct\n\nAs contributors and maintainers to this project, you are expected to abide by the code of conduct. More information can be found at the [Contributor Code of Conduct]((https://github.com/globality-corp/deboiler/.github/blob/master/CODE_OF_CONDUCT.md)).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglobality-corp%2Fglobality-black","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fglobality-corp%2Fglobality-black","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglobality-corp%2Fglobality-black/lists"}