@@ -95,12 +95,12 @@ def assemble(cls, package_data, resource, codebase):
9595 root = package_resource .parent (codebase )
9696 if root :
9797 for npm_res in cls .walk_npm (resource = root , codebase = codebase ):
98- if package_uid not in npm_res .for_packages :
98+ if package_uid and package_uid not in npm_res .for_packages :
9999 npm_res .for_packages .append (package_uid )
100100 npm_res .save (codebase )
101101 yield npm_res
102102 elif codebase .has_single_resource :
103- if package_uid not in package_resource .for_packages :
103+ if package_uid and package_uid not in package_resource .for_packages :
104104 package_resource .for_packages .append (package_uid )
105105 package_resource .save (codebase )
106106 yield package_resource
@@ -119,7 +119,7 @@ def assemble(cls, package_data, resource, codebase):
119119 if lock_file .name in lockfile_names :
120120 yield from yield_dependencies_from_package_resource (lock_file , package_uid )
121121
122- if package_uid not in lock_file .for_packages :
122+ if package_uid and package_uid not in lock_file .for_packages :
123123 lock_file .for_packages .append (package_uid )
124124 lock_file .save (codebase )
125125 yield lock_file
@@ -226,8 +226,7 @@ def parse(cls, location):
226226
227227 if not package .download_url :
228228 # Only add a synthetic download URL if there is none from the dist mapping.
229- dnl_url = npm_download_url (package .namespace , package .name , package .version )
230- package .download_url = dnl_url .strip ()
229+ package .download_url = npm_download_url (package .namespace , package .name , package .version )
231230
232231 # licenses are a tad special with many different data structures
233232 lic = package_data .get ('license' )
@@ -781,12 +780,15 @@ def npm_homepage_url(namespace, name, registry='https://www.npmjs.com/package'):
781780
782781 >>> expected = 'https://yarnpkg.com/en/package/@ang/angular'
783782 >>> assert npm_homepage_url('@ang', 'angular', 'https://yarnpkg.com/en/package') == expected
783+
784+ >>> assert not npm_homepage_url(None, None)
784785 """
785- if namespace :
786- ns_name = f'{ namespace } /{ name } '
787- else :
788- ns_name = name
789- return f'{ registry } /{ ns_name } '
786+ if name :
787+ if namespace :
788+ ns_name = f'{ namespace } /{ name } '
789+ else :
790+ ns_name = name
791+ return f'{ registry } /{ ns_name } '
790792
791793
792794def npm_download_url (namespace , name , version , registry = 'https://registry.npmjs.org' ):
@@ -803,13 +805,15 @@ def npm_download_url(namespace, name, version, registry='https://registry.npmjs.
803805
804806 >>> expected = 'https://registry.npmjs.org/angular/-/angular-1.6.6.tgz'
805807 >>> assert npm_download_url(None, 'angular', '1.6.6') == expected
806- """
807- if namespace :
808- ns_name = f'{ namespace } /{ name } '
809808
810- else :
811- ns_name = name
812- return f'{ registry } /{ ns_name } /-/{ name } -{ version } .tgz'
809+ >>> assert not npm_download_url(None, None, None)
810+ """
811+ if name and version :
812+ if namespace :
813+ ns_name = f'{ namespace } /{ name } '
814+ else :
815+ ns_name = name
816+ return f'{ registry } /{ ns_name } /-/{ name } -{ version } .tgz'
813817
814818
815819def npm_api_url (namespace , name , version = None , registry = 'https://registry.npmjs.org' ):
@@ -827,20 +831,25 @@ def npm_api_url(namespace, name, version=None, registry='https://registry.npmjs.
827831 >>> assert result == 'https://registry.yarnpkg.com/@invisionag%2feslint-config-ivx'
828832
829833 >>> assert npm_api_url(None, 'angular', '1.6.6') == 'https://registry.npmjs.org/angular/1.6.6'
834+
835+ >>> assert not npm_api_url(None, None, None)
830836 """
831- version = version or ''
832- if namespace :
833- # this is a legacy wart: older registries used to always encode this /
834- # FIXME: do NOT encode and use plain / instead
835- ns_name = '%2f' .join ([namespace , name ])
836- # there is no version-specific URL for scoped packages
837- version = ''
838- else :
839- ns_name = name
837+ if name :
838+ if namespace :
839+ # this is a legacy wart: older registries used to always encode this /
840+ # FIXME: do NOT encode and use plain / instead
841+ ns_name = '%2f' .join ([namespace , name ])
842+ # there is no version-specific URL for scoped packages
843+ version = ''
844+ else :
845+ ns_name = name
846+
847+ if version :
848+ version = f'/{ version } '
849+ else :
850+ version = ''
840851
841- if version :
842- version = f'/{ version } '
843- return f'{ registry } /{ ns_name } { version } '
852+ return f'{ registry } /{ ns_name } { version } '
844853
845854
846855def is_scoped_package (name ):
0 commit comments