Skip to content

Commit a46a6d7

Browse files
committed
buildmetadata: relax consistency checks with --lax
In various places the metadata does not comply with the schema associated with the XML, so relax the checks for this. Examples: - Some number descriptions have no required possibleLengths element (example: GE.noInternationalDialling). - Some number descriptions have no required exampleNumber element (example: MC.noInternationalDialling). - Some number descriptions have no required nationalNumberPattern element (example: testdata.BB.fixedLine). - Some generalDesc number descriptions have an exampleNumber element which isn't in the schema (example: testdata.AM.generalDesc). Control this with --lax, with the aim that the --lax flag can be removed for the real metadat in future. (It will probably still be required for the test metadata.)
1 parent 8925155 commit a46a6d7

2 files changed

Lines changed: 22 additions & 8 deletions

File tree

tools/python/buildmetadatafromxml.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454
from phonenumbers.phonemetadata import REGION_CODE_FOR_NON_GEO_ENTITY
5555
from phonenumbers.util import UnicodeMixin, u, prnt
5656

57+
# Global flag for lax XML parsing
58+
lax = False
59+
5760
# Convention: variables beginning with 'x' are XML objects
5861

5962
# Top-level XML element containing data
@@ -334,7 +337,11 @@ def __init__(self, xterritory, tag, template=None, fill_na=True, general_desc=Fa
334337
# Always expect a nationalNumberPattern element
335338
self.o.national_number_pattern = _dews_re(_get_unique_child_value(xtag, 'nationalNumberPattern'))
336339
if self.o.national_number_pattern is None:
337-
raise Exception("Missing required nationalNumberPattern element in %s.%s" % (id, tag))
340+
if lax:
341+
if template is not None:
342+
self.o.national_number_pattern = template.national_number_pattern
343+
else:
344+
raise Exception("Missing required nationalNumberPattern element in %s.%s" % (id, tag))
338345

339346
# A possibleNumberPattern element is optional, except for the general_desc
340347
self.o.possible_number_pattern = _dews_re(_get_unique_child_value(xtag, 'possibleNumberPattern'))
@@ -346,15 +353,18 @@ def __init__(self, xterritory, tag, template=None, fill_na=True, general_desc=Fa
346353

347354
# An exampleNumber element is present iff this is not the generalDesc
348355
example_number = _get_unique_child_value(xtag, 'exampleNumber')
349-
if not general_desc and example_number is None:
356+
if (not lax) and (not general_desc) and (example_number is None):
350357
raise Exception("Missing required exampleNumber element in %s.%s" % (id, tag))
351358
if general_desc and example_number is not None:
352-
raise Exception("Unexpected exampleNumber element for generalDesc in %s.%s" % (id, tag))
359+
if lax:
360+
example_number = None
361+
else:
362+
raise Exception("Unexpected exampleNumber element for generalDesc in %s.%s" % (id, tag))
353363
self.o.example_number = example_number
354364

355365
# A possibleLengths element is present iff this is not the generalDesc
356366
possible_lengths = _get_unique_child(xtag, 'possibleLengths')
357-
if not general_desc and possible_lengths is None:
367+
if (not lax) and (not general_desc) and (possible_lengths is None):
358368
raise Exception("Missing required possibleLengths element in %s.%s" % (id, tag))
359369
if general_desc and possible_lengths is not None:
360370
raise Exception("Unexpected possibleLengths for generalDesc in %s.%s" % (id, tag))
@@ -677,7 +687,7 @@ def _standalone(argv):
677687
alternate = None
678688
short_data = False
679689
try:
680-
opts, args = getopt.getopt(argv, "hsa:", ("help", "short", "alt="))
690+
opts, args = getopt.getopt(argv, "hlsa:", ("help", "lax", "short", "alt="))
681691
except getopt.GetoptError:
682692
prnt(__doc__, file=sys.stderr)
683693
sys.exit(1)
@@ -687,6 +697,9 @@ def _standalone(argv):
687697
sys.exit(1)
688698
elif opt in ("-s", "--short"):
689699
short_data = True
700+
elif opt in ("-l", "--lax"):
701+
global lax
702+
lax = True
690703
elif opt in ("-a", "--alt"):
691704
alternate = arg
692705
else:

tools/python/makefile

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,13 @@ $(PYDIR)/tests/testtzdata/__init__.py: buildprefixdata.py $(TOPDIR)/resources/te
4646
tzdata: $(PYDIR)/phonenumbers/tzdata/__init__.py $(PYDIR)/tests/testtzdata/__init__.py
4747

4848
# Generate Python files from metadata
49+
# TODO(drysdale): remove --lax for data/shortdata (but not testdata) when metadata complies with its DTD
4950
$(PYDIR)/phonenumbers/data/__init__.py: $(TOPDIR)/resources/PhoneNumberMetadata.xml $(TOPDIR)/resources/PhoneNumberAlternateFormats.xml buildmetadatafromxml.py
50-
$(PYTHON) buildmetadatafromxml.py --alt $(TOPDIR)/resources/PhoneNumberAlternateFormats.xml $(TOPDIR)/resources/PhoneNumberMetadata.xml $(PYDIR)/phonenumbers/data .
51+
$(PYTHON) buildmetadatafromxml.py --lax --alt $(TOPDIR)/resources/PhoneNumberAlternateFormats.xml $(TOPDIR)/resources/PhoneNumberMetadata.xml $(PYDIR)/phonenumbers/data .
5152
$(PYDIR)/phonenumbers/shortdata/__init__.py: $(TOPDIR)/resources/ShortNumberMetadata.xml buildmetadatafromxml.py
52-
$(PYTHON) buildmetadatafromxml.py --short $(TOPDIR)/resources/ShortNumberMetadata.xml $(PYDIR)/phonenumbers/shortdata .
53+
$(PYTHON) buildmetadatafromxml.py --lax --short $(TOPDIR)/resources/ShortNumberMetadata.xml $(PYDIR)/phonenumbers/shortdata .
5354
$(PYDIR)/tests/testdata/__init__.py: $(TOPDIR)/resources/PhoneNumberMetadataForTesting.xml buildmetadatafromxml.py
54-
$(PYTHON) buildmetadatafromxml.py $(TOPDIR)/resources/PhoneNumberMetadataForTesting.xml $(PYDIR)/tests/testdata phonenumbers
55+
$(PYTHON) buildmetadatafromxml.py --lax $(TOPDIR)/resources/PhoneNumberMetadataForTesting.xml $(PYDIR)/tests/testdata phonenumbers
5556
metadata: $(PYDIR)/phonenumbers/data/__init__.py $(PYDIR)/phonenumbers/shortdata/__init__.py $(PYDIR)/tests/testdata/__init__.py geodata carrierdata tzdata
5657

5758
alldata: metadata geodata carrierdata tzdata locale

0 commit comments

Comments
 (0)