diff --git a/.github/scripts/max-line-length.sh b/.github/scripts/max-line-length.sh new file mode 100755 index 000000000..febd2225e --- /dev/null +++ b/.github/scripts/max-line-length.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# Check if all required arguments are provided +if [ "$#" -ne 3 ]; then + echo "Usage: $0 " + exit 1 +fi + +folder_path="$1" +max_length="$2" +file_globs="$3" + +# Function to get relative path +get_relative_path() { + local path="$1" + local base="$(pwd)" + echo "${path#$base/}" +} + +# Initialize a flag to check if any lines exceed the max length +found_lines=0 + +# Convert comma-separated globs to an array +IFS=',' read -ra glob_array <<< "$file_globs" + +# Use find to get all files matching the glob patterns +for glob in "${glob_array[@]}"; do + while IFS= read -r -d '' file; do + # Get the relative path + relative_path=$(get_relative_path "$file") + + # Use awk to process each file + awk -v max="$max_length" -v file="$relative_path" ' + length($0) > max { + print file ":" NR + found = 1 + exit 1 + } + END { + exit found + }' "$file" + + # Check awk's exit status + if [ $? -eq 1 ]; then + found_lines=1 + fi + done < <(find "$folder_path" -type f -name "$glob" -print0) +done + +# Exit with appropriate code +if [ $found_lines -eq 0 ]; then + echo "All lines are within the $max_length character limit." + exit 0 +else + echo "Some lines exceedded the $max_length character limit." + exit 1 +fi \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 37d870a9b..f9c6e4a9d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -101,3 +101,16 @@ jobs: - name: Lint run: composer lint + + max-line-length: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Make script executable + run: chmod +x ./.github/scripts/max-line-length.sh + + - name: Check max lines + run: ./.github/scripts/max-line-length.sh . 1200 "*.twig" \ No newline at end of file diff --git a/templates/dotnet/Package/Models/Model.cs.twig b/templates/dotnet/Package/Models/Model.cs.twig index 00df5c7a9..bf330c23c 100644 --- a/templates/dotnet/Package/Models/Model.cs.twig +++ b/templates/dotnet/Package/Models/Model.cs.twig @@ -38,14 +38,43 @@ namespace {{ spec.title | caseUcfirst }}.Models {%~ endif %} } - public static {{ definition.name | caseUcfirst | overrideIdentifier}} From(Dictionary map) => new {{ definition.name | caseUcfirst | overrideIdentifier}}( + public static {{ definition.name | caseUcfirst | overrideIdentifier }} From(Dictionary map) => new {{ definition.name | caseUcfirst | overrideIdentifier }}( {%~ for property in definition.properties %} - {{ property.name | caseCamel | escapeKeyword | removeDollarSign }}: {% if property.sub_schema %}{% if property.type == 'array' %}((JArray)map["{{ property.name }}"]).ToObject>>().Select(it => {{property.sub_schema | caseUcfirst | overrideIdentifier}}.From(map: it)).ToList(){% else %}{{property.sub_schema | caseUcfirst | overrideIdentifier}}.From(map: ((JObject)map["{{ property.name }}"]).ToObject>()!){% endif %}{% else %}{% if property.type == 'array' %}((JArray)map["{{ property.name }}"]).ToObject<{{ property | typeName }}>(){% else %}{% if property.type == "integer" or property.type == "number" %}{% if not property.required %}map["{{ property.name }}"] == null ? null : {% endif %}Convert.To{% if property.type == "integer" %}Int64{% else %}Double{% endif %}(map["{{ property.name }}"]){% else %}{% if property.type == "boolean" %}({{ property | typeName }}{% if not property.required %}?{% endif %})map["{{ property.name }}"]{% else %}map{% if not property.required %}.TryGetValue("{{ property.name }}", out var {{ property.name | caseCamel | escapeKeyword | removeDollarSign }}) ? {{ property.name | caseCamel | escapeKeyword | removeDollarSign }}?.ToString() : null{% else %}["{{ property.name }}"]{% if not property.required %}?{% endif %}.ToString(){% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% if not loop.last or (loop.last and definition.additionalProperties) %},{% endif %} - + {{ property.name | caseCamel | escapeKeyword | removeDollarSign }}: + {%- if property.sub_schema %} + {%~ if property.type == 'array' %} + ((JArray)map["{{ property.name }}"]) + .ToObject>>() + .Select(it => {{ property.sub_schema | caseUcfirst | overrideIdentifier }}.From(map: it)) + .ToList() + {%- else %} + {{ property.sub_schema | caseUcfirst | overrideIdentifier }}.From( + map: ((JObject)map["{{ property.name }}"]) + .ToObject>()! + ) + {%- endif %} + {%~ else %} + {%~ if property.type == 'array' %} + ((JArray)map["{{ property.name }}"]).ToObject<{{ property | typeName }}>() + {%~ else %} + {%~ if property.type == "integer" or property.type == "number" %} + {%~ if not property.required %}map["{{ property.name }}"] == null ? null : {% endif %} Convert.To{% if property.type == "integer" %}Int64{% else %}Double{% endif %}(map["{{ property.name }}"]) + {%~ else %} + {%~ if property.type == "boolean" %} + ({{ property | typeName }}{% if not property.required %}?{% endif %})map["{{ property.name }}"] + {%~ else %} + {%~ if not property.required %}map.TryGetValue("{{ property.name }}", out var {{ property.name | caseCamel | escapeKeyword | removeDollarSign }}) ? {{ property.name | caseCamel | escapeKeyword | removeDollarSign }}?.ToString() : null + {%~ else %} map["{{ property.name }}"].ToString(){% endif %} + {%- endif %} + {%~ endif %} + {%~ endif %} + {%~ endif %} + {%- if not loop.last or (loop.last and definition.additionalProperties) %}, + {%~ endif %} {%~ endfor %} - {%~ if definition.additionalProperties %} - data: map - {%~ endif %} + {%- if definition.additionalProperties %} + , data: map + {%- endif ~%} ); public Dictionary ToMap() => new Dictionary()