#!/usr/bin/env ruby GROUPS = [ "generic", "string", "list", "set", "sorted_set", "hash", "pubsub", "transactions", "connection", "server", "scripting", "hyperloglog", "cluster", "geo", "stream", "bitmap" ].freeze GROUPS_BY_NAME = Hash[* GROUPS.each_with_index.map do |n,i| [n,i] end.flatten ].freeze def argument arg if "block" == arg["type"] name = arg["block"].map do |entry| argument entry end.join " " else name = arg["name"].is_a?(Array) ? arg["name"].join(" ") : arg["name"] name = arg["enum"].join "|" if "enum" == arg["type"] name = arg["command"] + (name ? " " + name : "") if arg["command"] end if arg["multiple"] name = "#{name} [#{name} ...]" end if arg["optional"] name = "[#{name}]" end name end def arguments command return "" unless command["arguments"] command["arguments"].map do |arg| argument arg end.join " " end def commands return @commands if @commands require "rubygems" require "net/http" require "net/https" require "json" require "uri" url = URI.parse "https://raw.githubusercontent.com/redis/redis-doc/master/commands.json" client = Net::HTTP.new url.host, url.port client.use_ssl = true response = client.get url.path if response.is_a?(Net::HTTPSuccess) @commands = JSON.parse(response.body) else response.error! end end def generate_groups GROUPS.map do |n| "\"#{n}\"" end.join(",\n "); end def generate_commands commands.to_a.sort do |x,y| x[0] <=> y[0] end.map do |key, command| group = GROUPS_BY_NAME[command["group"]] if group.nil? STDERR.puts "Please update groups array in #{__FILE__}" raise "Unknown group #{command["group"]}" end ret = <<-SPEC { "#{key}", "#{arguments(command)}", "#{command["summary"]}", #{group}, "#{command["since"]}" } SPEC ret.strip end.join(",\n ") end # Write to stdout puts <<-HELP_H /* Automatically generated by #{__FILE__}, do not edit. */ #ifndef __REDIS_HELP_H #define __REDIS_HELP_H static char *commandGroups[] = { #{generate_groups} }; struct commandHelp { char *name; char *params; char *summary; int group; char *since; } commandHelp[] = { #{generate_commands} }; #endif HELP_H