csb43


Namecsb43 JSON
Version 0.10.0 PyPI version JSON
download
home_pageNone
SummaryParsing and validation utilites for the Spanish standard norm 43 by the 'Consejo Superior Bancario' (CSB) / 'Asociación Española de Banca' (AEB) for storing bank account transactions | [es] Herramientas para leer y validar datos almacenados siguiendo la norma 43 del Consejo Superior Bancario (CSB) / Asociación Española de Banca (CSB).
upload_time2024-06-09 16:46:48
maintainerNone
docs_urlhttps://pythonhosted.org/csb43/
authorNone
requires_python>=3.8
licenseLGPL-3.0-or-later
keywords csb csb43 aeb aeb43 homebank ofx spanish bank ods tsv xls xlsx excel yaml json html
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <!--
SPDX-FileCopyrightText: 2024 wmj <wmj.py@gmx.com>

SPDX-License-Identifier: LGPL-3.0-or-later
-->

# csb43

[![docs latest](https://readthedocs.org/projects/csb43/badge/?version=latest)](https://csb43.readthedocs.io/projects/latest/?badge=latest)

Tools for converting from the Spanish banks' format **CSB norm 43** (*CSB43*).


## csb2format

Convert a **CSB/AEB norm 43** file to other file formats.

Supported formats:

- OFX v1.0.3 (SGML) & v2.1.2 (XML)
- [HomeBank CSV](http://homebank.free.fr/help/06csvformat.html)
- *JSON*
- *YAML*

Additional formats are optionally provided by `tablib`:

- *HTML*
- *ODS*: OpenDocument spreadsheet
- *CSV*, *TSV*: comma- or tab- separated values
- *XLS*: Microsoft Excel spreadsheet
- *XLSX*: OOXML spreadsheet

For an exhaustive list, see package `tablib`.


### Options:

    usage: csb2format [-h] [-v] [-s] [--no-sepa] [-df] [-d DECIMAL] [-e ENCODING] [--use-float] [-V]
                    [-f {csv,dbf,homebank,html,jira,json,latex,ods,ofx,ofx1,rst,tsv,xls,xlsx,yaml}] [-E OUTPUT_ENCODING]
                    csb_file converted_file

    Convert a CSB43 file to another format

    options:
    -h, --help            show this help message and exit
    -v, --version         show program's version number and exit

    csb43 arguments:
    csb_file              a csb43 file ('-' for stdin)
    -s, --strict          strict mode (default: False)
    --no-sepa             do not convert items to SEPA transfers or direct debits (default: True)
    -df, --dayfirst       use DDMMYY as date format while parsing the csb43 file instead of YYMMDD (default: True)
    -d DECIMAL, --decimal DECIMAL
                            set the number of decimal places for the money amount type (default: 2)
    -e ENCODING, --encoding ENCODING
                            set the input encoding ('cp850' for standard AEB file) (default: latin1)
    --use-float           export monetary amounts using binary floating point numbers as a fallback (default: str)
    -V, --verbose         show csb43 warnings (default: True)

    output arguments:
    converted_file        destination file ('-' for stdout)
    -f {csv,dbf,homebank,html,jira,json,latex,ods,ofx,ofx1,rst,tsv,xls,xlsx,yaml}, --format {csv,dbf,homebank,html,jira,json,latex,ods,ofx,ofx1,rst,tsv,xls,xlsx,yaml}
                            format of the output file (default: ofx)
    -E OUTPUT_ENCODING, --output-encoding OUTPUT_ENCODING
                            set the output encoding (default: utf-8)


### Examples

- Converting to OFX format:

        $ csb2format transactions.csb transactions.ofx

        $ csb2format --format ofx transactions.csb transactions.ofx

    or

        $ csb2format transactions.csb - > transactions.ofx

    From another app to file

        $ get_my_CSB_transactions | csb2format - transactions.ofx

- Converting to XLSX spreadsheet format:

        $ csb2format --format xlsx transactions.csb transactions.xlsx

- Using cp850 as the input encoding:

        $ csb2format --encoding cp850 --format xlsx transactions.csb transactions.xlsx


### Spreadsheets


*ODS*, *XLS* and *XLSX* files are generated as books, with the first sheet
containing the accounts information, and the subsequent sheets
containing the transactions of each one of the accounts.


### Using Python

Parse a *CSB43* file and print the equivalent *OFX* file


```python
# OFX
from csb43.ofx import converter as ofx_converter
from csb43.aeb43 import read_batch

with open("movimientos.csb", "rb") as fd:
    batch = read_batch(fd)

# print to stdout
print(ofx_converter.convert_from_aeb43(batch))
```

Parse a *CSB43* file and print the equivalent in a tabular or
dictionary-like file format


```python
from csb43 import read_batch, formats

with open("movimientos.csb", "rb") as fd:
    batch = read_batch(fd)

# print 'yaml' format to stdout
o = formats.convert_from_aeb43(batch, 'yaml')
print(o.yaml)

# write 'xlsx' format to file
o = formats.convert_from_aeb43(batch, 'xlsx')
with open("movimientos.xlsx", "wb") as f:
    f.write(o.xlsx)
```

Build an AEB43 with a custom context:

```python
import dataclasses
from csb43 import read_batch, get_current_context

# custom context
ctx = dataclasses.replace(get_current_context(), strict=True)
with open("movimientos.csb", "rb") as fd:
    batch = read_batch(fd, context=context)

# scoped context
with get_current_context().scoped(strict=True):
    with open("movimientos.csb", "rb") as fd:
        batch = read_batch(fd)
```
<!--
SPDX-FileCopyrightText: 2024 wmj <wmj.py@gmx.com>

SPDX-License-Identifier: LGPL-3.0-or-later
-->

## Installing

Basic functionality (conversion to json, homebank and OFX)

    $ pip install csb43


Conversion to YAML

    $ pip install csb43[yaml]


Conversion to basic Tablib formats

    $ pip install csb43[basic_formats]


Conversion to all Tablib formats

    $ pip install csb43[formats]

Conversion to all supported formats

    $ pip install csb43[all]



<!--
SPDX-FileCopyrightText: 2024 wmj <wmj.py@gmx.com>

SPDX-License-Identifier: LGPL-3.0-or-later
-->

## Changelog

### 0.10.0

- BREAKING CHANGES!
- Dropped support for python < 3.8. If you need support for old versions, please do not upgrade.
- New subpackage `csb43.aeb43`: CSB43 reimplemented using field descriptors:
    - the original binary record is kept as the internal representation
    - consistent behaviour for field types (money, currency, int, string, etc...)
    - validation failures will raise ValidationException o ValidationWarning depending of their gravity
    - parsing of SEPA transfers and SEPA direct debits information stored in optional items in transactions.
- Subpackage `csb43.csb43` has been deprecated and it will be removed in a future version (and every package object that use it).
- Classes and functions using camel case have been deprecated and they will be removed in a future version.
- Moved package settings from `setup.py` to `pyproject.toml`
- Updated dependencies.

### 0.9.3

- Add support for Python 3.12 (thanks to Cédric Krier)

### 0.9.2

- Fixed setuptool's deprecation warning on python==3.10 (thanks to @mb)
- Fixed duplicated documentation of the same objects by sphinx (thanks to @mb)

### 0.9.1

- Added python_requires >= 3.6 (thanks to Cédric Krier)

### 0.9.0

- Dropped support for Python 2 (thanks to Sergi Almacellas)
- Added support for Python 3.8 and 3.9 (thanks to Sergi Almacellas)
- Added compatibility with tablib >= 1.0.0 (thanks to Sergi Almacellas)
- Type hinting

### 0.8.4

- Fixed tablib requirement (< 1.0.0)
- Fixed parsing of records with code 00 (thanks to Uttam Sharma)

### 0.8.2

- Do not fail with C locale (thanks to Cédric Krier)

### 0.8.1

- Fixed decimal values conversion in JSON and tabular formats (thanks to Harshad Modi).
- Fixed OFX validation (ORIGCURRENCY field).
- An error is raised when the currency code is not found.

### 0.8

- Text values are stored as string instead of bytes (thanks to Sergi Almacellas)
- Warnings are raised using the 'warnings' module.
- An encoding where control characters are different from ascii is not allowed. An exception will be raised.
- csb2format: added encoding as a new parameter.

### 0.7

- Defined installation targets: `yaml` and `formats` (thanks to Sergi Almacellas & Cédric Krier).
- Updated README file (thanks to Sergi Almacellas).
- Removed `simplejson` dependency.
- Dates stored as `date` instead of `datetime` (thanks to Sergi Almacellas).
- Monetary amounts are represented as `Decimal` instead to `float` in order to prevent representation and rounding issues. These fields are exported as a string by default, conversion to float is optional (thanks to Sergi Almacellas & Cédric Krier).
- Added temprary dependency to `openpyxl < 2.5.0` to prevent issue while trying to export to xlsx.

### 0.6

- Fixed usage of pycountry >= 16.10.23rc1 objects (thanks to Alex Barcelo).
- Package refactored to simplify the structure.

### 0.5

- Fixed conversion to binary formats in python 2.
- `tablib` backend supported in python 3.
- N43 warnings are silenced by default.

### 0.4

- OFX v 1.0.3 supported.
- OFX Tag inv401source renamed to inv401ksource.
- Unique transaction id when generating OFX file (thanks to Julien Moutte).

### 0.3.4

- Most Spanish N43 files will use LATIN-1 encoding not pure ASCII (thanks to Julien Moutte).
- Regular expression to check for account name is too limited (thanks to Julien Moutte).
- Reference1 can hold non numerical data in information mode 1 and 2 (thanks to Julien Moutte).
- Currency data as an inmutable list.

### 0.3.3

- Fixed deficiencies in OFX conversion (thanks to Andrea Santambrogio). Checked XML validation against OFX2_Protocol.xsd

### 0.3

- Compatible with Python 3 (except "tablib" dependencies)

### 0.2.3

- Fixed shebang header of csb2format


### 0.2.2

- csb2format adapted to pyinstaller
- Executable file for Windows

### 0.2.1

- Trivial changes

### 0.2

- Several bugfixes
- Bidirectional use of objects (file -> object, object -> file)
- Added conversion to spreadsheets, dict and tabular formats (thanks to tablib)
- Localization to Spanish
- Sphinx documentation

### 0.1

- Initial release



            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "csb43",
    "maintainer": null,
    "docs_url": "https://pythonhosted.org/csb43/",
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "csb, csb43, aeb, aeb43, homebank, ofx, Spanish bank, ods, tsv, xls, xlsx, excel, yaml, json, html",
    "author": null,
    "author_email": "wmj <wmj.py@gmx.com>",
    "download_url": "https://files.pythonhosted.org/packages/0b/82/5fb992644406985cfdf0ce6019925fa5f619dc4840bb40d1082cee336a6f/csb43-0.10.0.tar.gz",
    "platform": null,
    "description": "<!--\nSPDX-FileCopyrightText: 2024 wmj <wmj.py@gmx.com>\n\nSPDX-License-Identifier: LGPL-3.0-or-later\n-->\n\n# csb43\n\n[![docs latest](https://readthedocs.org/projects/csb43/badge/?version=latest)](https://csb43.readthedocs.io/projects/latest/?badge=latest)\n\nTools for converting from the Spanish banks' format **CSB norm 43** (*CSB43*).\n\n\n## csb2format\n\nConvert a **CSB/AEB norm 43** file to other file formats.\n\nSupported formats:\n\n- OFX v1.0.3 (SGML) & v2.1.2 (XML)\n- [HomeBank CSV](http://homebank.free.fr/help/06csvformat.html)\n- *JSON*\n- *YAML*\n\nAdditional formats are optionally provided by `tablib`:\n\n- *HTML*\n- *ODS*: OpenDocument spreadsheet\n- *CSV*, *TSV*: comma- or tab- separated values\n- *XLS*: Microsoft Excel spreadsheet\n- *XLSX*: OOXML spreadsheet\n\nFor an exhaustive list, see package `tablib`.\n\n\n### Options:\n\n    usage: csb2format [-h] [-v] [-s] [--no-sepa] [-df] [-d DECIMAL] [-e ENCODING] [--use-float] [-V]\n                    [-f {csv,dbf,homebank,html,jira,json,latex,ods,ofx,ofx1,rst,tsv,xls,xlsx,yaml}] [-E OUTPUT_ENCODING]\n                    csb_file converted_file\n\n    Convert a CSB43 file to another format\n\n    options:\n    -h, --help            show this help message and exit\n    -v, --version         show program's version number and exit\n\n    csb43 arguments:\n    csb_file              a csb43 file ('-' for stdin)\n    -s, --strict          strict mode (default: False)\n    --no-sepa             do not convert items to SEPA transfers or direct debits (default: True)\n    -df, --dayfirst       use DDMMYY as date format while parsing the csb43 file instead of YYMMDD (default: True)\n    -d DECIMAL, --decimal DECIMAL\n                            set the number of decimal places for the money amount type (default: 2)\n    -e ENCODING, --encoding ENCODING\n                            set the input encoding ('cp850' for standard AEB file) (default: latin1)\n    --use-float           export monetary amounts using binary floating point numbers as a fallback (default: str)\n    -V, --verbose         show csb43 warnings (default: True)\n\n    output arguments:\n    converted_file        destination file ('-' for stdout)\n    -f {csv,dbf,homebank,html,jira,json,latex,ods,ofx,ofx1,rst,tsv,xls,xlsx,yaml}, --format {csv,dbf,homebank,html,jira,json,latex,ods,ofx,ofx1,rst,tsv,xls,xlsx,yaml}\n                            format of the output file (default: ofx)\n    -E OUTPUT_ENCODING, --output-encoding OUTPUT_ENCODING\n                            set the output encoding (default: utf-8)\n\n\n### Examples\n\n- Converting to OFX format:\n\n        $ csb2format transactions.csb transactions.ofx\n\n        $ csb2format --format ofx transactions.csb transactions.ofx\n\n    or\n\n        $ csb2format transactions.csb - > transactions.ofx\n\n    From another app to file\n\n        $ get_my_CSB_transactions | csb2format - transactions.ofx\n\n- Converting to XLSX spreadsheet format:\n\n        $ csb2format --format xlsx transactions.csb transactions.xlsx\n\n- Using cp850 as the input encoding:\n\n        $ csb2format --encoding cp850 --format xlsx transactions.csb transactions.xlsx\n\n\n### Spreadsheets\n\n\n*ODS*, *XLS* and *XLSX* files are generated as books, with the first sheet\ncontaining the accounts information, and the subsequent sheets\ncontaining the transactions of each one of the accounts.\n\n\n### Using Python\n\nParse a *CSB43* file and print the equivalent *OFX* file\n\n\n```python\n# OFX\nfrom csb43.ofx import converter as ofx_converter\nfrom csb43.aeb43 import read_batch\n\nwith open(\"movimientos.csb\", \"rb\") as fd:\n    batch = read_batch(fd)\n\n# print to stdout\nprint(ofx_converter.convert_from_aeb43(batch))\n```\n\nParse a *CSB43* file and print the equivalent in a tabular or\ndictionary-like file format\n\n\n```python\nfrom csb43 import read_batch, formats\n\nwith open(\"movimientos.csb\", \"rb\") as fd:\n    batch = read_batch(fd)\n\n# print 'yaml' format to stdout\no = formats.convert_from_aeb43(batch, 'yaml')\nprint(o.yaml)\n\n# write 'xlsx' format to file\no = formats.convert_from_aeb43(batch, 'xlsx')\nwith open(\"movimientos.xlsx\", \"wb\") as f:\n    f.write(o.xlsx)\n```\n\nBuild an AEB43 with a custom context:\n\n```python\nimport dataclasses\nfrom csb43 import read_batch, get_current_context\n\n# custom context\nctx = dataclasses.replace(get_current_context(), strict=True)\nwith open(\"movimientos.csb\", \"rb\") as fd:\n    batch = read_batch(fd, context=context)\n\n# scoped context\nwith get_current_context().scoped(strict=True):\n    with open(\"movimientos.csb\", \"rb\") as fd:\n        batch = read_batch(fd)\n```\n<!--\nSPDX-FileCopyrightText: 2024 wmj <wmj.py@gmx.com>\n\nSPDX-License-Identifier: LGPL-3.0-or-later\n-->\n\n## Installing\n\nBasic functionality (conversion to json, homebank and OFX)\n\n    $ pip install csb43\n\n\nConversion to YAML\n\n    $ pip install csb43[yaml]\n\n\nConversion to basic Tablib formats\n\n    $ pip install csb43[basic_formats]\n\n\nConversion to all Tablib formats\n\n    $ pip install csb43[formats]\n\nConversion to all supported formats\n\n    $ pip install csb43[all]\n\n\n\n<!--\nSPDX-FileCopyrightText: 2024 wmj <wmj.py@gmx.com>\n\nSPDX-License-Identifier: LGPL-3.0-or-later\n-->\n\n## Changelog\n\n### 0.10.0\n\n- BREAKING CHANGES!\n- Dropped support for python < 3.8. If you need support for old versions, please do not upgrade.\n- New subpackage `csb43.aeb43`: CSB43 reimplemented using field descriptors:\n    - the original binary record is kept as the internal representation\n    - consistent behaviour for field types (money, currency, int, string, etc...)\n    - validation failures will raise ValidationException o ValidationWarning depending of their gravity\n    - parsing of SEPA transfers and SEPA direct debits information stored in optional items in transactions.\n- Subpackage `csb43.csb43` has been deprecated and it will be removed in a future version (and every package object that use it).\n- Classes and functions using camel case have been deprecated and they will be removed in a future version.\n- Moved package settings from `setup.py` to `pyproject.toml`\n- Updated dependencies.\n\n### 0.9.3\n\n- Add support for Python 3.12 (thanks to C\u00e9dric Krier)\n\n### 0.9.2\n\n- Fixed setuptool's deprecation warning on python==3.10 (thanks to @mb)\n- Fixed duplicated documentation of the same objects by sphinx (thanks to @mb)\n\n### 0.9.1\n\n- Added python_requires >= 3.6 (thanks to C\u00e9dric Krier)\n\n### 0.9.0\n\n- Dropped support for Python 2 (thanks to Sergi Almacellas)\n- Added support for Python 3.8 and 3.9 (thanks to Sergi Almacellas)\n- Added compatibility with tablib >= 1.0.0 (thanks to Sergi Almacellas)\n- Type hinting\n\n### 0.8.4\n\n- Fixed tablib requirement (< 1.0.0)\n- Fixed parsing of records with code 00 (thanks to Uttam Sharma)\n\n### 0.8.2\n\n- Do not fail with C locale (thanks to C\u00e9dric Krier)\n\n### 0.8.1\n\n- Fixed decimal values conversion in JSON and tabular formats (thanks to Harshad Modi).\n- Fixed OFX validation (ORIGCURRENCY field).\n- An error is raised when the currency code is not found.\n\n### 0.8\n\n- Text values are stored as string instead of bytes (thanks to Sergi Almacellas)\n- Warnings are raised using the 'warnings' module.\n- An encoding where control characters are different from ascii is not allowed. An exception will be raised.\n- csb2format: added encoding as a new parameter.\n\n### 0.7\n\n- Defined installation targets: `yaml` and `formats` (thanks to Sergi Almacellas & C\u00e9dric Krier).\n- Updated README file (thanks to Sergi Almacellas).\n- Removed `simplejson` dependency.\n- Dates stored as `date` instead of `datetime` (thanks to Sergi Almacellas).\n- Monetary amounts are represented as `Decimal` instead to `float` in order to prevent representation and rounding issues. These fields are exported as a string by default, conversion to float is optional (thanks to Sergi Almacellas & C\u00e9dric Krier).\n- Added temprary dependency to `openpyxl < 2.5.0` to prevent issue while trying to export to xlsx.\n\n### 0.6\n\n- Fixed usage of pycountry >= 16.10.23rc1 objects (thanks to Alex Barcelo).\n- Package refactored to simplify the structure.\n\n### 0.5\n\n- Fixed conversion to binary formats in python 2.\n- `tablib` backend supported in python 3.\n- N43 warnings are silenced by default.\n\n### 0.4\n\n- OFX v 1.0.3 supported.\n- OFX Tag inv401source renamed to inv401ksource.\n- Unique transaction id when generating OFX file (thanks to Julien Moutte).\n\n### 0.3.4\n\n- Most Spanish N43 files will use LATIN-1 encoding not pure ASCII (thanks to Julien Moutte).\n- Regular expression to check for account name is too limited (thanks to Julien Moutte).\n- Reference1 can hold non numerical data in information mode 1 and 2 (thanks to Julien Moutte).\n- Currency data as an inmutable list.\n\n### 0.3.3\n\n- Fixed deficiencies in OFX conversion (thanks to Andrea Santambrogio). Checked XML validation against OFX2_Protocol.xsd\n\n### 0.3\n\n- Compatible with Python 3 (except \"tablib\" dependencies)\n\n### 0.2.3\n\n- Fixed shebang header of csb2format\n\n\n### 0.2.2\n\n- csb2format adapted to pyinstaller\n- Executable file for Windows\n\n### 0.2.1\n\n- Trivial changes\n\n### 0.2\n\n- Several bugfixes\n- Bidirectional use of objects (file -> object, object -> file)\n- Added conversion to spreadsheets, dict and tabular formats (thanks to tablib)\n- Localization to Spanish\n- Sphinx documentation\n\n### 0.1\n\n- Initial release\n\n\n",
    "bugtrack_url": null,
    "license": "LGPL-3.0-or-later",
    "summary": "Parsing and validation utilites for the Spanish standard norm 43 by the 'Consejo Superior Bancario' (CSB) / 'Asociaci\u00f3n Espa\u00f1ola de Banca' (AEB) for storing bank account transactions | [es] Herramientas para leer y validar datos almacenados siguiendo la norma 43 del Consejo Superior Bancario (CSB) / Asociaci\u00f3n Espa\u00f1ola de Banca (CSB).",
    "version": "0.10.0",
    "project_urls": {
        "BugReports": "https://bitbucket.org/wmj/csb43/issues",
        "Documentation": "https://csb43.readthedocs.io",
        "Source": "https://bitbucket.org/wmj/csb43"
    },
    "split_keywords": [
        "csb",
        " csb43",
        " aeb",
        " aeb43",
        " homebank",
        " ofx",
        " spanish bank",
        " ods",
        " tsv",
        " xls",
        " xlsx",
        " excel",
        " yaml",
        " json",
        " html"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "693b15a6588f513899ba73a7a1bb03b76ffd578c5c5348ccd068bd9dc8e2242e",
                "md5": "7879b09448503b13003d80fb53728c6a",
                "sha256": "c8f56507c5595cbcb502fce10595c1ef0ead03fef7b50a1313bbf33f19ac63f6"
            },
            "downloads": -1,
            "filename": "csb43-0.10.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "7879b09448503b13003d80fb53728c6a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 150445,
            "upload_time": "2024-06-09T16:46:45",
            "upload_time_iso_8601": "2024-06-09T16:46:45.037529Z",
            "url": "https://files.pythonhosted.org/packages/69/3b/15a6588f513899ba73a7a1bb03b76ffd578c5c5348ccd068bd9dc8e2242e/csb43-0.10.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0b825fb992644406985cfdf0ce6019925fa5f619dc4840bb40d1082cee336a6f",
                "md5": "29436084b7355c1e133085982a296f8d",
                "sha256": "f5c67bfbc96fc3dee9e9a8aade131e856c72f5f826f9a733ce684150f04303d2"
            },
            "downloads": -1,
            "filename": "csb43-0.10.0.tar.gz",
            "has_sig": false,
            "md5_digest": "29436084b7355c1e133085982a296f8d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 552204,
            "upload_time": "2024-06-09T16:46:48",
            "upload_time_iso_8601": "2024-06-09T16:46:48.819901Z",
            "url": "https://files.pythonhosted.org/packages/0b/82/5fb992644406985cfdf0ce6019925fa5f619dc4840bb40d1082cee336a6f/csb43-0.10.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-06-09 16:46:48",
    "github": false,
    "gitlab": false,
    "bitbucket": true,
    "codeberg": false,
    "bitbucket_user": "wmj",
    "bitbucket_project": "csb43",
    "lcname": "csb43"
}
        
Elapsed time: 0.39417s