diff --git a/codegen/generators/base.rb b/codegen/generators/base.rb index 9f9a8468..5a0cc2c7 100644 --- a/codegen/generators/base.rb +++ b/codegen/generators/base.rb @@ -105,25 +105,23 @@ def property_type_from_ref(ref) class_name(ref) end - def property_type_from_type(parent_type_name, property_name, property, type:) + def property_type_from_type(parent_type_name, property_name, property) + type = property['type'] return array_type_for(type_for(parent_type_name, nil, property['items'])) if type == 'array' + return property_type_from_enum(enum_name(parent_type_name, property_name, property['enum'])) if property['enum'] - unless language_translations_for_data_types.key?(type) + property = select_language_translations_for_data_types(type, property) + unless property raise "No type mapping for JSONSchema type #{type}. Schema:\n#{JSON.pretty_generate(property)}" end - - if property['enum'] - property_type_from_enum(enum_name(parent_type_name, property_name, property['enum'])) - else - language_translations_for_data_types.fetch(type) - end + property end def type_for(parent_type_name, property_name, property) if property['$ref'] property_type_from_ref(property['$ref']) elsif property['type'] - property_type_from_type(parent_type_name, property_name, property, type: property['type']) + property_type_from_type(parent_type_name, property_name, property) else # Inline schema (not supported) raise "Property #{property_name} did not define 'type' or '$ref'" diff --git a/codegen/generators/cpp.rb b/codegen/generators/cpp.rb index cb80a86f..e201d945 100644 --- a/codegen/generators/cpp.rb +++ b/codegen/generators/cpp.rb @@ -21,12 +21,12 @@ def format_description(raw_description, indent_string: '') private - def language_translations_for_data_types + def select_language_translations_for_data_types(type, property) { 'integer' => 'std::size_t', 'string' => 'std::string', 'boolean' => 'bool' - } + }[type] end end end diff --git a/codegen/generators/dotnet.rb b/codegen/generators/dotnet.rb index 1e164c55..10af3cf7 100644 --- a/codegen/generators/dotnet.rb +++ b/codegen/generators/dotnet.rb @@ -21,12 +21,12 @@ def format_description(raw_description, indent_string: '') private - def language_translations_for_data_types + def select_language_translations_for_data_types(type, property) { 'integer' => 'long', 'string' => 'string', 'boolean' => 'bool' - } + }[type] end end end diff --git a/codegen/generators/go.rb b/codegen/generators/go.rb index 659d2b49..de899650 100644 --- a/codegen/generators/go.rb +++ b/codegen/generators/go.rb @@ -14,12 +14,12 @@ def property_type_from_ref(ref) private - def language_translations_for_data_types + def select_language_translations_for_data_types(type, property) { 'integer' => 'int64', 'string' => 'string', 'boolean' => 'bool' - } + }[type] end end end diff --git a/codegen/generators/java.rb b/codegen/generators/java.rb index 8c7ee3f4..5f00cf5b 100644 --- a/codegen/generators/java.rb +++ b/codegen/generators/java.rb @@ -23,12 +23,20 @@ def format_description(raw_description, indent_string: '') private - def language_translations_for_data_types - { - 'integer' => 'Long', - 'string' => 'String', - 'boolean' => 'Boolean' - } + def select_language_translations_for_data_types(type, property) + if type == 'integer' + if property['maximum'] and property['maximum'] <= 2147483647 + 'Integer' + else + 'Long' + end + elsif type == 'string' + 'String' + elsif type == 'boolean' + 'Boolean' + else + nil + end end end end diff --git a/codegen/generators/markdown.rb b/codegen/generators/markdown.rb index f7389e25..d4cbe553 100644 --- a/codegen/generators/markdown.rb +++ b/codegen/generators/markdown.rb @@ -20,12 +20,12 @@ def property_type_from_ref(ref) private - def language_translations_for_data_types + def select_language_translations_for_data_types(type, property) { 'integer' => 'integer', 'string' => 'string', 'boolean' => 'boolean' - } + }[type] end end end diff --git a/codegen/generators/perl.rb b/codegen/generators/perl.rb index ff38bc58..11a59ae5 100644 --- a/codegen/generators/perl.rb +++ b/codegen/generators/perl.rb @@ -39,12 +39,12 @@ def default_value_for_string(property_name, enum) end end - def language_translations_for_data_types + def select_language_translations_for_data_types(type, property) { 'integer' => 'number', 'string' => 'string', 'boolean' => 'boolean' - } + }[type] end end end diff --git a/codegen/generators/php.rb b/codegen/generators/php.rb index 83984775..08bf852b 100644 --- a/codegen/generators/php.rb +++ b/codegen/generators/php.rb @@ -53,11 +53,11 @@ def nullable?(property_name, schema) end def scalar?(property) - property.key?('type') && language_translations_for_data_types.key?(property['type']) + property.key?('type') && select_language_translations_for_data_types(property['type'], property) end def scalar_type_for(property) - language_translations_for_data_types[property['type']] + select_language_translations_for_data_types(property['type'], property) end private @@ -68,12 +68,12 @@ def default_value(class_name, property_name, property, schema) super(class_name, property_name, property) end - def language_translations_for_data_types + def select_language_translations_for_data_types(type, property) { 'string' => 'string', 'integer' => 'int', 'boolean' => 'bool' - } + }[type] end def non_nullable_non_scalar_constructor(parent_type, property, property_name, schema, source) diff --git a/codegen/generators/python.rb b/codegen/generators/python.rb index ccb6a727..54257ba8 100644 --- a/codegen/generators/python.rb +++ b/codegen/generators/python.rb @@ -63,6 +63,12 @@ def format_description(raw_description, indent_string: ' ') %("""\n#{lines.join("\n")}\n#{indent_string}""") end + def select_language_translations_for_data_types(type, property) + language_translations_for_data_types[type] + end + + private + def language_translations_for_data_types { 'integer' => 'int', @@ -71,9 +77,7 @@ def language_translations_for_data_types 'array' => 'list' } end - - private - + def default_value(parent_type_name, property_name, property) if property['type'] == 'string' default_value_for_string(parent_type_name, property_name, property) @@ -109,10 +113,6 @@ def enum_name(parent_type_name, property_name, enum) end end - def property_type_from_ref(ref) - class_name(ref) - end - def class_name(ref) return ref if language_translations_for_data_types.values.include?(ref) diff --git a/codegen/generators/ruby.rb b/codegen/generators/ruby.rb index 59d99bfa..86f642c9 100644 --- a/codegen/generators/ruby.rb +++ b/codegen/generators/ruby.rb @@ -39,12 +39,12 @@ def default_value_for_string(parent_type_name, property_name, property) end end - def language_translations_for_data_types + def select_language_translations_for_data_types(type, property) { 'integer' => 'number', 'string' => 'string', 'boolean' => 'boolean' - } + }[type] end def line_as_comment(line) diff --git a/codegen/generators/typescript.rb b/codegen/generators/typescript.rb index a46c241f..da58dd02 100644 --- a/codegen/generators/typescript.rb +++ b/codegen/generators/typescript.rb @@ -10,12 +10,12 @@ def array_type_for(type_name) private - def language_translations_for_data_types + def select_language_translations_for_data_types(type, property) { 'integer' => 'number', 'string' => 'string', 'boolean' => 'boolean' - } + }[type] end end end diff --git a/java/src/generated/java/io/cucumber/messages/types/Duration.java b/java/src/generated/java/io/cucumber/messages/types/Duration.java index fd790661..f780675c 100644 --- a/java/src/generated/java/io/cucumber/messages/types/Duration.java +++ b/java/src/generated/java/io/cucumber/messages/types/Duration.java @@ -17,11 +17,11 @@ @SuppressWarnings("unused") public final class Duration { private final Long seconds; - private final Long nanos; + private final Integer nanos; public Duration( Long seconds, - Long nanos + Integer nanos ) { this.seconds = requireNonNull(seconds, "Duration.seconds cannot be null"); this.nanos = requireNonNull(nanos, "Duration.nanos cannot be null"); @@ -37,7 +37,7 @@ public Long getSeconds() { * that count forward in time. Must be from 0 to 999,999,999 * inclusive. */ - public Long getNanos() { + public Integer getNanos() { return nanos; } diff --git a/java/src/generated/java/io/cucumber/messages/types/Group.java b/java/src/generated/java/io/cucumber/messages/types/Group.java index e4550c86..738f5214 100644 --- a/java/src/generated/java/io/cucumber/messages/types/Group.java +++ b/java/src/generated/java/io/cucumber/messages/types/Group.java @@ -14,12 +14,12 @@ @SuppressWarnings("unused") public final class Group { private final java.util.List children; - private final Long start; + private final Integer start; private final String value; public Group( java.util.List children, - Long start, + Integer start, String value ) { this.children = unmodifiableList(new ArrayList<>(requireNonNull(children, "Group.children cannot be null"))); @@ -31,7 +31,7 @@ public java.util.List getChildren() { return children; } - public Optional getStart() { + public Optional getStart() { return Optional.ofNullable(start); } diff --git a/java/src/generated/java/io/cucumber/messages/types/Location.java b/java/src/generated/java/io/cucumber/messages/types/Location.java index 0367481c..3acfb958 100644 --- a/java/src/generated/java/io/cucumber/messages/types/Location.java +++ b/java/src/generated/java/io/cucumber/messages/types/Location.java @@ -15,22 +15,22 @@ // Generated code @SuppressWarnings("unused") public final class Location { - private final Long line; - private final Long column; + private final Integer line; + private final Integer column; public Location( - Long line, - Long column + Integer line, + Integer column ) { this.line = requireNonNull(line, "Location.line cannot be null"); this.column = column; } - public Long getLine() { + public Integer getLine() { return line; } - public Optional getColumn() { + public Optional getColumn() { return Optional.ofNullable(column); } diff --git a/java/src/generated/java/io/cucumber/messages/types/Timestamp.java b/java/src/generated/java/io/cucumber/messages/types/Timestamp.java index 7a550315..5142aee4 100644 --- a/java/src/generated/java/io/cucumber/messages/types/Timestamp.java +++ b/java/src/generated/java/io/cucumber/messages/types/Timestamp.java @@ -14,11 +14,11 @@ @SuppressWarnings("unused") public final class Timestamp { private final Long seconds; - private final Long nanos; + private final Integer nanos; public Timestamp( Long seconds, - Long nanos + Integer nanos ) { this.seconds = requireNonNull(seconds, "Timestamp.seconds cannot be null"); this.nanos = requireNonNull(nanos, "Timestamp.nanos cannot be null"); @@ -39,7 +39,7 @@ public Long getSeconds() { * that count forward in time. Must be from 0 to 999,999,999 * inclusive. */ - public Long getNanos() { + public Integer getNanos() { return nanos; } diff --git a/java/src/main/java/io/cucumber/messages/Convertor.java b/java/src/main/java/io/cucumber/messages/Convertor.java index fcff908f..cb4386d6 100644 --- a/java/src/main/java/io/cucumber/messages/Convertor.java +++ b/java/src/main/java/io/cucumber/messages/Convertor.java @@ -6,6 +6,7 @@ import java.io.PrintWriter; import java.io.StringWriter; +import java.time.Instant; import static java.util.Objects.requireNonNull; @@ -30,12 +31,12 @@ private static String extractStackTrace(Throwable throwable) { public static Timestamp toMessage(java.time.Instant instant) { requireNonNull(instant, "instant may not be null"); - return new Timestamp(instant.getEpochSecond(), (long) instant.getNano()); + return new Timestamp(instant.getEpochSecond(), instant.getNano()); } public static Duration toMessage(java.time.Duration duration) { requireNonNull(duration, "duration may not be null"); - return new Duration(duration.getSeconds(), (long) duration.getNano()); + return new Duration(duration.getSeconds(), duration.getNano()); } public static java.time.Instant toInstant(Timestamp timestamp) { diff --git a/java/src/test/java/io/cucumber/messages/JacksonTest.java b/java/src/test/java/io/cucumber/messages/JacksonTest.java index a8fc6f73..b7560bd3 100644 --- a/java/src/test/java/io/cucumber/messages/JacksonTest.java +++ b/java/src/test/java/io/cucumber/messages/JacksonTest.java @@ -29,7 +29,7 @@ void serialize_enums_using_value() throws JsonProcessingException { @Test void can_deserialize_envelope() throws JsonProcessingException { - Envelope source = Envelope.of(new TestRunStarted(new Timestamp(3L, 14L), UUID.randomUUID().toString())); + Envelope source = Envelope.of(new TestRunStarted(new Timestamp(3L, 14), UUID.randomUUID().toString())); String json = OBJECT_MAPPER.writeValueAsString(source); assertEquals(source, OBJECT_MAPPER.readValue(json, Envelope.class)); } diff --git a/jsonschema/src/Duration.json b/jsonschema/src/Duration.json index 676f74f7..c3ad4dc7 100644 --- a/jsonschema/src/Duration.json +++ b/jsonschema/src/Duration.json @@ -13,7 +13,9 @@ }, "nanos": { "description": "Non-negative fractions of a second at nanosecond resolution. Negative\nsecond values with fractions must still have non-negative nanos values\nthat count forward in time. Must be from 0 to 999,999,999\ninclusive.", - "type": "integer" + "type": "integer", + "minimum": 0, + "maximum": 999999999 } }, "type": "object" diff --git a/jsonschema/src/Location.json b/jsonschema/src/Location.json index 85ce1ec0..074d32ae 100644 --- a/jsonschema/src/Location.json +++ b/jsonschema/src/Location.json @@ -5,10 +5,14 @@ "description": "Points to a line and a column in a text file", "properties": { "line": { - "type": "integer" + "type": "integer", + "minimum": 1, + "maximum": 2147483647 }, "column": { - "type": "integer" + "type": "integer", + "minimum": 1, + "maximum": 2147483647 } }, "required": [ diff --git a/jsonschema/src/TestCase.json b/jsonschema/src/TestCase.json index 184e6fe0..2ea6c935 100644 --- a/jsonschema/src/TestCase.json +++ b/jsonschema/src/TestCase.json @@ -18,7 +18,9 @@ "type": "array" }, "start": { - "type": "integer" + "type": "integer", + "minimum": 0, + "maximum": 2147483647 }, "value": { "type": "string" diff --git a/jsonschema/src/TestCaseStarted.json b/jsonschema/src/TestCaseStarted.json index 12600c43..2fd04b89 100644 --- a/jsonschema/src/TestCaseStarted.json +++ b/jsonschema/src/TestCaseStarted.json @@ -11,7 +11,8 @@ "properties": { "attempt": { "description": "The first attempt should have value 0, and for each retry the value\nshould increase by 1.", - "type": "integer" + "type": "integer", + "minimum": 0 }, "id": { "description": "Because a `TestCase` can be run multiple times (in case of a retry),\nwe use this field to group messages relating to the same attempt.", diff --git a/jsonschema/src/Timestamp.json b/jsonschema/src/Timestamp.json index 0b877148..81395aa4 100644 --- a/jsonschema/src/Timestamp.json +++ b/jsonschema/src/Timestamp.json @@ -13,7 +13,9 @@ }, "nanos": { "description": "Non-negative fractions of a second at nanosecond resolution. Negative\nsecond values with fractions must still have non-negative nanos values\nthat count forward in time. Must be from 0 to 999,999,999\ninclusive.", - "type": "integer" + "type": "integer", + "minimum": 0, + "maximum": 999999999 } }, "type": "object"