Skip to content

Commit 8150e46

Browse files
committed
First draft of simpler requirements.json method
1 parent 02d75c8 commit 8150e46

File tree

1 file changed

+63
-21
lines changed

1 file changed

+63
-21
lines changed

src/sasctl/pzmm/write_json_files.py

Lines changed: 63 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import sys
77
import getpass
88
import json
9+
from importlib_metadata import PackageNotFoundError
910
import pandas as pd
1011
import math
1112
import numpy as np
@@ -1001,7 +1002,7 @@ def createRequirementsJSON(cls, jPath=Path.cwd()):
10011002
codeDependencies = cls.getCodeDependencies(jPath)
10021003

10031004
packageList = picklePackages + codeDependencies
1004-
packageAndVersion = cls.getLocalPackageVersion()
1005+
packageAndVersion = cls.getLocalPackageVersion(list(set(packageList)))
10051006

10061007
with open(Path(jPath) / "requirements.json") as file:
10071008
for package, version in packageAndVersion:
@@ -1016,31 +1017,72 @@ def createRequirementsJSON(cls, jPath=Path.cwd()):
10161017
)
10171018
file.write(jsonStep)
10181019

1019-
def getCodeDependencies(self, jPath, debug=False):
1020-
from ..utils import functionInspector
1021-
import inspect
1020+
def getLocalPackageVersion(self, packageList):
10221021

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):
10231051
fileNames = []
10241052
fileNames.extend(sorted(Path(jPath).glob("*.py")))
10251053

1026-
strScoreCode = ''
1054+
importInfo = []
10271055
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+
10441086
def getPickleFile(self, pPath):
10451087
"""
10461088
Given a file path, retrieve the pickle file(s).

0 commit comments

Comments
 (0)