Skip to content

Commit 92b71b8

Browse files
authored
Add _event schema as alembic migration to fix admin tests (#69)
* Add event metadata field * Bump to 3.8.20 * Remove old code * Update _event sub taxonomy key * Bump to 3.8.21 * _event taxonomy as alembic migration to fix admin tests * Bump to 3.8.22 * Fix expected taxonomy test * Consolidate queries * Fix tests
1 parent f3d47fd commit 92b71b8

File tree

5 files changed

+171
-9
lines changed

5 files changed

+171
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
"""Add _event sub taxonomy.
2+
3+
Revision ID: 0057
4+
Revises: 0056
5+
Create Date: 2024-10-29 14:01:33.721363
6+
7+
"""
8+
9+
import os
10+
11+
import sqlalchemy as sa
12+
from alembic import op
13+
14+
from db_client.utils import get_library_path
15+
16+
revision = "0057"
17+
down_revision = "0056"
18+
branch_labels = None
19+
depends_on = None
20+
21+
22+
def upgrade():
23+
# Get the path to the SQL file
24+
sql_file_path = os.path.join(
25+
get_library_path(),
26+
"alembic",
27+
"versions",
28+
"data",
29+
"0057",
30+
"add-_event-schema.sql",
31+
)
32+
33+
# Read the SQL file
34+
with open(sql_file_path, "r") as file:
35+
sql_commands = file.read()
36+
37+
# Execute the SQL commands
38+
op.execute(sa.text(sql_commands))
39+
40+
41+
def downgrade():
42+
op.execute(
43+
sa.text(
44+
"UPDATE corpus_type "
45+
"SET valid_metadata = valid_metadata - '_event' "
46+
"WHERE valid_metadata ? '_event';"
47+
)
48+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
WITH updated_values AS (
2+
SELECT
3+
name,
4+
CASE
5+
WHEN name IN ('Intl. agreements', 'Laws and Policies') THEN jsonb_build_array('Passed/Approved')
6+
WHEN name = 'GEF' THEN jsonb_build_array('Concept Approved')
7+
ELSE jsonb_build_array('Project Approved')
8+
END AS new_allowed_values
9+
FROM corpus_type
10+
)
11+
UPDATE corpus_type
12+
SET valid_metadata = jsonb_set(
13+
valid_metadata,
14+
'{_event}',
15+
COALESCE(
16+
valid_metadata->'_event',
17+
jsonb_build_object()
18+
) || jsonb_build_object(
19+
'event_type',
20+
COALESCE(
21+
valid_metadata->'_event'->'event_type',
22+
jsonb_build_object(
23+
'allow_any', false,
24+
'allow_blanks', true,
25+
'allowed_values', (
26+
SELECT jsonb_agg(value)
27+
FROM jsonb_array_elements_text(
28+
(
29+
SELECT jsonb_path_query_first(
30+
ct.valid_metadata,
31+
'$.event_type.allowed_values'
32+
)
33+
FROM corpus_type ct
34+
WHERE ct.name = corpus_type.name
35+
LIMIT 1
36+
)
37+
) AS value
38+
)
39+
)
40+
),
41+
'datetime_event_name',
42+
COALESCE(
43+
valid_metadata->'_event'->'datetime_event_name',
44+
jsonb_build_object(
45+
'allow_any', false,
46+
'allow_blanks', false,
47+
'allowed_values', updated_values.new_allowed_values
48+
)
49+
)
50+
)
51+
)
52+
FROM updated_values
53+
WHERE corpus_type.name = updated_values.name
54+
AND (
55+
NOT (valid_metadata ? '_event')
56+
OR NOT (valid_metadata->'_event' ? 'event_type')
57+
OR NOT (valid_metadata->'_event' ? 'datetime_event_name')
58+
)
59+
AND corpus_type.name IN (
60+
SELECT DISTINCT corpus_type_name
61+
FROM corpus
62+
);

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "db-client"
3-
version = "3.8.21"
3+
version = "3.8.22"
44
description = "All things to do with the datamodel and its storage. Including alembic migrations and datamodel code."
55
authors = ["CPR-dev-team <[email protected]>"]
66
license = "Apache-2.0"

tests/functions/test_get_taxonomy_by_corpus_type_name.py

+30
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,36 @@
3434
"Updated",
3535
],
3636
},
37+
"_event": {
38+
"event_type": {
39+
"allow_any": False,
40+
"allow_blanks": True,
41+
"allowed_values": [
42+
"Amended",
43+
"Appealed",
44+
"Closed",
45+
"Declaration Of Climate Emergency",
46+
"Dismissed",
47+
"Entered Into Force",
48+
"Filing",
49+
"Granted",
50+
"Implementation Details",
51+
"International Agreement",
52+
"Net Zero Pledge",
53+
"Other",
54+
"Passed/Approved",
55+
"Repealed/Replaced",
56+
"Set",
57+
"Settled",
58+
"Updated",
59+
],
60+
},
61+
"datetime_event_name": {
62+
"allow_any": False,
63+
"allow_blanks": False,
64+
"allowed_values": ["Passed/Approved"],
65+
},
66+
},
3767
"_document": {
3868
"role": {
3969
"allow_any": False,

tests/schema/test_inital_data.py

+30-8
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"instrument",
1515
"event_type",
1616
"_document",
17+
"_event",
1718
}
1819
EXPECTED_CCLW_TOPICS = 4
1920
EXPECTED_CCLW_HAZARDS = 81
@@ -22,10 +23,17 @@
2223
EXPECTED_CCLW_FRAMEWORKS = 3
2324
EXPECTED_CCLW_INSTRUMENTS = 25
2425

25-
EXPECTED_UNFCCC_TAXONOMY = {"author", "author_type", "event_type", "_document"}
26+
EXPECTED_UNFCCC_TAXONOMY = {
27+
"author",
28+
"author_type",
29+
"event_type",
30+
"_document",
31+
"_event",
32+
}
2633
EXPECTED_UNFCCC_AUTHOR_TYPES = 2
2734

2835
EXPECTED_DOCUMENT_TAXONOMY_KEYS = 2
36+
EXPECTED_EVENT_TAXONOMY_KEYS = 2
2937

3038
EXPECTED_ORGANISATIONS = 2
3139
EXPECTED_EVENT_TYPES = 17
@@ -128,6 +136,7 @@ def test_corpora_values_correct(
128136
("author_type", EXPECTED_UNFCCC_AUTHOR_TYPES),
129137
("event_type", EXPECTED_EVENT_TYPES),
130138
("_document", EXPECTED_DOCUMENT_TAXONOMY_KEYS),
139+
("_event", EXPECTED_EVENT_TAXONOMY_KEYS),
131140
],
132141
),
133142
(
@@ -142,6 +151,7 @@ def test_corpora_values_correct(
142151
("instrument", EXPECTED_CCLW_INSTRUMENTS),
143152
("event_type", EXPECTED_EVENT_TYPES),
144153
("_document", EXPECTED_DOCUMENT_TAXONOMY_KEYS),
154+
("_event", EXPECTED_EVENT_TAXONOMY_KEYS),
145155
],
146156
),
147157
],
@@ -187,6 +197,13 @@ def test_taxonomy_value_counts_correct(
187197
("type", EXPECTED_DOCUMENT_TYPE),
188198
],
189199
),
200+
(
201+
"_event",
202+
[
203+
("datetime_event_name", 1),
204+
("event_type", EXPECTED_EVENT_TYPES),
205+
],
206+
),
190207
],
191208
),
192209
(
@@ -199,6 +216,13 @@ def test_taxonomy_value_counts_correct(
199216
("type", EXPECTED_DOCUMENT_TYPE),
200217
],
201218
),
219+
(
220+
"_event",
221+
[
222+
("datetime_event_name", 1),
223+
("event_type", EXPECTED_EVENT_TYPES),
224+
],
225+
),
202226
],
203227
),
204228
],
@@ -251,27 +275,25 @@ def test_entity_specific_taxonomy_value_counts_correct(
251275
# This will give us _document taxonomy keys such as role, type etc
252276
entity_specific_keys = schema.keys()
253277
expected_entity_specific_keys = [
254-
_entity_specific_key
255-
for _, _entity_specific_keys in expected_taxonomy_items
256-
for _entity_specific_key, __ in _entity_specific_keys
278+
key for key, _ in entity_specific_taxonomy_items
257279
]
258280

259281
test_c = set(entity_specific_keys).difference(
260282
set(expected_entity_specific_keys)
261283
)
262284
if test_c != set():
263285
logging.error(
264-
f"Actual entity specific key(s) {test_c} not present "
265-
f"in list of expected entity specific keys {expected_entity_specific_keys}"
286+
f"Actual {entity_specific_key} specific key(s) {test_c} not present "
287+
f"in list of expected {entity_specific_key} specific keys {expected_entity_specific_keys}"
266288
)
267289

268290
test_d = set(expected_entity_specific_keys).difference(
269291
set(entity_specific_keys)
270292
)
271293
if test_d != set():
272294
logging.error(
273-
f"Expected entity specific key(s) {test_d} not present "
274-
f"in list of actual entity specific keys {entity_specific_keys}"
295+
f"Expected {entity_specific_key} specific key(s) {test_d} not present "
296+
f"in list of actual {entity_specific_key} specific keys {entity_specific_keys}"
275297
)
276298

277299
assert set(entity_specific_keys) ^ set(expected_entity_specific_keys) == set()

0 commit comments

Comments
 (0)