[pkg] separate leap requirements
[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     The passed reqfiles list is a list of possible locations to try, the
47     function will return the contents of the first path found.
48
49     Checks the value of LEAP_VENV_SKIP_PYSIDE to see if it should
50     return PySide as a dep or not. Don't set, or set to 0 if you want
51     to install it through pip.
52
53     @param reqfiles: requirement files to parse
54     @type reqfiles: list of str
55     """
56
57     requirements = []
58     skip_pyside = os.getenv("LEAP_VENV_SKIP_PYSIDE", "0") != "0"
59     for line in get_reqs_from_files(reqfiles):
60         # -e git://foo.bar/baz/master#egg=foobar
61         if re.match(r'\s*-e\s+', line):
62             pass
63             # do not try to do anything with externals on vcs
64             # requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1',
65             #                     line))
66             # http://foo.bar/baz/foobar/zipball/master#egg=foobar
67         elif re.match(r'\s*https?:', line):
68             requirements.append(re.sub(r'\s*https?:.*#egg=(.*)$', r'\1',
69                                 line))
70         # -f lines are for index locations, and don't get used here
71         elif re.match(r'\s*-f\s+', line):
72             pass
73
74         # argparse is part of the standard library starting with 2.7
75         # adding it to the requirements list screws distro installs
76         elif line == 'argparse' and sys.version_info >= (2, 7):
77             pass
78         elif line == 'PySide' and skip_pyside:
79             pass
80         # do not include comments
81         elif line.lstrip().startswith('#'):
82             pass
83         else:
84             if line != '':
85                 requirements.append(line)
86
87     return requirements