def parse_uri(uri_as_string): """ Parse the given URI from a string. Parameters ---------- uri_as_string: str The URI to parse. Returns ------- collections.namedtuple The parsed URI. Notes ----- smart_open/doctools.py magic goes here """ scheme = _sniff_scheme(uri_as_string) submodule = transport.get_transport(scheme) as_dict = submodule.parse_uri(uri_as_string) # # The conversion to a namedtuple is just to keep the old tests happy while # I'm still refactoring. # Uri = collections.namedtuple('Uri', sorted(as_dict.keys())) return Uri(**as_dict)
def _open_binary_stream(uri, mode, transport_params): """Open an arbitrary URI in the specified binary mode. Not all modes are supported for all protocols. :arg uri: The URI to open. May be a string, or something else. :arg str mode: The mode to open with. Must be rb, wb or ab. :arg transport_params: Keyword argumens for the transport layer. :returns: A named file object :rtype: file-like object with a .name attribute """ if mode not in ('rb', 'rb+', 'wb', 'wb+', 'ab', 'ab+'): # # This should really be a ValueError, but for the sake of compatibility # with older versions, which raise NotImplementedError, we do the same. # raise NotImplementedError('unsupported mode: %r' % mode) if hasattr(uri, 'read'): # simply pass-through if already a file-like # we need to return something as the file name, but we don't know what # so we probe for uri.name (e.g., this works with open() or tempfile.NamedTemporaryFile) # if the value ends with COMPRESSED_EXT, we will note it in compression_wrapper() # if there is no such an attribute, we return "unknown" - this # effectively disables any compression if not hasattr(uri, 'name'): uri.name = getattr(uri, 'name', 'unknown') return uri if not isinstance(uri, str): raise TypeError("don't know how to handle uri %r" % uri) scheme = _sniff_scheme(uri) submodule = transport.get_transport(scheme) fobj = submodule.open_uri(uri, mode, transport_params) if not hasattr(fobj, 'name'): logger.critical('TODO') fobj.name = 'unknown' return fobj
def _open_binary_stream(uri, mode, transport_params): """Open an arbitrary URI in the specified binary mode. Not all modes are supported for all protocols. :arg uri: The URI to open. May be a string, or something else. :arg str mode: The mode to open with. Must be rb, wb or ab. :arg transport_params: Keyword argumens for the transport layer. :returns: A named file object :rtype: file-like object with a .name attribute """ if mode not in ('rb', 'rb+', 'wb', 'wb+', 'ab', 'ab+'): # # This should really be a ValueError, but for the sake of compatibility # with older versions, which raise NotImplementedError, we do the same. # raise NotImplementedError('unsupported mode: %r' % mode) if isinstance(uri, int): # # We're working with a file descriptor. If we open it, its name is # just the integer value, which isn't helpful. Unfortunately, there's # no easy cross-platform way to go from a file descriptor to the filename, # so we just give up here. The user will have to handle their own # compression, etc. explicitly. # fobj = _builtin_open(uri, mode, closefd=False) return fobj if not isinstance(uri, str): raise TypeError("don't know how to handle uri %s" % repr(uri)) scheme = _sniff_scheme(uri) submodule = transport.get_transport(scheme) fobj = submodule.open_uri(uri, mode, transport_params) if not hasattr(fobj, 'name'): fobj.name = uri return fobj
def parse_uri(uri_as_string): """ Parse the given URI from a string. Parameters ---------- uri_as_string: str The URI to parse. Returns ------- collections.namedtuple The parsed URI. Notes ----- Supported URI schemes are: %(schemes)s s3, s3a and s3n are treated the same way. s3u is s3 but without SSL. Valid URI examples:: %(uri_examples)s """ scheme = _sniff_scheme(uri_as_string) submodule = transport.get_transport(scheme) as_dict = submodule.parse_uri(uri_as_string) # # The conversion to a namedtuple is just to keep the old tests happy while # I'm still refactoring. # Uri = collections.namedtuple('Uri', sorted(as_dict.keys())) return Uri(**as_dict)
def test_registry_errors_get_transport_for_module_with_missing_deps(self): register_transport('smart_open.tests.fixtures.missing_deps_transport') with pytest.raises(ImportError): get_transport("missing")