Source code for nxpy.msvs.solution
# nxpy.msvs package ----------------------------------------------------------
# Copyright Nicola Musatti 2010 - 2014
# Use, modification, and distribution are subject to the Boost Software
# License, Version 1.0. (See accompanying file LICENSE.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# See http://nxpy.sourceforge.net for library home page. ---------------------
r"""
Manipulation of Microsoft Visual Studio solution files.
Currently supports Visual Studio 2008 (9.0) only.
Requires at least Python 2.6 and `ply <https://pypi.python.org/pypi/ply>`_.
"""
# Alllows for more gracious failure on Python 2.5
from __future__ import with_statement
from __future__ import absolute_import
import os.path
import six
import nxpy.core.file
import nxpy.msvs._impl.solution.parser
import nxpy.msvs._impl.solution.scanner
[docs]class Description(object):
[docs] def __init__(self, ast, disp):
self.pos = ast.pos + disp
self.len = ast.len
self._value = ast.value
self.modified = False
def _get_value(self):
return self._value
def _set_value(self, value):
if value != self._value:
self._value = value
self.modified = True
value = property(_get_value, _set_value)
[docs] def update(self, text):
if len(self.value) != 0:
t = [ text[:self.pos] ]
if self.len == 0:
t.append("\t")
v = "Description = " + self.value
t.append(v)
if self.len == 0:
t.append("\n")
t.append(text[self.pos+self.len:])
self.len = len(v)
return "".join(t)
else:
t = [ text[:self.pos].rstrip() ]
t.append(text[self.pos+self.len].lstrip(" \t"))
self.pos = len(t[0])
self.len = 0
return "".join(t)
[docs]class Solution(object):
[docs] def __init__(self, path):
self.path = os.path.realpath(path)
self.dir, self.file = os.path.split(self.path)
self.name = os.path.splitext(self.file)[0]
ast = self._read(debug=1)
self.text = ast.text
self.version = ast.version
self._description = Description(ast.description, len(self.text.splitlines(True)[0]))
self.projects = {}
for p in ast.projects:
# l = [ self.dir, ]
# l.extend(p.path.split("\\"))
# self.projects[p.name] = os.path.join(*l)
self.projects[p.name] = os.path.join(self.dir, p.path)
def _read(self, debug=False):
scanner = nxpy.msvs._impl.solution.scanner.Scanner(debug=debug)
parser = nxpy.msvs._impl.solution.parser.Parser(scanner, debug=debug)
with nxpy.core.file.open_(self.path, "r", encoding="utf-8") as f:
return parser.parse(f.read())
def _get_description(self):
return self._description.value
def _set_description(self, value):
self._description.value = value
description = property(_get_description, _set_description)
[docs] def write(self, where):
if not where:
where = self.path
if isinstance(where, six.string_types):
f = nxpy.core.file.open_(where, "w+", encoding="utf-8")
else:
f = where
try:
t = self._description.update(self.text)
if t is None:
t = self.text
f.write(t)
self.text = t
finally:
f.close()
[docs] def save(self):
if self._description.modified:
self.write(None)
return True
return False
[docs] def __str__(self):
return "\n\n".join([ " ".join([ "Solution", self.name, self.version, self.dir ]) ] +
[ str(p) for p in self.projects.values() ])