{"id":23121161,"url":"https://github.com/fispact/pypact","last_synced_at":"2025-08-17T00:32:37.660Z","repository":{"id":49715058,"uuid":"118437112","full_name":"fispact/pypact","owner":"fispact","description":"A Python package for parsing FISPACT-II output","archived":false,"fork":false,"pushed_at":"2025-05-26T18:36:01.000Z","size":71637,"stargazers_count":29,"open_issues_count":2,"forks_count":13,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-06-28T02:06:08.148Z","etag":null,"topics":["file","fispact","fispact-ii","json","nuclide","output","parsing","python","ukaea"],"latest_commit_sha":null,"homepage":"https://pypact.readthedocs.io/en/latest/","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/fispact.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,"zenodo":null}},"created_at":"2018-01-22T09:42:58.000Z","updated_at":"2025-06-03T10:14:08.000Z","dependencies_parsed_at":"2023-01-30T17:00:38.165Z","dependency_job_id":"a0d85fca-1542-4407-8cd0-0ca14e81e926","html_url":"https://github.com/fispact/pypact","commit_stats":{"total_commits":185,"total_committers":8,"mean_commits":23.125,"dds":0.1945945945945946,"last_synced_commit":"be7723189236de333c44131ca534fb4286b4e3f7"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/fispact/pypact","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fispact%2Fpypact","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fispact%2Fpypact/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fispact%2Fpypact/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fispact%2Fpypact/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fispact","download_url":"https://codeload.github.com/fispact/pypact/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fispact%2Fpypact/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270791255,"owners_count":24645781,"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-08-16T02:00:11.002Z","response_time":91,"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":["file","fispact","fispact-ii","json","nuclide","output","parsing","python","ukaea"],"created_at":"2024-12-17T06:15:48.558Z","updated_at":"2025-08-17T00:32:32.640Z","avatar_url":"https://github.com/fispact.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Build Status](https://github.com/fispact/pypact/actions/workflows/python-package.yml/badge.svg?branch=master)\n![Python package](https://github.com/fispact/pypact/workflows/Python%20package/badge.svg?branch=master)\n[![Code Coverage](https://codecov.io/gh/fispact/pypact/branch/master/graph/badge.svg)](https://codecov.io/gh/fispact/pypact)\n\n[![PyPI](https://img.shields.io/pypi/v/pypact.svg)](https://pypi.python.org/pypi/pypact)\n[![PyPI](https://img.shields.io/pypi/wheel/pypact.svg)](https://pypi.python.org/pypi/pypact)\n[![PyPI](https://img.shields.io/pypi/format/pypact.svg)](https://pypi.python.org/pypi/pypact)\n[![License](https://img.shields.io/pypi/l/pypact.svg)](https://github.com/fispact/pypact/blob/master/LICENSE)\n\n[![HitCount](https://hits.dwyl.com/fispact/pypact.svg?style=flat-square\u0026show=unique)](http://hits.dwyl.com/fispact/pypact)\n[![GitHub issues](https://img.shields.io/github/issues/fispact/pypact)](https://github.com/fispact/pypact/issues)\n[![GitHub stars](https://img.shields.io/github/stars/fispact/pypact)](https://github.com/fispact/pypact/stargazers)\n[![GitHub forks](https://img.shields.io/github/forks/fispact/pypact)](https://github.com/fispact/pypact/network)\n\n# Pypact\n\n### Making FISPACT-II output easier to parse, with Python 3\n\n[**Documentation here @ pypact.readthedocs.io**](https://pypact.readthedocs.io/en/latest/)\n\n- [Design goals](#design-goals)\n- [Notes on accuracy](#accuracy)\n- [Installation](#installation)\n- [Usage](#usage)\n  - [Command line tool](#command-line-tool)\n  - [Importing package](#importing-package)\n  - [Input Creation](#input-creation)\n  - [Print Libs](#print-libs)\n- [Examples](#examples)\n  - [Print the run name](#print-run-name)\n  - [Loop over time steps](#loop-time-steps)\n  - [Number of nuclides](#nuclide-number)\n  - [JSON serialize](#json-serialize)\n  - [Plotting](#plotting)\n  - [Compare outputs](#compare)\n  - [Spectral line data](#gammaspec)\n- [Supported outputs](#supported-outputs)\n- [Executing unit tests](#executing-unit-tests)\n- [Contact](#contact)\n\n##### Example - outputplotting/gammaspectrumanimation.py\n\n![Gamma spec](https://github.com/fispact/pypact/blob/master/examples/figures/gs_animation.gif)\n\n##### Example - outputplotting/chartofnuclides.py\n\n![Chart of Nuclides](https://github.com/fispact/pypact/blob/master/examples/figures/chartofnuclidesanimation.gif)\n\n##### Example - outputplotting/periodictable.py\n\n![Periodic Table](https://github.com/fispact/pypact/blob/master/examples/figures/periodictableanimation.gif)\n\n#### \u003ca name=\"design-goals\"\u003e\u003c/a\u003eDesign Goals\n\nThe aim of Pypact is to make the FISPACT-II output file easy to parse so that more time can be spent on analysis, and much less time on interrogating the output file. No more convoluted scripts, just one simple to use package!\n\n#### \u003ca name=\"accuracy\"\u003e\u003c/a\u003eNotes on accuracy\n\nBefore we get into how to install and use pypact, a small detail regarding accuracy should be noted.\n\nIt is important to realise that the precision of some values in the FISPACT-II output file can be limited and hence parsing with pypact will give the same precision. It cannot give a more accurate result than the output file.\n\nFor example nuclide heats are only given to 3/4 significant figures and if using this in your analysis it can accumulate to larger differences for complex simulations. If you require more accuracy in your results then you are advised to use the JSON output format within FISPACT-II itself (since version 4.0), where double precision is used, roughly 16 significant figures. This is illustrated below.\n\nAn example is shown for a Si 31 nuclide entry, using both JSON approaches.\n\n##### Using pypact to parse the FISPACT-II standard output.\n\n```JSON\n{\n    \"element\": \"Si\",\n    \"isotope\": 31,\n    \"state\": \"\",\n    \"half_life\": 9432.0,\n    \"grams\": 3.699e-16,\n    \"activity\": 528.5,\n    \"heat\": 5.046e-14,\n    \"alpha_heat\": 0.0,\n    \"beta_heat\": 5.028e-14,\n    \"gamma_heat\": 1.84e-16,\n    \"dose\": 1.399e-10,\n    \"ingestion\": 8.456e-08,\n    \"inhalation\": 4.175e-08\n}\n```\n\n##### Using FISPACT-II JSON output directly.\n\n```JSON\n{\n    \"element\": \"Si\",\n    \"isotope\": 31,\n    \"state\": \"\",\n    \"half_life\": 0.9432E+4,\n    \"grams\": 0.36990418187287751E-15,\n    \"activity\": 0.52850009418322043E+3,\n    \"heat\": 0.50459332881338111E-13,\n    \"alpha_heat\": 0.0E+0,\n    \"beta_heat\": 0.50275382281787085E-13,\n    \"gamma_heat\": 0.18395059955102398E-15,\n    \"dose\": 0.1398653735340394E-9,\n    \"ingestion\": 0.84560014731430124E-7,\n    \"inhalation\": 0.41751507961244766E-7\n}\n```\n\n#### \u003ca name=\"installation\"\u003e\u003c/a\u003eInstallation\n\nThe package is hosted on PyPi and is therefore available with pip3 directly.\n\nA note on the nature of Pypact, it is written in Python3 and does not support Python2, therefore in order to use the package, you must have a version of Python3 installed along with pip3.\n\nTo install simply do\n\n```bash\npip3 install pypact\n```\n\nAfter this it is easy to test if the package is installed by checking the command line tool that is shipped with it.\n\n```bash\nfispactconverter.py -h\n```\n\nThe output should give you the help menu for the converter tool.\n\n```bash\nusage: fispactconverter.py [-h] outputfile jsonoutputfile\n\nFispact Output Converter\n\npositional arguments:\n  outputfile      The fispact output (.out) file to be read\n  jsonoutputfile  The fispact output file in JSON format to be written\n\noptional arguments:\n  -h, --help      show this help message and exit\n```\n\nMore on this later, but fispactconverter is a command line tool to convert the FISPACT-II output to a JSON output.\n\n#### \u003ca name=\"usage\"\u003e\u003c/a\u003eUsage\n\nAs shown above you can simply run the command line tool and not use anything more from the package if you so wish. Or if you're feeling more adventurous and would like to integrate it into a current project or script you can import the package. Both ways are described below.\n\n##### \u003ca name=\"command-line-tool\"\u003e\u003c/a\u003eCommand line tool\n\nThe command line tool is a python3 script uses the pypact modules to parse a FISPACT-II output file into memory, then serializes this to a more friendly and useable output JSON format.\n\nTo use the tool it requires an output file to deserialize and a JSON output file that will be created. The fispact output file must exist, otherwise the tool will fail and no JSON will be produced.\n\nThe paths should be relative to the current directory but the tool can be ran from any location, since it should be on your $PATH.\n\nA simple example is shown below using a FISPACT-II output file 'test91.out'. This can be found on the git repository in the reference directory.\n\n```bash\n$pwd\n/testdir/example\n$ls\ntest91.out\n$fispactconverter.py test91.out test91.json\n$ls\ntest91.out test91.json\n```\n\nThis would have equally have worked if in another directory for example.\n\n```bash\n$pwd\n/testdir\n$ls\nexample\n$fispactconverter.py example/test91.out example/test91.json\n$ls\n/testdir\n$ls /testdir\ntest91.out test91.json\n```\n\nNote that you must specify the extension for the JSON file, otherwise the file will have no extension but it will still be in JSON format. Additionally, the JSON filename does not have to match the FISPACT-II output filename, as the below example shows.\n\n```bash\n$pwd\n/testdir/example\n$ls\ntest91.out\n$fispactconverter.py test91.out call_me_anything.json\n$ls\ntest91.out call_me_anything.json\n```\n\n##### \u003ca name=\"importing-package\"\u003e\u003c/a\u003eImporting the modules\n\nA much better way to use the package is to import the modules directly into your existing python code and make new scripts using it. Note that it must be a Python3 project, not Python2!\n\nA simple example of how to read the output into memory is given below.\n\n```python\nimport pypact as pp\n\nfilename = \"fispact_ii_run_output_file.out\"\n\nwith pp.Reader(filename) as output:\n    # do your analysis here\n...\n```\n\n##### \u003ca name=\"input-creation\"\u003e\u003c/a\u003eCreating and manipulating input files\n\nIt is now possible to use pypact to manipulate and create some of the legacy input files,\nsuch as the input (\\*.i) FISPACT-II run file, the files file (IO paths), and the fluxes file,\nnecessary for FISPACT-II to run.\n\nSome examples are provided of how to use this module in the examples subdirectory.\n\nA simple example of creating an input file is shown below:\n\n```python\nimport pypact as pp\n\nid = pp.InputData(name='test')\n\n# control setup\nid.overwriteExisting()\nid.enableJSON()\nid.approxGammaSpectrum()\nid.readXSData(709)\nid.readDecayData()\nid.enableHalflifeInOutput()\nid.enableHazardsInOutput()\nid.setProjectile(pp.PROJECTILE_NEUTRON)\nid.enableSystemMonitor()\nid.readGammaGroup()\nid.enableInitialInventoryInOutput()\nid.setLogLevel(pp.LOG_SEVERITY_ERROR)\n\n# thresholds\nid.setXSThreshold(1e-12)\nid.setAtomsThreshold(1e5)\n\n# set target\nid.setDensity(19.5)\nid.setMass(1.0)\nid.addElement('Ti', percentage=80.0)\nid.addElement('Fe', percentage=14.8)\nid.addElement('Cr', percentage=5.2)\n\n# irradiate and cooling times\nid.addIrradiation(300.0, 1.1e15)\nid.addCooling(10.0)\nid.addCooling(100.0)\nid.addCooling(1000.0)\nid.addCooling(10000.0)\nid.addCooling(100000.0)\n\n# validate data\nid.validate()\n# write to file\npp.to_file(id, '{}.i'.format(id.name))\n...\n```\n\n##### \u003ca name=\"print-libs\"\u003e\u003c/a\u003eReading printlib files\n\nTypically PRINTLIB options in FISPACT-II provide the user with complementary information\nthat is not available in conventional output files. Whilst the format is more straightforward\nto parse than the standard .out file, it can still be cumbersome to automate.\nPypact now provides readers for various PRINTLIB options.\nCurrently supported formats are:\n\n- [ ] PRINTLIB 0 (redundant)\n- [ ] PRINTLIB 1\n- [ ] PRINTLIB 2\n- [ ] PRINTLIB 3\n- [x] PRINTLIB 4 - collapsed cross section (see example/printlib4.py)\n- [x] PRINTLIB 5 - spectral lines (see example/printlib5.py)\n- [ ] PRINTLIB 6\n- [ ] PRINTLIB 7\n- [ ] PRINTLIB 8\n- [ ] PRINTLIB 9\n\n#### \u003ca name=\"examples\"\u003e\u003c/a\u003eExamples\n\nSome basic examples are given on how to intergoate the output.\n\n##### \u003ca name=\"print-run-name\"\u003e\u003c/a\u003ePrint the run name\n\n```python\nimport pypact as pp\n\nfilename = \"fispact_ii_run_output_file.out\"\n\nwith pp.Reader(filename) as output:\n    rd = output.run_data\n    print(rd.run_name)\n```\n\n##### \u003ca name=\"loop-time-steps\"\u003e\u003c/a\u003eLoop over time steps\n\n```python\nimport pypact as pp\n\nfilename = \"fispact_ii_run_output_file.out\"\n\n\nwith pp.Reader(filename) as output:\n    for t in output.inventory_data:\n        print(t.irradiation_time)\n        print(t.flux)\n        print(t.ingestion_dose)\n        ....\n```\n\n##### \u003ca name=\"nuclide-number\"\u003e\u003c/a\u003eNumber of nuclides\n\n```python\n# Note the different way to import\nfrom pypact.reader import Reader\n\nfilename = \"fispact_ii_run_output_file.out\"\n\nwith Reader(filename) as output:\n    for t in output.inventory_data:\n        print(len(t.nuclides))\n```\n\n##### \u003ca name=\"json-serialize\"\u003e\u003c/a\u003eJSON serialize\n\nThe package is written such that every data object can be JSON serialized and deserialized, as well as FISPACT-II deserialized. Whether it be the whole **Output** object or just a dose at a given timestep, it can be parsed and written to JSON. An example showing this for the Run Data is given below.\n\n```python\nimport pypact as pp\n\nfilename = \"fispact_ii_run_output_file.out\"\n\nwith pp.Reader(filename) as output:\n    # print JSON format to standard output\n    print(output.run_data.json_serialize())\n```\n\nThe output would then look like\n\n```json\n{\n  \"timestamp\": \"10:05:38 30 August 2017\",\n  \"run_name\": \"* IRRADIATION OF TI IFMIF\",\n  \"flux_name\": \"IFMIF 40MeV d on Cu tot=8.90979E\"\n}\n```\n\nSimilarly this can be done for data in the inventory data, if the timestamp is known. For example, given timestamp 2 exists in the FISPACT-II output file, we can do the following.\n\n```python\nimport pypact as pp\n\nfilename = \"fispact_ii_run_output_file.out\"\n\nfr = pp.FileRecord(filename)\n\ndr = pp.DoseRate()\ndr.fispact_deserialize(fr, interval=2)\n\n# print JSON format to standard output\nprint(dr.json_serialize())\n```\n\nOr it can be done even simpler, by:\n\n```python\nimport pypact as pp\n\nfilename = \"fispact_ii_run_output_file.out\"\n\nwith pp.Reader(filename) as output:\n    print(output[2].dose_rate.json_serialize())\n```\n\nThe output would then look like\n\n```json\n{\n  \"type\": \"PLANE SOURCE\",\n  \"distance\": 0.0,\n  \"mass\": 0.0,\n  \"dose\": 22946.0\n}\n```\n\n##### \u003ca name=\"plotting\"\u003e\u003c/a\u003ePlotting\n\nAn example script and some helper functions are included to show how some plots can be constructed using pypact.\nA nuclide library (in JSON format) exists containing the list of all isotopes, that is containing 118 elements from H to Og, and totaling to 3352 isotopes. These can be used in their entirety as a complete list using `get_all_isotopes()` or can be filtered as the example below shows. Some plotting functions are added in the 'pypact.analysis' module and are also used in the script below.\n\nThis example script is based on that in the package at 'pypact/examples/plotnuclideheat.py'. Note that this is an example only and is to show how pypact can be used to help perform certain analyses.\n\n```python\nimport re\nimport os\n\nimport pypact as pp\nimport pypact.analysis as ppa\n\nfilename = os.path.join(os.path.dirname(os.path.abspath(__file__)),\n                             '..', 'reference', 'test127.out')\n\ntz = ppa.TimeZone.COOL\nproperties = ['heat', 'grams', 'ingestion']\nisotopes = [ ppa.NuclideDataEntry(i) for i in ppa.get_all_isotopes() if ppa.find_z(i[0]) \u003c= 10]\n\nplt = ppa.LinePlotAdapter()\n\nwith pp.Reader(filename) as output:\n    for p in properties:\n        ppa.plotproperty(output=output,\n                         property=p,\n                         isotopes=isotopes,\n                         plotter=plt,\n                         fractional=True,\n                         timeperiod=tz)\n\nplt.show()\n```\n\nThe results of this script are shown below.\n\n![Figure of fractional grams](https://github.com/fispact/pypact/blob/master/examples/figures/fractional_grams.png?raw=true)\n\n![Figure of fractional heat](https://github.com/fispact/pypact/blob/master/examples/figures/fractional_heat.png?raw=true)\n\n![Figure of fractional ingestion](https://github.com/fispact/pypact/blob/master/examples/figures/fractional_ingestion.png?raw=true)\n\n##### \u003ca name=\"compare\"\u003e\u003c/a\u003eCompare .out to .json outputs\n\nPypact can handle the parsing of both the .out fispact file and the .json fispact file, which was added in FISPACT-II 4.0. To compare that both output parsers handle the data correctly, an example has been added to use both file formats to plot the total heat after irradiation. The example produces two identical plots to prove the parser correctness. The example, compareplots.py, can be found at 'pypact/examples/compareplots.py' and uses the reference output files test31.out and test31.json to produce the following plot.\n\n![Figure of total heat after irradiation](https://github.com/fispact/pypact/blob/master/examples/figures/heat_output_irradiation.png?raw=true)\n\n##### \u003ca name=\"gammaspec\"\u003e\u003c/a\u003eGet the spectral line data from the printlib files\n\nWhilst Pypact is designed to handle only conventional inventory output files, recent developments can allow parsing of other files, such as printlib outputs. Currently only printlib 5 output (spectral lines) is supported.\n\nAn example of using this is given in the examples, but the API is similar to the conventional reader. Note that PrintLib5Reader must be used instead of Reader.\n\n```python\nimport pypact as pp\n\nwith pp.PrintLib5Reader('printlib5.out') as output:\n    for m in output.spectral_data:\n        # U235\n        if m.zai == 922350:\n            print(m.json_serialize())\n```\n\nThe spectral lines can easily be plotted:\n![Figure of spectral lines example](https://github.com/fispact/pypact/blob/master/examples/figures/U235_gamma_spec.png?raw=true)\n\n#### \u003ca name=\"executing-unit-tests\"\u003e\u003c/a\u003eExecuting tests\n\nIn order to run the unit tests to check if the package is correctly downloaded, it is required to install pytest from pip.\n\n```bash\npip3 install pytest\n```\n\nOnce installed and in the base directory for Pypact run\n\n```bash\npython3 setup.py test\n```\n\n#### \u003ca name=\"supported-outputs\"\u003e\u003c/a\u003eSupported outputs\n\nAt time of writing, not all of the FISPACT-II output can be parsed and therefore some data is missing from Pypact. It is our intention to cover the whole file (or the important bits) in the future, until then the list of supported outputs is listed below.\n\nNow contains gamma spectrum, which has the bin values of size n, and bin boundaries of size n+1. See the examples for gammaspectrum and the animation option.\n\n- Output (returned from reader() operation)\n  - Run Data (output.run_data) - run name (output.run_data.run_name) - timestamp (output.run_data.timestamp) - flux name (output.run_data.flux_name)\n  - Inventory Data (output.inventory_data) - list of **TimeStep** objects, which has - irradation time (output.inventory_data[entry].irradiation_time) - cooling time (output.inventory_data[entry].cooling_time) - flux (output.inventory_data[entry].flux) - total heat (output.inventory_data[entry].total_heat) - alpha heat (output.inventory_data[entry].alpha_heat) - beta heat (output.inventory_data[entry].beta_heat) - gamma heat (output.inventory_data[entry].gamma_heat) - ingestion dose (output.inventory_data[entry].ingestion_dose) - inhalation dose (output.inventory_data[entry].inhalation_dose) - gamma_spectrum (output.inventory_data[entry].gamma_spectrum) - boundaries (output.inventory_data[entry].gamma_spectrum.boundaries) - values (output.inventory_data[entry].gamma_spectrum.values) - dose rate (output.inventory_data[entry].dose_rate) - type (output.inventory_data[entry].dose_rate.type) - distance (output.inventory_data[entry].dose_rate.distance) - mass (output.inventory_data[entry].dose_rate.mass) - dose (output.inventory_data[entry].dose_rate.dose) - nuclides (output.inventory_data[entry].nuclides) - nuclides (output.inventory_data[entry].nuclides.nuclides)\n\nNuclides is a list of **Nuclide** objects containing:\n\n- Nuclide (output.inventory*data[entry].nuclides.nuclides[nentry] \\_aka nuclide*)\n  - element (nuclide.element)\n  - isotope (nuclide.isotope)\n  - state (nuclide.state)\n  - half life (nuclide.half_life)\n  - grams (nuclide.grams)\n  - activity (nuclide.activity)\n  - heat (nuclide.heat)\n  - alpha heat (nuclide.alpha_heat)\n  - beta heat (nuclide.beta_heat)\n  - gamma heat (nuclide.gamma_heat)\n  - dose (nuclide.dose)\n  - ingestion (nuclide.ingestion)\n  - inhalation (nuclide.inhalation)\n\n#### \u003ca name=\"contact\"\u003e\u003c/a\u003eContact\n\nFor more information or requests, contact us through https://fispact.ukaea.uk/contact\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffispact%2Fpypact","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffispact%2Fpypact","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffispact%2Fpypact/lists"}