followthemoney 4.3.0__py3-none-any.whl → 4.5.0__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.
Files changed (45) hide show
  1. followthemoney/__init__.py +1 -1
  2. followthemoney/compare.py +6 -0
  3. followthemoney/dataset/dataset.py +18 -0
  4. followthemoney/entity.py +29 -15
  5. followthemoney/mapping/csv.py +3 -1
  6. followthemoney/model.py +6 -5
  7. followthemoney/property.py +23 -4
  8. followthemoney/proxy.py +32 -11
  9. followthemoney/schema/Company.yaml +5 -0
  10. followthemoney/schema/CryptoWallet.yaml +4 -0
  11. followthemoney/schema/Image.yaml +7 -0
  12. followthemoney/schema/LegalEntity.yaml +10 -0
  13. followthemoney/schema/Organization.yaml +5 -0
  14. followthemoney/schema/Person.yaml +4 -0
  15. followthemoney/schema/PublicBody.yaml +4 -0
  16. followthemoney/schema/Thing.yaml +3 -2
  17. followthemoney/schema.py +16 -2
  18. followthemoney/settings.py +19 -0
  19. followthemoney/statement/entity.py +31 -7
  20. followthemoney/statement/serialize.py +18 -13
  21. followthemoney/statement/statement.py +151 -42
  22. followthemoney/statement/util.py +23 -2
  23. followthemoney/types/address.py +3 -3
  24. followthemoney/types/checksum.py +3 -3
  25. followthemoney/types/country.py +19 -4
  26. followthemoney/types/date.py +13 -3
  27. followthemoney/types/entity.py +3 -3
  28. followthemoney/types/gender.py +6 -6
  29. followthemoney/types/identifier.py +8 -8
  30. followthemoney/types/ip.py +3 -3
  31. followthemoney/types/json.py +2 -2
  32. followthemoney/types/language.py +3 -3
  33. followthemoney/types/mimetype.py +3 -3
  34. followthemoney/types/name.py +3 -3
  35. followthemoney/types/number.py +2 -2
  36. followthemoney/types/phone.py +3 -3
  37. followthemoney/types/string.py +2 -2
  38. followthemoney/types/topic.py +6 -3
  39. followthemoney/types/url.py +3 -3
  40. followthemoney/util.py +6 -14
  41. {followthemoney-4.3.0.dist-info → followthemoney-4.5.0.dist-info}/METADATA +3 -3
  42. {followthemoney-4.3.0.dist-info → followthemoney-4.5.0.dist-info}/RECORD +45 -44
  43. {followthemoney-4.3.0.dist-info → followthemoney-4.5.0.dist-info}/WHEEL +1 -1
  44. {followthemoney-4.3.0.dist-info → followthemoney-4.5.0.dist-info}/entry_points.txt +0 -0
  45. {followthemoney-4.3.0.dist-info → followthemoney-4.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -4,7 +4,7 @@ from rigour.langs import iso_639_alpha3
4
4
 
5
5
  from followthemoney.types.common import EnumType, EnumValues
6
6
  from followthemoney.util import defer as _, gettext
7
- from followthemoney.util import const, get_env_list
7
+ from followthemoney.settings import get_env_list
8
8
 
9
9
  if TYPE_CHECKING:
10
10
  from followthemoney.proxy import EntityProxy
@@ -16,8 +16,8 @@ class LanguageType(EnumType):
16
16
  for additional languages once there is a specific need for them to be
17
17
  supported."""
18
18
 
19
- name = const("language")
20
- group = const("languages")
19
+ name = "language"
20
+ group = "languages"
21
21
  label = _("Language")
22
22
  plural = _("Languages")
23
23
  matchable = False
@@ -3,7 +3,7 @@ from rigour.mime import normalize_mimetype, parse_mimetype
3
3
  from rigour.mime import DEFAULT
4
4
 
5
5
  from followthemoney.types.common import PropertyType
6
- from followthemoney.util import const, defer as _
6
+ from followthemoney.util import defer as _
7
7
 
8
8
  if TYPE_CHECKING:
9
9
  from followthemoney.proxy import EntityProxy
@@ -18,8 +18,8 @@ class MimeType(PropertyType):
18
18
  MIME type properties do not contain parameters as used in HTTP headers,
19
19
  like `charset=UTF-8`."""
20
20
 
21
- name = const("mimetype")
22
- group = const("mimetypes")
21
+ name = "mimetype"
22
+ group = "mimetypes"
23
23
  label = _("MIME-Type")
24
24
  plural = _("MIME-Types")
25
25
  matchable = False
@@ -7,7 +7,7 @@ from rigour.text.distance import levenshtein_similarity
7
7
 
8
8
  from followthemoney.types.common import PropertyType
9
9
  from followthemoney.util import dampen
10
- from followthemoney.util import const, defer as _
10
+ from followthemoney.util import defer as _
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from followthemoney.proxy import EntityProxy
@@ -21,8 +21,8 @@ class NameType(PropertyType):
21
21
  No validation rules apply, and things having multiple names must be considered
22
22
  a perfectly ordinary case."""
23
23
 
24
- name = const("name")
25
- group = const("names")
24
+ name = "name"
25
+ group = "names"
26
26
  label = _("Name")
27
27
  plural = _("Names")
28
28
  matchable = True
@@ -2,7 +2,7 @@ import re
2
2
  from typing import Optional, Tuple
3
3
 
4
4
  from followthemoney.types.common import PropertyType
5
- from followthemoney.util import const, defer as _
5
+ from followthemoney.util import defer as _
6
6
 
7
7
 
8
8
  class NumberType(PropertyType):
@@ -24,7 +24,7 @@ class NumberType(PropertyType):
24
24
  _FLOAT_FMT = "{:" + SEPARATOR + "." + str(PRECISION) + "f}"
25
25
  _INT_FMT = "{:" + SEPARATOR + "d}"
26
26
 
27
- name = const("number")
27
+ name = "number"
28
28
  label = _("Number")
29
29
  plural = _("Numbers")
30
30
  matchable = False
@@ -6,7 +6,7 @@ from phonenumbers.phonenumberutil import region_code_for_number, NumberParseExce
6
6
 
7
7
  from followthemoney.types.common import PropertyType
8
8
  from followthemoney.util import defer as _
9
- from followthemoney.util import const, dampen
9
+ from followthemoney.util import dampen
10
10
 
11
11
  if TYPE_CHECKING:
12
12
  from followthemoney.proxy import EntityProxy
@@ -29,8 +29,8 @@ class PhoneType(PropertyType):
29
29
  validation outcome from doing the two operations the other way around. Always
30
30
  define the country first."""
31
31
 
32
- name = const("phone")
33
- group = const("phones")
32
+ name = "phone"
33
+ group = "phones"
34
34
  label = _("Phone number")
35
35
  plural = _("Phone numbers")
36
36
  matchable = True
@@ -6,7 +6,7 @@ from followthemoney.util import MEGABYTE
6
6
  class StringType(PropertyType):
7
7
  """A simple string property with no additional semantics."""
8
8
 
9
- name = const("string")
9
+ name = "string"
10
10
  label = _("Label")
11
11
  plural = _("Labels")
12
12
  matchable = False
@@ -21,7 +21,7 @@ class TextType(StringType):
21
21
  string properties, it might make sense to treat properties of this type as
22
22
  full-text search material."""
23
23
 
24
- name = const("text")
24
+ name = "text"
25
25
  label = _("Text")
26
26
  plural = _("Texts")
27
27
  total_size = 30 * MEGABYTE
@@ -1,7 +1,7 @@
1
1
  from babel.core import Locale
2
2
 
3
3
  from followthemoney.types.common import EnumType, EnumValues
4
- from followthemoney.util import const, gettext, defer as _
4
+ from followthemoney.util import gettext, defer as _
5
5
 
6
6
 
7
7
  class TopicType(EnumType):
@@ -15,8 +15,8 @@ class TopicType(EnumType):
15
15
  enable queries such as _find all paths between a government procurement
16
16
  award and a politician_."""
17
17
 
18
- name = const("topic")
19
- group = const("topics")
18
+ name = "topic"
19
+ group = "topics"
20
20
  label = _("Topic")
21
21
  plural = _("Topics")
22
22
  matchable = False
@@ -86,6 +86,8 @@ class TopicType(EnumType):
86
86
  "sanction.linked": _("Sanction-linked entity"),
87
87
  "sanction.counter": _("Counter-sanctioned entity"),
88
88
  "export.control": _("Export controlled"),
89
+ # For BIS 50% rule:
90
+ "export.control.linked": _("Export control-linked"),
89
91
  "export.risk": _("Trade risk"),
90
92
  "debarment": _("Debarred entity"),
91
93
  "poi": _("Person of interest"),
@@ -103,6 +105,7 @@ class TopicType(EnumType):
103
105
  "crime",
104
106
  "debarment",
105
107
  "export.control",
108
+ "export.control.linked",
106
109
  "export.risk",
107
110
  "poi",
108
111
  "mare.detained",
@@ -2,7 +2,7 @@ from typing import Optional, TYPE_CHECKING
2
2
  from rigour.urls import clean_url, compare_urls
3
3
 
4
4
  from followthemoney.types.common import PropertyType
5
- from followthemoney.util import const, dampen, defer as _
5
+ from followthemoney.util import dampen, defer as _
6
6
 
7
7
  if TYPE_CHECKING:
8
8
  from followthemoney.proxy import EntityProxy
@@ -16,8 +16,8 @@ class UrlType(PropertyType):
16
16
  SCHEMES = ("http", "https", "ftp", "mailto")
17
17
  DEFAULT_SCHEME = "http"
18
18
 
19
- name = const("url")
20
- group = const("urls")
19
+ name = "url"
20
+ group = "urls"
21
21
  label = _("URL")
22
22
  plural = _("URLs")
23
23
  matchable = True
followthemoney/util.py CHANGED
@@ -10,10 +10,11 @@ from threading import local
10
10
  from typing import cast, Dict, Any, List, Optional, TypeVar, Union
11
11
  from normality import stringify
12
12
  from normality.cleaning import remove_unsafe_chars
13
- from normality.encoding import DEFAULT_ENCODING
13
+ from rigour.env import ENCODING
14
14
  from banal import is_mapping, unique_list, ensure_list
15
15
 
16
16
  MEGABYTE = 1024 * 1024
17
+ HASH_ENCODING = "utf-8"
17
18
  DEFAULT_LOCALE = "en"
18
19
  ENTITY_ID_LEN = 200
19
20
 
@@ -55,16 +56,7 @@ def get_locale() -> Locale:
55
56
  return Locale.parse(state.locale)
56
57
 
57
58
 
58
- def get_env_list(name: str, default: List[str] = []) -> List[str]:
59
- value = stringify(os.environ.get(name))
60
- if value is not None:
61
- values = value.split(":")
62
- if len(values):
63
- return values
64
- return default
65
-
66
-
67
- def sanitize_text(value: Any, encoding: str = DEFAULT_ENCODING) -> Optional[str]:
59
+ def sanitize_text(value: Any, encoding: str = ENCODING) -> Optional[str]:
68
60
  text = stringify(value, encoding_default=encoding)
69
61
  if text is None:
70
62
  return None
@@ -74,8 +66,8 @@ def sanitize_text(value: Any, encoding: str = DEFAULT_ENCODING) -> Optional[str]
74
66
  log.warning("Cannot NFC text: %s", ex)
75
67
  return None
76
68
  text = remove_unsafe_chars(text)
77
- byte_text = text.encode(DEFAULT_ENCODING, "replace")
78
- text = byte_text.decode(DEFAULT_ENCODING, "replace")
69
+ byte_text = text.encode("utf-8", "replace")
70
+ text = byte_text.decode("utf-8", "replace")
79
71
  if len(text) == 0:
80
72
  return None
81
73
  return text
@@ -88,7 +80,7 @@ def key_bytes(key: Any) -> bytes:
88
80
  text = stringify(key)
89
81
  if text is None:
90
82
  return b""
91
- return text.encode("utf-8")
83
+ return text.encode(ENCODING)
92
84
 
93
85
 
94
86
  def join_text(*parts: Any, sep: str = " ") -> Optional[str]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: followthemoney
3
- Version: 4.3.0
3
+ Version: 4.5.0
4
4
  Summary: A data model for anti corruption data modeling and analysis.
5
5
  Project-URL: Documentation, https://followthemoney.tech/
6
6
  Project-URL: Repository, https://github.com/opensanctions/followthemoney.git
@@ -48,9 +48,9 @@ Requires-Dist: prefixdate<1.0.0,>=0.5.0
48
48
  Requires-Dist: pydantic<3.0.0,>=2.11.0
49
49
  Requires-Dist: pytz>=2021.1
50
50
  Requires-Dist: pyyaml<7.0.0,>=5.0.0
51
- Requires-Dist: rdflib<7.3.0,>=6.2.0
51
+ Requires-Dist: rdflib<7.6.0,>=6.2.0
52
52
  Requires-Dist: requests<3.0.0,>=2.21.0
53
- Requires-Dist: rigour<2.0.0,>=1.3.13
53
+ Requires-Dist: rigour<2.0.0,>=1.6.0
54
54
  Requires-Dist: sqlalchemy[mypy]<3.0.0,>=2.0.0
55
55
  Provides-Extra: dev
56
56
  Requires-Dist: build; extra == 'dev'
@@ -1,19 +1,20 @@
1
- followthemoney/__init__.py,sha256=SGtXmqy22FtLMX0kcGDSUMbWNGUvoA13F5SUobauMg8,856
2
- followthemoney/compare.py,sha256=bZlnj2VMoe67q4Lyq_VwS1a-EJnEK1kC8prbs8jyL9E,5774
3
- followthemoney/entity.py,sha256=bBiX7hNquXemS3vYCUHKtWI_IqX43Z6i8RQDbZ7gXsg,3449
1
+ followthemoney/__init__.py,sha256=3Mvq7FWl0cNbTovkJhys0iHU24UdFT44P2AqszoGs-8,856
2
+ followthemoney/compare.py,sha256=6y6fqtbbfW7ee4_EVXPcKCIr75GjPqXvtHfvExJ-KK0,6119
3
+ followthemoney/entity.py,sha256=biAjuuHlwsVT02imAsaWP0YtgdfU8skCntzBU3mgJpg,4052
4
4
  followthemoney/exc.py,sha256=GyMgwY4QVm87hLevDfV7gM1MJsDqfNCi_UQw7F_A8X8,858
5
5
  followthemoney/graph.py,sha256=7X1CGHGvmktS2LSZqld2iXWzG7B831eCNYyBqamqEJ8,10921
6
6
  followthemoney/helpers.py,sha256=KCdv1XAE7KQEXBiXp52Kvuck7wMaeNVBM3uaFemcvb4,7873
7
7
  followthemoney/messages.py,sha256=zUEa9CFecU8nRafIzhN6TKCh1kEihiIyIS1qr8PxY4g,806
8
- followthemoney/model.py,sha256=bWFVNa-DhYzc8BdSXBZdG2ev6Nh9uHx6i4tin8DvEEU,7374
8
+ followthemoney/model.py,sha256=kwv3GT9vGqEMF-m4z94OZJ0phFzcv-K0Eme1ElOMEmU,7346
9
9
  followthemoney/names.py,sha256=LODQqExKEHdH4z6Mmbhlm0KeKRzGcptaSWzYXZ7lONI,1120
10
10
  followthemoney/namespace.py,sha256=utggu9IGA8bhgEYom3OUB1KxkAJR_TrMNbY5MUF_db8,4536
11
11
  followthemoney/ontology.py,sha256=WWY_PYQGl5Ket4zZBuZglzQxD2Bh9UqHok6GJNNX7GA,3001
12
- followthemoney/property.py,sha256=9qZ_o2iA-1llLMJ3O2hsW7c2XhkFU1YbvVqretGYUSA,7913
13
- followthemoney/proxy.py,sha256=5pMyP0JWWuBcvMIu3AXlW6Za7EEWWdFD2EZkD8UkbQw,19703
12
+ followthemoney/property.py,sha256=1w7p9aKLxRqFRnl3PlssqmvulSErl_0D5T2SefT3UFU,8675
13
+ followthemoney/proxy.py,sha256=ZD8jK88oj1aUTpF7s6r91g8tmTiEfubUKX7CGV5I9rE,20714
14
14
  followthemoney/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- followthemoney/schema.py,sha256=WYnPE4Lego0pJHlojECEv0aO9Miw_YIvEb35HoDo4Zk,18087
16
- followthemoney/util.py,sha256=LoCSp1iE6VwXjotCkBXFRppeQs55726GzOuNIu3CvRE,4409
15
+ followthemoney/schema.py,sha256=dwZg0eZF7yaxP9fJ5NQUKWadWZYTo9U-sVzzXZn_6do,18500
16
+ followthemoney/settings.py,sha256=wkwrkDPypsAICLo-d7l-zpKrKe_fTVYPllZO-RX3oGM,507
17
+ followthemoney/util.py,sha256=JCZ35h_qrqxWO1FTxpa0eoOiko6DWTD9u1QKmH5ZaLU,4150
17
18
  followthemoney/value.py,sha256=BJ4Sj5Tg2kMrslR6FjQUr96d8Kt75U7ny9NgzVGT0ZE,2335
18
19
  followthemoney/cli/__init__.py,sha256=0mmz84uhXRp2qUn3syKnDXofU3MMAAe291s7htqX0Bg,187
19
20
  followthemoney/cli/aggregate.py,sha256=xQTFpU3cVVj7fplpX4OJVrRlTVpn6b9kBr_Vb87pKfg,2164
@@ -26,7 +27,7 @@ followthemoney/cli/util.py,sha256=C3nGMVY3-9JHSFLn3AGvTNcAdvGcgfFS-7jXIzKg6Ik,47
26
27
  followthemoney/dataset/__init__.py,sha256=rOKsI39dccDaYcSa7ASoNKkhmbFYUArxMCRqtrxy2iE,477
27
28
  followthemoney/dataset/catalog.py,sha256=bIpxr0jvJeutNSmCaXREQac7TyvZak2Y_QoCFdCM0d4,3001
28
29
  followthemoney/dataset/coverage.py,sha256=rBnKs7VngCtIuaDqrF5D0ygCHg8NAMkYbmtl7336PSI,724
29
- followthemoney/dataset/dataset.py,sha256=wWUzWsdzDW9qXLy8lS6Bpy08WMcaNU30oiMXU8jfo14,4724
30
+ followthemoney/dataset/dataset.py,sha256=7lP3gz94AAaxX6J7OWlNmvPoWkoKvH7ISwoNqYsC4Go,5495
30
31
  followthemoney/dataset/publisher.py,sha256=nexZe9XexV8WI5Id999vf5OH_DPUmiKQ_GT3c59eF44,893
31
32
  followthemoney/dataset/resource.py,sha256=S_-tNjMwHQ8LcSOsZO_xhXD-vLK90wyxtIRBbyCJ0Xo,1164
32
33
  followthemoney/dataset/util.py,sha256=mfVTXdbNnWly6cXo4SjNzHuJK1c1uNBwULYOVg1gK5I,1617
@@ -38,7 +39,7 @@ followthemoney/export/graph.py,sha256=v0z1FgadyFk5aQ0A5q8E9R4fSO-Tpi5JU9YTDwnRKD
38
39
  followthemoney/export/neo4j.py,sha256=4Lih9lt3-5ATERhyMcfJfkiETG3tqj9vY4N9s7jiYmw,7049
39
40
  followthemoney/export/rdf.py,sha256=BOd4AIAVobwpmJ5GjyIqn9ZQHUwKQ-3fMdnD-Lcid0s,2978
40
41
  followthemoney/mapping/__init__.py,sha256=iwNqzzvrzJNbNDlOCaDLlBTUrNTlnYHIB5cvo_-9oN4,82
41
- followthemoney/mapping/csv.py,sha256=1eqQk1tn5JSEcr4rrv44XdT5biUk7J0E275uvUNoOrA,3125
42
+ followthemoney/mapping/csv.py,sha256=bRaqFsr02DNBUZBj-GIBzJOaumnIRu8QbNlYWOMqjHU,3238
42
43
  followthemoney/mapping/entity.py,sha256=-x_VBHiVthIrZZ-PVKD3oBAq6LYcsyeYW-9TFv80k7M,5905
43
44
  followthemoney/mapping/property.py,sha256=41V16HJh6da7oKdSJWyRcyMkx2XFd6iDm9-4PH7Wihw,5036
44
45
  followthemoney/mapping/query.py,sha256=8M6bOlEX2p_bbVwEwTu_1slEtU0cfRJB7ajZp-F07CE,2622
@@ -54,12 +55,12 @@ followthemoney/schema/Audio.yaml,sha256=Eb1rZGUEOX7XDAj_1YIN28NCBzMvkopQBNwgHt_k
54
55
  followthemoney/schema/BankAccount.yaml,sha256=60v-VD296lW1Qq7fx--CzxfPNwfCcyMV6xIl8OrSy5g,1431
55
56
  followthemoney/schema/Call.yaml,sha256=kbVCnVxucBrEplxehXHThLSJAJjy_GhWan-IeZZjr0M,980
56
57
  followthemoney/schema/CallForTenders.yaml,sha256=2IWonTzfSbrkynMoEWqv5fekUeFM_xDKpKIbRe1XDbo,3227
57
- followthemoney/schema/Company.yaml,sha256=qWhk6HoSlep6oEjviXoV9ACTnfo7WZ5DSDvAkXMaQ5M,3455
58
+ followthemoney/schema/Company.yaml,sha256=R2reqGWtCtURvIAvVB8lRQqGiGPXqjSNdkSWrXLY26w,3546
58
59
  followthemoney/schema/Contract.yaml,sha256=aSPB64T1h-0nuLDv6krasUvvoPZgo6sWUbv60c3vmzI,1541
59
60
  followthemoney/schema/ContractAward.yaml,sha256=b2spaZHYCaP1yR1RCsrI7mUjk-fAF7BUE3dc8Vl3cUQ,1689
60
61
  followthemoney/schema/CourtCase.yaml,sha256=lcovnY0Ne_xcggvkqfCW_RHvsRKo8kFTCPCyovAXRtI,599
61
62
  followthemoney/schema/CourtCaseParty.yaml,sha256=MpodN2251V_MYD2dBOHZ_qD7Uv6cLg8Gd_b-I8HZjPI,588
62
- followthemoney/schema/CryptoWallet.yaml,sha256=dhUpPf1eONsyzyORXoo_zFXgn0BuSLB4OKj2sHZ5wzA,1069
63
+ followthemoney/schema/CryptoWallet.yaml,sha256=haae5h-b8qNBh9FQB2clBUqNYpdLoyyI_NEWMxe3tZ8,1192
63
64
  followthemoney/schema/Debt.yaml,sha256=gSGl1xKPaPWAYYEcX7MxezVn3Gu-CYBIzxGzMd9UTm4,657
64
65
  followthemoney/schema/Directorship.yaml,sha256=BMx2AQTLy5ta_lWPnYKj7LFjZWTwtu1hgWncISdKf28,773
65
66
  followthemoney/schema/Document.yaml,sha256=JxoYl_2o-ebVXh5MzRIKEHfV3q_E--wXGO2HG7zBaZg,2646
@@ -72,29 +73,29 @@ followthemoney/schema/Family.yaml,sha256=cgZ7ZM_2p_dzUGrLVj8QL86gpeDM-AoK8AbyHjh
72
73
  followthemoney/schema/Folder.yaml,sha256=W12iJHTYua7bF7oTpgiDbarEkfa0Q2gSmfLdl537HQY,180
73
74
  followthemoney/schema/HyperText.yaml,sha256=Wg5dWeLrVjbXiI-ao69tosJ7rI0DvNU8cCo8AhUXwh4,319
74
75
  followthemoney/schema/Identification.yaml,sha256=6txjZs6-3Kn94c3G4tDeDt9Jb4FW55-xjSnYVrvmiEA,853
75
- followthemoney/schema/Image.yaml,sha256=wuznboWECGiV96_GQiXq1-oKNoxO8zKisR4xyusnEn8,394
76
+ followthemoney/schema/Image.yaml,sha256=5fjTy46LqzoybJlPs79RAaBuI-9_i6y77419KGiGOTM,753
76
77
  followthemoney/schema/Interest.yaml,sha256=VUrehmsN1WgtS1oAa5jn_JGtSkZGGYLGNahp-R5JhOQ,282
77
78
  followthemoney/schema/Interval.yaml,sha256=8YJQ51GI-GxvbjYs3uC593kQtCepWW_7ZiNnlbPm2aM,2084
78
- followthemoney/schema/LegalEntity.yaml,sha256=586aA1F5CO8rwf49LG3_iobm13zM4O21gL_TONte8oM,5054
79
+ followthemoney/schema/LegalEntity.yaml,sha256=cG-o0slUnQNoJsrgQuk_CaFA_bschjalHHPl-zoKRPA,5352
79
80
  followthemoney/schema/License.yaml,sha256=bXESXY-JpSmc5sthZe4sssXhx50UoLPAMED9FvEUyRU,534
80
81
  followthemoney/schema/Membership.yaml,sha256=IPmaOX4Ai2r4sGcA5ig2WmLvWHb38akdxp4smEdDWOE,710
81
82
  followthemoney/schema/Mention.yaml,sha256=nBeulR_Jm4x75aJ7yNF0TAVhHJqXQaEzOutLIn_YU-4,1086
82
83
  followthemoney/schema/Message.yaml,sha256=PAxZ2NRFVvnOlp9Ohh5fJDEThjJ0jm3M2YCbJ9KtMuE,1565
83
84
  followthemoney/schema/Note.yaml,sha256=NohwtFupxIssZuEgQowiQWqKit4uQ-OatAu3yp9eJj4,411
84
85
  followthemoney/schema/Occupancy.yaml,sha256=WojlqzuWao84MJxRE9K6a-1D-Jtu78-0h6laODhdKw8,975
85
- followthemoney/schema/Organization.yaml,sha256=wPXU1ni0-3QzvttDq-gIjbAYHzcWoo3nsLGLw6cnHKI,1064
86
+ followthemoney/schema/Organization.yaml,sha256=Dl6cFDBVFaQfiZrqnaeZAVNvGUiAtj7F4v_ZLxVtPCM,1155
86
87
  followthemoney/schema/Ownership.yaml,sha256=tLWESE9VX0aUuhe6C1pToq2-auPVZBdE3xvBmTRfmPc,1057
87
88
  followthemoney/schema/Package.yaml,sha256=gPr-P3lcg7OOAav_KVa8baK4yK57JwfcXwxXheD96UQ,310
88
89
  followthemoney/schema/Page.yaml,sha256=YjYqaH2sOry0z4xh44CsX_eyuRClD6ZS0d2o2uQXFbo,1062
89
90
  followthemoney/schema/Pages.yaml,sha256=KKPGZ06Ehp5mWIGnYfHUBN9jT03bk8nakw0pB5bA_7E,450
90
91
  followthemoney/schema/Passport.yaml,sha256=rpuLC86sdXnHF-prFQM4mAqYzlSGWKvPE4Cphtn2KRw,805
91
92
  followthemoney/schema/Payment.yaml,sha256=WRBJuj9ljsxLBs-0g9Z9UD87uR1RTtuUiYnWOnKr1qA,1757
92
- followthemoney/schema/Person.yaml,sha256=wS_URvex5pG_P5cv0UPafpaz3Jh9Z7CxHZjb3GwB85k,2798
93
+ followthemoney/schema/Person.yaml,sha256=eFvXYhXbJ9RlhCeX0a0Fv6p_67JD9lMdBAJImZiSzMU,2864
93
94
  followthemoney/schema/PlainText.yaml,sha256=hfnVi-HmQeDbqDquSpkPJax9hNm86ioXGr4hzNzyPFE,278
94
95
  followthemoney/schema/Position.yaml,sha256=ZpxjWOLxwva_on32r9WD5ys0Ty3YxCju41mg9HG-pe0,1308
95
96
  followthemoney/schema/Project.yaml,sha256=2svtyGJopS0UrqPiuYGpBzj30V7k3LRDX4N1U56y4yY,462
96
97
  followthemoney/schema/ProjectParticipant.yaml,sha256=xNehEu90uqUfboNouezhZQ8ZQLxzWq1yyNO4kua-Lyc,727
97
- followthemoney/schema/PublicBody.yaml,sha256=BNfLBqH1OapoEninAjWmqZx_n-G5QUnzzydW7300TiY,301
98
+ followthemoney/schema/PublicBody.yaml,sha256=N_3-dFNsilHxgIjkq60049PKX46wP0PvP7y9uDpnlwo,367
98
99
  followthemoney/schema/RealEstate.yaml,sha256=NWFHXqEHskYQN-kvQESZpu74nztShqoYSZEjZAr-DHM,1363
99
100
  followthemoney/schema/Representation.yaml,sha256=sCvFnUDQaElq2cqSB0rILcMYb2gaMZqlzxlHxyX9IGg,792
100
101
  followthemoney/schema/Risk.yaml,sha256=2BRVBqb6wiLHxb_V50P-YMAOhjC64UVHDyh5PASpCIA,728
@@ -104,7 +105,7 @@ followthemoney/schema/Similar.yaml,sha256=gD8rZEaPQWzU-rEfsKdn62uEucF3KxYBcPMoSd
104
105
  followthemoney/schema/Succession.yaml,sha256=RMJQqZ4Fv88N1RvWTAgjYg9BB5cELSj5CCAjM681Fpg,749
105
106
  followthemoney/schema/Table.yaml,sha256=GcsIAgSO9t2tvObA9zU2HhxlSqTe9CePmUnagu1Z0vI,641
106
107
  followthemoney/schema/TaxRoll.yaml,sha256=ugMzaaS7uyq2OLD50eGLcfvd6Cg0cSt65-T9GVqpRSA,746
107
- followthemoney/schema/Thing.yaml,sha256=hh1oMDQzWiSs1TamBNonmwEdlh2TVrNc3w9hWW8iSeY,2716
108
+ followthemoney/schema/Thing.yaml,sha256=iUaGvGRBqhsVUg-Cx_CNw9WewlWsl9vylU2wiFDQ1qg,2975
108
109
  followthemoney/schema/Trip.yaml,sha256=nLQD_ApmVJ8D56Czl7K700hhNZjzFV9FOQ3NBSQDLiM,771
109
110
  followthemoney/schema/UnknownLink.yaml,sha256=lneS_HZNgeLyJxwzWnLx0ZoyY3MXt99I_K2X_o9z5g8,682
110
111
  followthemoney/schema/UserAccount.yaml,sha256=2bbPKNtt1R3zWSSkaq_SVzRPfFzX74kAxwtIxTymHA8,840
@@ -114,10 +115,10 @@ followthemoney/schema/Vessel.yaml,sha256=zWHUfSK8g6Pz58ZyCaK0AFJ4u_UHjEIUGC4c_7o
114
115
  followthemoney/schema/Video.yaml,sha256=LY3DYMWTHXiAhL0hxBCNCz50cp2sPbUlEhhig5Fbjos,327
115
116
  followthemoney/schema/Workbook.yaml,sha256=iikWPElz4klA7SkWH7eae6xqhbkMCIP_3zdeXzFEMU0,354
116
117
  followthemoney/statement/__init__.py,sha256=7m2VUCAuqNZXIY0WFJRFkw5UG14QuxATL4f_xbqKwhw,633
117
- followthemoney/statement/entity.py,sha256=oeudwhqfYLJKqbzxEydasMHqevkDASNyYN6s0yddW6I,18755
118
- followthemoney/statement/serialize.py,sha256=9eXzQ1biR2mSxWRID5C7xDdku4b4ZImHeRJ53yLZ0yo,7225
119
- followthemoney/statement/statement.py,sha256=Ae-EYuzS8S12BkaRqrvMuI1C7YwlRKa5C_pTBELyNMM,8029
120
- followthemoney/statement/util.py,sha256=B-ozuRc1TWvpop52873Pqt5OPj8H6uk4KyRJLfAhr10,780
118
+ followthemoney/statement/entity.py,sha256=vznbPTMSWcezYt--bu2RretMresgwp-bUqCsv4w-U90,19568
119
+ followthemoney/statement/serialize.py,sha256=PcG2Qf1jYcF_rF1YybYWBhX7NiX6WZ94u1WUv9Mh-Lw,7386
120
+ followthemoney/statement/statement.py,sha256=bAwrrKyYRdJVxRGuXDQIOA7cdEngk1NKUaij_gAwSd4,11876
121
+ followthemoney/statement/util.py,sha256=jHBwK3FIBynUJZRlBBOHayalAFrqpXf2f2JwkHi0zAU,1450
121
122
  followthemoney/translations/messages.pot,sha256=JhtY9NJ9wP_EAX4APxOqMyvKcX53oIC9kAxBsliJkf4,107703
122
123
  followthemoney/translations/ar/LC_MESSAGES/followthemoney.mo,sha256=uhb2crSNh8K2ts_QUeD2wvgWgzzpLJWRzXok-Uyx3Zk,38795
123
124
  followthemoney/translations/ar/LC_MESSAGES/followthemoney.po,sha256=DuIfvR5v0sPGwFbeg3y6_jCbeglvHWXQ2LDH6prfwLc,121326
@@ -142,27 +143,27 @@ followthemoney/translations/ru/LC_MESSAGES/followthemoney.po,sha256=7SQWytOTvoAQ
142
143
  followthemoney/translations/tr/LC_MESSAGES/followthemoney.mo,sha256=SC84e_ZF_oFJG1NKdyZY_W6Kb6POORZB6wdeAcEWmnE,487
143
144
  followthemoney/translations/tr/LC_MESSAGES/followthemoney.po,sha256=AZC3marhtVVq8Ck1FOgnt4sbDMz548nX48O9GDwImbQ,89826
144
145
  followthemoney/types/__init__.py,sha256=rWwQeiuMh2BNIuvhpMfJ4bPADDvt9Axu1eedvNFi0qY,3350
145
- followthemoney/types/address.py,sha256=KsKLa9H8FfSkYF8VGslRnt-miGeni1rKICS8t1rzfzo,2235
146
- followthemoney/types/checksum.py,sha256=zZrU8WX4CY3Vta_vOyfgDNzIwbmtje7AaDv3O1fBMnk,823
146
+ followthemoney/types/address.py,sha256=Gc-hqz00dRRkeANqkyPD2wtt7ksR9wMf4CX-U-5XvMo,2214
147
+ followthemoney/types/checksum.py,sha256=_0ev2Wwtd4iX_bLz0Lu-xcJIxNfH_V9kBKKtuZhoAwg,802
147
148
  followthemoney/types/common.py,sha256=4ks7zPT8rknrGSd4JFc1zRkS-TL4SX-25_ZbjcVDos0,10081
148
- followthemoney/types/country.py,sha256=n8vihijDVud_3Ra-as4Ize0jf_HbcdKVR5YX3TlKZy0,1533
149
- followthemoney/types/date.py,sha256=PjcaEyW6CBzf0-gHWKUsKjWIaD3AVBEl0zLSRQOVXxc,3105
149
+ followthemoney/types/country.py,sha256=pwDiI_ipts9Oi2U7fHALYMJPCJHOqyI_2Liq7XI2XrA,2086
150
+ followthemoney/types/date.py,sha256=SGk8q8qICIrA5Lf6wPbDU6v6oJYEiu1dZFZ18BO7i80,3551
150
151
  followthemoney/types/email.py,sha256=L3RTYrMABlNQF7hCynXGfzoj6YNEHW5JAY_BwuhoZdA,3375
151
- followthemoney/types/entity.py,sha256=oDxVEhuxyU1ScpOpebPpUm3o0I9j_p7Qrq-t5yNpluQ,2338
152
- followthemoney/types/gender.py,sha256=fi9iKLbjAUxDCLBtU1MxWidxv7KgCY2eH5746FYlEGk,1725
153
- followthemoney/types/identifier.py,sha256=hzD188FtwG0w3TcmbnDwnUMc8MZVcWgQJKGAvrwygc4,2296
154
- followthemoney/types/ip.py,sha256=mMFTODFiXAJROCUYJvoLAShyIiTIWVmMBh5zT_GquYM,1300
155
- followthemoney/types/json.py,sha256=V3qJD5RxJykNX51u3w1Nx9xqoNBnkulhzkJI9XMYKFo,1690
156
- followthemoney/types/language.py,sha256=SXgRRH-DyPmyyrqYurSyMiG6WHB8a0Gw81XxroEGD-c,2747
157
- followthemoney/types/mimetype.py,sha256=NdpqVLx3Bre_myYvnbjmdd5wZBf01tllrbhegjO8_m0,1263
158
- followthemoney/types/name.py,sha256=ZWGDebv01qByh_yBYOVoS3Edlm3_JVPShQMklKc6ZOA,2384
159
- followthemoney/types/number.py,sha256=OdVuHDd4IYIIHhx_317JKeMjBAGtsJ2TAcxoZKZ4MkY,3948
160
- followthemoney/types/phone.py,sha256=r8uRqWinS0CYnYBTs405k5gO4jeatUDgjdzzijoMKJE,3811
161
- followthemoney/types/string.py,sha256=fqyTauAm4mNnNaoH-yH087RBbNh-G5ZZUO3awTGQUUg,1230
162
- followthemoney/types/topic.py,sha256=Mi0Gx0m3bDeTmyuvM6jdRMqv81O03U4eI99R13KGu2Y,4503
163
- followthemoney/types/url.py,sha256=QFpS_JIV8unFHuh_uGv22SWUUkocBoOpzLsAJWom_gI,1455
164
- followthemoney-4.3.0.dist-info/METADATA,sha256=dyrwBXiefNsSpmwOcsP-TsEnJBqmn9DY9vJsMhFVwk0,6748
165
- followthemoney-4.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
166
- followthemoney-4.3.0.dist-info/entry_points.txt,sha256=caoFTlf213jhg5sz3TNSofutjUTzaKtWATuSIdd9Cps,653
167
- followthemoney-4.3.0.dist-info/licenses/LICENSE,sha256=H6_EVXisnJC0-18CjXIaqrBSFq_VH3OnS7u3dccOv6g,1148
168
- followthemoney-4.3.0.dist-info/RECORD,,
152
+ followthemoney/types/entity.py,sha256=56h6x8Ct7hWZIC3BjZHmRKGy9Ff2vuULNWH3xDRsKiU,2317
153
+ followthemoney/types/gender.py,sha256=XY9us98Sk25O1xnHN-88tbv9pHy6Mn7SR8GRYi6v5gI,1683
154
+ followthemoney/types/identifier.py,sha256=TYJwE7urjHFxEcDuiZMxGoCN6n34rAIdCt5_96Y7vI0,2198
155
+ followthemoney/types/ip.py,sha256=rCXkRrh_jDeWAhswCgSe6Z4uhIW7yvLAxIEw4x1SM3A,1279
156
+ followthemoney/types/json.py,sha256=Hefwns1-ziJf310MWvdfX5ICkOgj9cnnMJuqq1e6qKY,1676
157
+ followthemoney/types/language.py,sha256=ymEXaHAPIZGlGySUqzadB7tMB6mW1ASsl1G6EtqKdls,2730
158
+ followthemoney/types/mimetype.py,sha256=oqVP8EfGckPAI3WAziHomp6oUN7KXdIPWzGZPsRtIA8,1242
159
+ followthemoney/types/name.py,sha256=zd0aC4VGp1SYUI8Rj0-ZXlrpUI7ZcnJIljZqsEsV-CY,2363
160
+ followthemoney/types/number.py,sha256=vpAyhmc7UQlIm8h7Z5k8k4cTk37ykRF-AgYA1r_g1QQ,3934
161
+ followthemoney/types/phone.py,sha256=_HanfxxTV7jp75gZO2evBc9HWwQTxEMQRaoVDcoXDIQ,3790
162
+ followthemoney/types/string.py,sha256=SEh3xqQCnm377PGvwfR6ao85pHJCNeCUWBKnvccrJ7I,1216
163
+ followthemoney/types/topic.py,sha256=9FIH_WmwVOFg1CJRBF4KeE6vNTn-QQkzsKU5XaMqNJ0,4604
164
+ followthemoney/types/url.py,sha256=sSHKtzvm4kc-VTvNCPIDykOG1hUoawhORj6Bklo0a2A,1434
165
+ followthemoney-4.5.0.dist-info/METADATA,sha256=dteJlaqiJHM7Du9BTLMiOgl-DEjNp2ewkkFU8nMcCYA,6747
166
+ followthemoney-4.5.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
167
+ followthemoney-4.5.0.dist-info/entry_points.txt,sha256=caoFTlf213jhg5sz3TNSofutjUTzaKtWATuSIdd9Cps,653
168
+ followthemoney-4.5.0.dist-info/licenses/LICENSE,sha256=H6_EVXisnJC0-18CjXIaqrBSFq_VH3OnS7u3dccOv6g,1148
169
+ followthemoney-4.5.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any