From d1738df30626bfaeea5678df51d86c6ee257696f Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Fri, 19 Sep 2025 11:47:23 +0100 Subject: [PATCH] Add most recently added fields as top-level exports (#3078) * Add most recently added fields as top-level exports * add unit test to ensure all fields are exported (cherry picked from commit 9c610684aacf705ed6f302953478f47d1610dd7e) --- elasticsearch/dsl/__init__.py | 28 +++++++++++++++++++++++ test_elasticsearch/test_dsl/test_field.py | 17 ++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/elasticsearch/dsl/__init__.py b/elasticsearch/dsl/__init__.py index e109db219..59294d632 100644 --- a/elasticsearch/dsl/__init__.py +++ b/elasticsearch/dsl/__init__.py @@ -38,23 +38,30 @@ TermsFacet, ) from .field import ( + AggregateMetricDouble, + Alias, Binary, Boolean, Byte, Completion, ConstantKeyword, + CountedKeyword, CustomField, Date, + DateNanos, DateRange, DenseVector, Double, DoubleRange, Field, + Flattened, Float, FloatRange, GeoPoint, GeoShape, HalfFloat, + Histogram, + IcuCollationKeyword, Integer, IntegerRange, Ip, @@ -63,21 +70,28 @@ Keyword, Long, LongRange, + MatchOnlyText, Murmur3, Nested, Object, + Passthrough, Percolator, Point, RangeField, RankFeature, RankFeatures, + RankVectors, ScaledFloat, SearchAsYouType, + SemanticText, Shape, Short, SparseVector, Text, TokenCount, + UnsignedLong, + Version, + Wildcard, construct_field, ) from .function import SF @@ -108,6 +122,8 @@ "A", "Agg", "AggResponse", + "AggregateMetricDouble", + "Alias", "AsyncComposableIndexTemplate", "AsyncDocument", "AsyncEmptySearch", @@ -126,9 +142,11 @@ "Completion", "ComposableIndexTemplate", "ConstantKeyword", + "CountedKeyword", "CustomField", "Date", "DateHistogramFacet", + "DateNanos", "DateRange", "DenseVector", "Document", @@ -142,12 +160,15 @@ "FacetedResponse", "FacetedSearch", "Field", + "Flattened", "Float", "FloatRange", "GeoPoint", "GeoShape", "HalfFloat", + "Histogram", "HistogramFacet", + "IcuCollationKeyword", "IllegalOperation", "Index", "IndexTemplate", @@ -162,12 +183,14 @@ "LongRange", "M", "Mapping", + "MatchOnlyText", "MetaField", "MultiSearch", "Murmur3", "Nested", "NestedFacet", "Object", + "Passthrough", "Percolator", "Point", "Q", @@ -177,11 +200,13 @@ "RangeField", "RankFeature", "RankFeatures", + "RankVectors", "Response", "SF", "ScaledFloat", "Search", "SearchAsYouType", + "SemanticText", "Shape", "Short", "SparseVector", @@ -189,9 +214,12 @@ "Text", "TokenCount", "UnknownDslObject", + "UnsignedLong", "UpdateByQuery", "UpdateByQueryResponse", "ValidationException", + "Version", + "Wildcard", "analyzer", "async_connections", "char_filter", diff --git a/test_elasticsearch/test_dsl/test_field.py b/test_elasticsearch/test_dsl/test_field.py index 423936ae3..bf6bc7c83 100644 --- a/test_elasticsearch/test_dsl/test_field.py +++ b/test_elasticsearch/test_dsl/test_field.py @@ -23,6 +23,7 @@ import pytest from dateutil import tz +from elasticsearch import dsl from elasticsearch.dsl import InnerDoc, Range, ValidationException, field @@ -232,3 +233,19 @@ class Inner(InnerDoc): with pytest.raises(ValidationException): field.Object(doc_class=Inner, dynamic=False) + + +def test_all_fields_exported() -> None: + """Make sure that all the generated field classes are exported at the top-level""" + fields = [ + f + for f in dir(field) + if isinstance(getattr(field, f), type) + and issubclass(getattr(field, f), field.Field) + ] + all = dir(dsl) + not_found = [] + for f in fields: + if f not in all: + not_found.append(f) + assert not_found == []