def test_std_error(self, safer_writer): for file in (sys.stdout, sys.stderr, None): with safer_writer(file) as fp: fp.write('boo') with self.assertRaises(ValueError) as m: safer.writer(file, close_on_exit=True) assert m.exception.args[0] == 'You cannot close stdout or stderr'
def test_create_parent(self): with TemporaryDirectory() as td: filename = td + '/foo/test.txt' with self.assertRaises(OSError): with safer.writer(filename): pass with safer.writer(filename, create_parent=True) as fp: fp.write('hello') assert read_text(filename) == 'hello'
def test_copy(self): with TemporaryDirectory() as td: filename = td + '/test.txt' write_text(filename, 'c') with safer.writer(filename, 'a') as fp: fp.write('hello') assert read_text(filename) == 'chello'
def write(self): manfile = (dirs.MAN / self.command).with_suffix('.1') with safer.writer(manfile) as self.fp: self._print(HEADER.format(**vars(self))) for field in FIELDS: if field in self.sections: self._write_field(field)
def write(self, fp): if isinstance(fp, (str, Path)): with safer.writer(fp) as fp2: return self.write(fp2) for i in (self.header, *self.lines): print(json.dumps(i), file=fp)
def test_error_with_copy(self): with TemporaryDirectory() as td: filename = td + '/test.txt' write_text(filename, 'hello') with self.assertRaises(ValueError): with safer.writer(filename, 'a') as fp: fp.write('GONE') raise ValueError assert read_text(filename) == 'hello'
def test_file_perms(self): with TemporaryDirectory() as td: filename = td + '/test.txt' write_text(td + '/test2.txt', 'hello') with safer.writer(filename) as fp: fp.write('hello') assert read_text(filename) == 'hello' mode = os.stat(filename).st_mode assert mode in (0o100664, 0o100644) new_mode = mode & 0o100770 os.chmod(filename, new_mode) with safer.writer(filename) as fp: fp.write('bye') assert read_text(filename) == 'bye' assert os.stat(filename).st_mode == new_mode with safer.writer(filename, 'a') as fp: fp.write(' there') assert read_text(filename) == 'bye there' assert os.stat(filename).st_mode == new_mode
def test_two_errors(self): with TemporaryDirectory() as td: filename = td + '/test.txt' write_text(filename, 'hello') before = set(os.listdir(td)) with self.assertRaises(ValueError): with safer.writer(filename) as fp: fp.write('GONE') raise ValueError assert read_text(filename) == 'hello' after = set(os.listdir(td)) assert before == after with self.assertRaises(ValueError): with safer.writer(filename, delete_failures=False) as fp: fp.write('GONE') raise ValueError assert read_text(filename) == 'hello' after = set(os.listdir(td)) assert len(before) + 1 == len(after) assert len(after.difference(before)) == 1 with safer.writer(filename) as fp: fp.write('OK!') after = set(os.listdir(td)) assert len(before) + 2 == len(after) assert len(after.difference(before)) == 2 assert read_text(filename) == 'OK!' after = set(os.listdir(td)) assert len(before) + 1 == len(after) assert len(after.difference(before)) == 1
def main(commands): with safer.writer(README) as fp: print('gitz commands', file=fp) print('-------------', file=fp) for command, help in commands.items(): print(file=fp) print(LINK.format(command), file=fp) summary = help[help['COMMAND'].replace('git-', 'git ')] for s in summary: print(' ', s.strip(), file=fp) print(file=fp) print(HOME_LINK, file=fp) print('=' * len(HOME_LINK), file=fp)
def main(commands): with safer.writer(README) as fp: all_movie_url = upload.all_movie_url() for line in open(README): ls = line.strip() if ls.startswith(TAIL_TAG): _tail(fp, _sort_by_danger(commands)) return # Everything after this tag is ignored. if ls.startswith(IMAGE_TAG): fp.write('%s %s.png\n' % (IMAGE_TAG, all_movie_url)) elif ls.startswith(TARGET_TAG.strip()): _, query = ls.split('?') fp.write('%s %s?%s\n' % (TARGET_TAG, all_movie_url, query)) else: fp.write(line)
def doks( source=None, target=None, auto=False, command=False, force=False, window=None, verbose=False, ): """ Write documentation for a file or module. Returns True if `target` was written, and False if it was unchanged. ARGUMENTS source path to the Python file or module. target path to the output file or `None`, in which case output is printed to stdout auto If true, automatically guess both source and target files command If true, use command line help from executing source file force If true, write .rst documentation even if it is malformed verbose Emit more print messages """ if auto: source = source or _guess_source() target = target or README elif not source: raise ValueError('Source must be set if --auto/-a is not used') if window is None: window = render.ERROR_WINDOW if command: lines = from_command.from_command(source) else: lines = from_file.from_file(source) lines = list(lines) if lines and lines[-1]: lines.append('') lines.append(_DOKS_MSG % _timestamp()) body = '\n'.join(lines) + '\n' if not (render.render(body, window) or force): raise ValueError(f'The .rst code in {source} is malformed') if not target: print(body) return True p = Path(target) written = 'rewritten' if p.exists() else 'written' if p.exists() and p.read_text().splitlines()[:-1] == lines[:-1]: print(f'{target} unchanged', file=sys.stderr) return False with safer.writer(target) as fp: fp.write(body) print(f'{target} {written}', file=sys.stderr) return True
def test_read(self): with TemporaryDirectory() as td: filename = td + '/test.txt' write_text(filename, 'hello') with safer.writer(filename, 'r+') as fp: assert fp.read() == 'hello'
def test_simple(self): with TemporaryDirectory() as td: filename = td + '/test.txt' with safer.writer(filename) as fp: fp.write('hello') assert read_text(filename) == 'hello'
def test_int_filename(self): with self.assertRaises(IOError) as m: with safer.writer(1) as fp: fp.write('hello') assert m.exception.args[0] == '`file` argument must be a string'
async def record_to(self, target=None, cast=None): await self.record(cast) with safer.writer(target) as fp: self.cast.write(fp)