docs: def _validate_scales(self, proposal):
          """
          Validates the `scales` based on the mark's scaled attributes metadata.
  
          First checks for missing scale and then for 'rtype' compatibility.
          """
          # Validate scales' 'rtype' versus data attribute 'rtype' decoration
          # At this stage it is already validated that all values in self.scales
          # are instances of Scale.
          scales = proposal.value
          for name in self.trait_names(scaled=True):
              trait = self.traits()[name]
              if name not in scales:
                  # Check for missing scale
                  if not trait.allow_none:
                      raise TraitError("Missing scale for data attribute %s." %
                                       name)
              else:
                  # Check scale range type compatibility
                  if scales[name].rtype != trait.get_metadata('rtype'):
                      raise TraitError("Range type mismatch for scale %s." %
                                       name)
          return scales