Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Shed importlib resources legacy #208

Closed

Conversation

jaraco
Copy link
Contributor

@jaraco jaraco commented Jul 14, 2023

@jaraco
Copy link
Contributor Author

jaraco commented Jul 14, 2023

The "Fade to black" commit is there because my editor is configured to save in black style if black is configured for the project (which this one is). Feel free to bypass that commit as you wish.

@jaraco
Copy link
Contributor Author

jaraco commented Jul 14, 2023

I have not tested this change, and I see there aren't CI tests, so please do test the implementation. I would also recommend to import the modules "as" something, e.g. import importlib_resources as resources / from importlib import resources or to import the names (as_file, files) directly to make the code more concise, but I retained the current style to minimize the difference.

@jaraco
Copy link
Contributor Author

jaraco commented Jul 14, 2023

Oh, I see that some tests did run. That's encouraging.

I ran the tests locally and there are a few failures, but none related to resources as far as I can tell:

 openeo-python-driver bugfix/206-shed-importlib-resources-legacy @ git submodule update --init
Submodule 'openeo_driver/specs/openeo-api/0.4' (https://github.com/Open-EO/openeo-api.git) registered for path 'openeo_driver/specs/openeo-api/0.4'
Submodule 'openeo_driver/specs/openeo-api/1.0' (https://github.com/Open-EO/openeo-api.git) registered for path 'openeo_driver/specs/openeo-api/1.x'
Submodule 'openeo_driver/specs/openeo-processes/0.4' (https://github.com/Open-EO/openeo-processes.git) registered for path 'openeo_driver/specs/openeo-processes/0.4'
Submodule 'openeo_driver/specs/openeo-processes/1.0' (https://github.com/Open-EO/openeo-processes.git) registered for path 'openeo_driver/specs/openeo-processes/1.x'
Submodule 'openeo_driver/specs/openeo-processes/2.x' (https://github.com/Open-EO/openeo-processes) registered for path 'openeo_driver/specs/openeo-processes/2.x'
Cloning into '/Users/jaraco/draft/openeo-python-driver/openeo_driver/specs/openeo-api/0.4'...
Cloning into '/Users/jaraco/draft/openeo-python-driver/openeo_driver/specs/openeo-api/1.x'...
Cloning into '/Users/jaraco/draft/openeo-python-driver/openeo_driver/specs/openeo-processes/0.4'...
Cloning into '/Users/jaraco/draft/openeo-python-driver/openeo_driver/specs/openeo-processes/1.x'...
Cloning into '/Users/jaraco/draft/openeo-python-driver/openeo_driver/specs/openeo-processes/2.x'...
Submodule path 'openeo_driver/specs/openeo-api/0.4': checked out 'c0c5e8ddebe57d074df458be6604a4e480b0ef59'
Submodule path 'openeo_driver/specs/openeo-api/1.x': checked out '66b7483fc56145b1eb7a456b8dfcff760fd895f3'
Submodule path 'openeo_driver/specs/openeo-processes/0.4': checked out '5bc9a5eefb207a7e149586692e9165667a7ab189'
Submodule path 'openeo_driver/specs/openeo-processes/1.x': checked out 'd0ce91fcd347360b907ea2d9589d7564a2c1e1e3'
Submodule path 'openeo_driver/specs/openeo-processes/2.x': checked out '965bbaebd4d5984203a0437076c85a66a72a23e0'
 openeo-python-driver bugfix/206-shed-importlib-resources-legacy @ py -3.9 -m pip-run '.[dev]' --extra-index-url https://artifactory.vgt.vito.be/api/pypi/python-openeo/
simple -- -m pytest
WARNING: boto3 1.28.3 does not provide the extra 's3'
========================================================================= test session starts ==========================================================================
platform darwin -- Python 3.9.17, pytest-7.4.0, pluggy-1.2.0
rootdir: /Users/jaraco/draft/openeo-python-driver
configfile: pytest.ini
testpaths: tests
plugins: time-machine-2.11.0, requests-mock-1.11.0, anyio-3.6.2
collected 1127 items                                                                                                                                                   

tests/test_ProcessGraphDeserializer.py [(Timestamp('2021-06-06 00:00:00'), Timestamp('2021-06-13 00:00:00')), (Timestamp('2021-06-13 00:00:00'), Timestamp('2021-06-20 00:00:00')), (Timestamp('2021-06-20 00:00:00'), Timestamp('2021-06-27 00:00:00'))]
..........[(Timestamp('2018-01-01 00:00:00'), Timestamp('2019-01-01 00:00:00')), (Timestamp('2019-01-01 00:00:00'), Timestamp('2020-01-01 00:00:00')), (Timestamp('2020-01-01 00:00:00'), Timestamp('2021-01-01 00:00:00')), (Timestamp('2021-01-01 00:00:00'), Timestamp('2022-01-01 00:00:00'))]
.[(Timestamp('2020-01-01 00:00:00'), Timestamp('2020-02-01 00:00:00')), (Timestamp('2020-02-01 00:00:00'), Timestamp('2020-03-01 00:00:00')), (Timestamp('2020-03-01 00:00:00'), Timestamp('2020-04-01 00:00:00')), (Timestamp('2020-04-01 00:00:00'), Timestamp('2020-05-01 00:00:00')), (Timestamp('2020-05-01 00:00:00'), Timestamp('2020-06-01 00:00:00')), (Timestamp('2020-06-01 00:00:00'), Timestamp('2020-07-01 00:00:00')), (Timestamp('2020-07-01 00:00:00'), Timestamp('2020-08-01 00:00:00')), (Timestamp('2020-08-01 00:00:00'), Timestamp('2020-09-01 00:00:00')), (Timestamp('2020-09-01 00:00:00'), Timestamp('2020-10-01 00:00:00')), (Timestamp('2020-10-01 00:00:00'), Timestamp('2020-11-01 00:00:00')), (Timestamp('2020-11-01 00:00:00'), Timestamp('2020-12-01 00:00:00')), (Timestamp('2020-12-01 00:00:00'), Timestamp('2021-01-01 00:00:00'))]
.[(Timestamp('2021-06-07 00:00:00'), Timestamp('2021-06-08 00:00:00')), (Timestamp('2021-06-08 00:00:00'), Timestamp('2021-06-09 00:00:00')), (Timestamp('2021-06-09 00:00:00'), Timestamp('2021-06-10 00:00:00')), (Timestamp('2021-06-10 00:00:00'), Timestamp('2021-06-11 00:00:00'))]
.[(Timestamp('2021-06-01 00:00:00'), Timestamp('2021-06-11 00:00:00')), (Timestamp('2021-06-11 00:00:00'), Timestamp('2021-06-21 00:00:00')), (Timestamp('2021-06-21 00:00:00'), Timestamp('2021-07-01 00:00:00')), (Timestamp('2021-07-01 00:00:00'), Timestamp('2021-07-11 00:00:00')), (Timestamp('2021-07-11 00:00:00'), Timestamp('2021-07-21 00:00:00'))]
.[(Timestamp('2021-06-01 00:00:00'), Timestamp('2021-06-11 00:00:00')), (Timestamp('2021-06-11 00:00:00'), Timestamp('2021-06-21 00:00:00')), (Timestamp('2021-06-21 00:00:00'), Timestamp('2021-07-01 00:00:00')), (Timestamp('2021-07-01 00:00:00'), Timestamp('2021-07-11 00:00:00')), (Timestamp('2021-07-11 00:00:00'), Timestamp('2021-07-21 00:00:00'))]
.........................................
tests/test_backend.py ..................
tests/test_config.py ............
tests/test_datastructs.py ...
tests/test_delayed_vector.py .......
tests/test_dry_run.py ........................................................
tests/test_errors.py .....................................................
tests/test_filter_properties.py ........
tests/test_jobregistry.py ..............................
tests/test_processes.py .....................................
tests/test_save_result.py ........
tests/test_save_result_csv.py ....
tests/test_save_result_netcdf.py <xarray.Dataset>
Dimensions:        (t: 2, feature: 2)
Coordinates:
  * t              (t) datetime64[ns] 2019-10-15T08:15:45 2019-11-11T01:11:11
    lat            (feature) float64 ...
    lon            (feature) float64 ...
    feature_names  (feature) object ...
Dimensions without coordinates: feature
Data variables:
    red            (feature, t) float64 ...
    green          (feature, t) float64 ...
    blue           (feature, t) float64 ...
Attributes:
    Conventions:  CF-1.8
    source:       Aggregated timeseries generated by openEO GeoPySpark backend.
<xarray.Dataset>
Dimensions:        (t: 2, feature: 2)
Coordinates:
  * t              (t) datetime64[ns] 2019-10-15T08:15:45 2019-11-11T01:11:11
    lat            (feature) float64 ...
    lon            (feature) float64 ...
    feature_names  (feature) object ...
Dimensions without coordinates: feature
Data variables:
    red            (feature, t) float64 ...
    green          (feature, t) float64 ...
    blue           (feature, t) float64 ...
Attributes:
    Conventions:  CF-1.8
    source:       Aggregated timeseries generated by openEO GeoPySpark backend.
....<xarray.Dataset>
Dimensions:        (t: 2, feature: 3)
Coordinates:
  * t              (t) datetime64[ns] 2017-09-05 2017-09-06
    lat            (feature) float64 ...
    lon            (feature) float64 ...
    feature_names  (feature) object ...
Dimensions without coordinates: feature
Data variables:
    red            (feature, t) float64 ...
    green          (feature, t) float64 ...
    blue           (feature, t) float64 ...
Attributes:
    Conventions:  CF-1.8
    source:       Aggregated timeseries generated by openEO GeoPySpark backend.
.
tests/test_server.py .
tests/test_testing.py ......................FFF.....
tests/test_urlsigning.py ...
tests/test_utils.py ..........................
tests/test_vectorcube.py .............................
tests/test_view_helpers.py ..........
tests/test_views.py ....................................................................................................................................................................................................................................................
tests/test_views_execute.py .....................s...........................................................................None
..........E...EEE...............................udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'reduce_dimension', 'arguments': {'data': {'from_parameter': 'data'}, 'dimension': 'bands', 'reducer': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'reduce_dimension', 'arguments': {'data': {'from_parameter': 'data'}, 'dimension': 'bands', 'reducer': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}, 'udp_param': 'udp_param_123'}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'reduce_dimension', 'arguments': {'data': {'from_parameter': 'data'}, 'dimension': 'bands', 'reducer': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'from_parameter': 'context'}}, 'result': True}}}, 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'reduce_dimension', 'arguments': {'data': {'from_parameter': 'data'}, 'dimension': 'bands', 'reducer': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'from_parameter': 'context'}}, 'result': True}}}, 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}, 'udp_param': 'udp_param_123'}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply', 'arguments': {'data': {'from_parameter': 'data'}, 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply', 'arguments': {'data': {'from_parameter': 'data'}, 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}, 'udp_param': 'udp_param_123'}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply', 'arguments': {'data': {'from_parameter': 'data'}, 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'from_parameter': 'context'}}, 'result': True}}}, 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply', 'arguments': {'data': {'from_parameter': 'data'}, 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'from_parameter': 'context'}}, 'result': True}}}, 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}, 'udp_param': 'udp_param_123'}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply_dimension', 'arguments': {'data': {'from_parameter': 'data'}, 'dimension': 'bands', 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply_dimension', 'arguments': {'data': {'from_parameter': 'data'}, 'dimension': 'bands', 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}, 'udp_param': 'udp_param_123'}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply_dimension', 'arguments': {'data': {'from_parameter': 'data'}, 'dimension': 'bands', 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'from_parameter': 'context'}}, 'result': True}}}, 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply_dimension', 'arguments': {'data': {'from_parameter': 'data'}, 'dimension': 'bands', 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'from_parameter': 'context'}}, 'result': True}}}, 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}, 'udp_param': 'udp_param_123'}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply_neighborhood', 'arguments': {'data': {'from_parameter': 'data'}, 'size': [{'dimension': 'x', 'value': 128, 'unit': 'px'}, {'dimension': 'y', 'value': 128, 'unit': 'px'}], 'overlap': [{'dimension': 'x', 'value': 16, 'unit': 'px'}, {'dimension': 'y', 'value': 16, 'unit': 'px'}], 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply_neighborhood', 'arguments': {'data': {'from_parameter': 'data'}, 'size': [{'dimension': 'x', 'value': 128, 'unit': 'px'}, {'dimension': 'y', 'value': 128, 'unit': 'px'}], 'overlap': [{'dimension': 'x', 'value': 16, 'unit': 'px'}, {'dimension': 'y', 'value': 16, 'unit': 'px'}], 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}, 'udp_param': 'udp_param_123'}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply_neighborhood', 'arguments': {'data': {'from_parameter': 'data'}, 'size': [{'dimension': 'x', 'value': 128, 'unit': 'px'}, {'dimension': 'y', 'value': 128, 'unit': 'px'}], 'overlap': [{'dimension': 'x', 'value': 16, 'unit': 'px'}, {'dimension': 'y', 'value': 16, 'unit': 'px'}], 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'from_parameter': 'context'}}, 'result': True}}}, 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}}, 'result': True}}
.udp={'id': 'parameterized_udf', 'parameters': [{'name': 'data', 'schema': {'type': 'object', 'subtype': 'raster-cube'}}, {'name': 'udp_param', 'schema': {'type': 'string'}, 'optional': True, 'default': 'udp_param_default'}], 'returns': {'schema': {'type': 'object', 'subtype': 'raster-cube'}}, 'process_graph': {'parent1': {'process_id': 'apply_neighborhood', 'arguments': {'data': {'from_parameter': 'data'}, 'size': [{'dimension': 'x', 'value': 128, 'unit': 'px'}, {'dimension': 'y', 'value': 128, 'unit': 'px'}], 'overlap': [{'dimension': 'x', 'value': 16, 'unit': 'px'}, {'dimension': 'y', 'value': 16, 'unit': 'px'}], 'process': {'process_graph': {'runudf1': {'process_id': 'run_udf', 'arguments': {'data': {'from_parameter': 'data'}, 'udf': "print('hello world')", 'runtime': 'Python', 'context': {'from_parameter': 'context'}}, 'result': True}}}, 'context': {'udf_param': {'from_parameter': 'udp_param'}}}, 'result': True}}})
pg={'loadcollection1': {'process_id': 'load_collection', 'arguments': {'id': 'S2_FOOBAR'}}, 'parameterizedudf1': {'process_id': 'parameterized_udf', 'namespace': 'user', 'arguments': {'data': {'from_node': 'loadcollection1'}, 'udp_param': 'udp_param_123'}, 'result': True}}
...............................................................................[{'temporal_extent': ['1970-01-01', '2070-01-01'], 'spatial_extent': {}, 'global_extent': None, 'bands': None, 'properties': {'orbitDirection': {'process_graph': {'od': {'arguments': {'x': {'from_parameter': 'value'}, 'y': 'DESCENDING'}, 'process_id': 'eq', 'result': True}}}}, 'aggregate_spatial_geometries': None, 'sar_backscatter': None, 'process_types': set(), 'custom_mask': {}, 'data_mask': None, 'target_crs': None, 'target_resolution': None, 'resample_method': 'near', 'pixel_buffer': None}, {'temporal_extent': ['1970-01-01', '2070-01-01'], 'spatial_extent': {}, 'global_extent': None, 'bands': None, 'properties': {'orbitDirection': {'process_graph': {'od': {'arguments': {'x': {'from_parameter': 'value'}, 'y': 'ASCENDING'}, 'process_id': 'eq', 'result': True}}}}, 'aggregate_spatial_geometries': None, 'sar_backscatter': None, 'process_types': set(), 'custom_mask': {}, 'data_mask': None, 'target_crs': None, 'target_resolution': None, 'resample_method': 'near', 'pixel_buffer': None}]
.......................................................call('S2_FAPAR_CLOUDCOVER', load_params={'temporal_extent': ['1970-01-01', '2070-01-01'], 'spatial_extent': {}, 'global_extent': None, 'bands': None, 'properties': {}, 'aggregate_spatial_geometries': None, 'sar_backscatter': None, 'process_types': set(), 'custom_mask': {}, 'data_mask': None, 'target_crs': None, 'target_resolution': None, 'resample_method': 'near', 'pixel_buffer': None}, env=<openeo_driver.utils.EvalEnv object at 0x16e1d6910>)
.call('S2_FAPAR_CLOUDCOVER', load_params={'temporal_extent': ['1970-01-01', '2070-01-01'], 'spatial_extent': {}, 'global_extent': None, 'bands': None, 'properties': {}, 'aggregate_spatial_geometries': None, 'sar_backscatter': None, 'process_types': set(), 'custom_mask': {}, 'data_mask': None, 'target_crs': None, 'target_resolution': None, 'resample_method': 'near', 'pixel_buffer': None}, env=<openeo_driver.utils.EvalEnv object at 0x1567abb50>)
.
tests/test_views_validation.py .....
tests/users/test_auth.py ...................................................
tests/users/test_oidc.py .....
tests/users/test_user.py ...............
tests/util/test_caching.py ......
tests/util/test_date_math.py ......
tests/util/test_geometry.py ......F................................................
tests/util/test_http.py ..
tests/util/test_ioformats.py .......
tests/util/test_logging.py ......running: /opt/homebrew/Cellar/python@3.9/3.9.17_1/bin/python3.9 main.py
     in: /private/var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pytest-of-jaraco/pytest-0/test_setup_logging_capture_warnings0
{"message": "/private/var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pytest-of-jaraco/pytest-0/test_setup_logging_capture_warnings0/main.py:12: UserWarning: Attention please\n  warnings.warn(\"Attention please\")\n", "levelname": "WARNING", "name": "py.warnings", "created": 1689356625.047028, "filename": "warnings.py", "lineno": 109, "process": 36217, "req_id": "no-request", "user_id": null}
{"message": "That's all", "levelname": "INFO", "name": "__main__", "created": 1689356625.047173, "filename": "main.py", "lineno": 13, "process": 36217, "req_id": "no-request", "user_id": null}
.running: /opt/homebrew/Cellar/python@3.9/3.9.17_1/bin/python3.9 main.py
     in: /private/var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pytest-of-jaraco/pytest-0/test_setup_logging_capture_threading_exceptions0
{"message": "Exception ZeroDivisionError in thread Thread-1: ZeroDivisionError('division by zero')", "levelname": "ERROR", "name": "openeo_driver.util.logging", "created": 1689356625.5658429, "filename": "logging.py", "lineno": 184, "process": 36218, "exc_info": "Traceback (most recent call last):\n  File \"/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py\", line 980, in _bootstrap_inner\n    self.run()\n  File \"/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py\", line 917, in run\n    self._target(*self._args, **self._kwargs)\n  File \"/private/var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pytest-of-jaraco/pytest-0/test_setup_logging_capture_threading_exceptions0/main.py\", line 8, in work\n    return 4 / 0\nZeroDivisionError: division by zero", "req_id": "no-request", "user_id": null}
{"message": "That's all", "levelname": "INFO", "name": "__main__", "created": 1689356625.568146, "filename": "main.py", "lineno": 19, "process": 36218, "req_id": "no-request", "user_id": null}
.running: /opt/homebrew/Cellar/python@3.9/3.9.17_1/bin/python3.9 main.py
     in: /private/var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pytest-of-jaraco/pytest-0/test_setup_logging_capture_unhandled_exceptions0
{"message": "Unhandled ZeroDivisionError exception: ZeroDivisionError('division by zero')", "levelname": "ERROR", "name": "openeo_driver.util.logging", "created": 1689356626.074721, "filename": "logging.py", "lineno": 188, "process": 36219, "exc_info": "Traceback (most recent call last):\n  File \"/private/var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pytest-of-jaraco/pytest-0/test_setup_logging_capture_unhandled_exceptions0/main.py\", line 13, in <module>\n    main()\n  File \"/private/var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pytest-of-jaraco/pytest-0/test_setup_logging_capture_unhandled_exceptions0/main.py\", line 10, in main\n    x = 4 / 0\nZeroDivisionError: division by zero", "req_id": "no-request", "user_id": null}
.........
tests/util/test_utm.py .......................

================================================================================ ERRORS ================================================================================
___________________________________________________ ERROR at setup of TestVectorCubeLoading.test_geojson_url[1.0.0] ____________________________________________________

self = <tests.test_views_execute.TestVectorCubeLoading object at 0x156f1ad90>

    @pytest.fixture(scope="class")
    def test_data_file_server(self) -> str:
        """Ephemeral file server of the test data"""
>       with ephemeral_fileserver(path=TEST_DATA_ROOT) as fileserver_root:

tests/test_views_execute.py:1612: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/contextlib.py:119: in __enter__
    return next(self.gen)
openeo_driver/testing.py:589: in ephemeral_fileserver
    server_process.start()
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/process.py:121: in start
    self._popen = self._Popen(self)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:224: in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:284: in _Popen
    return Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:32: in __init__
    super().__init__(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_fork.py:19: in __init__
    self._launch(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:47: in _launch
    reduction.dump(process_obj, fp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

obj = <Process name='Process-4' parent=36181 initial>, file = <_io.BytesIO object at 0x16e8571d0>, protocol = None

    def dump(obj, file, protocol=None):
        '''Replacement for pickle.dump() using ForkingPickler.'''
>       ForkingPickler(file, protocol).dump(obj)
E       AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'

/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/reduction.py:60: AttributeError
_______________________________________ ERROR at setup of TestVectorCubeLoading.test_vector_url[1.0.0-geojson/mol.json-GeoJSON] ________________________________________

self = <tests.test_views_execute.TestVectorCubeLoading object at 0x156f1ad90>

    @pytest.fixture(scope="class")
    def test_data_file_server(self) -> str:
        """Ephemeral file server of the test data"""
>       with ephemeral_fileserver(path=TEST_DATA_ROOT) as fileserver_root:

tests/test_views_execute.py:1612: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/contextlib.py:119: in __enter__
    return next(self.gen)
openeo_driver/testing.py:589: in ephemeral_fileserver
    server_process.start()
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/process.py:121: in start
    self._popen = self._Popen(self)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:224: in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:284: in _Popen
    return Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:32: in __init__
    super().__init__(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_fork.py:19: in __init__
    self._launch(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:47: in _launch
    reduction.dump(process_obj, fp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

obj = <Process name='Process-4' parent=36181 initial>, file = <_io.BytesIO object at 0x16e8571d0>, protocol = None

    def dump(obj, file, protocol=None):
        '''Replacement for pickle.dump() using ForkingPickler.'''
>       ForkingPickler(file, protocol).dump(obj)
E       AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'

/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/reduction.py:60: AttributeError
__________________________________________ ERROR at setup of TestVectorCubeLoading.test_vector_url[1.0.0-gpkg/mol.gpkg-GPKG] ___________________________________________

self = <tests.test_views_execute.TestVectorCubeLoading object at 0x156f1ad90>

    @pytest.fixture(scope="class")
    def test_data_file_server(self) -> str:
        """Ephemeral file server of the test data"""
>       with ephemeral_fileserver(path=TEST_DATA_ROOT) as fileserver_root:

tests/test_views_execute.py:1612: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/contextlib.py:119: in __enter__
    return next(self.gen)
openeo_driver/testing.py:589: in ephemeral_fileserver
    server_process.start()
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/process.py:121: in start
    self._popen = self._Popen(self)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:224: in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:284: in _Popen
    return Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:32: in __init__
    super().__init__(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_fork.py:19: in __init__
    self._launch(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:47: in _launch
    reduction.dump(process_obj, fp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

obj = <Process name='Process-4' parent=36181 initial>, file = <_io.BytesIO object at 0x16e8571d0>, protocol = None

    def dump(obj, file, protocol=None):
        '''Replacement for pickle.dump() using ForkingPickler.'''
>       ForkingPickler(file, protocol).dump(obj)
E       AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'

/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/reduction.py:60: AttributeError
__________________________________________________ ERROR at setup of TestVectorCubeLoading.test_shapefile_url[1.0.0] ___________________________________________________

self = <tests.test_views_execute.TestVectorCubeLoading object at 0x156f1ad90>

    @pytest.fixture(scope="class")
    def test_data_file_server(self) -> str:
        """Ephemeral file server of the test data"""
>       with ephemeral_fileserver(path=TEST_DATA_ROOT) as fileserver_root:

tests/test_views_execute.py:1612: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/contextlib.py:119: in __enter__
    return next(self.gen)
openeo_driver/testing.py:589: in ephemeral_fileserver
    server_process.start()
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/process.py:121: in start
    self._popen = self._Popen(self)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:224: in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:284: in _Popen
    return Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:32: in __init__
    super().__init__(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_fork.py:19: in __init__
    self._launch(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:47: in _launch
    reduction.dump(process_obj, fp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

obj = <Process name='Process-4' parent=36181 initial>, file = <_io.BytesIO object at 0x16e8571d0>, protocol = None

    def dump(obj, file, protocol=None):
        '''Replacement for pickle.dump() using ForkingPickler.'''
>       ForkingPickler(file, protocol).dump(obj)
E       AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'

/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/reduction.py:60: AttributeError
=============================================================================== FAILURES ===============================================================================
______________________________________________________________________ test_ephemeral_fileserver _______________________________________________________________________

tmp_path = PosixPath('/private/var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pytest-of-jaraco/pytest-0/test_ephemeral_fileserver0')

    def test_ephemeral_fileserver(tmp_path):
        (tmp_path / "hello.txt").write_text("Hello world!")
    
>       with ephemeral_fileserver(path=tmp_path) as root_url:

tests/test_testing.py:187: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/contextlib.py:119: in __enter__
    return next(self.gen)
openeo_driver/testing.py:589: in ephemeral_fileserver
    server_process.start()
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/process.py:121: in start
    self._popen = self._Popen(self)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:224: in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:284: in _Popen
    return Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:32: in __init__
    super().__init__(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_fork.py:19: in __init__
    self._launch(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:47: in _launch
    reduction.dump(process_obj, fp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

obj = <Process name='Process-1' parent=36181 initial>, file = <_io.BytesIO object at 0x156e435e0>, protocol = None

    def dump(obj, file, protocol=None):
        '''Replacement for pickle.dump() using ForkingPickler.'''
>       ForkingPickler(file, protocol).dump(obj)
E       AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'

/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/reduction.py:60: AttributeError
_________________________________________________________________ test_ephemeral_fileserver_subprocess _________________________________________________________________

tmp_path = PosixPath('/private/var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pytest-of-jaraco/pytest-0/test_ephemeral_fileserver_subp0')

    def test_ephemeral_fileserver_subprocess(tmp_path):
        (tmp_path / "hello.txt").write_text("Hello world!")
        (tmp_path / "get.py").write_text(
            textwrap.dedent(
                """
                import sys
                import requests
                resp = requests.get(sys.argv[1])
                print(f"{resp.status_code} {resp.text!r}")
              """
            )
        )
>       with ephemeral_fileserver(path=tmp_path) as root_url:

tests/test_testing.py:207: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/contextlib.py:119: in __enter__
    return next(self.gen)
openeo_driver/testing.py:589: in ephemeral_fileserver
    server_process.start()
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/process.py:121: in start
    self._popen = self._Popen(self)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:224: in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:284: in _Popen
    return Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:32: in __init__
    super().__init__(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_fork.py:19: in __init__
    self._launch(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:47: in _launch
    reduction.dump(process_obj, fp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

obj = <Process name='Process-2' parent=36181 initial>, file = <_io.BytesIO object at 0x157b0e4f0>, protocol = None

    def dump(obj, file, protocol=None):
        '''Replacement for pickle.dump() using ForkingPickler.'''
>       ForkingPickler(file, protocol).dump(obj)
E       AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'

/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/reduction.py:60: AttributeError
__________________________________________________________________ test_ephemeral_fileserver_failure ___________________________________________________________________

tmp_path = PosixPath('/private/var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pytest-of-jaraco/pytest-0/test_ephemeral_fileserver_fail0')
caplog = <_pytest.logging.LogCaptureFixture object at 0x157c9ad00>

    def test_ephemeral_fileserver_failure(tmp_path, caplog):
        caplog.set_level(logging.INFO)
        (tmp_path / "hello.txt").write_text("Hello world!")
    
        with pytest.raises(RuntimeError):
>           with ephemeral_fileserver(path=tmp_path) as root_url:

tests/test_testing.py:222: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/contextlib.py:119: in __enter__
    return next(self.gen)
openeo_driver/testing.py:589: in ephemeral_fileserver
    server_process.start()
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/process.py:121: in start
    self._popen = self._Popen(self)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:224: in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py:284: in _Popen
    return Popen(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:32: in __init__
    super().__init__(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_fork.py:19: in __init__
    self._launch(process_obj)
/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py:47: in _launch
    reduction.dump(process_obj, fp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

obj = <Process name='Process-3' parent=36181 initial>, file = <_io.BytesIO object at 0x157aae7c0>, protocol = None

    def dump(obj, file, protocol=None):
        '''Replacement for pickle.dump() using ForkingPickler.'''
>       ForkingPickler(file, protocol).dump(obj)
E       AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'

/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/reduction.py:60: AttributeError
_________________________________________________________________ test_spatial_extent_union_mixed_crs __________________________________________________________________

    def test_spatial_extent_union_mixed_crs():
        bbox1 = {
            "west": 640860.0,
            "south": 5676170.0,
            "east": 642140.0,
            "north": 5677450.0,
            "crs": "EPSG:32631",
        }
        bbox2 = {
            "west": 5.017,
            "south": 51.21,
            "east": 5.035,
            "north": 51.23,
            "crs": "EPSG:4326",
        }
>       assert spatial_extent_union(bbox1, bbox2) == {
            "west": 640824.9450876965,
            "south": 5675111.354480841,
            "north": 5677450.0,
            "east": 642143.1739784481,
            "crs": "EPSG:32631",
        }
E       AssertionError: assert {'crs': 'EPSG...54480842, ...} == {'crs': 'EPSG...54480841, ...}
E         Omitting 4 identical items, use -vv to show
E         Differing items:
E         {'south': 5675111.354480842} != {'south': 5675111.354480841}
E         Use -v to get more diff

tests/util/test_geometry.py:232: AssertionError
=========================================================================== warnings summary ===========================================================================
../../../../var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pip-run-43qw0y8n/gunicorn/util.py:25
  /var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pip-run-43qw0y8n/gunicorn/util.py:25: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
    import pkg_resources

openeo_driver/util/geometry.py:391
  /Users/jaraco/draft/openeo-python-driver/openeo_driver/util/geometry.py:391: DeprecationWarning: invalid escape sequence \d
    if not re.match("^epsg:\d+$", crs, flags=re.IGNORECASE):

tests/util/test_http.py:22
  /Users/jaraco/draft/openeo-python-driver/tests/util/test_http.py:22: DeprecationWarning: invalid escape sequence \(
    Matches("Incremented Retry.*Retry\(total=1"),

tests/util/test_http.py:25
  /Users/jaraco/draft/openeo-python-driver/tests/util/test_http.py:25: DeprecationWarning: invalid escape sequence \(
    Matches("Incremented Retry.*Retry\(total=0"),

tests/test_ProcessGraphDeserializer.py: 1 warning
tests/test_dry_run.py: 16 warnings
tests/test_views_execute.py: 2 warnings
  /var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pip-run-43qw0y8n/openeo/metadata.py:255: UserWarning: No cube:dimensions metadata
    complain("No cube:dimensions metadata")

tests/test_delayed_vector.py: 3 warnings
tests/test_views_execute.py: 14 warnings
  /var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pip-run-43qw0y8n/pyproj/crs/crs.py:141: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
    in_crs_string = _prepare_from_proj_string(in_crs_string)

tests/test_dry_run.py::test_aggregate_spatial_read_vector
tests/test_dry_run.py::test_aggregate_spatial_read_vector
tests/test_dry_run.py::test_CropSAR_aggregate_spatial_constraint
tests/test_views_execute.py::test_read_vector[1.0.0]
tests/test_views_execute.py::test_read_vector_no_load_collection_spatial_extent[1.0.0]
tests/test_views_execute.py::test_load_collection_without_spatial_extent_incorporates_read_vector_extent[1.0.0]
tests/test_views_execute.py::test_read_vector_from_feature_collection[1.0.0]
  /Users/jaraco/draft/openeo-python-driver/openeo_driver/save_result.py:216: UserWarning: AggregatePolygonResult: GeometryCollection or DriverVectorCube expected but got <class 'openeo_driver.delayed_vector.DelayedVector'>
    warnings.warn("AggregatePolygonResult: GeometryCollection or DriverVectorCube expected but got {t}".format(t=type(regions)))

tests/test_dry_run.py::test_evaluate_predefined_property
  /Users/jaraco/draft/openeo-python-driver/openeo_driver/ProcessGraphDeserializer.py:329: UserWarning: Blindly assuming 0.4.0
    warnings.warn("Blindly assuming 0.4.0")

tests/test_save_result.py::test_aggregate_polygon_result_CSV
tests/test_save_result_netcdf.py::test_aggregate_polygon_result_CSV
  /Users/jaraco/draft/openeo-python-driver/openeo_driver/save_result.py:518: ShapelyDeprecationWarning: __len__ for multi-part geometries is deprecated and will be removed in Shapely 2.0. Check the length of the `geoms` property instead to get the  number of parts of a multi-part geometry.
    amount_of_regions = len(self._regions)

tests/test_save_result_netcdf.py::test_aggregate_polygon_result_basic
tests/test_save_result_netcdf.py::test_aggregate_polygon_result_nan_values
tests/test_save_result_netcdf.py::test_aggregate_polygon_result_empty_ts_data
tests/test_save_result_netcdf.py::test_aggregate_polygon_result_inconsistent_bands
tests/test_save_result_netcdf.py::test_aggregate_polygon_result_CSV
  /Users/jaraco/draft/openeo-python-driver/openeo_driver/save_result.py:329: ShapelyDeprecationWarning: Iteration over multi-part geometries is deprecated and will be removed in Shapely 2.0. Use the `geoms` property to access the constituent parts of a multi-part geometry.
    points = [r.representative_point() for r in self._regions]

tests/test_save_result_netcdf.py::test_aggregate_polygon_result_basic
tests/test_save_result_netcdf.py::test_aggregate_polygon_result_nan_values
tests/test_save_result_netcdf.py::test_aggregate_polygon_result_empty_ts_data
tests/test_save_result_netcdf.py::test_aggregate_polygon_result_inconsistent_bands
tests/test_save_result_netcdf.py::test_aggregate_polygon_result_CSV
  /Users/jaraco/draft/openeo-python-driver/openeo_driver/save_result.py:326: ShapelyDeprecationWarning: __len__ for multi-part geometries is deprecated and will be removed in Shapely 2.0. Check the length of the `geoms` property instead to get the  number of parts of a multi-part geometry.
    return ['feature_%d' % i for i in range(len(geometries))]

tests/test_save_result_netcdf.py::test_aggregate_polygon_result_basic
  <frozen importlib._bootstrap>:228: RuntimeWarning: numpy.ndarray size changed, may indicate binary incompatibility. Expected 16 from C header, got 96 from PyObject

tests/test_save_result_netcdf.py::test_aggregate_polygon_result_empty_ts_data
  /Users/jaraco/draft/openeo-python-driver/tests/test_save_result_netcdf.py:90: DeprecationWarning: parsing timezone aware datetimes is deprecated; this will raise an error in the future
    np.datetime64("2019-01-01T12:34:56Z"),

tests/test_save_result_netcdf.py::test_aggregate_polygon_result_empty_ts_data
  /Users/jaraco/draft/openeo-python-driver/tests/test_save_result_netcdf.py:91: DeprecationWarning: parsing timezone aware datetimes is deprecated; this will raise an error in the future
    np.datetime64("2019-02-01T12:34:56Z"),

tests/test_save_result_netcdf.py::test_aggregate_polygon_result_empty_ts_data
  /Users/jaraco/draft/openeo-python-driver/tests/test_save_result_netcdf.py:92: DeprecationWarning: parsing timezone aware datetimes is deprecated; this will raise an error in the future
    np.datetime64("2019-04-01T12:34:56Z"),

tests/test_save_result_netcdf.py::test_aggregate_polygon_result_empty_ts_data
  /Users/jaraco/draft/openeo-python-driver/tests/test_save_result_netcdf.py:93: DeprecationWarning: parsing timezone aware datetimes is deprecated; this will raise an error in the future
    np.datetime64("2019-05-01T12:34:56Z"),

tests/test_testing.py::TestUrllibMocker::test_get_not_found
  /var/folders/sx/n5gkrgfx6zd91ymxr2sr9wvw00n8zm/T/pip-run-43qw0y8n/_pytest/unraisableexception.py:78: PytestUnraisableExceptionWarning: Exception ignored in: <function _TemporaryFileCloser.__del__ at 0x1049d6e50>
  
  Traceback (most recent call last):
    File "/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tempfile.py", line 445, in __del__
      self.close()
    File "/opt/homebrew/Cellar/python@3.9/3.9.17_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tempfile.py", line 438, in close
      self.file.close()
  AttributeError: 'Response' object has no attribute 'close'
  
    warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))

tests/test_vectorcube.py::TestDriverVectorCube::test_to_multipolygon
  /Users/jaraco/draft/openeo-python-driver/tests/test_vectorcube.py:33: ShapelyDeprecationWarning: __len__ for multi-part geometries is deprecated and will be removed in Shapely 2.0. Check the length of the `geoms` property instead to get the  number of parts of a multi-part geometry.
    assert len(mp) == 2

tests/test_views.py: 4 warnings
tests/util/test_logging.py: 6 warnings
  /Users/jaraco/draft/openeo-python-driver/openeo_driver/util/logging.py:272: DeprecationWarning: '_app_ctx_stack' is deprecated and will be removed in Flask 2.3.
    if flask._app_ctx_stack.top:

tests/test_views.py: 4 warnings
tests/util/test_logging.py: 6 warnings
  /Users/jaraco/draft/openeo-python-driver/openeo_driver/util/logging.py:272: DeprecationWarning: '_app_ctx_stack' is deprecated and will be removed in Flask 2.3. Use 'g' to store data, or 'app_ctx' to access the current context.
    if flask._app_ctx_stack.top:

tests/test_views_execute.py::test_read_vector[1.0.0]
tests/test_views_execute.py::test_read_vector_no_load_collection_spatial_extent[1.0.0]
tests/test_views_execute.py::test_load_collection_without_spatial_extent_incorporates_read_vector_extent[1.0.0]
tests/test_views_execute.py::test_read_vector_from_feature_collection[1.0.0]
  /Users/jaraco/draft/openeo-python-driver/openeo_driver/save_result.py:216: UserWarning: AggregatePolygonResult: GeometryCollection or DriverVectorCube expected but got <class 'list'>
    warnings.warn("AggregatePolygonResult: GeometryCollection or DriverVectorCube expected but got {t}".format(t=type(regions)))

tests/util/test_geometry.py::test_geojson_to_multipolygon
  /Users/jaraco/draft/openeo-python-driver/tests/util/test_geometry.py:89: ShapelyDeprecationWarning: __len__ for multi-part geometries is deprecated and will be removed in Shapely 2.0. Check the length of the `geoms` property instead to get the  number of parts of a multi-part geometry.
    assert len(a) == len(b)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======================================================================= short test summary info ========================================================================
FAILED tests/test_testing.py::test_ephemeral_fileserver - AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'
FAILED tests/test_testing.py::test_ephemeral_fileserver_subprocess - AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'
FAILED tests/test_testing.py::test_ephemeral_fileserver_failure - AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'
FAILED tests/util/test_geometry.py::test_spatial_extent_union_mixed_crs - AssertionError: assert {'crs': 'EPSG...54480842, ...} == {'crs': 'EPSG...54480841, ...}
ERROR tests/test_views_execute.py::TestVectorCubeLoading::test_geojson_url[1.0.0] - AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'
ERROR tests/test_views_execute.py::TestVectorCubeLoading::test_vector_url[1.0.0-geojson/mol.json-GeoJSON] - AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'
ERROR tests/test_views_execute.py::TestVectorCubeLoading::test_vector_url[1.0.0-gpkg/mol.gpkg-GPKG] - AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'
ERROR tests/test_views_execute.py::TestVectorCubeLoading::test_shapefile_url[1.0.0] - AttributeError: Can't pickle local object 'ephemeral_fileserver.<locals>.run'
================================================== 4 failed, 1118 passed, 1 skipped, 92 warnings, 4 errors in 34.31s ===================================================

And I've confirmed I get the same set of errors/failures on master.

soxofaan added a commit that referenced this pull request Jul 17, 2023
@soxofaan
Copy link
Member

Great, thanks!

I cherry-picked the real fix and skipped the "fade to black" as we actually use darker instead of black to only fixup formatting of changed lines instead of whole files.

I also added a small test to cover actually reading that 'default.py' file.

@soxofaan soxofaan closed this Jul 17, 2023
@soxofaan
Copy link
Member

about those errors you see in the test run:
I see "homebrew" so I assume you're running on macos, while we only target linux for now (in testing and deployment). I guess there is some kind dependency side effect going on there.

thanks anyway for contributing!

soxofaan added a commit to Open-EO/openeo-geopyspark-driver that referenced this pull request Jul 17, 2023
@jaraco jaraco deleted the bugfix/206-shed-importlib-resources-legacy branch July 17, 2023 14:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

deprecated importlib_resources.path
2 participants