Beispiel #1
0
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) == []
Beispiel #2
0
 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'],
     )
Beispiel #3
0
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) == []
Beispiel #4
0
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)
Beispiel #5
0
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} &ndash; GRASS GIS Kepler.gl</title>",
            )
            line = line.replace("Kepler.gl Jupyter", title)
            file.write(line)
Beispiel #7
0
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} &ndash; Campus Research Reopening Map"
                " by NCSU CGA</title>",
            )
            line = line.replace("Kepler.gl Jupyter",
                                "Kepler.gl Map by NCSU CGA")
            file.write(line)
Beispiel #8
0
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()
Beispiel #9
0
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
Beispiel #10
0
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()
Beispiel #11
0
 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()
Beispiel #12
0
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) == []
Beispiel #13
0
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")
Beispiel #14
0
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() == ""
Beispiel #15
0
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() == ""
Beispiel #16
0
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
Beispiel #17
0
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='')
Beispiel #18
0
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
Beispiel #19
0
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()
Beispiel #20
0
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
Beispiel #21
0
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
Beispiel #22
0
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")
Beispiel #23
0
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()
Beispiel #24
0
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
Beispiel #25
0
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) == []
Beispiel #26
0
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
Beispiel #27
0
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()
Beispiel #28
0
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
Beispiel #29
0
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))
Beispiel #30
0
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"