{"id":15297377,"url":"https://github.com/rob-blackbourn/jetblack-fixparser","last_synced_at":"2025-07-28T07:32:21.880Z","repository":{"id":54885275,"uuid":"287902381","full_name":"rob-blackbourn/jetblack-fixparser","owner":"rob-blackbourn","description":"A parser for FIX messages","archived":false,"fork":false,"pushed_at":"2024-12-29T11:53:40.000Z","size":853,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-27T13:43:44.878Z","etag":null,"topics":["fix","fix-parser","parser","python","python3"],"latest_commit_sha":null,"homepage":"https://rob-blackbourn.github.io/jetblack-fixparser/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rob-blackbourn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2020-08-16T08:16:48.000Z","updated_at":"2025-02-04T06:31:59.000Z","dependencies_parsed_at":"2024-10-15T03:21:42.452Z","dependency_job_id":"364b01be-71b5-437f-a450-98af37888e75","html_url":"https://github.com/rob-blackbourn/jetblack-fixparser","commit_stats":{"total_commits":16,"total_committers":2,"mean_commits":8.0,"dds":0.25,"last_synced_commit":"27003f2591cef9fc00c7d63cbd3cb90a17088d7e"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/rob-blackbourn/jetblack-fixparser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rob-blackbourn%2Fjetblack-fixparser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rob-blackbourn%2Fjetblack-fixparser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rob-blackbourn%2Fjetblack-fixparser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rob-blackbourn%2Fjetblack-fixparser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rob-blackbourn","download_url":"https://codeload.github.com/rob-blackbourn/jetblack-fixparser/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rob-blackbourn%2Fjetblack-fixparser/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267437407,"owners_count":24086999,"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","status":"online","status_checked_at":"2025-07-27T02:00:11.917Z","response_time":82,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["fix","fix-parser","parser","python","python3"],"created_at":"2024-09-30T19:16:59.133Z","updated_at":"2025-07-28T07:32:21.870Z","avatar_url":"https://github.com/rob-blackbourn.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# jetblack-fixparser\n\nA parser for FIX messages.\n\n## Installation\n\nThe package can be installed with `pip`.\n\n```bash\npip install jetblack-fixparser\n```\n\n## Protocol Files\n\nWhile FIX is a standard, the structure of the fields and messages is configurable.\nThis configuration is typically loaded from a file. The source repository\ncontains a number of such files in the `/etc` folder in `YAML` format. There is\nalso a *QuickFix* loader.\n\nThe YAML format makes use of defaults. All message fields default to type `field`,\nso only `group` and `component` fields need to be explicitly specified. Also all\nmessage fields are consider optional, non-optional fields must be marked as\n`required: true`.\n\n## Usage\n\n### Decoding\n\nTo decode a FIX bytes buffer -\n\n```python\nfrom jetblack_fixparser import load_yaml_protocol, FixMessage\n\nbuffer = b'8=FIX.4.4|9=94|35=3|49=A|56=AB|128=B1|34=214|50=U1|52=20100304-09:42:23.130|45=176|371=15|372=X|373=1|58=txt|10=058|',\n\nprotocol = load_yaml_protocol(\n    'FIX44.yaml',\n    is_millisecond_time=True,\n    is_float_decimal=True\n)\n\nfix_message = FixMessage.decode(\n    protocol,\n    buffer,\n    sep=b'|',\n    strict=True,\n    validate=True,\n    convert_sep_for_checksum=True\n)\n\nprint(fix_message.message)\n```\n\nNote that strict validation is enabled. This ensures all required fields are\nspecified. Also the separator is changed from `NULL` to `|` to so they can be\ndisplayed. However the checksum was calculated with the original field separator\nso the `convert_sep_for_checksum` is set to `true`.\n\n### Encoding\n\nTo encode a dictionary describing a FIX message -\n\n```python\nfrom datetime import datetime, timezone\nfrom jetblack_fixparser import load_yaml_protocol, FixMessage\n\nprotocol = load_yaml_protocol(\n    'FIX44.yaml',\n    is_millisecond_time=True,\n    is_float_decimal=True,\n    is_type_enum=None\n)\nsending_time = datetime(2020, 1, 1, 12, 30, 0, tzinfo=timezone.utc)\n\nfix_message = FixMessage(\n    protocol,\n    {\n        'MsgType': 'LOGON',\n        'MsgSeqNum': 42,\n        'SenderCompID': \"SENDER\",\n        'TargetCompID': \"TARGET\",\n        'SendingTime': sending_time,\n        'EncryptMethod': \"NONE\",\n        'HeartBtInt': 30\n    }\n)\nbuffer = fix_message.encode(regenerate_integrity=True)\n\nprint(buffer)\n```\n\nNote that the `BeginString`, `BodyLength` and `Checksum` fields were automatically\ngenerated.\n\n### Factories\n\nTo encode and decode a message using a factory -\n\n```python\nfrom datetime import datetime, timezone\nfrom jetblack_fixparser import load_yaml_protocol, FixMessage, FixMessageFactory\n\nprotocol = load_yaml_protocol(\n    'FIX44.yaml',\n    is_millisecond_time=True,\n    is_float_decimal=True,\n    is_type_enum=None\n)\n\nfactory = FixMessageFactory(protocol, \"SENDER\", \"TARGET\")\n\nsending_time = datetime(2020, 1, 1, 12, 30, 0, tzinfo=timezone.utc)\nfix_messages = factory.create(\n        'LOGON',\n        42,\n        sending_time,\n        {\n            'EncryptMethod': \"NONE\",\n            'HeartBtInt': 30\n        }\n    )\n\nbuffer = fix_message.encode(regenerate_integrity=True)\nroundtrip = FixMessage.decode(protocol, buffer)\nassert fix_message.message == roundtrip.message\n```\n\nBecause the sender and target remain the same, we can simplify message generation\nwith the factory.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frob-blackbourn%2Fjetblack-fixparser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frob-blackbourn%2Fjetblack-fixparser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frob-blackbourn%2Fjetblack-fixparser/lists"}