diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java index a7045738cc3..42f9d304a3c 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java @@ -42,6 +42,7 @@ public class CodegenProperty { public Map allowableValues; public CodegenProperty items; public Map vendorExtensions; + public Boolean needValidation; // true if pattern, maximum, etc are set (only used in the mustache template) @Override public int hashCode() diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 76729c8b38a..3e59dad1d4f 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -327,6 +327,16 @@ public class DefaultCodegen { this.ensureUniqueParams = ensureUniqueParams; } + /** + * Return the JSON schema pattern (http://json-schema.org/latest/json-schema-validation.html#anchor33) + * + * @param pattern the pattern (regular expression) + * @return properly-escaped pattern + */ + public String toJSONSchemaPattern(String pattern) { + return escapeText(pattern); + } + /** * Return the file name of the Api Test * @@ -1094,6 +1104,10 @@ public class DefaultCodegen { property.exclusiveMinimum = np.getExclusiveMinimum(); property.exclusiveMaximum = np.getExclusiveMaximum(); + // check if any validation rule defined + if (property.minimum != null || property.maximum != null || property.exclusiveMinimum != null || property.exclusiveMaximum != null) + property.needValidation = true; + // legacy support Map allowableValues = new HashMap(); if (np.getMinimum() != null) { @@ -1111,7 +1125,12 @@ public class DefaultCodegen { StringProperty sp = (StringProperty) p; property.maxLength = sp.getMaxLength(); property.minLength = sp.getMinLength(); - property.pattern = sp.getPattern(); + property.pattern = toJSONSchemaPattern(sp.getPattern()); + + // check if any validation rule defined + if (property.pattern != null || property.minLength != null || property.maxLength != null) + property.needValidation = true; + property.isString = true; if (sp.getEnum() != null) { List _enum = sp.getEnum(); @@ -1802,9 +1821,6 @@ public class DefaultCodegen { if (model.complexType != null) { imports.add(model.complexType); } - p.maxLength = qp.getMaxLength(); - p.minLength = qp.getMinLength(); - p.pattern = qp.getPattern(); p.maximum = qp.getMaximum(); p.exclusiveMaximum = qp.isExclusiveMaximum(); @@ -1812,7 +1828,7 @@ public class DefaultCodegen { p.exclusiveMinimum = qp.isExclusiveMinimum(); p.maxLength = qp.getMaxLength(); p.minLength = qp.getMinLength(); - p.pattern = qp.getPattern(); + p.pattern = toJSONSchemaPattern(qp.getPattern()); p.maxItems = qp.getMaxItems(); p.minItems = qp.getMinItems(); p.uniqueItems = qp.isUniqueItems(); diff --git a/modules/swagger-codegen/src/main/resources/ruby/README.mustache b/modules/swagger-codegen/src/main/resources/ruby/README.mustache index 7f54eef9e69..f4bafd9b0ea 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/README.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/README.mustache @@ -31,6 +31,7 @@ Then either install the gem locally: ```shell gem install ./{{{gemName}}}-{{{gemVersion}}}.gem ``` +(for development, run `gem install --dev ./{{{gemName}}}-{{{gemVersion}}}.gem` to install the development dependencies) or publish the gem to a gem hosting service, e.g. [RubyGems](https://rubygems.org/). diff --git a/modules/swagger-codegen/src/main/resources/ruby/model.mustache b/modules/swagger-codegen/src/main/resources/ruby/model.mustache index 5b7b617481f..df23db195f3 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/model.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/model.mustache @@ -47,7 +47,9 @@ module {{moduleName}}{{#models}}{{#model}}{{#description}} end {{/vars}} end -{{#vars}}{{#isEnum}} + + {{#vars}} + {{#isEnum}} # Custom attribute writer method checking allowed values (enum). # @param [Object] {{{name}}} Object to be assigned def {{{name}}}=({{{name}}}) @@ -57,7 +59,29 @@ module {{moduleName}}{{#models}}{{#model}}{{#description}} end @{{{name}}} = {{{name}}} end -{{/isEnum}}{{/vars}} + + {{/isEnum}} + {{^isEnum}} + {{#needValidation}} + # Custom attribute writer method with validation + # @param [Object] {{{name}}} Value to be assigned + def {{{name}}}=({{{name}}}) + {{#maximum}} + if {{{name}}} > {{{maximum}}} + fail "invalid value for '{{{name}}}', must be smaller than or equal to {{{maximum}}}" + end + {{/maximum}} + {{#minimum}} + if {{{name}}} < {{{minimum}}} + fail "invalid value for '{{{name}}}', must be greater than or equal to {{{minimum}}}" + end + {{/minimum}} + @{{{name}}} = {{{name}}} + end + + {{/needValidation}} + {{/isEnum}} + {{/vars}} # Checks equality by comparing each attribute. # @param [Object] Object to be compared def ==(o) diff --git a/modules/swagger-codegen/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml b/modules/swagger-codegen/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml index 2a90f5de066..985b365802b 100644 --- a/modules/swagger-codegen/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml +++ b/modules/swagger-codegen/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml @@ -761,22 +761,33 @@ definitions: properties: integer: type: integer + maximum: 100 + minimum: 10 int32: type: integer format: int32 + maximum: 200 + minimum: 20 int64: type: integer format: int64 number: + maximum: 543.2 + minimum: 32.1 type: number float: type: number format: float + maximum: 987.6 + minimum: 54.3 double: type: number format: double + maximum: 123.4 + minimum: 67.8 string: type: string + pattern: /[a‑z]/i byte: type: string format: byte diff --git a/samples/client/petstore/ruby/Gemfile.lock b/samples/client/petstore/ruby/Gemfile.lock index 98c02ee9163..cb8128052ab 100644 --- a/samples/client/petstore/ruby/Gemfile.lock +++ b/samples/client/petstore/ruby/Gemfile.lock @@ -22,29 +22,31 @@ GEM ethon (0.8.1) ffi (>= 1.3.0) ffi (1.9.8) + hashdiff (0.3.0) json (1.8.3) - rspec (3.2.0) - rspec-core (~> 3.2.0) - rspec-expectations (~> 3.2.0) - rspec-mocks (~> 3.2.0) - rspec-core (3.2.2) - rspec-support (~> 3.2.0) - rspec-expectations (3.2.0) + rspec (3.4.0) + rspec-core (~> 3.4.0) + rspec-expectations (~> 3.4.0) + rspec-mocks (~> 3.4.0) + rspec-core (3.4.4) + rspec-support (~> 3.4.0) + rspec-expectations (3.4.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.2.0) - rspec-mocks (3.2.1) + rspec-support (~> 3.4.0) + rspec-mocks (3.4.1) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.2.0) - rspec-support (3.2.2) + rspec-support (~> 3.4.0) + rspec-support (3.4.1) safe_yaml (1.0.4) sys-uname (0.9.2) ffi (>= 1.0.0) typhoeus (1.0.1) ethon (>= 0.8.0) - vcr (2.9.3) - webmock (1.21.0) + vcr (3.0.1) + webmock (1.24.5) addressable (>= 2.3.6) crack (>= 0.3.2) + hashdiff PLATFORMS ruby @@ -55,6 +57,6 @@ DEPENDENCIES autotest-growl (~> 0.2, >= 0.2.16) autotest-rails-pure (~> 4.1, >= 4.1.2) petstore! - rspec (~> 3.2, >= 3.2.0) - vcr (~> 2.9, >= 2.9.3) - webmock (~> 1.6, >= 1.6.2) + rspec (~> 3.4, >= 3.4.0) + vcr (~> 3.0, >= 3.0.1) + webmock (~> 1.24, >= 1.24.3) diff --git a/samples/client/petstore/ruby/README.md b/samples/client/petstore/ruby/README.md index 4dc28289fa3..0d53e95030a 100644 --- a/samples/client/petstore/ruby/README.md +++ b/samples/client/petstore/ruby/README.md @@ -8,7 +8,7 @@ This SDK is automatically generated by the [Swagger Codegen](https://github.com/ - API version: 1.0.0 - Package version: 1.0.0 -- Build date: 2016-04-20T18:46:00.664+08:00 +- Build date: 2016-04-25T16:31:40.260+08:00 - Build package: class io.swagger.codegen.languages.RubyClientCodegen ## Installation @@ -26,6 +26,7 @@ Then either install the gem locally: ```shell gem install ./petstore-1.0.0.gem ``` +(for development, run `gem install --dev ./petstore-1.0.0.gem` to install the development dependencies) or publish the gem to a gem hosting service, e.g. [RubyGems](https://rubygems.org/). diff --git a/samples/client/petstore/ruby/docs/FormatTest.md b/samples/client/petstore/ruby/docs/FormatTest.md index 2b64ed317b2..7197a7a6584 100644 --- a/samples/client/petstore/ruby/docs/FormatTest.md +++ b/samples/client/petstore/ruby/docs/FormatTest.md @@ -10,10 +10,10 @@ Name | Type | Description | Notes **float** | **Float** | | [optional] **double** | **Float** | | [optional] **string** | **String** | | [optional] -**byte** | **String** | | [optional] +**byte** | **String** | | **binary** | **String** | | [optional] -**date** | **Date** | | [optional] +**date** | **Date** | | **date_time** | **DateTime** | | [optional] -**password** | **String** | | [optional] +**password** | **String** | | diff --git a/samples/client/petstore/ruby/docs/Name.md b/samples/client/petstore/ruby/docs/Name.md index 2864a67fbd3..4858862c725 100644 --- a/samples/client/petstore/ruby/docs/Name.md +++ b/samples/client/petstore/ruby/docs/Name.md @@ -5,5 +5,6 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **name** | **Integer** | | **snake_case** | **Integer** | | [optional] +**property** | **String** | | [optional] diff --git a/samples/client/petstore/ruby/lib/petstore/models/format_test.rb b/samples/client/petstore/ruby/lib/petstore/models/format_test.rb index 87b6d4e4695..9a6f8c19c9c 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/format_test.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/format_test.rb @@ -124,6 +124,72 @@ module Petstore end end + # Custom attribute writer method with validation + # @param [Object] integer Value to be assigned + def integer=(integer) + if integer > 100.0 + fail "invalid value for 'integer', must be smaller than or equal to 100.0" + end + if integer < 10.0 + fail "invalid value for 'integer', must be greater than or equal to 10.0" + end + @integer = integer + end + + # Custom attribute writer method with validation + # @param [Object] int32 Value to be assigned + def int32=(int32) + if int32 > 200.0 + fail "invalid value for 'int32', must be smaller than or equal to 200.0" + end + if int32 < 20.0 + fail "invalid value for 'int32', must be greater than or equal to 20.0" + end + @int32 = int32 + end + + # Custom attribute writer method with validation + # @param [Object] number Value to be assigned + def number=(number) + if number > 543.2 + fail "invalid value for 'number', must be smaller than or equal to 543.2" + end + if number < 32.1 + fail "invalid value for 'number', must be greater than or equal to 32.1" + end + @number = number + end + + # Custom attribute writer method with validation + # @param [Object] float Value to be assigned + def float=(float) + if float > 987.6 + fail "invalid value for 'float', must be smaller than or equal to 987.6" + end + if float < 54.3 + fail "invalid value for 'float', must be greater than or equal to 54.3" + end + @float = float + end + + # Custom attribute writer method with validation + # @param [Object] double Value to be assigned + def double=(double) + if double > 123.4 + fail "invalid value for 'double', must be smaller than or equal to 123.4" + end + if double < 67.8 + fail "invalid value for 'double', must be greater than or equal to 67.8" + end + @double = double + end + + # Custom attribute writer method with validation + # @param [Object] string Value to be assigned + def string=(string) + @string = string + end + # Checks equality by comparing each attribute. # @param [Object] Object to be compared def ==(o) diff --git a/samples/client/petstore/ruby/lib/petstore/models/name.rb b/samples/client/petstore/ruby/lib/petstore/models/name.rb index 9818aa41cc4..c19beea86cb 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/name.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/name.rb @@ -23,11 +23,14 @@ module Petstore attr_accessor :snake_case + attr_accessor :property + # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map { :'name' => :'name', - :'snake_case' => :'snake_case' + :'snake_case' => :'snake_case', + :'property' => :'property' } end @@ -35,7 +38,8 @@ module Petstore def self.swagger_types { :'name' => :'Integer', - :'snake_case' => :'Integer' + :'snake_case' => :'Integer', + :'property' => :'String' } end @@ -53,6 +57,9 @@ module Petstore if attributes[:'snake_case'] self.snake_case = attributes[:'snake_case'] end + if attributes[:'property'] + self.property = attributes[:'property'] + end end # Checks equality by comparing each attribute. @@ -61,7 +68,8 @@ module Petstore return true if self.equal?(o) self.class == o.class && name == o.name && - snake_case == o.snake_case + snake_case == o.snake_case && + property == o.property end # @see the `==` method @@ -73,7 +81,7 @@ module Petstore # Calculates hash code according to all attributes. # @return [Fixnum] Hash code def hash - [name, snake_case].hash + [name, snake_case, property].hash end # Builds the object from hash diff --git a/samples/client/petstore/ruby/spec/models/name_spec.rb b/samples/client/petstore/ruby/spec/models/name_spec.rb index 9eef65de2fa..e4942b173b9 100644 --- a/samples/client/petstore/ruby/spec/models/name_spec.rb +++ b/samples/client/petstore/ruby/spec/models/name_spec.rb @@ -56,5 +56,15 @@ describe 'Name' do end end + describe 'test attribute "property"' do + it 'should work' do + # assertion here + # should be_a() + # should be_nil + # should == + # should_not == + end + end + end