summaryrefslogtreecommitdiffstats
path: root/utils/generate-command-help.rb
diff options
context:
space:
mode:
Diffstat (limited to 'utils/generate-command-help.rb')
-rwxr-xr-xutils/generate-command-help.rb151
1 files changed, 151 insertions, 0 deletions
diff --git a/utils/generate-command-help.rb b/utils/generate-command-help.rb
new file mode 100755
index 0000000..1042ce6
--- /dev/null
+++ b/utils/generate-command-help.rb
@@ -0,0 +1,151 @@
+#!/usr/bin/env ruby -w
+# Usage: generate-command-help.r [path/to/commands.json]
+# or: generate-commands-json.py | generate-command-help.rb -
+#
+# Defaults to downloading commands.json from the redis-doc repo if not provided
+# or STDINed.
+
+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["arguments"].map do |entry|
+ argument entry
+ end.join " "
+ elsif "oneof" == arg["type"]
+ name = arg["arguments"].map do |entry|
+ argument entry
+ end.join "|"
+ elsif "pure-token" == arg["type"]
+ name = nil # prepended later
+ else
+ name = arg["name"].is_a?(Array) ? arg["name"].join(" ") : arg["name"]
+ end
+ if arg["multiple"]
+ if arg["multiple_token"]
+ name = "#{name} [#{arg["token"]} #{name} ...]"
+ else
+ name = "#{name} [#{name} ...]"
+ end
+ end
+ if arg["token"]
+ name = [arg["token"], name].compact.join " "
+ 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"
+ if ARGV.length > 0
+ if ARGV[0] == '-'
+ data = STDIN.read
+ elsif FileTest.exist? ARGV[0]
+ data = File.read(ARGV[0])
+ else
+ raise Exception.new "File not found: #{ARGV[0]}"
+ end
+ else
+ 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)
+ response.error!
+ return
+ else
+ data = response.body
+ end
+ end
+ @commands = JSON.parse(data)
+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
+