hdx-python-utilities 4.2.0__tar.gz → 4.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/PKG-INFO +1 -1
  2. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/documentation/index.md +6 -0
  3. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/_version.py +2 -2
  4. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/matching.py +58 -0
  5. hdx_python_utilities-4.2.1/tests/fixtures/matching/wfp_admin_matcher_calls.json +5489 -0
  6. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_matching.py +26 -0
  7. hdx_python_utilities-4.2.1/tests/hdx/utilities/test_matching_wfp_admin.py +76 -0
  8. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/.github/workflows/publish-test.yaml +0 -0
  9. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/.github/workflows/publish.yaml +0 -0
  10. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/.github/workflows/run-python-tests.yaml +0 -0
  11. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/.gitignore +0 -0
  12. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/.pre-commit-config.yaml +0 -0
  13. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/CLAUDE.md +0 -0
  14. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/LICENSE +0 -0
  15. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/README.md +0 -0
  16. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/documentation/.readthedocs.yaml +0 -0
  17. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/documentation/mkdocs.yaml +0 -0
  18. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/pyproject.toml +0 -0
  19. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/__init__.py +0 -0
  20. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/base_downloader.py +0 -0
  21. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/compare.py +0 -0
  22. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/dateparse.py +0 -0
  23. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/dictandlist.py +0 -0
  24. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/downloader.py +0 -0
  25. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/easy_logging.py +0 -0
  26. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/email.py +0 -0
  27. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/encoding.py +0 -0
  28. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/error_handler.py +0 -0
  29. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/errors_onexit.py +0 -0
  30. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/file_hashing.py +0 -0
  31. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/frictionless_wrapper.py +0 -0
  32. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/html.py +0 -0
  33. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/loader.py +0 -0
  34. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/path.py +0 -0
  35. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/retriever.py +0 -0
  36. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/saver.py +0 -0
  37. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/session.py +0 -0
  38. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/state.py +0 -0
  39. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/text.py +0 -0
  40. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/url.py +0 -0
  41. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/useragent.py +0 -0
  42. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/uuid.py +0 -0
  43. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/src/hdx/utilities/zip_crc.py +0 -0
  44. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/compare/test_csv_processing.csv +0 -0
  45. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/compare/test_csv_processing2.csv +0 -0
  46. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/empty.yaml +0 -0
  47. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/hdx_config.json +0 -0
  48. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/hdx_config.yaml +0 -0
  49. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/hdx_email_configuration.json +0 -0
  50. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/hdx_email_configuration.yaml +0 -0
  51. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/logging_config.json +0 -0
  52. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/logging_config.yaml +0 -0
  53. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/project_configuration.json +0 -0
  54. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/project_configuration.yaml +0 -0
  55. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/smtp_config.json +0 -0
  56. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/smtp_config.yaml +0 -0
  57. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/user_agent_config.yaml +0 -0
  58. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/user_agent_config2.yaml +0 -0
  59. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/user_agent_config3.yaml +0 -0
  60. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/config/user_agent_config_wrong.yaml +0 -0
  61. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/basicauth.txt +0 -0
  62. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/bearertoken.txt +0 -0
  63. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/extra_params.json +0 -0
  64. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/extra_params.yaml +0 -0
  65. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/extra_params_tree.yaml +0 -0
  66. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/resume_test.dat +0 -0
  67. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/test_csv_processing.csv +0 -0
  68. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/test_csv_processing_blanks.csv +0 -0
  69. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/test_data.csv +0 -0
  70. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/test_data.xlsx +0 -0
  71. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/test_data1.csv/empty.txt +0 -0
  72. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/test_data2.csv +0 -0
  73. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/test_json_processing.json +0 -0
  74. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/test_xls_processing.xls +0 -0
  75. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/downloader/test_xlsx_processing.xlsx +0 -0
  76. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/file_hashing/bad_header.zip +0 -0
  77. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/file_hashing/bad_index.xlsx +0 -0
  78. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/file_hashing/empty.zip +0 -0
  79. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/file_hashing/test.xlsx +0 -0
  80. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/file_hashing/test_shapefile.zip +0 -0
  81. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/file_hashing/valid_sig_invalid_body.zip +0 -0
  82. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/html/response.html +0 -0
  83. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/loader/empty.json +0 -0
  84. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/loader/empty.yaml +0 -0
  85. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/loader/empty_list.json +0 -0
  86. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/retriever/fallbacks/test.csv +0 -0
  87. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/retriever/fallbacks/test.json +0 -0
  88. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/retriever/fallbacks/test.txt +0 -0
  89. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/retriever/fallbacks/test.yaml +0 -0
  90. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/retriever/retriever-test.csv +0 -0
  91. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/retriever/test.csv +0 -0
  92. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/retriever/test.json +0 -0
  93. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/retriever/test.txt +0 -0
  94. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/retriever/test.yaml +0 -0
  95. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/out.csv +0 -0
  96. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/out.json +0 -0
  97. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/out2.csv +0 -0
  98. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/out2.json +0 -0
  99. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/out5.json +0 -0
  100. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/out6.json +0 -0
  101. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/out7.json +0 -0
  102. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/out8.csv +0 -0
  103. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/out8.json +0 -0
  104. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/pretty-false_sortkeys-false.json +0 -0
  105. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/pretty-false_sortkeys-false.yaml +0 -0
  106. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/pretty-false_sortkeys-true.json +0 -0
  107. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/pretty-false_sortkeys-true.yaml +0 -0
  108. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/pretty-true_sortkeys-false.json +0 -0
  109. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/pretty-true_sortkeys-false.yaml +0 -0
  110. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/pretty-true_sortkeys-true.json +0 -0
  111. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/saver/pretty-true_sortkeys-true.yaml +0 -0
  112. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/state/analysis_dates.txt +0 -0
  113. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/state/last_build_date.txt +0 -0
  114. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/test_data.csv +0 -0
  115. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/text/text1.txt +0 -0
  116. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/fixtures/text/text2.txt +0 -0
  117. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/conftest.py +0 -0
  118. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_compare.py +0 -0
  119. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_dateparse.py +0 -0
  120. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_dictandlist.py +0 -0
  121. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_downloader.py +0 -0
  122. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_easy_logging.py +0 -0
  123. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_email.py +0 -0
  124. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_encoding.py +0 -0
  125. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_error_handler.py +0 -0
  126. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_file_hashing.py +0 -0
  127. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_html.py +0 -0
  128. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_loader.py +0 -0
  129. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_path.py +0 -0
  130. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_retriever.py +0 -0
  131. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_saver.py +0 -0
  132. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_state.py +0 -0
  133. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_text.py +0 -0
  134. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_url.py +0 -0
  135. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_useragent.py +0 -0
  136. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_uuid.py +0 -0
  137. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/test_zip_crc.py +0 -0
  138. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/tests/hdx/utilities/utils.py +0 -0
  139. {hdx_python_utilities-4.2.0 → hdx_python_utilities-4.2.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: hdx-python-utilities
3
- Version: 4.2.0
3
+ Version: 4.2.1
4
4
  Summary: HDX Python Utilities for streaming tabular data, date and time handling and other helpful functions
5
5
  Project-URL: Homepage, https://github.com/OCHA-DAP/hdx-python-utilities
6
6
  Author-email: Michael Rans <rans@email.com>
@@ -894,6 +894,12 @@ Examples:
894
894
  matcher = RapidFuzzMatcher(RapidFuzzMatcher.place_name_scorer)
895
895
  assert matcher.match(kalimantan, "central kalimantan") is None
896
896
 
897
+ # place_name_scorer also expands a leading initial to a word starting
898
+ # with it and requires a trailing single letter in the possible name
899
+ shewa = ["west shewa", "east shewa"]
900
+ assert matcher.match(shewa, "e shewa") == 1
901
+ assert matcher.match(["region iv a calabarzon"], "region iv b") is None
902
+
897
903
  # Phonetics is an alternative matcher using Refined Soundex
898
904
  phonetics = Phonetics()
899
905
  assert phonetics.match(possible_names, "al dali") == 1
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '4.2.0'
22
- __version_tuple__ = version_tuple = (4, 2, 0)
21
+ __version__ = version = '4.2.1'
22
+ __version_tuple__ = version_tuple = (4, 2, 1)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -13,6 +13,50 @@ LIST_SEPARATORS = re.compile(r"\s*(?:[,;/:&\n]|\s(?:and|et)\s)\s*", re.IGNORECAS
13
13
  HYPHEN = re.compile(r"\s*-\s*")
14
14
 
15
15
 
16
+ def expand_initials(words: list[str], other_words: list[str]) -> list[str] | None:
17
+ """Check single letters at the start or end of words against
18
+ other_words. A leading letter is an initial and is replaced by an unused
19
+ word in other_words that is not in words and starts with it ("e shewa"
20
+ -> "east shewa", "b gumuz" -> "benishangul gumuz"). A trailing letter
21
+ distinguishes places ("region iv b") so must be in other_words. Single
22
+ letters between other words are left alone as they are often conjunctions
23
+ (eg. Spanish "y").
24
+
25
+ Args:
26
+ words: Words that may contain single letters
27
+ other_words: Words to expand single letters to
28
+
29
+ Returns:
30
+ Expanded words or None if a single letter has no counterpart
31
+ """
32
+ leading = []
33
+ for word in words:
34
+ if len(word) != 1:
35
+ break
36
+ leading.append(word)
37
+ trailing = []
38
+ for word in reversed(words[len(leading) :]):
39
+ if len(word) != 1:
40
+ break
41
+ trailing.append(word)
42
+ for letter in trailing:
43
+ if letter.isalpha() and letter not in other_words:
44
+ return None
45
+ unmatched = [word for word in other_words if word not in words and len(word) > 1]
46
+ expanded = list(words)
47
+ for i, letter in enumerate(leading):
48
+ if not letter.isalpha() or letter in other_words:
49
+ continue
50
+ for other in unmatched:
51
+ if other[0] == letter:
52
+ unmatched.remove(other)
53
+ expanded[i] = other
54
+ break
55
+ else:
56
+ return None
57
+ return expanded
58
+
59
+
16
60
  class Phonetics(RefinedSoundex):
17
61
  def match(
18
62
  self,
@@ -119,6 +163,11 @@ class RapidFuzzMatcher:
119
163
  distinguishes places, but not names like sectors, where extra words
120
164
  are often descriptive (eg. "food security and livelihood").
121
165
 
166
+ Single letters at the start or end of name are checked first with
167
+ expand_initials ("e shewa" scores 0 against "west shewa" but matches
168
+ "east shewa"), unless the names differ only in spaces and punctuation
169
+ (eg. "sana a" vs "sanaa").
170
+
122
171
  Args:
123
172
  name: Name to match
124
173
  possible_name: Possible name
@@ -126,6 +175,15 @@ class RapidFuzzMatcher:
126
175
  Returns:
127
176
  Similarity score from 0-100
128
177
  """
178
+ joined_score = rapidfuzz_fuzz.ratio(
179
+ NON_WORD_CHARACTERS.sub("", name),
180
+ NON_WORD_CHARACTERS.sub("", possible_name),
181
+ )
182
+ if joined_score < 90:
183
+ name_words = expand_initials(name.split(), possible_name.split())
184
+ if name_words is None:
185
+ return 0.0
186
+ name = " ".join(name_words)
129
187
  words = set(name.split())
130
188
  possible_words = set(possible_name.split())
131
189