def test_nonexistent(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") fp = InPlace(str(p), delay_open=True) with pytest.raises(EnvironmentError): fp.open() assert pylistdir(tmpdir) == []
def end_initial_dev(self): # Idempotent # Set repostatus to "Active": self.log('Advancing repostatus ...') with InPlace(self.directory / 'README.rst', mode='t', encoding='utf-8')\ as fp: for para in read_paragraphs(fp): if para.splitlines()[0] == ( '.. image:: http://www.repostatus.org/badges/latest/wip.svg' ): print(ACTIVE_BADGE, file=fp) else: print(para, file=fp, end='') # Set "Development Status" classifier to "Beta" or higher: self.log('Advancing Development Status classifier ...') with InPlace(self.directory / 'setup.cfg', mode='t', encoding='utf-8') \ as fp: matched = False for line in fp: if re.match(r'^\s*#?\s*Development Status :: [123] ', line): continue elif re.match(r'^\s*#?\s*Development Status :: [4567] ', line) \ and not matched: matched = True line = line.replace('#', '', 1) print(line, file=fp, end='') self.log('Updating GitHub topics ...') ### TODO: Check that the repository has topics first? self.update_gh_topics( add=['available-on-pypi'], remove=['work-in-progress'], )
def test_move_first_nonexistent_backup_ext(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") fp = InPlace(str(p), backup_ext="~", move_first=True, delay_open=True) with pytest.raises(EnvironmentError): fp.open() assert pylistdir(tmpdir) == []
def isort(dirpath, git): log("Adding isort to .pre-commit-config.yaml ...") with InPlace(dirpath / ".pre-commit-config.yaml") as fp: for para in read_paragraphs(fp): fp.write( re.sub(r"^\s*- flake8-import-order-jwodder\n", "", para, flags=re.M)) if "https://github.com/psf/black" in para: fp.write(PRE_COMMIT_ISORT) toxpath = dirpath / "tox.ini" if toxpath.exists(): log("Adding [isort] to tox.ini ...") with InPlace(toxpath) as fp: in_flake8 = False known_first_party = None for line in fp: if line.strip() == "flake8-import-order-jwodder": continue if line.strip() == "import-order-style = jwodder": continue if m := re.fullmatch( r"application-import-names = \w+(?:,([\w,]+))?", line.strip()): known_first_party = m[1] continue if line.strip() == "[flake8]": in_flake8 = True elif in_flake8 and line.startswith("["): insertion = ISORT_CFG + "\n" if known_first_party: insertion = re.sub( r"^(?=lines_between_sections)", f"known_first_party = {known_first_party}\n", insertion, flags=re.M, ) fp.write(insertion) in_flake8 = False fp.write(line) if in_flake8: insertion = "\n" + ISORT_CFG if known_first_party: insertion = re.sub( r"^(?=lines_between_sections)", f"known_first_party = {known_first_party}\n", insertion, flags=re.M, ) fp.write(insertion)
def test_move_first_with_nonexistent_backup_ext(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") with pytest.raises(EnvironmentError): with InPlace(str(p), backup_ext="~", move_first=True): assert False assert pylistdir(tmpdir) == []
def write_html(geojson_file, data_id, output_html, config, title): """Write Kepler.gl HTML and update its content""" # Lazy load non-standard dependencies to play nicely in cases # when only interface description is requested and the module # actually does not run. try: # pylint: disable=import-outside-toplevel from keplergl import KeplerGl from in_place import InPlace except ImportError as error: gs.fatal( _("Missing mandatory keplergl or in_place dependencies: {error}"). format(error=error)) # Useful to examine the resulting configuration # print("Using configuration (JSON syntax):") # print(json.dumps(config, indent=2)) kepler = KeplerGl(config=config) kepler.add_data(data=open(geojson_file).read(), name=data_id) kepler.save_to_html(file_name=output_html) # Add map title and creator with InPlace(output_html) as file: for line in file: line = line.replace( "<title>Kepler.gl</title>", f"<title>{title} – GRASS GIS Kepler.gl</title>", ) line = line.replace("Kepler.gl Jupyter", title) file.write(line)
def main(): column_short = sys.argv[1] column_long = sys.argv[2] config_file = "keplergl_config.json" data_id = "buildings" config = read_configuration(config_file, label="Buildings", data_id=data_id, color_column=column_long) print("Using configuration (JSON syntax):") print(json.dumps(config, indent=2)) kepler = KeplerGl(config=config) kepler.add_data(data=open("buildings.geojson").read(), name=data_id) output = f"keplergl_{column_short}.html" kepler.save_to_html(file_name=output) name = column_long.replace("_", " ") # Add map title and creator with InPlace(output) as file: for line in file: line = line.replace( "<title>Kepler.gl</title>", f"<title>{name} – Campus Research Reopening Map" " by NCSU CGA</title>", ) line = line.replace("Kepler.gl Jupyter", "Kepler.gl Map by NCSU CGA") file.write(line)
def test_latin1_as_utf8(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write_text(UNICODE, "latin-1") with InPlace(str(p), "t", encoding="utf-8") as fp: with pytest.raises(UnicodeDecodeError): fp.read()
def test_bad_mode_delay_open_open(tmpdir, move_first, backup): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) fp = InPlace( str(p), mode="q", delay_open=True, move_first=move_first, backup=tmpdir.join(backup) if backup is not None else None, ) with pytest.raises(ValueError, match="invalid mode"): fp.open() assert fp.closed assert pylistdir(tmpdir) == ["file.txt"] assert p.read() == TEXT
def test_symlink_backup(tmp_path): assert list(tmp_path.iterdir()) == [] realdir = tmp_path / "real" realdir.mkdir() real = realdir / "realfile.txt" real.write_text(TEXT) linkdir = tmp_path / "link" linkdir.mkdir() link = linkdir / "linkfile.txt" target = relpath(real, linkdir) link.symlink_to(target) bkp = tmp_path / "backup.txt" with InPlace(str(link), backup=str(bkp)) as fp: for line in fp: fp.write(line.swapcase()) assert sorted(tmp_path.iterdir(), key=attrgetter("name")) == [ bkp, linkdir, realdir, ] assert list(realdir.iterdir()) == [real] assert list(linkdir.iterdir()) == [link] assert link.is_symlink() assert os.readlink(str(link)) == target assert bkp.read_text() == TEXT assert link.read_text() == TEXT.swapcase() assert real.read_text() == TEXT.swapcase()
def end_dev(self): # Idempotent self.log('Finalizing version ...') # Remove prerelease & dev release from __version__ self.version = re.sub(r'(a|b|rc)\d+|\.dev\d+', '', self.version) # Set release date in CHANGELOG self.log('Updating CHANGELOG ...') chlog = self.changelog if chlog: chlog.sections[0].date = today() self.changelog = chlog # Update year ranges in LICENSE self.log('Ensuring LICENSE copyright line is up to date ...') ensure_license_years( self.directory / 'LICENSE', [time.localtime().tm_year], ) # Update year ranges in docs/conf.py docs_conf = self.directory / 'docs' / 'conf.py' if docs_conf.exists(): self.log('Ensuring docs/conf.py copyright is up to date ...') with InPlace(docs_conf, mode='t', encoding='utf-8') as fp: for line in fp: m = re.match(r'^copyright\s*=\s*[\x27"](\d[-,\d\s]+\d) \w+', line) if m: line = line[:m.start(1)]+update_years2str(m.group(1)) \ + line[m.end(1):] print(line, file=fp, end='') if not chlog: # Initial release self.end_initial_dev()
def test_with_nonexistent(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") with pytest.raises(EnvironmentError): with InPlace(str(p)): assert False assert pylistdir(tmpdir) == []
def blacken(dirpath, git): if (dirpath / "tox.ini").exists(): log("Updating ignore rules in tox.ini ...") in_ignore = False after_select = False with InPlace(dirpath / "tox.ini") as fp: for line in fp: if line.startswith("select ="): after_select = True elif after_select: if not line.strip(): line = "" after_select = False if line.startswith("ignore ="): line = "ignore = B005,E203,E262,E266,E501,I201,W503\n" in_ignore = True elif in_ignore: if line.startswith(" "): line = "" else: in_ignore = False fp.write(line) if not (dirpath / ".pre-commit-config.yaml").exists(): log("Adding .pre-commit-config.yaml ...") (dirpath / ".pre-commit-config.yaml").write_text(PRE_COMMIT_CONFIG) if git: runcmd("pre-commit", "install", cwd=dirpath) # No check, as it fails when black reformats: subprocess.run(["pre-commit", "run", "-a"], cwd=dirpath) runcmd("git", "add", "-u", cwd=dirpath) runcmd("git", "add", ".pre-commit-config.yaml", cwd=dirpath) commit(dirpath, "Go black")
def test_move_first_pass_nobackup(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) with InPlace(str(p), move_first=True): pass assert pylistdir(tmpdir) == ["file.txt"] assert p.read() == ""
def test_readlines_nobackup(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) with InPlace(str(p)) as fp: assert fp.readlines() == TEXT.splitlines(True) assert pylistdir(tmpdir) == ["file.txt"] assert p.read() == ""
def test_empty_backup_ext(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) with pytest.raises(ValueError): InPlace(str(p), backup_ext="") assert pylistdir(tmpdir) == ["file.txt"] assert p.read() == TEXT
def ensure_license_years(filepath, years: 'list[int]'): with InPlace(filepath, mode='t', encoding='utf-8') as fp: for line in fp: m = re.match(r'^Copyright \(c\) (\d[-,\d\s]+\d) \w+', line) if m: line = line[:m.start(1)] + update_years2str(m.group(1), years) \ + line[m.end(1):] print(line, file=fp, end='')
def test_backup_ext_and_backup(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) bkp = tmpdir.join("backup.txt") with pytest.raises(ValueError): InPlace(str(p), backup=str(bkp), backup_ext="~") assert pylistdir(tmpdir) == ["file.txt"] assert p.read() == TEXT
def test_readline_nobackup(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) with InPlace(str(p)) as fp: for line in iter(fp.readline, ""): fp.write(line.swapcase()) assert pylistdir(tmpdir) == ["file.txt"] assert p.read() == TEXT.swapcase()
def test_move_first_backup_nosuchdir(tmpdir): """ Assert that using a path to a file in a nonexistent directory as the backup path raises an error when opening """ assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) fp = InPlace( str(p), backup=str(tmpdir.join("nonexistent", "backup.txt")), move_first=True, delay_open=True, ) with pytest.raises(EnvironmentError): fp.open() assert pylistdir(tmpdir) == ["file.txt"] assert p.read() == TEXT
def test_bad_mode(tmpdir, move_first, backup): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) backup_path = tmpdir.join(backup) if backup is not None else None with pytest.raises(ValueError, match="invalid mode"): InPlace(str(p), mode="q", move_first=move_first, backup=backup_path) assert pylistdir(tmpdir) == ["file.txt"] assert p.read() == TEXT
def update_mypy(dirpath, git): if (dirpath / "tox.ini").exists(): log("Updating mypy version ...") with InPlace(dirpath / "tox.ini") as fp: for line in fp: fp.write(re.sub(r"^ mypy\s*~=.*", " mypy~=0.900", line)) if git: runcmd("git", "add", "tox.ini", cwd=dirpath) commit(dirpath, "Update mypy version")
def test_early_close_nobackup(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) with InPlace(str(p)) as fp: for line in fp: fp.write(line.swapcase()) fp.close() assert pylistdir(tmpdir) == ["file.txt"] assert p.read() == TEXT.swapcase()
def test_writelines_backup(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write("") bkp = tmpdir.join("backup.txt") with InPlace(str(p), backup=str(bkp)) as fp: fp.writelines(TEXT.splitlines(True)) assert pylistdir(tmpdir) == ["backup.txt", "file.txt"] assert bkp.read() == "" assert p.read() == TEXT
def test_move_first_delete_nobackup(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) with InPlace(str(p), move_first=True) as fp: for i, line in enumerate(fp): fp.write(line.swapcase()) if i == 5: p.remove() assert pylistdir(tmpdir) == []
def test_move_first_rollback_nobackup(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) with InPlace(str(p), move_first=True) as fp: for line in fp: fp.write(line.swapcase()) fp.rollback() assert pylistdir(tmpdir) == ["file.txt"] assert p.read() == TEXT
def test_move_first_backup_ext(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write(TEXT) with InPlace(str(p), backup_ext="~", move_first=True) as fp: for line in fp: fp.write(line.swapcase()) assert pylistdir(tmpdir) == ["file.txt", "file.txt~"] assert p.new(ext="txt~").read() == TEXT assert p.read() == TEXT.swapcase()
def test_bytes_iconv_nobackup(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write_text(UNICODE, "utf-8") with InPlace(str(p), "b") as fp: txt = fp.read() assert isinstance(txt, bytes) assert txt == b"\xc3\xa5\xc3\xa9\xc3\xae\xc3\xb8\xc3\xbc" + NLB fp.write(txt.decode("utf-8").encode("latin-1")) assert pylistdir(tmpdir) == ["file.txt"] assert p.read_binary() == b"\xE5\xE9\xEE\xF8\xFC" + NLB
def test_bytes_useless_after_close(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write_text(UNICODE, "utf-8") with InPlace(str(p), "b", backup_ext="~") as fp: assert not fp.closed assert fp.closed with pytest.raises(ValueError): fp.readall() with pytest.raises(ValueError): fp.readinto(bytearray(42))
def test_utf8_nobackup(tmpdir): assert pylistdir(tmpdir) == [] p = tmpdir.join("file.txt") p.write_text(UNICODE, "utf-8") with InPlace(str(p), "t", encoding="utf-8") as fp: txt = fp.read() assert isinstance(txt, str) assert txt == UNICODE fp.write(normalize("NFD", txt)) assert pylistdir(tmpdir) == ["file.txt"] assert p.read_text("utf-8") == "a\u030Ae\u0301i\u0302\xF8u\u0308\n"