Ejemplo n.º 1
0
def list_production_resources(managers):
    """This list for each different resource type all the couple of
    (layers, context) that can be used in production with all needed
    resources managers to include all needed resources for those
    couples.
    """
    best_interface = lambda i1, i2: i1 if i1.extends(i2) else i2
    by_extension = {}
    managers = managers.items()
    managers.sort(key=lambda (k, m): m.identifier)
    for (layer, context, extension), manager in managers:
        resources = by_extension.setdefault(extension, {})
        managers = resources.setdefault(
            (tuple(set(list_base_layers(layer))),
             tuple(set(list_base_interfaces(context)))),
            [])
        managers.append(manager)
    for extension, layers in by_extension.iteritems():
        ordering = []
        for (layer, context), data in layers.iteritems():
            ordering.append((set(layer), set(context), data, [], True))
        ordering = sort_tuple(ordering)
        generated = []

        def generate(layer, context):
            info = (layer, context)
            if info not in generated:
                generated.append(info)
                ordering.append((layer, context, [], [], False))

        for layer1, context1, data1, full_data1, original1 in ordering:
            for layer2, context2, data2, full_data2, original2 in ordering:
                if layer2.issubset(layer1):
                    if data2:
                        if context2.issubset(context1):
                            full_data1.extend(data2)
                            if context1 != context2 and original1:
                                generate(layer1, context2)
                        elif layer1 != layer2 and original2:
                            # If we are not on the same entry and that
                            # entry is not generated, generate one
                            # possible combinaison
                            generate(layer1, context2)
        for layer, context, data, full_data, original in ordering:
            yield (reduce(best_interface, layer),
                   reduce(best_interface, context),
                   full_data,
                   extension)
Ejemplo n.º 2
0
def include_layer_directive(
    _context, resources, layer=IDefaultBrowserLayer, context=Interface):

    for base in list_base_layers(resources):
        files = silvaconf.resource.bind(default=_marker).get(base)
        if not files:
            continue

        base = base.__module__.rsplit('.', 1)[0]
        files = map(lambda (a, b): '/'.join((a, b)), zip(repeat(base), files))

        _context.action(
            discriminator = (
                'resourceInclude', layer, context, "".join(files)),
            callable = register_development_resources,
            args = (files, layer, context, _context.info),)