@@ -146,6 +146,8 @@ class BuildConfigBase:
146
146
'mkdocs' ,
147
147
'submodules' ,
148
148
]
149
+ valid_build_images = [k .split (':' )[1 ] for k in DOCKER_IMAGE_SETTINGS ]
150
+ default_build_image = DOCKER_DEFAULT_VERSION
149
151
version = None
150
152
151
153
def __init__ (self , env_config , raw_config , source_file ):
@@ -246,6 +248,24 @@ def python_full_version(self):
246
248
)
247
249
return ver
248
250
251
+ def get_valid_python_versions_for_image (self , build_image ):
252
+ """
253
+ Return all the valid Python versions for a Docker image.
254
+
255
+ The Docker image (``build_image``) has to be its complete name, already
256
+ validated: ``readthedocs/build:4.0``, not just ``4.0``.
257
+
258
+ Returns supported versions for the ``DOCKER_DEFAULT_VERSION`` if not
259
+ ``build_image`` found.
260
+ """
261
+
262
+ if build_image not in DOCKER_IMAGE_SETTINGS :
263
+ build_image = '{}:{}' .format (
264
+ DOCKER_DEFAULT_IMAGE ,
265
+ self .default_build_image ,
266
+ )
267
+ return DOCKER_IMAGE_SETTINGS [build_image ]['python' ]['supported_versions' ]
268
+
249
269
def as_dict (self ):
250
270
config = {}
251
271
for name in self .PUBLIC_ATTRIBUTES :
@@ -268,18 +288,20 @@ class BuildConfigV1(BuildConfigBase):
268
288
'"python.extra_requirements" section must be a list.'
269
289
)
270
290
271
- PYTHON_SUPPORTED_VERSIONS = [2 , 2.7 , 3 , 3.5 ]
272
- DOCKER_SUPPORTED_VERSIONS = ['1.0' , '2.0' , 'latest' ]
273
-
274
291
version = '1'
275
292
276
293
def get_valid_python_versions (self ):
277
- """Get all valid python versions."""
278
- try :
279
- return self .env_config ['python' ]['supported_versions' ]
280
- except (KeyError , TypeError ):
281
- pass
282
- return self .PYTHON_SUPPORTED_VERSIONS
294
+ """
295
+ Return all valid Python versions.
296
+
297
+ .. note::
298
+
299
+ It does not take current build image used into account.
300
+ """
301
+ versions = set ()
302
+ for name , options in DOCKER_IMAGE_SETTINGS .items ():
303
+ versions = versions .union (options ['python' ]['supported_versions' ])
304
+ return versions
283
305
284
306
def get_valid_formats (self ): # noqa
285
307
"""Get all valid documentation formats."""
@@ -339,7 +361,7 @@ def validate_build(self):
339
361
with self .catch_validation_error ('build' ):
340
362
build ['image' ] = validate_choice (
341
363
str (_build ['image' ]),
342
- self .DOCKER_SUPPORTED_VERSIONS ,
364
+ self .valid_build_images ,
343
365
)
344
366
if ':' not in build ['image' ]:
345
367
# Prepend proper image name to user's image name
@@ -577,8 +599,6 @@ class BuildConfigV2(BuildConfigBase):
577
599
578
600
version = '2'
579
601
valid_formats = ['htmlzip' , 'pdf' , 'epub' ]
580
- valid_build_images = ['1.0' , '2.0' , '3.0' , 'stable' , 'latest' ]
581
- default_build_image = 'latest'
582
602
valid_install_method = [PIP , SETUPTOOLS ]
583
603
valid_sphinx_builders = {
584
604
'html' : 'sphinx' ,
@@ -793,13 +813,7 @@ def get_valid_python_versions(self):
793
813
This should be called after ``validate_build()``.
794
814
"""
795
815
build_image = self .build .image
796
- if build_image not in DOCKER_IMAGE_SETTINGS :
797
- build_image = '{}:{}' .format (
798
- DOCKER_DEFAULT_IMAGE ,
799
- self .default_build_image ,
800
- )
801
- python = DOCKER_IMAGE_SETTINGS [build_image ]['python' ]
802
- return python ['supported_versions' ]
816
+ return self .get_valid_python_versions_for_image (build_image )
803
817
804
818
def validate_doc_types (self ):
805
819
"""
0 commit comments