followthemoney 3.8.4__py3-none-any.whl → 4.0.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 (84) hide show
  1. followthemoney/__init__.py +30 -10
  2. followthemoney/cli/__init__.py +3 -12
  3. followthemoney/cli/aggregate.py +1 -1
  4. followthemoney/cli/cli.py +1 -1
  5. followthemoney/cli/exports.py +6 -2
  6. followthemoney/cli/mapping.py +6 -4
  7. followthemoney/cli/sieve.py +1 -1
  8. followthemoney/cli/statement.py +62 -0
  9. followthemoney/cli/util.py +2 -3
  10. followthemoney/compare.py +26 -16
  11. followthemoney/dataset/__init__.py +17 -0
  12. followthemoney/dataset/catalog.py +77 -0
  13. followthemoney/dataset/coverage.py +29 -0
  14. followthemoney/dataset/dataset.py +137 -0
  15. followthemoney/dataset/publisher.py +25 -0
  16. followthemoney/dataset/resource.py +30 -0
  17. followthemoney/dataset/util.py +58 -0
  18. followthemoney/entity.py +73 -0
  19. followthemoney/exc.py +6 -0
  20. followthemoney/export/common.py +3 -3
  21. followthemoney/export/csv.py +10 -12
  22. followthemoney/export/neo4j.py +1 -1
  23. followthemoney/export/rdf.py +57 -5
  24. followthemoney/graph.py +6 -4
  25. followthemoney/mapping/csv.py +6 -18
  26. followthemoney/mapping/sql.py +3 -4
  27. followthemoney/model.py +36 -9
  28. followthemoney/namespace.py +3 -1
  29. followthemoney/ontology.py +18 -16
  30. followthemoney/property.py +12 -15
  31. followthemoney/proxy.py +44 -65
  32. followthemoney/schema/Analyzable.yaml +2 -3
  33. followthemoney/schema/BankAccount.yaml +2 -3
  34. followthemoney/schema/Company.yaml +0 -6
  35. followthemoney/schema/Contract.yaml +0 -1
  36. followthemoney/schema/CryptoWallet.yaml +1 -1
  37. followthemoney/schema/Document.yaml +0 -6
  38. followthemoney/schema/Interval.yaml +7 -0
  39. followthemoney/schema/LegalEntity.yaml +6 -0
  40. followthemoney/schema/License.yaml +2 -0
  41. followthemoney/schema/Page.yaml +0 -1
  42. followthemoney/schema/Person.yaml +0 -5
  43. followthemoney/schema/Sanction.yaml +1 -0
  44. followthemoney/schema/Thing.yaml +0 -2
  45. followthemoney/schema/UserAccount.yaml +6 -3
  46. followthemoney/schema.py +27 -39
  47. followthemoney/statement/__init__.py +19 -0
  48. followthemoney/statement/entity.py +437 -0
  49. followthemoney/statement/serialize.py +245 -0
  50. followthemoney/statement/statement.py +256 -0
  51. followthemoney/statement/util.py +31 -0
  52. followthemoney/types/__init__.py +66 -23
  53. followthemoney/types/address.py +3 -3
  54. followthemoney/types/checksum.py +3 -7
  55. followthemoney/types/common.py +9 -14
  56. followthemoney/types/country.py +3 -7
  57. followthemoney/types/date.py +21 -11
  58. followthemoney/types/email.py +0 -4
  59. followthemoney/types/entity.py +5 -11
  60. followthemoney/types/gender.py +6 -10
  61. followthemoney/types/identifier.py +9 -3
  62. followthemoney/types/ip.py +5 -9
  63. followthemoney/types/json.py +2 -2
  64. followthemoney/types/language.py +3 -7
  65. followthemoney/types/mimetype.py +4 -8
  66. followthemoney/types/name.py +7 -8
  67. followthemoney/types/number.py +88 -6
  68. followthemoney/types/phone.py +4 -11
  69. followthemoney/types/string.py +4 -4
  70. followthemoney/types/topic.py +3 -7
  71. followthemoney/types/url.py +5 -10
  72. followthemoney/util.py +12 -13
  73. followthemoney/value.py +67 -0
  74. {followthemoney-3.8.4.dist-info → followthemoney-4.0.0.dist-info}/METADATA +38 -34
  75. {followthemoney-3.8.4.dist-info → followthemoney-4.0.0.dist-info}/RECORD +78 -69
  76. {followthemoney-3.8.4.dist-info → followthemoney-4.0.0.dist-info}/entry_points.txt +1 -0
  77. {followthemoney-3.8.4.dist-info → followthemoney-4.0.0.dist-info}/licenses/LICENSE +1 -0
  78. followthemoney/offshore.py +0 -48
  79. followthemoney/rdf.py +0 -9
  80. followthemoney/schema/Assessment.yaml +0 -32
  81. followthemoney/schema/Post.yaml +0 -42
  82. followthemoney/types/iban.py +0 -58
  83. followthemoney/types/registry.py +0 -52
  84. {followthemoney-3.8.4.dist-info → followthemoney-4.0.0.dist-info}/WHEEL +0 -0
@@ -2,8 +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.rdf import URIRef, Identifier
6
- from followthemoney.util import dampen, defer as _
5
+ from followthemoney.util import const, dampen, defer as _
7
6
 
8
7
  if TYPE_CHECKING:
9
8
  from followthemoney.proxy import EntityProxy
@@ -17,8 +16,8 @@ class UrlType(PropertyType):
17
16
  SCHEMES = ("http", "https", "ftp", "mailto")
18
17
  DEFAULT_SCHEME = "http"
19
18
 
20
- name = "url"
21
- group = "urls"
19
+ name = const("url")
20
+ group = const("urls")
22
21
  label = _("URL")
23
22
  plural = _("URLs")
24
23
  matchable = True
@@ -37,13 +36,9 @@ class UrlType(PropertyType):
37
36
  return clean_url(text)
38
37
 
39
38
  def compare(self, left: str, right: str) -> float:
39
+ """Compare two URLs and return a float indicating how similar they are. This ignores
40
+ fragments and peforms hard URL normalisation."""
40
41
  return compare_urls(left, right)
41
42
 
42
43
  def _specificity(self, value: str) -> float:
43
44
  return dampen(10, 120, value)
44
-
45
- def rdf(self, value: str) -> Identifier:
46
- return URIRef(value)
47
-
48
- def node_id(self, value: str) -> Optional[str]:
49
- return f"url:{value}"
followthemoney/util.py CHANGED
@@ -1,11 +1,12 @@
1
1
  import os
2
+ import sys
2
3
  import logging
3
4
  from hashlib import sha1
4
5
  from babel import Locale
5
6
  from gettext import translation
6
7
 
7
8
  from threading import local
8
- from typing import cast, Dict, Any, List, Optional, TypeVar, Union, Sequence
9
+ from typing import cast, Dict, Any, List, Optional, TypeVar, Union
9
10
  from normality import stringify
10
11
  from normality.cleaning import compose_nfc
11
12
  from normality.cleaning import remove_unsafe_chars
@@ -36,6 +37,11 @@ def defer(text: str) -> str:
36
37
  return text
37
38
 
38
39
 
40
+ def const(text: str) -> str:
41
+ """Convert the given text to a runtime constant."""
42
+ return sys.intern(text.strip())
43
+
44
+
39
45
  def set_model_locale(locale: Locale) -> None:
40
46
  state.locale = locale
41
47
  state.translation = translation(
@@ -58,12 +64,14 @@ def get_env_list(name: str, default: List[str] = []) -> List[str]:
58
64
  return default
59
65
 
60
66
 
61
- def sanitize_text(text: Any, encoding: str = DEFAULT_ENCODING) -> Optional[str]:
62
- text = stringify(text, encoding_default=encoding)
67
+ def sanitize_text(value: Any, encoding: str = DEFAULT_ENCODING) -> Optional[str]:
68
+ text = stringify(value, encoding_default=encoding)
63
69
  if text is None:
64
70
  return None
65
71
  try:
66
72
  text = compose_nfc(text)
73
+ if text is None:
74
+ return None
67
75
  except (SystemError, Exception) as ex:
68
76
  log.warning("Cannot NFC text: %s", ex)
69
77
  return None
@@ -71,16 +79,7 @@ def sanitize_text(text: Any, encoding: str = DEFAULT_ENCODING) -> Optional[str]:
71
79
  if text is None:
72
80
  return None
73
81
  byte_text = text.encode(DEFAULT_ENCODING, "replace")
74
- return cast(str, byte_text.decode(DEFAULT_ENCODING, "replace"))
75
-
76
-
77
- def value_list(value: Union[T, Sequence[T]]) -> List[T]:
78
- if not isinstance(value, (str, bytes)):
79
- try:
80
- return [v for v in cast(Sequence[T], value)]
81
- except TypeError:
82
- pass
83
- return [cast(T, value)]
82
+ return byte_text.decode(DEFAULT_ENCODING, "replace")
84
83
 
85
84
 
86
85
  def key_bytes(key: Any) -> bytes:
@@ -0,0 +1,67 @@
1
+ from typing import Any, List, Mapping, Sequence, Set, Union
2
+ from datetime import datetime, date, timezone
3
+ import typing
4
+ from prefixdate import DatePrefix
5
+
6
+ from followthemoney.util import sanitize_text
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from followthemoney.proxy import EntityProxy
10
+
11
+ Value = Union[str, int, float, bool, date, datetime, DatePrefix, None, "EntityProxy"]
12
+ Values = Union[Value, Sequence[Value], Set[Value]]
13
+
14
+
15
+ def string_list(value: Any, sanitize: bool = False) -> List[str]:
16
+ """Convert a value - which may be a list or set - to a list of strings."""
17
+ # This function is called in the inner loop of placing values into entities,
18
+ # so it's unrolled to avoid the overhead of a comparatively heavy ops like
19
+ # `isinstance`.
20
+ if value is None:
21
+ return []
22
+ type_ = type(value)
23
+ if type_ is str:
24
+ if sanitize:
25
+ value = sanitize_text(value)
26
+ if value is None:
27
+ return []
28
+ return [value] if len(value) > 0 else []
29
+ if type_ is int:
30
+ return [str(value)]
31
+ if type_ is float:
32
+ return [f"{value:.2f}"]
33
+ if type_ is bool:
34
+ return ["true" if value else "false"]
35
+ if type_ is date:
36
+ return [value.isoformat()]
37
+ if type_ is datetime:
38
+ if value.tzinfo is not None:
39
+ value = value.astimezone(tz=timezone.utc)
40
+ return [value.isoformat()]
41
+ if type_ is set or type_ is list or type_ is tuple:
42
+ texts: List[str] = []
43
+ for inner in value:
44
+ texts.extend(string_list(inner, sanitize=sanitize))
45
+ return texts
46
+ if isinstance(value, DatePrefix):
47
+ return [value.text] if value.text else []
48
+ # EntityProxy
49
+ try:
50
+ return string_list(value.id, sanitize=sanitize)
51
+ except AttributeError:
52
+ pass
53
+ # Entity dict
54
+ if isinstance(value, Mapping):
55
+ return string_list(value.get("id"), sanitize=sanitize)
56
+ if isinstance(value, (str, bytes)):
57
+ # Handle sub-classes of str, bytes - always sanitize
58
+ text = sanitize_text(value)
59
+ if text is None:
60
+ return []
61
+ return [text]
62
+ if isinstance(value, Sequence):
63
+ stexts: List[str] = []
64
+ for inner in value:
65
+ stexts.extend(string_list(inner, sanitize=sanitize))
66
+ return stexts
67
+ raise TypeError("Cannot convert %r to string list" % value)
@@ -1,14 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: followthemoney
3
- Version: 3.8.4
3
+ Version: 4.0.0
4
4
  Summary: A data model for anti corruption data modeling and analysis.
5
5
  Project-URL: Documentation, https://followthemoney.tech/
6
- Project-URL: Repository, https://github.com/alephdata/followthemoney.git
7
- Project-URL: Issues, https://github.com/alephdata/followthemoney/issues
8
- Author-email: Organized Crime and Corruption Reporting Project <data@occrp.org>, OpenSanctions <info@opensanctions.org>
6
+ Project-URL: Repository, https://github.com/opensanctions/followthemoney.git
7
+ Project-URL: Issues, https://github.com/opensanctions/followthemoney/issues
8
+ Author-email: OpenSanctions <info@opensanctions.org>, DARC <hi@dataresearchcenter.org>
9
9
  License: MIT License
10
10
 
11
11
  Copyright (c) 2017-2024 Journalism Development Network, Inc.
12
+ Copyright (c) 2025 OpenSanctions Datenbanken GmbH
12
13
 
13
14
  Permission is hereby granted, free of charge, to any person obtaining a copy
14
15
  of this software and associated documentation files (the "Software"), to deal
@@ -39,21 +40,19 @@ Requires-Dist: babel<3.0.0,>=2.14.0
39
40
  Requires-Dist: banal<1.1.0,>=1.0.6
40
41
  Requires-Dist: click<9.0.0,>=8.0
41
42
  Requires-Dist: countrynames<2.0.0,>=1.13.0
42
- Requires-Dist: fingerprints<2.0.0,>=1.0.1
43
43
  Requires-Dist: networkx<3.5,>=2.5
44
- Requires-Dist: normality<3.0.0,>=2.4.0
44
+ Requires-Dist: normality<3.0.0,>=2.6.1
45
45
  Requires-Dist: openpyxl<4.0.0,>=3.0.5
46
- Requires-Dist: orjson<4.0,>=3.7
46
+ Requires-Dist: orjson<4.0,>=3.10.18
47
47
  Requires-Dist: phonenumbers<10.0.0,>=8.12.22
48
48
  Requires-Dist: prefixdate<1.0.0,>=0.4.0
49
+ Requires-Dist: pydantic<3.0.0,>=2.11.7
49
50
  Requires-Dist: pytz>=2021.1
50
51
  Requires-Dist: pyyaml<7.0.0,>=5.0.0
51
52
  Requires-Dist: rdflib<7.2.0,>=6.2.0
52
53
  Requires-Dist: requests<3.0.0,>=2.21.0
53
- Requires-Dist: rigour<1.0.0,>=0.11.1
54
- Requires-Dist: sqlalchemy2-stubs
55
- Requires-Dist: sqlalchemy<3.0.0,>=1.4.49
56
- Requires-Dist: types-pyyaml
54
+ Requires-Dist: rigour<2.0.0,>=1.0.0
55
+ Requires-Dist: sqlalchemy[mypy]<3.0.0,>=2.0.0
57
56
  Provides-Extra: dev
58
57
  Requires-Dist: build; extra == 'dev'
59
58
  Requires-Dist: bump2version; extra == 'dev'
@@ -72,21 +71,23 @@ Requires-Dist: types-pyyaml; extra == 'dev'
72
71
  Requires-Dist: types-requests; extra == 'dev'
73
72
  Requires-Dist: types-setuptools; extra == 'dev'
74
73
  Requires-Dist: wheel>=0.29.0; extra == 'dev'
74
+ Provides-Extra: docs
75
+ Requires-Dist: mkdocs-gen-files; extra == 'docs'
76
+ Requires-Dist: mkdocs-macros-plugin; extra == 'docs'
77
+ Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
78
+ Requires-Dist: mkdocs>=1.4.0; extra == 'docs'
79
+ Requires-Dist: mkdocstrings[python]; extra == 'docs'
75
80
  Description-Content-Type: text/markdown
76
81
 
77
82
  # Follow the Money
78
83
 
79
- [![ftm-build](https://github.com/alephdata/followthemoney/actions/workflows/build.yml/badge.svg)](https://github.com/alephdata/followthemoney/actions/workflows/build.yml)
84
+ [![ftm-build](https://github.com/opensanctions/followthemoney/actions/workflows/build.yml/badge.svg)](https://github.com/opensanctions/followthemoney/actions/workflows/build.yml)
80
85
 
81
- This repository contains a pragmatic data model for the entities most
82
- commonly used in investigative reporting: people, companies, assets,
83
- payments, court cases, etc.
86
+ This repository contains a pragmatic data model for the entities most commonly used in investigative reporting and financial crime investigations: people, companies, assets, payments, ownership relations, court cases, etc.
84
87
 
85
- The purpose of this is not to model reality in an ideal data model, but
86
- rather to have a working data structure for researchers.
88
+ The purpose of this is not to model reality in an ideal data model, but rather to have a working data structure for researchers. Complex legal considerations are simplified to allow for efficient data processing.
87
89
 
88
- `followthemoney` also contains code used to validate and normalize many
89
- of the elements of data, and to map tabular data into the model.
90
+ `followthemoney` also contains code used to validate and normalize many of the elements of data, and to map tabular data into the model.
90
91
 
91
92
  ## Documentation
92
93
 
@@ -102,14 +103,23 @@ transform data in various ways. You can find a tutorial here:
102
103
  Besides the introductions, there is also a full reference documentation for the
103
104
  library and the contained ontology:
104
105
 
105
- * https://followthemoney.tech/explorer/
106
+ * https://followthemoney.tech/explorer/schemata/
106
107
 
107
- There's also a number of viewers for the RDF schema definitions generated
108
- from FollowTheMoney, e.g.:
108
+ There's also a number of viewers for the RDF schema definitions generated from FollowTheMoney, eg:
109
109
 
110
- * [LODE documentation](http://150.146.207.114/lode/extract?url=https%3A%2F%2Falephdata.github.io%2Ffollowthemoney%2Fns%2Fftm.xml&owlapi=true&imported=true&lang=en)
111
- * [WebVOWL](https://service.tib.eu/webvowl/#iri=https://alephdata.github.io/followthemoney/ns/ftm.xml)
112
- * RDF/OWL specification in [XML](https://alephdata.github.io/followthemoney/ns/ftm.xml).
110
+ * [LODE documentation](http://150.146.207.114/lode/extract?url=https%3A%2F%2Ffollowthemoney.tech%2Fns%2Fftm.xml&owlapi=true&imported=true&lang=en)
111
+ * [WebVOWL](https://service.tib.eu/webvowl/#iri=https://followthemoney.tech/ns/ftm.xml)
112
+ * RDF/OWL specification in [XML](https://followthemoney.tech/ns/ftm.xml).
113
+
114
+ ## Installation
115
+
116
+ You can install `followthemomey` via PyPI like this:
117
+
118
+ ```bash
119
+ pip install followthemoney
120
+ ```
121
+
122
+ The most tricky dependency of `followthemoney` is `pyicu`, which helps us to perform certain text operations. Please [review their documentation](https://gitlab.pyicu.org/main/pyicu#installing-pyicu) if you run into any issues with ICU.
113
123
 
114
124
  ## Development environment
115
125
 
@@ -129,9 +139,7 @@ make test
129
139
 
130
140
  ## Releasing
131
141
 
132
- We release a lot of version of `followthemoney` because even small changes
133
- to the code base require a pypi release to begin being used in `aleph`. To
134
- this end, here's the steps for making a release:
142
+ We release a lot of version of `followthemoney` because even small changes to the code base require a pypi release to begin being used in downstream applications. To this end, here's the steps for making a release:
135
143
 
136
144
  ```bash
137
145
  git pull --rebase
@@ -142,10 +150,6 @@ bumpversion patch
142
150
  git push --atomic origin main $(git describe --tags --abbrev=0)
143
151
  ```
144
152
 
145
- This will create a new patch release and upload a distribution of it. If
146
- the changes are more significant, you can run `bumpversion` with the `minor`
147
- or `major` arguments.
153
+ This will create a new patch release and upload a distribution of it. If the changes are more significant, you can run `bumpversion` with the `minor` or `major` arguments.
148
154
 
149
- When the schema is updated, please update the docs, ideally including the
150
- diagrams. For the RDF namespace and JavaScript version of the model,
151
- run `make generate`.
155
+ When the schema is updated, please update the docs, ideally including the diagrams. For the RDF namespace and JavaScript version of the model, run `make generate`.
@@ -1,60 +1,67 @@
1
- followthemoney/__init__.py,sha256=7oKn-HF4NWWl-ZAFITBRDLydUFGKVOFnmSZH51hf9ak,360
2
- followthemoney/compare.py,sha256=1GFkCfTzA8QR0CH90kvySR8hvl9hQRUerW5Xw2Ivmpg,5134
3
- followthemoney/exc.py,sha256=ynZs_UnTVxHR-iBfat_CpVLraYzVX5yLtVf5Ti14hl4,734
4
- followthemoney/graph.py,sha256=VNDKrUBkz_-DmKsr5v-Xm8VfxzabnTwkU_MFk92_TjA,10848
1
+ followthemoney/__init__.py,sha256=mFh992fiqvWjdgnIxhapag40tIoj-V7qh9LdMv2JtCM,856
2
+ followthemoney/compare.py,sha256=rtITMzJOXLDOSj7yKPfOxFaknIu6kRpiLDIM22zakpI,5619
3
+ followthemoney/entity.py,sha256=GThAfNNZ4xdtvKTeue3GbtxCaBPngxhZDItpZnNHTtE,2932
4
+ followthemoney/exc.py,sha256=GyMgwY4QVm87hLevDfV7gM1MJsDqfNCi_UQw7F_A8X8,858
5
+ followthemoney/graph.py,sha256=7X1CGHGvmktS2LSZqld2iXWzG7B831eCNYyBqamqEJ8,10921
5
6
  followthemoney/helpers.py,sha256=Btb6BlHg_c-qCXZo-NP_LURKG-qu-QD3Fj1ev_c7Xic,7956
6
7
  followthemoney/messages.py,sha256=zUEa9CFecU8nRafIzhN6TKCh1kEihiIyIS1qr8PxY4g,806
7
- followthemoney/model.py,sha256=FBY6iSbfvsxdjwFlwhs234IbYtl_MwEeTTmoxIFBxC0,6485
8
- followthemoney/namespace.py,sha256=qYplxKn5OO3zDMf3NItKwTwDsJOnski5JbeyhssqhR8,4434
9
- followthemoney/offshore.py,sha256=Pf0tx-7GyhIZRueshDRqPNlxkHfGstmW5yNDID5Mnws,1060
10
- followthemoney/ontology.py,sha256=7PEoUKISNpkRvVhuLeE3IE9ZiNtdR8mn9_kzZ9yF9l0,2986
11
- followthemoney/property.py,sha256=zi9ss1v0e8Wmv-FuLtZd2aod5iTLfBekBxuOTgIOUMU,7718
12
- followthemoney/proxy.py,sha256=M7RIPF0k-P3v7GYKYhRVVaO1cnUf5FArJepE-2c0KMQ,20033
8
+ followthemoney/model.py,sha256=PD2Oh9B-tGZefB2IqogRDRTplbYZ0j3zgWl16YPEYgs,7396
9
+ followthemoney/namespace.py,sha256=cp7X8aGaZ8HHf7SOfHr2vJHPI2todz2DoyLdiZLNMyg,4472
10
+ followthemoney/ontology.py,sha256=WWY_PYQGl5Ket4zZBuZglzQxD2Bh9UqHok6GJNNX7GA,3001
11
+ followthemoney/property.py,sha256=RDTzTXJeeLFLptQL1_gr1S1T-vdDe-8MGMwsRaGQh0I,7665
12
+ followthemoney/proxy.py,sha256=Pj1GquUD7gdsM1fXb18QnYeT3E9N4ouhwJmPKNKd8ak,19605
13
13
  followthemoney/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- followthemoney/rdf.py,sha256=9wPs-tqN9QILuvrmH_YheNaFQctyIQqoIEqcS465QHs,343
15
- followthemoney/schema.py,sha256=Yqv11zhZXMOq1MjKQP44Ie8vIurDrSr5qlqRJEueLK4,18126
16
- followthemoney/util.py,sha256=6VR-T5-vT-8xpE6__Skrqe_MpE6y6csvNKERTJlsITA,4527
17
- followthemoney/cli/__init__.py,sha256=Fl05wMr5-FlOSMRpmu1HJSNfPRpy8u9as5IRbGXdo4U,421
18
- followthemoney/cli/aggregate.py,sha256=Gwfi5Bt1LCwqbpsCu4P1Cr-QJtCWhbaqgGEzfwJUUL4,2142
19
- followthemoney/cli/cli.py,sha256=yrPw2iyKY-E-uRWe6KN9W3ayvz-22vfpe_ZeD0RiI0c,3591
20
- followthemoney/cli/exports.py,sha256=HsTyIOz1KQSeObp9-9SKzSUBW158XOhpU5_Stv_2HWM,4016
21
- followthemoney/cli/mapping.py,sha256=aEl57en0zu57yMA2AU5y01U5Yyqo_42hkMlAdfIQP08,3284
22
- followthemoney/cli/sieve.py,sha256=Wh1UQxzyM9Gh60ooS4s4ydlW1b69bMzFM08tg8ttSIY,1940
23
- followthemoney/cli/util.py,sha256=CFcS-PEwpMasMWX_Yg283O_PaAhcPwkvahFNWc13C8c,4769
14
+ followthemoney/schema.py,sha256=8UMkpMK6LeFc-FW0uZkr08NnAN-p30_6thFpuug2Xdw,18127
15
+ followthemoney/util.py,sha256=DhhcRilSetZpzvCew56AE6zNwenW5a4Y-KtmKM43rjc,4447
16
+ followthemoney/value.py,sha256=_JA3DbUVho7xdHqQeYwIaECH2RWqaTiKRJ-LDnWUgaI,2352
17
+ followthemoney/cli/__init__.py,sha256=0mmz84uhXRp2qUn3syKnDXofU3MMAAe291s7htqX0Bg,187
18
+ followthemoney/cli/aggregate.py,sha256=xQTFpU3cVVj7fplpX4OJVrRlTVpn6b9kBr_Vb87pKfg,2164
19
+ followthemoney/cli/cli.py,sha256=cWSQIrMS0b40uzIveoIfR9CEBbQEwcfonYhDTpioqBM,3584
20
+ followthemoney/cli/exports.py,sha256=arWgIfDhMdEEoAnANOPbgirL68qAR2pCt0otz9MEXmg,4074
21
+ followthemoney/cli/mapping.py,sha256=PGQ-9T5ss6w6qnZg7IjUZZ3PplY15CcPSxZxkyMFLDM,3370
22
+ followthemoney/cli/sieve.py,sha256=wLB35fCVp1ArZ7FDTbARevBk8jH4vnp65fyBZU7Lk_k,1937
23
+ followthemoney/cli/statement.py,sha256=kjcOzcwWT_cHCwriiYA8B05BJpwVoI3WMJjghzPOCsY,2871
24
+ followthemoney/cli/util.py,sha256=C3nGMVY3-9JHSFLn3AGvTNcAdvGcgfFS-7jXIzKg6Ik,4735
25
+ followthemoney/dataset/__init__.py,sha256=rOKsI39dccDaYcSa7ASoNKkhmbFYUArxMCRqtrxy2iE,477
26
+ followthemoney/dataset/catalog.py,sha256=bIpxr0jvJeutNSmCaXREQac7TyvZak2Y_QoCFdCM0d4,3001
27
+ followthemoney/dataset/coverage.py,sha256=rBnKs7VngCtIuaDqrF5D0ygCHg8NAMkYbmtl7336PSI,724
28
+ followthemoney/dataset/dataset.py,sha256=Krqfr_qt9nSGqqU3yr_-eGqZpXeunaXL9JesmYTwi4k,4540
29
+ followthemoney/dataset/publisher.py,sha256=AKBLZhhZm3x_onuDyEuZQ2S7lthbp2L5tj8F_TlQDdM,706
30
+ followthemoney/dataset/resource.py,sha256=nZgzuBg9IvifJwV8zdJj_njxmlVbUwAjxzgy5J099dE,914
31
+ followthemoney/dataset/util.py,sha256=Kc9mUEsimTy3yXIM7hAf35P-sjS40HId87LzhGXnZH4,1650
24
32
  followthemoney/export/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- followthemoney/export/common.py,sha256=_YrXrwsqmyboDZDhtJ_PazUUJYe1Y-Trqc9lz4YlVR8,991
26
- followthemoney/export/csv.py,sha256=AvWgyWg0nICAVLv4k9QgWRlgJhJonKCjzlZkrahe5Tg,2633
33
+ followthemoney/export/common.py,sha256=5b-Qlu3MaA0kSzzMAP93FAWncpgiioENnCnHikWYxhs,1021
34
+ followthemoney/export/csv.py,sha256=reWq1jYIv7sY2PEI4JwIxahYNNqnSiPfMCS3kQX4RZ8,2652
27
35
  followthemoney/export/excel.py,sha256=pj6zNpIbye_Zm3vhCamcqHEe9Fw-RyjtWQDCFY6608s,2645
28
36
  followthemoney/export/graph.py,sha256=v0z1FgadyFk5aQ0A5q8E9R4fSO-Tpi5JU9YTDwnRKD8,2765
29
- followthemoney/export/neo4j.py,sha256=aw1vBOLTRinFbOhn19WThLlQ6NWVbm2gop5Jz_ihc58,7052
30
- followthemoney/export/rdf.py,sha256=E6RiW7oIsJdaBaLAVm6o-MTokARZtqONPuayILqTqo0,786
37
+ followthemoney/export/neo4j.py,sha256=4Lih9lt3-5ATERhyMcfJfkiETG3tqj9vY4N9s7jiYmw,7049
38
+ followthemoney/export/rdf.py,sha256=BOd4AIAVobwpmJ5GjyIqn9ZQHUwKQ-3fMdnD-Lcid0s,2978
31
39
  followthemoney/mapping/__init__.py,sha256=iwNqzzvrzJNbNDlOCaDLlBTUrNTlnYHIB5cvo_-9oN4,82
32
- followthemoney/mapping/csv.py,sha256=Tvc6VSh7-ca63LEE4G0yqOCeGMETkuKzUjIkVn4_d7Q,3185
40
+ followthemoney/mapping/csv.py,sha256=1eqQk1tn5JSEcr4rrv44XdT5biUk7J0E275uvUNoOrA,3125
33
41
  followthemoney/mapping/entity.py,sha256=-x_VBHiVthIrZZ-PVKD3oBAq6LYcsyeYW-9TFv80k7M,5905
34
42
  followthemoney/mapping/property.py,sha256=41V16HJh6da7oKdSJWyRcyMkx2XFd6iDm9-4PH7Wihw,5036
35
43
  followthemoney/mapping/query.py,sha256=8M6bOlEX2p_bbVwEwTu_1slEtU0cfRJB7ajZp-F07CE,2622
36
44
  followthemoney/mapping/source.py,sha256=sri-XpSjeHZbQtqNcz1eJYvwVSBNqGO5JwhWswiEx3c,649
37
- followthemoney/mapping/sql.py,sha256=m3Ho8B2pFsg6q2zj-y55h0O3x9eb6wzjlPBQyZ6DVcI,4752
45
+ followthemoney/mapping/sql.py,sha256=iCSOl9uOzJI__1d1XvLtJmLUXhb38MRM_eBnYt7TdP8,4738
38
46
  followthemoney/schema/Address.yaml,sha256=9cPZfkNiV-5fNfSzBFcE_dwD0V2_WLpGSLT6kL8GbuQ,1709
39
47
  followthemoney/schema/Airplane.yaml,sha256=i3tI4INH6ZtKBqm09fAUtCbieFlha-vPfQURXMDZTIU,622
40
- followthemoney/schema/Analyzable.yaml,sha256=WvyhjYqI7QzBt3qPDgO7MDasJH1qQtgQMToHkV_xtlU,1237
48
+ followthemoney/schema/Analyzable.yaml,sha256=0XEHqibL_XpzARpnq1hB0at38w4i2FgOmh-EbtH-pt8,1216
41
49
  followthemoney/schema/Article.yaml,sha256=jTH63eP2aZ87W_6m8jS4R_btcrI46tYGeCEqKNLTwLU,266
42
- followthemoney/schema/Assessment.yaml,sha256=-RH_aEz4xGejucRcwl45KVAnzSLeQ7zwJWguuKST3m0,630
43
50
  followthemoney/schema/Asset.yaml,sha256=xQhHJJtnGLfiOaUncqGv4JR3Yn7l46yAg7p0hKFAFVE,260
44
51
  followthemoney/schema/Associate.yaml,sha256=ijTHd6GDlK4lMtijdkTzERR9DODtqKk0XoZPlDEsUnI,901
45
52
  followthemoney/schema/Audio.yaml,sha256=Eb1rZGUEOX7XDAj_1YIN28NCBzMvkopQBNwgHt_kS18,452
46
- followthemoney/schema/BankAccount.yaml,sha256=Pvw9FxJYwwnJMoo3IblyPki9VRjLsM4F30jzKZWv9dE,1452
53
+ followthemoney/schema/BankAccount.yaml,sha256=60v-VD296lW1Qq7fx--CzxfPNwfCcyMV6xIl8OrSy5g,1431
47
54
  followthemoney/schema/Call.yaml,sha256=kbVCnVxucBrEplxehXHThLSJAJjy_GhWan-IeZZjr0M,980
48
55
  followthemoney/schema/CallForTenders.yaml,sha256=2IWonTzfSbrkynMoEWqv5fekUeFM_xDKpKIbRe1XDbo,3227
49
- followthemoney/schema/Company.yaml,sha256=ozXP_PHly_cOa3xjKkxaUnlwXc-0jsLYt_682Auql48,3276
50
- followthemoney/schema/Contract.yaml,sha256=-wVVUBu_KvmiWEjXrw1zgY2m9AAkiHCDd-hxFCUzj6k,1586
56
+ followthemoney/schema/Company.yaml,sha256=v16tU4mQhVitC3BOc9OPbubCxPgf1c-Iudnyq6IF0ys,3057
57
+ followthemoney/schema/Contract.yaml,sha256=aSPB64T1h-0nuLDv6krasUvvoPZgo6sWUbv60c3vmzI,1541
51
58
  followthemoney/schema/ContractAward.yaml,sha256=b2spaZHYCaP1yR1RCsrI7mUjk-fAF7BUE3dc8Vl3cUQ,1689
52
59
  followthemoney/schema/CourtCase.yaml,sha256=lcovnY0Ne_xcggvkqfCW_RHvsRKo8kFTCPCyovAXRtI,599
53
60
  followthemoney/schema/CourtCaseParty.yaml,sha256=MpodN2251V_MYD2dBOHZ_qD7Uv6cLg8Gd_b-I8HZjPI,588
54
- followthemoney/schema/CryptoWallet.yaml,sha256=1Akp0Bzd_x_0GgsUOxW0zkvNDozoMP_8fJyrSn0dAy4,1068
61
+ followthemoney/schema/CryptoWallet.yaml,sha256=dhUpPf1eONsyzyORXoo_zFXgn0BuSLB4OKj2sHZ5wzA,1069
55
62
  followthemoney/schema/Debt.yaml,sha256=gSGl1xKPaPWAYYEcX7MxezVn3Gu-CYBIzxGzMd9UTm4,657
56
63
  followthemoney/schema/Directorship.yaml,sha256=BMx2AQTLy5ta_lWPnYKj7LFjZWTwtu1hgWncISdKf28,773
57
- followthemoney/schema/Document.yaml,sha256=MA-vZrK_Imd2HuIhJ7c_BH9Cpecv-DewXJhfjECXjuw,2927
64
+ followthemoney/schema/Document.yaml,sha256=JxoYl_2o-ebVXh5MzRIKEHfV3q_E--wXGO2HG7zBaZg,2646
58
65
  followthemoney/schema/Documentation.yml,sha256=AZ1kHiKcvkyv3SINLwAwUyoWMVrF8O0mSJhMN4jNNaE,760
59
66
  followthemoney/schema/EconomicActivity.yaml,sha256=hm2x-p-49fGOZcy6xVtiplpJs4XsQVFYLgb8D41az0k,4049
60
67
  followthemoney/schema/Email.yaml,sha256=IqEHgqUsapbTnCBO7OuV-GvoxLH8LIQscZOyAiateqw,1549
@@ -66,9 +73,9 @@ followthemoney/schema/HyperText.yaml,sha256=Wg5dWeLrVjbXiI-ao69tosJ7rI0DvNU8cCo8
66
73
  followthemoney/schema/Identification.yaml,sha256=6txjZs6-3Kn94c3G4tDeDt9Jb4FW55-xjSnYVrvmiEA,853
67
74
  followthemoney/schema/Image.yaml,sha256=wuznboWECGiV96_GQiXq1-oKNoxO8zKisR4xyusnEn8,394
68
75
  followthemoney/schema/Interest.yaml,sha256=VUrehmsN1WgtS1oAa5jn_JGtSkZGGYLGNahp-R5JhOQ,282
69
- followthemoney/schema/Interval.yaml,sha256=WtmSoBngajhpNLtDZ8Ocpdd0I0tLG-7A4afuHXxssow,1919
70
- followthemoney/schema/LegalEntity.yaml,sha256=1AouOu97lbKeLP1VNaprN_oACdTvcptGHob-Wbkc17Q,4298
71
- followthemoney/schema/License.yaml,sha256=9Ye5vGEBhi7ttGqf0DdAGCJCN3zz5HtGu52dCcmCsQk,452
76
+ followthemoney/schema/Interval.yaml,sha256=8YJQ51GI-GxvbjYs3uC593kQtCepWW_7ZiNnlbPm2aM,2084
77
+ followthemoney/schema/LegalEntity.yaml,sha256=u6GOemHj1vnL_6dcC3XyLaP72JQrNecXlbocXxJo5AI,4502
78
+ followthemoney/schema/License.yaml,sha256=bXESXY-JpSmc5sthZe4sssXhx50UoLPAMED9FvEUyRU,534
72
79
  followthemoney/schema/Membership.yaml,sha256=IPmaOX4Ai2r4sGcA5ig2WmLvWHb38akdxp4smEdDWOE,710
73
80
  followthemoney/schema/Mention.yaml,sha256=nBeulR_Jm4x75aJ7yNF0TAVhHJqXQaEzOutLIn_YU-4,1086
74
81
  followthemoney/schema/Message.yaml,sha256=PAxZ2NRFVvnOlp9Ohh5fJDEThjJ0jm3M2YCbJ9KtMuE,1565
@@ -77,34 +84,38 @@ followthemoney/schema/Occupancy.yaml,sha256=WojlqzuWao84MJxRE9K6a-1D-Jtu78-0h6la
77
84
  followthemoney/schema/Organization.yaml,sha256=wPXU1ni0-3QzvttDq-gIjbAYHzcWoo3nsLGLw6cnHKI,1064
78
85
  followthemoney/schema/Ownership.yaml,sha256=tLWESE9VX0aUuhe6C1pToq2-auPVZBdE3xvBmTRfmPc,1057
79
86
  followthemoney/schema/Package.yaml,sha256=gPr-P3lcg7OOAav_KVa8baK4yK57JwfcXwxXheD96UQ,310
80
- followthemoney/schema/Page.yaml,sha256=sQt_CnVyjDVGVECLQoGYZH4hxpjdPhxVRz4XJW-_1OU,1107
87
+ followthemoney/schema/Page.yaml,sha256=YjYqaH2sOry0z4xh44CsX_eyuRClD6ZS0d2o2uQXFbo,1062
81
88
  followthemoney/schema/Pages.yaml,sha256=KKPGZ06Ehp5mWIGnYfHUBN9jT03bk8nakw0pB5bA_7E,450
82
89
  followthemoney/schema/Passport.yaml,sha256=rpuLC86sdXnHF-prFQM4mAqYzlSGWKvPE4Cphtn2KRw,805
83
90
  followthemoney/schema/Payment.yaml,sha256=WRBJuj9ljsxLBs-0g9Z9UD87uR1RTtuUiYnWOnKr1qA,1757
84
- followthemoney/schema/Person.yaml,sha256=EsMcdOzGa8v8zQ_AgvDHSUFL0SflPMhdSdC7TWwW0sU,2354
91
+ followthemoney/schema/Person.yaml,sha256=G6L6bf8WQtOC1Xr1TKWRCJt8JlyQKheBPtH1ZmjjS3w,2132
85
92
  followthemoney/schema/PlainText.yaml,sha256=hfnVi-HmQeDbqDquSpkPJax9hNm86ioXGr4hzNzyPFE,278
86
93
  followthemoney/schema/Position.yaml,sha256=ZpxjWOLxwva_on32r9WD5ys0Ty3YxCju41mg9HG-pe0,1308
87
- followthemoney/schema/Post.yaml,sha256=cbxy8cWXHFKSvr1ylwDilRURhcsyd9-H7fn_Lb4lsFE,1034
88
94
  followthemoney/schema/Project.yaml,sha256=2svtyGJopS0UrqPiuYGpBzj30V7k3LRDX4N1U56y4yY,462
89
95
  followthemoney/schema/ProjectParticipant.yaml,sha256=xNehEu90uqUfboNouezhZQ8ZQLxzWq1yyNO4kua-Lyc,727
90
96
  followthemoney/schema/PublicBody.yaml,sha256=BNfLBqH1OapoEninAjWmqZx_n-G5QUnzzydW7300TiY,301
91
97
  followthemoney/schema/RealEstate.yaml,sha256=NWFHXqEHskYQN-kvQESZpu74nztShqoYSZEjZAr-DHM,1363
92
98
  followthemoney/schema/Representation.yaml,sha256=sCvFnUDQaElq2cqSB0rILcMYb2gaMZqlzxlHxyX9IGg,792
93
- followthemoney/schema/Sanction.yaml,sha256=VpvVXReuA3xF1V0tlDyK_LItnL6G_Xt3HivnCf9_zag,1259
99
+ followthemoney/schema/Sanction.yaml,sha256=-3_NrTp1KPSsSMkttFzwo81zFKplx15w-9EmwPnE8-o,1278
94
100
  followthemoney/schema/Security.yaml,sha256=w8Och0cslWjHPAs60HZ6JarEXdIbqGlIbN1NlvgN_7Y,1212
95
101
  followthemoney/schema/Similar.yaml,sha256=gD8rZEaPQWzU-rEfsKdn62uEucF3KxYBcPMoSdnxvME,817
96
102
  followthemoney/schema/Succession.yaml,sha256=RMJQqZ4Fv88N1RvWTAgjYg9BB5cELSj5CCAjM681Fpg,749
97
103
  followthemoney/schema/Table.yaml,sha256=GcsIAgSO9t2tvObA9zU2HhxlSqTe9CePmUnagu1Z0vI,641
98
104
  followthemoney/schema/TaxRoll.yaml,sha256=ugMzaaS7uyq2OLD50eGLcfvd6Cg0cSt65-T9GVqpRSA,746
99
- followthemoney/schema/Thing.yaml,sha256=IWVpyhUGuvR6x5eyObPjJ0eEIyYHuw1FLWGLe6aaNas,2829
105
+ followthemoney/schema/Thing.yaml,sha256=hh1oMDQzWiSs1TamBNonmwEdlh2TVrNc3w9hWW8iSeY,2716
100
106
  followthemoney/schema/Trip.yaml,sha256=nLQD_ApmVJ8D56Czl7K700hhNZjzFV9FOQ3NBSQDLiM,771
101
107
  followthemoney/schema/UnknownLink.yaml,sha256=lneS_HZNgeLyJxwzWnLx0ZoyY3MXt99I_K2X_o9z5g8,682
102
- followthemoney/schema/UserAccount.yaml,sha256=V1JWwwcggCO4G9ByJY9zlQ0uOVp8HQK2mRXwqaGJnBM,763
108
+ followthemoney/schema/UserAccount.yaml,sha256=2bbPKNtt1R3zWSSkaq_SVzRPfFzX74kAxwtIxTymHA8,840
103
109
  followthemoney/schema/Value.yaml,sha256=cNHTCtakMTXDW0Qpb6ArZodi9rMJ-Ebvp1WsOIRRzw4,310
104
110
  followthemoney/schema/Vehicle.yaml,sha256=Ypl4A5HJFOZfZh3DK0ewN-hyJuCMcovR0mPNddIZrOA,1051
105
111
  followthemoney/schema/Vessel.yaml,sha256=nFaUJ_0BzFJstvog1iDvwV9DHKHr9ky4DLb1NZGGh1E,1096
106
112
  followthemoney/schema/Video.yaml,sha256=LY3DYMWTHXiAhL0hxBCNCz50cp2sPbUlEhhig5Fbjos,327
107
113
  followthemoney/schema/Workbook.yaml,sha256=iikWPElz4klA7SkWH7eae6xqhbkMCIP_3zdeXzFEMU0,354
114
+ followthemoney/statement/__init__.py,sha256=PvhLPhmQrezBKCe8rEwJlyTWlrnCzSfyfchVc8gXXEA,568
115
+ followthemoney/statement/entity.py,sha256=MHZSWYrnvKZq4o6ZmElEDDyBNfq9MIxxbH8nOGO3OwQ,15465
116
+ followthemoney/statement/serialize.py,sha256=sEeyPmjbLNI7_XVT_3p4cdsABESmVvexTdceHcNY6Ok,7041
117
+ followthemoney/statement/statement.py,sha256=Ae-EYuzS8S12BkaRqrvMuI1C7YwlRKa5C_pTBELyNMM,8029
118
+ followthemoney/statement/util.py,sha256=B-ozuRc1TWvpop52873Pqt5OPj8H6uk4KyRJLfAhr10,780
108
119
  followthemoney/translations/messages.pot,sha256=JhtY9NJ9wP_EAX4APxOqMyvKcX53oIC9kAxBsliJkf4,107703
109
120
  followthemoney/translations/ar/LC_MESSAGES/followthemoney.mo,sha256=uhb2crSNh8K2ts_QUeD2wvgWgzzpLJWRzXok-Uyx3Zk,38795
110
121
  followthemoney/translations/ar/LC_MESSAGES/followthemoney.po,sha256=DuIfvR5v0sPGwFbeg3y6_jCbeglvHWXQ2LDH6prfwLc,121326
@@ -128,30 +139,28 @@ followthemoney/translations/ru/LC_MESSAGES/followthemoney.mo,sha256=bXJ9UXFg_MMx
128
139
  followthemoney/translations/ru/LC_MESSAGES/followthemoney.po,sha256=7SQWytOTvoAQq60GJMh22a1nAzhdEUb5BO4ldpiCtnA,141918
129
140
  followthemoney/translations/tr/LC_MESSAGES/followthemoney.mo,sha256=SC84e_ZF_oFJG1NKdyZY_W6Kb6POORZB6wdeAcEWmnE,487
130
141
  followthemoney/translations/tr/LC_MESSAGES/followthemoney.po,sha256=AZC3marhtVVq8Ck1FOgnt4sbDMz548nX48O9GDwImbQ,89826
131
- followthemoney/types/__init__.py,sha256=X9XeM6JktzirAw5gGkyDKGM70NuiJ9Tbjoq0IwVclxU,1745
132
- followthemoney/types/address.py,sha256=NnJli6jIs5DfePL4m3dA3Xwv7GA8sdl1J6Mtm-QLeOY,2068
133
- followthemoney/types/checksum.py,sha256=OqjCsBPyMIV3_Y20kTTvjkyayy32pBtaI5KKwYQb6lY,937
134
- followthemoney/types/common.py,sha256=Yk-7LZ6uDgFzKXUZxQ_j5miN2ZMnlBOziU0iFC7FE9I,10202
135
- followthemoney/types/country.py,sha256=aYSvTeI37JFzV3ATl-_-r6Vnc4ye8Nc0rVwaXgqbOaU,1863
136
- followthemoney/types/date.py,sha256=4lZCd0aws-T3HE2BYkb-a-t8iQDr0nqFSAEBoUKiTlM,2683
137
- followthemoney/types/email.py,sha256=zAnMHwC_FZh7IagpDRhGZf-GfQR6uW8d-lZP4UCdGcM,2745
138
- followthemoney/types/entity.py,sha256=FA8xXNCkiM7HlF6k5lxTlb_B_LKlUwaoOMaVqAdjgYc,2477
139
- followthemoney/types/gender.py,sha256=AVCa6ocsxueVhGW7RA2BIbQEfDRQANDpKkGY7ZakTYE,1820
140
- followthemoney/types/iban.py,sha256=QYD49erJCB6I2nbtTagRMvpa4RyjezfB4Fpat2QLwAc,1797
141
- followthemoney/types/identifier.py,sha256=Gk4h75_KyjkdtomrK9Ldsh9rD7-bsenFryevJFwqlX0,2036
142
- followthemoney/types/ip.py,sha256=BxGARP9JWEWvyRnr7A7xUNwmTxyFd9kwXSZrKR0TK2Q,1412
143
- followthemoney/types/json.py,sha256=Hefwns1-ziJf310MWvdfX5ICkOgj9cnnMJuqq1e6qKY,1676
144
- followthemoney/types/language.py,sha256=9w4jgJN4vs5SKPyBIXLcSUo0nupH4F2LukiF4KbPxxY,2864
145
- followthemoney/types/mimetype.py,sha256=EZ5hIdn-wosfLc-GjXDaOzevxaSXPbSPHDUJmPT1h0I,1355
146
- followthemoney/types/name.py,sha256=_Vu-MPYbgdN55gNBT2qHh-RDgbLQgT2l_kftnqJIEdw,2240
147
- followthemoney/types/number.py,sha256=9l5v3hcAoJ4V6jaBS_-Kc1gtdJlQrY9L98ElC5e_PLQ,943
148
- followthemoney/types/phone.py,sha256=2YFbPBtMepvCWTdcxXq3Fq4AU8B4QYk1FARBpsH8xjs,4040
149
- followthemoney/types/registry.py,sha256=hvQ1oIWz_4PpyUnKA5azbaZCulNb5LCIPyC-AQYVVyw,1936
150
- followthemoney/types/string.py,sha256=grDn1OgKWxIzVxGEdp0HjVKIqtQ9W4SW2ty4quv3Pcs,1202
151
- followthemoney/types/topic.py,sha256=FqV_4YDpmQxZO9m05l3c-nDyDqsZONqBG5aaf5aCkvA,3797
152
- followthemoney/types/url.py,sha256=r7Pd6Yfn--amwMi_nHoTLMwm5SH8h50SMgQaa2G4PJ0,1492
153
- followthemoney-3.8.4.dist-info/METADATA,sha256=hO1oyvwXzk7pDe_Ex8Y-_fydsD8xVb18Iw9Gue6PgM0,6065
154
- followthemoney-3.8.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
155
- followthemoney-3.8.4.dist-info/entry_points.txt,sha256=xvTXjAz0CiZplq4V3iQXlmBexaJyW3zNucIvcDP6L_c,593
156
- followthemoney-3.8.4.dist-info/licenses/LICENSE,sha256=3tfmmk9RtT1eh67a-NDRwcmOLzztbCtqlHW6O1U92ZA,1098
157
- followthemoney-3.8.4.dist-info/RECORD,,
142
+ followthemoney/types/__init__.py,sha256=rWwQeiuMh2BNIuvhpMfJ4bPADDvt9Axu1eedvNFi0qY,3350
143
+ followthemoney/types/address.py,sha256=11k7kxHAoY46-ypkOQELFCJjrk7yssTOs55vdRWQJBY,2089
144
+ followthemoney/types/checksum.py,sha256=zZrU8WX4CY3Vta_vOyfgDNzIwbmtje7AaDv3O1fBMnk,823
145
+ followthemoney/types/common.py,sha256=d9t4BMqcjoMqqKu7UWVF6WKckV0FnRsKQ1LA3OgEq0c,10065
146
+ followthemoney/types/country.py,sha256=mUCjwhUbA5Ef5HYuKb1KbH4aZ3MxaNwE1p77uOZMuG0,1745
147
+ followthemoney/types/date.py,sha256=PjcaEyW6CBzf0-gHWKUsKjWIaD3AVBEl0zLSRQOVXxc,3105
148
+ followthemoney/types/email.py,sha256=zuX7TthKGtkUwN_kEMMip17iMYQDJc5kQUP8j4N6R-A,2598
149
+ followthemoney/types/entity.py,sha256=oDxVEhuxyU1ScpOpebPpUm3o0I9j_p7Qrq-t5yNpluQ,2338
150
+ followthemoney/types/gender.py,sha256=fi9iKLbjAUxDCLBtU1MxWidxv7KgCY2eH5746FYlEGk,1725
151
+ followthemoney/types/identifier.py,sha256=hzD188FtwG0w3TcmbnDwnUMc8MZVcWgQJKGAvrwygc4,2296
152
+ followthemoney/types/ip.py,sha256=mMFTODFiXAJROCUYJvoLAShyIiTIWVmMBh5zT_GquYM,1300
153
+ followthemoney/types/json.py,sha256=V3qJD5RxJykNX51u3w1Nx9xqoNBnkulhzkJI9XMYKFo,1690
154
+ followthemoney/types/language.py,sha256=SXgRRH-DyPmyyrqYurSyMiG6WHB8a0Gw81XxroEGD-c,2747
155
+ followthemoney/types/mimetype.py,sha256=NdpqVLx3Bre_myYvnbjmdd5wZBf01tllrbhegjO8_m0,1263
156
+ followthemoney/types/name.py,sha256=Y7g-SkmO_9PgzpBubS79OsPhp4h73dEGVql78Bq2x0Y,2258
157
+ followthemoney/types/number.py,sha256=OdVuHDd4IYIIHhx_317JKeMjBAGtsJ2TAcxoZKZ4MkY,3948
158
+ followthemoney/types/phone.py,sha256=r8uRqWinS0CYnYBTs405k5gO4jeatUDgjdzzijoMKJE,3811
159
+ followthemoney/types/string.py,sha256=fqyTauAm4mNnNaoH-yH087RBbNh-G5ZZUO3awTGQUUg,1230
160
+ followthemoney/types/topic.py,sha256=CS5IoI8gm4MSVxfV6K4mGd20_tT1SaKMkcOt_ObSsAg,3678
161
+ followthemoney/types/url.py,sha256=QFpS_JIV8unFHuh_uGv22SWUUkocBoOpzLsAJWom_gI,1455
162
+ followthemoney-4.0.0.dist-info/METADATA,sha256=SxSYtlQ_s21ID_QHvjb5GMh2oqY5ZTo06vU1K3ZFn7I,6791
163
+ followthemoney-4.0.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
164
+ followthemoney-4.0.0.dist-info/entry_points.txt,sha256=caoFTlf213jhg5sz3TNSofutjUTzaKtWATuSIdd9Cps,653
165
+ followthemoney-4.0.0.dist-info/licenses/LICENSE,sha256=H6_EVXisnJC0-18CjXIaqrBSFq_VH3OnS7u3dccOv6g,1148
166
+ followthemoney-4.0.0.dist-info/RECORD,,
@@ -15,3 +15,4 @@ gexf = followthemoney.cli.exports:export_gexf
15
15
  mapping = followthemoney.cli.mapping:run_mapping
16
16
  rdf = followthemoney.cli.exports:export_rdf
17
17
  sieve = followthemoney.cli.sieve:sieve
18
+ statements = followthemoney.cli.statement:entity_statements
@@ -1,6 +1,7 @@
1
1
  MIT License
2
2
 
3
3
  Copyright (c) 2017-2024 Journalism Development Network, Inc.
4
+ Copyright (c) 2025 OpenSanctions Datenbanken GmbH
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
7
  of this software and associated documentation files (the "Software"), to deal
@@ -1,48 +0,0 @@
1
- from followthemoney.proxy import E
2
-
3
- # Derived from: https://fsi.taxjustice.net/en/introduction/fsi-results
4
- OFFSHORE_COUNTRIES = set(
5
- (
6
- "ky",
7
- "ch",
8
- "sg",
9
- "lu",
10
- "vg",
11
- "gg",
12
- "pa",
13
- "je",
14
- "mt",
15
- "bs",
16
- "cy",
17
- "gi",
18
- "mo",
19
- "bm",
20
- "im",
21
- "mh",
22
- "mu",
23
- "li",
24
- "ai",
25
- "kn",
26
- "tc",
27
- "vu",
28
- "mc",
29
- "sc",
30
- "ag",
31
- "dm",
32
- "ms",
33
- "lc",
34
- "ck",
35
- )
36
- )
37
-
38
-
39
- def offshore_from_jurisdiction(proxy: E) -> E:
40
- """Tag organizations linked to a well-known offshore jurisdiction as
41
- offshores automatically. Complete generalization, use only in experiments."""
42
- if not proxy.schema.is_a("Organization"):
43
- return proxy
44
- countries = set(proxy.get("country", quiet=True))
45
- countries.update(proxy.get("jurisdiction", quiet=True))
46
- if len(countries.intersection(OFFSHORE_COUNTRIES)) > 0:
47
- proxy.add("topics", "corp.offshore")
48
- return proxy
followthemoney/rdf.py DELETED
@@ -1,9 +0,0 @@
1
- # This module serves exclusively to mitigate the type checking clusterfuck
2
- # that is rdflib 6.0.
3
- from rdflib import Namespace
4
- from rdflib.term import Identifier, URIRef, Literal
5
- from rdflib import RDF, SKOS, XSD
6
-
7
- NS = Namespace("https://schema.followthemoney.tech/#")
8
-
9
- __all__ = ["NS", "XSD", "RDF", "SKOS", "Identifier", "URIRef", "Literal"]
@@ -1,32 +0,0 @@
1
- Assessment:
2
- # This is overly specific yet not useful. Should we phase it out?
3
- label: Assessment
4
- plural: Assessments
5
- extends:
6
- - Thing
7
- matchable: false
8
- featured:
9
- - name
10
- - publishDate
11
- - author
12
- caption:
13
- - name
14
- required:
15
- - name
16
- temporalExtent:
17
- start:
18
- - publishDate
19
- properties:
20
- publishDate:
21
- label: "Date of publishing"
22
- type: date
23
- assessmentId:
24
- label: "Assessment ID"
25
- author:
26
- label: "Author"
27
- plural: "Authors"
28
- type: entity
29
- range: LegalEntity
30
- reverse:
31
- name: authoredAssessments
32
- label: "Assessments authored"