chanegd taggedValue syntax

git-svn-id: file:///Users/arjan/backup/gaphor/trunk/gaphor@589 a8418922-720d-0410-834f-a69b97ada669
This commit is contained in:
Arjan Molenaar 2005-10-24 13:58:59 +00:00
parent 942679d09c
commit 8fb91b2961
11 changed files with 169 additions and 97 deletions

View File

@ -1,3 +1,14 @@
2005-10-24 Arjan Molenaar <arjanmolenaar@hetnet.nl>
* setup.py: bumped version to 0.7.2, since data model has undergone some
changes.
* gaphor/UML/uml2.gaphor: added taggedValue to NamedElement as 0..*.
* gaphor/storage.py, gaphor/UML/umllex.py,
gaphor/diagram/association.py, gaphor/diagram/attribute.py,
gaphor/diagram/diagramline.py, gaphor/diagram/operation.py:
Changed to support NamedElement.taggedValue[*].
* utils/genUML2.py: parse new taggedValues properly.
2005-10-24 wrobell <wrobell@pld-linux.org>
* gaphor/diagram/util.py: added functions which
- determine subject's class of fork and decision UI elements

File diff suppressed because one or more lines are too long

View File

@ -108,8 +108,10 @@ def parse_attribute(self, s):
self.upperValue.value = None
if self.defaultValue:
self.defaultValue.value = None
if self.taggedValue:
self.taggedValue.value = None
#if self.taggedValue:
# self.taggedValue.value = None
for tv in self.taggedValue:
tv.unlink()
else:
from uml2 import LiteralSpecification
create = self._factory.create
@ -128,9 +130,17 @@ def parse_attribute(self, s):
if not self.defaultValue:
self.defaultValue = create(LiteralSpecification)
self.defaultValue.value = g('default')
if not self.taggedValue:
self.taggedValue = create(LiteralSpecification)
self.taggedValue.value = g('tags')
#if not self.taggedValue:
# self.taggedValue = create(LiteralSpecification)
#self.taggedValue.value = g('tags')
for tv in self.taggedValue:
tv.unlink()
tags = g('tags')
if tags:
for t in map(str.strip, tags.split(',')):
tv = create(LiteralSpecification)
tv.value = t
self.taggedValue = tv
#print g('vis'), g('derived'), g('name'), g('type'), g('mult_l'), g('mult_u'), g('default'), g('tags')
def parse_association_end(self, s):
@ -150,9 +160,17 @@ def parse_association_end(self, s):
if not self.upperValue:
self.upperValue = create(LiteralSpecification)
self.upperValue.value = g('mult_u')
if not self.taggedValue:
self.taggedValue = create(LiteralSpecification)
self.taggedValue.value = g('tags')
#if not self.taggedValue:
# self.taggedValue = create(LiteralSpecification)
#self.taggedValue.value = g('tags')
while self.taggedValue:
self.taggedValue[0].unlink()
tags = g('tags')
if tags:
for t in map(str.strip, tags.split(',')):
tv = create(LiteralSpecification)
tv.value = t
self.taggedValue = tv
# We have multiplicity
else:
#print 'namematch'
@ -177,10 +195,18 @@ def parse_association_end(self, s):
if not self.upperValue:
self.upperValue = create(LiteralSpecification)
self.upperValue.value = g('mult_u')
if g('tags'):
if not self.taggedValue:
self.taggedValue = create(LiteralSpecification)
self.taggedValue.value = g('tags')
#if g('tags'):
# if not self.taggedValue:
# self.taggedValue = create(LiteralSpecification)
# self.taggedValue.value = g('tags')
tags = g('tags')
if tags:
while self.taggedValue:
self.taggedValue[0].unlink()
for t in map(str.strip, tags.split(',')):
tv = create(LiteralSpecification)
tv.value = t
self.taggedValue = tv
def parse_property(self, s):
if self.association:
@ -218,10 +244,17 @@ def parse_operation(self, s):
p.upperValue = create(LiteralSpecification)
p.upperValue.value = g('mult_u')
# FIXME: Maybe add to Operation.ownedRule?
if not p.taggedValue:
p.taggedValue = create(LiteralSpecification)
p.taggedValue.value = g('tags')
#print g('vis'), g('name'), g('type'), g('mult_l'), g('mult_u'), g('tags')
#if not p.taggedValue:
# p.taggedValue = create(LiteralSpecification)
#p.taggedValue.value = g('tags')
while self.taggedValue:
self.taggedValue[0].unlink()
tags = g('tags')
if tags:
for t in map(str.strip, tags.split(',')):
tv = create(LiteralSpecification)
tv.value = t
p.taggedValue = tv
pindex = 0
params = g('params')
@ -248,9 +281,16 @@ def parse_operation(self, s):
if not p.defaultValue:
p.defaultValue = create(LiteralSpecification)
p.defaultValue.value = g('default')
if not p.taggedValue:
p.taggedValue = create(LiteralSpecification)
p.taggedValue.value = g('tags')
#if not p.taggedValue:
# p.taggedValue = create(LiteralSpecification)
#p.taggedValue.value = g('tags')
while self.taggedValue:
self.taggedValue[0].unlink()
if tags:
for t in map(str.strip, tags.split(',')):
tv = create(LiteralSpecification)
tv.value = t
p.taggedValue = tv
self.formalParameter = p
#print ' ', g('dir') or 'in', g('name'), g('type'), g('mult_l'), g('mult_u'), g('default'), g('tags')
@ -337,8 +377,13 @@ def render_attribute(self, visibility=False, is_derived=False, type=False,
if default and self.defaultValue and self.defaultValue.value:
s.write(' = %s' % self.defaultValue.value)
if tags and self.taggedValue and self.taggedValue.value:
s.write(' { %s }' % self.taggedValue.value)
#if tags and self.taggedValue and self.taggedValue.value:
# s.write(' { %s }' % self.taggedValue.value)
if self.taggedValue:
tvs = ', '.join(filter(None, map(getattr, self.taggedValue,
['value'] * len(self.taggedValue))))
if tvs:
s.write(' { %s }' % tvs)
s.reset()
return s.read()
@ -364,8 +409,13 @@ def render_association_end(self):
m.write('%s..%s' % (self.lowerValue.value, self.upperValue.value))
else:
m.write('%s' % self.upperValue.value)
if self.taggedValue and self.taggedValue.value:
m.write(' {%s}' % self.taggedValue.value)
#if self.taggedValue and self.taggedValue.value:
# m.write(' {%s}' % self.taggedValue.value)
if self.taggedValue:
tvs = ',\n '.join(filter(None, map(getattr, self.taggedValue,
['value'] * len(self.taggedValue))))
if tvs:
m.write(' { %s }' % tvs)
m.reset()
mult = m.read()
@ -421,8 +471,12 @@ def render_operation(self, visibility=False, type=False, multiplicity=False,
s.write('[%s]' % p.upperValue.value)
if default and p.defaultValue and p.defaultValue.value:
s.write(' = %s' % p.defaultValue.value)
if tags and p.taggedValue and p.taggedValue.value:
s.write(' { %s }' % p.taggedValue.value)
#if tags and p.taggedValue and p.taggedValue.value:
# s.write(' { %s }' % p.taggedValue.value)
if p.taggedValue:
tvs = ', '.join(filter(None, map(getattr, p.taggedValue,
['value'] * len(p.taggedValue))))
s.write(' { %s }' % tvs)
if p is not self.formalParameter[-1]:
s.write(', ')
@ -437,8 +491,13 @@ def render_operation(self, visibility=False, type=False, multiplicity=False,
s.write('[%s..%s]' % (rr.lowerValue.value, rr.upperValue.value))
else:
s.write('[%s]' % rr.upperValue.value)
if tags and rr.taggedValue and rr.taggedValue.value:
s.write(' { %s }' % rr.taggedValue.value)
#if tags and rr.taggedValue and rr.taggedValue.value:
# s.write(' { %s }' % rr.taggedValue.value)
if rr.taggedValue:
tvs = ', '.join(filter(None, map(getattr, rr.taggedValue,
['value'] * len(rr.taggedValue))))
if tvs:
s.write(' { %s }' % tvs)
s.reset()
return s.read()

View File

@ -780,7 +780,7 @@ class AssociationEnd(diacanvas.CanvasItem, diacanvas.CanvasEditable, DiagramItem
DiagramItem.on_subject_notify(self, pspec,
notifiers + ('aggregation', 'visibility',
'name', 'lowerValue.value',
'upperValue.value', 'taggedValue.value',
'upperValue.value', 'taggedValue',
'owningAssociation', 'class_', 'interface_'))
#print 'w/ assoc', self.subject and self.subject.association
self.set_text()
@ -805,8 +805,8 @@ class AssociationEnd(diacanvas.CanvasItem, diacanvas.CanvasEditable, DiagramItem
self.set_text()
self.parent.request_update()
def on_subject_notify__taggedValue_value(self, tagged_value, pspec):
log.debug('New value for taggedValue.value: %s' % tagged_value and self.subject.taggedValue.value)
def on_subject_notify__taggedValue(self, tagged_value, pspec):
#log.debug('New value for taggedValue.value: %s' % tagged_value and self.subject.taggedValue.value)
self.set_text()
self.parent.request_update()

View File

@ -30,7 +30,7 @@ class AttributeItem(FeatureItem):
'upperValue.value',
'defaultValue.value',
'typeValue.value',
'taggedValue.value',
'taggedValue',
'association')
+ notifiers)
#self._expression.set_text(self.subject.render() or '')
@ -47,7 +47,7 @@ class AttributeItem(FeatureItem):
on_subject_notify__upperValue_value = on_subject_notify__name
on_subject_notify__defaultValue_value = on_subject_notify__name
on_subject_notify__typeValue_value = on_subject_notify__name
on_subject_notify__taggedValue_value = on_subject_notify__name
on_subject_notify__taggedValue = on_subject_notify__name
def on_subject_notify__association(self, subject, pspec):
"""Make sure we update the attribute compartment (in case

View File

@ -51,10 +51,10 @@ class DiagramLine(diacanvas.CanvasLine, DiagramItem):
save_func('points', points)
c = self.handles[0].connected_to
if c:
save_func('head_connection', c, reference=True)
save_func('head-connection', c, reference=True)
c = self.handles[-1].connected_to
if c:
save_func('tail_connection', c, reference=True)
save_func('tail-connection', c, reference=True)
def load (self, name, value):
if name == 'points':
@ -63,9 +63,9 @@ class DiagramLine(diacanvas.CanvasLine, DiagramItem):
self.set_property('tail_pos', points[1])
for p in points[2:]:
self.set_property ('add_point', p)
elif name == 'head_connection':
elif name in ('head_connection', 'head-connection'):
self._load_head_connection = value
elif name == 'tail_connection':
elif name in ('tail_connection', 'tail-connection'):
self._load_tail_connection = value
else:
DiagramItem.load(self, name, value)

View File

@ -53,7 +53,7 @@ class OperationItem(FeatureItem):
self.request_update()
on_subject_notify__visibility = on_subject_notify__name
on_subject_notify__taggedValue_value = on_subject_notify__name
on_subject_notify__taggedValue = on_subject_notify__name
def on_update(self, affine):
# Render the operation on every update, since we can't monitor

View File

@ -170,6 +170,7 @@ def load_elements_generator(elements, factory, gaphor_version=None):
# Fix version inconsistencies
version_0_6_2(elements, factory, gaphor_version)
version_0_7_2(elements, factory, gaphor_version)
# First create elements and canvas items in the factory
# The elements are stored as attribute 'element' on the parser objects:
@ -315,6 +316,34 @@ def load_generator(filename, factory=None):
raise
def version_0_7_2(elements, factory, gaphor_version):
"""Before 0.7.2, only Property and Parameter elements had taggedValues.
Since 0.7.2 all NamedElements are able to have taggedValues. However,
the multiplicity of taggedValue has changed from 0..1 to *, so all elements
should be converted to a list.
"""
from gaphor.misc.uniqueid import generate_id
if tuple(map(int, gaphor_version.split('.'))) < (0, 7, 2):
for elem in elements.values():
try:
if type(elem) is parser.element \
and elem.type in ('Property', 'Parameter') \
and elem.taggedValue:
tvlist = []
tv = elements[elem.taggedValue]
if tv.value:
for t in map(str.strip, str(tv.value).split(',')):
log.debug("Tagged value: %s" % t)
newtv = parser.element(generate_id(),
'LiteralSpecification')
newtv.values['value'] = t
elements[newtv.id] = newtv
tvlist.append(newtv.id)
elem.references['taggedValue'] = tvlist
except Exception, e:
log.error('Error while updating taggedValues', e)
def version_0_7_1(elements, factory, gaphor_version):
"""Before version 0.7.1, there were two states for association

View File

@ -12,12 +12,12 @@ rem set GAPHOR_WIN32_LIBS=c:\msys\1.0\target
rem Where is Python installed?
set PYTHONHOME=c:\Python23
set PYTHONHOME=c:\Python24
rem Should have to change these:
set PATH=%GAPHOR_WIN32_LIBS%\bin;%PYTHONHOME%;%PATH%
set PYTHONPATH=%GAPHOR_WIN32_LIBS%\lib\python23
set PYTHONPATH=%GAPHOR_WIN32_LIBS%\lib\python24
python setup.py run %1 %2 %3 %4

View File

@ -8,7 +8,7 @@
MAJOR_VERSION = 0
MINOR_VERSION = 7
MICRO_VERSION = 1
MICRO_VERSION = 2
VERSION = '%d.%d.%d' % ( MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION )

View File

@ -166,13 +166,12 @@ class Writer:
derived = int(head.isDerived or 0)
#lower, upper, subsets, redefines = parse_association_multiplicity(head.lowerValue)
#print head.id, head.lowerValue
upper = head.upperValue and head.upperValue.value or '*'
lower = head.lowerValue and head.lowerValue.value or upper
if lower == '*':
lower = 0
subsets, redefines = parse_association_tags(head.taggedValue and head.taggedValue.value or '')
subsets, redefines = parse_association_tags(head.taggedValue)
# Add the values found. These are used later to generate derived unions.
head.derived = derived
@ -252,53 +251,26 @@ def parse_association_name(name):
name = name[1:]
return derived, name
def parse_association_multiplicity(mult):
subsets = []
redefines = None
tag = None
if '{' in mult:
# we have tagged values
mult, tag = map(string.strip, mult.split('{'))
if tag[-1] == '}':
tag = tag[:-1]
else:
mult = mult.strip()
mult = mult.split('.')
lower = mult[0]
upper = mult[-1]
if lower == '*':
lower = 0
#if upper == '*':
# upper = "'*'"
if tag and tag.find('subsets') != -1:
# find the text after 'subsets':
subsets = tag[tag.find('subsets') + len('subsets'):]
# remove all whitespaces and stuff
subsets = subsets.replace(' ', '').replace('\n', '').replace('\r', '')
subsets = subsets.split(',')
if tag and tag.find('redefines') != -1:
# find the text after 'redefines':
redefines = tag[tag.find('redefines') + len('redefines'):]
# remove all whitespaces and stuff
redefines = redefines.replace(' ', '').replace('\n', '').replace('\r', '')
l = redefines.split(',')
assert len(l) == 1
redefines = l[0]
return lower, upper, subsets, redefines
def parse_association_tags(tag):
subsets = []
redefines = None
# subsets has a comma separated syntax. Add all taggedValues together
if type(tag) is type([]):
tag = ', '.join(filter(None, map(getattr, tag, ['value'] * len(tag))))
elif tag:
tag = tag.value
print 'scanning tags: %s' % tag
if tag and tag.find('subsets') != -1:
# find the text after 'subsets':
subsets = tag[tag.find('subsets') + len('subsets'):]
# remove all whitespaces and stuff
subsets = subsets.replace(' ', '').replace('\n', '').replace('\r', '')
subsets = subsets.split(',')
if tag and tag.find('redefines') != -1:
# find the text after 'redefines':
redefines = tag[tag.find('redefines') + len('redefines'):]
@ -308,6 +280,7 @@ def parse_association_tags(tag):
assert len(l) == 1
redefines = l[0]
print 'found', subsets, redefines
return subsets, redefines
def generate(filename, outfile=None, overridesfile=None):