2020-05-19T15:21:54.9454056Z =================================== FAILURES ===================================
2020-05-19T15:21:54.9457168Z ________________ Test_FSManager_smb_docker_share.testWriteRead _________________
2020-05-19T15:21:54.9457788Z
2020-05-19T15:21:54.9462901Z self = <fs-registry ['userdata', 'userconf', 'sitedata', 'siteconf', 'usercache', 'userlog', 'ftp', 'mem', 'file', 'osfs', 'tar', 'temp', 'zip', 'cifs', 'smb', 's3', 'minio']>
2020-05-19T15:21:54.9464547Z protocol = 'smb'
2020-05-19T15:21:54.9464922Z
2020-05-19T15:21:54.9468130Z def get_opener(self, protocol):
2020-05-19T15:21:54.9469069Z # type: (Text) -> Opener
2020-05-19T15:21:54.9471024Z """Get the opener class associated to a given protocol.
2020-05-19T15:21:54.9471317Z
2020-05-19T15:21:54.9471502Z Arguments:
2020-05-19T15:21:54.9485527Z protocol (str): A filesystem protocol.
2020-05-19T15:21:54.9485974Z
2020-05-19T15:21:54.9486207Z Returns:
2020-05-19T15:21:54.9486494Z Opener: an opener instance.
2020-05-19T15:21:54.9486890Z
2020-05-19T15:21:54.9487070Z Raises:
2020-05-19T15:21:54.9487506Z ~fs.opener.errors.UnsupportedProtocol: If no opener
2020-05-19T15:21:54.9487984Z could be found for the given protocol.
2020-05-19T15:21:54.9488478Z EntryPointLoadingError: If the returned entry point
2020-05-19T15:21:54.9488968Z is not an `Opener` subclass or could not be loaded
2020-05-19T15:21:54.9489722Z successfully.
2020-05-19T15:21:54.9490057Z
2020-05-19T15:21:54.9490253Z """
2020-05-19T15:21:54.9490599Z protocol = protocol or self.default_opener
2020-05-19T15:21:54.9490962Z
2020-05-19T15:21:54.9491199Z if self.load_extern:
2020-05-19T15:21:54.9491450Z entry_point = next(
2020-05-19T15:21:54.9492011Z pkg_resources.iter_entry_points("fs.opener", protocol), None
2020-05-19T15:21:54.9492411Z )
2020-05-19T15:21:54.9505060Z else:
2020-05-19T15:21:54.9505520Z entry_point = None
2020-05-19T15:21:54.9505843Z
2020-05-19T15:21:54.9506452Z # If not entry point was loaded from the extensions, try looking
2020-05-19T15:21:54.9506924Z # into the registered protocols
2020-05-19T15:21:54.9507394Z if entry_point is None:
2020-05-19T15:21:54.9507840Z if protocol in self._protocols:
2020-05-19T15:21:54.9508703Z opener_instance = self._protocols[protocol]
2020-05-19T15:21:54.9509137Z else:
2020-05-19T15:21:54.9509499Z raise UnsupportedProtocol(
2020-05-19T15:21:54.9510341Z "protocol '{}' is not supported".format(protocol)
2020-05-19T15:21:54.9510829Z )
2020-05-19T15:21:54.9511171Z
2020-05-19T15:21:54.9511483Z # If an entry point was found in an extension, attempt to load it
2020-05-19T15:21:54.9511793Z else:
2020-05-19T15:21:54.9512015Z try:
2020-05-19T15:21:54.9512374Z > opener = entry_point.load()
2020-05-19T15:21:54.9512690Z
2020-05-19T15:21:54.9513362Z /opt/hostedtoolcache/Python/3.7.7/x64/lib/python3.7/site-packages/fs/opener/registry.py:134:
2020-05-19T15:21:54.9513820Z _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2020-05-19T15:21:54.9514093Z
2020-05-19T15:21:54.9514796Z self = EntryPoint.parse('smb = fs.opener.smbfs:SMBOpener'), require = True
2020-05-19T15:21:54.9515287Z args = (), kwargs = {}
2020-05-19T15:21:54.9515583Z
2020-05-19T15:21:54.9515881Z def load(self, require=True, *args, **kwargs):
2020-05-19T15:21:54.9516152Z """
2020-05-19T15:21:54.9516437Z Require packages for this EntryPoint, then resolve it.
2020-05-19T15:21:54.9516695Z """
2020-05-19T15:21:54.9517057Z if not require or args or kwargs:
2020-05-19T15:21:54.9517522Z warnings.warn(
2020-05-19T15:21:54.9517935Z "Parameters to load are deprecated. Call .resolve and "
2020-05-19T15:21:54.9518478Z ".require separately.",
2020-05-19T15:21:54.9519005Z PkgResourcesDeprecationWarning,
2020-05-19T15:21:54.9519382Z stacklevel=2,
2020-05-19T15:21:54.9519722Z )
2020-05-19T15:21:54.9520037Z if require:
2020-05-19T15:21:54.9520394Z > self.require(*args, **kwargs)
2020-05-19T15:21:54.9520699Z
2020-05-19T15:21:54.9521361Z /opt/hostedtoolcache/Python/3.7.7/x64/lib/python3.7/site-packages/pkg_resources/__init__.py:2452:
2020-05-19T15:21:54.9521835Z _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2020-05-19T15:21:54.9522241Z
2020-05-19T15:21:54.9522868Z self = EntryPoint.parse('smb = fs.opener.smbfs:SMBOpener'), env = None
2020-05-19T15:21:54.9523326Z installer = None
2020-05-19T15:21:54.9523598Z
2020-05-19T15:21:54.9523883Z def require(self, env=None, installer=None):
2020-05-19T15:21:54.9524220Z if self.extras and not self.dist:
2020-05-19T15:21:54.9525036Z raise UnknownExtra("Can't require() without a distribution", self)
2020-05-19T15:21:54.9525466Z
2020-05-19T15:21:54.9525774Z # Get the requirements for this entry point with all its extras and
2020-05-19T15:21:54.9541288Z # then resolve them. We have to pass `extras` along when resolving so
2020-05-19T15:21:54.9541948Z # that the working set knows what extras we want. Otherwise, for
2020-05-19T15:21:54.9542784Z # dist-info distributions, the working set will assume that the
2020-05-19T15:21:54.9543393Z # requirements for that extra are purely optional and skip over them.
2020-05-19T15:21:54.9543739Z reqs = self.dist.requires(self.extras)
2020-05-19T15:21:54.9544102Z > items = working_set.resolve(reqs, env, installer, extras=self.extras)
2020-05-19T15:21:54.9544343Z
2020-05-19T15:21:54.9544973Z /opt/hostedtoolcache/Python/3.7.7/x64/lib/python3.7/site-packages/pkg_resources/__init__.py:2475:
2020-05-19T15:21:54.9545434Z _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2020-05-19T15:21:54.9545700Z
2020-05-19T15:21:54.9545932Z self = <pkg_resources.WorkingSet object at 0x7f8d27f8b610>
2020-05-19T15:21:54.9546516Z requirements = [Requirement.parse('fs~=2.2'), Requirement.parse('six~=1.10')]
2020-05-19T15:21:54.9546926Z env = None, installer = None, replace_conflicting = False, extras = ()
2020-05-19T15:21:54.9547152Z
2020-05-19T15:21:54.9547514Z def resolve(self, requirements, env=None, installer=None,
2020-05-19T15:21:54.9547902Z replace_conflicting=False, extras=None):
2020-05-19T15:21:54.9584989Z """List all distributions needed to (recursively) meet `requirements`
2020-05-19T15:21:54.9585255Z
2020-05-19T15:21:54.9586013Z `requirements` must be a sequence of ``Requirement`` objects. `env`,
2020-05-19T15:21:54.9586336Z if supplied, should be an ``Environment`` instance. If
2020-05-19T15:21:54.9586643Z not supplied, it defaults to all distributions available within any
2020-05-19T15:21:54.9586986Z entry or distribution in the working set. `installer`, if supplied,
2020-05-19T15:21:54.9587409Z will be invoked with each requirement that cannot be met by an
2020-05-19T15:21:54.9588031Z already-installed distribution; it should return a ``Distribution`` or
2020-05-19T15:21:54.9588404Z ``None``.
2020-05-19T15:21:54.9588663Z
2020-05-19T15:21:54.9588917Z Unless `replace_conflicting=True`, raises a VersionConflict exception
2020-05-19T15:21:54.9589190Z if
2020-05-19T15:21:54.9589440Z any requirements are found on the path that have the correct name but
2020-05-19T15:21:54.9589797Z the wrong version. Otherwise, if an `installer` is supplied it will be
2020-05-19T15:21:54.9590173Z invoked to obtain the correct version of the requirement and activate
2020-05-19T15:21:54.9590422Z it.
2020-05-19T15:21:54.9590563Z
2020-05-19T15:21:54.9590820Z `extras` is a list of the extras to be used with these requirements.
2020-05-19T15:21:54.9591168Z This is important because extra requirements may look like `my_req;
2020-05-19T15:21:54.9591515Z extra = "my_extra"`, which would otherwise be interpreted as a purely
2020-05-19T15:21:54.9592114Z optional requirement. Instead, we want to be able to assert that these
2020-05-19T15:21:54.9592371Z requirements are truly required.
2020-05-19T15:21:54.9592545Z """
2020-05-19T15:21:54.9592688Z
2020-05-19T15:21:54.9592832Z # set up the stack
2020-05-19T15:21:54.9593230Z requirements = list(requirements)[::-1]
2020-05-19T15:21:54.9593492Z # set of processed requirements
2020-05-19T15:21:54.9593677Z processed = {}
2020-05-19T15:21:54.9593967Z # key -> dist
2020-05-19T15:21:54.9594124Z best = {}
2020-05-19T15:21:54.9594301Z to_activate = []
2020-05-19T15:21:54.9594439Z
2020-05-19T15:21:54.9594590Z req_extras = _ReqExtras()
2020-05-19T15:21:54.9627919Z
2020-05-19T15:21:54.9628310Z # Mapping of requirement to set of distributions that required it;
2020-05-19T15:21:54.9628722Z # useful for reporting info about conflicts.
2020-05-19T15:21:54.9629107Z required_by = collections.defaultdict(set)
2020-05-19T15:21:54.9629317Z
2020-05-19T15:21:54.9629488Z while requirements:
2020-05-19T15:21:54.9630112Z # process dependencies breadth-first
2020-05-19T15:21:54.9634988Z req = requirements.pop(0)
2020-05-19T15:21:54.9635435Z if req in processed:
2020-05-19T15:21:54.9635807Z # Ignore cyclic or redundant dependencies
2020-05-19T15:21:54.9636173Z continue
2020-05-19T15:21:54.9636408Z
2020-05-19T15:21:54.9636603Z if not req_extras.markers_pass(req, extras):
2020-05-19T15:21:54.9636828Z continue
2020-05-19T15:21:54.9636979Z
2020-05-19T15:21:54.9637128Z dist = best.get(req.key)
2020-05-19T15:21:54.9637320Z if dist is None:
2020-05-19T15:21:54.9637570Z # Find the best distribution and add it to the map
2020-05-19T15:21:54.9637815Z dist = self.by_key.get(req.key)
2020-05-19T15:21:54.9638110Z if dist is None or (dist not in req and replace_conflicting):
2020-05-19T15:21:54.9638519Z ws = self
2020-05-19T15:21:54.9638849Z if env is None:
2020-05-19T15:21:54.9639188Z if dist is None:
2020-05-19T15:21:54.9639608Z env = Environment(self.entries)
2020-05-19T15:21:54.9639863Z else:
2020-05-19T15:21:54.9640148Z # Use an empty environment and workingset to avoid
2020-05-19T15:21:54.9640503Z # any further conflicts with the conflicting
2020-05-19T15:21:54.9640786Z # distribution
2020-05-19T15:21:54.9641032Z env = Environment([])
2020-05-19T15:21:54.9641305Z ws = WorkingSet([])
2020-05-19T15:21:54.9641571Z dist = best[req.key] = env.best_match(
2020-05-19T15:21:54.9642056Z req, ws, installer,
2020-05-19T15:21:54.9642327Z replace_conflicting=replace_conflicting
2020-05-19T15:21:54.9642647Z )
2020-05-19T15:21:54.9642833Z if dist is None:
2020-05-19T15:21:54.9643093Z requirers = required_by.get(req, None)
2020-05-19T15:21:54.9643358Z raise DistributionNotFound(req, requirers)
2020-05-19T15:21:54.9643714Z to_activate.append(dist)
2020-05-19T15:21:54.9644062Z if dist not in req:
2020-05-19T15:21:54.9644455Z # Oops, the "best" so far conflicts with a dependency
2020-05-19T15:21:54.9644742Z dependent_req = required_by[req]
2020-05-19T15:21:54.9645058Z > raise VersionConflict(dist, req).with_context(dependent_req)
2020-05-19T15:21:54.9646012Z E pkg_resources.VersionConflict: (pysmb 1.2.1 (/opt/hostedtoolcache/Python/3.7.7/x64/lib/python3.7/site-packages), Requirement.parse('pysmb!=1.1.26,~=1.1.22'))
pysmb 1.2 seems to mostly be bugfixes (judging by the contents of the brief changelog), so the fix here is probably to a) upgrade the pysmb spec in setup.cfg to latest, b) switch over to a more permissive spec (eg ~=1.2
) for pysmb to prevent these issues in the future