specfile.specfile
Specfile
class Specfile()
Class that represents a spec file.
Attributes:
autosave
- Whether to automatically save any changes made.
__init__
def __init__(path: Union[Path, str],
sourcedir: Optional[Union[Path, str]] = None,
autosave: bool = False,
macros: Optional[List[Tuple[str, Optional[str]]]] = None,
force_parse: bool = False) -> None
Initializes a specfile object.
Arguments:
path
- Path to the spec file.sourcedir
- Path to sources and patches.autosave
- Whether to automatically save any changes made.macros
- List of extra macro definitions.force_parse
- Whether to attempt to parse the spec file even if one or more sources required to be present at parsing time are not available. Such sources include sources referenced from shell expansions in tag values and sources included using the %include directive.
path
@property
def path() -> Path
Path to the spec file.
sourcedir
@property
def sourcedir() -> Path
Path to sources and patches.
macros
@property
def macros() -> List[Tuple[str, Optional[str]]]
List of extra macro definitions.
force_parse
@property
def force_parse() -> bool
Whether to attempt to parse the spec file even if one or more sources required to be present at parsing time are not available.
tainted
@property
def tainted() -> bool
Indication that parsing of the spec file was forced and one or more sources required to be present at parsing time were not available and were replaced with dummy files.
rpm_spec
@property
def rpm_spec() -> rpm.spec
Underlying rpm.spec
instance.
reload
def reload() -> None
Reloads the spec file content.
save
def save() -> None
Saves the spec file content.
expand
def expand(expression: str,
extra_macros: Optional[List[Tuple[str, Optional[str]]]] = None,
skip_parsing: bool = False) -> str
Expands an expression in the context of the spec file.
Arguments:
expression
- Expression to expand.extra_macros
- Extra macros to be defined before expansion is performed.skip_parsing
- Do not parse the spec file before expansion is performed. Defaults toFalse
. Mutually exclusive withextra_macros
. Set this toTrue
only if you are certain that the global macro context is up-to-date.
Returns:
Expanded expression.
get_active_macros
def get_active_macros() -> List[Macro]
Gets active macros in the context of the spec file.
This includes built-in RPM macros, macros loaded from macro files and macros defined in the spec file itself.
Returns:
List of Macro
objects.
lines
@ContextManager
def lines() -> Generator[List[str], None, None]
Context manager for accessing spec file lines.
Yields:
Spec file lines as list of strings.
macro_definitions
@ContextManager
def macro_definitions() -> Generator[MacroDefinitions, None, None]
Context manager for accessing macro definitions.
Yields:
Macro definitions in the spec file as MacroDefinitions
object.
sections
@ContextManager
def sections() -> Generator[Sections, None, None]
Context manager for accessing spec file sections.
Yields:
Spec file sections as Sections
object.
parsed_sections
@property
def parsed_sections() -> Sections
Parsed spec file sections.
tags
@ContextManager
def tags(
section: Union[str,
Section] = "package") -> Generator[Tags, None, None]
Context manager for accessing tags in a specified section.
Arguments:
section
- Name of the requested section or an existingSection
instance. Defaults to preamble.
Yields:
Tags in the section as Tags
object.
changelog
@ContextManager
def changelog(
section: Optional[Section] = None
) -> Generator[Optional[Changelog], None, None]
Context manager for accessing changelog.
Arguments:
section
- OptionalSection
instance to be processed. If not set, the first %changelog section (if any) will be processed.
Yields:
Spec file changelog as Changelog
object or None
if there is no %changelog section.
prep
@ContextManager
def prep() -> Generator[Optional[Prep], None, None]
Context manager for accessing %prep section.
Yields:
Spec file %prep section as Prep
object.
sources
@ContextManager
def sources(
allow_duplicates: bool = False,
default_to_implicit_numbering: bool = False,
default_source_number_digits: int = 1
) -> Generator[Sources, None, None]
Context manager for accessing sources.
Arguments:
allow_duplicates
- Whether to allow duplicate entries when adding new sources.default_to_implicit_numbering
- Use implicit numbering (no source numbers) by default.default_source_number_digits
- Default number of digits in a source number.
Yields:
Spec file sources as Sources
object.
patches
@ContextManager
def patches(
allow_duplicates: bool = False,
default_to_implicit_numbering: bool = False,
default_source_number_digits: int = 1
) -> Generator[Patches, None, None]
Context manager for accessing patches.
Arguments:
allow_duplicates
- Whether to allow duplicate entries when adding new patches.default_to_implicit_numbering
- Use implicit numbering (no source numbers) by default.default_source_number_digits
- Default number of digits in a source number.
Yields:
Spec file patches as Patches
object.
has_autorelease
@property
def has_autorelease() -> bool
Whether the spec file uses %autorelease.
contains_autochangelog
@staticmethod
def contains_autochangelog(section: Section) -> bool
Determines if the specified section contains the %autochangelog macro.
Arguments:
section
- Section to examine.
Returns:
True
if the section contains %autochangelog, False
otherwise.
has_autochangelog
@property
def has_autochangelog() -> bool
Whether the spec file uses %autochangelog.
add_changelog_entry
def add_changelog_entry(entry: Union[str, List[str]],
author: Optional[str] = None,
email: Optional[str] = None,
timestamp: Optional[Union[datetime.date,
datetime.datetime]] = None,
evr: Optional[str] = None) -> None
Adds a new %changelog entry. Does nothing if there is no %changelog section or if %autochangelog is being used.
If not specified, author and e-mail will be automatically determined, if possible. Timestamp, if not set, will be set to current time (in local timezone).
Arguments:
entry
- Entry text or list of entry lines.author
- Author of the entry.email
- E-mail of the author.timestamp
- Timestamp of the entry. Supplydatetime
rather thandate
for extended format.evr
- Override the EVR part of the changelog entry. Macros will be expanded automatically. By default, the function determines the appropriate value based on the spec file current %{epoch}, %{version}, and %{release} values.
release
@property
def release() -> str
Release string without the dist suffix.
expanded_release
@property
def expanded_release() -> str
Release string without the dist suffix with macros expanded.
set_version_and_release
def set_version_and_release(version: str, release: str = "1") -> None
Sets both version and release at the same time.
Arguments:
version
- Version string.release
- Release string, defaults to "1".
add_patch
def add_patch(location: str,
number: Optional[int] = None,
comment: Optional[str] = None,
initial_number: int = 0,
number_digits: int = 4) -> None
Adds a patch.
Arguments:
location
- Patch location (filename or URL).number
- Patch number. It will be auto-assigned if not specified. If specified, it must be higher than any existing patch number.comment
- Associated comment.initial_number
- Auto-assigned number to start with if there are no patches.number_digits
- Number of digits in the patch number.
Raises:
SourceNumberException
- If the specified patch number is not higher than any existing patch number.
update_value
def update_value(value: str,
requested_value: str,
position: int,
protected_entities: Optional[str] = None) -> str
Updates a value from within the context of the spec file with a new value, but tries to preserve substitutions of locally defined macros and tags, updating the respective macro definitions and tag values instead.
Arguments:
value
- Value to update.requested_value
- Requested new value.position
- Position (line number) of the value in the spec file.protected_entities
- Regular expression specifying protected tags and macro definitions, ensuring their values won't be updated.
Returns:
Updated value. Can be equal to the original value.
update_tag
def update_tag(name: str,
value: str,
protected_entities: str = ".*name") -> None
Updates value of the given tag, trying to preserve substitutions of locally defined macros and tags, updating the respective macro definitions and tag values instead.
Arguments:
name
- Tag name.value
- Requested new value.protected_entities
- Regular expression specifying protected tags and macro definitions, ensuring their values won't be updated.
update_version
def update_version(
version: str,
prerelease_suffix_pattern: Optional[str] = None,
prerelease_suffix_macro: Optional[str] = None,
comment_out_style: CommentOutStyle = CommentOutStyle.DNL) -> None
Updates spec file version.
If prerelease_suffix_pattern
is not set, this method is equivalent
to calling update_tag("Version", version)
.
If prerelease_suffix_pattern
is set and the specified version matches it,
the detected pre-release suffix is prepended with '~' (any existing delimiter
is removed) before updating Version to ensure proper sorting by RPM.
If prerelease_suffix_macro
is also set and such macro definition exists,
it is commented out or uncommented accordingly before updating Version.
Arguments:
version
- Version string.prerelease_suffix_pattern
- Regular expression specifying recognized pre-release suffixes. The first capturing group must capture the delimiter between base version and pre-release suffix and can be empty in case there is no delimiter.prerelease_suffix_macro
- Macro definition that controls whether spec file version is a pre-release and contains the pre-release suffix. To be commented out or uncommented accordingly.comment_out_style
- Style of commenting outprerelease_suffix_macro
. SeeCommentOutStyle
. Defaults toupdate_tag("Version", version)
0.
Raises:
update_tag("Version", version)
1 - Ifprerelease_suffix_pattern
is invalid.
bump_release
def bump_release() -> None
Tries to bump release. Follows the logic of rpmdev-bumpspec
, first trying to update
macro definitions that seem to define a release, then trying to update value
of the Release tag.