From ec2763af4f0abfc7acb78de03c565d9e1e9cf410 Mon Sep 17 00:00:00 2001 From: jack-edmonds-dd Date: Wed, 22 Oct 2025 13:39:37 -0400 Subject: [PATCH 1/2] Allow missing descriptions. (#2725) --- .generator/src/generator/templates/model.j2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.generator/src/generator/templates/model.j2 b/.generator/src/generator/templates/model.j2 index 89c9e5f5be78..38abd9071d5a 100644 --- a/.generator/src/generator/templates/model.j2 +++ b/.generator/src/generator/templates/model.j2 @@ -6,7 +6,9 @@ require 'date' require 'time' module {{ module_name }}::{{ version|upper }} +{%- if "description" in model %} # {{ model.description.rstrip()|replace('\n', '\n# ')|indent(2) }} +{%- endif %} {%- if model.deprecated %} # # @deprecated This model is deprecated. From c222047ad4c0fab9739063893ea393cc798f0cbd Mon Sep 17 00:00:00 2001 From: Daniel Trinh Date: Wed, 22 Oct 2025 16:56:07 -0400 Subject: [PATCH 2/2] fix edge case with periods in keys (#2722) --- .generator/src/generator/formatter.py | 16 ++++++- .generator/tests/test_formatter.rb | 69 +++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 .generator/tests/test_formatter.rb diff --git a/.generator/src/generator/formatter.py b/.generator/src/generator/formatter.py index 24c1c3158ca4..036c70fd59f7 100644 --- a/.generator/src/generator/formatter.py +++ b/.generator/src/generator/formatter.py @@ -275,6 +275,16 @@ def format_data_with_schema_list( return f"[\n{parameters}]" +def _is_valid_ruby_symbol(key): + """Check if a key can be used as a Ruby symbol without quotes.""" + if not key: + return False + # Ruby symbols can start with letter or underscore, contain alphanumeric and underscores + if not (key[0].isalpha() or key[0] == '_'): + return False + return all(c.isalnum() or c == '_' for c in key) + + @format_data_with_schema.register(dict) def format_data_with_schema_dict( data, @@ -318,7 +328,11 @@ def format_data_with_schema_dict( name_prefix=name_prefix, replace_values=replace_values, ) - parameters += f"{k}: {value}, " + # Use hash rocket syntax for keys with special characters + if _is_valid_ruby_symbol(k): + parameters += f"{k}: {value}, " + else: + parameters += f'"{k}" => {value}, ' if not has_properties: name = None diff --git a/.generator/tests/test_formatter.rb b/.generator/tests/test_formatter.rb new file mode 100644 index 000000000000..04ef5c69cada --- /dev/null +++ b/.generator/tests/test_formatter.rb @@ -0,0 +1,69 @@ +#!/usr/bin/env ruby + +def assert(condition, message = "Assertion failed") + raise message unless condition + print "." +end + +def assert_equal(expected, actual, message = nil) + msg = message || "Expected #{expected.inspect}, got #{actual.inspect}" + raise msg unless expected == actual + print "." +end + +def assert_includes(collection, item, message = nil) + msg = message || "Expected #{collection.inspect} to include #{item.inspect}" + raise msg unless collection.include?(item) + print "." +end + +test_cases = [ + ['valid_key', true], + ['_valid_key', true], + ['ValidKey123', true], + ['key123', true], + ['key.with.dots', false], + ['123invalid', false], + ['.starts_with_dot', false], + ['', false], + ['key-with-dash', false], + ['key with space', false], + ['key@special', false] +] + +test_cases.each do |key, expected| + begin + eval("{#{key}: 'value'}") + assert(expected, "Expected '#{key}' to fail but it succeeded") + rescue SyntaxError + assert(!expected, "Expected '#{key}' to succeed but it failed") + end +end + +hash = { + "ocsf.activity_name" => 'Other', + "ocsf.activity_id" => '99' +} + +assert(hash.is_a?(Hash)) +assert_equal('Other', hash["ocsf.activity_name"]) +assert_equal('99', hash["ocsf.activity_id"]) +assert_includes(hash.inspect, '"ocsf.activity_name"=>"Other"') +assert_includes(hash.inspect, '"ocsf.activity_id"=>"99"') + +hash = { + "ocsf.activity_name" => ['eventName'] +} + +assert(hash.is_a?(Hash)) +assert_equal(['eventName'], hash["ocsf.activity_name"]) +assert_includes(hash.inspect, '"ocsf.activity_name"=>["eventName"]') + +hash = { + normal_key: 'value1', + another_key: 'value2' +} + +assert(hash.is_a?(Hash)) +assert_equal('value1', hash[:normal_key]) +assert_equal('value2', hash[:another_key])