From ce76ae25e07135965fc0823be4c1916de52f1b53 Mon Sep 17 00:00:00 2001 From: Josh Bodah Date: Fri, 21 Sep 2018 13:47:53 -0400 Subject: [PATCH] wip --- lib/spy/util.rb | 64 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/lib/spy/util.rb b/lib/spy/util.rb index b3bc270..192be99 100644 --- a/lib/spy/util.rb +++ b/lib/spy/util.rb @@ -3,6 +3,49 @@ module Spy module Util + # TODO: @jbodah 2018-09-21: superclass merge + class YARDFormatter + def format(info) + acc = [] + info[:args].each do |arg_values| + names = types_to_names(arg_values) + type_names = condense_names(names) + acc << "# @param [#{type_names.join(", ")}]" + end + names = types_to_names(info[:return_value]) + type_names = condense_names(names) + acc << "# @return [#{type_names.join(", ")}]" + acc.join("\n") + end + + def types_to_names(types) + types.map do |arg_value| + if arg_value.is_a?(Array) + head = arg_value[0] + tail = types_to_names(arg_value[1]) + "#{head.name}<#{tail.join(", ")}>" + else + arg_value.name + end + end + end + + def condense_names(names) + if names.include?("TrueClass") && names.include?("FalseClass") + names.delete("TrueClass") + names.delete("FalseClass") + names << "Boolean" + end + # todo also prune depth + %w(Set Array Hash).each do |container| + if names.include?(container) && names.any? { |n| /#{container} 0 + if obj.is_a?(Array) && obj.size > 0 - [Array, obj[0].class] + [Array, [type_of(obj.first, depth: 1)]] + elsif obj.is_a?(Hash) && obj.size > 0 + [Hash, [type_of(obj.first[0]), type_of(obj.first[1])]] + elsif defined?(Set) && obj.is_a?(Set) && obj.size > 0 + [Set, [type_of(obj.first)]] else obj.class end