Some packaging improvements
[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 """
19 Utils to help in the setup process
20 """
21
22 import os
23 import re
24 import sys
25
26
27 def get_reqs_from_files(reqfiles):
28     """
29     Returns the contents of the top requirement file listed as a
30     string list with the lines
31
32     @param reqfiles: requirement files to parse
33     @type reqfiles: list of str
34     """
35     for reqfile in reqfiles:
36         if os.path.isfile(reqfile):
37             return open(reqfile, 'r').read().split('\n')
38
39
40 def parse_requirements(reqfiles=['requirements.txt',
41                                  'requirements.pip',
42                                  'pkg/requirements.pip']):
43     """
44     Parses the requirement files provided.
45
46     Checks the value of LEAP_VENV_SKIP_PYSIDE to see if it should
47     return PySide as a dep or not. Don't set, or set to 0 if you want
48     to install it through pip.
49
50     @param reqfiles: requirement files to parse
51     @type reqfiles: list of str
52     """
53
54     requirements = []
55     skip_pyside = os.getenv("LEAP_VENV_SKIP_PYSIDE", "0") != "0"
56     for line in get_reqs_from_files(reqfiles):
57         # -e git://foo.bar/baz/master#egg=foobar
58         if re.match(r'\s*-e\s+', line):
59             pass
60             # do not try to do anything with externals on vcs
61             #requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1',
62                                 #line))
63         # http://foo.bar/baz/foobar/zipball/master#egg=foobar
64         elif re.match(r'\s*https?:', line):
65             requirements.append(re.sub(r'\s*https?:.*#egg=(.*)$', r'\1',
66                                 line))
67         # -f lines are for index locations, and don't get used here
68         elif re.match(r'\s*-f\s+', line):
69             pass
70
71         # argparse is part of the standard library starting with 2.7
72         # adding it to the requirements list screws distro installs
73         elif line == 'argparse' and sys.version_info >= (2, 7):
74             pass
75         elif line == 'PySide' and skip_pyside:
76             pass
77         # do not include comments
78         elif line.lstrip().startswith('#'):
79             pass
80         else:
81             if line != '':
82                 requirements.append(line)
83
84     return requirements