{"id":838,"library":"bracex","title":"Bash Style Brace Expander","description":"Bracex is a Python library that provides Bash-style brace expansion, enabling the generation of arbitrary strings from patterns. It closely emulates Bash's brace processing, supporting comma-separated lists, numerical and alphabetical sequences (ranges), and optional step increments. The library is actively maintained, with version 2.6 being the latest, and releases occur regularly to ensure compatibility with newer Python versions and address minor fixes.","status":"active","version":"2.6","language":"python","source_language":"en","source_url":"https://github.com/facelessuser/bracex","tags":["bash","brace-expansion","string-generation","cli","utility"],"install":[{"cmd":"pip install bracex","lang":"bash","label":"Install latest version"}],"dependencies":[],"imports":[{"note":"The most common usage is to import the `bracex` module and call its functions directly.","wrong":"from bracex import expand # Less common, but still correct if preferred for brevity.","symbol":"expand","correct":"import bracex\nexpanded_list = bracex.expand('file-{a,b}.txt')"},{"note":"`iexpand` returns a generator for memory-efficient iteration, useful for very large expansions.","symbol":"iexpand","correct":"import bracex\nexpanded_generator = bracex.iexpand('file-{1..3}.jpg')"}],"quickstart":{"code":"import bracex\n\n# Basic list expansion\nprint(bracex.expand(r'file-{a,b,c}.txt'))\n\n# Nested brace expansion\nprint(bracex.expand(r'path/to/{{foo,bar},baz}/file.txt'))\n\n# Numerical sequence (range) expansion\nprint(bracex.expand(r'image{00..02}.png'))\n\n# Numerical sequence with step\nprint(bracex.expand(r'item{1..10..3}.log'))\n\n# Alphabetic sequence\nprint(bracex.expand(r'letter{A..D}.md'))\n\n# Using the generator version\nfor item in bracex.iexpand(r'data-{1..5}.csv'):\n    print(item)","lang":"python","description":"Demonstrates basic brace expansion for lists, nested patterns, numerical and alphabetical sequences, and the generator-based iteration using `iexpand`."},"warnings":[{"fix":"Upgrade your Python environment to 3.9 or newer before upgrading to bracex 2.6. Always check the `requires_python` field on PyPI for the desired `bracex` version.","message":"Bracex has progressively dropped support for older Python versions. Version 2.6 (current) requires Python 3.9 or higher. Previous versions dropped support for Python 3.8 (in 2.6), 3.7 (in 2.4), 3.6 (in 2.3), and 3.5 (in 2.1.0).","severity":"breaking","affected_versions":"<2.6 (for Python 3.8), <2.4 (for Python 3.7), <2.3 (for Python 3.6), <2.1.0 (for Python 3.5)"},{"fix":"For very large or potentially unbounded expansions, consider increasing the `limit` parameter (e.g., `bracex.expand(pattern, limit=5000)`) or setting `limit=0` to disable the limit entirely if you are certain of the pattern's safety and have sufficient memory. Using `iexpand()` can also help manage memory for large results.","message":"The `expand()` and `iexpand()` functions include a `limit` parameter (defaulting to 1000) to prevent excessively large expansions, which could lead to performance issues or 'brace bombs'. If an expansion exceeds this limit, an error is raised.","severity":"gotcha","affected_versions":"All versions with `limit` parameter (>=2.1.1)"},{"fix":"If migrating complex Bash scripts, thoroughly test patterns in `bracex` that rely on specific Bash shell behaviors beyond simple brace expansion. Refer to the official documentation for noted deviations.","message":"While `bracex` closely mimics Bash's brace expansion, it is not a 1:1 implementation. It may deviate in certain edge cases, particularly regarding how Bash handles command-line inputs (e.g., backticks and quotes).","severity":"gotcha","affected_versions":"All versions"},{"fix":"Users consuming `bracex` via `pip install` are generally unaffected. If you are involved in packaging or contributing, be aware of the updated build system requirements and configuration (e.g., `pyproject.toml`).","message":"The build backend for `bracex` switched from Setuptools to Hatch in version 2.3. While this primarily affects maintainers and packagers, it's a significant internal change.","severity":"deprecated","affected_versions":"<2.3"}],"env_vars":null,"last_verified":"2026-05-12T20:17:26.416Z","next_check":"2026-09-29T00:00:00.000Z","problems":[{"fix":"Install the library using pip: `pip install bracex`","cause":"The 'bracex' library is not installed in your Python environment, or the Python interpreter cannot find it.","error":"ModuleNotFoundError: No module named 'bracex'"},{"fix":"Increase the `limit` parameter in the `expand()` or `iexpand()` function call, or set `limit=0` to disable it if you are certain of the pattern's safety and have sufficient memory. Using `iexpand()` can also help manage memory for large results.\n```python\nimport bracex\n# To increase the limit\nexpanded_list = bracex.expand('{1..5000}', limit=5000)\n# To disable the limit (use with caution for unbounded expansions)\nexpanded_list = bracex.expand('{1..infinity}', limit=0)\n```","cause":"The brace expansion pattern you provided generates more strings than the default `limit` of 1000 allowed by `bracex.expand()` or `bracex.iexpand()` to prevent 'brace bombs' or excessive memory usage.","error":"bracex.BraceExpansionError: Brace expansion exceeded the limit of 1000 items."},{"fix":"Upgrade your Python environment to version 3.9 or newer. Alternatively, if feasible, install an older version of `bracex` that supports your current Python version (e.g., `pip install bracex==2.5` for Python 3.8, if available, but upgrading Python is recommended).","cause":"You are attempting to install or run `bracex` version 2.6 (or newer) with a Python version older than 3.9, which is not supported by this version of the library.","error":"ERROR: Package 'bracex' requires Python '>=3.9' but the running Python is X.Y.Z"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":null,"quickstart_tag":null,"pypi_latest":"2.6","cli_name":"","install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","installed_version":"2.6","pypi_latest":"2.6","is_stale":false,"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"bracex","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"17.8M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"bracex","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"17.8M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"bracex","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.4,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"18M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"bracex","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"18M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"bracex","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"19.7M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"bracex","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.04,"mem_mb":0.7,"disk_size":"19.7M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"bracex","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.02,"mem_mb":0.9,"disk_size":"20M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"bracex","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.9,"disk_size":"20M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"bracex","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"11.6M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"bracex","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"11.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"bracex","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.4,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"12M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"bracex","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"bracex","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.7,"disk_size":"11.3M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"bracex","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.7,"disk_size":"11.2M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"bracex","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.4,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"12M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"bracex","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"bracex","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"17.3M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"bracex","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"17.3M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"bracex","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.7,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"18M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"bracex","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"18M"}]},"quickstart_checks":{"last_tested":"2026-04-24","tag":null,"tag_description":null,"results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]}}