Project plugin works again

This commit is contained in:
Yevgen Muntyan 2006-08-08 20:52:27 -05:00
parent cc60bdd4b9
commit 00ca8d604a
20 changed files with 179 additions and 255 deletions

View File

@ -27,7 +27,7 @@ AC_DEFINE(MOO_BUILD_PYTHON_MODULE, 1, MOO_BUILD_PYTHON_MODULE)
else
AM_CONDITIONAL(MOO_INSTALL_LIB, true)
AM_CONDITIONAL(MOO_BUILD_PYTHON_MODULE, false)
AM_CONDITIONAL(MOO_INSTALL_HEADERS, true)
AM_CONDITIONAL(MOO_INSTALL_HEADERS, false)
fi
AC_PROG_CC

View File

@ -293,16 +293,16 @@
</kdevdoctreeview>
<kdevfilecreate>
<filetypes>
<type icon="source" ext="g" create="template" name="GAP source" >
<type icon="source" ext="g" name="GAP source" create="template" >
<descr>A new empty GAP source file</descr>
</type>
<type icon="source_cpp" ext="cpp" create="template" name="C++ Source" >
<type icon="source_cpp" ext="cpp" name="C++ Source" create="template" >
<descr>A new empty C++ file.</descr>
</type>
<type icon="source_h" ext="h" create="template" name="C/C++ Header" >
<type icon="source_h" ext="h" name="C/C++ Header" create="template" >
<descr>A new empty header file for C/C++.</descr>
</type>
<type icon="source_c" ext="c" create="template" name="C Source" >
<type icon="source_c" ext="c" name="C Source" create="template" >
<descr>A new empty C file.</descr>
</type>
</filetypes>

View File

@ -1,8 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<medit-project name="moo" type="C" version="1.0">
<make>
<n_jobs>3</n_jobs>
</make>
<configurations>
<debug>
<run>

View File

@ -2,6 +2,5 @@ from mprj.config._config import *
from mprj.config._item import *
from mprj.config._setting import *
from mprj.config._group import *
from mprj.config._list import *
from mprj.config._dict import *
from mprj.config._xml import *

View File

@ -1,6 +1,7 @@
__all__ = ['Config']
from mprj.config._group import Group, _GroupMeta
from mprj.config._xml import XMLGroup
class Config(Group):
@ -20,10 +21,17 @@ class Config(Group):
self.name = file.name
self.type = file.project_type
self.version = file.version
self.load_xml()
def load_xml(self):
Group.load(self, self.file.root)
def get_xml(self):
xml = self.save()[0]
xml = Group.save(self)
if xml:
xml = xml[0]
else:
xml = XMLGroup('medit-project')
xml.set_attr('name', self.name)
xml.set_attr('type', self.type)
xml.set_attr('version', self.version)

View File

@ -1,22 +1,25 @@
__all__ = ['Dict']
from mprj.config._item import Item
from mprj.config._item import Item, create_instance
from mprj.config._xml import XMLGroup, XMLItem
def _load_instance(typ, info, node):
if issubclass(typ, Item):
obj = mprj._item.create_instance(info, node.name)
obj = create_instance(info, node.name)
obj.load(node)
else:
return typ(node.get())
obj = typ(node.get())
# print "_load_instance: ", obj
return obj
def _save_instance(name, obj):
if isinstance(obj, Item):
return obj.save()
elif obj is None:
return XMLItem(name, None)
return [XMLItem(name, None)]
else:
return XMLItem(name, str(obj))
return [XMLItem(name, str(obj))]
def _copy_instance(obj):
if isinstance(obj, Item):
@ -25,13 +28,10 @@ def _copy_instance(obj):
return type(obj)(obj)
def Dict(info = str):
def Dict(info = str, **kwargs):
if isinstance(info, type):
typ = info
if issubclass(info, Item):
pass
else:
pass
info = [typ, kwargs]
else:
typ = info[0]
@ -54,6 +54,10 @@ def Dict(info = str):
return item
def __setitem__(self, key, value):
if not isinstance(value, Dict.__elm_type__):
raise TypeError('value %s is invalid for %s' % (value, self))
if self.__items.has_key(key):
raise RuntimeError('key %s already exists in %s' % (key, self))
self.__items[key] = value
def __eq__(self, other):
@ -66,16 +70,35 @@ def Dict(info = str):
def get_value(self):
return self
def get_items(self):
return self.__items.items()
def items(self): return self.__items.items()
def keys(self): return self.__items.keys()
def copy_from(self, other):
self.__items = {}
for key in other:
self[key] = _copy_instance(other[key])
changed = Dict.copy_from(self, other)
first, common, second = dict_diff(self.__items, other.__items)
if first or second:
changed = True
for key in first:
self.remove_item(key)
for key in second:
self.add_item(_copy_instance(other.__items[key]))
if issubclass(Dict.__elm_type__, Item):
for key in common:
changed = self.__items[key].copy_from(other.__items[key]) or changed
else:
for key in common:
old = self.__items[key]
new = other.__items[key]
if old != new:
self.__items[key] = new
changed = True
return changed
def load(self, node):
print 'load'
# print "Dict.load: %s, %s, %s" % (Dict.__elm_type__, Dict.__elm_info__, node)
for c in node.children():
self[c.name] = _load_instance(Dict.__elm_type__, Dict.__elm_info__, c)

View File

@ -2,6 +2,7 @@ __all__ = ['Group']
from mprj.config._item import Item, _ItemMeta, create_instance
from mprj.config._xml import XMLGroup
from mprj.config._utils import dict_diff
class _GroupMeta(_ItemMeta):
@ -43,12 +44,12 @@ class Group(Item):
if items:
for id in items:
self.add_item(id, items[id])
self.add_item(items[id], id)
if hasattr(type(self), '__items__'):
items = getattr(type(self), '__items__')
for id in items:
self.add_item(id, items[id])
self.add_item(items[id], id)
def __getattr__(self, attr):
if self.has_item(attr):
@ -83,9 +84,17 @@ class Group(Item):
return self.__items_dict.has_key(name)
def copy_from(self, other):
Item.copy_from(self, other)
for item in self:
item.copy_from(other[item.get_id()])
changed = Item.copy_from(self, other)
first, common, second = dict_diff(self.__items_dict, other.__items_dict)
if first or second:
changed = True
for id in first:
self.remove_item(id)
for id in common:
changed = self[id].copy_from(other[id]) or changed
for id in second:
self.add_item(other[id].copy())
return changed
def get_value(self):
return self
@ -93,9 +102,12 @@ class Group(Item):
def get_items(self):
return self.__items
def add_item(self, id, info):
def add_item(self, info, id=None):
if id is None:
id = info.get_id()
if self.has_item(id):
raise RuntimeError("item '%s' already exist in '%s'" % (id, self))
# print info
item = create_instance(info, id)
self.__items.append(item)
self.__items_dict[id] = item

View File

@ -93,8 +93,24 @@ class Item(object):
def __init__(self, id, name=None, description=None, visible=True):
object.__init__(self)
self.__id = id
if name:
self.__name = name or _(id)
self.__description = description or self.__name
elif hasattr(type(self), '__item_name__'):
self.__name = getattr(type(self), '__item_name__')
else:
self.__name = _(id)
if description:
self.__description = description
elif hasattr(type(self), '__item_description__'):
self.__description = getattr(type(self), '__item_description__')
else:
self.__description = self.__name
if hasattr(type(self), '__item_visible__'):
self.__visible = getattr(type(self), '__item_visible__')
else:
self.__visible = visible
def set_name(self, name): self.__name = name
@ -115,6 +131,7 @@ class Item(object):
self.__name = other.__name
self.__description = other.__description
self.__visible = other.__visible
return False
def copy(self):
copy = create_instance(type(self), self.get_id())

View File

@ -1,92 +0,0 @@
__all__ = ['List']
from mprj.config._item import Item
def _load_instance(typ, info, node):
if issubclass(typ, Item):
obj = mprj._item.create_instance(info, node.name)
obj.load(node)
else:
return typ(node.get())
def _save_instance(obj):
if isinstance(obj, Item):
return obj.save()
elif obj is None:
return XMLItem('item', None)
else:
return XMLItem('item', str(obj))
def _copy_instance(obj):
if isinstance(obj, Item):
return obj.copy()
else:
return type(obj)(obj)
def List(info = str):
if isinstance(info, type):
typ = info
if issubclass(info, Item):
pass
else:
pass
else:
typ = info[0]
class List(Item):
__elm_type__ = typ
__elm_info__ = info
def __init__(self, *args, **kwargs):
Item.__init__(self, *args, **kwargs)
self.__items = []
def __len__(self): return len(self.__items)
def __iter__(self): return self.__items.__iter__()
def __getitem__(self, ind):
item = self.__items[ind]
if issubclass(List.__elm_type__, Item):
return item.get_value()
else:
return item
def __eq__(self, other):
return type(self) == type(other) and \
self.get_id() == other.get_id() and \
self.__items == other.__items
def __ne__(self, other):
return not self.__eq__(other)
def get_items(self):
return self.__items
def get_value(self):
return self
def append(self, item):
if not isinstance(item, List.__elm_type__):
raise ValueError()
self.__items.append(item)
def copy_from(self, other):
self.__items = []
for elm in other:
self.append(_copy_instance(elm))
def load(self, node):
for c in node.children():
self.append(_load_instance(List.__elm_type__, List.__elm_info__, c))
def save(self):
nodes = []
for c in self:
nodes += _save_instance(c)
if nodes:
return [XMLGroup(self.get_id(), nodes)]
else:
return []
return List

View File

@ -5,7 +5,7 @@ from mprj.config._xml import XMLItem
class Setting(Item):
def __init__(self, id, value=None, default=None, editable=None, data_type=None, **kwargs):
def __init__(self, id, value=None, default=None, editable=True, data_type=None, **kwargs):
Item.__init__(self, id, **kwargs)
self.__default = default
@ -64,7 +64,8 @@ class Setting(Item):
return self.equal(self.get_default())
def copy_from(self, other):
self.set_value(other.get_value())
changed = Item.copy_from(self, other)
return self.set_value(other.get_value()) or changed
def copy(self):
return create_instance(type(self), self.get_id(),

View File

@ -0,0 +1,11 @@
def dict_diff(dic1, dic2):
first, common, second = {}, {}, {}
for k in dic1:
if dic2.has_key(k):
common[k] = k
else:
first[k] = k
for k in dic2:
if not common.has_key(k):
second[k] = k
return first, common, second

View File

@ -233,38 +233,13 @@ class TestGroup(unittest.TestCase):
self.assert_(g.foo == g.bar)
class TestList(unittest.TestCase):
def testlist(self):
typ = List(str)
l = typ.create_instance('ddd')
l.append('1')
l.append('2')
self.assert_(len(l) == 2)
l2 = typ.create_instance('ddd')
l2.append('1')
l2.append('2')
self.assert_(l == l2)
def testlist2(self):
typ = List(Setting())
l = typ.create_instance('ddd')
l.append(Setting.create_instance('a'))
l.append(Setting.create_instance('b'))
self.assert_(len(l) == 2)
l2 = typ.create_instance('ddd')
l2.append(Setting.create_instance('a'))
l2.append(Setting.create_instance('b'))
self.assert_(l == l2)
self.assert_(l == l.copy())
class TestConfig(unittest.TestCase):
def testconfig(self):
class C(Config):
__items__ = {
'variables' : Dict(str),
'project_dir' : Setting(data_type=str),
'stuff' : List(str)
'stuff' : Dict(str)
}
f = File("""<medit-project version="1.0" name="Foo" type="Simple">
@ -280,7 +255,7 @@ class TestConfig(unittest.TestCase):
self.assert_(len(c.get_items()) == 3)
self.assert_(c.project_dir == '.')
self.assert_(len(c.stuff) == 1)
self.assert_(c.stuff[0] == 'ddd')
self.assert_(c.stuff['kff'] == 'ddd')
self.assert_(c.variables['foo'] == 'bar')

View File

@ -1,4 +1,4 @@
__all__ = ['Column', 'View']
__all__ = ['Column', 'View', 'CellText', 'CellToggle']
""" configview.py: TreeView column and cell renderers for settings """
@ -144,7 +144,7 @@ class CellText(gtk.CellRendererText):
def do_edited(self, path, text):
model = self.__model
setting = model.get_value(model.get_iter(path), self.__column)
setting.set(text)
setting.set_string(text)
""" CellToggle: toggle renderer """
@ -158,4 +158,4 @@ class CellToggle(gtk.CellRendererToggle):
def do_toggled(self, path):
model = self.__model
setting = model.get_value(model.get_iter(path), self.__column)
setting.set(not setting.get_bool())
setting.set_value(not setting.get_bool())

View File

@ -200,7 +200,6 @@ class Manager(object):
project_type = self.project_types.get(file.project_type)
config_type = getattr(project_type, '__config__')
config = config_type(file)
config.load()
self.project = project_type(window, config)
self.project.load()

View File

@ -1,7 +1,7 @@
""" settings.py: basic Setting subclasses """
from mprj.config import Setting, Group, List
from mprj.config._view import *
from mprj.config import Setting, Group, Dict, Item
from mprj.config.view import *
from mprj.config._xml import XMLItem, XMLGroup
def _cmp_nodes(n1, n2):
@ -9,25 +9,25 @@ def _cmp_nodes(n1, n2):
class String(Setting):
def get_cell_type(self):
return mprj.configview.CellText
return CellText
def get_string(self):
return self.get()
return self.get_value()
def set_string(self, text):
self.set(text)
self.set_value(text)
class Bool(Setting):
def get_cell_type(self):
return mprj.configview.CellToggle
return CellToggle
def get_bool(self):
return self.get()
return self.get_value()
def set_string(self, text):
self.set(bool(text))
self.set_value(bool(text))
class Int(Setting):
def get_cell_type(self):
return mprj.configview.CellText
return CellText
def get_int(self):
return self.get()
return self.get_value()
def check_value(self, value):
try:
value = int(value)
@ -35,28 +35,7 @@ class Int(Setting):
except:
return False
def set_string(self, text):
self.set(int(text))
class Dict(Setting, dict):
def load(self, node):
for c in node.children():
self[c.name] = c.get()
def save(self):
nodes = []
for k in self:
val = self[k]
if val is not None:
nodes.append(XmlItem(k, val))
if nodes:
nodes.sort(_cmp_nodes)
return [XMLGroup(self.get_id(), nodes)]
else:
return []
def copy(self):
copy = Dict()
for key in self:
copy[key] = self[key]
return copy
self.set_value(int(text))
if __name__ == '__main__':
import gtk
@ -65,16 +44,16 @@ if __name__ == '__main__':
window.set_size_request(300,200)
window.connect('destroy', gtk.main_quit)
group = mprj.config.Group('ddd')
s = String('blah', value='111')
group = Group.create_instance('ddd')
s = String.create_instance('blah', value='111')
group.add_item(s)
group.blah = 8
print s.get()
print s.get_value()
print s is group.blah
group.add_item(String('foo', value='foofoofoofoofoofoofoofoo'))
group.add_item(Bool('fff', value=True))
group.add_item(String.create_instance('foo', value='foofoofoofoofoofoofoofoo'))
group.add_item(Bool.create_instance('fff', value=True))
view = mprj.configview.View(group)
view = View(group)
window.add(view)
window.show_all()
gtk.main()

View File

@ -1,15 +1,15 @@
import moo
import os.path
from moo.utils import _
from mprj.project import Project
from mprj.config import Config
from mprj.settings import Dict
from mprj.config import Config, Dict
from mprj.utils import print_error
from mprj.session import Session
class SimpleConfig(Config):
__items__ = { 'vars' : Dict }
__items__ = { 'vars' : Dict(str, name=_('Environment variables')) }
class SimpleProject(Project):
@ -75,3 +75,26 @@ class SimpleProject(Project):
def create_options_dialog(self):
return None
if __name__ == '__main__':
from mprj.config import File
s1 = """
<medit-project name="moo" type="Simple" version="2.0">
<vars>
<foo>bar</foo>
<blah>bom</blah>
</vars>
</medit-project>
"""
c = SimpleConfig(File(s1))
s2 = str(c.get_xml())
print s2
c = SimpleConfig(File(s2))
s3 = str(c.get_xml())
assert s2 == s3

View File

@ -1,33 +0,0 @@
from mprj.settings import *
from mprj.config import File, Config
f = File("""<medit-project version="1.0" name="Foo" type="Simple">
<variables>
<foo>bar</foo>
</variables>
<project_dir>.</project_dir>
<stuff>
<kff>ddd</kff>
</stuff>
</medit-project>""")
class D(Group):
__items__ = {'kff' : String, 'blah' : String}
D('ddd')
List(D)
class C(Config):
__items__ = {'variables' : Dict,
'project_dir' : String,
'stuff' : D,
'somestuff' : D}
c = C(f)
c.load()
# print c.variables
# print c.project_dir
# print c.stuff
# print f
# print c
print c.get_xml()

View File

@ -1,5 +1,6 @@
import os.path
import moo
from moo.utils import _
from mprj.utils import expand_command
from mprj.settings import *
@ -11,20 +12,24 @@ class MakeOptions(Group):
'flags' : String,
'cmd' : String,
'n_jobs' : Int(default=1),
'vars' : Dict
'vars' : Dict(str)
}
__item_name__ = _('Make options')
__item_descrption__ = _('Make options')
class ConfigureOptions(Group):
__items__ = {
'args' : String,
'args' : String(name=_('Configure arguments')),
'cppflags' : String,
'ldflags' : String,
'cflags' : String,
'cxxflags' : String,
'cc' : String,
'cxx' : String,
'vars' : Dict
'vars' : Dict(str, name=_('Environment variables'))
}
__item_name__ = _('Configure options')
__item_descrption__ = _('Configure options')
class Commands(Group):
__items__ = {
@ -36,6 +41,8 @@ class Commands(Group):
'distclean' : String(default='cd $(top_builddir) && $(make) distclean'),
'install' : String(default='cd $(top_builddir) && $(make) install')
}
__item_name__ = _('Build commands')
__item_descrption__ = _('Build commands')
class RunOptions(Group):
__items__ = {
@ -43,8 +50,10 @@ class RunOptions(Group):
'run_from_dir' : String,
'exe' : String,
'args' : String,
'vars' : Dict
'vars' : Dict(str)
}
__item_name__ = _('Run options')
__item_descrption__ = _('Run options')
def load(self, node):
Group.load(self, node)
@ -59,11 +68,13 @@ class RunOptions(Group):
class BuildConfiguration(Group):
__items__ = {
'build_dir' : String,
'build_dir' : String(name=_('Build directory')),
'make' : MakeOptions,
'run' : RunOptions,
'configure' : ConfigureOptions
}
__item_name__ = _('Build configuration')
__item_descrption__ = _('Build configuration')
def load(self, node):
self.name = node.name
@ -74,27 +85,26 @@ class CConfig(SimpleConfig):
__items__ = {
'run' : RunOptions,
'make' : MakeOptions,
'configurations' : List(BuildConfiguration),
'configurations' : Dict(BuildConfiguration),
'active' : String,
'commands' : Commands
}
def load(self):
SimpleConfig.load(self)
def load_xml(self):
SimpleConfig.load_xml(self)
if not self.configurations:
if not len(self.configurations):
raise RuntimeError("No configurations defined")
if self.active:
confs = [c.name for c in self.configurations]
if self.active not in confs:
if self.active not in self.configurations.keys():
raise RuntimeError("Invalid configuration %s" % (self.active,))
else:
self.active = self.configurations[0].name
self.active = self.configurations.keys()[0]
self.confs = {}
for c in self.configurations:
self.confs[c.name] = c
for name in self.configurations:
self.confs[name] = self.configurations[name]
def get_active_conf(self):
if not self.confs:
@ -193,7 +203,7 @@ class CConfig(SimpleConfig):
self.get_build_dir(topdir))
if __name__ == '__main__':
from mprj.configxml import File
from mprj.config import File
s1 = """
<medit-project name="moo" type="C" version="2.0">
@ -227,13 +237,11 @@ if __name__ == '__main__':
"""
c = CConfig(File(s1))
c.load()
s2 = str(c.get_xml())
print s2
c = CConfig(File(s2))
c.load()
s3 = str(c.get_xml())
assert s2 == s3

View File

@ -3,7 +3,6 @@ from moo.utils import _
import mprj.optdialog
from mprj.optdialog import page_new_from_file
print __file__
dir = os.path.dirname(__file__)
class Page(mprj.optdialog.Page):

View File

@ -28,7 +28,7 @@ class LatexConfig(SimpleConfig):
None, filename, topdir, None)
if __name__ == '__main__':
from mprj.configxml import File
from mprj.config import File
s1 = """
<medit-project name="moo" type="LaTeX" version="1.0">
@ -37,13 +37,11 @@ if __name__ == '__main__':
"""
c = LatexConfig(File(s1))
c.load()
s2 = str(c.get_xml())
print s2
c = LatexConfig(File(s2))
c.load()
s3 = str(c.get_xml())
assert s2 == s3