From d5e911af7b6b34dbd84a127d32ad28eb82109963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vit=C3=B3rio=20A=2E=20Cavalheiro?= Date: Fri, 10 Oct 2025 12:51:03 -0300 Subject: [PATCH] refactor(generator): streamline module imports and enhance type safety Introduce __all__ declarations in package init files to clearly define the public API for LoremIpsum, PDFGenerator, and related classes. Convert absolute imports to relative paths for better encapsulation and add type hints to method signatures in PDFGenerator for improved code clarity and maintainability. --- .flake8 | 2 ++ .pylintrc | 8 ++++-- pyloremgen/generator/__init__.py | 12 +++++++++ pyloremgen/generator/lorem_pdf.py | 40 ++++++++++++++++++++++++++---- pyloremgen/generator/lorem_text.py | 24 +++++++++--------- pyproject.toml | 7 ++++-- 6 files changed, 72 insertions(+), 21 deletions(-) create mode 100644 .flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..2bcd70e --- /dev/null +++ b/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 88 diff --git a/.pylintrc b/.pylintrc index d040b9c..fcd6005 100644 --- a/.pylintrc +++ b/.pylintrc @@ -337,7 +337,7 @@ indent-after-paren=4 indent-string=' ' # Maximum number of characters on a single line. -max-line-length=100 +max-line-length=88 # Maximum number of lines in a module. max-module-lines=1000 @@ -430,7 +430,11 @@ disable=raw-checker-failed, deprecated-pragma, use-symbolic-message-instead, use-implicit-booleaness-not-comparison-to-string, - use-implicit-booleaness-not-comparison-to-zero + use-implicit-booleaness-not-comparison-to-zero, + missing-module-docstring, + attribute-defined-outside-init, + too-few-public-methods, + import-error # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option diff --git a/pyloremgen/generator/__init__.py b/pyloremgen/generator/__init__.py index e69de29..66a6356 100644 --- a/pyloremgen/generator/__init__.py +++ b/pyloremgen/generator/__init__.py @@ -0,0 +1,12 @@ +from .lorem_pdf import PDFGenerator +from .lorem_text import LoremIpsum, LoremIpsumError +from .pdf_utils.cover_page_template import CoverPageBuilder +from .pdf_utils.pdf_page_settings import PagesConfigPDF + +__all__ = [ + "LoremIpsum", + "PDFGenerator", + "LoremIpsumError", + "PagesConfigPDF", + "CoverPageBuilder", +] diff --git a/pyloremgen/generator/lorem_pdf.py b/pyloremgen/generator/lorem_pdf.py index 9c0b77d..8ec0c0e 100644 --- a/pyloremgen/generator/lorem_pdf.py +++ b/pyloremgen/generator/lorem_pdf.py @@ -1,17 +1,47 @@ +from typing import Optional + from reportlab.lib.styles import getSampleStyleSheet from reportlab.platypus import PageBreak, Paragraph -from pyloremgen.generator.lorem_text import LoremIpsum -from pyloremgen.generator.pdf_utils.cover_page_template import CoverPageBuilder -from pyloremgen.generator.pdf_utils.pdf_page_settings import PagesConfigPDF +from .lorem_text import LoremIpsum +from .pdf_utils.cover_page_template import CoverPageBuilder +from .pdf_utils.pdf_page_settings import PagesConfigPDF class PDFGenerator: - def __init__(self, pages_config=None): + """ + PDFGenerator class for creating PDF documents with Lorem Ipsum content. + + This class provides functionality to generate + PDF files filled with Lorem Ipsum text, + with options for customizing page settings and including cover pages. + + Attributes: + pages_config (PagesConfigPDF): Configuration for PDF page settings. + lorem (LoremIpsum): Instance of LoremIpsum for generating text content. + + Methods: + generate_pdf(filename: str, num_pages: int = 1, + cover_page_count: bool = True) -> None: + Generates a PDF document with the specified number of pages. + """ + + def __init__(self, pages_config: Optional[PagesConfigPDF] = None) -> None: self.pages_config = pages_config or PagesConfigPDF() self.lorem = LoremIpsum() - def generate_pdf(self, filename, num_pages=1, cover_page_count=True): + def generate_pdf( + self, filename: str, num_pages: int = 1, cover_page_count: bool = True + ) -> None: + """ + Generate a PDF document with Lorem Ipsum content. + + Args: + filename (str): The name of the output PDF file. + num_pages (int, optional): The number of pages to generate. Defaults to 1. + cover_page_count (bool, optional): + Whether to include a cover page. Defaults to True. + """ self.num_pages = num_pages doc = self.pages_config.create_document(filename) content = [] diff --git a/pyloremgen/generator/lorem_text.py b/pyloremgen/generator/lorem_text.py index fbfed3d..76b9b68 100644 --- a/pyloremgen/generator/lorem_text.py +++ b/pyloremgen/generator/lorem_text.py @@ -1,6 +1,6 @@ import random -from pyloremgen.utilities.file_helper import get_data_json +from ..utilities.file_helper import get_data_json class LoremIpsumError(Exception): @@ -17,7 +17,7 @@ class LoremIpsum: LoremIpsum class This class generates lorem ipsum text. - It provides methods for generating paragraphs, words, and a shopping list of random items. + It provides methods for generating paragraphs, words, and shopping lists. Methods: __init__(): @@ -63,8 +63,8 @@ def __init__(self) -> None: - `paragraph_lorem`: A list to store lorem ipsum paragraphs. - `words_lorem`: A list to store lorem ipsum words. - `items_lorem`: A list to store lorem ipsum items. - - `paragraphs_words`: A variable to store the number of words in each paragraph. - - `start_with_lorem_ipsum`: A string that represents the start of a lorem ipsum text. + - `paragraphs_words`: Number of words in each paragraph. + - `start_with_lorem_ipsum`: Start lorem ipsum string. Parameters: None @@ -126,10 +126,10 @@ def paragraphs( Parameters: paragraphs_numbers (int): The number of paragraphs to generate. - size (str, optional): The size of the paragraphs. Can be "small", "medium", or "large". Defaults to "medium". - start_with_lorem_ipsum (bool, optional): - start_with_lorem_ipsum (bool, optional): - Whether to start with a "Lorem ipsum" paragraph. Defaults to False. + size (str, optional): Size of paragraphs + ("small", "medium", "large"). Default "medium". + start_with_lorem_ipsum (bool, optional): Start with + "Lorem ipsum" paragraph. Default True. Returns: str: The generated paragraphs joined by newline characters. @@ -180,7 +180,7 @@ def shopping_list(self, items_count: int = None) -> str: Returns: str: The shopping list as a string, with each item on a new line. Raises: - LoremIpsumError: If an error occurs during the generation of the shopping list. + LoremIpsumError: If an error occurs. """ items_count = random.randint(5, 100) if items_count is None else items_count try: @@ -194,8 +194,8 @@ def shopping_list(self, items_count: int = None) -> str: items = random.choices(repeated_data, k=items_count) else: items = random.choices(data_json, k=items_count) - self.items_lorem.append("Shopping List:") - self.items_lorem.extend(items) - return "\n".join(self.items_lorem) + self.items_lorem.append("Shopping List:") + self.items_lorem.extend(items) + return "\n".join(self.items_lorem) except Exception as e: raise LoremIpsumError(f"Error generating shopping list: {str(e)}") from e diff --git a/pyproject.toml b/pyproject.toml index 2faf85b..7362465 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,11 +25,14 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.black] -line-length = 100 +line-length = 88 target-version = ['py38'] skip-string-normalization = true [tool.isort] profile = "black" -line_length = 100 +line_length = 88 + +[tool.flake8] +max-line-length = 88