+ def isScalar(self):
+ return self.min == 1 and self.max == 1 and not self.value
+
+ def isOptional(self):
+ return self.min == 0 and self.max == 1
+
+ def toEnglish(self):
+ keyName = atomicTypeToEnglish(self.key, self.keyRefTable)
+ if self.value:
+ valueName = atomicTypeToEnglish(self.value, self.valueRefTable)
+
+ if self.isScalar():
+ return atomicTypeToEnglish(self.key, self.keyRefTable)
+ elif self.isOptional():
+ if self.value:
+ return "optional %s-%s pair" % (keyName, valueName)
+ else:
+ return "optional %s" % keyName
+ else:
+ if self.max == "unlimited":
+ if self.min:
+ quantity = "%d or more " % self.min
+ else:
+ quantity = ""
+ elif self.min:
+ quantity = "%d to %d " % (self.min, self.max)
+ else:
+ quantity = "up to %d " % self.max
+
+ if self.value:
+ return "map of %s%s-%s pairs" % (quantity, keyName, valueName)
+ else:
+ return "set of %s%s" % (quantity, keyName)
+
+
+def atomicTypeToEnglish(base, refTable):
+ if base == 'uuid' and refTable:
+ return refTable
+ else:
+ return base
+