summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2010-07-20 11:05:57 +0100
committerSimon MacMullen <simon@rabbitmq.com>2010-07-20 11:05:57 +0100
commita18a50bf475be62d5fd61e26c5975a3b623186de (patch)
tree737e95ca47efcdc017706256dd5278029fcb6f6a
parentf5dabf3fa4d41b4c5d79f5acc7c0b9f71a1ff695 (diff)
parente8a9b491d60451666c03a19b55e624b7b9df3c60 (diff)
downloadrabbitmq-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.py134
-rw-r--r--rabbitmq-0.8-extensions.json37
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"}
- ]
- }]
-}
-