From 85a9b876f8a08ccc6ba861682189b9ae9efdddf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20B=C3=A4ck?= Date: Thu, 25 May 2023 17:15:29 +0200 Subject: [PATCH 1/2] Add event_manifest.yml and a script to regenerate it This new file lists all available editions, 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. --- .github/workflows/test.yml | 5 +- Makefile | 12 +- event_manifest.yml | 181 +++++++++++++++++++++ generate_manifest.py | 76 +++++++++ releases-and-milestones/release-process.md | 3 +- 5 files changed, 271 insertions(+), 6 deletions(-) create mode 100644 event_manifest.yml create mode 100755 generate_manifest.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 35415091..c40dc293 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,4 +1,4 @@ -# Copyright 2022 Axis Communications AB. +# Copyright 2022-2023 Axis Communications AB. # For a full list of individual contributors, please see the commit history. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -37,6 +37,9 @@ jobs: steps: - uses: actions/checkout@v2 + with: + # We need to fetch the tags too. + fetch-depth: 0 - name: Install dependencies run: pip install -r requirements.txt diff --git a/Makefile b/Makefile index 900e642b..3eb057d4 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# Copyright 2022 Axis Communications AB. +# Copyright 2022-2023 Axis Communications AB. # For a full list of individual contributors, please see the commit history. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,15 +14,19 @@ # limitations under the License. .PHONY: all -all: generate_docs generate_schemas +all: generate_docs generate_manifest generate_schemas -# The generate_docs and generate_schemas goals assume that all Python -# package dependencies are available, e.g. via a virtualenv. +# The generate_* goals assume that all Python package dependencies are +# available, e.g. via a virtualenv. .PHONY: generate_docs generate_docs: ./generate_docs.py definitions/Eiffel*Event/*.yml +.PHONY: generate_manifest +generate_manifest: + ./generate_manifest.py > event_manifest.yml + .PHONY: generate_schemas generate_schemas: ./generate_schemas.py definitions/Eiffel*Event/*.yml diff --git a/event_manifest.yml b/event_manifest.yml new file mode 100644 index 00000000..66188797 --- /dev/null +++ b/event_manifest.yml @@ -0,0 +1,181 @@ +--- + - name: Agen + tag: edition-agen + events: + EiffelActivityCanceledEvent: 3.0.0 + EiffelActivityFinishedEvent: 3.0.0 + EiffelActivityStartedEvent: 3.0.0 + EiffelActivityTriggeredEvent: 3.0.0 + EiffelAnnouncementPublishedEvent: 3.0.0 + EiffelArtifactCreatedEvent: 3.0.0 + EiffelArtifactPublishedEvent: 3.0.0 + EiffelArtifactReusedEvent: 3.0.0 + EiffelCompositionDefinedEvent: 3.0.0 + EiffelConfidenceLevelModifiedEvent: 3.0.0 + EiffelEnvironmentDefinedEvent: 3.0.0 + EiffelFlowContextDefinedEvent: 3.0.0 + EiffelIssueDefinedEvent: 3.0.0 + EiffelIssueVerifiedEvent: 4.0.0 + EiffelSourceChangeCreatedEvent: 4.0.0 + EiffelSourceChangeSubmittedEvent: 3.0.0 + EiffelTestCaseCanceledEvent: 3.0.0 + EiffelTestCaseFinishedEvent: 3.0.0 + EiffelTestCaseStartedEvent: 3.0.0 + EiffelTestCaseTriggeredEvent: 3.0.0 + EiffelTestExecutionRecipeCollectionCreatedEvent: 4.0.0 + EiffelTestSuiteFinishedEvent: 3.0.0 + EiffelTestSuiteStartedEvent: 3.0.0 + - name: Agen-1 + tag: edition-agen-1 + events: + EiffelActivityCanceledEvent: 3.0.0 + EiffelActivityFinishedEvent: 3.0.0 + EiffelActivityStartedEvent: 4.0.0 + EiffelActivityTriggeredEvent: 4.0.0 + EiffelAnnouncementPublishedEvent: 3.0.0 + EiffelArtifactCreatedEvent: 3.0.0 + EiffelArtifactPublishedEvent: 3.0.0 + EiffelArtifactReusedEvent: 3.0.0 + EiffelCompositionDefinedEvent: 3.0.0 + EiffelConfidenceLevelModifiedEvent: 3.0.0 + EiffelEnvironmentDefinedEvent: 3.0.0 + EiffelFlowContextDefinedEvent: 3.0.0 + EiffelIssueDefinedEvent: 3.0.0 + EiffelIssueVerifiedEvent: 4.0.0 + EiffelSourceChangeCreatedEvent: 4.0.0 + EiffelSourceChangeSubmittedEvent: 3.0.0 + EiffelTestCaseCanceledEvent: 3.0.0 + EiffelTestCaseFinishedEvent: 3.0.0 + EiffelTestCaseStartedEvent: 3.0.0 + EiffelTestCaseTriggeredEvent: 3.0.0 + EiffelTestExecutionRecipeCollectionCreatedEvent: 4.0.0 + EiffelTestSuiteFinishedEvent: 3.0.0 + EiffelTestSuiteStartedEvent: 3.0.0 + - name: Arica + tag: edition-arica + events: + EiffelActivityCanceledEvent: 3.2.0 + EiffelActivityFinishedEvent: 3.3.0 + EiffelActivityStartedEvent: 4.3.0 + EiffelActivityTriggeredEvent: 4.2.0 + EiffelAnnouncementPublishedEvent: 3.2.0 + EiffelArtifactCreatedEvent: 3.3.0 + EiffelArtifactPublishedEvent: 3.3.0 + EiffelArtifactReusedEvent: 3.2.0 + EiffelCompositionDefinedEvent: 3.3.0 + EiffelConfidenceLevelModifiedEvent: 3.2.0 + EiffelEnvironmentDefinedEvent: 3.3.0 + EiffelFlowContextDefinedEvent: 3.2.0 + EiffelIssueDefinedEvent: 3.2.0 + EiffelIssueVerifiedEvent: 4.2.0 + EiffelSourceChangeCreatedEvent: 4.2.0 + EiffelSourceChangeSubmittedEvent: 3.2.0 + EiffelTestCaseCanceledEvent: 3.2.0 + EiffelTestCaseFinishedEvent: 3.3.0 + EiffelTestCaseStartedEvent: 3.3.0 + EiffelTestCaseTriggeredEvent: 3.2.0 + EiffelTestExecutionRecipeCollectionCreatedEvent: 4.3.0 + EiffelTestSuiteFinishedEvent: 3.3.0 + EiffelTestSuiteStartedEvent: 3.3.0 + - name: Bordeaux + tag: edition-bordeaux + events: + EiffelActivityCanceledEvent: 1.0.0 + EiffelActivityFinishedEvent: 1.0.0 + EiffelActivityStartedEvent: 1.0.0 + EiffelActivityTriggeredEvent: 1.0.0 + EiffelAnnouncementPublishedEvent: 1.0.0 + EiffelArtifactCreatedEvent: 1.0.0 + EiffelArtifactPublishedEvent: 1.0.0 + EiffelArtifactReusedEvent: 1.0.0 + EiffelCompositionDefinedEvent: 1.0.0 + EiffelConfidenceLevelModifiedEvent: 1.0.0 + EiffelEnvironmentDefinedEvent: 1.0.0 + EiffelFlowContextDefinedEvent: 1.0.0 + EiffelIssueVerifiedEvent: 1.0.0 + EiffelSourceChangeCreatedEvent: 1.0.0 + EiffelSourceChangeSubmittedEvent: 1.0.0 + EiffelTestCaseCanceledEvent: 1.0.0 + EiffelTestCaseFinishedEvent: 1.0.0 + EiffelTestCaseStartedEvent: 1.0.0 + EiffelTestCaseTriggeredEvent: 1.0.0 + EiffelTestExecutionRecipeCollectionCreatedEvent: 1.0.0 + EiffelTestSuiteFinishedEvent: 1.0.0 + EiffelTestSuiteStartedEvent: 1.0.0 + - name: Lyon + tag: edition-lyon + events: + EiffelActivityCanceledEvent: 3.1.0 + EiffelActivityFinishedEvent: 3.2.0 + EiffelActivityStartedEvent: 4.2.0 + EiffelActivityTriggeredEvent: 4.1.0 + EiffelAnnouncementPublishedEvent: 3.1.0 + EiffelArtifactCreatedEvent: 3.1.0 + EiffelArtifactPublishedEvent: 3.2.0 + EiffelArtifactReusedEvent: 3.1.0 + EiffelCompositionDefinedEvent: 3.2.0 + EiffelConfidenceLevelModifiedEvent: 3.1.0 + EiffelEnvironmentDefinedEvent: 3.2.0 + EiffelFlowContextDefinedEvent: 3.1.0 + EiffelIssueDefinedEvent: 3.1.0 + EiffelIssueVerifiedEvent: 4.1.0 + EiffelSourceChangeCreatedEvent: 4.1.0 + EiffelSourceChangeSubmittedEvent: 3.1.0 + EiffelTestCaseCanceledEvent: 3.1.0 + EiffelTestCaseFinishedEvent: 3.2.0 + EiffelTestCaseStartedEvent: 3.2.0 + EiffelTestCaseTriggeredEvent: 3.1.0 + EiffelTestExecutionRecipeCollectionCreatedEvent: 4.1.1 + EiffelTestSuiteFinishedEvent: 3.2.0 + EiffelTestSuiteStartedEvent: 3.2.0 + - name: Paris + tag: edition-paris + events: + EiffelActivityCanceledEvent: 3.0.0 + EiffelActivityFinishedEvent: 3.0.0 + EiffelActivityStartedEvent: 4.0.0 + EiffelActivityTriggeredEvent: 4.0.0 + EiffelAnnouncementPublishedEvent: 3.0.0 + EiffelArtifactCreatedEvent: 3.0.0 + EiffelArtifactPublishedEvent: 3.1.0 + EiffelArtifactReusedEvent: 3.0.0 + EiffelCompositionDefinedEvent: 3.1.0 + EiffelConfidenceLevelModifiedEvent: 3.0.0 + EiffelEnvironmentDefinedEvent: 3.0.0 + EiffelFlowContextDefinedEvent: 3.0.0 + EiffelIssueDefinedEvent: 3.0.0 + EiffelIssueVerifiedEvent: 4.0.0 + EiffelSourceChangeCreatedEvent: 4.0.0 + EiffelSourceChangeSubmittedEvent: 3.0.0 + EiffelTestCaseCanceledEvent: 3.0.0 + EiffelTestCaseFinishedEvent: 3.0.0 + EiffelTestCaseStartedEvent: 3.0.0 + EiffelTestCaseTriggeredEvent: 3.0.0 + EiffelTestExecutionRecipeCollectionCreatedEvent: 4.0.0 + EiffelTestSuiteFinishedEvent: 3.0.0 + EiffelTestSuiteStartedEvent: 3.0.0 + - name: Toulouse + tag: edition-toulouse + events: + EiffelActivityCanceledEvent: 1.1.0 + EiffelActivityFinishedEvent: 1.1.0 + EiffelActivityStartedEvent: 1.1.0 + EiffelActivityTriggeredEvent: 1.1.0 + EiffelAnnouncementPublishedEvent: 1.1.0 + EiffelArtifactCreatedEvent: 1.1.0 + EiffelArtifactPublishedEvent: 1.1.0 + EiffelArtifactReusedEvent: 1.1.0 + EiffelCompositionDefinedEvent: 1.1.0 + EiffelConfidenceLevelModifiedEvent: 1.1.0 + EiffelEnvironmentDefinedEvent: 1.1.0 + EiffelFlowContextDefinedEvent: 1.1.0 + EiffelIssueVerifiedEvent: 1.1.0 + EiffelSourceChangeCreatedEvent: 1.1.0 + EiffelSourceChangeSubmittedEvent: 1.1.0 + EiffelTestCaseCanceledEvent: 1.1.0 + EiffelTestCaseFinishedEvent: 1.1.0 + EiffelTestCaseStartedEvent: 1.1.0 + EiffelTestCaseTriggeredEvent: 1.1.0 + EiffelTestExecutionRecipeCollectionCreatedEvent: 2.1.0 + EiffelTestSuiteFinishedEvent: 1.1.0 + EiffelTestSuiteStartedEvent: 1.1.0 diff --git a/generate_manifest.py b/generate_manifest.py new file mode 100755 index 00000000..a201c760 --- /dev/null +++ b/generate_manifest.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 + +# Copyright 2023 Axis Communications AB. +# For a full list of individual contributors, please see the commit history. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import re +import subprocess +import sys +from typing import Dict + +import semver +from ruamel import yaml + +# Mapping of friendly edition names to their Git tags. +_EDITIONS = { + "Agen": "edition-agen", + "Agen-1": "edition-agen-1", + "Arica": "edition-arica", + "Bordeaux": "edition-bordeaux", + "Lyon": "edition-lyon", + "Paris": "edition-paris", + "Toulouse": "edition-toulouse", +} + + +def _get_latest_schemas(tag: str) -> Dict[str, str]: + """Given a tag, returns a mapping of the event types available in that + tag and the latest version of each such type. + """ + schema_file_regexp = re.compile(r"^schemas/([^/]+)/([^/]+).json$") + latest = {} + for schema_file in subprocess.check_output( + ["git", "ls-tree", "-r", "--name-only", tag, "--", "schemas"] + ).splitlines(): + match = schema_file_regexp.search(schema_file.decode("utf-8")) + if not match: + continue + event_type = match.group(1) + event_version = semver.VersionInfo.parse(match.group(2)) + if event_type not in latest or latest[event_type].compare(event_version) < 0: + latest[event_type] = event_version + return { + event_type: str(event_version) for event_type, event_version in latest.items() + } + + +def _main(): + manifest = [] + for name in sorted(_EDITIONS): + entry = { + "name": name, + "tag": _EDITIONS[name], + "events": _get_latest_schemas(_EDITIONS[name]), + } + manifest.append(entry) + + sys.stdout.write("---\n") + yaml_writer = yaml.YAML() + yaml_writer.indent(mapping=2, sequence=4, offset=2) + yaml_writer.dump(manifest, sys.stdout) + + +if __name__ == "__main__": + _main() diff --git a/releases-and-milestones/release-process.md b/releases-and-milestones/release-process.md index addefa11..f4307694 100644 --- a/releases-and-milestones/release-process.md +++ b/releases-and-milestones/release-process.md @@ -1,5 +1,5 @@