code: def __init__(self, version: str) -> None:
      m = ANY_VERSION.match(version)
      if not m:
          raise ValueError(
              f"Invalid version for Bokeh build/release {version!r}"
          )
      groups = m.groups()
  
      self.version: str = version
  
      self.base_version: str = groups[0]
      self.base_version_tuple: tuple[str, ...] = tuple(groups[1:4])
      self.ext: str | None = groups[4]
      # want just "dev" not ".dev"
      self.ext_type: str = (groups[5] or "").lstrip(".")
      self.ext_number: str = groups[6]
  
      self._secrets: dict[str, str] = {}
  
      self._new: set[str] = set()
      self._modified: set[str] = set()
  
file_path: bokeh/release/config.py
imports: from __future__ import annotations
  import re
  from .enums import VersionType
  from .logger import LOG, Scrubber
label_desc: Use image node_id 1 to create a new Config object  with example: obj = Config(version)