|
|
@@ -7,17 +7,13 @@ import re
|
|
|
|
|
|
from path import Path
|
|
|
|
|
|
-
|
|
|
-objects = []
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-# TODO: gérer les cas où des objets de types différents portent le même nom. Ex: une table et un formulaire...
|
|
|
+# TODO: gérer les cas où des objets de types différents portent le même nom. Ex: une table et un formulaire... Note: une requete et une table ne peuvent pas porter le même nom.
|
|
|
# TODO: ignorer les commentaires dans le modules
|
|
|
# TODO: ignorer les labels dans les formulaires et états
|
|
|
-
|
|
|
-# NB: une requete et une table ne peuvent pas porter le même nom.
|
|
|
-
|
|
|
+# TODO: Gérer les références circulaires
|
|
|
+# TODO: Stocker un aperçu du contexte de la ou des références dans le code source, pour contrôle ultérieur
|
|
|
+# TODO: Permettre de supprimer / ajouter des réferences
|
|
|
+# TODO: Verifier que la recherche puisse être Case sensitive?
|
|
|
|
|
|
|
|
|
def recurse(acc_obj):
|
|
|
@@ -31,7 +27,6 @@ def recurse(acc_obj):
|
|
|
class InvalidFileExt(IOError):
|
|
|
pass
|
|
|
|
|
|
-
|
|
|
class AccessObject():
|
|
|
type_ = "<unknown>"
|
|
|
_valid_file_exts = (".bas")
|
|
|
@@ -81,10 +76,20 @@ class AccessObject():
|
|
|
return name_
|
|
|
|
|
|
def search_me_regex(self):
|
|
|
- return re.compile(r"""({sep}){nom}({sep})""".format(p=self._re_w_sep, nom=self.nom))
|
|
|
+ return re.compile(r"""({sep}){nom}({sep})""".format(sep=self._re_w_sep, nom=self.nom))
|
|
|
+
|
|
|
+ def containsRefsTo(self, access_object):
|
|
|
+ if access_object is self:
|
|
|
+ return False
|
|
|
+
|
|
|
+ if type(access_object) is ModuleObject: # L'objet peut contenir des references aux fonctions de l'objet module
|
|
|
+ for fname in access_object.functions:
|
|
|
+ rx = re.compile(r"(^|\W)({})($|\W)".format(fname))
|
|
|
+ if rx.search(self.sourcecode):
|
|
|
+ return True
|
|
|
|
|
|
- def rawsearch_me_regex(self):
|
|
|
- return self.search_me_regex()
|
|
|
+ rx = access_object.search_me_regex()
|
|
|
+ return rx.search(self.sourcecode)
|
|
|
|
|
|
class TableObject(AccessObject):
|
|
|
type_ = "Table"
|
|
|
@@ -123,7 +128,6 @@ DEPS_AND_REFS = 3
|
|
|
class Analyse():
|
|
|
objects = []
|
|
|
duplicated_names = []
|
|
|
- RAW_SEARCH = False
|
|
|
|
|
|
@staticmethod
|
|
|
def report(current, total, msg=""):
|
|
|
@@ -139,22 +143,6 @@ class Analyse():
|
|
|
cls.duplicated_names.append(obj.nom)
|
|
|
cls.objects.append(obj)
|
|
|
|
|
|
- @staticmethod
|
|
|
- def containsRefsTo(source, target):
|
|
|
- if Analyse.RAW_SEARCH:
|
|
|
- rx = target.rawsearch_me_regex()
|
|
|
- return rx.search(source.sourcecode)
|
|
|
-
|
|
|
- if type(target) is ModuleObject: # L'objet peut contenir des references aux fonctions de l'objet module
|
|
|
- for fname in target.functions:
|
|
|
- rx = re.compile(r"(?:^|\W)({})(?:$|\W)".format(fname))
|
|
|
- if rx.search(source.sourcecode):
|
|
|
- return True
|
|
|
- else:
|
|
|
- rx = re.compile(r"(?:^|\W)({})(?:$|\W)".format(target.nom))
|
|
|
- return rx.search(source.sourcecode)
|
|
|
-
|
|
|
-
|
|
|
@classmethod
|
|
|
def run(cls, source_dir, mode=DEPS_AND_REFS):
|
|
|
source_dir = Path(source_dir)
|
|
|
@@ -193,7 +181,7 @@ class Analyse():
|
|
|
|
|
|
for candidate in cls.objects[:index] + cls.objects[index + 1:]:
|
|
|
|
|
|
- if Analyse.containsRefsTo(subject, candidate):
|
|
|
+ if subject.containsRefsTo(candidate):
|
|
|
|
|
|
if mode in (DEPS_AND_REFS, DEPS_ONLY):
|
|
|
subject.add_dep(candidate)
|
|
|
@@ -207,6 +195,12 @@ class Analyse():
|
|
|
return cls.objects
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
if __name__ == "__main__":
|
|
|
source_dir = Path(r"c:\dev\access\Analytique\source")
|
|
|
|