As the issue https://github.com/openwisp/netjsonconfig/issues/112 goes,
It'd be ideal to be able to easily extend the backends. Since the use-case 
of adding support for an OpenWRT package is very common, this 
implementation primarily focuses on that.

Adding a method to BaseBackend to allow insertions of converters and 
schemas is an approach

class BaseBackend(object):
    .......
    .......
    def add_plugin(self, key, schema, converter):
        schema.pop('$schema', None)
        # add to backend's schema, this could have an option to raise an 
error if the value is being overridden
        self.schema['properties'][key] = schema
        if getattr(self, 'converters'):
             self.converters.append(converter)
        else:
             self.converters = [converter]

Tracking the 'plugins' can become simpler too, by adding a an attribute to 
the converter, if needed. 
Let's say I was to create a plugin for Coova-Chilli:

coova_schema = {
    "$schema": "http://json-schema.org/draft-04/schema#";,
    "type": "object",
    "properties" : {
         "disabled" : {"type" : "integer"},
     },
}


class CoovaConverter(OpenWrtConverter):
    def to_intermediate_loop(self, block, result, index=None):
        if block:
            block.update({
                '.type': 'chilli',
                '.name': 'chilli'
            })
        result['chilli'] = [self.sorted_dict(block)]
        return result
    ........
    ........


o = OpenWrt({
    'chilli': {
        "disabled": 1,
    }
})
o.add_plugin(key='chilli', schema=coova_schema, converter=CoovaConverter)
o.render()
'''
package chilli

config chilli 'chilli'
    option disabled '1'
'''
This is incomplete code, obviously, but gives an idea of how the 
implementation goes.

Thoughts?

-- 
You received this message because you are subscribed to the Google Groups 
"OpenWISP" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to openwisp+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to