class PG::Connection

def self.parse_connect_args( *args )

It returns a connection string with "key=value" pairs.
The method adds the option "fallback_application_name" if it isn't already set.

* positional arguments
* URI object
* URI string
* an option Hash kind of {host: "name", port: 5432}
* an option String kind of "host=name port=5432"
It accepts:

See PG::Connection.new for valid arguments.
Parse the connection +args+ into a connection-parameter string.
def self.parse_connect_args( *args )
	hash_arg = args.last.is_a?( Hash ) ? args.pop.transform_keys(&:to_sym) : {}
	iopts = {}
	if args.length == 1
		case args.first.to_s
		when /=/, /:\/\//
			# Option or URL string style
			conn_string = args.first.to_s
			iopts = PG::Connection.conninfo_parse(conn_string).each_with_object({}){|h, o| o[h[:keyword].to_sym] = h[:val] if h[:val] }
		else
			# Positional parameters (only host given)
			iopts[CONNECT_ARGUMENT_ORDER.first.to_sym] = args.first
		end
	else
		# Positional parameters with host and more
		max = CONNECT_ARGUMENT_ORDER.length
		raise ArgumentError,
				"Extra positional parameter %d: %p" % [ max + 1, args[max] ] if args.length > max
		CONNECT_ARGUMENT_ORDER.zip( args ) do |(k,v)|
			iopts[ k.to_sym ] = v if v
		end
		iopts.delete(:tty) # ignore obsolete tty parameter
	end
	iopts.merge!( hash_arg )
	if !iopts[:fallback_application_name]
		iopts[:fallback_application_name] = PROGRAM_NAME.sub( /^(.{30}).{4,}(.{30})$/ ){ $1+"..."+$2 }
	end
	return connect_hash_to_string(iopts)
end