# -*- coding: utf-8 -*-
##
## This file is part of Invenio.
## Copyright (C) 2013, 2014 CERN.
##
## Invenio is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License as
## published by the Free Software Foundation; either version 2 of the
## License, or (at your option) any later version.
##
## Invenio is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Invenio; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.

from flask.ext.registry import PkgResourcesDirDiscoveryRegistry, \
    ModuleAutoDiscoveryRegistry, RegistryProxy

from invenio.ext.registry import ModuleAutoDiscoverySubRegistry
from invenio.utils.datastructures import LazyDict

jsonext = lambda namespace: RegistryProxy(
    namespace, ModuleAutoDiscoveryRegistry, namespace
)

fields_definitions = lambda namespace: RegistryProxy(
    namespace + '.fields', PkgResourcesDirDiscoveryRegistry, 'fields',
    registry_namespace=jsonext(namespace))

models_definitions = lambda namespace: RegistryProxy(
    namespace + '.models', PkgResourcesDirDiscoveryRegistry, 'models',
    registry_namespace=jsonext(namespace))

function_proxy = lambda namespace: RegistryProxy(
    namespace + '.functions', ModuleAutoDiscoverySubRegistry, 'functions',
    registry_namespace=jsonext(namespace))


def functions(namespace):
    funcs = dict((module.__name__.split('.')[-1],
                 getattr(module, module.__name__.split('.')[-1], ''))
                 for module in function_proxy('jsonext'))
    funcs.update((module.__name__.split('.')[-1],
                 getattr(module, module.__name__.split('.')[-1], ''))
                 for module in function_proxy(namespace))
    return funcs

parsers = RegistryProxy('jsonext.parsers', ModuleAutoDiscoverySubRegistry,
                        'parsers', registry_namespace=jsonext('jsonext'))

producers_proxy = RegistryProxy('jsonext.producers',
                                ModuleAutoDiscoverySubRegistry,
                                'producers',
                                registry_namespace=jsonext('jsonext'))

producers = LazyDict(lambda: dict((module.__name__.split('.')[-1],
                                   module.produce)
                                  for module in producers_proxy))

readers_proxy = RegistryProxy('jsonext.readers',
                              ModuleAutoDiscoverySubRegistry,
                              'readers', registry_namespace=jsonext('jsonext'))

readers = LazyDict(lambda: dict((module.reader.__master_format__,
                                 module.reader)
                                for module in readers_proxy))

contexts_proxy = lambda namespace: RegistryProxy(
    namespace + '.contexts', ModuleAutoDiscoverySubRegistry, 'contexts',
    registry_namespace=jsonext(namespace))


def contexts(namespace):
    contexts = dict((module.__name__.split('.')[-1],
                     getattr(module, 'context'))
                    for module in contexts_proxy('jsonext'))
    contexts.update((module.__name__.split('.')[-1],
                     getattr(module, 'context'))
                    for module in contexts_proxy(namespace))
    return contexts

@@ -1119,30 +1119,24 @@
 pace
-%0A
 )%0A%0A
+%0A
 fields_
-definitions
+proxy
  = l
@@ -1286,175 +1286,546 @@
 ))%0A%0A
-models_definitions = lambda namespace: RegistryProxy(%0A    namespace + '.models', PkgResourcesDirDiscoveryRegistry, 'models',%0A    registry_namespace=jsonext(namespace))
+%0Adef fields_definitions(namespace=None):%0A    field_defs = list(fields_proxy('jsonext'))%0A    if namespace:%0A        field_defs.extend(list(fields_proxy(namespace)))%0A    return field_defs%0A%0A%0Amodels_proxy = lambda namespace: RegistryProxy(%0A    namespace + '.models', PkgResourcesDirDiscoveryRegistry, 'models',%0A    registry_namespace=jsonext(namespace))%0A%0A%0Adef models_definitions(namespace=None):%0A    models_defs = list(models_proxy('jsonext'))%0A    if namespace:%0A        models_defs.extend(list(models_proxy(namespace)))%0A    return models_defs%0A
 %0A%0Afu
@@ -2011,24 +2011,29 @@
 ns(namespace
+=None
 ):%0A    funcs
@@ -2128,36 +2128,32 @@
 _.split('.')%5B-1%5D
-, ''
 ))%0A             
@@ -2193,24 +2193,46 @@
 'jsonext'))%0A
+    if namespace:%0A    
     funcs.up
@@ -2261,32 +2261,36 @@
 split('.')%5B-1%5D,%0A
+    
                 
@@ -2340,15 +2340,15 @@
 %5B-1%5D
-, ''))%0A
+))%0A    
     
@@ -2419,16 +2419,17 @@
  funcs%0A%0A
+%0A
 parsers 
@@ -2562,32 +2562,33 @@
 xt('jsonext'))%0A%0A
+%0A
 producers_proxy 
@@ -2805,16 +2805,17 @@
 ext'))%0A%0A
+%0A
 producer
@@ -2987,24 +2987,25 @@
 rs_proxy))%0A%0A
+%0A
 readers_prox
@@ -3184,16 +3184,17 @@
 ext'))%0A%0A
+%0A
 readers 
@@ -3362,16 +3362,17 @@
 roxy))%0A%0A
+%0A
 contexts

add `jsonext` as common namespace