Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ resolver = "2"
members = [
"dsc",
"lib/dsc-lib",
"lib/dsc-lib-jsonschema",
"resources/dscecho",
"lib/dsc-lib-osinfo",
"resources/osinfo",
Expand All @@ -27,6 +28,7 @@ members = [
default-members = [
"dsc",
"lib/dsc-lib",
"lib/dsc-lib-jsonschema",
"resources/dscecho",
"lib/dsc-lib-osinfo",
"resources/osinfo",
Expand All @@ -51,6 +53,7 @@ default-members = [
Windows = [
"dsc",
"lib/dsc-lib",
"lib/dsc-lib-jsonschema",
"resources/dscecho",
"lib/dsc-lib-osinfo",
"resources/osinfo",
Expand All @@ -70,6 +73,7 @@ Windows = [
macOS = [
"dsc",
"lib/dsc-lib",
"lib/dsc-lib-jsonschema",
"resources/dscecho",
"lib/dsc-lib-osinfo",
"resources/osinfo",
Expand All @@ -86,6 +90,7 @@ macOS = [
Linux = [
"dsc",
"lib/dsc-lib",
"lib/dsc-lib-jsonschema",
"resources/dscecho",
"lib/dsc-lib-osinfo",
"resources/osinfo",
Expand Down Expand Up @@ -202,8 +207,13 @@ cc = { version = "1.2" }
# registry, dsc-lib-registry
static_vcruntime = { version = "2.0" }

# test-only dependencies
# dsc-lib-jsonschema
pretty_assertions = { version = "1.4.1" }

# Workspace crates as dependencies
dsc-lib = { path = "lib/dsc-lib" }
dsc-lib-jsonschema = { path = "lib/dsc-lib-jsonschema" }
dsc-lib-osinfo = { path = "lib/dsc-lib-osinfo" }
dsc-lib-security_context = { path = "lib/dsc-lib-security_context" }
tree-sitter-dscexpression = { path = "grammars/tree-sitter-dscexpression" }
Expand Down
6 changes: 6 additions & 0 deletions build.data.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,12 @@
)
}
}
@{
Name = 'dsc-lib-jsonschema'
RelativePath = 'lib/dsc-lib-jsonschema'
Kind = 'Library'
IsRust = $true
}
@{
Name = 'dsc-lib'
RelativePath = 'lib/dsc-lib'
Expand Down
1 change: 1 addition & 0 deletions build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ if (!$SkipBuild) {
".",
"grammars/tree-sitter-dscexpression",
"grammars/tree-sitter-ssh-server-config",
"lib/dsc-lib-jsonschema",
"lib/dsc-lib-security_context",
"lib/dsc-lib-osinfo",
"lib/dsc-lib",
Expand Down
16 changes: 9 additions & 7 deletions dsc/tests/dsc_i18n.tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,25 @@ Describe 'Internationalization tests' {
}
}

$patterns = @{
t = '(?s)\bt\!\(\s*"(?<key>.*?)".*?\)'
panic_t = '(?s)\bpanic_t\!\(\s*"(?<key>.*?)".*?\)'
assert_t = '(?s)\bassert_t\!\(\s*.*?,\s*"(?<key>.*?)".*?\)'
}

$missing = @()
Get-ChildItem -Recurse -Path $project -Include *.rs -File | ForEach-Object {
# Write-Verbose -Verbose "File: $_"
$line = 0
Get-Content -Path $_ | ForEach-Object {
$line++
($_ | Select-String -Pattern '[^\w]t\!\("(?<key>.*?)".*?\)' -AllMatches).Matches | ForEach-Object {
$content = Get-Content -Path $_ -Raw
foreach ($pattern in $patterns.keys) {
($content | Select-String -Pattern $patterns[$pattern] -AllMatches).Matches | ForEach-Object {
# write-verbose -verbose "Line: $_"
if ($null -ne $_) {
$key = $_.Groups['key'].Value
if ($i18n.ContainsKey($key)) {
$i18n[$key] = 1
# write-verbose -verbose "Found on line $line : $key"
}
else {
$missing += $key
# write-verbose -verbose "Missing: $key"
}
}
}
Expand Down
22 changes: 22 additions & 0 deletions lib/dsc-lib-jsonschema/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
[package]
name = "dsc-lib-jsonschema"
version = "0.0.0" # version stays 0.0.0 until we're ready to publish - should pin to dsc-lib.
edition = "2024"

[lib]
doctest = false # Disable doc tests for compilation speed

[dependencies]
regex = { workspace = true }
rust-i18n = { workspace = true }
schemars = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
tracing = { workspace = true }

[dev-dependencies]
# Helps review complex comparisons, like schemas
pretty_assertions = { workspace = true }

[lints.clippy]
pedantic ={ level = "deny" }
114 changes: 114 additions & 0 deletions lib/dsc-lib-jsonschema/locales/en-us.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
_version = 1

[transforms.idiomaticize_externally_tagged_enum]
applies_to = "invalid application of idiomaticize_externally_tagged_enum; missing 'oneOf' keyword in transforming schema: %{transforming_schema}"
oneOf_array = "invalid application of idiomaticize_externally_tagged_enum; 'oneOf' isn't an array in transforming schema: %{transforming_schema}"
oneOf_item_as_object = """
invalid application of idiomaticize_externally_tagged_enum; items in 'oneOf' should always be objects, but encountered an invalid item in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_define_type = """
invalid application of idiomaticize_externally_tagged_enum; every entry in oneOf should define the 'type' keyword, but encountered an invalid item in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_type_string = """
invalid application of idiomaticize_externally_tagged_enum; the value for the 'type' keyword should be a string, but was invalid in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_not_object_type = """
invalid application of idiomaticize_externally_tagged_enum; expected type for 'oneOf' entry to be 'object' but was '%{item_data_type}' in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_properties_missing = """
invalid application of idiomaticize_externally_tagged_enum; expected each item in oneOf to define an object with properties, but encountered invalid item in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_properties_not_object = """
invalid application of idiomaticize_externally_tagged_enum; the 'properties' keyword should always be an object, but encountered invalid item in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_properties_entry_not_object = """
invalid application of idiomaticize_externally_tagged_enum; the property '%{name}' in the 'oneOf' item's 'properties' keyword should always be an object, but was something else in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""

[transforms.idiomaticize_string_enum]
applies_to = "invalid application of idiomaticize_string_enum; missing 'oneOf' keyword in transforming schema: %{transforming_schema}"
oneOf_array = "invalid application of idiomaticize_string_enum; 'oneOf' isn't an array in transforming schema: %{transforming_schema}"
oneOf_item_as_object = """
invalid application of idiomaticize_string_enum; items in 'oneOf' should always be objects, but encountered an invalid item in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_define_type = """
invalid application of idiomaticize_string_enum; every entry in oneOf should define the 'type' keyword, but encountered an invalid item in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_type_string = """
invalid application of idiomaticize_string_enum; the value for the 'type' keyword should be a string, but was invalid in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_not_string_type = """
invalid application of idiomaticize_string_enum; expected type for 'oneOf' entry to be 'string' but was '%{invalid_type}' in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_enum_not_array = """
invalid application of idiomaticize_string_enum; the 'enum' keyword should always be an array, but encountered invalid item in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_enum_item_not_string = """
invalid application of idiomaticize_string_enum; every item in the 'enum' keyword should always be an array of strings, but encountered invalid item in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_const_missing = """
invalid application of idiomaticize_string_enum; documented items in a string enum are generated as subschemas with the 'const' keyword, but encountered invalid item in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
oneOf_item_const_not_string = """
invalid application of idiomaticize_string_enum; the value for the 'const' keyword in a string enum should be a string, but encountered invalid item in transforming schema:

invalid item: %{invalid_item}

transforming schema: %{transforming_schema}
"""
18 changes: 18 additions & 0 deletions lib/dsc-lib-jsonschema/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

//! Helper library for working with DSC and JSON Schemas.

use rust_i18n::i18n;

#[macro_use]
pub mod macros;

pub mod vscode;
pub mod transforms;

#[cfg(test)]
mod tests;

// Enable localization for emitted strings
i18n!("locales", fallback = "en-us");
18 changes: 18 additions & 0 deletions lib/dsc-lib-jsonschema/src/macros.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

//! Defines macros used by the module.

/// Panics with a translated message.
macro_rules! panic_t {
($($all:tt)*) => {
panic!("{}", crate::_rust_i18n_t!($($all)*))
};
}

/// Asserts an expression evaluates to true or panics with a translated message.
macro_rules! assert_t {
($expr:expr, $($tail:tt)*) => {
assert!($expr, "{}", crate::_rust_i18n_t!($($tail)*))
};
}
16 changes: 16 additions & 0 deletions lib/dsc-lib-jsonschema/src/tests/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

//! Defines unit tests for [`dsc-lib-jsonschema`].
//!
//! Instead of defining tests in each of the module files for the crate, we
//! define them in this module to improve compilation times. The tests in this
//! module are for internal code. Do not define tests for public items in this
//! module. Instead, define those tests in the `tests/integration` folder,
//! which forces usage of the crate as a public API.
//!
//! When you define tests in this module, ensure that you mirror the structure
//! of the modules from the rest of the source tree.

#[cfg(test)] mod transforms;
#[cfg(test)] mod vscode;
4 changes: 4 additions & 0 deletions lib/dsc-lib-jsonschema/src/tests/transforms/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

//! Unit tests for [`dsc-lib-jsonschema::transforms`]
4 changes: 4 additions & 0 deletions lib/dsc-lib-jsonschema/src/tests/vscode/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

//! Unit tests for [`dsc-lib-jsonschema::vscode`]
Loading