Skip to content

Commit

Permalink
Better default values and enums handling for methods
Browse files Browse the repository at this point in the history
  • Loading branch information
alsemyonov committed Sep 30, 2016
1 parent 5ae657c commit 9df7cc1
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 12 deletions.
2 changes: 1 addition & 1 deletion data/schema
Submodule schema updated 1 files
+134 −17 methods.json
76 changes: 66 additions & 10 deletions lib/vk/schema/definition/attribute.rb
Expand Up @@ -11,7 +11,7 @@ class Attribute < self
'integer' => 'API::Types::Coercible::Int',
'number' => 'API::Types::Coercible::Int',
'object' => 'API::Types::Coercible::Hash',
'boolean' => 'API::Types::Bool'
'boolean' => 'API::Types::Form::Bool'
)

def initialize(name, definition, schema, object)
Expand All @@ -36,36 +36,88 @@ def attribute_name
def type
type = if simple?
simple_type
elsif array?
elsif multiple_types?
type_variants
elsif reference?
referenced_definition.dry_type
elsif polymorphic?
polymorphic_type
elsif inline_object?
# TODO: make inline struct definition
'API::Types::Coercible::Hash'
'API::Types::Coercible::Hash'.tap do |hash|
end
else
puts "Unknown definition: #{definition.inspect}"
end
type += '.optional.default(nil)' unless required_attribute?
type += '.optional' unless required?
type += ".default(#{default_value})" if default? || optional?
type
end

def required_attribute?
# @return [Boolean]
def default?
definition.key?('default')
end

# @return [Boolean]
def enum?
definition.key?('enum')
end

# @return [Object]
def default_value
if default?
value = if enum?
definition['enum'][
definition['default']
]
else
definition['default']
end
value = value == 1 if boolean?
# TODO: fix following after schema fixed
value = [] if array? && value.zero?
value = nil if string? && !value.is_a?(String)
value
end.inspect
end

# @return [String]
def boolean?
definition['type'] == 'boolean'
end

# @return [String]
def string?
definition['type'] == 'string'
end

# @return [Boolean]
def required?
object.required_attribute?(@name) || definition['required']
end

# @return [Boolean]
def optional?
!required?
end

# @return [String]
def simple_type
result = self.class.type_for(definition['type'])
if array_item?
member = referenced_item_definition.referenced_type_name
result += ".member(#{member})"
member = if definition['items']['$ref'].is_a?(String)
referenced_item_definition.referenced_type_name
elsif definition['items']['type']
self.class.type_for(definition['items']['type'])
end
result += ".member(#{member})" if member

if definition['maxItems']
result += ".constrained(max_size: #{definition['maxItems']})"
end
elsif enum?
result += ".enum(#{definition['enum'].map(&:inspect).join(', ')})"
end
result
end
Expand All @@ -91,7 +143,7 @@ def returned_type
type =
if simple?
definition['type'].capitalize
elsif array?
elsif multiple_types?
definition['type'].map(&:capitalize).join(', ')
elsif reference?
referenced_definition.referenced_type_name
Expand All @@ -117,13 +169,17 @@ def simple?
end

# @return [Boolean]
def array?
def multiple_types?
definition['type'].is_a?(Array)
end

def array?
definition['type'] == 'array'
end

# @return [Boolean]
def array_item?
definition['items'].is_a?(Hash) && definition['items']['$ref'].is_a?(String)
array? && definition['items'].is_a?(Hash)
end

# @return [Boolean]
Expand Down
2 changes: 1 addition & 1 deletion lib/vk/schema/templates/methods.tt
Expand Up @@ -18,7 +18,7 @@ module Vk
<%- methods.each do |method| -%>
# @param [Hash] arguments
<%- method.attributes.each do |attribute| -%>
# @option arguments [<%= attribute.returned_type %>] <%= attribute.attribute_name %> <%= attribute.description %>
# @option arguments [<%= attribute.returned_type %>] <%= attribute.attribute_name %> <%= "(#{attribute.default_value})" if attribute.default? %> <%= attribute.description %>
<%- end -%>
# @see Vk::API::<%= method.namespace %>::Methods::<%= method.type_name %>
# @return [<%= method.response_class %>] <%= method.description %>
Expand Down

0 comments on commit 9df7cc1

Please sign in to comment.