Skip to content

[crystal][client] Add param default values to method definitions and refactor methods to use only keyword args if the method has more than one param#10673

Closed
cyangle wants to merge 8 commits intoOpenAPITools:masterfrom
cyangle:nil_as_default_for_optional_args
Closed

[crystal][client] Add param default values to method definitions and refactor methods to use only keyword args if the method has more than one param#10673
cyangle wants to merge 8 commits intoOpenAPITools:masterfrom
cyangle:nil_as_default_for_optional_args

Conversation

@cyangle
Copy link
Copy Markdown
Contributor

@cyangle cyangle commented Oct 24, 2021

@wing328 This PR mainly refactored how it handles nillable and nullable types and default values. I got some ideas from the kotlin-client sample code
The breaking change is the requirement of keyword argument invoking style of methods which is needed to support setting default values
last in order is required for setting default values to positional params but it's not required in keyword args

There are other minor fixes. Check the details listed below, and you should also check the commit messages.

  • Refactor methods to use keyword args if the method has more than one param
  • Add default values to method definitions and model initializers
  • Add boolean flag hasOnlyOneParam - sets to true when the method has only one param
  • Handle empty collection param
  • Handle conversion to string from non file and non string types
  • Refactor model with nilable types - Inspiration from kotlin-client code samples
  • Refactor model initializers to support only keyword args
  • Add profile crystal-client to pom.xml
  • Clean up gitignore.mustache
  • Change deprecated URI.encode to URI.encode_path
  • Fix tests in file samples/client/petstore/crystal/spec/api/pet_api_spec.cr

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package 
    ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master (5.3.0), 6.0.x
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@cyangle cyangle changed the title [crystal][client] Add default values to method definitions and refactor methods to use keyword args if the method has more than one param [crystal][client] Add param default values to method definitions and refactor methods to use only keyword args if the method has more than one param Oct 24, 2021
@cyangle
Copy link
Copy Markdown
Contributor Author

cyangle commented Oct 26, 2021

I'm breaking this PR into smaller ones

You can put keyword argument with default value before ones without default values
So that this compiles:

class Pet
  property name : String
  property id : Int64?

  def initialize(*, @name : String = "pet", @id : Int64?)
  end
end

pp Pet.new(id: 1)
It would be convenient to allow calling a method using keyward arg and also positional arg when there is only one paramter

def one_param_method(name : String)
  puts name
end

one_param_method(name: "Pet")

one_param_method("Pet")

When there are more than one param, the methond only supports invoking with keyword arguments:

def two_param_method(*, name : String = "Pet", age : Int32)
  puts "#{name} is #{age} years old"
end

two_param_method(age: 3)   # => Pet is 3 years old
two_param_method("Pet", 3) # => Compilation Error: missing arguments: name, age
only nullable properties should emit_null
all optional and nullable required properties are nilable: They should have type {{dataType}}?
nullable required should also emit nulls in json format as the json field key is required
Handle file param separately to simplify to make it more readable
@cyangle cyangle force-pushed the nil_as_default_for_optional_args branch from 8b98d55 to 09f63ea Compare October 28, 2021 01:37
@cyangle
Copy link
Copy Markdown
Contributor Author

cyangle commented Oct 28, 2021

#10721 is extracted from this PR

@cyangle cyangle marked this pull request as draft October 30, 2021 14:55
@wing328
Copy link
Copy Markdown
Member

wing328 commented May 4, 2022

@cyangle closing this one for the time being. Please file a new one if needed. Thanks.

@wing328 wing328 closed this May 4, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants