From f83771dfceb9d800d17955219b33e50eb155cc04 Mon Sep 17 00:00:00 2001 From: ChenMoFeiJin <1424865872@qq.com> Date: Thu, 7 Sep 2023 20:06:40 +0800 Subject: presets: Add missing spaces in JSON schema --- Help/manual/presets/schema.json | 64 ++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/Help/manual/presets/schema.json b/Help/manual/presets/schema.json index adfb1cb..71db769 100644 --- a/Help/manual/presets/schema.json +++ b/Help/manual/presets/schema.json @@ -9,9 +9,9 @@ "const": 1, "description": "A required integer representing the version of the JSON schema." }, - "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired"}, + "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired" }, "vendor": { "$ref": "#/definitions/vendor" }, - "configurePresets": { "$ref": "#/definitions/configurePresetsV1"} + "configurePresets": { "$ref": "#/definitions/configurePresetsV1" } }, "additionalProperties": false }, @@ -21,11 +21,11 @@ "const": 2, "description": "A required integer representing the version of the JSON schema." }, - "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired"}, + "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired" }, "vendor": { "$ref": "#/definitions/vendor" }, - "configurePresets": { "$ref": "#/definitions/configurePresetsV1"}, - "buildPresets": { "$ref": "#/definitions/buildPresetsV2"}, - "testPresets": { "$ref": "#/definitions/testPresetsV2"} + "configurePresets": { "$ref": "#/definitions/configurePresetsV1" }, + "buildPresets": { "$ref": "#/definitions/buildPresetsV2" }, + "testPresets": { "$ref": "#/definitions/testPresetsV2" } }, "additionalProperties": false }, @@ -35,11 +35,11 @@ "const": 3, "description": "A required integer representing the version of the JSON schema." }, - "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired"}, + "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired" }, "vendor": { "$ref": "#/definitions/vendor" }, - "configurePresets": { "$ref": "#/definitions/configurePresetsV3"}, - "buildPresets": { "$ref": "#/definitions/buildPresetsV3"}, - "testPresets": { "$ref": "#/definitions/testPresetsV3"} + "configurePresets": { "$ref": "#/definitions/configurePresetsV3" }, + "buildPresets": { "$ref": "#/definitions/buildPresetsV3" }, + "testPresets": { "$ref": "#/definitions/testPresetsV3" } }, "additionalProperties": false }, @@ -49,12 +49,12 @@ "const": 4, "description": "A required integer representing the version of the JSON schema." }, - "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired"}, + "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired" }, "vendor": { "$ref": "#/definitions/vendor" }, - "configurePresets": { "$ref": "#/definitions/configurePresetsV3"}, - "buildPresets": { "$ref": "#/definitions/buildPresetsV4"}, - "testPresets": { "$ref": "#/definitions/testPresetsV3"}, - "include": { "$ref": "#/definitions/include"} + "configurePresets": { "$ref": "#/definitions/configurePresetsV3" }, + "buildPresets": { "$ref": "#/definitions/buildPresetsV4" }, + "testPresets": { "$ref": "#/definitions/testPresetsV3" }, + "include": { "$ref": "#/definitions/include" } }, "additionalProperties": false }, @@ -64,12 +64,12 @@ "const": 5, "description": "A required integer representing the version of the JSON schema." }, - "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired"}, + "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired" }, "vendor": { "$ref": "#/definitions/vendor" }, - "configurePresets": { "$ref": "#/definitions/configurePresetsV3"}, - "buildPresets": { "$ref": "#/definitions/buildPresetsV4"}, - "testPresets": { "$ref": "#/definitions/testPresetsV5"}, - "include": { "$ref": "#/definitions/include"} + "configurePresets": { "$ref": "#/definitions/configurePresetsV3" }, + "buildPresets": { "$ref": "#/definitions/buildPresetsV4" }, + "testPresets": { "$ref": "#/definitions/testPresetsV5" }, + "include": { "$ref": "#/definitions/include" } }, "additionalProperties": false }, @@ -79,14 +79,14 @@ "const": 6, "description": "A required integer representing the version of the JSON schema." }, - "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired"}, + "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired" }, "vendor": { "$ref": "#/definitions/vendor" }, - "configurePresets": { "$ref": "#/definitions/configurePresetsV3"}, - "buildPresets": { "$ref": "#/definitions/buildPresetsV4"}, - "testPresets": { "$ref": "#/definitions/testPresetsV6"}, - "packagePresets": { "$ref": "#/definitions/packagePresetsV6"}, + "configurePresets": { "$ref": "#/definitions/configurePresetsV3" }, + "buildPresets": { "$ref": "#/definitions/buildPresetsV4" }, + "testPresets": { "$ref": "#/definitions/testPresetsV6" }, + "packagePresets": { "$ref": "#/definitions/packagePresetsV6" }, "workflowPresets": { "$ref": "#/definitions/workflowPresetsV6" }, - "include": { "$ref": "#/definitions/include"} + "include": { "$ref": "#/definitions/include" } }, "additionalProperties": false }, @@ -96,14 +96,14 @@ "const": 7, "description": "A required integer representing the version of the JSON schema." }, - "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired"}, + "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired" }, "vendor": { "$ref": "#/definitions/vendor" }, - "configurePresets": { "$ref": "#/definitions/configurePresetsV7"}, - "buildPresets": { "$ref": "#/definitions/buildPresetsV4"}, - "testPresets": { "$ref": "#/definitions/testPresetsV6"}, - "packagePresets": { "$ref": "#/definitions/packagePresetsV6"}, + "configurePresets": { "$ref": "#/definitions/configurePresetsV7" }, + "buildPresets": { "$ref": "#/definitions/buildPresetsV4" }, + "testPresets": { "$ref": "#/definitions/testPresetsV6" }, + "packagePresets": { "$ref": "#/definitions/packagePresetsV6" }, "workflowPresets": { "$ref": "#/definitions/workflowPresetsV6" }, - "include": { "$ref": "#/definitions/include"} + "include": { "$ref": "#/definitions/include" } }, "additionalProperties": false } -- cgit v0.12 From f1a717952020401502a109de7af211130251a067 Mon Sep 17 00:00:00 2001 From: ChenMoFeiJin <1424865872@qq.com> Date: Thu, 7 Sep 2023 20:04:02 +0800 Subject: presets: Add $schema property to JSON schema MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Many modern code editors have support for JSON Schema. When you specify the `$schema` property in a JSON file, the editor can provide features like auto-completion, error checking, etc., which can improve your efficiency when writing and modifying the `CMakePresets.json` file. --- Help/manual/cmake-presets.7.rst | 9 +++++++++ Help/manual/presets/schema.json | 23 ++++++++++++++++++++++ Help/release/dev/presets-schema.rst | 5 +++++ Source/cmCMakePresetsErrors.cxx | 5 +++++ Source/cmCMakePresetsErrors.h | 2 ++ Source/cmCMakePresetsGraphInternal.h | 3 +++ Source/cmCMakePresetsGraphReadJSON.cxx | 19 ++++++++++++++++-- Tests/RunCMake/CMakePresets/RunCMakeTest.cmake | 7 +++++++ .../CMakePresets/SchemaNotSupported-result.txt | 1 + .../CMakePresets/SchemaNotSupported-stderr.txt | 3 +++ .../CMakePresets/SchemaNotSupported.json.in | 4 ++++ .../CMakePresets/SchemaSupported-result.txt | 1 + .../RunCMake/CMakePresets/SchemaSupported.json.in | 4 ++++ 13 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 Help/release/dev/presets-schema.rst create mode 100644 Tests/RunCMake/CMakePresets/SchemaNotSupported-result.txt create mode 100644 Tests/RunCMake/CMakePresets/SchemaNotSupported-stderr.txt create mode 100644 Tests/RunCMake/CMakePresets/SchemaNotSupported.json.in create mode 100644 Tests/RunCMake/CMakePresets/SchemaSupported-result.txt create mode 100644 Tests/RunCMake/CMakePresets/SchemaSupported.json.in diff --git a/Help/manual/cmake-presets.7.rst b/Help/manual/cmake-presets.7.rst index e2366da..46b5fc7 100644 --- a/Help/manual/cmake-presets.7.rst +++ b/Help/manual/cmake-presets.7.rst @@ -41,6 +41,15 @@ The files are a JSON document with an object as the root: The root object recognizes the following fields: +``$schema`` + An optional string that provides a URI to the JSON schema that describes the + structure of this JSON document. This field is used for validation and + autocompletion in editors that support JSON schema. It doesn't affect the + behavior of the document itself. If this field is not specified, the JSON + document will still be valid, but tools that use JSON schema for validation + and autocompletion may not function correctly. + This is allowed in preset files specifying version ``8`` or above. + ``version`` A required integer representing the version of the JSON schema. The supported versions are: diff --git a/Help/manual/presets/schema.json b/Help/manual/presets/schema.json index 71db769..d27faa1 100644 --- a/Help/manual/presets/schema.json +++ b/Help/manual/presets/schema.json @@ -106,12 +106,35 @@ "include": { "$ref": "#/definitions/include" } }, "additionalProperties": false + }, + { + "properties": { + "$schema": { "$ref": "#/definitions/$schema" }, + "version": { + "const": 8, + "description": "A required integer representing the version of the JSON schema." + }, + "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired" }, + "vendor": { "$ref": "#/definitions/vendor" }, + "configurePresets": { "$ref": "#/definitions/configurePresetsV7" }, + "buildPresets": { "$ref": "#/definitions/buildPresetsV4" }, + "testPresets": { "$ref": "#/definitions/testPresetsV6" }, + "packagePresets": { "$ref": "#/definitions/packagePresetsV6" }, + "workflowPresets": { "$ref": "#/definitions/workflowPresetsV6" }, + "include": { "$ref": "#/definitions/include" } + }, + "additionalProperties": false } ], "required": [ "version" ], "definitions": { + "$schema": { + "type": "string", + "description": "The schema against which to verify this document.", + "format": "uri-reference" + }, "cmakeMinimumRequired": { "type": "object", "description": "An optional object representing the minimum version of CMake needed to build this project.", diff --git a/Help/release/dev/presets-schema.rst b/Help/release/dev/presets-schema.rst new file mode 100644 index 0000000..964373c --- /dev/null +++ b/Help/release/dev/presets-schema.rst @@ -0,0 +1,5 @@ +presets-schema +-------------- + +* :manual:`cmake-presets(7)` files now support schema version ``8``. + It adds support for a ``$schema`` field. diff --git a/Source/cmCMakePresetsErrors.cxx b/Source/cmCMakePresetsErrors.cxx index e0ff0c6..1b88a0c 100644 --- a/Source/cmCMakePresetsErrors.cxx +++ b/Source/cmCMakePresetsErrors.cxx @@ -302,4 +302,9 @@ void PRESET_MISSING_FIELD(const std::string& presetName, state->AddError(cmStrCat("Preset \"", presetName, "\" missing field \"", missingField, "\"")); } + +void SCHEMA_UNSUPPORTED(cmJSONState* state) +{ + state->AddError("File version must be 8 or higher for $schema support"); +} } diff --git a/Source/cmCMakePresetsErrors.h b/Source/cmCMakePresetsErrors.h index 14aaed7..b755c25 100644 --- a/Source/cmCMakePresetsErrors.h +++ b/Source/cmCMakePresetsErrors.h @@ -113,4 +113,6 @@ JsonErrors::ErrorGenerator INVALID_ROOT_OBJECT( void PRESET_MISSING_FIELD(const std::string& presetName, const std::string& missingField, cmJSONState* state); + +void SCHEMA_UNSUPPORTED(cmJSONState* state); } diff --git a/Source/cmCMakePresetsGraphInternal.h b/Source/cmCMakePresetsGraphInternal.h index f133efb..5c76e0e 100644 --- a/Source/cmCMakePresetsGraphInternal.h +++ b/Source/cmCMakePresetsGraphInternal.h @@ -2,6 +2,7 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once +#include #include #include #include @@ -179,4 +180,6 @@ bool PresetVectorOneOrMoreStringHelper(std::vector& out, bool EnvironmentMapHelper( std::map>& out, const Json::Value* value, cmJSONState* state); + +cmJSONHelper SchemaHelper(); } diff --git a/Source/cmCMakePresetsGraphReadJSON.cxx b/Source/cmCMakePresetsGraphReadJSON.cxx index 8d63441..0d8ec63 100644 --- a/Source/cmCMakePresetsGraphReadJSON.cxx +++ b/Source/cmCMakePresetsGraphReadJSON.cxx @@ -38,7 +38,7 @@ using MacroExpander = cmCMakePresetsGraphInternal::MacroExpander; using cmCMakePresetsGraphInternal::ExpandMacros; constexpr int MIN_VERSION = 1; -constexpr int MAX_VERSION = 7; +constexpr int MAX_VERSION = 8; struct CMakeVersion { @@ -294,7 +294,9 @@ auto const RootPresetsHelper = .Bind("vendor"_s, nullptr, cmCMakePresetsGraphInternal::VendorHelper( cmCMakePresetsErrors::INVALID_ROOT), - false); + false) + .Bind("$schema"_s, nullptr, + cmCMakePresetsGraphInternal::SchemaHelper(), false); } namespace cmCMakePresetsGraphInternal { @@ -413,6 +415,13 @@ bool EnvironmentMapHelper( return helper(out, value, state); } + +cmJSONHelper SchemaHelper() +{ + return [](std::nullptr_t&, const Json::Value*, cmJSONState*) -> bool { + return true; + }; +} } bool cmCMakePresetsGraph::ReadJSONFile(const std::string& filename, @@ -488,6 +497,12 @@ bool cmCMakePresetsGraph::ReadJSONFile(const std::string& filename, return false; } + // Support for $schema added in version 8. + if (v < 8 && root.isMember("$schema")) { + cmCMakePresetsErrors::SCHEMA_UNSUPPORTED(&this->parseState); + return false; + } + RootPresets presets; if ((result = RootPresetsHelper(presets, &root, &parseState)) != true) { return result; diff --git a/Tests/RunCMake/CMakePresets/RunCMakeTest.cmake b/Tests/RunCMake/CMakePresets/RunCMakeTest.cmake index c4a8b3f..88027fb 100644 --- a/Tests/RunCMake/CMakePresets/RunCMakeTest.cmake +++ b/Tests/RunCMake/CMakePresets/RunCMakeTest.cmake @@ -153,6 +153,13 @@ run_cmake_presets(ConditionFuture) run_cmake_presets(SubConditionNull) run_cmake_presets(TraceNotSupported) +set(CMakePresets_NO_PRESET 1) +set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) +run_cmake_presets(SchemaSupported --list-presets) +set(CMakePresets_SCHEMA_EXPECTED_RESULT 1) +run_cmake_presets(SchemaNotSupported --list-presets) +unset(CMakePresets_NO_PRESET) + # Test cmakeMinimumRequired field run_cmake_presets(MinimumRequiredInvalid) set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) diff --git a/Tests/RunCMake/CMakePresets/SchemaNotSupported-result.txt b/Tests/RunCMake/CMakePresets/SchemaNotSupported-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/CMakePresets/SchemaNotSupported-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CMakePresets/SchemaNotSupported-stderr.txt b/Tests/RunCMake/CMakePresets/SchemaNotSupported-stderr.txt new file mode 100644 index 0000000..2df4b3d --- /dev/null +++ b/Tests/RunCMake/CMakePresets/SchemaNotSupported-stderr.txt @@ -0,0 +1,3 @@ +^CMake Error: Could not read presets from [^ +]*/Tests/RunCMake/CMakePresets/SchemaNotSupported: +File version must be 8 or higher for [$]schema support$ diff --git a/Tests/RunCMake/CMakePresets/SchemaNotSupported.json.in b/Tests/RunCMake/CMakePresets/SchemaNotSupported.json.in new file mode 100644 index 0000000..736f307 --- /dev/null +++ b/Tests/RunCMake/CMakePresets/SchemaNotSupported.json.in @@ -0,0 +1,4 @@ +{ + "version": 7, + "$schema": "https://example.com/schema.json" +} diff --git a/Tests/RunCMake/CMakePresets/SchemaSupported-result.txt b/Tests/RunCMake/CMakePresets/SchemaSupported-result.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/Tests/RunCMake/CMakePresets/SchemaSupported-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/CMakePresets/SchemaSupported.json.in b/Tests/RunCMake/CMakePresets/SchemaSupported.json.in new file mode 100644 index 0000000..5426131 --- /dev/null +++ b/Tests/RunCMake/CMakePresets/SchemaSupported.json.in @@ -0,0 +1,4 @@ +{ + "version": 8, + "$schema": "https://example.com/schema.json" +} -- cgit v0.12