add BaseConfig class and its dependencies
[leap_pycommon.git] / src / leap / common / config / prefixers.py
1 # -*- coding: utf-8 -*-
2 # prefixers.py
3 # Copyright (C) 2013 LEAP
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 """
19 Platform dependant configuration path prefixers
20 """
21 import os
22 import platform
23
24 from abc import ABCMeta, abstractmethod
25 from xdg import BaseDirectory
26
27 from leap.common.check import leap_assert
28
29
30 class Prefixer:
31     """
32     Abstract prefixer class
33     """
34
35     __metaclass__ = ABCMeta
36
37     @abstractmethod
38     def get_path_prefix(self, standalone=False):
39         """
40         Returns the platform dependant path prefixer
41
42         @param standalone: if True it will return the prefix for a
43         standalone application. Otherwise, it will return the system
44         default for configuration storage.
45         @type standalone: bool
46         """
47         return ""
48
49
50 def get_platform_prefixer():
51     prefixer = globals()[platform.system() + "Prefixer"]
52     leap_assert(prefixer, "Unimplemented platform prefixer: %s" %
53                 (platform.system(),))
54     return prefixer()
55
56
57 class LinuxPrefixer(Prefixer):
58     """
59     Config prefixer for the Linux platform
60     """
61
62     def get_path_prefix(self, standalone=False):
63         """
64         Returns the platform dependant path prefixer.
65         This method expects an env variable named LEAP_CLIENT_PATH if
66         standalone is used.
67
68         @param standalone: if True it will return the prefix for a
69         standalone application. Otherwise, it will return the system
70         default for configuration storage.
71         @type standalone: bool
72         """
73         config_dir = BaseDirectory.xdg_config_home
74         if not standalone:
75             return config_dir
76         return os.path.join(os.getcwd(), "config")
77
78
79 class DarwinPrefixer(Prefixer):
80     """
81     Config prefixer for the Darwin platform
82     """
83
84     def get_path_prefix(self, standalone=False):
85         """
86         Returns the platform dependant path prefixer.
87         This method expects an env variable named LEAP_CLIENT_PATH if
88         standalone is used.
89
90         @param standalone: if True it will return the prefix for a
91         standalone application. Otherwise, it will return the system
92         default for configuration storage.
93         @type standalone: bool
94         """
95         config_dir = BaseDirectory.xdg_config_home
96         if not standalone:
97             return config_dir
98         return os.getenv(os.getcwd(), "config")
99
100
101 class WindowsPrefixer(Prefixer):
102     """
103     Config prefixer for the Windows platform
104     """
105
106     def get_path_prefix(self, standalone=False):
107         """
108         Returns the platform dependant path prefixer.
109         This method expects an env variable named LEAP_CLIENT_PATH if
110         standalone is used.
111
112         @param standalone: if True it will return the prefix for a
113         standalone application. Otherwise, it will return the system
114         default for configuration storage.
115         @type standalone: bool
116         """
117         config_dir = BaseDirectory.xdg_config_home
118
119         if not standalone:
120             return config_dir
121         return os.path.join(os.getcwd(), "config")
122
123 if __name__ == "__main__":
124     try:
125         abs_prefixer = Prefixer()
126     except Exception as e:
127         assert isinstance(e, TypeError), "Something went wrong"
128         print "Abstract Prefixer class is working as expected"
129
130     linux_prefixer = LinuxPrefixer()
131     print linux_prefixer.get_path_prefix(standalone=True)
132     print linux_prefixer.get_path_prefix()