diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2010-07-20 11:05:57 +0100 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2010-07-20 11:05:57 +0100 |
commit | a18a50bf475be62d5fd61e26c5975a3b623186de (patch) | |
tree | 737e95ca47efcdc017706256dd5278029fcb6f6a | |
parent | f5dabf3fa4d41b4c5d79f5acc7c0b9f71a1ff695 (diff) | |
parent | e8a9b491d60451666c03a19b55e624b7b9df3c60 (diff) | |
download | rabbitmq-codegen-a18a50bf475be62d5fd61e26c5975a3b623186de.tar.gz |
Merge bug 22889 into amqp_0_9_1.
-rw-r--r-- | amqp-rabbitmq-0.8.json (renamed from amqp-0.8.json) | 22 | ||||
-rw-r--r-- | amqp-rabbitmq-0.9.1.json (renamed from amqp-0.9.1.json) | 54 | ||||
-rw-r--r-- | amqp_codegen.py | 134 | ||||
-rw-r--r-- | rabbitmq-0.8-extensions.json | 37 |
4 files changed, 133 insertions, 114 deletions
diff --git a/amqp-0.8.json b/amqp-rabbitmq-0.8.json index 1507dd2..e6083ea 100644 --- a/amqp-0.8.json +++ b/amqp-rabbitmq-0.8.json @@ -289,7 +289,18 @@ "synchronous" : true}, {"id": 41, "arguments": [{"type": "long", "name": "message-count"}], - "name": "delete-ok"} + "name": "delete-ok"}, + {"id": 50, + "arguments": [{"type": "short", "name": "ticket", "default-value": 1}, + {"type": "shortstr", "name": "queue"}, + {"type": "shortstr", "name": "exchange"}, + {"type": "shortstr", "name": "routing-key", "default-value": ""}, + {"type": "table", "name": "arguments", "default-value": {}}], + "name": "unbind", + "synchronous" : true}, + {"id": 51, + "arguments": [], + "name": "unbind-ok"} ], "name": "queue" }, @@ -375,7 +386,14 @@ "name": "reject"}, {"id": 100, "arguments": [{"type": "bit", "name": "requeue", "default-value": false}], - "name": "recover-async"}], + "name": "recover-async"}, + {"id": 110, + "arguments": [{"type": "bit", "name": "requeue", "default-value": false}], + "name": "recover", + "synchronous" : true}, + {"id": 111, + "arguments": [], + "name": "recover-ok"}], "name": "basic", "properties": [{"type": "shortstr", "name": "content-type"}, {"type": "shortstr", "name": "content-encoding"}, diff --git a/amqp-0.9.1.json b/amqp-rabbitmq-0.9.1.json index a4c4648..72cd628 100644 --- a/amqp-0.9.1.json +++ b/amqp-rabbitmq-0.9.1.json @@ -134,12 +134,12 @@ "name": "tune-ok"}, {"id": 40, "arguments": [{"type": "shortstr", "name": "virtual-host", "default-value": "/"}, - {"type": "shortstr", "name": "deprecated-capabilities", "default-value": ""}, - {"type": "bit", "name": "deprecated-insist", "default-value": false}], + {"type": "shortstr", "name": "capabilities", "default-value": ""}, + {"type": "bit", "name": "insist", "default-value": false}], "name": "open", "synchronous" : true}, {"id": 41, - "arguments": [{"type": "shortstr", "name": "deprecated-known-hosts", "default-value": ""}], + "arguments": [{"type": "shortstr", "name": "known-hosts", "default-value": ""}], "name": "open-ok"}, {"id": 50, "arguments": [{"type": "short", "name": "reply-code"}, @@ -157,11 +157,11 @@ { "id": 20, "methods": [{"id": 10, - "arguments": [{"type": "shortstr", "name": "deprecated-out-of-band", "default-value": ""}], + "arguments": [{"type": "shortstr", "name": "out-of-band", "default-value": ""}], "name": "open", "synchronous" : true}, {"id": 11, - "arguments": [{"type": "longstr", "name": "deprecated-channel-id", "default-value": ""}], + "arguments": [{"type": "longstr", "name": "channel-id", "default-value": ""}], "name": "open-ok"}, {"id": 20, "arguments": [{"type": "bit", "name": "active"}], @@ -183,15 +183,31 @@ "name": "channel" }, { + "id": 30, + "methods": [{"id": 10, + "arguments": [{"type": "shortstr", "name": "realm", "default-value": "/data"}, + {"type": "bit", "name": "exclusive", "default-value": false}, + {"type": "bit", "name": "passive", "default-value": true}, + {"type": "bit", "name": "active", "default-value": true}, + {"type": "bit", "name": "write", "default-value": true}, + {"type": "bit", "name": "read", "default-value": true}], + "name": "request", + "synchronous" : true}, + {"id": 11, + "arguments": [{"type": "short", "name": "ticket", "default-value": 1}], + "name": "request-ok"}], + "name": "access" + }, + { "id": 40, "methods": [{"id": 10, - "arguments": [{"type": "short", "name": "deprecated-ticket", "default-value": 0}, + "arguments": [{"type": "short", "name": "ticket", "default-value": 0}, {"type": "shortstr", "name": "exchange"}, {"type": "shortstr", "name": "type", "default-value": "direct"}, {"type": "bit", "name": "passive", "default-value": false}, {"type": "bit", "name": "durable", "default-value": false}, - {"type": "bit", "name": "deprecated-auto-delete", "default-value": false}, - {"type": "bit", "name": "deprecated-internal", "default-value": false}, + {"type": "bit", "name": "auto-delete", "default-value": false}, + {"type": "bit", "name": "internal", "default-value": false}, {"type": "bit", "name": "nowait", "default-value": false}, {"type": "table", "name": "arguments", "default-value": {}}], "name": "declare", @@ -200,7 +216,7 @@ "arguments": [], "name": "declare-ok"}, {"id": 20, - "arguments": [{"type": "short", "name": "deprecated-ticket", "default-value": 0}, + "arguments": [{"type": "short", "name": "ticket", "default-value": 0}, {"type": "shortstr", "name": "exchange"}, {"type": "bit", "name": "if-unused", "default-value": false}, {"type": "bit", "name": "nowait", "default-value": false}], @@ -214,7 +230,7 @@ { "id": 50, "methods": [{"id": 10, - "arguments": [{"type": "short", "name": "deprecated-ticket", "default-value": 0}, + "arguments": [{"type": "short", "name": "ticket", "default-value": 0}, {"type": "shortstr", "name": "queue", "default-value": ""}, {"type": "bit", "name": "passive", "default-value": false}, {"type": "bit", "name": "durable", "default-value": false}, @@ -230,7 +246,7 @@ {"type": "long", "name": "consumer-count"}], "name": "declare-ok"}, {"id": 20, - "arguments": [{"type": "short", "name": "deprecated-ticket", "default-value": 0}, + "arguments": [{"type": "short", "name": "ticket", "default-value": 0}, {"type": "shortstr", "name": "queue"}, {"type": "shortstr", "name": "exchange"}, {"type": "shortstr", "name": "routing-key", "default-value": ""}, @@ -242,7 +258,7 @@ "arguments": [], "name": "bind-ok"}, {"id": 30, - "arguments": [{"type": "short", "name": "deprecated-ticket", "default-value": 0}, + "arguments": [{"type": "short", "name": "ticket", "default-value": 0}, {"type": "shortstr", "name": "queue"}, {"type": "bit", "name": "nowait", "default-value": false}], "name": "purge", @@ -251,7 +267,7 @@ "arguments": [{"type": "long", "name": "message-count"}], "name": "purge-ok"}, {"id": 40, - "arguments": [{"type": "short", "name": "deprecated-ticket", "default-value": 0}, + "arguments": [{"type": "short", "name": "ticket", "default-value": 0}, {"type": "shortstr", "name": "queue"}, {"type": "bit", "name": "if-unused", "default-value": false}, {"type": "bit", "name": "if-empty", "default-value": false}, @@ -262,7 +278,7 @@ "arguments": [{"type": "long", "name": "message-count"}], "name": "delete-ok"}, {"id": 50, - "arguments": [{"type": "short", "name": "deprecated-ticket", "default-value": 0}, + "arguments": [{"type": "short", "name": "ticket", "default-value": 0}, {"type": "shortstr", "name": "queue"}, {"type": "shortstr", "name": "exchange"}, {"type": "shortstr", "name": "routing-key", "default-value": ""}, @@ -287,7 +303,7 @@ "arguments": [], "name": "qos-ok"}, {"id": 20, - "arguments": [{"domain": "short", "name": "deprecated-ticket", "default-value": 0}, + "arguments": [{"domain": "short", "name": "ticket", "default-value": 0}, {"domain": "queue-name", "name": "queue"}, {"type": "shortstr", "name": "consumer-tag", "default-value": ""}, {"type": "bit", "name": "no-local", "default-value": false}, @@ -310,7 +326,7 @@ "name": "cancel-ok"}, {"content": true, "id": 40, - "arguments": [{"type": "short", "name": "deprecated-ticket", "default-value": 0}, + "arguments": [{"type": "short", "name": "ticket", "default-value": 0}, {"type": "shortstr", "name": "exchange", "default-value": ""}, {"type": "shortstr", "name": "routing-key", "default-value": ""}, {"type": "bit", "name": "mandatory", "default-value": false}, @@ -332,7 +348,7 @@ {"type": "shortstr", "name": "routing-key"}], "name": "deliver"}, {"id": 70, - "arguments": [{"type": "short", "name": "deprecated-ticket", "default-value": 0}, + "arguments": [{"type": "short", "name": "ticket", "default-value": 0}, {"type": "shortstr", "name": "queue"}, {"type": "bit", "name": "no-ack", "default-value": false}], "name": "get", @@ -346,7 +362,7 @@ {"type": "long", "name": "message-count"}], "name": "get-ok"}, {"id": 72, - "arguments": [{"type": "shortstr", "name": "deprecated-cluster-id", "default-value": ""}], + "arguments": [{"type": "shortstr", "name": "cluster-id", "default-value": ""}], "name": "get-empty"}, {"id": 80, "arguments": [{"type": "longlong", "name": "delivery-tag", "default-value": 0}, @@ -380,7 +396,7 @@ {"type": "shortstr", "name": "type"}, {"type": "shortstr", "name": "user-id"}, {"type": "shortstr", "name": "app-id"}, - {"type": "shortstr", "name": "deprecated-cluster-id"}] + {"type": "shortstr", "name": "cluster-id"}] }, { "id": 90, diff --git a/amqp_codegen.py b/amqp_codegen.py index e80264d..f6a2d73 100644 --- a/amqp_codegen.py +++ b/amqp_codegen.py @@ -33,6 +33,7 @@ from __future__ import nested_scopes import re import sys from os import remove +from optparse import OptionParser try: try: @@ -61,57 +62,66 @@ def insert_base_types(d): class AmqpSpecFileMergeConflict(Exception): pass -def default_spec_value_merger(key, old, new): - if old is None or old == new: +# If ignore_conflicts is true, then we allow acc and new to conflict, +# with whatever's already in acc winning and new being ignored. If +# ignore_conflicts is false, acc and new must not conflict. + +def default_spec_value_merger(key, acc, new, ignore_conflicts): + if acc is None or acc == new or ignore_conflicts: return new - raise AmqpSpecFileMergeConflict(key, old, new) - -def extension_info_merger(key, old, new): - return old + [new] - -def domains_merger(key, old, new): - o = dict((k, v) for [k, v] in old) - for [k, v] in new: - if o.has_key(k): - raise AmqpSpecFileMergeConflict(key, old, new) - o[k] = v - return [[k, v] for (k, v) in o.iteritems()] - -def merge_dict_lists_by(dict_key, old, new, description): - old_index = set(v[dict_key] for v in old) - result = list(old) # shallow copy - for v in new: - if v[dict_key] in old_index: - raise AmqpSpecFileMergeConflict(description, old, new) - result.append(v) + else: + raise AmqpSpecFileMergeConflict(key, acc, new) + +def extension_info_merger(key, acc, new, ignore_conflicts): + return acc + [new] + +def domains_merger(key, acc, new, ignore_conflicts): + merged = dict((k, v) for [k, v] in new) + for [k, v] in acc: + if merged.has_key(k): + if not ignore_conflicts: + raise AmqpSpecFileMergeConflict(key, acc, new) + else: + merged[k] = v + + return [[k, v] for (k, v) in merged.iteritems()] + +def merge_dict_lists_by(dict_key, acc, new, ignore_conflicts): + new_index = set(v[dict_key] for v in new) + result = list(new) # shallow copy + for v in acc: + if v[dict_key] in new_index: + if not ignore_conflicts: + raise AmqpSpecFileMergeConflict(description, acc, new) + else: + result.append(v) return result -def constants_merger(key, old, new): - return merge_dict_lists_by("name", old, new, key) - -def methods_merger(classname, old, new): - return merge_dict_lists_by("name", old, new, ("class-methods", classname)) - -def properties_merger(classname, old, new): - oldnames = set(v["name"] for v in old) - newnames = set(v["name"] for v in new) - clashes = oldnames.intersection(newnames) - if clashes: - raise AmqpSpecFileMergeConflict(("class-properties", classname), old, new) - return old + new - -def class_merger(old, new): - old["methods"] = methods_merger(old["name"], old["methods"], new["methods"]) - old["properties"] = properties_merger(old["name"], - old.get("properties", []), - new.get("properties", [])) - -def classes_merger(key, old, new): - old_dict = dict((v["name"], v) for v in old) - result = list(old) # shallow copy - for w in new: - if w["name"] in old_dict: - class_merger(old_dict[w["name"]], w) +def constants_merger(key, acc, new, ignore_conflicts): + return merge_dict_lists_by("name", acc, new, ignore_conflicts) + +def methods_merger(classname, acc, new, ignore_conflicts): + return merge_dict_lists_by("name", acc, new, ignore_conflicts) + +def properties_merger(classname, acc, new, ignore_conflicts): + return merge_dict_lists_by("name", acc, new, ignore_conflicts) + +def class_merger(acc, new, ignore_conflicts): + acc["methods"] = methods_merger(acc["name"], + acc["methods"], + new["methods"], + ignore_conflicts) + acc["properties"] = properties_merger(acc["name"], + acc.get("properties", []), + new.get("properties", []), + ignore_conflicts) + +def classes_merger(key, acc, new, ignore_conflicts): + new_dict = dict((v["name"], v) for v in new) + result = list(new) # shallow copy + for w in acc: + if w["name"] in new_dict: + class_merger(new_dict[w["name"]], w, ignore_conflicts) else: result.append(w) return result @@ -123,24 +133,28 @@ mergers = { "classes": (classes_merger, []), } -def merge_load_specs(filenames): +def merge_load_specs(filenames, ignore_conflicts): handles = [file(filename) for filename in filenames] docs = [json.load(handle) for handle in handles] spec = {} for doc in docs: for (key, value) in doc.iteritems(): (merger, default_value) = mergers.get(key, (default_spec_value_merger, None)) - spec[key] = merger(key, spec.get(key, default_value), value) + spec[key] = merger(key, spec.get(key, default_value), value, ignore_conflicts) for handle in handles: handle.close() return spec class AmqpSpec: + # Slight wart: use a class member rather than change the ctor signature + # to avoid breaking everyone else's code. + ignore_conflicts = False + def __init__(self, filenames): - self.spec = merge_load_specs(filenames) + self.spec = merge_load_specs(filenames, AmqpSpec.ignore_conflicts) self.major = self.spec['major-version'] self.minor = self.spec['minor-version'] - self.revision = self.spec.get('revision', 0) + self.revision = self.spec.has_key('revision') and self.spec['revision'] or 0 self.port = self.spec['port'] self.domains = {} @@ -251,7 +265,7 @@ def do_main(header_fn, body_fn): def do_main_dict(funcDict): def usage(): print >> sys.stderr , "Usage:" - print >> sys.stderr , " %s <function> <path_to_amqp_spec.json> <path_to_output_file>" % (sys.argv[0]) + print >> sys.stderr , " %s <function> <path_to_amqp_spec.json>... <path_to_output_file>" % (sys.argv[0]) print >> sys.stderr , " where <function> is one of %s" % ", ".join([k for k in funcDict.keys()]) def execute(fn, amqp_specs, out_file): @@ -268,12 +282,20 @@ def do_main_dict(funcDict): sys.stdout = stdout f.close() - if len(sys.argv) < 4: + parser = OptionParser() + parser.add_option("--ignore-conflicts", action="store_true", dest="ignore_conflicts", default=False) + (options, args) = parser.parse_args() + + if len(args) < 3: usage() sys.exit(1) else: - if funcDict.has_key(sys.argv[1]): - execute(funcDict[sys.argv[1]], sys.argv[2:-1], sys.argv[-1]) + function = args[0] + sources = args[1:-1] + dest = args[-1] + AmqpSpec.ignore_conflicts = options.ignore_conflicts + if funcDict.has_key(function): + execute(funcDict[function], sources, dest) else: usage() sys.exit(1) diff --git a/rabbitmq-0.8-extensions.json b/rabbitmq-0.8-extensions.json deleted file mode 100644 index e901180..0000000 --- a/rabbitmq-0.8-extensions.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "extension": { - "name": "RabbitMQ 0-8 extensions", - "version": "1.0", - "copyright": "Copyright (C) 2010 Rabbit Technologies Ltd." - }, - "classes": [ - {"name": "queue", - "id": 50, - "methods": [ - {"id": 50, - "arguments": [{"type": "short", "name": "ticket", "default-value": 1}, - {"type": "shortstr", "name": "queue"}, - {"type": "shortstr", "name": "exchange"}, - {"type": "shortstr", "name": "routing-key", "default-value": ""}, - {"type": "table", "name": "arguments", "default-value": {}}], - "name": "unbind", - "synchronous" : true}, - {"id": 51, - "arguments": [], - "name": "unbind-ok"} - ] - }, - {"name": "basic", - "id": 60, - "methods": [ - {"id": 110, - "arguments": [{"type": "bit", "name": "requeue", "default-value": false}], - "name": "recover", - "synchronous" : true}, - {"id": 111, - "arguments": [], - "name": "recover-ok"} - ] - }] -} - |