internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: great-expectations/great_expectations

Issue:
Not able to set persist to False using Spark Execution Engine 
Hey Guys, I was trying to migrate GX from 0.16.5 and am not being able to, cause apparently since GX 0.16.12 supposedly there was a fix for the persist parameter to work. The thing is that I wanted it to be False, but it seems the parameter is not taking effect.
Anyone facing similar problems?
I was following this guide [How to connect to in-memory data in a Spark dataframe | Great Expectations](https://docs.greatexpectations.io/docs/0.15.50/guides/connecting_to_your_data/in_memory/spark/), which seems to have been removed. Also tried with fluent approach and still failing.
Is the property persist being considered/passed? Shouldn’t it be one of the parameters in add_or_update_spark ?

More information: https://discourse.greatexpectations.io/t/not-able-to-set-persist-to-false-using-spark-execution-engine/1320?u=jose.correia


Discussion:

Resolving patch:
diff --git a/great_expectations/datasource/fluent/spark_datasource.py b/great_expectations/datasource/fluent/spark_datasource.py
--- a/great_expectations/datasource/fluent/spark_datasource.py
+++ b/great_expectations/datasource/fluent/spark_datasource.py
@@ -63,6 +63,7 @@ class _SparkDatasource(Datasource):
     # instance attributes
     spark_config: Union[SparkConfig, None] = None
     force_reuse_spark_context: bool = True
+    persist: bool = True
 
     @staticmethod
     def _update_asset_forward_refs(asset_type: Type[_DataAssetT]) -> None:


Test patch:
diff --git a/tests/datasource/fluent/test_spark_datasource.py b/tests/datasource/fluent/test_spark_datasource.py
--- a/tests/datasource/fluent/test_spark_datasource.py
+++ b/tests/datasource/fluent/test_spark_datasource.py
@@ -112,8 +112,10 @@ def test_spark_data_asset_batch_metadata(
 
 
 @pytest.mark.spark
+@pytest.mark.parametrize("persist", [True, False])
 def test_spark_config_passed_to_execution_engine(
     empty_data_context: AbstractDataContext,
+    persist,
     spark_session,
 ):
     spark_config: SparkConfig | None = {
@@ -128,6 +130,7 @@ def test_spark_config_passed_to_execution_engine(
         name="my_spark_datasource",
         spark_config=spark_config,
         force_reuse_spark_context=False,
+        persist=persist,
     )
     spark_config = json.loads(json.dumps(spark_config), parse_int=str, parse_float=str)
     assert is_candidate_subset_of_target(
Repository: great-expectations/great_expectations

Issue:
dynamic_pandas uses __file__ for its logger
**Describe the bug**
dynamic_pandas uses `__file__` for its logger, rather than `__name__` like the rest of the library.
This means users cannot adjust the entire libraries's logging using `logging.getLogger("great_expectations")`

**To Reproduce**
N/A

**Expected behavior**
dynamic_pandas uses `__name__`


Discussion:

Resolving patch:
diff --git a/great_expectations/datasource/fluent/dynamic_pandas.py b/great_expectations/datasource/fluent/dynamic_pandas.py
--- a/great_expectations/datasource/fluent/dynamic_pandas.py
+++ b/great_expectations/datasource/fluent/dynamic_pandas.py
@@ -75,7 +75,7 @@ class _NoDefault(enum.Enum):  # type: ignore[no-redef]
 # https://github.com/pandas-dev/pandas/blob/965ceca9fd796940050d6fc817707bba1c4f9bff/pandas/_typing.py#LL373C1-L373C52
 DtypeBackend = Literal["pyarrow", "numpy_nullable"]
 
-logger = logging.getLogger(__file__)
+logger = logging.getLogger(__name__)
 
 PANDAS_VERSION: float = float(
     f"{Version(pd.__version__).major}.{Version(pd.__version__).minor}"


Test patch:
Repository: great-expectations/great_expectations

Issue:
Can't use expect_queried_custom_query_to_return_num_rows more than once per validator
It's not possible to add multiple expectations to a validator using the `expect_queried_custom_query_to_return_num_rows` expectation. This will fail with the exception:
`ValueError: More than one matching expectation was found. Please be more specific with your search criteria`

This is due to how the `domain_kwargs` are set up for this operator. In my GX fork I have added the following lines in `great_expectations/core/expectation_configuration.py`

```
        "expect_queried_custom_query_to_return_num_rows": {
            "domain_kwargs": ("template_dict","row_condition", "condition_parser"),
            "success_kwargs": ("value",),
            "default_kwarg_values": {
                "result_format": "BASIC",
                "include_config": True,
                "catch_exceptions": False,
            },
        },
```

See my commit here:
https://github.com/great-expectations/great_expectations/commit/3bd0e20f83f6dcfc3d59e14e6764352c9bd4aa6f

Since this expectation is entirely defined by the custom query, which is part of the `template_dict`, the `domain_kwargs` need to contain `template_dict`.


Ubuntu 22.04
GX 0.18.2
BigQuery
GCP



Discussion:

Resolving patch:
diff --git a/contrib/experimental/great_expectations_experimental/expectations/expect_queried_custom_query_to_return_num_rows.py b/contrib/experimental/great_expectations_experimental/expectations/expect_queried_custom_query_to_return_num_rows.py
--- a/contrib/experimental/great_expectations_experimental/expectations/expect_queried_custom_query_to_return_num_rows.py
+++ b/contrib/experimental/great_expectations_experimental/expectations/expect_queried_custom_query_to_return_num_rows.py
@@ -32,7 +32,13 @@ class ExpectQueriedCustomQueryToReturnNumRows(QueryExpectation):
         "query",
     )
 
-    domain_keys = ("user_query", "batch_id", "row_condition", "condition_parser")
+    domain_keys = (
+        "template_dict",
+        "user_query",
+        "batch_id",
+        "row_condition",
+        "condition_parser",
+    )
 
     default_kwarg_values = {
         "result_format": "BASIC",


Test patch:
Repository: ResonantGeoData/ResonantGeoData

Issue:
Add an endpoint to get status of workers
It would be useful to know if we have any workers associated with the system, and, if so, if they are busy.

Specifically, this could probably be something like is done in girder_worker (see https://github.com/girder/girder_worker/blob/master/girder_worker/girder_plugin/api/worker.py#L40-L55).  For this purpose, the celery app can be reached via `from rgd import celery_app`.

Ideally, this let's us determine the following conditions:
- The broker is unavailable 
- There are no workers
- The number of idle workers
- The number of busy workers (and, ideally, what they are busy doing)

In the future, we may have multiple worker pools (for instance, for GPU and non-GPU tasks), so this will probably change exactly what gets reported in the future.


Discussion:

Resolving patch:
diff --git a/core/urls.py b/core/urls.py
--- a/core/urls.py
+++ b/core/urls.py
@@ -1,7 +1,11 @@
+from django.contrib import admin
 from django.urls import path
+from djproxy.urls import generate_routes
 
 from . import views
 
+
+admin.site.index_template = 'admin/add_flower.html'
 urlpatterns = [
     path('', views.index, name='index'),
     path('algorithms/', views.algorithms, name='algorithms'),
@@ -22,6 +26,6 @@
     path('tasks/', views.tasks, name='tasks'),
     path('task/<int:pk>-<str:name>/', views.TaskDetailView.as_view(), name='task-detail'),
     path('api/download/<model>/<int:id>/<field>', views.download_file, name='download-file'),
-]
+] + generate_routes({'flower-proxy': {'base_url': 'http://flower:5555/', 'prefix': '/flower/'}})
 
 handler500 = views.handler500
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -17,6 +17,7 @@
         'django-extensions',
         'django-storages',
         'djangorestframework',
+        'djproxy',
         'docker',
         'drf-yasg',
         'gputil',


Test patch:
Repository: ResonantGeoData/ResonantGeoData

Issue:
use base name of uploaded files by default in GeoData app
if no name is specified for a raster file or geometry archive, use the base name of the file for the name.

from https://github.com/ResonantGeoData/ResonantGeoData/pull/56#issuecomment-649766048


Discussion:
@manthey, should we implement this by overriding the `save()` method on the model or in a view form?
I think it would be better in the `save` method.

Resolving patch:
diff --git a/geodata/migrations/0003_geometryarchive_name.py b/geodata/migrations/0003_geometryarchive_name.py
new file mode 100644
--- /dev/null
+++ b/geodata/migrations/0003_geometryarchive_name.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.7 on 2020-06-30 21:30
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('geodata', '0002_auto_20200626_1359'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='geometryarchive',
+            name='name',
+            field=models.CharField(blank=True, max_length=100, null=True),
+        ),
+    ]
diff --git a/geodata/models/geometry/base.py b/geodata/models/geometry/base.py
--- a/geodata/models/geometry/base.py
+++ b/geodata/models/geometry/base.py
@@ -37,6 +37,7 @@ class GeometryArchive(ModifiableEntry, PostSaveEventMixin):
     """
 
     task_func = tasks.validate_geometry_archive
+    name = models.CharField(max_length=100, blank=True, null=True)
     archive_file = S3FileField(
         upload_to='files/geometry_files',
         validators=[validate_archive],
@@ -46,6 +47,11 @@ class GeometryArchive(ModifiableEntry, PostSaveEventMixin):
     geometry_entry = models.OneToOneField(GeometryEntry, null=True, on_delete=models.DO_NOTHING)
     failure_reason = models.TextField(null=True, blank=True)
 
+    def save(self, *args, **kwargs):
+        if not self.name:
+            self.name = self.archive_file.name
+        super(GeometryArchive, self).save(*args, **kwargs)
+
 
 @receiver(post_save, sender=GeometryArchive)
 def _post_save_algorithm(sender, instance, *args, **kwargs):
diff --git a/geodata/models/raster/base.py b/geodata/models/raster/base.py
--- a/geodata/models/raster/base.py
+++ b/geodata/models/raster/base.py
@@ -30,6 +30,11 @@ class RasterFile(ModifiableEntry, PostSaveEventMixin):
     raster_file = S3FileField(upload_to='files/rasters')
     failure_reason = models.TextField(null=True, blank=True)
 
+    def save(self, *args, **kwargs):
+        if not self.name:
+            self.name = self.raster_file.name
+        super(RasterFile, self).save(*args, **kwargs)
+
 
 class RasterEntry(SpatialEntry):
     """This class is a container for the metadata of a raster.


Test patch:
Repository: ResonantGeoData/ResonantGeoData

Issue:
_convert_to_cog function doesn't generate COG
The current _convert_to_cog function (https://github.com/ResonantGeoData/ResonantGeoData/blob/master/rgd/geodata/models/imagery/subsample.py#L32-L51) doesn't output a COG; it just outputs a tiled tiff file.  GDAL has two separate format writers; one for regular TIFF and one for COG.  Without the '-of COG' option, the regular tiff writer is invoked.  The options available to the two writers differ as well: for COG you can specify a predictor with a string value, for regular tiff you must specify a numeric predictor value.

Using lzw compression, I'd recommend the following options: `['-co', 'COMPRESS=LZW', '-co', 'PREDICTOR=YES', '-of', 'COG']`.  The default block (tile) size in the COG writer is 512 pixels; some tile servers or consumers seem to prefer 256; if so, add `-co BLOCKSIZE=256`.

You can use tiffdump to see that COG files have multiple directories at different resolutions while non-COG files have a single directory.



Discussion:
Ah, thanks for catching this, @manthey! I had been using a utility in GDAL to "verify" that a TIFF is in COG format and blindly trusted that: https://github.com/OSGeo/gdal/blob/master/gdal/swig/python/samples/validate_cloud_optimized_geotiff.py

I will update `_convert_to_cog` with these options and use tiffdump to validate things locally.

Resolving patch:
diff --git a/rgd/geodata/models/imagery/subsample.py b/rgd/geodata/models/imagery/subsample.py
--- a/rgd/geodata/models/imagery/subsample.py
+++ b/rgd/geodata/models/imagery/subsample.py
@@ -35,7 +35,11 @@ def convert_to_cog(cog_id):
         '-co',
         'COMPRESS=LZW',
         '-co',
-        'TILED=YES',
+        'PREDICTOR=YES',
+        '-of',
+        'COG',
+        '-co',
+        'BLOCKSIZE=256',
     ]
     cog = ConvertedImageFile.objects.get(id=cog_id)
     cog.converted_file = ArbitraryFile()


Test patch:
Repository: ResonantGeoData/ResonantGeoData

Issue:
Add cloud coverage to RasterMetaEntry
Add an optional float field to `RasterMetaEntry` to track cloud coverage and expose that in the search filter

We can auto-populate this when ingesting data directly from existing catalogs


Discussion:

Resolving patch:
diff --git a/rgd/geodata/filters.py b/rgd/geodata/filters.py
--- a/rgd/geodata/filters.py
+++ b/rgd/geodata/filters.py
@@ -103,6 +103,12 @@ class SpatialEntryFilter(filters.FilterSet):
         label='Resolution',
         method='filter_resolution',
     )
+    cloud_cover = filters.RangeFilter(
+        field_name='rastermetaentry__cloud_cover',
+        fields=(forms.FloatField(), forms.FloatField()),
+        help_text='The cloud coverage of the raster.',
+        label='Cloud cover',
+    )
     frame_rate = filters.RangeFilter(
         field_name='fmventry__fmv_file',
         fields=(forms.IntegerField(), forms.IntegerField()),
@@ -269,4 +275,5 @@ class Meta:
             'num_bands',
             'resolution',
             'frame_rate',
+            'cloud_cover',
         ]
diff --git a/rgd/geodata/migrations/0007_rastermetaentry_cloud_cover.py b/rgd/geodata/migrations/0007_rastermetaentry_cloud_cover.py
new file mode 100644
--- /dev/null
+++ b/rgd/geodata/migrations/0007_rastermetaentry_cloud_cover.py
@@ -0,0 +1,25 @@
+# Generated by Django 3.2a1 on 2021-03-12 17:46
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('geodata', '0006_auto_20210309_0607'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='rastermetaentry',
+            name='cloud_cover',
+            field=models.FloatField(
+                null=True,
+                validators=[
+                    django.core.validators.MinValueValidator(0),
+                    django.core.validators.MaxValueValidator(100),
+                ],
+            ),
+        ),
+    ]
diff --git a/rgd/geodata/models/imagery/base.py b/rgd/geodata/models/imagery/base.py
--- a/rgd/geodata/models/imagery/base.py
+++ b/rgd/geodata/models/imagery/base.py
@@ -1,6 +1,7 @@
 """Base classes for raster dataset entries."""
 from django.contrib.gis.db import models
 from django.contrib.postgres import fields
+from django.core.validators import MaxValueValidator, MinValueValidator
 from django.utils.translation import gettext_lazy as _
 
 from ... import tasks
@@ -136,6 +137,9 @@ class RasterMetaEntry(ModifiableEntry, SpatialEntry):
     resolution = fields.ArrayField(models.FloatField(), size=2)  # AKA scale
     # TODO: skew/transform
     transform = fields.ArrayField(models.FloatField(), size=6)
+    cloud_cover = models.FloatField(
+        null=True, validators=[MinValueValidator(0), MaxValueValidator(100)]
+    )
 
     @property
     def name(self):


Test patch:
Repository: ResonantGeoData/ResonantGeoData

Issue:
expose STAC post endpoint in Python client
for https://github.com/ResonantGeoData/issue-dashboard/issues/11


Discussion:

Resolving patch:
diff --git a/rgdc/rgdc/rgdc.py b/rgdc/rgdc/rgdc.py
--- a/rgdc/rgdc/rgdc.py
+++ b/rgdc/rgdc/rgdc.py
@@ -240,6 +240,13 @@ def search(
         )
         return list(limit_offset_pager(self.session, 'geosearch', params=params))
 
+    def create_raster_stac(self, raster: Dict) -> Dict:
+        """Create a raster entry using STAC format."""
+        r = self.session.post('geodata/imagery/raster/stac', json=raster)
+        r.raise_for_status()
+
+        return r.json()
+
     def search_raster_stac(
         self,
         query: Optional[Union[Dict, str]] = None,


Test patch:
Repository: ResonantGeoData/ResonantGeoData

Issue:
Improve VTK.js 3D Viewer
After #406 is merged, we should improve the 3D viewer. Basically, use [this example](https://kitware.github.io/vtk-js/examples/GeometryViewer.html)

Things we should have:

- [x] drop-down menu to change the scalar array
- [x] Scalar bar
- [x] Representation style
- [x] Better background color choice (likely black)
- [x] Point size slider
- [x] Support RGB colors


Discussion:

Resolving patch:
diff --git a/example_project/rgd_example/settings.py b/example_project/rgd_example/settings.py
--- a/example_project/rgd_example/settings.py
+++ b/example_project/rgd_example/settings.py
@@ -19,3 +19,5 @@
 REFETCH_SCHEMA_ON_LOGOUT = True
 OPERATIONS_SORTER = 'alpha'
 DEEP_LINKING = True
+
+STATIC_URL = '/static/'


Test patch:
Repository: ResonantGeoData/ResonantGeoData

Issue:
STAC serializer output Band info is incorrect
Figure out where this is coming from:

```
'assets': {
        'image-15030': {
            'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B01.jp2',
            'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B01.jp2',
            'eo:bands': [{'name': 'B1'}],
            'roles': ['data'],
        },
        'image-15041': {
            'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B02.jp2',
            'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B02.jp2',
            'eo:bands': [{'name': 'B1'}],
            'roles': ['data'],
        },
```

Note that both have `[{'name': 'B1'}]` which is incorrect.

First we need to make sure the `BandMeta` fields are correct then see where this breaks in the serializer


Discussion:

Resolving patch:
diff --git a/django-rgd-imagery/rgd_imagery/serializers/stac.py b/django-rgd-imagery/rgd_imagery/serializers/stac.py
--- a/django-rgd-imagery/rgd_imagery/serializers/stac.py
+++ b/django-rgd-imagery/rgd_imagery/serializers/stac.py
@@ -41,6 +41,7 @@ def to_representation(self, instance: models.RasterMeta) -> dict:
         item.ext.enable('eo')
         item.ext.eo.apply(cloud_cover=instance.cloud_cover, bands=[])
         # Add assets
+        band_num = 0
         for image in instance.parent_raster.image_set.images.all():
             if image.file.type != FileSourceType.URL:
                 # TODO: we need fix this
@@ -52,17 +53,27 @@ def to_representation(self, instance: models.RasterMeta) -> dict:
                     'data',
                 ],
             )
-            item.ext.eo.set_bands(
-                bands=[
+            if image.imagemeta.number_of_bands == 1:
+                bands = [
+                    pystac.extensions.eo.Band.create(
+                        name=image.file.name,
+                        description=image.bandmeta_set.first().description,
+                    )
+                ]
+            else:
+                bands = [
                     pystac.extensions.eo.Band.create(
-                        name=f'B{bandmeta.band_number}',
+                        name=f'B{bandmeta.band_number + band_num}',
                         description=bandmeta.description,
                     )
                     for bandmeta in image.bandmeta_set.all()
-                ],
+                ]
+            item.ext.eo.set_bands(
+                bands=bands,
                 asset=asset,
             )
             item.add_asset(f'image-{image.pk}', asset)
+            band_num += image.imagemeta.number_of_bands
 
         for ancillary_file in instance.parent_raster.ancillary_files.all():
             asset = pystac.Asset(


Test patch:
Repository: ResonantGeoData/ResonantGeoData

Issue:
GeoAdmin widget incorrectly rendering geometry
The `OpenLayersWidget` we are using in the admin view of the geo Django models is incorrectly rendering geometry. I suspect this is a simple coordinate issue where we need to transform the geometry before passing it to the model admin widget:


https://user-images.githubusercontent.com/22067021/117475485-5761c300-af19-11eb-97b5-7cd8e29bf14c.mov




Discussion:
This is only an issue when the widget is a `admin.StackedInline`
I believe this to be an upstream issue. We should report the bug upstream where appropriate and close this
@venkatabhishek, would you be able to help write a bug report for this. I can help you create a minimally working example somewhere if needed.

We can follow the instructions here: https://docs.djangoproject.com/en/dev/internals/contributing/bugs-and-features/
Option 2: https://stackoverflow.com/questions/32037375/geodjango-can-i-use-osmgeoadmin-in-an-inline-in-the-user-admin

Resolving patch:
diff --git a/django-rgd-imagery/rgd_imagery/admin/base.py b/django-rgd-imagery/rgd_imagery/admin/base.py
--- a/django-rgd-imagery/rgd_imagery/admin/base.py
+++ b/django-rgd-imagery/rgd_imagery/admin/base.py
@@ -1,3 +1,5 @@
+import copy
+
 from django.contrib import admin
 
 # from django.contrib.admin import SimpleListFilter
@@ -111,7 +113,7 @@ def convert_images(modeladmin, request, queryset):
 #             return queryset.filter(imagesetspatial__isnull=False)
 
 
-class ImageSetSpatialInline(admin.StackedInline):
+class ImageSetSpatialInline(OSMGeoAdmin, admin.StackedInline):
     model = ImageSetSpatial
     fk_name = 'image_set'
     list_display = (
@@ -121,6 +123,20 @@ class ImageSetSpatialInline(admin.StackedInline):
     )
     list_filter = MODIFIABLE_FILTERS + SPATIAL_ENTRY_FILTERS
 
+    def __init__(self, parent_model, admin_site):
+        self.admin_site = admin_site
+        self.parent_model = parent_model
+        self.opts = self.model._meta
+        self.has_registered_model = admin_site.is_registered(self.model)
+        overrides = copy.deepcopy(admin.options.FORMFIELD_FOR_DBFIELD_DEFAULTS)
+        for k, v in self.formfield_overrides.items():
+            overrides.setdefault(k, {}).update(v)
+        self.formfield_overrides = overrides
+        if self.verbose_name is None:
+            self.verbose_name = self.model._meta.verbose_name
+        if self.verbose_name_plural is None:
+            self.verbose_name_plural = self.model._meta.verbose_name_plural
+
 
 @admin.register(ImageSet)
 class ImageSetAdmin(OSMGeoAdmin):


Test patch:
Repository: ResonantGeoData/ResonantGeoData

Issue:
Storage patch is not thread-safe
This should only happen in development environments or other cases where MinIO is used in a Docker network.

```python
In [1]: from rgd.geodata.models import ChecksumFile
In [2]: from rgd.utility import patch_internal_presign
In [3]: f1 = ChecksumFile.objects.first()
In [4]: f2 = ChecksumFile.objects.first()
In [5]: with patch_internal_presign(f1.file):
   ...:     assert f1.file.storage.base_url != f2.file.storage.base_url
   ...:
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-5-37e9d3b557e8> in <module>
      1 with patch_internal_presign(f1.file):
----> 2     assert f1.file.storage.base_url != f2.file.storage.base_url
      3
```


Discussion:
@mcovalt, could you make a test case for this and mark it as `xfail`?

Resolving patch:
diff --git a/django-rgd/rgd/utility.py b/django-rgd/rgd/utility.py
--- a/django-rgd/rgd/utility.py
+++ b/django-rgd/rgd/utility.py
@@ -180,6 +180,11 @@ def patch_internal_presign(f: FieldFile):
     Sometimes the external host differs from the internal host for Minio files (e.g. in development).
     Getting the URL in this context ensures that the presigned URL returns the correct host for the
     odd situation of accessing the file locally.
+
+    Note
+    ----
+    If concerned regarding concurrent access, see https://github.com/ResonantGeoData/ResonantGeoData/issues/287
+
     """
     if (
         MinioStorage is not None


Test patch: