[pkg] do not add leap deps in develop mode
[keymanager.git] / pkg / utils.py
1 # -*- coding: utf-8 -*-
2 # utils.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 Utils to help in the setup process
19 """
20 import os
21 import re
22 import sys
23
24
25 def is_develop_mode():
26     """
27     Returns True if we're calling the setup script using the argument for
28     setuptools development mode.
29
30     This avoids messing up with dependency pinning and order, the
31     responsibility of installing the leap dependencies is left to the
32     developer.
33     """
34     args = sys.argv
35     devflags = "setup.py", "develop"
36     if (args[0], args[1]) == devflags:
37         return True
38     return False
39
40
41 def get_reqs_from_files(reqfiles):
42     """
43     Returns the contents of the top requirement file listed as a
44     string list with the lines.
45
46     @param reqfiles: requirement files to parse
47     @type reqfiles: list of str
48     """
49     for reqfile in reqfiles:
50         if os.path.isfile(reqfile):
51             return open(reqfile, 'r').read().split('\n')
52
53
54 def parse_requirements(reqfiles=['requirements.txt',
55                                  'requirements.pip',
56                                  'pkg/requirements.pip']):
57     """
58     Parses the requirement files provided.
59
60     The passed reqfiles list is a list of possible locations to try, the
61     function will return the contents of the first path found.
62
63     Checks the value of LEAP_VENV_SKIP_PYSIDE to see if it should
64     return PySide as a dep or not. Don't set, or set to 0 if you want
65     to install it through pip.
66
67     @param reqfiles: requirement files to parse
68     @type reqfiles: list of str
69     """
70
71     requirements = []
72     skip_pyside = os.getenv("LEAP_VENV_SKIP_PYSIDE", "0") != "0"
73     for line in get_reqs_from_files(reqfiles):
74         # -e git://foo.bar/baz/master#egg=foobar
75         if re.match(r'\s*-e\s+', line):
76             pass
77             # do not try to do anything with externals on vcs
78             # requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1',
79             #                     line))
80             # http://foo.bar/baz/foobar/zipball/master#egg=foobar
81         elif re.match(r'\s*https?:', line):
82             requirements.append(re.sub(r'\s*https?:.*#egg=(.*)$', r'\1',
83                                 line))
84         # -f lines are for index locations, and don't get used here
85         elif re.match(r'\s*-f\s+', line):
86             pass
87
88         # argparse is part of the standard library starting with 2.7
89         # adding it to the requirements list screws distro installs
90         elif line == 'argparse' and sys.version_info >= (2, 7):
91             pass
92         elif line == 'PySide' and skip_pyside:
93             pass
94         # do not include comments
95         elif line.lstrip().startswith('#'):
96             pass
97         else:
98             if line != '':
99                 requirements.append(line)
100
101     return requirements