def formatted(branches, main, separator, extra): if isinstance(branches, list): branches = ','.join(branches) result = '' if main: result += setupmeta.stringify(main) if result or extra: result += setupmeta.stringify(separator) if extra: result += setupmeta.stringify(extra) if branches: result = 'branch(%s):%s' % (branches, result) return result
def bumped(self, what, current_version): """ :param str what: Which component to bump :param Version current_version: Current version :return str: Represented next version, with 'what' bumped """ if not isinstance(self.main_bits, list): setupmeta.abort("Main format is not a list: %s" % setupmeta.stringify(self.main_bits)) if what not in self.bumpable: msg = "Can't bump '%s', it's out of scope" % what msg += " of main format '%s'" % self.main msg += " acceptable values: %s" % ", ".join(self.bumpable) setupmeta.abort(msg) major, minor, rev = current_version.major, current_version.minor, current_version.patch if what == "major": major, minor, rev = (major + 1, 0, 0) elif what == "minor": major, minor, rev = (major, minor + 1, 0) elif what == "patch": major, minor, rev = (major, minor, rev + 1) next_version = Version(main="%s.%s.%s" % (major, minor, rev)) return self.rendered(next_version, extra=False)
def formatted(branches, main, extra): if isinstance(branches, list): branches = ",".join(branches) result = "" if main: result += setupmeta.stringify(main) if extra: if result: result += "+" result += setupmeta.stringify(extra) if branches: result = "branch(%s):%s" % (branches, result) return result
def test_stringify(): assert setupmeta.stringify((1, 2)) == '("1", "2")' assert setupmeta.stringify(["1", "2"]) == '["1", "2"]' assert setupmeta.stringify(("a b", "c d")) == '("a b", "c d")' assert setupmeta.stringify("""quoted ("double"+'single')""", quote=True) == """'quoted ("double"+'single')'""" assert setupmeta.stringify("""quoted 'single only'""", quote=True) == '''"quoted 'single only'"''' assert setupmeta.stringify("no 'foo'") == "no 'foo'" assert setupmeta.stringify("no 'foo'", quote=True) == '''"no 'foo'"''' assert setupmeta.stringify({"bar": "no 'foo'"}) == """{bar: no 'foo'}""" assert setupmeta.stringify({"bar": 'no "foo"'}) == """{bar: no "foo"}""" assert setupmeta.listify("a b") == ["a", "b"] assert sorted(setupmeta.listify(set("ab"))) == ["a", "b"] assert setupmeta.listify(("a", "b")) == ["a", "b"]
def show_expanded_python(self): """Copy-pastable setup.py, if one wants to get rid of setupmeta""" definitions = self.setupmeta.definitions print('"""\nGenerated by https://pypi.org/project/setupmeta/\n"""\n') print("from setuptools import setup\n\n") version = definitions.get("version") if version: print('__version__ = %s\n\n' % setupmeta.stringify(version.value, quote=True)) print("setup(") defs = [] for definition in sorted(definitions.values()): if not definition.value or definition.key not in setupmeta.MetaDefs.all_fields: continue if definition.key == "setup_requires": if isinstance(definition.value, list) and "setupmeta" in definition.value: definition.value.remove("setupmeta") if "setupmeta" == definition.value: continue if definition.value: definition.value = setupmeta.stringify(definition.value, quote=True, indent=" ") elif definition.key == "download_url": if version and version.value in definition.value: definition.value = definition.value.replace( version.value, "%s") definition.value = "%s %% __version__" % setupmeta.stringify( setupmeta.short(definition.value), quote=True) else: definition.value = setupmeta.stringify(definition.value, quote=True, indent=" ") elif definition.key == "long_description": definition.value = 'open(%s).read()' % setupmeta.stringify( setupmeta.short(definition.source), quote=True) elif definition.key == "version": definition.value = "__version__" else: definition.value = setupmeta.stringify(definition.value, quote=True, indent=" ") if definition.value: defs.append(definition) longest = max(len(d.value) for d in defs if "\n" not in d.value) longest = min(longest, 70) for definition in defs: if definition.key == "versioning": line = " # versioning=%s," % definition.value else: line = " %s=%s," % (definition.key, definition.value) source = definition.actual_source if source and source != "explicit": comment = "# from %s" % setupmeta.short(source) rest, _, last_line = line.rpartition("\n") if len(last_line) < longest: padding = " " * (longest - len(last_line)) else: padding = " " last_line = "%s%s%s" % (last_line, padding, comment) line = "%s\n%s" % (rest, last_line) if rest else last_line print(line) print(")")
def longest_line(lines, maximum=70): lines = [setupmeta.stringify(line) for line in lines] longest = max(len(line) for line in lines if "\n" not in line) return min(longest, maximum)
def show_expanded_python(self): """Copy-pastable setup.py, if one wants to get rid of setupmeta""" definitions = self.setupmeta.definitions print('"""\nGenerated by https://pypi.org/project/setupmeta/\n"""\n') print("from setuptools import setup\n\n") version = definitions.get("version") if version: print("__version__ = %s\n\n" % setupmeta.stringify(version.value, quote=True)) print("setup(") defs = [] for definition in sorted(definitions.values()): if not definition.value or definition.key not in setupmeta.MetaDefs.all_fields: continue if definition.key == "setup_requires": # When expanding, remove mention of 'setupmeta', # as expansion is aimed at giving a people a way to get a setup.py as-if setupmeta didn't exist # ie: it's a way of easily getting rid of setupmeta (should the need arise) if "setupmeta" in definition.value: definition.value.remove("setupmeta") if definition.value: definition.value = setupmeta.stringify(definition.value, quote=True, indent=" ") elif definition.key == "download_url": if version and version.value in definition.value: definition.value = definition.value.replace(version.value, "%s") definition.value = "%s %% __version__" % setupmeta.stringify(setupmeta.short(definition.value), quote=True) else: definition.value = setupmeta.stringify(definition.value, quote=True, indent=" ") elif definition.key == "long_description": definition.value = "open(%s).read()" % setupmeta.stringify(setupmeta.short(definition.source), quote=True) elif definition.key == "version": definition.value = "__version__" elif definition.key != "include_package_data": definition.value = setupmeta.stringify(definition.value, quote=True, indent=" ") if definition.value: defs.append(definition) longest = longest_line([d.value for d in defs]) for definition in defs: if definition.key == "versioning": line = " # versioning=%s," % definition.value else: line = " %s=%s," % (definition.key, definition.value) source = definition.actual_source if source and source != "explicit": comment = "# from %s" % setupmeta.short(source) rest, _, last_line = line.rpartition("\n") if len(last_line) < longest: padding = " " * (longest - len(last_line)) else: padding = " " last_line = "%s%s%s" % (last_line, padding, comment) line = "%s\n%s" % (rest, last_line) if rest else last_line print(line) print(")")
def test_stringify(): assert setupmeta.stringify_dict('foo') == 'foo' assert setupmeta.stringify((1, 2)) == "('1', '2')" assert setupmeta.listify("a b") == ['a', 'b'] assert sorted(setupmeta.listify(set("ab"))) == ['a', 'b'] assert setupmeta.listify(("a", "b")) == ['a', 'b']