f90wrap


Namef90wrap JSON
Version 0.2.16 PyPI version JSON
download
home_pageNone
SummaryFortran to Python interface generator with derived type support
upload_time2024-11-16 20:50:04
maintainerNone
docs_urlNone
authorNone
requires_pythonNone
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            f90wrap: Fortran to Python interface generator with derived type support
========================================================================

![Build Status](https://github.com/jameskermode/f90wrap/actions/workflows/python-package.yml/badge.svg)

f90wrap is a tool to automatically generate Python extension modules
which interface to Fortran code that makes use of derived types. It
builds on the capabilities of the popular
[f2py](https://sysbio.ioc.ee/projects/f2py2e/) utility by generating a
simpler Fortran 90 interface to the original Fortran code which is then
suitable for wrapping with f2py, together with a higher-level Pythonic
wrapper that makes the existance of an additional layer transparent to
the final user.

Copyright (C) James Kermode 2011-2021. Released under the GNU Lesser General
Public License, version 3. Parts originally based on f90doc - automatic
documentation generator for Fortran 90. Copyright (C) 2004 Ian Rutt.

If you would like to license the source code under different terms,
please contact James Kermode <james.kermode@gmail.com>

Dependencies
------------

 1.  [Python](http://www.python.org) 3.8+ (Python 2.7 no longer supported)
 2.  Recent version of [numpy](http://www.numpy.org) which includes `f2py`
 3.  Fortran compiler - tested with `gfortran` 4.6+ and recent `ifort` 12+

Installation
------------

For the latest stable release, install with `pip`:

```
pip install f90wrap
```

There is also a [conda package](https://anaconda.org/conda-forge/f90wrap) on conda-forge:

```
conda install -c conda-forge f90wrap
```

For the development version, installation is as follows:

```
pip install git+https://github.com/jameskermode/f90wrap
```

Note that if your Fortran 90 compiler has a non-standard name
(e.g. gfortran-9) then you need to set the `F90` environment variable
prior to installing f90wrap to ensure it uses the correct one, e.g.

```
F90=gfortran-9 pip install f90wrap
```

Examples and Testing
--------------------

To test the installation, run `make test` from the `examples/`
directory. You may find the code in the various examples useful.

Citing f90wrap
--------------

If you find `f90wrap` useful in academic work, please cite the following
(open access) publication:

> J. R. Kermode, f90wrap: an automated tool for constructing 
> deep Python interfaces to modern Fortran codes. 
> J. Phys. Condens. Matter (2020) 
>[doi:10.1088/1361-648X/ab82d2](https://dx.doi.org/10.1088/1361-648X/ab82d2)

BibTeX entry:

```bibtex

@ARTICLE{Kermode2020-f90wrap,
  title    = "f90wrap: an automated tool for constructing deep Python
              interfaces to modern Fortran codes",
  author   = "Kermode, James R",
  journal  = "J. Phys. Condens. Matter",
  month    =  mar,
  year     =  2020,
  keywords = "Fortran; Interfacing; Interoperability; Python; Wrapping codes;
              f2py",
  language = "en",
  issn     = "0953-8984, 1361-648X",
  pmid     = "32209737",
  doi      = "10.1088/1361-648X/ab82d2"
}

```

Case studies
------------

f90wrap has been used to wrap the following large-scale scientific
applications:

 - [QUIP](http://libatoms.github.io/QUIP/) - molecular dynamics code
 - [CASTEP](http://www.castep.org) - CasPyTep wrappers for electronic structure code
 - [QEpy](http://qepy.rutgers.edu/index.html) - Python wrapper for Quantum Espresso electronic structure code

See this [Jupyter notebook](https://github.com/jameskermode/f90wrap/blob/master/docs/tutorials/f90wrap-demo.ipynb) 
from a recent seminar for more details.

Usage
-----

To use `f90wrap` to wrap a set of Fortran 90 source files and produce
wrappers suitable for input to f2py use:

    f90wrap -m MODULE F90_FILES

where `MODULE` is the name of the Python module you want to produce (e.g.
the name of the Fortran code you are wrapping) and `F90_FILES` is a list
of Fortran 90 source files containing the modules, types and subroutines
you would like to expose via Python.

This will produce two types of output: Fortran 90 wrapper files suitable
for input to `f2py` to produce a low-level Python extension module, and a
high-level Python module desinged to be used together with the
f2py-generated module to give a more Pythonic interface.

One Fortran 90 wrapper file is written for each source file, named
`f90wrap_F90_FILE.f90`, plus possibly an extra file named
`f90wrap_toplevel.f90` if there are any subroutines or functions defined
outside of modules in `F90_FILES`.

To use f2py to compile these wrappers into an extension module, use:

    f2py -c -m _MODULE OBJ_FILES f90wrap_*.f90 *.o

where `_MODULE` is the name of the low-level extension module.

Optionally, you can replace `f2py` with `f2py-f90wrap`, which is a
slightly modified version of `f2py` included in this distribution
that introduces the following features:

1.  Allow the Fortran `present()` intrinsic function to work correctly with
    optional arguments. If an argument to an f2py wrapped function is
    optional and is not given, replace it with `NULL`.
2.  Allow Fortran routines to raise a RuntimeError exception with a
    message by calling an external function `f90wrap_abort`().
    This is implemented using a `setjmp()/longjmp()` trap.
3.  Allow Fortran routines to be interrupted with `Ctrl+C` by installing
    a custom interrupt handler before the call into Fortran is made.
    After the Fortran routine returns, the previous interrupt handler
    is restored.

Notes
-----

- Unlike standard `f2py`, `f90wrap` converts all `intent(out)` arrays to
`intent(in, out)`. This was a deliberate design decision to allow allocatable and automatic arrays of unknown output size to be used. It is hard in general to work out what size array needs to be allocated, so relying on the the user to pre-allocate from Python is the safest solution.
- Scalar arguments without `intent` are treated as `intent(in)` by `f2py`. To have `inout` scalars, you need to call `f90wrap` with the `--default-to-inout` flag and declare the python variables as 1-length numpy arrays (`numpy.zeros(1)` for example).
- Pointer arguments are not supported.
- Arrays of derived types are currently not fully supported: a workaround is provided for 1D-fixed-length arrays, i.e. `type(a), dimension(b) :: c`. In this case, the super-type `Type_a_Xb_Array` will be created, and the array of types can be accessed through `c.items`. Note that dimension b can not be `:`, but can be a parameter.
- Doxygen documentation in Fortran sources are parsed and given as docstring in corresponding python interfaces. Doxygen support is partial and keyword support is limited to `brief`, `details`, `file`, `author` and `copyright`.

How f90wrap works
-----------------

There are five steps in the process of wrapping a Fortran 90 routine to
allow it to be called from Python.

1.  The Fortran source files are scanned, building up an
    abstract symbol tree (AST) which describes all the modules, types,
    subroutines and functions found.
2.  The AST is transformed to remove nodes which
    should not be wrapped (e.g. private symbols in modules, routines
    with arguments of a derived type not defined in the project, etc.)
3.  The `f90wrap.f90wrapgen.F90WrapperGenerator` class is used to write
    a simplified Fortran 90 prototype for each routine, with derived
    type arguments replaced by integer arrays containing a
    representation of a pointer to the derived type, in the manner
    described in
    [Pletzer2008](https://doi.org/10.1109/MCSE.2008.94).
    This allows opaque references to the
    true Fortran derived type data structures to be passed back and
    forth between Python and Fortran.
4.  f2py is used to combine the F90 wrappers and the original compiled
    functions into a Python extension module (optionally, f2py can be
    replaced by f2py-f90wrap, a slightly modified version which adds
    support for exception handling and interruption during exceution of
    Fortran code).
5.  The `f90wrap.pywrapgen.PythonWrapperGenerator` class is used to
    write a thin object-oriented layer on top of the f2py generated
    wrapper functions which handles conversion between Python object
    instances and Fortran derived-type variables, converting arguments
    back and forth automatically.

Advanced Features
-----------------

Additional command line arguments can be passed to f90wrap to customize
how the wrappers are generated. See the `examples/` directory to see how
some of the options are used:

      -h, --help            show this help message and exit
      -v, --verbose         set verbosity level [default: None]
      -V, --version         show program's version number and exit
      -p PREFIX, --prefix PREFIX
                            Prefix to prepend to arguments and subroutines.
      -c [CALLBACK [CALLBACK ...]], --callback [CALLBACK [CALLBACK ...]]
                            Names of permitted callback routines.
      -C [CONSTRUCTORS [CONSTRUCTORS ...]], --constructors [CONSTRUCTORS [CONSTRUCTORS ...]]
                            Names of constructor routines.
      -D [DESTRUCTORS [DESTRUCTORS ...]], --destructors [DESTRUCTORS [DESTRUCTORS ...]]
                            Names of destructor routines.
      -k KIND_MAP, --kind-map KIND_MAP
                            File containting Python dictionary in f2py_f2cmap
                            format
      -s STRING_LENGTHS, --string-lengths STRING_LENGTHS
                            "File containing Python dictionary mapping string
                            length names to values
      -S DEFAULT_STRING_LENGTH, --default-string-length DEFAULT_STRING_LENGTH
                            Default length of character strings
      -i INIT_LINES, --init-lines INIT_LINES
                            File containing Python dictionary mapping type names
                            to necessary initialisation code
      -I INIT_FILE, --init-file INIT_FILE
                            Python source file containing code to be added to
                            autogenerated __init__.py
      -A ARGUMENT_NAME_MAP, --argument-name-map ARGUMENT_NAME_MAP
                            File containing Python dictionary to rename Fortran
                            arguments
      --short-names SHORT_NAMES
                            File containing Python dictionary mapping full type
                            names to abbreviations
      --py-mod-names PY_MOD_NAMES
                            File containing Python dictionary mapping Fortran
                            module names to Python ones
      --class-names CLASS_NAMES
                            File containing Python dictionary mapping Fortran type
                            names to Python classes
      --joint-modules JOINT_MODULES
                            File containing Python dictionary mapping modules
                            defining times to list of additional modules defining
                            methods
      -m MOD_NAME, --mod-name MOD_NAME
                            Name of output extension module (without .so
                            extension).
      -M, --move-methods    Convert routines with derived type instance as first
                            agument into class methods
      --shorten-routine-names
                            Remove type name prefix from routine names, e.g.
                            cell_symmetrise() -> symmetrise()
      -P, --package         Generate a Python package instead of a single module
      -a ABORT_FUNC, --abort-func ABORT_FUNC
                            Name of Fortran subroutine to invoke if a fatal error
                            occurs
      --only [ONLY [ONLY ...]]
                            Subroutines to include in wrapper
      --skip [SKIP [SKIP ...]]
                            Subroutines to exclude modules and subroutines from
                            wrapper
      --skip-types [SKIP_TYPES [SKIP_TYPES ...]]
                            Subroutines to exclude types from wrapper
      --force-public [FORCE_PUBLIC [FORCE_PUBLIC ...]]
                            Names which are forced to be make public
      --default-to-inout    Sets all arguments without intent to intent(inout)
      --conf-file CONF_FILE
                            Use Python configuration script to set options
      --documentation-plugin DOCUMENTATION_PLUGIN
                            Use Python script for expanding the documentation of
                            functions and subroutines. All lines of the given tree
                            object are passed to it with a reference to its
                            documentation
      --py-max-line-length PY_MAX_LINE_LENGTH
                            Maximum length of lines in python files written.
                            Default: 80
      --f90-max-line-length F90_MAX_LINE_LENGTH
                            Maximum length of lines in fortan files written.
                            Default: 120
      --type-check          Check for type/shape matching of Python argument with the wrapped Fortran subroutine
         

Author
------

James Kermode [jameskermode](https://github.com/jameskermode)

Contributors
------------

- Tamas Stenczel [stenczelt](https://github.com/stenczelt)
- Steven Murray [steven-murray](https://github.com/steven-murray)
- Greg Corbett  [gregcorbett](https://github.com/gregcorbett)
- Bob Fischer [citibob](https://github.com/citibob)
- David Verelst [davidovitch](https://github.com/davidovitch)
- James Orr [jamesorr](https://github.com/jamesorr)
- [yvesch](https://github.com/yvesch)
- [Matthias Cuntz](https://github.com/mcuntz)
- Balthasar Reuter [reuterbal](https://github.com/reuterbal)
- Daniel Vanzo [danbeibei](https://github.com/danbeibei)


Developer Notes
---------------

### Triggering the wheel build

Wheels are built on push and pull requests to `master` using cibuildwheel
with [this workflow](.github/workflows/build-wheels.yml).

To make a release candidate create a tag with a suffix such as `-rc1` for the first attempt, 
push to trigger the build:

```bash
git commit -m 'release v0.x.z.rc1'
git tag v0.x.y.rc1
git push --tags
```

If all goes well, the `.whl` files will show up as assets within a new GitHub
release. The installation process can now be tested locally.

### Release wheels to PyPI

Once everything works correctly, make a full release (i.e. create a tag named
just `v0.x.y` without the `-rc1` suffix). This will trigger the upload of wheels
and source distribution to PyPI.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "f90wrap",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": null,
    "author": null,
    "author_email": "James Kermode <james.kermode@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/2f/c6/efaa30f74e3175025fb077e49987f670f3d81cf2353c43198441441fc676/f90wrap-0.2.16.tar.gz",
    "platform": null,
    "description": "f90wrap: Fortran to Python interface generator with derived type support\n========================================================================\n\n![Build Status](https://github.com/jameskermode/f90wrap/actions/workflows/python-package.yml/badge.svg)\n\nf90wrap is a tool to automatically generate Python extension modules\nwhich interface to Fortran code that makes use of derived types. It\nbuilds on the capabilities of the popular\n[f2py](https://sysbio.ioc.ee/projects/f2py2e/) utility by generating a\nsimpler Fortran 90 interface to the original Fortran code which is then\nsuitable for wrapping with f2py, together with a higher-level Pythonic\nwrapper that makes the existance of an additional layer transparent to\nthe final user.\n\nCopyright (C) James Kermode 2011-2021. Released under the GNU Lesser General\nPublic License, version 3. Parts originally based on f90doc - automatic\ndocumentation generator for Fortran 90. Copyright (C) 2004 Ian Rutt.\n\nIf you would like to license the source code under different terms,\nplease contact James Kermode <james.kermode@gmail.com>\n\nDependencies\n------------\n\n 1.  [Python](http://www.python.org) 3.8+ (Python 2.7 no longer supported)\n 2.  Recent version of [numpy](http://www.numpy.org) which includes `f2py`\n 3.  Fortran compiler - tested with `gfortran` 4.6+ and recent `ifort` 12+\n\nInstallation\n------------\n\nFor the latest stable release, install with `pip`:\n\n```\npip install f90wrap\n```\n\nThere is also a [conda package](https://anaconda.org/conda-forge/f90wrap) on conda-forge:\n\n```\nconda install -c conda-forge f90wrap\n```\n\nFor the development version, installation is as follows:\n\n```\npip install git+https://github.com/jameskermode/f90wrap\n```\n\nNote that if your Fortran 90 compiler has a non-standard name\n(e.g. gfortran-9) then you need to set the `F90` environment variable\nprior to installing f90wrap to ensure it uses the correct one, e.g.\n\n```\nF90=gfortran-9 pip install f90wrap\n```\n\nExamples and Testing\n--------------------\n\nTo test the installation, run `make test` from the `examples/`\ndirectory. You may find the code in the various examples useful.\n\nCiting f90wrap\n--------------\n\nIf you find `f90wrap` useful in academic work, please cite the following\n(open access) publication:\n\n> J. R. Kermode, f90wrap: an automated tool for constructing \n> deep Python interfaces to modern Fortran codes. \n> J. Phys. Condens. Matter (2020) \n>[doi:10.1088/1361-648X/ab82d2](https://dx.doi.org/10.1088/1361-648X/ab82d2)\n\nBibTeX entry:\n\n```bibtex\n\n@ARTICLE{Kermode2020-f90wrap,\n  title    = \"f90wrap: an automated tool for constructing deep Python\n              interfaces to modern Fortran codes\",\n  author   = \"Kermode, James R\",\n  journal  = \"J. Phys. Condens. Matter\",\n  month    =  mar,\n  year     =  2020,\n  keywords = \"Fortran; Interfacing; Interoperability; Python; Wrapping codes;\n              f2py\",\n  language = \"en\",\n  issn     = \"0953-8984, 1361-648X\",\n  pmid     = \"32209737\",\n  doi      = \"10.1088/1361-648X/ab82d2\"\n}\n\n```\n\nCase studies\n------------\n\nf90wrap has been used to wrap the following large-scale scientific\napplications:\n\n - [QUIP](http://libatoms.github.io/QUIP/) - molecular dynamics code\n - [CASTEP](http://www.castep.org) - CasPyTep wrappers for electronic structure code\n - [QEpy](http://qepy.rutgers.edu/index.html) - Python wrapper for Quantum Espresso electronic structure code\n\nSee this [Jupyter notebook](https://github.com/jameskermode/f90wrap/blob/master/docs/tutorials/f90wrap-demo.ipynb) \nfrom a recent seminar for more details.\n\nUsage\n-----\n\nTo use `f90wrap` to wrap a set of Fortran 90 source files and produce\nwrappers suitable for input to f2py use:\n\n    f90wrap -m MODULE F90_FILES\n\nwhere `MODULE` is the name of the Python module you want to produce (e.g.\nthe name of the Fortran code you are wrapping) and `F90_FILES` is a list\nof Fortran 90 source files containing the modules, types and subroutines\nyou would like to expose via Python.\n\nThis will produce two types of output: Fortran 90 wrapper files suitable\nfor input to `f2py` to produce a low-level Python extension module, and a\nhigh-level Python module desinged to be used together with the\nf2py-generated module to give a more Pythonic interface.\n\nOne Fortran 90 wrapper file is written for each source file, named\n`f90wrap_F90_FILE.f90`, plus possibly an extra file named\n`f90wrap_toplevel.f90` if there are any subroutines or functions defined\noutside of modules in `F90_FILES`.\n\nTo use f2py to compile these wrappers into an extension module, use:\n\n    f2py -c -m _MODULE OBJ_FILES f90wrap_*.f90 *.o\n\nwhere `_MODULE` is the name of the low-level extension module.\n\nOptionally, you can replace `f2py` with `f2py-f90wrap`, which is a\nslightly modified version of `f2py` included in this distribution\nthat introduces the following features:\n\n1.  Allow the Fortran `present()` intrinsic function to work correctly with\n    optional arguments. If an argument to an f2py wrapped function is\n    optional and is not given, replace it with `NULL`.\n2.  Allow Fortran routines to raise a RuntimeError exception with a\n    message by calling an external function `f90wrap_abort`().\n    This is implemented using a `setjmp()/longjmp()` trap.\n3.  Allow Fortran routines to be interrupted with `Ctrl+C` by installing\n    a custom interrupt handler before the call into Fortran is made.\n    After the Fortran routine returns, the previous interrupt handler\n    is restored.\n\nNotes\n-----\n\n- Unlike standard `f2py`, `f90wrap` converts all `intent(out)` arrays to\n`intent(in, out)`. This was a deliberate design decision to allow allocatable and automatic arrays of unknown output size to be used. It is hard in general to work out what size array needs to be allocated, so relying on the the user to pre-allocate from Python is the safest solution.\n- Scalar arguments without `intent` are treated as `intent(in)` by `f2py`. To have `inout` scalars, you need to call `f90wrap` with the `--default-to-inout` flag and declare the python variables as 1-length numpy arrays (`numpy.zeros(1)` for example).\n- Pointer arguments are not supported.\n- Arrays of derived types are currently not fully supported: a workaround is provided for 1D-fixed-length arrays, i.e. `type(a), dimension(b) :: c`. In this case, the super-type `Type_a_Xb_Array` will be created, and the array of types can be accessed through `c.items`. Note that dimension b can not be `:`, but can be a parameter.\n- Doxygen documentation in Fortran sources are parsed and given as docstring in corresponding python interfaces. Doxygen support is partial and keyword support is limited to `brief`, `details`, `file`, `author` and `copyright`.\n\nHow f90wrap works\n-----------------\n\nThere are five steps in the process of wrapping a Fortran 90 routine to\nallow it to be called from Python.\n\n1.  The Fortran source files are scanned, building up an\n    abstract symbol tree (AST) which describes all the modules, types,\n    subroutines and functions found.\n2.  The AST is transformed to remove nodes which\n    should not be wrapped (e.g. private symbols in modules, routines\n    with arguments of a derived type not defined in the project, etc.)\n3.  The `f90wrap.f90wrapgen.F90WrapperGenerator` class is used to write\n    a simplified Fortran 90 prototype for each routine, with derived\n    type arguments replaced by integer arrays containing a\n    representation of a pointer to the derived type, in the manner\n    described in\n    [Pletzer2008](https://doi.org/10.1109/MCSE.2008.94).\n    This allows opaque references to the\n    true Fortran derived type data structures to be passed back and\n    forth between Python and Fortran.\n4.  f2py is used to combine the F90 wrappers and the original compiled\n    functions into a Python extension module (optionally, f2py can be\n    replaced by f2py-f90wrap, a slightly modified version which adds\n    support for exception handling and interruption during exceution of\n    Fortran code).\n5.  The `f90wrap.pywrapgen.PythonWrapperGenerator` class is used to\n    write a thin object-oriented layer on top of the f2py generated\n    wrapper functions which handles conversion between Python object\n    instances and Fortran derived-type variables, converting arguments\n    back and forth automatically.\n\nAdvanced Features\n-----------------\n\nAdditional command line arguments can be passed to f90wrap to customize\nhow the wrappers are generated. See the `examples/` directory to see how\nsome of the options are used:\n\n      -h, --help            show this help message and exit\n      -v, --verbose         set verbosity level [default: None]\n      -V, --version         show program's version number and exit\n      -p PREFIX, --prefix PREFIX\n                            Prefix to prepend to arguments and subroutines.\n      -c [CALLBACK [CALLBACK ...]], --callback [CALLBACK [CALLBACK ...]]\n                            Names of permitted callback routines.\n      -C [CONSTRUCTORS [CONSTRUCTORS ...]], --constructors [CONSTRUCTORS [CONSTRUCTORS ...]]\n                            Names of constructor routines.\n      -D [DESTRUCTORS [DESTRUCTORS ...]], --destructors [DESTRUCTORS [DESTRUCTORS ...]]\n                            Names of destructor routines.\n      -k KIND_MAP, --kind-map KIND_MAP\n                            File containting Python dictionary in f2py_f2cmap\n                            format\n      -s STRING_LENGTHS, --string-lengths STRING_LENGTHS\n                            \"File containing Python dictionary mapping string\n                            length names to values\n      -S DEFAULT_STRING_LENGTH, --default-string-length DEFAULT_STRING_LENGTH\n                            Default length of character strings\n      -i INIT_LINES, --init-lines INIT_LINES\n                            File containing Python dictionary mapping type names\n                            to necessary initialisation code\n      -I INIT_FILE, --init-file INIT_FILE\n                            Python source file containing code to be added to\n                            autogenerated __init__.py\n      -A ARGUMENT_NAME_MAP, --argument-name-map ARGUMENT_NAME_MAP\n                            File containing Python dictionary to rename Fortran\n                            arguments\n      --short-names SHORT_NAMES\n                            File containing Python dictionary mapping full type\n                            names to abbreviations\n      --py-mod-names PY_MOD_NAMES\n                            File containing Python dictionary mapping Fortran\n                            module names to Python ones\n      --class-names CLASS_NAMES\n                            File containing Python dictionary mapping Fortran type\n                            names to Python classes\n      --joint-modules JOINT_MODULES\n                            File containing Python dictionary mapping modules\n                            defining times to list of additional modules defining\n                            methods\n      -m MOD_NAME, --mod-name MOD_NAME\n                            Name of output extension module (without .so\n                            extension).\n      -M, --move-methods    Convert routines with derived type instance as first\n                            agument into class methods\n      --shorten-routine-names\n                            Remove type name prefix from routine names, e.g.\n                            cell_symmetrise() -> symmetrise()\n      -P, --package         Generate a Python package instead of a single module\n      -a ABORT_FUNC, --abort-func ABORT_FUNC\n                            Name of Fortran subroutine to invoke if a fatal error\n                            occurs\n      --only [ONLY [ONLY ...]]\n                            Subroutines to include in wrapper\n      --skip [SKIP [SKIP ...]]\n                            Subroutines to exclude modules and subroutines from\n                            wrapper\n      --skip-types [SKIP_TYPES [SKIP_TYPES ...]]\n                            Subroutines to exclude types from wrapper\n      --force-public [FORCE_PUBLIC [FORCE_PUBLIC ...]]\n                            Names which are forced to be make public\n      --default-to-inout    Sets all arguments without intent to intent(inout)\n      --conf-file CONF_FILE\n                            Use Python configuration script to set options\n      --documentation-plugin DOCUMENTATION_PLUGIN\n                            Use Python script for expanding the documentation of\n                            functions and subroutines. All lines of the given tree\n                            object are passed to it with a reference to its\n                            documentation\n      --py-max-line-length PY_MAX_LINE_LENGTH\n                            Maximum length of lines in python files written.\n                            Default: 80\n      --f90-max-line-length F90_MAX_LINE_LENGTH\n                            Maximum length of lines in fortan files written.\n                            Default: 120\n      --type-check          Check for type/shape matching of Python argument with the wrapped Fortran subroutine\n         \n\nAuthor\n------\n\nJames Kermode [jameskermode](https://github.com/jameskermode)\n\nContributors\n------------\n\n- Tamas Stenczel [stenczelt](https://github.com/stenczelt)\n- Steven Murray [steven-murray](https://github.com/steven-murray)\n- Greg Corbett  [gregcorbett](https://github.com/gregcorbett)\n- Bob Fischer [citibob](https://github.com/citibob)\n- David Verelst [davidovitch](https://github.com/davidovitch)\n- James Orr [jamesorr](https://github.com/jamesorr)\n- [yvesch](https://github.com/yvesch)\n- [Matthias Cuntz](https://github.com/mcuntz)\n- Balthasar Reuter [reuterbal](https://github.com/reuterbal)\n- Daniel Vanzo [danbeibei](https://github.com/danbeibei)\n\n\nDeveloper Notes\n---------------\n\n### Triggering the wheel build\n\nWheels are built on push and pull requests to `master` using cibuildwheel\nwith [this workflow](.github/workflows/build-wheels.yml).\n\nTo make a release candidate create a tag with a suffix such as `-rc1` for the first attempt, \npush to trigger the build:\n\n```bash\ngit commit -m 'release v0.x.z.rc1'\ngit tag v0.x.y.rc1\ngit push --tags\n```\n\nIf all goes well, the `.whl` files will show up as assets within a new GitHub\nrelease. The installation process can now be tested locally.\n\n### Release wheels to PyPI\n\nOnce everything works correctly, make a full release (i.e. create a tag named\njust `v0.x.y` without the `-rc1` suffix). This will trigger the upload of wheels\nand source distribution to PyPI.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Fortran to Python interface generator with derived type support",
    "version": "0.2.16",
    "project_urls": {
        "Homepage": "https://github.com/jameskermode/f90wrap"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2fe2345b52b74c0c523d5fb7fee3c81f9bff3fab17585035a48fa3de30395223",
                "md5": "da5e33174780568647e85f61bd82eec2",
                "sha256": "3d98569d9e29bf0c76af1b2100317acdfaf762fc575c3e5023cd30c8d2edbacf"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "da5e33174780568647e85f61bd82eec2",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 108606,
            "upload_time": "2024-11-16T20:55:55",
            "upload_time_iso_8601": "2024-11-16T20:55:55.670595Z",
            "url": "https://files.pythonhosted.org/packages/2f/e2/345b52b74c0c523d5fb7fee3c81f9bff3fab17585035a48fa3de30395223/f90wrap-0.2.16-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "53c612c71b660dc1a09487b3b653ee637f954568a3b292bbbeaf6e25b9b20f5b",
                "md5": "c9f1c8f79f22a4f2b4c3ab9ad139020b",
                "sha256": "c064fc4135fc93a11aea7a804a35a58b291a679b38859d1999a51cdee9d17cea"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "c9f1c8f79f22a4f2b4c3ab9ad139020b",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 108406,
            "upload_time": "2024-11-16T20:57:04",
            "upload_time_iso_8601": "2024-11-16T20:57:04.339583Z",
            "url": "https://files.pythonhosted.org/packages/53/c6/12c71b660dc1a09487b3b653ee637f954568a3b292bbbeaf6e25b9b20f5b/f90wrap-0.2.16-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "831702276ca93290703fb98e3b87afcdc12dd3b1ae940aa03a0ebcf67b2b43a5",
                "md5": "c96be8ac3501735b9675d1abb0c3e343",
                "sha256": "46c645253a870dad855c5b54b1a4d7d5a15239fe8052c262000d8ad37dcf86b8"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c96be8ac3501735b9675d1abb0c3e343",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 113637,
            "upload_time": "2024-11-16T20:49:48",
            "upload_time_iso_8601": "2024-11-16T20:49:48.443194Z",
            "url": "https://files.pythonhosted.org/packages/83/17/02276ca93290703fb98e3b87afcdc12dd3b1ae940aa03a0ebcf67b2b43a5/f90wrap-0.2.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "550d709d72f1443e87b4a443d45e22b535929b13de6ae0161f30152845712f24",
                "md5": "2cbb129b9432f230de58cd47dfdb976c",
                "sha256": "cf6113cf9ed438ef99c0db3fdcfe6aed85db0a2cb0f065834e108073ef77f7d5"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2cbb129b9432f230de58cd47dfdb976c",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 141547,
            "upload_time": "2024-11-16T20:50:13",
            "upload_time_iso_8601": "2024-11-16T20:50:13.652106Z",
            "url": "https://files.pythonhosted.org/packages/55/0d/709d72f1443e87b4a443d45e22b535929b13de6ae0161f30152845712f24/f90wrap-0.2.16-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3ae7da6399194733461180e31ee99c2b99b04cec6d4179a0fa58f44db87cde42",
                "md5": "3ef5c61abc407141b8adda32f591a11b",
                "sha256": "07784c9eb74ba6d709f327a282feecb5b210ecfaa83b43ddf82523aa59dccbb5"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3ef5c61abc407141b8adda32f591a11b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 108606,
            "upload_time": "2024-11-16T20:55:04",
            "upload_time_iso_8601": "2024-11-16T20:55:04.883043Z",
            "url": "https://files.pythonhosted.org/packages/3a/e7/da6399194733461180e31ee99c2b99b04cec6d4179a0fa58f44db87cde42/f90wrap-0.2.16-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5ec12207acbc38cddeb11db97e050ef2cac60a8b546ea9ef467fbc2138a2a9cd",
                "md5": "91e380083565087ff726560e6ffd09fa",
                "sha256": "c48eef138c7c31509a6fa40d54418dfcd730cc89dfbdffcb3c2702dc21ef53d8"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "91e380083565087ff726560e6ffd09fa",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 108406,
            "upload_time": "2024-11-16T20:58:11",
            "upload_time_iso_8601": "2024-11-16T20:58:11.126128Z",
            "url": "https://files.pythonhosted.org/packages/5e/c1/2207acbc38cddeb11db97e050ef2cac60a8b546ea9ef467fbc2138a2a9cd/f90wrap-0.2.16-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "aefb1531b314cbe6eed723ee732311c5bed9a8a2b0278d924e4c90ebf8a3e2e5",
                "md5": "76133d8b1754d3fde399e72db6e12e12",
                "sha256": "5398d2fe32d58a49554ecb4bb190848a9ee735ab4e02844743d3e3c04edb3209"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "76133d8b1754d3fde399e72db6e12e12",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 113625,
            "upload_time": "2024-11-16T20:49:47",
            "upload_time_iso_8601": "2024-11-16T20:49:47.941888Z",
            "url": "https://files.pythonhosted.org/packages/ae/fb/1531b314cbe6eed723ee732311c5bed9a8a2b0278d924e4c90ebf8a3e2e5/f90wrap-0.2.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "506042bbf3f18694c4e2aaa2ebeaaf3106e40926a0c68dd16ec904ad2cf6f7ec",
                "md5": "0de13ff2e094c43112911969b821fba9",
                "sha256": "a561cca6a27f3026be4ea1858725260d20b620018ec53a1a24ecec5bd53811ac"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "0de13ff2e094c43112911969b821fba9",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 141561,
            "upload_time": "2024-11-16T20:50:11",
            "upload_time_iso_8601": "2024-11-16T20:50:11.520808Z",
            "url": "https://files.pythonhosted.org/packages/50/60/42bbf3f18694c4e2aaa2ebeaaf3106e40926a0c68dd16ec904ad2cf6f7ec/f90wrap-0.2.16-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "39df15550a06e7f7199897c203aed1d0c8181addff26dcbd743ca9f20afcd9d3",
                "md5": "f358652ddbcc98c6d130c19b533fb220",
                "sha256": "6a31530872e0507fbef1479878732117b9492442f660937660c23024ff7adc11"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp312-cp312-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f358652ddbcc98c6d130c19b533fb220",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 108957,
            "upload_time": "2024-11-16T20:56:04",
            "upload_time_iso_8601": "2024-11-16T20:56:04.904834Z",
            "url": "https://files.pythonhosted.org/packages/39/df/15550a06e7f7199897c203aed1d0c8181addff26dcbd743ca9f20afcd9d3/f90wrap-0.2.16-cp312-cp312-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a456ae36290dd08122356a44d1e89f9f873e7c56d7c8eb2c28afa99c68b26db3",
                "md5": "f553ee665ac8f5e529bb8f774716d02e",
                "sha256": "d699c4341d95f42e803c701576a0e2426b1f9d92d898e523c11b79c6e5b32633"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "f553ee665ac8f5e529bb8f774716d02e",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 108702,
            "upload_time": "2024-11-16T20:58:40",
            "upload_time_iso_8601": "2024-11-16T20:58:40.927208Z",
            "url": "https://files.pythonhosted.org/packages/a4/56/ae36290dd08122356a44d1e89f9f873e7c56d7c8eb2c28afa99c68b26db3/f90wrap-0.2.16-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cc9a14d0bdaaf3302d48d546a1dba9241418b14bef8cbc86dc24ff17074cf508",
                "md5": "6a36936606b4ce7a03f94fb9ae64956f",
                "sha256": "46a120410f389eca7ce25ac0a9ab38a236bc48360400263c9e87898a71b77079"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6a36936606b4ce7a03f94fb9ae64956f",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 113857,
            "upload_time": "2024-11-16T20:49:45",
            "upload_time_iso_8601": "2024-11-16T20:49:45.528996Z",
            "url": "https://files.pythonhosted.org/packages/cc/9a/14d0bdaaf3302d48d546a1dba9241418b14bef8cbc86dc24ff17074cf508/f90wrap-0.2.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "80ecc52f6026efa6eeb4f31c813e0aad619791e96167a4debd56fc8615afc3c6",
                "md5": "23c65df037da6c948b85ae6ee2da5244",
                "sha256": "4870d50bf2a0a539e5eb4abcdcdc3bea0517796c5d88853098a38cb12950c6ad"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "23c65df037da6c948b85ae6ee2da5244",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 141776,
            "upload_time": "2024-11-16T20:50:06",
            "upload_time_iso_8601": "2024-11-16T20:50:06.002170Z",
            "url": "https://files.pythonhosted.org/packages/80/ec/c52f6026efa6eeb4f31c813e0aad619791e96167a4debd56fc8615afc3c6/f90wrap-0.2.16-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1a6735d7fdbbe22604bf5ddc81c03c322b726141c9b31519462fba616f26848d",
                "md5": "41573bca23ffbf1e68049ffff93b0f20",
                "sha256": "d7f6f05e1b1e1623bcd664da9178ab38aed9bfba77c55520a098c678e7eff845"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "41573bca23ffbf1e68049ffff93b0f20",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 103198,
            "upload_time": "2024-11-16T20:56:23",
            "upload_time_iso_8601": "2024-11-16T20:56:23.804084Z",
            "url": "https://files.pythonhosted.org/packages/1a/67/35d7fdbbe22604bf5ddc81c03c322b726141c9b31519462fba616f26848d/f90wrap-0.2.16-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f265713edeeabe6cfd0fdf24b0d015d756706e66d81276f27ef5489a90eccd02",
                "md5": "ef78e9fd5f00e3df418474bb03cc4873",
                "sha256": "2d979669cc12ef3ba2eafa0e0170f0a20110e385585c6e083e330023fbfd619f"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ef78e9fd5f00e3df418474bb03cc4873",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 107263,
            "upload_time": "2024-11-16T20:49:47",
            "upload_time_iso_8601": "2024-11-16T20:49:47.554160Z",
            "url": "https://files.pythonhosted.org/packages/f2/65/713edeeabe6cfd0fdf24b0d015d756706e66d81276f27ef5489a90eccd02/f90wrap-0.2.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b7dccf91eed5c9bf4b45821890db122da1720c054d53d0d9963a1ac247a1f608",
                "md5": "ff99a96a5ecbd7ba9dc3a0385b85e95d",
                "sha256": "58ea009237e7dd80411a619c83fb935d9b983836d86e6ea61aaf1f0279d8bb08"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ff99a96a5ecbd7ba9dc3a0385b85e95d",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 136043,
            "upload_time": "2024-11-16T20:50:07",
            "upload_time_iso_8601": "2024-11-16T20:50:07.427724Z",
            "url": "https://files.pythonhosted.org/packages/b7/dc/cf91eed5c9bf4b45821890db122da1720c054d53d0d9963a1ac247a1f608/f90wrap-0.2.16-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d25fe783d0ecde608a88830aeb842da446e848b8662cf38dab51ece507927560",
                "md5": "684dbd32c8b7732305160c66270994c9",
                "sha256": "6ff9bc7f8b934d33cd261483d9c0eda3221cf3fc10e9e0d0a111fa5fe3bb37bb"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "684dbd32c8b7732305160c66270994c9",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 108755,
            "upload_time": "2024-11-16T20:54:46",
            "upload_time_iso_8601": "2024-11-16T20:54:46.719875Z",
            "url": "https://files.pythonhosted.org/packages/d2/5f/e783d0ecde608a88830aeb842da446e848b8662cf38dab51ece507927560/f90wrap-0.2.16-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "393437799a554c5ce5f06feee9bdf5955a3ca497a36973aba4e94b479efdb6ab",
                "md5": "6e845990f7167b1d81df008ff73ecbf7",
                "sha256": "9b724db18659eaf669b9ba5d8448748d2c8e3f13774fa62c05d2e7ab1c692140"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "6e845990f7167b1d81df008ff73ecbf7",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 108504,
            "upload_time": "2024-11-16T20:58:07",
            "upload_time_iso_8601": "2024-11-16T20:58:07.584220Z",
            "url": "https://files.pythonhosted.org/packages/39/34/37799a554c5ce5f06feee9bdf5955a3ca497a36973aba4e94b479efdb6ab/f90wrap-0.2.16-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "65087272df69db7c6cdaa6d5db13458737f84ed9efdcf1109d6526bc2609cd6e",
                "md5": "37878a62becd89157175987e958e85d6",
                "sha256": "a21267db802f7d2413e3fa6c089b07c7ed6ee2f77cc0a4d26783cc1ed7298f87"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "37878a62becd89157175987e958e85d6",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 113678,
            "upload_time": "2024-11-16T20:49:45",
            "upload_time_iso_8601": "2024-11-16T20:49:45.824232Z",
            "url": "https://files.pythonhosted.org/packages/65/08/7272df69db7c6cdaa6d5db13458737f84ed9efdcf1109d6526bc2609cd6e/f90wrap-0.2.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "66eb715b74216cf8739ed68ca3247c9a30f1aafab0b5f112e11e7b4251ed8240",
                "md5": "96e89cb907e795dbbb10a6cc63d3d444",
                "sha256": "52331d94d8fc10101ae7dc14a949cbe62f202fb6d78f2e4fc46200b77810175c"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "96e89cb907e795dbbb10a6cc63d3d444",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 141523,
            "upload_time": "2024-11-16T20:50:09",
            "upload_time_iso_8601": "2024-11-16T20:50:09.067191Z",
            "url": "https://files.pythonhosted.org/packages/66/eb/715b74216cf8739ed68ca3247c9a30f1aafab0b5f112e11e7b4251ed8240/f90wrap-0.2.16-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2fc6efaa30f74e3175025fb077e49987f670f3d81cf2353c43198441441fc676",
                "md5": "226399a67bc8d0878df1af3d556c65cb",
                "sha256": "f085be1eb0dc62512df604e3f5d7535d70ae1837175beb12e3f49466f08776c6"
            },
            "downloads": -1,
            "filename": "f90wrap-0.2.16.tar.gz",
            "has_sig": false,
            "md5_digest": "226399a67bc8d0878df1af3d556c65cb",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 2938877,
            "upload_time": "2024-11-16T20:50:04",
            "upload_time_iso_8601": "2024-11-16T20:50:04.243367Z",
            "url": "https://files.pythonhosted.org/packages/2f/c6/efaa30f74e3175025fb077e49987f670f3d81cf2353c43198441441fc676/f90wrap-0.2.16.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-11-16 20:50:04",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "jameskermode",
    "github_project": "f90wrap",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "f90wrap"
}
        
Elapsed time: 1.27939s