6
6
import sys
7
7
import getpass
8
8
import json
9
+ from importlib_metadata import PackageNotFoundError
9
10
import pandas as pd
10
11
import math
11
12
import numpy as np
@@ -1001,7 +1002,7 @@ def createRequirementsJSON(cls, jPath=Path.cwd()):
1001
1002
codeDependencies = cls .getCodeDependencies (jPath )
1002
1003
1003
1004
packageList = picklePackages + codeDependencies
1004
- packageAndVersion = cls .getLocalPackageVersion ()
1005
+ packageAndVersion = cls .getLocalPackageVersion (list ( set ( packageList )) )
1005
1006
1006
1007
with open (Path (jPath ) / "requirements.json" ) as file :
1007
1008
for package , version in packageAndVersion :
@@ -1016,31 +1017,72 @@ def createRequirementsJSON(cls, jPath=Path.cwd()):
1016
1017
)
1017
1018
file .write (jsonStep )
1018
1019
1019
- def getCodeDependencies (self , jPath , debug = False ):
1020
- from ..utils import functionInspector
1021
- import inspect
1020
+ def getLocalPackageVersion (self , packageList ):
1022
1021
1022
+ packageVersion = []
1023
+ if sys .version_info [1 ] >= 8 :
1024
+ from importlib .metadata import version
1025
+ for package in packageList :
1026
+ try :
1027
+ packageVersion .append (version (package ))
1028
+ except PackageNotFoundError :
1029
+ print ("Warning: Package {} was not found in the local environment, so a version could not be determined." .format (package ))
1030
+ print ("The pip installation command will not include a version number." )
1031
+ packageVersion .append (None )
1032
+ return packageVersion
1033
+ else :
1034
+ import importlib
1035
+ for package in packageList :
1036
+ name = importlib .import_module (package )
1037
+ try :
1038
+ packageVersion .append (name .__version__ )
1039
+ except :
1040
+ try :
1041
+ packageVersion .append (name .version )
1042
+ except :
1043
+ try :
1044
+ packageVersion .append (name .VERSION )
1045
+ except :
1046
+ print ("Warning: Package {} was not found in the local environment, so a version could not be determined." .format (package ))
1047
+ print ("The pip installation command will not include a version number." )
1048
+ return packageVersion
1049
+
1050
+ def getCodeDependencies (self , jPath ):
1023
1051
fileNames = []
1024
1052
fileNames .extend (sorted (Path (jPath ).glob ("*.py" )))
1025
1053
1026
- strScoreCode = ''
1054
+ importInfo = []
1027
1055
for file in fileNames :
1028
- with open (file , "r" ) as code :
1029
- strScoreCode = strScoreCode + code .read ()
1030
-
1031
- stringFunctionInspector = inspect .getsource (functionInspector )
1032
-
1033
- execCode = strScoreCode + stringFunctionInspector + '''import logging
1034
- if __name__ == "__main__":
1035
- debug = {}
1036
- logLevel = logging.DEBUG if debug else logging.INFO
1037
- logging.basicConfig(level=logLevel, format="%%(levelname)s: %%(message)s")
1038
-
1039
- symbols, dependencies = findDependencies()
1040
- print(dependencies)
1041
- ''' .format (debug )
1042
-
1043
- exec (execCode )
1056
+ importInfo .append (self .findImports (file ))
1057
+ importInfo = list (set (importInfo ))
1058
+
1059
+ return importInfo
1060
+
1061
+ def findImports (self , fPath ):
1062
+ # modified from https://stackoverflow.com/questions/44988487/regex-to-parse-import-statements-in-python
1063
+ import ast
1064
+
1065
+ fileText = open (fPath ).read ()
1066
+ tree = ast .parse (fileText )
1067
+ modules = []
1068
+
1069
+ for node in ast .walk (tree ):
1070
+ if isinstance (node , ast .ImportFrom ):
1071
+ for name in node .names :
1072
+ if not name .asname :
1073
+ modules .append (node .module )
1074
+ elif isinstance (node , ast .Import ):
1075
+ for name in node .names :
1076
+ if not node .names [0 ].asname :
1077
+ modules .append (node .names [0 ].name )
1078
+
1079
+ modules = list (set (modules ))
1080
+ try :
1081
+ modules .remove ('settings' )
1082
+ return modules
1083
+ except ValueError :
1084
+ return modules
1085
+
1044
1086
def getPickleFile (self , pPath ):
1045
1087
"""
1046
1088
Given a file path, retrieve the pickle file(s).
0 commit comments