code: def from_string(
      input_string: str,
      versioning: typing.Optional[str] = None,
  ):
      match = re.match(REMOTE_ASSET_RE, input_string)
      if not match:
          raise errors.InvalidAssetSpecError(input_string)
  
      return AssetSpec(versioning=versioning, **match.groupdict())
  
file_path: modelkit/modelkit/assets/settings.py
imports: import os
  import re
  import typing
  from modelkit.assets import errors
  from modelkit.assets.versioning.major_minor import MajorMinorAssetsVersioningSystem
  from modelkit.assets.versioning.simple_date import SimpleDateAssetsVersioningSystem
  from modelkit.assets.versioning.versioning import AssetsVersioningSystem
label_desc: Use image node_id 8 for calling the AssetSpec obj's underlying member method code with example usage: obj.from_string(input_string, versioning) and returns: AssetSpec