123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- """Functions brought over from jaraco.text.
- These functions are not supposed to be used within `pip._internal`. These are
- helper functions brought over from `jaraco.text` to enable vendoring newer
- copies of `pkg_resources` without having to vendor `jaraco.text` and its entire
- dependency cone; something that our vendoring setup is not currently capable of
- handling.
- License reproduced from original source below:
- Copyright Jason R. Coombs
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to
- deal in the Software without restriction, including without limitation the
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- IN THE SOFTWARE.
- """
- import functools
- import itertools
- def _nonblank(str):
- return str and not str.startswith("#")
- @functools.singledispatch
- def yield_lines(iterable):
- r"""
- Yield valid lines of a string or iterable.
- >>> list(yield_lines(''))
- []
- >>> list(yield_lines(['foo', 'bar']))
- ['foo', 'bar']
- >>> list(yield_lines('foo\nbar'))
- ['foo', 'bar']
- >>> list(yield_lines('\nfoo\n#bar\nbaz #comment'))
- ['foo', 'baz #comment']
- >>> list(yield_lines(['foo\nbar', 'baz', 'bing\n\n\n']))
- ['foo', 'bar', 'baz', 'bing']
- """
- return itertools.chain.from_iterable(map(yield_lines, iterable))
- @yield_lines.register(str)
- def _(text):
- return filter(_nonblank, map(str.strip, text.splitlines()))
- def drop_comment(line):
- """
- Drop comments.
- >>> drop_comment('foo # bar')
- 'foo'
- A hash without a space may be in a URL.
- >>> drop_comment('http://example.com/foo#bar')
- 'http://example.com/foo#bar'
- """
- return line.partition(" #")[0]
- def join_continuation(lines):
- r"""
- Join lines continued by a trailing backslash.
- >>> list(join_continuation(['foo \\', 'bar', 'baz']))
- ['foobar', 'baz']
- >>> list(join_continuation(['foo \\', 'bar', 'baz']))
- ['foobar', 'baz']
- >>> list(join_continuation(['foo \\', 'bar \\', 'baz']))
- ['foobarbaz']
- Not sure why, but...
- The character preceeding the backslash is also elided.
- >>> list(join_continuation(['goo\\', 'dly']))
- ['godly']
- A terrible idea, but...
- If no line is available to continue, suppress the lines.
- >>> list(join_continuation(['foo', 'bar\\', 'baz\\']))
- ['foo']
- """
- lines = iter(lines)
- for item in lines:
- while item.endswith("\\"):
- try:
- item = item[:-2].strip() + next(lines)
- except StopIteration:
- return
- yield item
|