fosslight-dependency 3.14.0__py3-none-any.whl → 3.14.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. fosslight_dependency/_package_manager.py +34 -0
  2. fosslight_dependency/package_manager/Android.py +5 -2
  3. fosslight_dependency/package_manager/Carthage.py +6 -6
  4. fosslight_dependency/package_manager/Cocoapods.py +5 -3
  5. fosslight_dependency/package_manager/Go.py +5 -3
  6. fosslight_dependency/package_manager/Gradle.py +6 -3
  7. fosslight_dependency/package_manager/Helm.py +6 -3
  8. fosslight_dependency/package_manager/Maven.py +5 -3
  9. fosslight_dependency/package_manager/Npm.py +7 -5
  10. fosslight_dependency/package_manager/Nuget.py +5 -3
  11. fosslight_dependency/package_manager/Pub.py +5 -3
  12. fosslight_dependency/package_manager/Pypi.py +31 -28
  13. fosslight_dependency/package_manager/Swift.py +6 -4
  14. fosslight_dependency/run_dependency_scanner.py +27 -5
  15. {fosslight_dependency-3.14.0.dist-info → fosslight_dependency-3.14.1.dist-info}/METADATA +3 -2
  16. fosslight_dependency-3.14.1.dist-info/RECORD +33 -0
  17. {fosslight_dependency-3.14.0.dist-info → fosslight_dependency-3.14.1.dist-info}/WHEEL +1 -1
  18. fosslight_dependency-3.14.0.dist-info/RECORD +0 -33
  19. {fosslight_dependency-3.14.0.dist-info → fosslight_dependency-3.14.1.dist-info}/Apache-2.0.txt +0 -0
  20. {fosslight_dependency-3.14.0.dist-info → fosslight_dependency-3.14.1.dist-info}/LICENSE +0 -0
  21. {fosslight_dependency-3.14.0.dist-info → fosslight_dependency-3.14.1.dist-info}/LicenseRef-3rd_party_licenses.txt +0 -0
  22. {fosslight_dependency-3.14.0.dist-info → fosslight_dependency-3.14.1.dist-info}/MIT.txt +0 -0
  23. {fosslight_dependency-3.14.0.dist-info → fosslight_dependency-3.14.1.dist-info}/entry_points.txt +0 -0
  24. {fosslight_dependency-3.14.0.dist-info → fosslight_dependency-3.14.1.dist-info}/top_level.txt +0 -0
@@ -13,6 +13,7 @@ import subprocess
13
13
  import shutil
14
14
  import fosslight_util.constant as constant
15
15
  import fosslight_dependency.constant as const
16
+ from packageurl.contrib import url2purl
16
17
 
17
18
  try:
18
19
  from github import Github
@@ -48,6 +49,7 @@ class PackageManager:
48
49
  self.manifest_file_name = []
49
50
  self.relation_tree = {}
50
51
  self.package_name = ''
52
+ self.purl_dict = {}
51
53
 
52
54
  self.platform = platform.system()
53
55
  self.license_scanner_bin = check_license_scanner(self.platform)
@@ -188,6 +190,38 @@ class PackageManager:
188
190
  logger.warning(f'Fail to parse gradle dependency tree:{e}')
189
191
 
190
192
 
193
+ def get_url_to_purl(url, pkg_manager, oss_name='', oss_version=''):
194
+ purl_prefix = f'pkg:{pkg_manager}'
195
+ purl = str(url2purl.get_purl(url))
196
+ if not re.match(purl_prefix, purl):
197
+ match = re.match(constant.PKG_PATTERN.get(pkg_manager, 'not_support'), url)
198
+ try:
199
+ if match and (match != ''):
200
+ if pkg_manager == 'maven':
201
+ purl = f'{purl_prefix}/{match.group(1)}/{match.group(2)}@{match.group(3)}'
202
+ elif pkg_manager == 'pub':
203
+ purl = f'{purl_prefix}/{match.group(1)}@{match.group(2)}'
204
+ elif pkg_manager == 'cocoapods':
205
+ match = re.match(r'([^\/]+)\/?([^\/]*)', oss_name) # ex, GoogleUtilities/NSData+zlib
206
+ purl = f'{purl_prefix}/{match.group(1)}@{oss_version}'
207
+ if match.group(2):
208
+ purl = f'{purl}#{match.group(2)}'
209
+ elif pkg_manager == 'go':
210
+ purl = f'{purl_prefix}lang/{match.group(1)}@{match.group(2)}'
211
+ else:
212
+ if pkg_manager == 'swift':
213
+ if oss_version:
214
+ purl = f'{purl_prefix}/{oss_name}@{oss_version}'
215
+ else:
216
+ purl = f'{purl_prefix}/{oss_name}'
217
+ elif pkg_manager == 'carthage':
218
+ if oss_version:
219
+ purl = f'{purl}@{oss_version}'
220
+ except Exception:
221
+ logger.debug('Fail to get purl. So use the link purl({purl}).')
222
+ return purl
223
+
224
+
191
225
  def version_refine(oss_version):
192
226
  version_cmp = oss_version.upper()
193
227
 
@@ -7,7 +7,7 @@ import os
7
7
  import logging
8
8
  import fosslight_util.constant as constant
9
9
  import fosslight_dependency.constant as const
10
- from fosslight_dependency._package_manager import PackageManager
10
+ from fosslight_dependency._package_manager import PackageManager, get_url_to_purl
11
11
 
12
12
  logger = logging.getLogger(constant.LOGGER_NAME)
13
13
 
@@ -49,6 +49,8 @@ class Android(PackageManager):
49
49
  idx, manifest_file, oss_name, oss_version, license_name, dn_loc, homepage = split_str
50
50
  else:
51
51
  continue
52
+ purl = get_url_to_purl(dn_loc, 'maven')
53
+ self.purl_dict[f'{oss_name}({oss_version})'] = purl
52
54
 
53
55
  comment_list = []
54
56
  deps_list = []
@@ -69,6 +71,7 @@ class Android(PackageManager):
69
71
  comment = ','.join(comment_list)
70
72
  deps = ','.join(deps_list)
71
73
 
72
- sheet_list.append([manifest_file, oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, deps])
74
+ sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
75
+ '', '', comment, deps])
73
76
 
74
77
  return sheet_list
@@ -9,9 +9,8 @@ import os
9
9
  import fosslight_util.constant as constant
10
10
  import fosslight_dependency.constant as const
11
11
  from fosslight_dependency._package_manager import PackageManager
12
- from fosslight_dependency._package_manager import connect_github
13
- from fosslight_dependency._package_manager import get_github_license
14
- from fosslight_dependency._package_manager import check_and_run_license_scanner
12
+ from fosslight_dependency._package_manager import connect_github, get_github_license, check_and_run_license_scanner
13
+ from fosslight_dependency._package_manager import get_url_to_purl
15
14
 
16
15
  logger = logging.getLogger(constant.LOGGER_NAME)
17
16
 
@@ -60,9 +59,10 @@ class Carthage(PackageManager):
60
59
  else:
61
60
  homepage = oss_path
62
61
  dn_loc = homepage
63
-
64
62
  oss_version = re_result[0][2]
65
63
 
64
+ purl = get_url_to_purl(homepage, self.package_manager_name, oss_origin_name, oss_version)
65
+
66
66
  license_name = ''
67
67
  find_license = False
68
68
  if oss_origin_name in checkout_dir_list:
@@ -96,8 +96,8 @@ class Carthage(PackageManager):
96
96
  else:
97
97
  comment = 'transitive'
98
98
 
99
- sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name),
100
- oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, ''])
99
+ sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
100
+ '', '', comment, ''])
101
101
 
102
102
  except Exception as e:
103
103
  logger.warning(f"Failed to parse oss information: {e}")
@@ -10,7 +10,7 @@ import yaml
10
10
  import re
11
11
  import fosslight_util.constant as constant
12
12
  import fosslight_dependency.constant as const
13
- from fosslight_dependency._package_manager import PackageManager
13
+ from fosslight_dependency._package_manager import PackageManager, get_url_to_purl
14
14
 
15
15
  logger = logging.getLogger(constant.LOGGER_NAME)
16
16
 
@@ -128,6 +128,8 @@ class Cocoapods(PackageManager):
128
128
  spec_file_path = os.path.join(file_path_without_version, pod_oss_version, file_path[-1])
129
129
 
130
130
  oss_name, oss_version, license_name, dn_loc, homepage = self.get_oss_in_podspec(spec_file_path)
131
+ purl = get_url_to_purl(homepage, self.package_manager_name, pod_oss_name_origin, oss_version)
132
+ self.purl_dict[f'{pod_oss_name_origin}({oss_version})'] = purl
131
133
  if pod_oss_name in external_source_list:
132
134
  homepage = dn_loc
133
135
  if oss_name == '':
@@ -135,8 +137,8 @@ class Cocoapods(PackageManager):
135
137
  if pod_oss_version != oss_version:
136
138
  logger.warning(f'{pod_oss_name_origin} has different version({pod_oss_version})\
137
139
  with spec version({oss_version})')
138
- sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name), oss_name_report,
139
- pod_oss_version, license_name, dn_loc, homepage, '', '', comment, deps])
140
+ sheet_list.append([purl, oss_name_report, pod_oss_version, license_name, dn_loc, homepage,
141
+ '', '', comment, deps])
140
142
  except Exception as e:
141
143
  logger.warning(f"Fail to get {pod_oss_name_origin}:{e}")
142
144
 
@@ -12,7 +12,7 @@ import urllib.request
12
12
  import re
13
13
  import fosslight_util.constant as constant
14
14
  import fosslight_dependency.constant as const
15
- from fosslight_dependency._package_manager import PackageManager
15
+ from fosslight_dependency._package_manager import PackageManager, get_url_to_purl
16
16
 
17
17
  logger = logging.getLogger(constant.LOGGER_NAME)
18
18
 
@@ -107,6 +107,8 @@ class Go(PackageManager):
107
107
 
108
108
  homepage_set = []
109
109
  homepage = self.dn_url + package_path
110
+ purl = get_url_to_purl(f"{homepage}@{oss_version}", self.package_manager_name)
111
+ self.purl_dict[f'{package_path}({oss_version})'] = purl
110
112
 
111
113
  if oss_origin_version:
112
114
  tmp_homepage = f"{homepage}@{oss_origin_version}"
@@ -148,7 +150,7 @@ class Go(PackageManager):
148
150
 
149
151
  comment = ','.join(comment_list)
150
152
  deps = ','.join(deps_list)
151
- sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name),
152
- oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, deps])
153
+ sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
154
+ '', '', comment, deps])
153
155
 
154
156
  return sheet_list
@@ -9,7 +9,7 @@ import json
9
9
  import fosslight_util.constant as constant
10
10
  import fosslight_dependency.constant as const
11
11
  from fosslight_dependency._package_manager import PackageManager
12
- from fosslight_dependency._package_manager import version_refine
12
+ from fosslight_dependency._package_manager import version_refine, get_url_to_purl
13
13
 
14
14
  logger = logging.getLogger(constant.LOGGER_NAME)
15
15
 
@@ -59,6 +59,7 @@ class Gradle(PackageManager):
59
59
  oss_version = version_refine(oss_ini_version)
60
60
 
61
61
  license_names = []
62
+ purl = ''
62
63
  try:
63
64
  for licenses in d['licenses']:
64
65
  if licenses['name'] != '':
@@ -73,6 +74,8 @@ class Gradle(PackageManager):
73
74
  else:
74
75
  dn_loc = f"{self.dn_url}{group_id}/{artifact_id}/{oss_ini_version}"
75
76
  homepage = f"{self.dn_url}{group_id}/{artifact_id}"
77
+ purl = get_url_to_purl(dn_loc, 'maven')
78
+ self.purl_dict[f'{oss_name}({oss_ini_version})'] = purl
76
79
 
77
80
  comment_list = []
78
81
  deps_list = []
@@ -90,8 +93,8 @@ class Gradle(PackageManager):
90
93
  comment = ','.join(comment_list)
91
94
  deps = ','.join(deps_list)
92
95
 
93
- sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name),
94
- oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, deps])
96
+ sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
97
+ '', '', comment, deps])
95
98
 
96
99
  return sheet_list
97
100
 
@@ -10,7 +10,7 @@ import yaml
10
10
  import shutil
11
11
  import fosslight_util.constant as constant
12
12
  import fosslight_dependency.constant as const
13
- from fosslight_dependency._package_manager import PackageManager
13
+ from fosslight_dependency._package_manager import PackageManager, get_url_to_purl
14
14
  from fosslight_util.download import extract_compressed_dir
15
15
 
16
16
  logger = logging.getLogger(constant.LOGGER_NAME)
@@ -73,6 +73,7 @@ class Helm(PackageManager):
73
73
  for dep in dep_item_list:
74
74
  try:
75
75
  f_path = os.path.join(self.tmp_charts_dir, dep, f_name)
76
+ purl = ''
76
77
  with open(f_path, 'r', encoding='utf8') as yaml_fp:
77
78
  yaml_f = yaml.safe_load(yaml_fp)
78
79
  oss_name = f'{self.package_manager_name}:{yaml_f["name"]}'
@@ -85,6 +86,8 @@ class Helm(PackageManager):
85
86
  if yaml_f.get('sources', '') != '':
86
87
  dn_loc = yaml_f.get('sources', '')[0]
87
88
 
89
+ purl = get_url_to_purl(dn_loc if dn_loc else homepage, self.package_manager_name)
90
+
88
91
  license_name = ''
89
92
  if yaml_f.get('annotations', '') != '':
90
93
  license_name = yaml_f['annotations'].get('licenses', '')
@@ -96,7 +99,7 @@ class Helm(PackageManager):
96
99
  logging.warning(f"Fail to parse chart info {dep}: {e}")
97
100
  continue
98
101
 
99
- sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name),
100
- oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, ''])
102
+ sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
103
+ '', '', comment, ''])
101
104
 
102
105
  return sheet_list
@@ -13,7 +13,7 @@ import re
13
13
  import fosslight_util.constant as constant
14
14
  import fosslight_dependency.constant as const
15
15
  from fosslight_dependency._package_manager import PackageManager
16
- from fosslight_dependency._package_manager import version_refine
16
+ from fosslight_dependency._package_manager import version_refine, get_url_to_purl
17
17
 
18
18
  logger = logging.getLogger(constant.LOGGER_NAME)
19
19
 
@@ -225,6 +225,8 @@ class Maven(PackageManager):
225
225
  oss_name = f"{groupid}:{artifactid}"
226
226
  dn_loc = f"{self.dn_url}{groupid}/{artifactid}/{version}"
227
227
  homepage = f"{self.dn_url}{groupid}/{artifactid}"
228
+ purl = get_url_to_purl(dn_loc, self.package_manager_name)
229
+ self.purl_dict[f'{oss_name}({oss_version})'] = purl
228
230
 
229
231
  licenses = d.find("licenses")
230
232
  if len(licenses):
@@ -253,7 +255,7 @@ class Maven(PackageManager):
253
255
  comment = ','.join(comment_list)
254
256
  deps = ','.join(deps_list)
255
257
 
256
- sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name),
257
- oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, deps])
258
+ sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
259
+ '', '', comment, deps])
258
260
 
259
261
  return sheet_list
@@ -11,7 +11,7 @@ import shutil
11
11
  import re
12
12
  import fosslight_util.constant as constant
13
13
  import fosslight_dependency.constant as const
14
- from fosslight_dependency._package_manager import PackageManager
14
+ from fosslight_dependency._package_manager import PackageManager, get_url_to_purl
15
15
 
16
16
  logger = logging.getLogger(constant.LOGGER_NAME)
17
17
  node_modules = 'node_modules'
@@ -176,6 +176,8 @@ class Npm(PackageManager):
176
176
 
177
177
  homepage = self.dn_url + oss_init_name
178
178
  dn_loc = f"{self.dn_url}{oss_init_name}/v/{oss_version}"
179
+ purl = get_url_to_purl(dn_loc, self.package_manager_name)
180
+ self.purl_dict[f'{oss_init_name}({oss_version})'] = purl
179
181
  if d[_repository]:
180
182
  dn_loc = d[_repository]
181
183
  elif private_pkg:
@@ -205,13 +207,13 @@ class Npm(PackageManager):
205
207
  deps = ','.join(deps_list)
206
208
  if multi_flag:
207
209
  comment = f'{comment}, {license_comment}'
208
- sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name),
209
- oss_name, oss_version, multi_license, dn_loc, homepage, '', '', comment, deps])
210
+ sheet_list.append([purl, oss_name, oss_version, multi_license, dn_loc, homepage,
211
+ '', '', comment, deps])
210
212
  else:
211
213
  license_name = license_name.replace(",", "")
212
214
  license_name = check_unknown_license(license_name, manifest_file_path)
213
- sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name),
214
- oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, deps])
215
+ sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
216
+ '', '', comment, deps])
215
217
 
216
218
  return sheet_list
217
219
 
@@ -12,7 +12,7 @@ import requests
12
12
  import fosslight_util.constant as constant
13
13
  import fosslight_dependency.constant as const
14
14
  from fosslight_dependency._package_manager import PackageManager
15
- from fosslight_dependency._package_manager import check_and_run_license_scanner
15
+ from fosslight_dependency._package_manager import check_and_run_license_scanner, get_url_to_purl
16
16
 
17
17
  logger = logging.getLogger(constant.LOGGER_NAME)
18
18
 
@@ -95,8 +95,11 @@ class Nuget(PackageManager):
95
95
  else:
96
96
  if dn_loc.endswith('.git'):
97
97
  dn_loc = dn_loc[:-4]
98
+ purl = get_url_to_purl(f'{homepage}/{oss_version}', self.package_manager_name)
98
99
  else:
99
100
  comment_list.append('Fail to response for nuget api')
101
+ purl = f'pkg:nuget/{oss_origin_name}@{oss_version}'
102
+ self.purl_dict[f'{oss_origin_name}({oss_version})'] = purl
100
103
 
101
104
  deps_list = []
102
105
  if self.direct_dep and self.packageReference:
@@ -112,8 +115,7 @@ class Nuget(PackageManager):
112
115
 
113
116
  comment = ','.join(comment_list)
114
117
  deps = ','.join(deps_list)
115
- sheet_list.append([','.join(self.input_package_list_file),
116
- oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, deps])
118
+ sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, deps])
117
119
 
118
120
  except Exception as e:
119
121
  logger.warning(f"Failed to parse oss information: {e}")
@@ -13,7 +13,7 @@ import subprocess
13
13
  import fosslight_util.constant as constant
14
14
  import fosslight_dependency.constant as const
15
15
  from fosslight_dependency._package_manager import PackageManager
16
- from fosslight_dependency._package_manager import check_and_run_license_scanner
16
+ from fosslight_dependency._package_manager import check_and_run_license_scanner, get_url_to_purl
17
17
 
18
18
  logger = logging.getLogger(constant.LOGGER_NAME)
19
19
 
@@ -124,6 +124,8 @@ class Pub(PackageManager):
124
124
  if homepage is None:
125
125
  homepage = ''
126
126
  dn_loc = f"{self.dn_url}{oss_origin_name}/versions/{oss_version}"
127
+ purl = get_url_to_purl(dn_loc, self.package_manager_name)
128
+ self.purl_dict[f'{oss_origin_name}({oss_version})'] = purl
127
129
  license_txt = json_data['license']
128
130
 
129
131
  tmp_license_txt = open(tmp_license_txt_file_name, 'w', encoding='utf-8')
@@ -158,8 +160,8 @@ class Pub(PackageManager):
158
160
  deps_list.extend(rel_items)
159
161
  comment = ','.join(comment_list)
160
162
  deps = ','.join(deps_list)
161
- sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name),
162
- oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, deps])
163
+ sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
164
+ '', '', comment, deps])
163
165
  except Exception as e:
164
166
  logger.error(f"Fail to parse pub oss information: {e}")
165
167
 
@@ -13,7 +13,7 @@ import re
13
13
  import fosslight_util.constant as constant
14
14
  import fosslight_dependency.constant as const
15
15
  from fosslight_dependency._package_manager import PackageManager
16
- from fosslight_dependency._package_manager import check_and_run_license_scanner
16
+ from fosslight_dependency._package_manager import check_and_run_license_scanner, get_url_to_purl
17
17
 
18
18
  logger = logging.getLogger(constant.LOGGER_NAME)
19
19
 
@@ -90,7 +90,7 @@ class Pypi(PackageManager):
90
90
  activate_cmd = os.path.join(self.venv_tmp_dir, "Scripts", "activate.bat")
91
91
  cmd_separator = "&"
92
92
  else:
93
- create_venv_cmd = f"virtualenv -p python3 {self.venv_tmp_dir}"
93
+ create_venv_cmd = f"python3 -m venv {self.venv_tmp_dir}"
94
94
  activate_cmd = ". " + os.path.join(venv_path, "bin", "activate")
95
95
  cmd_separator = ";"
96
96
 
@@ -139,6 +139,7 @@ class Pypi(PackageManager):
139
139
  pip_licenses_default_options = ' --from=mixed --with-url --format=json --with-license-file'
140
140
  pip_licenses_system_option = ' --with-system -p '
141
141
  tmp_pip_list = "tmp_list.txt"
142
+ python_cmd = "python -m"
142
143
 
143
144
  if self.pip_activate_cmd.startswith("source "):
144
145
  tmp_activate = self.pip_activate_cmd[7:]
@@ -156,7 +157,7 @@ class Pypi(PackageManager):
156
157
  command_separator = ";"
157
158
 
158
159
  activate_command = pip_activate_cmd
159
- pip_list_command = f"pip freeze > {tmp_pip_list}"
160
+ pip_list_command = f"{python_cmd} pip freeze > {tmp_pip_list}"
160
161
  deactivate_command = self.pip_deactivate_cmd
161
162
 
162
163
  command_list = [activate_command, pip_list_command, deactivate_command]
@@ -215,28 +216,28 @@ class Pypi(PackageManager):
215
216
  command_list = []
216
217
  command_list.append(activate_command)
217
218
  if not exists_pip_licenses:
218
- install_pip_command = f"pip install {pip_licenses}"
219
+ install_pip_command = f"{python_cmd} pip install {pip_licenses}"
219
220
  command_list.append(install_pip_command)
220
221
 
221
222
  pip_licenses_command = f"{pip_licenses}{pip_licenses_default_options} > {self.tmp_file_name}"
222
223
  command_list.append(pip_licenses_command)
223
224
 
224
225
  if len(pip_license_pkg_list) != 0:
225
- pip_licenses_info_command = pip_licenses + pip_licenses_default_options + pip_licenses_system_option
226
+ pip_licenses_info_command = f"{pip_licenses}{pip_licenses_default_options}{pip_licenses_system_option}"
226
227
  pip_licenses_info_command += " ".join(pip_license_pkg_list)
227
228
 
228
229
  pip_licenses_info_command += f" > {self.tmp_pip_license_info_file_name}"
229
230
  command_list.append(pip_licenses_info_command)
230
231
 
231
232
  if len(uninstall_pkg_list) > 0:
232
- uninstall_pip_command = "pip uninstall -y "
233
+ uninstall_pip_command = f"{python_cmd} pip uninstall -y "
233
234
  uninstall_pip_command += ' '.join(uninstall_pkg_list)
234
235
  command_list.append(uninstall_pip_command)
235
236
 
236
237
  if not exists_pipdeptree:
237
- install_deptree_command = f"pip install {pipdeptree}"
238
+ install_deptree_command = f"{python_cmd} pip install {pipdeptree}"
238
239
  command_list.append(install_deptree_command)
239
- uninstall_deptree_command = f"pip uninstall -y {pipdeptree}"
240
+ uninstall_deptree_command = f"{python_cmd} pip uninstall -y {pipdeptree}"
240
241
  pipdeptree_command = f"{pipdeptree} --json-tree -e 'pipdeptree,pip,wheel,setuptools' > {self.tmp_deptree_file}"
241
242
  command_list.append(pipdeptree_command)
242
243
  command_list.append(uninstall_deptree_command)
@@ -282,7 +283,8 @@ class Pypi(PackageManager):
282
283
  homepage = check_UNKNOWN(d['URL'])
283
284
  oss_version = d['Version']
284
285
  dn_loc = f"{self.dn_url}{oss_init_name}/{oss_version}"
285
-
286
+ purl = get_url_to_purl(dn_loc, self.package_manager_name)
287
+ self.purl_dict[f'{oss_init_name}({oss_version})'] = purl
286
288
  if license_name is not None:
287
289
  license_name = license_name.replace(';', ',')
288
290
  else:
@@ -308,8 +310,7 @@ class Pypi(PackageManager):
308
310
  deps_list.extend(rel_items)
309
311
  comment = ','.join(comment_list)
310
312
  deps = ','.join(deps_list)
311
- sheet_list.append([', '.join(self.manifest_file_name),
312
- oss_name, oss_version,
313
+ sheet_list.append([purl, oss_name, oss_version,
313
314
  license_name, dn_loc, homepage, '', '', comment, deps])
314
315
 
315
316
  except Exception as ex:
@@ -339,26 +340,28 @@ class Pypi(PackageManager):
339
340
  if not os.path.exists(self.tmp_deptree_file):
340
341
  self.direct_dep = False
341
342
  return
343
+ try:
344
+ with open(self.tmp_deptree_file, 'r', encoding='utf8') as f:
345
+ json_f = json.load(f)
346
+ root_package = json_f
347
+ if ('pyproject.toml' in self.manifest_file_name) or ('setup.py' in self.manifest_file_name):
348
+ direct_without_system_package = 0
349
+ for package in root_package:
350
+ package_name = re.sub(r"[-_.]+", "-", package['package_name']).lower()
351
+ if package_name in self.total_dep_list:
352
+ direct_without_system_package += 1
353
+ if direct_without_system_package == 1:
354
+ self.package_name = re.sub(r"[-_.]+", "-", json_f[0]['package_name']).lower()
355
+ root_package = json_f[0]['dependencies']
342
356
 
343
- with open(self.tmp_deptree_file, 'r', encoding='utf8') as f:
344
- json_f = json.load(f)
345
- root_package = json_f
346
- if ('pyproject.toml' in self.manifest_file_name) or ('setup.py' in self.manifest_file_name):
347
- direct_without_system_package = 0
348
357
  for package in root_package:
349
358
  package_name = re.sub(r"[-_.]+", "-", package['package_name']).lower()
350
- if package_name in self.total_dep_list:
351
- direct_without_system_package += 1
352
- if direct_without_system_package == 1:
353
- self.package_name = re.sub(r"[-_.]+", "-", json_f[0]['package_name']).lower()
354
- root_package = json_f[0]['dependencies']
355
-
356
- for package in root_package:
357
- package_name = re.sub(r"[-_.]+", "-", package['package_name']).lower()
358
- self.direct_dep_list.append(f"{package_name}({package['installed_version']})")
359
- if package['dependencies'] == []:
360
- continue
361
- self.relation_tree = self.get_dependencies(self.relation_tree, package)
359
+ self.direct_dep_list.append(f"{package_name}({package['installed_version']})")
360
+ if package['dependencies'] == []:
361
+ continue
362
+ self.relation_tree = self.get_dependencies(self.relation_tree, package)
363
+ except Exception as e:
364
+ logger.warning(f'Fail to parse direct dependency: {e}')
362
365
 
363
366
 
364
367
  def check_UNKNOWN(text):
@@ -10,8 +10,8 @@ import subprocess
10
10
  import fosslight_util.constant as constant
11
11
  import fosslight_dependency.constant as const
12
12
  from fosslight_dependency._package_manager import PackageManager
13
- from fosslight_dependency._package_manager import connect_github
14
- from fosslight_dependency._package_manager import get_github_license
13
+ from fosslight_dependency._package_manager import connect_github, get_github_license
14
+ from fosslight_dependency._package_manager import get_url_to_purl
15
15
 
16
16
  logger = logging.getLogger(constant.LOGGER_NAME)
17
17
 
@@ -134,6 +134,8 @@ class Swift(PackageManager):
134
134
  license_name = ''
135
135
 
136
136
  github_repo = "/".join(homepage.split('/')[-2:])
137
+ purl = get_url_to_purl(dn_loc, self.package_manager_name, github_repo, oss_version)
138
+ self.purl_dict[f'{oss_origin_name}({oss_version})'] = purl
137
139
  license_name = get_github_license(g, github_repo, self.platform, self.license_scanner_bin)
138
140
 
139
141
  comment_list = []
@@ -150,7 +152,7 @@ class Swift(PackageManager):
150
152
  deps_list.extend(rel_items)
151
153
  comment = ','.join(comment_list)
152
154
  deps = ','.join(deps_list)
153
- sheet_list.append([const.SUPPORT_PACKAE.get(self.package_manager_name),
154
- oss_name, oss_version, license_name, dn_loc, homepage, '', '', comment, deps])
155
+ sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
156
+ '', '', comment, deps])
155
157
 
156
158
  return sheet_list
@@ -20,16 +20,17 @@ from fosslight_dependency._analyze_dependency import analyze_dependency
20
20
  from fosslight_util.output_format import check_output_format, write_output_file
21
21
  if platform.system() != 'Windows':
22
22
  from fosslight_util.write_spdx import write_spdx
23
+ from fosslight_util.cover import CoverItem
23
24
 
24
25
  # Package Name
25
26
  _PKG_NAME = "fosslight_dependency"
26
27
  logger = logging.getLogger(constant.LOGGER_NAME)
27
28
  warnings.filterwarnings("ignore", category=FutureWarning)
28
29
  _sheet_name = "DEP_FL_Dependency"
29
- EXTENDED_HEADER = {_sheet_name: ['ID', 'Source Name or Path', 'OSS Name',
30
+ EXTENDED_HEADER = {_sheet_name: ['ID', 'purl', 'OSS Name',
30
31
  'OSS Version', 'License', 'Download Location',
31
32
  'Homepage', 'Copyright Text', 'Exclude',
32
- 'Comment', 'Dependencies']}
33
+ 'Comment', 'Depends On']}
33
34
  CUSTOMIZED_FORMAT = {'excel': '.xlsx', 'csv': '.csv', 'opossum': '.json', 'yaml': '.yaml',
34
35
  'spdx-yaml': '.yaml', 'spdx-json': '.json', 'spdx-xml': '.xml',
35
36
  'spdx-tag': '.tag'}
@@ -158,21 +159,40 @@ def run_dependency_scanner(package_manager='', input_dir='', output_dir_file='',
158
159
  finally:
159
160
  if not ret:
160
161
  logger.warning("Dependency scanning terminated because the package manager was not found.")
161
- return False, sheet_list
162
+ ret = False
162
163
  else:
163
164
  found_package_manager[package_manager] = ''
164
165
 
165
166
  pass_key = 'PASS'
167
+ success_pm = []
168
+ fail_pm = []
166
169
  for pm, manifest_file_name in found_package_manager.items():
167
170
  if manifest_file_name == pass_key:
168
171
  continue
169
172
  ret, package_sheet_list = analyze_dependency(pm, input_dir, output_path, pip_activate_cmd, pip_deactivate_cmd,
170
173
  output_custom_dir, app_name, github_token, manifest_file_name, direct)
171
174
  if ret:
175
+ success_pm.append(f"{pm} ({', '.join(manifest_file_name)})")
172
176
  sheet_list[_sheet_name].extend(package_sheet_list)
173
177
  if pm == const.GRADLE:
174
178
  if const.ANDROID in found_package_manager.keys():
175
179
  found_package_manager[const.ANDROID] = pass_key
180
+ else:
181
+ fail_pm.append(f"{pm} ({', '.join(manifest_file_name)})")
182
+ cover = CoverItem(tool_name=_PKG_NAME,
183
+ start_time=_start_time,
184
+ input_path=input_dir)
185
+ cover_comment_arr = []
186
+ if len(found_package_manager.keys()) > 0:
187
+ if len(success_pm) > 0:
188
+ cover_comment_arr.append(f"Analyzed Package manager: {', '.join(success_pm)}")
189
+ if len(fail_pm) > 0:
190
+ info_msg = 'Check https://fosslight.org/fosslight-guide-en/scanner/3_dependency.html#-prerequisite.'
191
+ cover_comment_arr.append(f"Analysis failed Package manager: {', '.join(fail_pm)} ({info_msg})")
192
+ else:
193
+ cover_comment_arr.append("No Package manager detected.")
194
+
195
+ cover.comment = ' / '.join(cover_comment_arr)
176
196
 
177
197
  output_file_without_ext = os.path.join(output_path, output_file)
178
198
  if format.startswith('spdx'):
@@ -184,12 +204,14 @@ def run_dependency_scanner(package_manager='', input_dir='', output_dir_file='',
184
204
  logger.error('Windows not support spdx format.')
185
205
  else:
186
206
  success_write, err_msg, result_file = write_output_file(output_file_without_ext, output_extension,
187
- sheet_list, EXTENDED_HEADER)
207
+ sheet_list, EXTENDED_HEADER, '', cover)
188
208
  if success_write:
189
209
  if result_file:
190
- logger.info(f"Writing Output file({result_file}), success:{success_write}")
210
+ logger.info(f"Output file: {result_file}")
191
211
  else:
192
212
  logger.warning(f"{err_msg}")
213
+ for i in cover_comment_arr:
214
+ logger.info(i.strip())
193
215
  else:
194
216
  ret = False
195
217
  logger.error(f"Fail to generate result file. msg:({err_msg})")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fosslight-dependency
3
- Version: 3.14.0
3
+ Version: 3.14.1
4
4
  Summary: FOSSLight Dependency Scanner
5
5
  Home-page: https://github.com/fosslight/fosslight_dependency_scanner
6
6
  Author: LG Electronics
@@ -20,10 +20,11 @@ Requires-Dist: lxml
20
20
  Requires-Dist: virtualenv
21
21
  Requires-Dist: pyyaml
22
22
  Requires-Dist: lastversion
23
- Requires-Dist: fosslight-util >=1.4.29
23
+ Requires-Dist: fosslight-util >=1.4.40
24
24
  Requires-Dist: PyGithub
25
25
  Requires-Dist: requirements-parser
26
26
  Requires-Dist: defusedxml
27
+ Requires-Dist: packageurl-python
27
28
 
28
29
  <!--
29
30
  Copyright (c) 2021 LG Electronics
@@ -0,0 +1,33 @@
1
+ fosslight_dependency/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ fosslight_dependency/_analyze_dependency.py,sha256=5fJ-eAkGUVsAo0Eks9l40zyWNBm7HxGQMWD2bAbOWa0,3710
3
+ fosslight_dependency/_help.py,sha256=gBZfnYF8e4-WQnKa0z6zwXSRUKoIWtQyHbsvjvEFysE,2708
4
+ fosslight_dependency/_package_manager.py,sha256=6U6V413HSZAChX64v3CfXBd6jyIkuaIW60pBfbCLSfQ,13700
5
+ fosslight_dependency/constant.py,sha256=vj3YI1e1pesUoSW0wp0t9RFHCNjoKJZ6Fv4P8EAl6hU,953
6
+ fosslight_dependency/run_dependency_scanner.py,sha256=S8PQMSdSvg6QaAtY1uuQ6a0apuwdeU3jU6RdBiz2PvU,12236
7
+ fosslight_dependency/LICENSES/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
8
+ fosslight_dependency/LICENSES/LicenseRef-3rd_party_licenses.txt,sha256=EcsFt7aE1rp3OXAdJgmXayfOZdpRdBMcmRnyoqWMCsw,95687
9
+ fosslight_dependency/package_manager/Android.py,sha256=lPL-B-qIr4Bg1Z-bT6hSwzYF0IqW3J32At8AJNg8P_w,3015
10
+ fosslight_dependency/package_manager/Carthage.py,sha256=OZL0ssKvN6pze0VohZ-kMeM-g-V7f5VqumpEh3o3t-U,6106
11
+ fosslight_dependency/package_manager/Cocoapods.py,sha256=X6UYX0-Tdfy_hkM0l5M54WHbhZNLLpFDzrGxeBjTmcY,8450
12
+ fosslight_dependency/package_manager/Go.py,sha256=Ur7kH_alqV2o2t6Q5oP2UqmqfzdZ6l9yPuglTEOYrHU,6003
13
+ fosslight_dependency/package_manager/Gradle.py,sha256=_gZjdmNDXdUEumVwwesbaCeJI5T90xzkwZy1ACFHeR8,4182
14
+ fosslight_dependency/package_manager/Helm.py,sha256=FjzQilY3GJyX8thwMGY_Rr12kw-dbehxVk6jIJNb2-M,4024
15
+ fosslight_dependency/package_manager/Maven.py,sha256=VlIc785CrFN3RBXHy80JSx2J5AlrbXhg5cquZA-qoLw,10261
16
+ fosslight_dependency/package_manager/Npm.py,sha256=7gj-JrQKWRQUdWM-ly3HcIy1ioKny8jaeNohdBk7rfE,10557
17
+ fosslight_dependency/package_manager/Nuget.py,sha256=1YGkGktShw6xj7NGvgL763jWsnN58JEX9szTggjU1EQ,9061
18
+ fosslight_dependency/package_manager/Pub.py,sha256=u2Wsm8raxc8fYEchyUpSpiKi-1x8seE4f0zJHD8BrMI,8964
19
+ fosslight_dependency/package_manager/Pypi.py,sha256=QakFlbGrb3oOXwRj498x5k2GFS1SgNeMpgMwUpBcwWU,15698
20
+ fosslight_dependency/package_manager/Swift.py,sha256=9J-LDCn0_zDBuScUeCgZIq0BQcx4n_1fhshciF9byNE,6590
21
+ fosslight_dependency/package_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ fosslight_dependency/third_party/askalono/askalono.exe,sha256=NyngElHbrg3zLFRVwn6fPDZE_EDAEb1N8tiwWoCm4pQ,4743680
23
+ fosslight_dependency/third_party/askalono/askalono_macos,sha256=cYSNXhAQpkdd8lkgnY5skNeDmU_8DIuP84eFi0OXKkE,5589868
24
+ fosslight_dependency/third_party/nomos/nomossa,sha256=oFF9I-fhug6AVNyFnWeVXwDRin6NWSvk1g7mHBotB3Q,866408
25
+ fosslight_dependency-3.14.1.dist-info/Apache-2.0.txt,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
26
+ fosslight_dependency-3.14.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
27
+ fosslight_dependency-3.14.1.dist-info/LicenseRef-3rd_party_licenses.txt,sha256=EcsFt7aE1rp3OXAdJgmXayfOZdpRdBMcmRnyoqWMCsw,95687
28
+ fosslight_dependency-3.14.1.dist-info/METADATA,sha256=MZk20jKRlLdfSLg3MGLqcxcWkinMHdJVJGqPc1_Z9F4,4636
29
+ fosslight_dependency-3.14.1.dist-info/MIT.txt,sha256=9cx4CbArgByWvkoEZNqpzbpJgA9TUe2D62rMocQpgfs,1082
30
+ fosslight_dependency-3.14.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
31
+ fosslight_dependency-3.14.1.dist-info/entry_points.txt,sha256=e1QZbnCrQvfbwe9L6PxXnkRZMhl-PSo0QyUes0dGjU8,91
32
+ fosslight_dependency-3.14.1.dist-info/top_level.txt,sha256=Jc0V7VcVCH0TEM8ksb8dwroTYz4AmRaQnlr3FB71Hcs,21
33
+ fosslight_dependency-3.14.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,33 +0,0 @@
1
- fosslight_dependency/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- fosslight_dependency/_analyze_dependency.py,sha256=5fJ-eAkGUVsAo0Eks9l40zyWNBm7HxGQMWD2bAbOWa0,3710
3
- fosslight_dependency/_help.py,sha256=gBZfnYF8e4-WQnKa0z6zwXSRUKoIWtQyHbsvjvEFysE,2708
4
- fosslight_dependency/_package_manager.py,sha256=BtmwTAPwH38nVMTzaMbewsYYm8xn2spmbJPoIIgYOMQ,12085
5
- fosslight_dependency/constant.py,sha256=vj3YI1e1pesUoSW0wp0t9RFHCNjoKJZ6Fv4P8EAl6hU,953
6
- fosslight_dependency/run_dependency_scanner.py,sha256=YLCQ_6oI9usfvW0ap4nQDZoornL8LQKpjWyKRnTeY_Y,11275
7
- fosslight_dependency/LICENSES/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
8
- fosslight_dependency/LICENSES/LicenseRef-3rd_party_licenses.txt,sha256=EcsFt7aE1rp3OXAdJgmXayfOZdpRdBMcmRnyoqWMCsw,95687
9
- fosslight_dependency/package_manager/Android.py,sha256=Up4Fv57kuqddZsD8vy5VRwQW7bNtDbqRatjP8MgzGR8,2849
10
- fosslight_dependency/package_manager/Carthage.py,sha256=GtJxBq_3cujbZoQC2KFdFQM4cEjcK_j9bsZaxEaZu6s,6075
11
- fosslight_dependency/package_manager/Cocoapods.py,sha256=h_W-lknWcqDPDnixSNtJig_h0J-jel6MsIrptUWiTsc,8292
12
- fosslight_dependency/package_manager/Go.py,sha256=d3U_hRtcPWEYbT_JVHAB3jEUKLO4FodbF8hMEWS4JFM,5866
13
- fosslight_dependency/package_manager/Gradle.py,sha256=SVWjZM5LIVSaANQlU9W0eoDKKsK9UaG8S7Xz7RoAeYQ,4062
14
- fosslight_dependency/package_manager/Helm.py,sha256=ZXgbtwWNgJKRUikdtFycMIwdJPu4J7vPpVvzgNLk03Q,3925
15
- fosslight_dependency/package_manager/Maven.py,sha256=xlQXpm9Ur0DzWa5P9VesJxm-r-mQZ_hoXYWFu7oD1LA,10157
16
- fosslight_dependency/package_manager/Npm.py,sha256=0NUBSDBYs15H9lxqaLxh7PgxPI7ewyef8BKtVxeQg14,10495
17
- fosslight_dependency/package_manager/Nuget.py,sha256=CzYO548zetC1YNKskUpG1gSWPGF4QrrQz77VZJ5b3Eo,8866
18
- fosslight_dependency/package_manager/Pub.py,sha256=zRelrIAeDlLAd8uTUJzYWvLUJeOnzmGPzOx8pcMG55Y,8845
19
- fosslight_dependency/package_manager/Pypi.py,sha256=kNtLhhhpd0QMgMv86KAXclbHPJbcewSp6UefKljAwUA,15321
20
- fosslight_dependency/package_manager/Swift.py,sha256=jHWor3dZzunwZt--8rdD42vDq4Z66m9fo5xFnIw5_cQ,6453
21
- fosslight_dependency/package_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- fosslight_dependency/third_party/askalono/askalono.exe,sha256=NyngElHbrg3zLFRVwn6fPDZE_EDAEb1N8tiwWoCm4pQ,4743680
23
- fosslight_dependency/third_party/askalono/askalono_macos,sha256=cYSNXhAQpkdd8lkgnY5skNeDmU_8DIuP84eFi0OXKkE,5589868
24
- fosslight_dependency/third_party/nomos/nomossa,sha256=oFF9I-fhug6AVNyFnWeVXwDRin6NWSvk1g7mHBotB3Q,866408
25
- fosslight_dependency-3.14.0.dist-info/Apache-2.0.txt,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
26
- fosslight_dependency-3.14.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
27
- fosslight_dependency-3.14.0.dist-info/LicenseRef-3rd_party_licenses.txt,sha256=EcsFt7aE1rp3OXAdJgmXayfOZdpRdBMcmRnyoqWMCsw,95687
28
- fosslight_dependency-3.14.0.dist-info/METADATA,sha256=jC9CvSTt5IrvxKogfUnTNqk3DXd-OSIMgQyfY-RYjiA,4603
29
- fosslight_dependency-3.14.0.dist-info/MIT.txt,sha256=9cx4CbArgByWvkoEZNqpzbpJgA9TUe2D62rMocQpgfs,1082
30
- fosslight_dependency-3.14.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
31
- fosslight_dependency-3.14.0.dist-info/entry_points.txt,sha256=e1QZbnCrQvfbwe9L6PxXnkRZMhl-PSo0QyUes0dGjU8,91
32
- fosslight_dependency-3.14.0.dist-info/top_level.txt,sha256=Jc0V7VcVCH0TEM8ksb8dwroTYz4AmRaQnlr3FB71Hcs,21
33
- fosslight_dependency-3.14.0.dist-info/RECORD,,