@@ -80,7 +80,7 @@ def _fetch_packages():
8080 """Does the actual package list fetch, returns a list of unicode names"""
8181 sublime .status_message ("requirements.txt: listing packages..." )
8282 packages = ServerProxy (get_pip_index ()).list_packages ()
83- sublime .status_message ("requirements.txt: got {}" .format (len (packages )))
83+ sublime .status_message ("requirements.txt: got {count }" .format (count = len (packages )))
8484 if not isinstance (packages [0 ], unicode_type ):
8585 packages = [pkg .decode ("utf-8" ) for pkg in packages ]
8686 CACHE .set ("--packages--" , packages , ttl = 5 * 60 )
@@ -148,6 +148,14 @@ def run(self):
148148 sublime .status_message ("requirements.txt: cache cleared" )
149149
150150
151+ def normalized_name (package_line ):
152+ """Remove extras from package name"""
153+ lower = package_line .lower ()
154+ extras_match = re .search (r'\[(.*)\]' , package_line )
155+ extras = extras_match .group (1 ) if extras_match else None
156+ return re .sub (r'\[.*\]' , "" , lower ), extras
157+
158+
151159class RequirementsAutoVersion (sublime_plugin .TextCommand ):
152160 def run (self , edit , strict = False ):
153161 if not requirements_view (self .view ):
@@ -157,26 +165,30 @@ def run(self, edit, strict=False):
157165 pkg_dict = dict (((name .lower (), name ) for name in packages ))
158166
159167 for line_sel , line in self .selected_lines ():
160- lower_pkg_name = self .package_name (line ). lower ( )
168+ lower_pkg_name , extras = normalized_name ( self .package_name (line ))
161169 if lower_pkg_name not in pkg_dict :
162170 continue
163171 real_name = pkg_dict [lower_pkg_name ]
164172 sorted_releases = releases (real_name )
173+ if extras :
174+ full_name = "{name}[{extras}]" .format (name = real_name , extras = extras )
175+ else :
176+ full_name = real_name
165177
166178 most_recent = sorted_releases [- 1 ]
167179 if strict :
168180 version_string = self .strict_version (most_recent )
169181 else :
170182 version_string = self .non_strict_version (most_recent )
171183
172- self .view .replace (edit , line_sel , real_name + version_string )
184+ self .view .replace (edit , line_sel , full_name + version_string )
173185
174186 def strict_version (self , most_recent ):
175187 return "==" + most_recent
176188
177189 def non_strict_version (self , most_recent ):
178190 next_major = str (int (most_recent .split ("." , 1 )[0 ]) + 1 )
179- next_version = "." .join ([next_major ] + ["0" for x in most_recent .split ("." )[1 :]])
191+ next_version = "." .join ([next_major ] + ["0" for _ in most_recent .split ("." )[1 :]])
180192 return ">=%s,<%s" % (most_recent , next_version )
181193
182194 def package_name (self , line ):
0 commit comments