followthemoney 3.5.8__py2.py3-none-any.whl → 3.6.0__py2.py3-none-any.whl
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.
- followthemoney/__init__.py +1 -1
- followthemoney/cli/cli.py +18 -14
- followthemoney/export/excel.py +6 -6
- followthemoney/mapping/entity.py +14 -2
- followthemoney/mapping/property.py +15 -3
- followthemoney/mapping/sql.py +1 -1
- followthemoney/property.py +11 -0
- followthemoney/proxy.py +29 -19
- followthemoney/schema/Analyzable.yaml +2 -0
- followthemoney/schema/BankAccount.yaml +3 -0
- followthemoney/schema/LegalEntity.yaml +4 -0
- followthemoney/schema/Person.yaml +4 -0
- followthemoney/schema/Security.yaml +2 -0
- followthemoney/schema/Thing.yaml +1 -0
- followthemoney/translations/ru/LC_MESSAGES/followthemoney.po +24 -22
- followthemoney/types/__init__.py +2 -2
- followthemoney/types/common.py +13 -5
- followthemoney/types/date.py +7 -2
- followthemoney/types/email.py +3 -1
- followthemoney/types/entity.py +3 -1
- followthemoney/types/iban.py +7 -9
- followthemoney/types/identifier.py +17 -0
- followthemoney/types/ip.py +3 -1
- followthemoney/types/language.py +1 -1
- followthemoney/types/mimetype.py +2 -2
- followthemoney/types/name.py +6 -35
- followthemoney/types/phone.py +3 -1
- followthemoney/types/topic.py +6 -1
- followthemoney/types/url.py +5 -21
- {followthemoney-3.5.8.dist-info → followthemoney-3.6.0.dist-info}/METADATA +6 -10
- {followthemoney-3.5.8.dist-info → followthemoney-3.6.0.dist-info}/RECORD +40 -40
- {followthemoney-3.5.8.dist-info → followthemoney-3.6.0.dist-info}/WHEEL +1 -1
- {followthemoney-3.5.8.dist-info → followthemoney-3.6.0.dist-info}/entry_points.txt +0 -1
- tests/types/test_dates.py +5 -5
- tests/types/test_iban.py +2 -1
- tests/types/test_identifiers.py +99 -0
- tests/types/test_names.py +1 -7
- {followthemoney-3.5.8.dist-info → followthemoney-3.6.0.dist-info}/LICENSE +0 -0
- {followthemoney-3.5.8.dist-info → followthemoney-3.6.0.dist-info}/namespace_packages.txt +0 -0
- {followthemoney-3.5.8.dist-info → followthemoney-3.6.0.dist-info}/top_level.txt +0 -0
tests/types/test_identifiers.py
CHANGED
|
@@ -4,6 +4,9 @@ from followthemoney.types import registry
|
|
|
4
4
|
|
|
5
5
|
identifiers = registry.identifier
|
|
6
6
|
|
|
7
|
+
def iban_valid(text: str) -> bool:
|
|
8
|
+
return registry.identifier.validate(text, format='iban')
|
|
9
|
+
|
|
7
10
|
|
|
8
11
|
class IdentifiersTest(unittest.TestCase):
|
|
9
12
|
def test_parse(self):
|
|
@@ -21,3 +24,99 @@ class IdentifiersTest(unittest.TestCase):
|
|
|
21
24
|
assert comp > 0, comp
|
|
22
25
|
comp = identifiers.compare_sets(["9818700"], ["AS9818700"])
|
|
23
26
|
assert comp > 0, comp
|
|
27
|
+
iban = "AE460090000000123456789"
|
|
28
|
+
comp = identifiers.compare_safe(iban, iban)
|
|
29
|
+
assert comp == 1, comp
|
|
30
|
+
|
|
31
|
+
def test_iban_parse(self):
|
|
32
|
+
val = "GB29 NWBK 6016 1331 9268 19"
|
|
33
|
+
self.assertEqual(identifiers.clean(val), val)
|
|
34
|
+
self.assertEqual(
|
|
35
|
+
identifiers.clean(val, format='iban'),
|
|
36
|
+
"GB29NWBK60161331926819"
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
def test_specificity(self):
|
|
40
|
+
self.assertEqual(identifiers.specificity("VG21PACG0000000123456789"), 1)
|
|
41
|
+
|
|
42
|
+
def test_iban_validation(self):
|
|
43
|
+
self.assertTrue(iban_valid("GB29 NWBK 6016 1331 9268 19"))
|
|
44
|
+
self.assertTrue(iban_valid("GB29NWBK60161331926819"))
|
|
45
|
+
self.assertFalse(iban_valid("GB28 NWBK 6016 1331 9268 19"))
|
|
46
|
+
self.assertFalse(iban_valid("GB29NWBKN0161331926819"))
|
|
47
|
+
self.assertFalse(iban_valid(""))
|
|
48
|
+
self.assertTrue(iban_valid("AL35202111090000000001234567"))
|
|
49
|
+
self.assertTrue(iban_valid("AD1400080001001234567890"))
|
|
50
|
+
self.assertTrue(iban_valid("AT483200000012345864"))
|
|
51
|
+
self.assertTrue(iban_valid("AZ96AZEJ00000000001234567890"))
|
|
52
|
+
self.assertTrue(iban_valid("BH02CITI00001077181611"))
|
|
53
|
+
# self.assertTrue(iban_valid('BY86AKBB10100000002966000000'))
|
|
54
|
+
self.assertTrue(iban_valid("BE71096123456769"))
|
|
55
|
+
self.assertTrue(iban_valid("BA275680000123456789"))
|
|
56
|
+
self.assertTrue(iban_valid("BR1500000000000010932840814P2"))
|
|
57
|
+
self.assertTrue(iban_valid("BG18RZBB91550123456789"))
|
|
58
|
+
# self.assertTrue(iban_valid('CR37012600000123456789'))
|
|
59
|
+
self.assertTrue(iban_valid("HR1723600001101234565"))
|
|
60
|
+
self.assertTrue(iban_valid("CY21002001950000357001234567"))
|
|
61
|
+
self.assertTrue(iban_valid("CZ5508000000001234567899"))
|
|
62
|
+
self.assertTrue(iban_valid("DK9520000123456789"))
|
|
63
|
+
self.assertTrue(iban_valid("DO22ACAU00000000000123456789"))
|
|
64
|
+
# self.assertTrue(iban_valid('SV43ACAT00000000000000123123'))
|
|
65
|
+
self.assertTrue(iban_valid("EE471000001020145685"))
|
|
66
|
+
self.assertTrue(iban_valid("FO9264600123456789"))
|
|
67
|
+
self.assertTrue(iban_valid("FI1410093000123458"))
|
|
68
|
+
self.assertTrue(iban_valid("FR7630006000011234567890189"))
|
|
69
|
+
self.assertTrue(iban_valid("GE60NB0000000123456789"))
|
|
70
|
+
self.assertTrue(iban_valid("DE91100000000123456789"))
|
|
71
|
+
self.assertTrue(iban_valid("GI04BARC000001234567890"))
|
|
72
|
+
self.assertTrue(iban_valid("GR9608100010000001234567890"))
|
|
73
|
+
self.assertTrue(iban_valid("GL8964710123456789"))
|
|
74
|
+
self.assertTrue(iban_valid("GT20AGRO00000000001234567890"))
|
|
75
|
+
self.assertTrue(iban_valid("HU93116000060000000012345676"))
|
|
76
|
+
self.assertTrue(iban_valid("IS030001121234561234567890"))
|
|
77
|
+
# self.assertTrue(iban_valid('IQ20CBIQ861800101010500'))
|
|
78
|
+
self.assertTrue(iban_valid("IE64IRCE92050112345678"))
|
|
79
|
+
self.assertTrue(iban_valid("IL170108000000012612345"))
|
|
80
|
+
self.assertTrue(iban_valid("IT60X0542811101000000123456"))
|
|
81
|
+
self.assertTrue(iban_valid("JO71CBJO0000000000001234567890"))
|
|
82
|
+
self.assertTrue(iban_valid("KZ563190000012344567"))
|
|
83
|
+
self.assertTrue(iban_valid("XK051212012345678906"))
|
|
84
|
+
self.assertTrue(iban_valid("KW81CBKU0000000000001234560101"))
|
|
85
|
+
self.assertTrue(iban_valid("LV97HABA0012345678910"))
|
|
86
|
+
self.assertTrue(iban_valid("LB92000700000000123123456123"))
|
|
87
|
+
self.assertTrue(iban_valid("LI7408806123456789012"))
|
|
88
|
+
self.assertTrue(iban_valid("LT601010012345678901"))
|
|
89
|
+
self.assertTrue(iban_valid("LU120010001234567891"))
|
|
90
|
+
self.assertTrue(iban_valid("MK07200002785123453"))
|
|
91
|
+
self.assertTrue(iban_valid("MT31MALT01100000000000000000123"))
|
|
92
|
+
self.assertTrue(iban_valid("MR1300020001010000123456753"))
|
|
93
|
+
self.assertTrue(iban_valid("MU43BOMM0101123456789101000MUR"))
|
|
94
|
+
self.assertTrue(iban_valid("MD21EX000000000001234567"))
|
|
95
|
+
self.assertTrue(iban_valid("MC5810096180790123456789085"))
|
|
96
|
+
self.assertTrue(iban_valid("ME25505000012345678951"))
|
|
97
|
+
self.assertTrue(iban_valid("NL02ABNA0123456789"))
|
|
98
|
+
self.assertTrue(iban_valid("NO8330001234567"))
|
|
99
|
+
self.assertTrue(iban_valid("PK36SCBL0000001123456702"))
|
|
100
|
+
self.assertTrue(iban_valid("PS92PALS000000000400123456702"))
|
|
101
|
+
self.assertTrue(iban_valid("PL10105000997603123456789123"))
|
|
102
|
+
self.assertTrue(iban_valid("PT50002700000001234567833"))
|
|
103
|
+
self.assertTrue(iban_valid("QA54QNBA000000000000693123456"))
|
|
104
|
+
self.assertTrue(iban_valid("RO09BCYP0000001234567890"))
|
|
105
|
+
self.assertTrue(iban_valid("LC14BOSL123456789012345678901234"))
|
|
106
|
+
self.assertTrue(iban_valid("SM76P0854009812123456789123"))
|
|
107
|
+
self.assertTrue(iban_valid("ST23000200000289355710148"))
|
|
108
|
+
self.assertTrue(iban_valid("SA4420000001234567891234"))
|
|
109
|
+
self.assertTrue(iban_valid("RS35105008123123123173"))
|
|
110
|
+
self.assertTrue(iban_valid("SC52BAHL01031234567890123456USD"))
|
|
111
|
+
self.assertTrue(iban_valid("SK8975000000000012345671"))
|
|
112
|
+
self.assertTrue(iban_valid("SI56192001234567892"))
|
|
113
|
+
self.assertTrue(iban_valid("ES7921000813610123456789"))
|
|
114
|
+
self.assertTrue(iban_valid("SE1412345678901234567890"))
|
|
115
|
+
self.assertTrue(iban_valid("CH5604835012345678009"))
|
|
116
|
+
self.assertTrue(iban_valid("TL380080012345678910157"))
|
|
117
|
+
self.assertTrue(iban_valid("TN4401000067123456789123"))
|
|
118
|
+
self.assertTrue(iban_valid("TR320010009999901234567890"))
|
|
119
|
+
self.assertTrue(iban_valid("UA903052992990004149123456789"))
|
|
120
|
+
self.assertTrue(iban_valid("AE460090000000123456789"))
|
|
121
|
+
self.assertTrue(iban_valid("GB98MIDL07009312345678"))
|
|
122
|
+
self.assertTrue(iban_valid("VG21PACG0000000123456789"))
|
tests/types/test_names.py
CHANGED
|
@@ -20,13 +20,7 @@ class NamesTest(unittest.TestCase):
|
|
|
20
20
|
self.assertEqual(names.pick(["Banana"]), "Banana")
|
|
21
21
|
self.assertEqual(names.pick([]), None)
|
|
22
22
|
values = ["Robert Smith", "Rob Smith", "Robert SMITH"]
|
|
23
|
-
self.assertEqual(names.pick(values), "Robert
|
|
24
|
-
|
|
25
|
-
# handle dirty edgecases
|
|
26
|
-
values = ["", "(", "Peter"]
|
|
27
|
-
self.assertEqual(names.pick(values), "Peter")
|
|
28
|
-
values = ["", "("]
|
|
29
|
-
self.assertEqual(names.pick(values), None)
|
|
23
|
+
self.assertEqual(names.pick(values), "Robert Smith")
|
|
30
24
|
|
|
31
25
|
def test_domain_validity(self):
|
|
32
26
|
self.assertTrue(names.validate("huhu"))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|