def parse object:, path: ""
      return if visited.has_key? object
     
      case object
      when Array
        object.each do |value|
          parse object: value, path: path
        end
      when Hash
        parse object: object.values, path: path
      when String
        current = objects[object]
        
        return if current.nil? || current[Keys::ISA].nil?
        
        path += '/' + current[Keys::ISA] + Helpers.resolve_attributes(object, objects)
        
        visited[object] = path
        
        parse object: current, path: path
      end
    end
def parse object:, path: ""
      return if visited.has_key? object
     
      case object
      when Array
        object.each do |value|
          parse object: value, path: path
        end
      when Hash
        parse object: object.values, path: path
      when String
        current = objects[object]
        
        return if current.nil? || current[Keys::ISA].nil?
        
        path += '/' + current[Keys::ISA] + Helpers.resolve_attributes(object, objects)
        
        visited[object] = path
        
        parse object: current, path: path
      end
    end
@param project [Hash] the project to parse
 Recursively traverse `object` building the `visited` Hash by keeping track of the current path

 Objects that have already been visited are skipped to avoid cycles or modifying existing values

 @param object [Hash, Array, String] the current object to traverse
 @param path [String] the current path to this node