summaryrefslogtreecommitdiff
path: root/amqp_codegen.py
diff options
context:
space:
mode:
Diffstat (limited to 'amqp_codegen.py')
-rw-r--r--amqp_codegen.py305
1 files changed, 0 insertions, 305 deletions
diff --git a/amqp_codegen.py b/amqp_codegen.py
deleted file mode 100644
index 9be2cad..0000000
--- a/amqp_codegen.py
+++ /dev/null
@@ -1,305 +0,0 @@
-## The contents of this file are subject to the Mozilla Public License
-## Version 1.1 (the "License"); you may not use this file except in
-## compliance with the License. You may obtain a copy of the License at
-## http://www.mozilla.org/MPL/
-##
-## Software distributed under the License is distributed on an "AS IS"
-## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-## License for the specific language governing rights and limitations
-## under the License.
-##
-## The Original Code is RabbitMQ.
-##
-## The Initial Developers of the Original Code are LShift Ltd,
-## Cohesive Financial Technologies LLC, and Rabbit Technologies Ltd.
-##
-## Portions created before 22-Nov-2008 00:00:00 GMT by LShift Ltd,
-## Cohesive Financial Technologies LLC, or Rabbit Technologies Ltd
-## are Copyright (C) 2007-2008 LShift Ltd, Cohesive Financial
-## Technologies LLC, and Rabbit Technologies Ltd.
-##
-## Portions created by LShift Ltd are Copyright (C) 2007-2009 LShift
-## Ltd. Portions created by Cohesive Financial Technologies LLC are
-## Copyright (C) 2007-2009 Cohesive Financial Technologies
-## LLC. Portions created by Rabbit Technologies Ltd are Copyright
-## (C) 2007-2009 Rabbit Technologies Ltd.
-##
-## All Rights Reserved.
-##
-## Contributor(s): ______________________________________.
-##
-
-from __future__ import nested_scopes
-import re
-import sys
-from os import remove
-from optparse import OptionParser
-
-try:
- try:
- import simplejson as json
- except ImportError, e:
- if sys.hexversion >= 0x20600f0:
- import json
- else:
- raise e
-except ImportError:
- print >> sys.stderr , " You don't appear to have simplejson.py installed"
- print >> sys.stderr , " (an implementation of a JSON reader and writer in Python)."
- print >> sys.stderr , " You can install it:"
- print >> sys.stderr , " - by running 'apt-get install python-simplejson' on Debian-based systems,"
- print >> sys.stderr , " - by running 'yum install python-simplejson' on Fedora/Red Hat system,"
- print >> sys.stderr , " - by running 'port install py25-simplejson' on Macports on OS X"
- print >> sys.stderr , " (you may need to say 'make PYTHON=python2.5', as well),"
- print >> sys.stderr , " - from sources from 'http://pypi.python.org/pypi/simplejson'"
- print >> sys.stderr , " - simplejson is a standard json library in the Python core since 2.6"
- sys.exit(1)
-
-def insert_base_types(d):
- for t in ['octet', 'shortstr', 'longstr', 'short', 'long',
- 'longlong', 'bit', 'table', 'timestamp']:
- d[t] = t
-
-class AmqpSpecFileMergeConflict(Exception): pass
-
-# 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
- 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 acc)
- for [k, v] in new:
- 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):
- acc_index = set(v[dict_key] for v in acc)
- result = list(acc) # shallow copy
- for v in new:
- if v[dict_key] in acc_index:
- if not ignore_conflicts:
- raise AmqpSpecFileMergeConflict(description, acc, new)
- else:
- result.append(v)
- return result
-
-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):
- acc_dict = dict((v["name"], v) for v in acc)
- result = list(acc) # shallow copy
- for w in new:
- if w["name"] in acc_dict:
- class_merger(acc_dict[w["name"]], w, ignore_conflicts)
- else:
- result.append(w)
- return result
-
-mergers = {
- "extension": (extension_info_merger, []),
- "domains": (domains_merger, []),
- "constants": (constants_merger, []),
- "classes": (classes_merger, []),
-}
-
-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, 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, AmqpSpec.ignore_conflicts)
-
- self.major = self.spec['major-version']
- self.minor = self.spec['minor-version']
- self.revision = self.spec.has_key('revision') and self.spec['revision'] or 0
- self.port = self.spec['port']
-
- self.domains = {}
- insert_base_types(self.domains)
- for entry in self.spec['domains']:
- self.domains[ entry[0] ] = entry[1]
-
- self.constants = []
- for d in self.spec['constants']:
- if d.has_key('class'):
- klass = d['class']
- else:
- klass = ''
- self.constants.append((d['name'], d['value'], klass))
-
- self.classes = []
- for element in self.spec['classes']:
- self.classes.append(AmqpClass(self.spec, element))
-
- def allClasses(self):
- return self.classes
-
- def allMethods(self):
- return [m for c in self.classes for m in c.allMethods()]
-
- def resolveDomain(self, n):
- return self.domains[n]
-
-class AmqpEntity:
- def __init__(self, element):
- self.element = element
- self.name = element['name']
-
-class AmqpClass(AmqpEntity):
- def __init__(self, spec, element):
- AmqpEntity.__init__(self, element)
- self.spec = spec
- self.index = int(self.element['id'])
-
- self.methods = []
- for method_element in self.element['methods']:
- self.methods.append(AmqpMethod(self, method_element))
-
- self.hasContentProperties = False
- for method in self.methods:
- if method.hasContent:
- self.hasContentProperties = True
- break
-
- self.fields = []
- if self.element.has_key('properties'):
- index = 0
- for e in self.element['properties']:
- self.fields.append(AmqpField(self, e, index))
- index = index + 1
-
- def allMethods(self):
- return self.methods
-
- def __repr__(self):
- return 'AmqpClass("' + self.name + '")'
-
-class AmqpMethod(AmqpEntity):
- def __init__(self, klass, element):
- AmqpEntity.__init__(self, element)
- self.klass = klass
- self.index = int(self.element['id'])
- if self.element.has_key('synchronous'):
- self.isSynchronous = self.element['synchronous']
- else:
- self.isSynchronous = False
- if self.element.has_key('content'):
- self.hasContent = self.element['content']
- else:
- self.hasContent = False
- if self.element.has_key('accepted-by'):
- self.acceptedBy = self.element['accepted-by']
- else:
- self.acceptedBy = []
- self.arguments = []
-
- index = 0
- for argument in element['arguments']:
- self.arguments.append(AmqpField(self, argument, index))
- index = index + 1
-
- def __repr__(self):
- return 'AmqpMethod("' + self.klass.name + "." + self.name + '" ' + repr(self.arguments) + ')'
-
-class AmqpField(AmqpEntity):
- def __init__(self, method, element, index):
- AmqpEntity.__init__(self, element)
- self.method = method
- self.index = index
-
- if self.element.has_key('type'):
- self.domain = self.element['type']
- else:
- self.domain = self.element['domain']
-
- if self.element.has_key('default-value'):
- self.defaultvalue = self.element['default-value']
- else:
- self.defaultvalue = None
-
- def __repr__(self):
- return 'AmqpField("' + self.name + '")'
-
-def do_main(header_fn, body_fn):
- do_main_dict({"header": header_fn, "body": 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 , " where <function> is one of %s" % ", ".join([k for k in funcDict.keys()])
-
- def execute(fn, amqp_specs, out_file):
- stdout = sys.stdout
- f = open(out_file, 'w')
- try:
- try:
- sys.stdout = f
- fn(amqp_specs)
- except:
- remove(out_file)
- raise
- finally:
- sys.stdout = stdout
- f.close()
-
- 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:
- 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)