From 5c709b1acd9cc2e402f45f62cf1a52d54b4e823b Mon Sep 17 00:00:00 2001 From: Mark Reid Date: Wed, 3 May 2017 16:52:41 -0300 Subject: [PATCH] Bug 1337927 - Add version support to schema filenames (#44) * Bug 1337927 - Refactor repo layout to add versions Move files around and embed a major version inside the schema filename. * Add previous core schema versions * Remove the vacuous schema. * Fix a spurious comma --- .../README.shield.md => README.shield.md | 0 .../credentials/credentials.1.schema.json | 0 .../metadata/sources/sources.1.schema.json | 0 .../anonymous/anonymous.4.parquetmr.txt | 0 .../anonymous/anonymous.4.schema.json | 0 schemas/telemetry/core/core.1.schema.json | 41 ++++++++++ schemas/telemetry/core/core.2.schema.json | 74 +++++++++++++++++++ schemas/telemetry/core/core.3.schema.json | 74 +++++++++++++++++++ schemas/telemetry/core/core.4.schema.json | 74 +++++++++++++++++++ schemas/telemetry/core/core.5.schema.json | 74 +++++++++++++++++++ schemas/telemetry/core/core.6.schema.json | 74 +++++++++++++++++++ schemas/telemetry/core/core.7.schema.json | 74 +++++++++++++++++++ schemas/telemetry/core/core.8.schema.json | 74 +++++++++++++++++++ .../telemetry/core/core.9.parquetmr.txt | 0 .../telemetry/core/core.9.schema.json | 0 .../telemetry/crash/crash.4.schema.json | 0 .../focus-event/focus-event.1.parquetmr.txt | 0 .../focus-event/focus-event.1.schema.json | 0 .../telemetry/main/main.4.schema.json | 0 .../telemetry/modules/modules.4.schema.json | 0 .../shield-study-addon.3.parquetmr.txt | 0 .../shield-study-addon.3.schema.json | 0 .../shield-study-error.3.parquetmr.txt | 0 .../shield-study-error.3.schema.json | 0 .../shield-study/shield-study.3.parquetmr.txt | 0 .../shield-study/shield-study.3.schema.json | 0 telemetry/vacuous.schema.json | 8 -- validation/metadata/validate_metadata.py | 2 +- validation/telemetry/validate_main.py | 4 +- 29 files changed, 562 insertions(+), 11 deletions(-) rename telemetry/README.shield.md => README.shield.md (100%) rename metadata/metadata_credentials.schema.json => schemas/metadata/credentials/credentials.1.schema.json (100%) rename metadata/metadata_sources.schema.json => schemas/metadata/sources/sources.1.schema.json (100%) rename telemetry/anonymous.parquetmr.txt => schemas/telemetry/anonymous/anonymous.4.parquetmr.txt (100%) rename telemetry/anonymous.schema.json => schemas/telemetry/anonymous/anonymous.4.schema.json (100%) create mode 100644 schemas/telemetry/core/core.1.schema.json create mode 100644 schemas/telemetry/core/core.2.schema.json create mode 100644 schemas/telemetry/core/core.3.schema.json create mode 100644 schemas/telemetry/core/core.4.schema.json create mode 100644 schemas/telemetry/core/core.5.schema.json create mode 100644 schemas/telemetry/core/core.6.schema.json create mode 100644 schemas/telemetry/core/core.7.schema.json create mode 100644 schemas/telemetry/core/core.8.schema.json rename telemetry/core.parquetmr.txt => schemas/telemetry/core/core.9.parquetmr.txt (100%) rename telemetry/core.schema.json => schemas/telemetry/core/core.9.schema.json (100%) rename telemetry/crash.schema.json => schemas/telemetry/crash/crash.4.schema.json (100%) rename telemetry/focus-event.parquetmr.txt => schemas/telemetry/focus-event/focus-event.1.parquetmr.txt (100%) rename telemetry/focus-event.schema.json => schemas/telemetry/focus-event/focus-event.1.schema.json (100%) rename telemetry/main.schema.json => schemas/telemetry/main/main.4.schema.json (100%) rename telemetry/modules.schema.json => schemas/telemetry/modules/modules.4.schema.json (100%) rename telemetry/shield-study-addon.parquetmr.txt => schemas/telemetry/shield-study-addon/shield-study-addon.3.parquetmr.txt (100%) rename telemetry/shield-study-addon.schema.json => schemas/telemetry/shield-study-addon/shield-study-addon.3.schema.json (100%) rename telemetry/shield-study-error.parquetmr.txt => schemas/telemetry/shield-study-error/shield-study-error.3.parquetmr.txt (100%) rename telemetry/shield-study-error.schema.json => schemas/telemetry/shield-study-error/shield-study-error.3.schema.json (100%) rename telemetry/shield-study.parquetmr.txt => schemas/telemetry/shield-study/shield-study.3.parquetmr.txt (100%) rename telemetry/shield-study.schema.json => schemas/telemetry/shield-study/shield-study.3.schema.json (100%) delete mode 100644 telemetry/vacuous.schema.json diff --git a/telemetry/README.shield.md b/README.shield.md similarity index 100% rename from telemetry/README.shield.md rename to README.shield.md diff --git a/metadata/metadata_credentials.schema.json b/schemas/metadata/credentials/credentials.1.schema.json similarity index 100% rename from metadata/metadata_credentials.schema.json rename to schemas/metadata/credentials/credentials.1.schema.json diff --git a/metadata/metadata_sources.schema.json b/schemas/metadata/sources/sources.1.schema.json similarity index 100% rename from metadata/metadata_sources.schema.json rename to schemas/metadata/sources/sources.1.schema.json diff --git a/telemetry/anonymous.parquetmr.txt b/schemas/telemetry/anonymous/anonymous.4.parquetmr.txt similarity index 100% rename from telemetry/anonymous.parquetmr.txt rename to schemas/telemetry/anonymous/anonymous.4.parquetmr.txt diff --git a/telemetry/anonymous.schema.json b/schemas/telemetry/anonymous/anonymous.4.schema.json similarity index 100% rename from telemetry/anonymous.schema.json rename to schemas/telemetry/anonymous/anonymous.4.schema.json diff --git a/schemas/telemetry/core/core.1.schema.json b/schemas/telemetry/core/core.1.schema.json new file mode 100644 index 0000000..d5e5eb4 --- /dev/null +++ b/schemas/telemetry/core/core.1.schema.json @@ -0,0 +1,41 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "type" : "object", + "title" : "core", + "properties" : { + "v" : { + "type" : "integer", + "enum" : [ 1 ] + }, + "clientId" : { + "type" : "string", + "pattern" : "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "seq" : { + "type" : "integer", + "minimum" : 0 + }, + "locale" : { + "type" : "string" + }, + "os" : { + "type" : "string" + }, + "osversion" : { + "type" : "string" + }, + "device" : { + "type" : "string" + }, + "arch" : { + "type" : "string" + }, + "experiments" : { + "type" : "array", + "items" : { + "type" : "string" + } + } + }, + "required" : ["v", "clientId", "seq", "arch", "device", "locale", "os", "osversion"] +} diff --git a/schemas/telemetry/core/core.2.schema.json b/schemas/telemetry/core/core.2.schema.json new file mode 100644 index 0000000..b98f02d --- /dev/null +++ b/schemas/telemetry/core/core.2.schema.json @@ -0,0 +1,74 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "type" : "object", + "title" : "core", + "properties" : { + "v" : { + "type" : "integer", + "enum" : [ 2 ] + }, + "clientId" : { + "type" : "string", + "pattern" : "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "seq" : { + "type" : "integer", + "minimum" : 0 + }, + "locale" : { + "type" : "string" + }, + "os" : { + "type" : "string" + }, + "osversion" : { + "type" : "string" + }, + "device" : { + "type" : "string" + }, + "arch" : { + "type" : "string" + }, + "profileDate" : { + "type" : "integer" + }, + "defaultSearch" : { + "type" : ["string", "null"] + }, + "distributionId" : { + "type" : "string" + }, + "created" : { + "type" : "string" + }, + "tz" : { + "type" : "integer" + }, + "sessions" : { + "type" : "integer" + }, + "durations" : { + "type" : "integer" + }, + "searches" : { + "type" : "object", + "additionalProperties": { + "type": "integer" + } + }, + "experiments" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "flashUsage" : { + "type" : "integer" + }, + "campaign": { + "type": "string" + } + }, + "required" : ["v", "clientId", "seq", "arch", "device", "locale", "os", "osversion"] +} diff --git a/schemas/telemetry/core/core.3.schema.json b/schemas/telemetry/core/core.3.schema.json new file mode 100644 index 0000000..448401b --- /dev/null +++ b/schemas/telemetry/core/core.3.schema.json @@ -0,0 +1,74 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "type" : "object", + "title" : "core", + "properties" : { + "v" : { + "type" : "integer", + "enum" : [ 3 ] + }, + "clientId" : { + "type" : "string", + "pattern" : "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "seq" : { + "type" : "integer", + "minimum" : 0 + }, + "locale" : { + "type" : "string" + }, + "os" : { + "type" : "string" + }, + "osversion" : { + "type" : "string" + }, + "device" : { + "type" : "string" + }, + "arch" : { + "type" : "string" + }, + "profileDate" : { + "type" : "integer" + }, + "defaultSearch" : { + "type" : ["string", "null"] + }, + "distributionId" : { + "type" : "string" + }, + "created" : { + "type" : "string" + }, + "tz" : { + "type" : "integer" + }, + "sessions" : { + "type" : "integer" + }, + "durations" : { + "type" : "integer" + }, + "searches" : { + "type" : "object", + "additionalProperties": { + "type": "integer" + } + }, + "experiments" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "flashUsage" : { + "type" : "integer" + }, + "campaign": { + "type": "string" + } + }, + "required" : ["v", "clientId", "seq", "arch", "device", "locale", "os", "osversion"] +} diff --git a/schemas/telemetry/core/core.4.schema.json b/schemas/telemetry/core/core.4.schema.json new file mode 100644 index 0000000..69c9bbb --- /dev/null +++ b/schemas/telemetry/core/core.4.schema.json @@ -0,0 +1,74 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "type" : "object", + "title" : "core", + "properties" : { + "v" : { + "type" : "integer", + "enum" : [ 4 ] + }, + "clientId" : { + "type" : "string", + "pattern" : "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "seq" : { + "type" : "integer", + "minimum" : 0 + }, + "locale" : { + "type" : "string" + }, + "os" : { + "type" : "string" + }, + "osversion" : { + "type" : "string" + }, + "device" : { + "type" : "string" + }, + "arch" : { + "type" : "string" + }, + "profileDate" : { + "type" : "integer" + }, + "defaultSearch" : { + "type" : ["string", "null"] + }, + "distributionId" : { + "type" : "string" + }, + "created" : { + "type" : "string" + }, + "tz" : { + "type" : "integer" + }, + "sessions" : { + "type" : "integer" + }, + "durations" : { + "type" : "integer" + }, + "searches" : { + "type" : "object", + "additionalProperties": { + "type": "integer" + } + }, + "experiments" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "flashUsage" : { + "type" : "integer" + }, + "campaign": { + "type": "string" + } + }, + "required" : ["v", "clientId", "seq", "arch", "device", "locale", "os", "osversion"] +} diff --git a/schemas/telemetry/core/core.5.schema.json b/schemas/telemetry/core/core.5.schema.json new file mode 100644 index 0000000..d94b66b --- /dev/null +++ b/schemas/telemetry/core/core.5.schema.json @@ -0,0 +1,74 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "type" : "object", + "title" : "core", + "properties" : { + "v" : { + "type" : "integer", + "enum" : [ 5 ] + }, + "clientId" : { + "type" : "string", + "pattern" : "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "seq" : { + "type" : "integer", + "minimum" : 0 + }, + "locale" : { + "type" : "string" + }, + "os" : { + "type" : "string" + }, + "osversion" : { + "type" : "string" + }, + "device" : { + "type" : "string" + }, + "arch" : { + "type" : "string" + }, + "profileDate" : { + "type" : "integer" + }, + "defaultSearch" : { + "type" : ["string", "null"] + }, + "distributionId" : { + "type" : "string" + }, + "created" : { + "type" : "string" + }, + "tz" : { + "type" : "integer" + }, + "sessions" : { + "type" : "integer" + }, + "durations" : { + "type" : "integer" + }, + "searches" : { + "type" : "object", + "additionalProperties": { + "type": "integer" + } + }, + "experiments" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "flashUsage" : { + "type" : "integer" + }, + "campaign": { + "type": "string" + } + }, + "required" : ["v", "clientId", "seq", "arch", "device", "locale", "os", "osversion"] +} diff --git a/schemas/telemetry/core/core.6.schema.json b/schemas/telemetry/core/core.6.schema.json new file mode 100644 index 0000000..834a026 --- /dev/null +++ b/schemas/telemetry/core/core.6.schema.json @@ -0,0 +1,74 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "type" : "object", + "title" : "core", + "properties" : { + "v" : { + "type" : "integer", + "enum" : [ 6 ] + }, + "clientId" : { + "type" : "string", + "pattern" : "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "seq" : { + "type" : "integer", + "minimum" : 0 + }, + "locale" : { + "type" : "string" + }, + "os" : { + "type" : "string" + }, + "osversion" : { + "type" : "string" + }, + "device" : { + "type" : "string" + }, + "arch" : { + "type" : "string" + }, + "profileDate" : { + "type" : "integer" + }, + "defaultSearch" : { + "type" : ["string", "null"] + }, + "distributionId" : { + "type" : "string" + }, + "created" : { + "type" : "string" + }, + "tz" : { + "type" : "integer" + }, + "sessions" : { + "type" : "integer" + }, + "durations" : { + "type" : "integer" + }, + "searches" : { + "type" : "object", + "additionalProperties": { + "type": "integer" + } + }, + "experiments" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "flashUsage" : { + "type" : "integer" + }, + "campaign": { + "type": "string" + } + }, + "required" : ["v", "clientId", "seq", "arch", "device", "locale", "os", "osversion"] +} diff --git a/schemas/telemetry/core/core.7.schema.json b/schemas/telemetry/core/core.7.schema.json new file mode 100644 index 0000000..8d75813 --- /dev/null +++ b/schemas/telemetry/core/core.7.schema.json @@ -0,0 +1,74 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "type" : "object", + "title" : "core", + "properties" : { + "v" : { + "type" : "integer", + "enum" : [ 7 ] + }, + "clientId" : { + "type" : "string", + "pattern" : "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "seq" : { + "type" : "integer", + "minimum" : 0 + }, + "locale" : { + "type" : "string" + }, + "os" : { + "type" : "string" + }, + "osversion" : { + "type" : "string" + }, + "device" : { + "type" : "string" + }, + "arch" : { + "type" : "string" + }, + "profileDate" : { + "type" : "integer" + }, + "defaultSearch" : { + "type" : ["string", "null"] + }, + "distributionId" : { + "type" : "string" + }, + "created" : { + "type" : "string" + }, + "tz" : { + "type" : "integer" + }, + "sessions" : { + "type" : "integer" + }, + "durations" : { + "type" : "integer" + }, + "searches" : { + "type" : "object", + "additionalProperties": { + "type": "integer" + } + }, + "experiments" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "flashUsage" : { + "type" : "integer" + }, + "campaign": { + "type": "string" + } + }, + "required" : ["v", "clientId", "seq", "arch", "device", "locale", "os", "osversion"] +} diff --git a/schemas/telemetry/core/core.8.schema.json b/schemas/telemetry/core/core.8.schema.json new file mode 100644 index 0000000..fa54ab1 --- /dev/null +++ b/schemas/telemetry/core/core.8.schema.json @@ -0,0 +1,74 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "type" : "object", + "title" : "core", + "properties" : { + "v" : { + "type" : "integer", + "enum" : [ 8 ] + }, + "clientId" : { + "type" : "string", + "pattern" : "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" + }, + "seq" : { + "type" : "integer", + "minimum" : 0 + }, + "locale" : { + "type" : "string" + }, + "os" : { + "type" : "string" + }, + "osversion" : { + "type" : "string" + }, + "device" : { + "type" : "string" + }, + "arch" : { + "type" : "string" + }, + "profileDate" : { + "type" : "integer" + }, + "defaultSearch" : { + "type" : ["string", "null"] + }, + "distributionId" : { + "type" : "string" + }, + "created" : { + "type" : "string" + }, + "tz" : { + "type" : "integer" + }, + "sessions" : { + "type" : "integer" + }, + "durations" : { + "type" : "integer" + }, + "searches" : { + "type" : "object", + "additionalProperties": { + "type": "integer" + } + }, + "experiments" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "flashUsage" : { + "type" : "integer" + }, + "campaign": { + "type": "string" + } + }, + "required" : ["v", "clientId", "seq", "arch", "device", "locale", "os", "osversion"] +} diff --git a/telemetry/core.parquetmr.txt b/schemas/telemetry/core/core.9.parquetmr.txt similarity index 100% rename from telemetry/core.parquetmr.txt rename to schemas/telemetry/core/core.9.parquetmr.txt diff --git a/telemetry/core.schema.json b/schemas/telemetry/core/core.9.schema.json similarity index 100% rename from telemetry/core.schema.json rename to schemas/telemetry/core/core.9.schema.json diff --git a/telemetry/crash.schema.json b/schemas/telemetry/crash/crash.4.schema.json similarity index 100% rename from telemetry/crash.schema.json rename to schemas/telemetry/crash/crash.4.schema.json diff --git a/telemetry/focus-event.parquetmr.txt b/schemas/telemetry/focus-event/focus-event.1.parquetmr.txt similarity index 100% rename from telemetry/focus-event.parquetmr.txt rename to schemas/telemetry/focus-event/focus-event.1.parquetmr.txt diff --git a/telemetry/focus-event.schema.json b/schemas/telemetry/focus-event/focus-event.1.schema.json similarity index 100% rename from telemetry/focus-event.schema.json rename to schemas/telemetry/focus-event/focus-event.1.schema.json diff --git a/telemetry/main.schema.json b/schemas/telemetry/main/main.4.schema.json similarity index 100% rename from telemetry/main.schema.json rename to schemas/telemetry/main/main.4.schema.json diff --git a/telemetry/modules.schema.json b/schemas/telemetry/modules/modules.4.schema.json similarity index 100% rename from telemetry/modules.schema.json rename to schemas/telemetry/modules/modules.4.schema.json diff --git a/telemetry/shield-study-addon.parquetmr.txt b/schemas/telemetry/shield-study-addon/shield-study-addon.3.parquetmr.txt similarity index 100% rename from telemetry/shield-study-addon.parquetmr.txt rename to schemas/telemetry/shield-study-addon/shield-study-addon.3.parquetmr.txt diff --git a/telemetry/shield-study-addon.schema.json b/schemas/telemetry/shield-study-addon/shield-study-addon.3.schema.json similarity index 100% rename from telemetry/shield-study-addon.schema.json rename to schemas/telemetry/shield-study-addon/shield-study-addon.3.schema.json diff --git a/telemetry/shield-study-error.parquetmr.txt b/schemas/telemetry/shield-study-error/shield-study-error.3.parquetmr.txt similarity index 100% rename from telemetry/shield-study-error.parquetmr.txt rename to schemas/telemetry/shield-study-error/shield-study-error.3.parquetmr.txt diff --git a/telemetry/shield-study-error.schema.json b/schemas/telemetry/shield-study-error/shield-study-error.3.schema.json similarity index 100% rename from telemetry/shield-study-error.schema.json rename to schemas/telemetry/shield-study-error/shield-study-error.3.schema.json diff --git a/telemetry/shield-study.parquetmr.txt b/schemas/telemetry/shield-study/shield-study.3.parquetmr.txt similarity index 100% rename from telemetry/shield-study.parquetmr.txt rename to schemas/telemetry/shield-study/shield-study.3.parquetmr.txt diff --git a/telemetry/shield-study.schema.json b/schemas/telemetry/shield-study/shield-study.3.schema.json similarity index 100% rename from telemetry/shield-study.schema.json rename to schemas/telemetry/shield-study/shield-study.3.schema.json diff --git a/telemetry/vacuous.schema.json b/telemetry/vacuous.schema.json deleted file mode 100644 index 4a6f656..0000000 --- a/telemetry/vacuous.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema" : "http://json-schema.org/draft-04/schema#", - "type" : "object", - "name" : "vacuous", - "properties" : { - }, - "required" : [] -} diff --git a/validation/metadata/validate_metadata.py b/validation/metadata/validate_metadata.py index 5ff18c2..ab0a086 100644 --- a/validation/metadata/validate_metadata.py +++ b/validation/metadata/validate_metadata.py @@ -8,7 +8,7 @@ class Test_validate(unittest.TestCase): def test_metadata(self): for t in VALIDATION_TYPES: sample_data_filename = os.path.join(LOCAL, "sample_metadata_{}.json".format(t)) - sample_schema_filename = os.path.join(LOCAL, "../../metadata/metadata_{}.schema.json".format(t)) + sample_schema_filename = os.path.join(LOCAL, "../../schemas/metadata/{0}/{0}.1.schema.json".format(t)) with open(sample_data_filename) as data_file, open(sample_schema_filename) as schema_file: data = json.load(data_file) schema = json.load(schema_file) diff --git a/validation/telemetry/validate_main.py b/validation/telemetry/validate_main.py index a067382..29ce178 100644 --- a/validation/telemetry/validate_main.py +++ b/validation/telemetry/validate_main.py @@ -3,9 +3,9 @@ from jsonschema import validate, ValidationError LOCAL = os.path.dirname(__file__) SAMPLE_PING_PATH = os.path.join(LOCAL, 'sample_v4_ping.json') -MAIN_SCHEMA_PATH = os.path.join(LOCAL, '../../telemetry/main.schema.json') +MAIN_SCHEMA_PATH = os.path.join(LOCAL, '../../schemas/telemetry/main/main.4.schema.json') MODULES_PING_PATHS = [os.path.join(LOCAL, 'modules_v1_ping_linux.json'), os.path.join(LOCAL, 'modules_v1_ping_windows.json')] -MODULES_SCHEMA_PATH = os.path.join(LOCAL, '../../telemetry/modules.schema.json') +MODULES_SCHEMA_PATH = os.path.join(LOCAL, '../../schemas/telemetry/modules/modules.4.schema.json') class Test_validate(unittest.TestCase):