Skip to content

Commit 423ca27

Browse files
authored
Add event_manifest.yml and a script to generate it (#353)
This new file lists all available editions, their release dates, what event types are available in each, and the latest available version of each event type in each edition. This is useful for automation and SDK generation.
1 parent 70d8fa3 commit 423ca27

File tree

5 files changed

+280
-6
lines changed

5 files changed

+280
-6
lines changed

.github/workflows/test.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2022 Axis Communications AB.
1+
# Copyright 2022-2023 Axis Communications AB.
22
# For a full list of individual contributors, please see the commit history.
33
#
44
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -37,6 +37,9 @@ jobs:
3737

3838
steps:
3939
- uses: actions/checkout@v2
40+
with:
41+
# We need to fetch the tags too.
42+
fetch-depth: 0
4043

4144
- name: Install dependencies
4245
run: pip install -r requirements.txt

Makefile

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2022 Axis Communications AB.
1+
# Copyright 2022-2023 Axis Communications AB.
22
# For a full list of individual contributors, please see the commit history.
33
#
44
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,15 +14,19 @@
1414
# limitations under the License.
1515

1616
.PHONY: all
17-
all: generate_docs generate_schemas
17+
all: generate_docs generate_manifest generate_schemas
1818

19-
# The generate_docs and generate_schemas goals assume that all Python
20-
# package dependencies are available, e.g. via a virtualenv.
19+
# The generate_* goals assume that all Python package dependencies are
20+
# available, e.g. via a virtualenv.
2121

2222
.PHONY: generate_docs
2323
generate_docs:
2424
./generate_docs.py definitions/Eiffel*Event/*.yml
2525

26+
.PHONY: generate_manifest
27+
generate_manifest:
28+
./generate_manifest.py > event_manifest.yml
29+
2630
.PHONY: generate_schemas
2731
generate_schemas:
2832
./generate_schemas.py definitions/Eiffel*Event/*.yml

event_manifest.yml

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
---
2+
- name: Bordeaux
3+
tag: edition-bordeaux
4+
release_date: '2017-04-12'
5+
events:
6+
EiffelActivityCanceledEvent: 1.0.0
7+
EiffelActivityFinishedEvent: 1.0.0
8+
EiffelActivityStartedEvent: 1.0.0
9+
EiffelActivityTriggeredEvent: 1.0.0
10+
EiffelAnnouncementPublishedEvent: 1.0.0
11+
EiffelArtifactCreatedEvent: 1.0.0
12+
EiffelArtifactPublishedEvent: 1.0.0
13+
EiffelArtifactReusedEvent: 1.0.0
14+
EiffelCompositionDefinedEvent: 1.0.0
15+
EiffelConfidenceLevelModifiedEvent: 1.0.0
16+
EiffelEnvironmentDefinedEvent: 1.0.0
17+
EiffelFlowContextDefinedEvent: 1.0.0
18+
EiffelIssueVerifiedEvent: 1.0.0
19+
EiffelSourceChangeCreatedEvent: 1.0.0
20+
EiffelSourceChangeSubmittedEvent: 1.0.0
21+
EiffelTestCaseCanceledEvent: 1.0.0
22+
EiffelTestCaseFinishedEvent: 1.0.0
23+
EiffelTestCaseStartedEvent: 1.0.0
24+
EiffelTestCaseTriggeredEvent: 1.0.0
25+
EiffelTestExecutionRecipeCollectionCreatedEvent: 1.0.0
26+
EiffelTestSuiteFinishedEvent: 1.0.0
27+
EiffelTestSuiteStartedEvent: 1.0.0
28+
- name: Toulouse
29+
tag: edition-toulouse
30+
release_date: '2018-02-20'
31+
events:
32+
EiffelActivityCanceledEvent: 1.1.0
33+
EiffelActivityFinishedEvent: 1.1.0
34+
EiffelActivityStartedEvent: 1.1.0
35+
EiffelActivityTriggeredEvent: 1.1.0
36+
EiffelAnnouncementPublishedEvent: 1.1.0
37+
EiffelArtifactCreatedEvent: 1.1.0
38+
EiffelArtifactPublishedEvent: 1.1.0
39+
EiffelArtifactReusedEvent: 1.1.0
40+
EiffelCompositionDefinedEvent: 1.1.0
41+
EiffelConfidenceLevelModifiedEvent: 1.1.0
42+
EiffelEnvironmentDefinedEvent: 1.1.0
43+
EiffelFlowContextDefinedEvent: 1.1.0
44+
EiffelIssueVerifiedEvent: 1.1.0
45+
EiffelSourceChangeCreatedEvent: 1.1.0
46+
EiffelSourceChangeSubmittedEvent: 1.1.0
47+
EiffelTestCaseCanceledEvent: 1.1.0
48+
EiffelTestCaseFinishedEvent: 1.1.0
49+
EiffelTestCaseStartedEvent: 1.1.0
50+
EiffelTestCaseTriggeredEvent: 1.1.0
51+
EiffelTestExecutionRecipeCollectionCreatedEvent: 2.1.0
52+
EiffelTestSuiteFinishedEvent: 1.1.0
53+
EiffelTestSuiteStartedEvent: 1.1.0
54+
- name: Agen
55+
tag: edition-agen
56+
release_date: '2018-09-19'
57+
events:
58+
EiffelActivityCanceledEvent: 3.0.0
59+
EiffelActivityFinishedEvent: 3.0.0
60+
EiffelActivityStartedEvent: 3.0.0
61+
EiffelActivityTriggeredEvent: 3.0.0
62+
EiffelAnnouncementPublishedEvent: 3.0.0
63+
EiffelArtifactCreatedEvent: 3.0.0
64+
EiffelArtifactPublishedEvent: 3.0.0
65+
EiffelArtifactReusedEvent: 3.0.0
66+
EiffelCompositionDefinedEvent: 3.0.0
67+
EiffelConfidenceLevelModifiedEvent: 3.0.0
68+
EiffelEnvironmentDefinedEvent: 3.0.0
69+
EiffelFlowContextDefinedEvent: 3.0.0
70+
EiffelIssueDefinedEvent: 3.0.0
71+
EiffelIssueVerifiedEvent: 4.0.0
72+
EiffelSourceChangeCreatedEvent: 4.0.0
73+
EiffelSourceChangeSubmittedEvent: 3.0.0
74+
EiffelTestCaseCanceledEvent: 3.0.0
75+
EiffelTestCaseFinishedEvent: 3.0.0
76+
EiffelTestCaseStartedEvent: 3.0.0
77+
EiffelTestCaseTriggeredEvent: 3.0.0
78+
EiffelTestExecutionRecipeCollectionCreatedEvent: 4.0.0
79+
EiffelTestSuiteFinishedEvent: 3.0.0
80+
EiffelTestSuiteStartedEvent: 3.0.0
81+
- name: Agen-1
82+
tag: edition-agen-1
83+
release_date: '2019-04-29'
84+
events:
85+
EiffelActivityCanceledEvent: 3.0.0
86+
EiffelActivityFinishedEvent: 3.0.0
87+
EiffelActivityStartedEvent: 4.0.0
88+
EiffelActivityTriggeredEvent: 4.0.0
89+
EiffelAnnouncementPublishedEvent: 3.0.0
90+
EiffelArtifactCreatedEvent: 3.0.0
91+
EiffelArtifactPublishedEvent: 3.0.0
92+
EiffelArtifactReusedEvent: 3.0.0
93+
EiffelCompositionDefinedEvent: 3.0.0
94+
EiffelConfidenceLevelModifiedEvent: 3.0.0
95+
EiffelEnvironmentDefinedEvent: 3.0.0
96+
EiffelFlowContextDefinedEvent: 3.0.0
97+
EiffelIssueDefinedEvent: 3.0.0
98+
EiffelIssueVerifiedEvent: 4.0.0
99+
EiffelSourceChangeCreatedEvent: 4.0.0
100+
EiffelSourceChangeSubmittedEvent: 3.0.0
101+
EiffelTestCaseCanceledEvent: 3.0.0
102+
EiffelTestCaseFinishedEvent: 3.0.0
103+
EiffelTestCaseStartedEvent: 3.0.0
104+
EiffelTestCaseTriggeredEvent: 3.0.0
105+
EiffelTestExecutionRecipeCollectionCreatedEvent: 4.0.0
106+
EiffelTestSuiteFinishedEvent: 3.0.0
107+
EiffelTestSuiteStartedEvent: 3.0.0
108+
- name: Paris
109+
tag: edition-paris
110+
release_date: '2021-02-16'
111+
events:
112+
EiffelActivityCanceledEvent: 3.0.0
113+
EiffelActivityFinishedEvent: 3.0.0
114+
EiffelActivityStartedEvent: 4.0.0
115+
EiffelActivityTriggeredEvent: 4.0.0
116+
EiffelAnnouncementPublishedEvent: 3.0.0
117+
EiffelArtifactCreatedEvent: 3.0.0
118+
EiffelArtifactPublishedEvent: 3.1.0
119+
EiffelArtifactReusedEvent: 3.0.0
120+
EiffelCompositionDefinedEvent: 3.1.0
121+
EiffelConfidenceLevelModifiedEvent: 3.0.0
122+
EiffelEnvironmentDefinedEvent: 3.0.0
123+
EiffelFlowContextDefinedEvent: 3.0.0
124+
EiffelIssueDefinedEvent: 3.0.0
125+
EiffelIssueVerifiedEvent: 4.0.0
126+
EiffelSourceChangeCreatedEvent: 4.0.0
127+
EiffelSourceChangeSubmittedEvent: 3.0.0
128+
EiffelTestCaseCanceledEvent: 3.0.0
129+
EiffelTestCaseFinishedEvent: 3.0.0
130+
EiffelTestCaseStartedEvent: 3.0.0
131+
EiffelTestCaseTriggeredEvent: 3.0.0
132+
EiffelTestExecutionRecipeCollectionCreatedEvent: 4.0.0
133+
EiffelTestSuiteFinishedEvent: 3.0.0
134+
EiffelTestSuiteStartedEvent: 3.0.0
135+
- name: Lyon
136+
tag: edition-lyon
137+
release_date: '2021-10-12'
138+
events:
139+
EiffelActivityCanceledEvent: 3.1.0
140+
EiffelActivityFinishedEvent: 3.2.0
141+
EiffelActivityStartedEvent: 4.2.0
142+
EiffelActivityTriggeredEvent: 4.1.0
143+
EiffelAnnouncementPublishedEvent: 3.1.0
144+
EiffelArtifactCreatedEvent: 3.1.0
145+
EiffelArtifactPublishedEvent: 3.2.0
146+
EiffelArtifactReusedEvent: 3.1.0
147+
EiffelCompositionDefinedEvent: 3.2.0
148+
EiffelConfidenceLevelModifiedEvent: 3.1.0
149+
EiffelEnvironmentDefinedEvent: 3.2.0
150+
EiffelFlowContextDefinedEvent: 3.1.0
151+
EiffelIssueDefinedEvent: 3.1.0
152+
EiffelIssueVerifiedEvent: 4.1.0
153+
EiffelSourceChangeCreatedEvent: 4.1.0
154+
EiffelSourceChangeSubmittedEvent: 3.1.0
155+
EiffelTestCaseCanceledEvent: 3.1.0
156+
EiffelTestCaseFinishedEvent: 3.2.0
157+
EiffelTestCaseStartedEvent: 3.2.0
158+
EiffelTestCaseTriggeredEvent: 3.1.0
159+
EiffelTestExecutionRecipeCollectionCreatedEvent: 4.1.1
160+
EiffelTestSuiteFinishedEvent: 3.2.0
161+
EiffelTestSuiteStartedEvent: 3.2.0
162+
- name: Arica
163+
tag: edition-arica
164+
release_date: '2022-11-18'
165+
events:
166+
EiffelActivityCanceledEvent: 3.2.0
167+
EiffelActivityFinishedEvent: 3.3.0
168+
EiffelActivityStartedEvent: 4.3.0
169+
EiffelActivityTriggeredEvent: 4.2.0
170+
EiffelAnnouncementPublishedEvent: 3.2.0
171+
EiffelArtifactCreatedEvent: 3.3.0
172+
EiffelArtifactPublishedEvent: 3.3.0
173+
EiffelArtifactReusedEvent: 3.2.0
174+
EiffelCompositionDefinedEvent: 3.3.0
175+
EiffelConfidenceLevelModifiedEvent: 3.2.0
176+
EiffelEnvironmentDefinedEvent: 3.3.0
177+
EiffelFlowContextDefinedEvent: 3.2.0
178+
EiffelIssueDefinedEvent: 3.2.0
179+
EiffelIssueVerifiedEvent: 4.2.0
180+
EiffelSourceChangeCreatedEvent: 4.2.0
181+
EiffelSourceChangeSubmittedEvent: 3.2.0
182+
EiffelTestCaseCanceledEvent: 3.2.0
183+
EiffelTestCaseFinishedEvent: 3.3.0
184+
EiffelTestCaseStartedEvent: 3.3.0
185+
EiffelTestCaseTriggeredEvent: 3.2.0
186+
EiffelTestExecutionRecipeCollectionCreatedEvent: 4.3.0
187+
EiffelTestSuiteFinishedEvent: 3.3.0
188+
EiffelTestSuiteStartedEvent: 3.3.0

generate_manifest.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#!/usr/bin/env python3
2+
3+
# Copyright 2023 Axis Communications AB.
4+
# For a full list of individual contributors, please see the commit history.
5+
#
6+
# Licensed under the Apache License, Version 2.0 (the "License");
7+
# you may not use this file except in compliance with the License.
8+
# You may obtain a copy of the License at
9+
#
10+
# http://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
# See the License for the specific language governing permissions and
16+
# limitations under the License.
17+
18+
import re
19+
import subprocess
20+
import sys
21+
from typing import Dict
22+
23+
import semver
24+
from ruamel import yaml
25+
26+
# List of tuples with the edition display names, their Git tags, and
27+
# their release dates.
28+
_EDITIONS = [
29+
("Agen", "edition-agen", "2018-09-19"),
30+
("Agen-1", "edition-agen-1", "2019-04-29"),
31+
("Arica", "edition-arica", "2022-11-18"),
32+
("Bordeaux", "edition-bordeaux", "2017-04-12"),
33+
("Lyon", "edition-lyon", "2021-10-12"),
34+
("Paris", "edition-paris", "2021-02-16"),
35+
("Toulouse", "edition-toulouse", "2018-02-20"),
36+
]
37+
38+
39+
def _get_latest_schemas(tag: str) -> Dict[str, str]:
40+
"""Given a tag, returns a mapping of the event types available in that
41+
tag and the latest version of each such type.
42+
"""
43+
schema_file_regexp = re.compile(r"^schemas/([^/]+)/([^/]+).json$")
44+
latest = {}
45+
for schema_file in subprocess.check_output(
46+
["git", "ls-tree", "-r", "--name-only", tag, "--", "schemas"]
47+
).splitlines():
48+
match = schema_file_regexp.search(schema_file.decode("utf-8"))
49+
if not match:
50+
continue
51+
event_type = match.group(1)
52+
event_version = semver.VersionInfo.parse(match.group(2))
53+
if event_type not in latest or latest[event_type].compare(event_version) < 0:
54+
latest[event_type] = event_version
55+
return {
56+
event_type: str(event_version) for event_type, event_version in latest.items()
57+
}
58+
59+
60+
def _main():
61+
manifest = [
62+
{
63+
"name": name,
64+
"tag": tag,
65+
"release_date": date,
66+
"events": _get_latest_schemas(tag),
67+
}
68+
for name, tag, date in sorted(_EDITIONS, key=lambda edition: edition[2])
69+
]
70+
71+
sys.stdout.write("---\n")
72+
yaml_writer = yaml.YAML()
73+
yaml_writer.indent(mapping=2, sequence=4, offset=2)
74+
yaml_writer.dump(manifest, sys.stdout)
75+
76+
77+
if __name__ == "__main__":
78+
_main()

releases-and-milestones/release-process.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!---
2-
Copyright 2022 Axis Communications AB.
2+
Copyright 2022-2023 Axis Communications AB.
33
For a full list of individual contributors, please see the commit history.
44
55
Licensed under the Apache License, Version 2.0 (the "License");
@@ -33,6 +33,7 @@ When all issues in the scope of the edition have been closed and it's time to ma
3333
1. Create a pull request with the following changes (see [PR 277](https://github.com/eiffel-community/eiffel/pull/277) for reference):
3434
1. Change all "No edition set" entries in the release tables of the latest YAML file for each event type to a link to the not yet existing edition tag.
3535
1. Claim the edition in [versioning.md](../eiffel-syntax-and-usage/versioning.md), including a short summary of the changes in the edition.
36+
1. Add an entry for the new edition to [generate_manifest.py](../generate_manifest.py). Unfortunately, this means that CI for the resulting commit won't succeed until the tag has been created (see next step).
3637
1. When the pull request has been merged, create and push an "edition-\<name>" annotated tag (use `git tag -a`). The tag comment could include a short version of the included changes to the protocol. Any new major versions of event types should be called out.
3738
1. Create a GitHub release based on the newly pushed tag. The tag comment can probably be reused as the release description.
3839
1. Create issue(s) for updating other repositories to reference the new edition:

0 commit comments

Comments
 (0)