modeling-cvs Mailing List for Object-Relational Bridge for python (Page 4)
Status: Abandoned
Brought to you by:
sbigaret
You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
(54) |
Apr
(29) |
May
(94) |
Jun
(47) |
Jul
(156) |
Aug
(132) |
Sep
(40) |
Oct
(6) |
Nov
(18) |
Dec
(24) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(18) |
Feb
(59) |
Mar
(7) |
Apr
|
May
(8) |
Jun
(2) |
Jul
(12) |
Aug
(15) |
Sep
(12) |
Oct
(6) |
Nov
(25) |
Dec
(1) |
2005 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2006 |
Jan
|
Feb
(27) |
Mar
|
Apr
(16) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Sebastien B. <sbi...@us...> - 2004-10-18 20:31:54
|
Update of /cvsroot/modeling/ProjectModeling/Modeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25165/Modeling Modified Files: ModelValidation.py Log Message: Applied a patch contributed by Lorenzo Gil Sanchez, fixing a bug where a valid model could be rejected by mdl_generate_DB_schema.py cf. https://sf.net/mailarchive/forum.php?thread_id=5660203&forum_id=10674 Index: ModelValidation.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/ModelValidation.py,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** ModelValidation.py 20 Jul 2004 06:21:37 -0000 1.12 --- ModelValidation.py 18 Oct 2004 20:31:45 -0000 1.13 *************** *** 124,133 **** errors=errorsDict ! def has_errors(for_level=None): """ """ if not for_level: return not not self._dict ! if level in self._ignored_levels: return 0 for object in self._dict.keys(): --- 124,133 ---- errors=errorsDict ! def has_errors(self, for_level=None): """ """ if not for_level: return not not self._dict ! if for_level in self._ignored_levels: return 0 for object in self._dict.keys(): |
From: Sebastien B. <sbi...@us...> - 2004-10-18 20:31:53
|
Update of /cvsroot/modeling/ProjectModeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25165 Modified Files: CHANGES Log Message: Applied a patch contributed by Lorenzo Gil Sanchez, fixing a bug where a valid model could be rejected by mdl_generate_DB_schema.py cf. https://sf.net/mailarchive/forum.php?thread_id=5660203&forum_id=10674 Index: CHANGES =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/CHANGES,v retrieving revision 1.56 retrieving revision 1.57 diff -C2 -d -r1.56 -r1.57 *** CHANGES 22 Sep 2004 18:56:31 -0000 1.56 --- CHANGES 18 Oct 2004 20:31:44 -0000 1.57 *************** *** 10,13 **** --- 10,18 ---- * Now distributed under a 3-clause BSD-style license, see LICENSE for details + * Applied a patch contributed by Lorenzo Gil Sanchez, fixing a bug where a + valid model could be rejected by mdl_generate_DB_schema.py + cf. https://sf.net/mailarchive/forum.php?thread_id=5660203&forum_id=10674 + Thanks! + * Fixed bug #994403: both scripts mdl_generate_DB_schema.py and mdl_generate_python_code.py now abort when the model contains errors, |
From: Sebastien B. <sbi...@us...> - 2004-09-22 18:56:41
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/scripts In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7381/Modeling/scripts Modified Files: mdl_generate_DB_schema.py mdl_generate_python_code.py Log Message: Fixed bug #994403: both scripts mdl_generate_DB_schema.py and mdl_generate_python_code.py now abort when the model contains errors, unless option '-f-'/'--force' is set. Index: mdl_generate_python_code.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/scripts/mdl_generate_python_code.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** mdl_generate_python_code.py 20 Jul 2004 06:21:56 -0000 1.8 --- mdl_generate_python_code.py 22 Sep 2004 18:56:31 -0000 1.9 *************** *** 101,105 **** -q --quiet quiet mode -v --verbose verbose mode (default) ! Generation options: ------------------- --- 101,108 ---- -q --quiet quiet mode -v --verbose verbose mode (default) ! -f --force By default, the script stops if the model has errors. ! Setting this flag makes the script ignores the errors: use ! at your own risks and expect errors to happen! ! Generation options: ------------------- *************** *** 136,142 **** me=args[0] try: options, args = getopt.getopt(sys.argv[1:], ! 'BCg:hnqv', ["help", "quiet", "verbose", ! "generation_scheme=", "compact-generation-scheme", "base-generation-scheme", --- 139,145 ---- me=args[0] try: options, args = getopt.getopt(sys.argv[1:], ! 'BCfg:hnqv', ["help", "quiet", "verbose", ! "force", "generation_scheme=", "compact-generation-scheme", "base-generation-scheme", *************** *** 145,149 **** global verbose generation_scheme='compact' ! fake_mode=0 for k, v in options: if k in ('-h', '--help'): usage(me); return 0 --- 148,152 ---- global verbose generation_scheme='compact' ! fake_mode=force_flag=0 for k, v in options: if k in ('-h', '--help'): usage(me); return 0 *************** *** 153,156 **** --- 156,160 ---- if k in ('-B', '--base-generation-scheme'): generation_scheme='base'; continue if k in ('-n', '--dry-run'): fake_mode=1; continue + if k in ('-f', '--force'): force_flag=1; continue if len(args) not in (1,2): usage(me) ; return 1 *************** *** 170,173 **** --- 174,191 ---- return 1 + from Modeling import ModelValidation as MV + from Modeling.ModelValidation import NOT_SUPPORTED,ERROR,WARNING,INFO,DEBUG + errors=MV.ModelValidationException(ignore_levels=[DEBUG,INFO,WARNING]) + MV.validateModel(model, errors) + if errors: + log("Error: model has errors") + if verbose: log(str(errors)) + else: log("(-v for details)") + if not force_flag: + log("Aborting") + return 2 + else: + log("Option --force set, continuing anyway...\n") + try: build_python_code(model, generation_scheme, rootPath, verbose_mode=verbose, Index: mdl_generate_DB_schema.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/scripts/mdl_generate_DB_schema.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** mdl_generate_DB_schema.py 20 Jul 2004 06:21:56 -0000 1.11 --- mdl_generate_DB_schema.py 22 Sep 2004 18:56:31 -0000 1.12 *************** *** 118,123 **** -v --verbose verbose mode -h --help gives this help ! -i --ignore-errors ignore errors (default is halt on error) ! Commands for DB-schema generation --------------------------------- --- 118,127 ---- -v --verbose verbose mode -h --help gives this help ! -i --ignore-errors ignore database errors (default is halt on error) ! ! -f --force By default, the script stops if the model has errors. ! Setting this flag makes the script ignores the errors: ! use at your own risks and expect errors to happen! ! Commands for DB-schema generation --------------------------------- *************** *** 238,241 **** --- 242,246 ---- should_have_admin_dict=0 # set for options: -A, -C, -R, -D and -d end_with_str=';' + force_flag=0 for k, v in options: if k in ('-h', '--help'): usage(me); return 0 *************** *** 244,247 **** --- 249,253 ---- if k in ('-i', '--ignore-errors'): continue_on_errors=1; continue if k in ('-e', '--end-with'): end_with_str=v; continue + if k in ('-f', '--force'): force_flag=1; continue if k in ('-A', '--all-but-database'): *************** *** 342,345 **** --- 348,367 ---- raise ValueError, "Database name in the dsn (%s) and in the admin-dsn (%s) should be the same for SQLite"%(dsn_db_name, admin_dsn_db_name) + from Modeling import ModelValidation as MV + from Modeling.ModelValidation import DEBUG,INFO,WARNING + errors=MV.ModelValidationException(ignore_levels=[DEBUG,INFO,WARNING]) + MV.validateModel(model, errors) + if errors: + _model_err_log=force_flag and log or err + if verbose: + _model_err_log("Error: model has errors:\n"+str(errors)) + else: _model_err_log("Error: model has errors (-v for details)") + + if not force_flag: + err("Aborting") + return 4 + else: + log("Option --force set, continuing anyway...\n") + result=databaseSchemaWithOptions(model, _defaultOptions, administrativeConnectionDictionary=admin_connection_dict, |
From: Sebastien B. <sbi...@us...> - 2004-09-22 18:56:40
|
Update of /cvsroot/modeling/ProjectModeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7381 Modified Files: CHANGES Log Message: Fixed bug #994403: both scripts mdl_generate_DB_schema.py and mdl_generate_python_code.py now abort when the model contains errors, unless option '-f-'/'--force' is set. Index: CHANGES =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/CHANGES,v retrieving revision 1.55 retrieving revision 1.56 diff -C2 -d -r1.55 -r1.56 *** CHANGES 21 Sep 2004 18:03:27 -0000 1.55 --- CHANGES 22 Sep 2004 18:56:31 -0000 1.56 *************** *** 10,13 **** --- 10,17 ---- * Now distributed under a 3-clause BSD-style license, see LICENSE for details + * Fixed bug #994403: both scripts mdl_generate_DB_schema.py and + mdl_generate_python_code.py now abort when the model contains errors, + unless option '-f-'/'--force' is set. + * Fixed bug #916019: FetchSpecification did not detect when an entity has no ClassDescription (usually meaning either a typo or a model not loaded |
From: Sebastien B. <sbi...@us...> - 2004-09-21 19:18:27
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/tests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1413 Modified Files: test_SQLExpression.py Log Message: misc. fixed an incorrect qualifier string Index: test_SQLExpression.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/tests/test_SQLExpression.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** test_SQLExpression.py 2 Aug 2004 20:12:26 -0000 1.11 --- test_SQLExpression.py 21 Sep 2004 19:18:17 -0000 1.12 *************** *** 161,165 **** # None/NULL value sqlExpr=SQLExpression(book) ! q=qualifierWithQualifierFormat('author.pygmalion.books.price == None"') fs=FetchSpecification.FetchSpecification('Book', qualifier=q) --- 161,165 ---- # None/NULL value sqlExpr=SQLExpression(book) ! q=qualifierWithQualifierFormat('author.pygmalion.books.price == None') fs=FetchSpecification.FetchSpecification('Book', qualifier=q) |
From: Sebastien B. <sbi...@us...> - 2004-09-21 18:49:20
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/tests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26208 Modified Files: test_EditingContext_Global.py Log Message: misc. fixed an incorrect qualifier string Index: test_EditingContext_Global.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/tests/test_EditingContext_Global.py,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** test_EditingContext_Global.py 20 Jul 2004 06:21:57 -0000 1.51 --- test_EditingContext_Global.py 21 Sep 2004 18:49:10 -0000 1.52 *************** *** 792,796 **** "[EditingContext] objectsWithFetchSpec. & NULL value" ## Note: this used to fail w/ MySQL, cf bug #614261 ! q=qualifierWithQualifierFormat('author.pygmalion.books.price == NULL"') fs=FetchSpecification('Book', qualifier=q) ec=EditingContext() --- 792,796 ---- "[EditingContext] objectsWithFetchSpec. & NULL value" ## Note: this used to fail w/ MySQL, cf bug #614261 ! q=qualifierWithQualifierFormat('author.pygmalion.books.price == NULL') fs=FetchSpecification('Book', qualifier=q) ec=EditingContext() |
From: Sebastien B. <sbi...@us...> - 2004-09-21 18:03:38
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/tests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15040/Modeling/tests Modified Files: run.py Added Files: test_FetchSpecification.py Log Message: Fixed bug #916019: FetchSpecification did not detect when an entity has no ClassDescription (usually meaning either a typo or a model not loaded yet), but assumed that one exists in setQualifier() --leading to an error in Qualifier.validateKeysWithRootClassDescription() that was not informative at all for the developer. Index: run.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/tests/run.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** run.py 2 Aug 2004 20:54:47 -0000 1.11 --- run.py 21 Sep 2004 18:03:27 -0000 1.12 *************** *** 45,48 **** --- 45,49 ---- import test_Validation import test_Qualifier + import test_FetchSpecification import test_SortOrderings import test_ObserverCenter --- NEW FILE: test_FetchSpecification.py --- #! /usr/bin/env python # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python # # Copyright (c) 2001-2004 Sébastien Bigaret <sbi...@us...> # All rights reserved. # # This file is part of the Modeling Framework. # # This code is distributed under a "3-clause BSD"-style license; # see the LICENSE file for details. #----------------------------------------------------------------------------- """ Tests for FetchSpecification """ import unittest if __name__ == "__main__": import utils, sys utils.fixpath() from Modeling.FetchSpecification import FetchSpecification class TestFetchSpecification(unittest.TestCase): """ Tests for FetchSpecification """ def test_01_detect_when_no_such_entity_is_loaded(self): "[FetchSpecification] detects when the corresponding entity is not loaded" # bug #916019 self.assertRaises(ValueError, FetchSpecification,'unknown') def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestFetchSpecification, "test_")) return suite if __name__ == "__main__": errs = utils.run_suite(test_suite()) sys.exit(errs and 1 or 0) |
From: Sebastien B. <sbi...@us...> - 2004-09-21 18:03:38
|
Update of /cvsroot/modeling/ProjectModeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15040 Modified Files: CHANGES Log Message: Fixed bug #916019: FetchSpecification did not detect when an entity has no ClassDescription (usually meaning either a typo or a model not loaded yet), but assumed that one exists in setQualifier() --leading to an error in Qualifier.validateKeysWithRootClassDescription() that was not informative at all for the developer. Index: CHANGES =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/CHANGES,v retrieving revision 1.54 retrieving revision 1.55 diff -C2 -d -r1.54 -r1.55 *** CHANGES 21 Sep 2004 17:12:02 -0000 1.54 --- CHANGES 21 Sep 2004 18:03:27 -0000 1.55 *************** *** 10,13 **** --- 10,19 ---- * Now distributed under a 3-clause BSD-style license, see LICENSE for details + * Fixed bug #916019: FetchSpecification did not detect when an entity has no + ClassDescription (usually meaning either a typo or a model not loaded + yet), but assumed that one exists in setQualifier() --leading to an error + in Qualifier.validateKeysWithRootClassDescription() that was not + informative at all for the developer. + * Fixed bug #813586: Attribute's field 'usedForLocking' is not documented |
From: Sebastien B. <sbi...@us...> - 2004-09-21 18:03:38
|
Update of /cvsroot/modeling/ProjectModeling/Modeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15040/Modeling Modified Files: FetchSpecification.py Log Message: Fixed bug #916019: FetchSpecification did not detect when an entity has no ClassDescription (usually meaning either a typo or a model not loaded yet), but assumed that one exists in setQualifier() --leading to an error in Qualifier.validateKeysWithRootClassDescription() that was not informative at all for the developer. Index: FetchSpecification.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/FetchSpecification.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** FetchSpecification.py 20 Jul 2004 06:21:37 -0000 1.7 --- FetchSpecification.py 21 Sep 2004 18:03:27 -0000 1.8 *************** *** 37,43 **** def __init__(self, entityName, qualifier=None, sortOrderings=(), distinctFlag=0, deepFlag=0, hints={}): ! "Initializes the FetchSpecification" if not entityName: raise ValueError, 'entityName should be supplied' self._entityName=entityName self.setQualifier(qualifier) --- 37,55 ---- def __init__(self, entityName, qualifier=None, sortOrderings=(), distinctFlag=0, deepFlag=0, hints={}): ! """ ! Initializes the FetchSpecification ! ! :raises ValueError: if no class description can be found for the supplied ! entityName. In most cases, if not all, this means either that there is a ! typo. in entityName, or that the corresponding model has not been ! properly loaded. ! ! """ if not entityName: raise ValueError, 'entityName should be supplied' + cd=classDescriptionForName(entityName) + if not cd: + raise ValueError, 'Unable to find a ClassDescription for entityName: %s. Is the corresponding model loaded?'%entityName + self._entityName=entityName self.setQualifier(qualifier) |
From: Sebastien B. <sbi...@us...> - 2004-09-21 17:12:19
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/doc/UserGuide In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4171/Modeling/doc/UserGuide Modified Files: DefiningaModel.tex Log Message: Fixed ticket #813586: Attribute's field 'usedForLocking' is not documented + portions of the introduction has been rewritten Index: DefiningaModel.tex =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/doc/UserGuide/DefiningaModel.tex,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** DefiningaModel.tex 31 Aug 2003 17:47:28 -0000 1.39 --- DefiningaModel.tex 21 Sep 2004 17:12:09 -0000 1.40 *************** *** 13,21 **** XML. Both ways are detailed in this chapter. ! The next section reviews the main concepts of Entity-Relationship Modelling, ! then each element in a model are examined in details. ! The rest of the chapter is dedicated to how such models map onto ! the python description, or PyModel, and the XML description. Some included tools may help you with the design and management of your --- 13,30 ---- XML. Both ways are detailed in this chapter. ! The next section presents the sample models used in this manual. ! Section~\ref{model-concepts} then reviews the main concepts of ! Entity-Relationship Modelling, then each element in a model are examined in ! details. ! The two sections coming after describe how such models map onto, respectively, ! the python description, or PyModel (sect.~\ref{pymodel}), and the XML ! description (sect.~\ref{model-xml-format}). ! ! Section~\ref{guidelines-gotchas} gives some answers to common design-related ! questions. ! ! Last, section~\ref{model-design-tools} presents the tools that help you design ! and verify the models, and derive from them db-schema and python code. Some included tools may help you with the design and management of your *************** *** 448,451 **** --- 457,470 ---- \item[\code{comment}:] a comment, for maintainers of the model. + \item[\code{usedForLocking}:] Unused yet, reserved field. + + This flag will be used when optimistic locking is implemented. It will + indicate which attributes optimistic locking should check when it is about + to save changes: if value for attribute \code{lastname} has changed and + \code{usedForLocking} is set for that attribute, then under the optimistic + locking policy saveChanges() will raise; if the flag is unset, the attribute + will be silently overriden (for example, you probably won't mark an object's + timestamp as used for locking). + \subsubsection{Primary keys\label{attributes-PKs-props}} |
From: Sebastien B. <sbi...@us...> - 2004-09-21 17:12:19
|
Update of /cvsroot/modeling/ProjectModeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4171 Modified Files: CHANGES Log Message: Fixed ticket #813586: Attribute's field 'usedForLocking' is not documented + portions of the introduction has been rewritten Index: CHANGES =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/CHANGES,v retrieving revision 1.53 retrieving revision 1.54 diff -C2 -d -r1.53 -r1.54 *** CHANGES 6 Sep 2004 19:05:43 -0000 1.53 --- CHANGES 21 Sep 2004 17:12:02 -0000 1.54 *************** *** 10,13 **** --- 10,15 ---- * Now distributed under a 3-clause BSD-style license, see LICENSE for details + * Fixed bug #813586: Attribute's field 'usedForLocking' is not documented + * Fixed bug #1023234: PyModel fails to validate to-many relationships in associations where the upper bound is a finite number (for example: 2) |
From: Sebastien B. <sbi...@us...> - 2004-09-06 19:05:55
|
Update of /cvsroot/modeling/ProjectModeling/Modeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28028/Modeling Modified Files: PyModel.py Log Message: Fixed bug #1023234: PyModel fails to validate to-many relationships in associations where the upper bound is a finite number Index: PyModel.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/PyModel.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** PyModel.py 20 Jul 2004 06:21:37 -0000 1.9 --- PyModel.py 6 Sep 2004 19:05:44 -0000 1.10 *************** *** 844,848 **** if sd_mult[1]>1: raise ValueError, 'invalid multiplicity src->dst: should be toOne' ! if not (ds_mult[1] in (None, '*', -1) or ds_mult[0]>1): raise ValueError, 'invalid multiplicity dst->src: should be toMany' return sd_mult, ds_mult --- 844,848 ---- if sd_mult[1]>1: raise ValueError, 'invalid multiplicity src->dst: should be toOne' ! if not (ds_mult[1] in (None, '*', -1) or ds_mult[1]>1): raise ValueError, 'invalid multiplicity dst->src: should be toMany' return sd_mult, ds_mult |
From: Sebastien B. <sbi...@us...> - 2004-09-06 19:05:55
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/tests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28028/Modeling/tests Modified Files: test_PyModel.py Log Message: Fixed bug #1023234: PyModel fails to validate to-many relationships in associations where the upper bound is a finite number Index: test_PyModel.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/tests/test_PyModel.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** test_PyModel.py 20 Jul 2004 06:21:57 -0000 1.8 --- test_PyModel.py 6 Sep 2004 19:05:44 -0000 1.9 *************** *** 478,481 **** --- 478,492 ---- self.failUnless(model.is_built) self.assertRaises(RuntimeError, model.build) + + def test_10_bound_relationships(self): + "[PyModel] bug #1023234-relationships with an finite upper bound" + model = self.model + model.entities = [ + Entity('Employee'), Entity('Store'), + ] + model.associations = [ Association('Employee', 'Store', + multiplicity = [ [0,1], [0,2] ] ) + ] + model.build() def test_suite(): |
From: Sebastien B. <sbi...@us...> - 2004-09-06 19:05:55
|
Update of /cvsroot/modeling/ProjectModeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28028 Modified Files: CHANGES Log Message: Fixed bug #1023234: PyModel fails to validate to-many relationships in associations where the upper bound is a finite number Index: CHANGES =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/CHANGES,v retrieving revision 1.52 retrieving revision 1.53 diff -C2 -d -r1.52 -r1.53 *** CHANGES 20 Jul 2004 06:21:36 -0000 1.52 --- CHANGES 6 Sep 2004 19:05:43 -0000 1.53 *************** *** 10,13 **** --- 10,16 ---- * Now distributed under a 3-clause BSD-style license, see LICENSE for details + * Fixed bug #1023234: PyModel fails to validate to-many relationships in + associations where the upper bound is a finite number (for example: 2) + * Fixed bug #938096: QualifierParser fails when an attribute's name begins w/ a keyword, such as AND, OR (e.g. attribute 'origin'), etc. |
From: Sebastien B. <sbi...@us...> - 2004-08-06 23:11:22
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/doc/UserGuide In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1366/Modeling/doc/UserGuide Modified Files: EnvironmentVariables.tex Log Message: Fixed the paragraph about MDL_TRANSIENT_DB_CONNECTION that was not updated after MDL_PERMANENT_DB_CONNECTION has been deprecated and replaced by MDL_TRANSIENT_DB_CONNECTION which has the inevrse semantics! Index: EnvironmentVariables.tex =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/doc/UserGuide/EnvironmentVariables.tex,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** EnvironmentVariables.tex 28 Jan 2004 14:54:09 -0000 1.13 --- EnvironmentVariables.tex 6 Aug 2004 23:11:13 -0000 1.14 *************** *** 91,100 **** \hline \lineiii{MDL_TRANSIENT_DB_CONNECTION}{}{} ! \lineiii{}{By default, the database connection is closed each time the last ! opened AdaptorChannel is closed ; for example, after ! \code{ec.objectsWithFetchSpecification()}, ! \code{ec.objectsCountWithFetchSpecification}, \code{ec.saveChanges()}. ! When this environment variable is set to any true value, the same database ! connection is re-used for subsequent requests.\newline %~\newline %{\bf Important:} If you are running the framework in a multi-threaded --- 91,101 ---- \hline \lineiii{MDL_TRANSIENT_DB_CONNECTION}{}{} ! \lineiii{}{By default, a database connection is left opened after each ! request, so that it can be re-used for subsequent requests. When this ! environment variable is set to any true value, any opened database connection ! is closed after it's been used --for example, the database connections needed ! to perform the actions defined in \code{ec.objectsWithFetchSpecification()}, ! \code{ec.objectsCountWithFetchSpecification} or \code{ec.saveChanges()} are ! closed as soon before these functions return.\newline %~\newline %{\bf Important:} If you are running the framework in a multi-threaded |
From: Sebastien B. <sbi...@us...> - 2004-08-02 20:54:57
|
Update of /cvsroot/modeling/ProjectModeling/Modeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1181/Modeling Modified Files: ChangeLog delegation.py Log Message: * delegation.py: private methods and fields now begins w/ a simple underscore, not two of them (+doc. updated) * tests/test_delegation.py: added Index: delegation.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/delegation.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** delegation.py 14 Feb 2004 18:27:04 -0000 1.4 --- delegation.py 2 Aug 2004 20:54:47 -0000 1.5 *************** *** 1,93 **** # -*- coding: iso-8859-1 -*- ! """ ! delegation module ! The underlying philosophy ! ! Suppose you are about to develop a reusable component offering a secure ! login service. This component might need two different sorts of features: ! say, a mandatory procedure to check login and password, and some optional ! others, e.g. a special procedure to be called when the maximal number of ! login attempts is reached. Your component implements a default procedure ! to check credentials against, say, the '/etc/password' file, and does not ! have any limit on the number of retries after failure. ! However and since this is a reusable component you wish that the procedure ! that checks credentials, the maximum number of failures and the action to ! be taken can be conveniently changed at runtime. ! One approach consists in making these parameters settable in your ! component ; this will work well, but this may not be really convenient: ! - for you, as the developper of the reusable component, because this ! make the API of the component all the more cumbersome since the number ! of possible external ``tune-ups'' grows ! - for the users of your component, for which it may be handier to be ! able to provide a single object gathering its own mechanisms to tune ! the reusable component [1]. A good reason for this is when the some ! processings involved depends on some other objects the reusable ! component has no way to know about, and/or if answers to some questions ! cannot be determined but at runtime. ! The delegation offers you a general mechanism to solve these two issues. ! The DelegateWrapper class allows the following features: ! - it makes it simple to have a single place to specify and document what ! can be changed along with specific documentation: this is the ! delegate's interface. ! - The users of your component do not have to implement *all* ! methods of the delegate's API, they only provide whatever methods is ! adequate for their own use [2]. ! - It can also be used to notify a delegate when some actions are about ! to be done, have been processed, etc., thus making it possible to ! keep an external object in sync. with the reusable component's ! internal state, without violating encapsulation. ! ..[1] of course, you may run into cases where such a design is inaccurate. ! All this is obviously a general discussion which might be inadequate ! given a specific architecture or design philosophy! ! ..[2] except if you enforce your own rules, such as ``if the delegates ! provides methodOne it should provide methodTwo as well'', but this an ! other story (see DelegateWrapper.respondsTo()) ! How to use ! We will stick on the example exposed above to explain how delegation is ! achieved with this module. ! First, define a general ``interface'': a class, which defines and ! documents the methods a delegate for your component might implement:: ! class LoginComponentDelegate: ! 'Delegate for the reusable LoginComponent' ! def checkCredentials(self, login, password): ! ''' ! Implement this method if you want to replace the default checking ! mechanism by yours. This method should raise InvalidCredentials ! if parameters 'login' and 'password' do not match an valid user. ! Parameters: both 'login' and 'password' are strings. ! ''' ! def maximumNumberOfFailures(self): ! ''' ! Implement this method to ... ! A return value equal to '-1' means no limit. ! ''' ! def numberOfFailuresHasReachedItsMaximum(self): ! ''' ! ... ! ''' ! The 'delegation' module supplies one class, 'DelegateWrapper', to handle ! delegate. Its role is to inspect a delegate's interface... ! To use it, your reusable component's class will look like:: class LoginComponent: --- 1,98 ---- # -*- coding: iso-8859-1 -*- ! """delegation module. ! The underlying philosophy ! ------------------------- ! Suppose you are about to develop a reusable component offering a secure ! login service. This component might need two different sorts of features: ! say, a mandatory procedure to check login and password, and some optional ! others, e.g. a special procedure to be called when the maximal number of ! login attempts is reached. Your component implements a default procedure ! to check credentials against, say, the ``/etc/password`` file, and does not ! have any limit on the number of retries after failure. ! However and since this is a reusable component you wish that the procedure ! that checks credentials, the maximum number of failures and the action to ! be taken can be conveniently changed at runtime. ! One approach consists in making these parameters settable in your ! component ; this will work well, but this may not be really convenient: ! - for you, as the developper of the reusable component, because this ! make the API of the component all the more cumbersome since the number ! of possible external "tune-ups" grows ! - for the users of your component, for which it may be handier to be ! able to provide a single object gathering its own mechanisms to tune ! the reusable component [1]_. A good reason for this is when the some ! processings involved depends on some other objects the reusable ! component has no way to know about, and/or if answers to some questions ! cannot be determined but at runtime. ! The delegation offers you a general mechanism to solve these two issues. ! The DelegateWrapper class allows the following features: ! - it makes it simple to have a single place to specify and document what ! can be changed along with specific documentation: this is the ! delegate's interface. ! - The users of your component do not have to implement *all* ! methods of the delegate's API, they only provide whatever methods is ! adequate for their own use [2]_. ! - It can also be used to notify a delegate when some actions are about ! to be done, have been processed, etc., thus making it possible to ! keep an external object in sync. with the reusable component's ! internal state, without violating encapsulation. ! .. [1] of course, you may run into cases where such a design is inaccurate. ! All this is obviously a general discussion which might be inadequate given ! a specific architecture or design philosophy! ! ! .. [2] except if you enforce your own rules, such as "if the delegates ! provides methodOne it should provide methodTwo as well", but this an other ! story (see DelegateWrapper.respondsTo()) ! How to use ! ---------- ! We will stick on the example exposed above to explain how delegation is ! achieved with this module. ! First, define a general "interface": a class, which defines and ! documents the methods a delegate for your component might implement: ! .. code-block:: Python ! class LoginComponentDelegate: ! 'Delegate for the reusable LoginComponent' ! def checkCredentials(self, login, password): ! ''' ! Implement this method if you want to replace the default checking ! mechanism by yours. This method should raise InvalidCredentials ! if parameters 'login' and 'password' do not match an valid user. ! Parameters: both 'login' and 'password' are strings. ! ''' ! def maximumNumberOfFailures(self): ! ''' ! Implement this method to ... ! A return value equal to '-1' means no limit. ! ''' ! def numberOfFailuresHasReachedItsMaximum(self): ! ''' ! ... ! ''' ! The `delegation` module supplies one class, `DelegateWrapper`, to handle ! delegate. Its role is to inspect a delegate's interface... ! ! To use it, your reusable component's class will look like: ! ! .. code-block:: Python class LoginComponent: *************** *** 131,234 **** [...] ! The delegate itself, as it will be provided by the users of the reusable ! component, can be an instance of any class. You should have noticed in the ! sample code above that the DelegateWrapper acts as a proxy : it ! automatically forwards any function call it cannot service (see Gotchas, ! below) to the wrapped object --the real delegate). Note, however, that the ! DelegateWrapper is **not** an ``absolute'' proxy: the forwarded messages ! are __only__ those which are declared in the delegate's interface. ! Gotchas ! There are several points which you should be aware of when using this ! class, some of which should be indicated in your own documentation: ! - the DelegateWrapper works by inspecting the interface-class and ! registering the signatures of its methods. By signature we mean: name, ! parameters *and* their default values, if any. These signatures are then ! compared to those of the delegate object when it is supplied. Thus: ! - if a delegate object does implement a function whose name matches ! one of the delegate's API but which uses different number of ! parameters, the same number of parameter with different names, or ! the same number of parameters and the same names but with different ! default values, this function will not be considered as an valid ! delegate method (hence 'respondsTo(thatMethodName)' will be false). ! - The DelegateWrapper determines the mapping between the delegate's ! API and the delegate object when this object is supplied ! ('setDelegateObject()') ; this mapping determines the answer for ! message 'respondsTo' as well as whether that message should be ! forwarded to the delegate by the DelegateWrapper. ! Thus, if the delegate object can change at runtime, e.g. not ! responding to a message at some point of runtime and being able to ! service the same message later, that message will never be ! considered available. In that case, the provider for the delegate ! object should take care to call the component's 'setDelegate()' ! method each time the delegate object changes --this ensures that the ! mapping between the delegate's API and the object's capabilities is ! correctly recomputed. ! - The DelegateWrapper itself declares some methods: 'respondsTo', ! 'delegateObject', 'setDelegateObject', 'reevaluateDelegateObject'. If ! the delegate's interface uses at least one of these methods, the ! automatic forwarding of method calls is automatically disabled. In that ! case, a warnings is issued (warning level: RuntimeWarning) when the ! delegate object is set. You can still send messages to the delegate ! object by sending the messages to the ! 'DelegateWrapper.delegateObject()'. ! CVS information ! ! $Id$ ! ! Licence:: ! This software is Copyright (c) 2001, 2002 inQual S.A.S. and ! Contributors. ! All rights reserved. Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions ! are met: ! ! 1. Redistributions in source code must retain the above copyright ! notice, this list of conditions, and the following disclaimer. ! ! 2. Redistributions in binary form must reproduce the above copyright ! notice, this list of conditions, and the following disclaimer in ! the documentation and/or other materials provided with the ! distribution. ! ! 3. Neither the name of the inQual S.A.S. nor the names of its ! contributors may be used to endorse or promote products derived ! from this software without specific prior written permission. ! ! 4. If any files are modified, you must cause the modified files to ! carry prominent notices stating that you changed the files and ! the date of any change. ! Disclaimer ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND ! CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, ! INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ! DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS ! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ! TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ! ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR ! TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF ! THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! SUCH DAMAGE. """ ! __version__='Revision: 1.3 '[10:] # original revision ! __authors__=('Sebastien Bigaret <Seb...@in...>', ) from warnings import warn --- 136,235 ---- [...] ! The delegate itself, as it will be provided by the users of the reusable ! component, can be an instance of any class. You should have noticed in the ! sample code above that the `DelegateWrapper` acts as a proxy : it ! automatically forwards any function call it cannot service (see Gotchas, ! below) to the wrapped object --the real delegate). Note, however, that the ! `DelegateWrapper` is **not** an "absolute" proxy: the forwarded messages ! are __only__ those which are declared in the delegate's interface. ! Gotchas ! ------- ! There are several points which you should be aware of when using this ! class, some of which should be indicated in your own documentation: ! - the DelegateWrapper works by inspecting the interface-class and ! registering the signatures of its methods. By signature we mean: name, ! parameters *and* their default values, if any. These signatures are then ! compared to those of the delegate object when it is supplied. Thus: ! - if a delegate object does implement a function whose name matches ! one of the delegate's API but which uses different number of ! parameters, the same number of parameter with different names, or ! the same number of parameters and the same names but with different ! default values, this function will not be considered as an valid ! delegate method (hence 'respondsTo(thatMethodName)' will be false). ! - The DelegateWrapper determines the mapping between the delegate's ! API and the delegate object when this object is supplied ! ('setDelegateObject()') ; this mapping determines the answer for ! message 'respondsTo' as well as whether that message should be ! forwarded to the delegate by the DelegateWrapper. ! Thus, if the delegate object can change at runtime, e.g. not ! responding to a message at some point of runtime and being able to ! service the same message later, that message will never be ! considered available. In that case, the provider for the delegate ! object should take care to call the component's 'setDelegate()' ! method each time the delegate object changes --this ensures that the ! mapping between the delegate's API and the object's capabilities is ! correctly recomputed. ! - The `DelegateWrapper` itself declares some methods: ! `DelegateWrapper.respondsTo`, `DelegateWrapper.delegateObject`, ! `DelegateWrapper.setDelegateObject`, ! `DelegateWrapper.reevaluateDelegateObject`. If the delegate's interface uses ! at least one of these methods, the automatic forwarding of method calls is ! automatically disabled. In that case, a warnings is issued (warning level: ! ``RuntimeWarning``) when the delegate object is set. You can still send ! messages to the delegate object by sending the messages to the ! `DelegateWrapper.delegateObject()`. ! Licence ! ------- ! :: ! ! Copyright (c) 2001-2004, Sebastien Bigaret All rights reserved. Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions are ! met: ! * Redistributions of source code must retain the above copyright ! notice, this list of conditions and the following disclaimer. ! ! * Redistributions in binary form must reproduce the above copyright ! notice, this list of conditions and the following disclaimer in the ! documentation and/or other materials provided with the distribution. ! ! * Neither the name of the software's copyright holder, Sebastien ! Bigaret, nor the names of its contributors may be used to endorse or ! promote products derived from this software without specific prior ! written permission. ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS ! IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ! THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + CVS information + --------------- + + $Id$ + """ ! __version__='$Revision$'[11:-3] # original revision ! __authors__=('Sebastien Bigaret <sbi...@us...>', ) from warnings import warn *************** *** 239,263 **** The DelegateWrapper: """ ! __delegate=None def __init__(self, interface, object=None): """ Initializes the DelegateWrapper ! Parameters ! ! interface -- a class object declaring the methods a delegate may choose ! to implement ! object -- optional delegate object. The delegate object can be set ! or changed later with 'setDelegateObject()' """ if not inspect.isclass(interface): raise ValueError, 'Invalid parameter interface: should be a class' ! self.__interfaceSpec={} ! self.__delegateCapabilities={} ! self.__proxyDelegate=1 ! self.__interface=interface ! self.__compileInterface() if object: self.setDelegateObject(object) --- 240,265 ---- The DelegateWrapper: """ ! _delegate=None ! def __init__(self, interface, object=None): """ Initializes the DelegateWrapper ! :Parameters: ! - `interface`: a class object declaring the methods a delegate may ! choose to implement ! - `object`: optional delegate object. The delegate object can be set or ! changed later with `setDelegateObject()` ! """ if not inspect.isclass(interface): raise ValueError, 'Invalid parameter interface: should be a class' ! self._interfaceSpec={} ! self._delegateCapabilities={} ! self._proxyDelegate=1 ! self._interface=interface ! self._compileInterface() if object: self.setDelegateObject(object) *************** *** 267,280 **** Returns the delegate object """ ! return self.__delegate def respondsTo(self, interfaceMethodName): """ Tells whether the wrapped delegate object can responds to the method ! 'methodName' as defined in the delegate's interface. ! Returned value is None for 'false', '1' (integer) for true """ ! return self.__delegateCapabilities.get(interfaceMethodName) def reevaluateDelegateObject(self): --- 269,282 ---- Returns the delegate object """ ! return self._delegate def respondsTo(self, interfaceMethodName): """ Tells whether the wrapped delegate object can responds to the method ! `interfaceMethodName` as defined in the delegate's interface. ! Returned value is ``None`` for false, ``1`` (integer) for true """ ! return self._delegateCapabilities.get(interfaceMethodName) def reevaluateDelegateObject(self): *************** *** 282,293 **** """ ! if not self.__delegate: return ! self.__delegateCapabilities={} ! functions=self.__getClassMethodsSignatures(self.__delegate.__class__) for nameSignature in functions: name, signature=nameSignature ! if signature==self.__interfaceSpec.get(name): ! self.__delegateCapabilities[name]=1 def setDelegateObject(self, object): --- 284,295 ---- """ ! if not self._delegate: return ! self._delegateCapabilities={} ! functions=self._getClassMethodsSignatures(self._delegate.__class__) for nameSignature in functions: name, signature=nameSignature ! if signature==self._interfaceSpec.get(name): ! self._delegateCapabilities[name]=1 def setDelegateObject(self, object): *************** *** 298,328 **** raise ValueError, 'Invalid parameter object: it should be an instance' ! self.__delegate=object self.reevaluateDelegateObject() def __getattr__(self, name): # proxy object's method only ! if not self.__proxyDelegate: raise AttributeError, 'Automatic forward of method calls is disabled. ' ! if self.__delegateCapabilities.get(name): ! return getattr(self.__delegate, name) raise AttributeError # Private methods ! def __compileInterface(self): """ Inspect the delegate's interface and extracts the necessary methods' names and signatures """ ! functions=self.__getClassMethodsSignatures(self.__interface) dict={} pbFuncNames=[] ! self.__proxyDelegate=1 for nameSignature in functions: name, signature=nameSignature dict[name]=signature if name in ('delegate', 'respondsTo', 'reevaluateDelegateObject', 'setDelegate'): ! self.__proxyDelegate=0 pbFuncNames.append(name) ! if not self.__proxyDelegate: warn('DelegateWrapper will not be able to proxy calls to the delegate '\ "object: the interface declares the methods %s which are also "\ --- 300,330 ---- raise ValueError, 'Invalid parameter object: it should be an instance' ! self._delegate=object self.reevaluateDelegateObject() def __getattr__(self, name): # proxy object's method only ! if not self._proxyDelegate: raise AttributeError, 'Automatic forward of method calls is disabled. ' ! if self._delegateCapabilities.get(name): ! return getattr(self._delegate, name) raise AttributeError # Private methods ! def _compileInterface(self): """ Inspect the delegate's interface and extracts the necessary methods' names and signatures """ ! functions=self._getClassMethodsSignatures(self._interface) dict={} pbFuncNames=[] ! self._proxyDelegate=1 for nameSignature in functions: name, signature=nameSignature dict[name]=signature if name in ('delegate', 'respondsTo', 'reevaluateDelegateObject', 'setDelegate'): ! self._proxyDelegate=0 pbFuncNames.append(name) ! if not self._proxyDelegate: warn('DelegateWrapper will not be able to proxy calls to the delegate '\ "object: the interface declares the methods %s which are also "\ *************** *** 330,347 **** "(see documentation for details)"%str(pbFuncNames), RuntimeWarning) ! self.__interfaceSpec=dict return ! def __getClassMethodsSignatures(self, aClass): """ Generic function returning a sequence made of couples (<functionName>, <functionSignature>), each couple representing one of ! 'aClass' 's methods. ! An example of such a couple is (from tests/test_delegation.py):: ('canTheWorldBeChanged', "(['self', 'isElvisAlive'], None, None, (1,))") ! See also: inspect.getargspec() """ isfunction=inspect.isfunction --- 332,349 ---- "(see documentation for details)"%str(pbFuncNames), RuntimeWarning) ! self._interfaceSpec=dict return ! def _getClassMethodsSignatures(self, aClass): """ Generic function returning a sequence made of couples (<functionName>, <functionSignature>), each couple representing one of ! `aClass` 's methods. ! An example of such a couple is (from ``tests/test_delegation.py``):: ('canTheWorldBeChanged', "(['self', 'isElvisAlive'], None, None, (1,))") ! See also: `inspect.getargspec()` """ isfunction=inspect.isfunction Index: ChangeLog =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/ChangeLog,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ChangeLog 2 Aug 2004 20:11:39 -0000 1.1 --- ChangeLog 2 Aug 2004 20:54:47 -0000 1.2 *************** *** 1,4 **** --- 1,8 ---- 2004-08-02 Sebastien Bigaret <sbi...@us...> + * delegation.py: private methods and fields now begins w/ a + simple underscore, not two of them (+doc. updated) + * tests/test_delegation.py: added + * DatabaseAdaptors/AbstractDBAPI2AdaptorLayer/AbstractDBAPI2AdaptorContext.py (AbstractDBAPI2AdaptorContext.__openConnectionIfNecessary__): |
From: Sebastien B. <sbi...@us...> - 2004-08-02 20:54:57
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/tests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1181/Modeling/tests Modified Files: run.py Added Files: test_delegation.py Log Message: * delegation.py: private methods and fields now begins w/ a simple underscore, not two of them (+doc. updated) * tests/test_delegation.py: added Index: run.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/tests/run.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** run.py 20 Jul 2004 06:21:57 -0000 1.10 --- run.py 2 Aug 2004 20:54:47 -0000 1.11 *************** *** 30,33 **** --- 30,35 ---- + # + import test_delegation # Modeling Layer import test_Model *************** *** 81,84 **** --- 83,87 ---- import test_CooperatingObjectStoreNeededNotification suite.addTest(test_CooperatingObjectStoreNeededNotification.test_suite()) + suite.addTest(test_delegation.test_suite()) suite.addTest(test_Model.test_suite()) suite.addTest(test_Entity.test_suite()) --- NEW FILE: test_delegation.py --- #! /usr/bin/env python # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python # # Copyright (c) 2001-2004 Sébastien Bigaret <sbi...@us...> # All rights reserved. # # This file is part of the Modeling Framework. # # This code is distributed under a "3-clause BSD"-style license; # see the LICENSE file for details. #----------------------------------------------------------------------------- """ Tests for module delegation CVS Information $Id: test_delegation.py,v 1.1 2004/08/02 20:54:47 sbigaret Exp $ """ __version__= '$Revision: 1.1 $'[11:-2] import unittest if __name__ == "__main__": import utils, sys utils.fixpath() from Modeling.delegation import DelegateWrapper # Classes for tests class DelegateInterface: """ """ def canTheWorldBeChanged(self): "Indicates whether the world can be changed" def shouldBeReset(self): "-" def willBeReset(self): "-" # def respondsTo(self): # "-" class Delegate: def __init__(self): self.resetCounter=0 def canTheWorldBeChanged(self, isElvisAlive=1): "This method does NOT conform to the DelegateInterface" return isElvisAlive and 'Ouaip' or 'Nope!' def willBeReset(self): "Side-effect: Increments self.resetCounter by one" self.resetCounter+=1 def shouldBeReset(self): "Always return true" return 1 ## Tests begin here class TestDelegate(unittest.TestCase): "Tests for module delegate" def setUp(self): "setUp" self.delegateObject=Delegate() self.delegate=DelegateWrapper(DelegateInterface, self.delegateObject) def test_01_respondsTo(self): "[delegate] respondsTo" self.failUnless(self.delegate.respondsTo('shouldBeReset')) self.failUnless(self.delegate.respondsTo('willBeReset')) self.failIf(self.delegate.respondsTo('canTheWorldBeChanged')) self.failIf(self.delegate.respondsTo('MinistryOfSillyWalksPostalAddress')) def test_01_proxyForDelegateInterfaceMethods(self): "[delegate] checks the DelegateWrapper's proxying mechanism" self.failUnless(self.delegate.shouldBeReset()==1) self.failIf(self.delegate.willBeReset()) # return None self.failUnless(self.delegate.delegateObject().resetCounter==1) try: self.delegate.canTheWorldBeChanged(1) except AttributeError: pass else: self.fail('self.delegate.canTheWorldBeChanged should have raised') # No automatic access to variable self.assertRaises(AttributeError, getattr, self.delegate, 'resetCounter') # Build the test suite def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestDelegate, "test_")) return suite if __name__ == "__main__": errs = utils.run_suite(test_suite()) sys.exit(errs and 1 or 0) |
From: Sebastien B. <sbi...@us...> - 2004-08-02 20:19:12
|
Update of /cvsroot/modeling/ProjectModeling/Modeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25685/Modeling Modified Files: TODO Log Message: Updated Index: TODO =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/TODO,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** TODO 4 Oct 2003 12:29:43 -0000 1.16 --- TODO 2 Aug 2004 20:19:02 -0000 1.17 *************** *** 282,286 **** --- 282,310 ---- + Database-related problems + ------------------------- + + * Hooks to be triggered at db- creation and connection time + + Mario (Ruggier) and Ernesto (Revilla) suggested the following: (quoted + from the ml) + + > 2. there should be hooks on a per db adaptor base (at least, at db + > creation time, and at connection time). Perhaps, which instructions to + > send to the database should be part of either a general config file with + > a section for each db adaptor, or a different config file for each db + > adaptor. + + This needs to be thought. I'm (Sébastien) personally more inclined to have + specific python hooks that could be triggered at creation time and at + connection time. + + * Add the possibility to declare some attributes as UNIQUE, see: + http://sourceforge.net/mailarchive/forum.php?thread_id=3575938&forum_id=10674 + + + Tests + ----- * Writing test_units was lately initiated, so tests are scarce... This |
From: Sebastien B. <sbi...@us...> - 2004-08-02 20:15:32
|
Update of /cvsroot/modeling/ProjectModeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25065 Modified Files: INSTALL Log Message: Updated Index: INSTALL =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/INSTALL,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** INSTALL 4 Oct 2003 13:08:32 -0000 1.11 --- INSTALL 2 Aug 2004 20:15:14 -0000 1.12 *************** *** 208,213 **** ------ ! The only supported python db-adaptor is ``pysqlite v0.4.3``. ! Tested w/ SQLite database server v2.8.5 Get it at: http://pysqlite.sourceforge.net/ --- 208,213 ---- ------ ! The only supported python db-adaptor is ``pysqlite``, currently v0.5.1. ! Tested w/ SQLite database server v2.8.15 Get it at: http://pysqlite.sourceforge.net/ |
From: Sebastien B. <sbi...@us...> - 2004-08-02 20:15:23
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/doc/HomePage In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25065/Modeling/doc/HomePage Modified Files: features.tex Log Message: Updated Index: features.tex =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/doc/HomePage/features.tex,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** features.tex 22 Feb 2004 17:33:29 -0000 1.3 --- features.tex 2 Aug 2004 20:15:14 -0000 1.4 *************** *** 88,92 **** ! \item Works with python 2.1 and 2.2. \end{itemize} --- 88,92 ---- ! \item Works with python 2.1, 2.2 and 2.3. \end{itemize} *************** *** 126,130 **** \end{rawhtml} ! \item[\begin{rawhtml}<a href="http://www.sqlite.org/">SQLite</a>\end{rawhtml}] tested with v2.8.3 Supported python adaptor: --- 126,130 ---- \end{rawhtml} ! \item[\begin{rawhtml}<a href="http://www.sqlite.org/">SQLite</a>\end{rawhtml}] tested with v2.8.15. Supported python adaptor: |
From: Sebastien B. <sbi...@us...> - 2004-08-02 20:12:39
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/tests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24524/Modeling/tests Modified Files: test_SQLExpression.py Log Message: tests fixed Index: test_SQLExpression.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/tests/test_SQLExpression.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** test_SQLExpression.py 20 Jul 2004 06:21:57 -0000 1.10 --- test_SQLExpression.py 2 Aug 2004 20:12:26 -0000 1.11 *************** *** 157,161 **** lock=0, fetchSpec=fs) self.assertEqual(sqlExpr.statement(), ! "SELECT DISTINCT t0.id, t0.title, t0.PRICE, t0.FK_WRITER_ID FROM BOOK t0 INNER JOIN ( WRITER t1 INNER JOIN WRITER t2 ON t1.FK_WRITER_ID=t2.ID ) ON t0.FK_WRITER_ID=t1.ID WHERE t2.LAST_NAME = 'Rabelais'") # None/NULL value --- 157,161 ---- lock=0, fetchSpec=fs) self.assertEqual(sqlExpr.statement(), ! "SELECT DISTINCT t0.id, t0.title, t0.FK_WRITER_ID, t0.PRICE FROM BOOK t0 INNER JOIN ( WRITER t1 INNER JOIN WRITER t2 ON t1.FK_WRITER_ID=t2.ID ) ON t0.FK_WRITER_ID=t1.ID WHERE t2.LAST_NAME = 'Rabelais'") # None/NULL value *************** *** 167,171 **** lock=0, fetchSpec=fs) self.assertEqual(sqlExpr.statement(), ! "SELECT DISTINCT t0.id, t0.title, t0.PRICE, t0.FK_WRITER_ID FROM BOOK t0 INNER JOIN ( WRITER t1 INNER JOIN ( WRITER t2 INNER JOIN BOOK t3 ON t2.ID=t3.FK_WRITER_ID ) ON t1.FK_WRITER_ID=t2.ID ) ON t0.FK_WRITER_ID=t1.ID WHERE t3.PRICE IS NULL") def test_07_prepareSelectExpressionWithAttributes_02(self): --- 167,171 ---- lock=0, fetchSpec=fs) self.assertEqual(sqlExpr.statement(), ! "SELECT DISTINCT t0.id, t0.title, t0.FK_WRITER_ID, t0.PRICE FROM BOOK t0 INNER JOIN ( WRITER t1 INNER JOIN ( WRITER t2 INNER JOIN BOOK t3 ON t2.ID=t3.FK_WRITER_ID ) ON t1.FK_WRITER_ID=t2.ID ) ON t0.FK_WRITER_ID=t1.ID WHERE t3.PRICE IS NULL") def test_07_prepareSelectExpressionWithAttributes_02(self): *************** *** 180,184 **** fetchSpec=fetchSpec) self.assertEqual(sqlExpr.statement(), ! "SELECT DISTINCT t0.id, t0.title, t0.PRICE, t0.FK_WRITER_ID FROM BOOK t0 INNER JOIN ( WRITER t1 INNER JOIN WRITER t2 ON t1.FK_WRITER_ID=t2.ID ) ON t0.FK_WRITER_ID=t1.ID WHERE t2.LAST_NAME = t1.LAST_NAME") def test_suite(): --- 180,184 ---- fetchSpec=fetchSpec) self.assertEqual(sqlExpr.statement(), ! "SELECT DISTINCT t0.id, t0.title, t0.FK_WRITER_ID, t0.PRICE FROM BOOK t0 INNER JOIN ( WRITER t1 INNER JOIN WRITER t2 ON t1.FK_WRITER_ID=t2.ID ) ON t0.FK_WRITER_ID=t1.ID WHERE t2.LAST_NAME = t1.LAST_NAME") def test_suite(): |
From: Sebastien B. <sbi...@us...> - 2004-08-02 20:11:48
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/AbstractDBAPI2AdaptorLayer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24328/Modeling/DatabaseAdaptors/AbstractDBAPI2AdaptorLayer Modified Files: AbstractDBAPI2AdaptorContext.py Log Message: private method __openConnectionIfNecessary__() renamed to _openConnectionIfNecessary Index: AbstractDBAPI2AdaptorContext.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/AbstractDBAPI2AdaptorLayer/AbstractDBAPI2AdaptorContext.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** AbstractDBAPI2AdaptorContext.py 2 Aug 2004 19:58:53 -0000 1.8 --- AbstractDBAPI2AdaptorContext.py 2 Aug 2004 20:11:39 -0000 1.9 *************** *** 103,107 **** raise GeneralAdaptorException, 'Another transaction has already begun' # pgdb automatically begins a transaction ! self.__openConnectionIfNecessary__() self.transactionDidBegin() --- 103,107 ---- raise GeneralAdaptorException, 'Another transaction has already begun' # pgdb automatically begins a transaction ! self._openConnectionIfNecessary() self.transactionDidBegin() *************** *** 188,196 **** """ db_trace('Called') ! self.__openConnectionIfNecessary__() return self._cnx.cursor() ! def __openConnectionIfNecessary__(self): """ Internally used to open a connection to the underlying database, if --- 188,196 ---- """ db_trace('Called') ! self._openConnectionIfNecessary() return self._cnx.cursor() ! def _openConnectionIfNecessary(self): """ Internally used to open a connection to the underlying database, if |
From: Sebastien B. <sbi...@us...> - 2004-08-02 20:11:47
|
Update of /cvsroot/modeling/ProjectModeling/Modeling In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24328/Modeling Added Files: ChangeLog Log Message: private method __openConnectionIfNecessary__() renamed to _openConnectionIfNecessary --- NEW FILE: ChangeLog --- 2004-08-02 Sebastien Bigaret <sbi...@us...> * DatabaseAdaptors/AbstractDBAPI2AdaptorLayer/AbstractDBAPI2AdaptorContext.py (AbstractDBAPI2AdaptorContext.__openConnectionIfNecessary__): renamed to _openConnectionIfNecessary * ChangeLog: added. Implementation details go here, while changes that are significant from a user's perspective are gathered in file CHANGES |
From: Sebastien B. <sbi...@us...> - 2004-08-02 19:59:08
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/PostgresqlAdaptorLayer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21321/Modeling/DatabaseAdaptors/PostgresqlAdaptorLayer Modified Files: PostgresqlAdaptor.py PostgresqlAdaptorChannel.py PostgresqlAdaptorContext.py PostgresqlSQLExpression.py PostgresqlSchemaGeneration.py __init__.py pg_utils.py Log Message: Encoding defined, in conformance with pep-0263 Index: PostgresqlAdaptorChannel.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/PostgresqlAdaptorLayer/PostgresqlAdaptorChannel.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** PostgresqlAdaptorChannel.py 20 Jul 2004 06:21:39 -0000 1.2 --- PostgresqlAdaptorChannel.py 2 Aug 2004 19:58:54 -0000 1.3 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: PostgresqlAdaptorContext.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/PostgresqlAdaptorLayer/PostgresqlAdaptorContext.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** PostgresqlAdaptorContext.py 20 Jul 2004 06:21:39 -0000 1.4 --- PostgresqlAdaptorContext.py 2 Aug 2004 19:58:54 -0000 1.5 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: PostgresqlAdaptor.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/PostgresqlAdaptorLayer/PostgresqlAdaptor.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** PostgresqlAdaptor.py 20 Jul 2004 06:21:39 -0000 1.6 --- PostgresqlAdaptor.py 2 Aug 2004 19:58:54 -0000 1.7 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: PostgresqlSQLExpression.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/PostgresqlAdaptorLayer/PostgresqlSQLExpression.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** PostgresqlSQLExpression.py 20 Jul 2004 06:21:39 -0000 1.9 --- PostgresqlSQLExpression.py 2 Aug 2004 19:58:54 -0000 1.10 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: pg_utils.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/PostgresqlAdaptorLayer/pg_utils.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pg_utils.py 20 Jul 2004 06:21:39 -0000 1.3 --- pg_utils.py 2 Aug 2004 19:58:54 -0000 1.4 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: __init__.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/PostgresqlAdaptorLayer/__init__.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** __init__.py 20 Jul 2004 06:21:39 -0000 1.6 --- __init__.py 2 Aug 2004 19:58:54 -0000 1.7 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: PostgresqlSchemaGeneration.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/PostgresqlAdaptorLayer/PostgresqlSchemaGeneration.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** PostgresqlSchemaGeneration.py 20 Jul 2004 06:21:39 -0000 1.3 --- PostgresqlSchemaGeneration.py 2 Aug 2004 19:58:54 -0000 1.4 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python |
From: Sebastien B. <sbi...@us...> - 2004-08-02 19:59:08
|
Update of /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/SQLiteAdaptorLayer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21321/Modeling/DatabaseAdaptors/SQLiteAdaptorLayer Modified Files: SQLiteAdaptor.py SQLiteAdaptorChannel.py SQLiteAdaptorContext.py SQLiteSQLExpression.py SQLiteSchemaGeneration.py __init__.py Log Message: Encoding defined, in conformance with pep-0263 Index: SQLiteAdaptorContext.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/SQLiteAdaptorLayer/SQLiteAdaptorContext.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** SQLiteAdaptorContext.py 20 Jul 2004 06:21:39 -0000 1.2 --- SQLiteAdaptorContext.py 2 Aug 2004 19:58:54 -0000 1.3 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: SQLiteAdaptorChannel.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/SQLiteAdaptorLayer/SQLiteAdaptorChannel.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** SQLiteAdaptorChannel.py 20 Jul 2004 06:21:39 -0000 1.2 --- SQLiteAdaptorChannel.py 2 Aug 2004 19:58:54 -0000 1.3 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: SQLiteSQLExpression.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/SQLiteAdaptorLayer/SQLiteSQLExpression.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** SQLiteSQLExpression.py 20 Jul 2004 06:21:39 -0000 1.5 --- SQLiteSQLExpression.py 2 Aug 2004 19:58:54 -0000 1.6 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: SQLiteAdaptor.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/SQLiteAdaptorLayer/SQLiteAdaptor.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** SQLiteAdaptor.py 20 Jul 2004 06:21:39 -0000 1.3 --- SQLiteAdaptor.py 2 Aug 2004 19:58:54 -0000 1.4 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: SQLiteSchemaGeneration.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/SQLiteAdaptorLayer/SQLiteSchemaGeneration.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** SQLiteSchemaGeneration.py 20 Jul 2004 06:21:39 -0000 1.6 --- SQLiteSchemaGeneration.py 2 Aug 2004 19:58:54 -0000 1.7 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python Index: __init__.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/DatabaseAdaptors/SQLiteAdaptorLayer/__init__.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** __init__.py 20 Jul 2004 06:21:39 -0000 1.3 --- __init__.py 2 Aug 2004 19:58:54 -0000 1.4 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- #----------------------------------------------------------------------------- # Modeling Framework: an Object-Relational Bridge for python |