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.
- followthemoney/__init__.py +30 -10
- followthemoney/cli/__init__.py +3 -12
- followthemoney/cli/aggregate.py +1 -1
- followthemoney/cli/cli.py +1 -1
- followthemoney/cli/exports.py +6 -2
- followthemoney/cli/mapping.py +6 -4
- followthemoney/cli/sieve.py +1 -1
- followthemoney/cli/statement.py +62 -0
- followthemoney/cli/util.py +2 -3
- followthemoney/compare.py +26 -16
- followthemoney/dataset/__init__.py +17 -0
- followthemoney/dataset/catalog.py +77 -0
- followthemoney/dataset/coverage.py +29 -0
- followthemoney/dataset/dataset.py +137 -0
- followthemoney/dataset/publisher.py +25 -0
- followthemoney/dataset/resource.py +30 -0
- followthemoney/dataset/util.py +58 -0
- followthemoney/entity.py +73 -0
- followthemoney/exc.py +6 -0
- followthemoney/export/common.py +3 -3
- followthemoney/export/csv.py +10 -12
- followthemoney/export/neo4j.py +1 -1
- followthemoney/export/rdf.py +57 -5
- followthemoney/graph.py +6 -4
- followthemoney/mapping/csv.py +6 -18
- followthemoney/mapping/sql.py +3 -4
- followthemoney/model.py +36 -9
- followthemoney/namespace.py +3 -1
- followthemoney/ontology.py +18 -16
- followthemoney/property.py +12 -15
- followthemoney/proxy.py +44 -65
- followthemoney/schema/Analyzable.yaml +2 -3
- followthemoney/schema/BankAccount.yaml +2 -3
- followthemoney/schema/Company.yaml +0 -6
- followthemoney/schema/Contract.yaml +0 -1
- followthemoney/schema/CryptoWallet.yaml +1 -1
- followthemoney/schema/Document.yaml +0 -6
- followthemoney/schema/Interval.yaml +7 -0
- followthemoney/schema/LegalEntity.yaml +6 -0
- followthemoney/schema/License.yaml +2 -0
- followthemoney/schema/Page.yaml +0 -1
- followthemoney/schema/Person.yaml +0 -5
- followthemoney/schema/Sanction.yaml +1 -0
- followthemoney/schema/Thing.yaml +0 -2
- followthemoney/schema/UserAccount.yaml +6 -3
- followthemoney/schema.py +27 -39
- followthemoney/statement/__init__.py +19 -0
- followthemoney/statement/entity.py +437 -0
- followthemoney/statement/serialize.py +245 -0
- followthemoney/statement/statement.py +256 -0
- followthemoney/statement/util.py +31 -0
- followthemoney/types/__init__.py +66 -23
- followthemoney/types/address.py +3 -3
- followthemoney/types/checksum.py +3 -7
- followthemoney/types/common.py +9 -14
- followthemoney/types/country.py +3 -7
- followthemoney/types/date.py +21 -11
- followthemoney/types/email.py +0 -4
- followthemoney/types/entity.py +5 -11
- followthemoney/types/gender.py +6 -10
- followthemoney/types/identifier.py +9 -3
- followthemoney/types/ip.py +5 -9
- followthemoney/types/json.py +2 -2
- followthemoney/types/language.py +3 -7
- followthemoney/types/mimetype.py +4 -8
- followthemoney/types/name.py +7 -8
- followthemoney/types/number.py +88 -6
- followthemoney/types/phone.py +4 -11
- followthemoney/types/string.py +4 -4
- followthemoney/types/topic.py +3 -7
- followthemoney/types/url.py +5 -10
- followthemoney/util.py +12 -13
- followthemoney/value.py +67 -0
- {followthemoney-3.8.4.dist-info → followthemoney-4.0.0.dist-info}/METADATA +38 -34
- {followthemoney-3.8.4.dist-info → followthemoney-4.0.0.dist-info}/RECORD +78 -69
- {followthemoney-3.8.4.dist-info → followthemoney-4.0.0.dist-info}/entry_points.txt +1 -0
- {followthemoney-3.8.4.dist-info → followthemoney-4.0.0.dist-info}/licenses/LICENSE +1 -0
- followthemoney/offshore.py +0 -48
- followthemoney/rdf.py +0 -9
- followthemoney/schema/Assessment.yaml +0 -32
- followthemoney/schema/Post.yaml +0 -42
- followthemoney/types/iban.py +0 -58
- followthemoney/types/registry.py +0 -52
- {followthemoney-3.8.4.dist-info → followthemoney-4.0.0.dist-info}/WHEEL +0 -0
followthemoney/types/url.py
CHANGED
|
@@ -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.
|
|
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
|
|
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(
|
|
62
|
-
text = stringify(
|
|
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
|
|
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:
|
followthemoney/value.py
ADDED
|
@@ -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
|
+
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/
|
|
7
|
-
Project-URL: Issues, https://github.com/
|
|
8
|
-
Author-email:
|
|
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.
|
|
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.
|
|
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<
|
|
54
|
-
Requires-Dist:
|
|
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
|
-
[](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%
|
|
111
|
-
* [WebVOWL](https://service.tib.eu/webvowl/#iri=https://
|
|
112
|
-
* RDF/OWL specification in [XML](https://
|
|
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=
|
|
2
|
-
followthemoney/compare.py,sha256=
|
|
3
|
-
followthemoney/
|
|
4
|
-
followthemoney/
|
|
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=
|
|
8
|
-
followthemoney/namespace.py,sha256=
|
|
9
|
-
followthemoney/
|
|
10
|
-
followthemoney/
|
|
11
|
-
followthemoney/
|
|
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/
|
|
15
|
-
followthemoney/
|
|
16
|
-
followthemoney/
|
|
17
|
-
followthemoney/cli/__init__.py,sha256=
|
|
18
|
-
followthemoney/cli/aggregate.py,sha256=
|
|
19
|
-
followthemoney/cli/cli.py,sha256=
|
|
20
|
-
followthemoney/cli/exports.py,sha256=
|
|
21
|
-
followthemoney/cli/mapping.py,sha256=
|
|
22
|
-
followthemoney/cli/sieve.py,sha256=
|
|
23
|
-
followthemoney/cli/
|
|
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=
|
|
26
|
-
followthemoney/export/csv.py,sha256=
|
|
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=
|
|
30
|
-
followthemoney/export/rdf.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
50
|
-
followthemoney/schema/Contract.yaml,sha256
|
|
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=
|
|
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=
|
|
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=
|
|
70
|
-
followthemoney/schema/LegalEntity.yaml,sha256=
|
|
71
|
-
followthemoney/schema/License.yaml,sha256=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
132
|
-
followthemoney/types/address.py,sha256=
|
|
133
|
-
followthemoney/types/checksum.py,sha256=
|
|
134
|
-
followthemoney/types/common.py,sha256=
|
|
135
|
-
followthemoney/types/country.py,sha256=
|
|
136
|
-
followthemoney/types/date.py,sha256=
|
|
137
|
-
followthemoney/types/email.py,sha256=
|
|
138
|
-
followthemoney/types/entity.py,sha256=
|
|
139
|
-
followthemoney/types/gender.py,sha256=
|
|
140
|
-
followthemoney/types/
|
|
141
|
-
followthemoney/types/
|
|
142
|
-
followthemoney/types/
|
|
143
|
-
followthemoney/types/
|
|
144
|
-
followthemoney/types/
|
|
145
|
-
followthemoney/types/
|
|
146
|
-
followthemoney/types/
|
|
147
|
-
followthemoney/types/
|
|
148
|
-
followthemoney/types/
|
|
149
|
-
followthemoney/types/
|
|
150
|
-
followthemoney/types/
|
|
151
|
-
followthemoney/
|
|
152
|
-
followthemoney/
|
|
153
|
-
followthemoney-
|
|
154
|
-
followthemoney-
|
|
155
|
-
followthemoney-
|
|
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,,
|
|
@@ -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
|
followthemoney/offshore.py
DELETED
|
@@ -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"
|