Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

#!/usr/bin/env python 

# -*- coding: utf-8 -*- 

 

############################################################################### 

#  Copyright 2013 Kitware Inc. 

# 

#  Licensed under the Apache License, Version 2.0 ( 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.apache.org/licenses/LICENSE-2.0 

# 

#  Unless required by applicable law or agreed to in writing, software 

#  distributed under the License is distributed on an "AS IS" BASIS, 

#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

#  See the License for the specific language governing permissions and 

#  limitations under the License. 

############################################################################### 

 

import importlib 

 

# We want the models to essentially be singletons, so we keep this centralized 

# cache of instantiated models that have been lazy-loaded. 

_modelInstances = {} 

 

 

def _camelcase(value): 

    """ 

    Helper method to convert module name to class name. 

    """ 

    return ''.join(str.capitalize(x) if x else '_' for x in value.split('_')) 

 

 

def _loadModel(model, module, plugin): 

    global _modelInstances 

    className = _camelcase(model) 

 

    try: 

        imported = importlib.import_module(module) 

    except ImportError:  # pragma: no cover 

        raise Exception('Could not load model "{}".'.format(module)) 

 

    try: 

        constructor = getattr(imported, className) 

    except AttributeError:  # pragma: no cover 

        raise Exception('Incorrect model class name "{}" for model "{}".' 

                        .format(className, module)) 

 

    _modelInstances[plugin][model] = constructor() 

 

 

def clearModels(): 

    """ 

    Force reloading of all models by clearing the singleton cache. This is 

    used by the test suite to ensure that indices are built properly 

    at startup. 

    """ 

    global _modelInstances 

    _modelInstances = {} 

 

 

class ModelImporter(object): 

    """ 

    Any class that wants to have convenient model importing semantics 

    should extend/mixin this class. 

    """ 

    def model(self, model, plugin='_core'): 

        """ 

        Call this to get the instance of the specified model. It will be 

        lazy-instantiated. 

 

        :param model: The name of the model to get. This is the module 

                      name, e.g. "folder". The class name must be the 

                      upper-camelcased version of that module name, e.g. 

                      "Folder". 

        :type model: string 

        :param plugin: If the model you wish to load is a model within a plugin, 

                       set this to the name of the plugin containing the model. 

        :returns: The instantiated model, which is a singleton. 

        """ 

        global _modelInstances 

        if plugin not in _modelInstances: 

            _modelInstances[plugin] = {} 

 

        if model not in _modelInstances[plugin]: 

            if plugin == '_core': 

                module = 'girder.models.{}'.format(model) 

            else: 

                module = 'girder.plugins.{}.models.{}'.format(plugin, model) 

 

            _loadModel(model, module, plugin) 

 

        return _modelInstances[plugin][model]