diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index c2e5ca8..7e0d535 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1,2 @@ -github: justinmayer +custom: https://donate.getpelican.com liberapay: pelican diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ba41c23..37ddfa7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,89 +7,102 @@ env: jobs: test: - name: Test - Python ${{ matrix.python-version }} + name: Test - ${{ matrix.python-version }} runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python-version: ["3.8", "3.9"] steps: - - uses: actions/checkout@v4 - - - name: Set up Python ${{ matrix.python-version }} & PDM - uses: pdm-project/setup-pdm@v4 + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - cache: true - cache-dependency-path: ./pyproject.toml - + - name: Set up Pip cache + uses: actions/cache@v3 + id: pip-cache + with: + path: ~/.cache/pip + key: pip-${{ hashFiles('**/pyproject.toml') }} + - name: Upgrade Pip + run: python -m pip install --upgrade pip + - name: Install Poetry + run: python -m pip install poetry + - name: Set up Poetry cache + uses: actions/cache@v3 + id: poetry-cache + with: + path: ~/.cache/pypoetry/virtualenvs + key: poetry-${{ hashFiles('**/poetry.lock') }} - name: Install dependencies - run: pdm install - + run: | + poetry run pip install --upgrade pip + poetry install - name: Run tests - run: pdm run invoke tests + run: poetry run invoke tests + lint: name: Lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - + - uses: actions/checkout@v3 - name: Validate links in Markdown files uses: JustinBeckwith/linkinator-action@v1 with: retry: true - - - name: Set up Python & PDM - uses: pdm-project/setup-pdm@v4 + - name: Set up Python + uses: actions/setup-python@v4 with: - python-version: "3.10" - + python-version: "3.9" + - name: Set Poetry cache + uses: actions/cache@v3 + id: poetry-cache + with: + path: ~/.cache/pypoetry/virtualenvs + key: poetry-${{ hashFiles('**/poetry.lock') }} + - name: Upgrade Pip + run: python -m pip install --upgrade pip + - name: Install Poetry + run: python -m pip install poetry - name: Install dependencies - run: pdm install - + run: | + poetry run pip install --upgrade pip + poetry install - name: Run linters - run: pdm run invoke lint --diff + run: poetry run invoke lint + deploy: name: Deploy environment: Deployment needs: [test, lint] runs-on: ubuntu-latest - if: github.ref=='refs/heads/main' && github.event_name!='pull_request' - - permissions: - contents: write - id-token: write + if: ${{ github.ref=='refs/heads/main' && github.event_name!='pull_request' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 + - name: Setup Python + uses: actions/setup-python@v4 with: - token: ${{ secrets.GH_TOKEN }} - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.10" - + python-version: "3.9" - name: Check release id: check_release run: | - python -m pip install autopub httpx - python -m pip install https://github.com/scikit-build/github-release/archive/master.zip - autopub check - + python -m pip install --upgrade pip + python -m pip install poetry githubrelease httpx==0.16.1 autopub + echo "##[set-output name=release;]$(autopub check)" - name: Publish - if: ${{ steps.check_release.outputs.autopub_release=='true' }} + if: ${{ steps.check_release.outputs.release=='' }} env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | + git remote set-url origin https://$GITHUB_TOKEN@github.com/${{ github.repository }} autopub prepare + poetry build autopub commit - autopub build autopub githubrelease - - - name: Upload package to PyPI - if: ${{ steps.check_release.outputs.autopub_release=='true' }} - uses: pypa/gh-action-pypi-publish@release/v1 + poetry publish -u __token__ -p $PYPI_PASSWORD diff --git a/.gitignore b/.gitignore index 12568d5..c04bc49 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -.pdm-python -pdm.lock +poetry.lock diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9cdbf84..08632cf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,12 +5,11 @@ ci: # See https://pre-commit.com/hooks.html for info on hooks repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v4.4.0 hooks: - id: check-added-large-files - id: check-ast - id: check-case-conflict - - id: check-docstring-first - id: check-merge-conflict - id: check-toml - id: check-yaml @@ -20,9 +19,19 @@ repos: - id: forbid-new-submodules - id: trailing-whitespace - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.5.0 + - repo: https://github.com/psf/black + rev: 23.3.0 hooks: - - id: ruff - - id: ruff-format - args: ["--check"] + - id: black + + - repo: https://github.com/PyCQA/flake8 + rev: 6.0.0 + hooks: + - id: flake8 + args: [--max-line-length=88] + language_version: python3 + + - repo: https://github.com/PyCQA/isort + rev: 5.12.0 + hooks: + - id: isort diff --git a/CHANGELOG.md b/CHANGELOG.md index a7c7fc0..7eb580f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,6 @@ CHANGELOG ========= -1.2.1 - 2025-03-23 ------------------- - -Add title to Bluesky - -Contributed by [Daniel Lemos](https://github.com/xspager) via [PR #34](https://github.com/pelican-plugins/share-post/pull/34/) - - -1.2.0 - 2025-01-29 ------------------- - -Add Bluesky support - -Contributed by [Leonardo Giordani](https://github.com/lgiordani) via [PR #33](https://github.com/pelican-plugins/share-post/pull/33/) - - 1.1.0 - 2023-08-31 ------------------ diff --git a/README.md b/README.md index 8e26419..5871750 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![Build Status](https://img.shields.io/github/actions/workflow/status/pelican-plugins/share-post/main.yml?branch=main)](https://github.com/pelican-plugins/share-post/actions) [![PyPI Version](https://img.shields.io/pypi/v/pelican-share-post)](https://pypi.org/project/pelican-share-post/) -[![Downloads](https://img.shields.io/pypi/dm/pelican-share-post)](https://pypi.org/project/pelican-share-post/) ![License](https://img.shields.io/pypi/l/pelican-share-post?color=blue) Share Post is a Pelican plugin that creates share links in articles that allow site visitors to share the current article with others in a privacy-friendly manner. @@ -19,8 +18,6 @@ This plugin can be installed via: python -m pip install pelican-share-post -As long as you have not explicitly added a `PLUGINS` setting to your Pelican settings file, then the newly-installed plugin should be automatically detected and enabled. Otherwise, you must add `share_post` to your existing `PLUGINS` list. For more information, please see the [How to Use Plugins](https://docs.getpelican.com/en/latest/plugins.html#how-to-use-plugins) documentation. - Usage ----- @@ -36,7 +33,6 @@ article.share_post = { "mastodon": "", "reddit": "", "twitter": "", - "bluesky": "", } ``` @@ -57,13 +53,11 @@ You can then access those variables in your template. For example: ❄ LinkedIn ❄ - Mastodon + MastodonRedditTwitter - ❄ - Bluesky

{% endif %} diff --git a/pelican/plugins/share_post/__init__.py b/pelican/plugins/share_post/__init__.py index 40c66ed..4185ce8 100644 --- a/pelican/plugins/share_post/__init__.py +++ b/pelican/plugins/share_post/__init__.py @@ -1 +1 @@ -from .share_post import * # noqa: F403,PGH004,RUF100 +from .share_post import * # noqa diff --git a/pelican/plugins/share_post/share_post.py b/pelican/plugins/share_post/share_post.py index 2f829c1..f779c15 100644 --- a/pelican/plugins/share_post/share_post.py +++ b/pelican/plugins/share_post/share_post.py @@ -1,4 +1,6 @@ -"""Share Post plugin for Pelican. +""" +Share Post +========== This plugin was originally created by Talha Mansoor @@ -96,12 +98,6 @@ def create_link_linkedin(title, url, content): ) -@create_link -def create_link_bluesky(title, url, content): - # https://docs.bsky.app/docs/advanced-guides/intent-links - return f"https://bsky.app/intent/compose?text={title}%20{url}" - - def create_share_links(content): if isinstance(content, contents.Static): return @@ -115,10 +111,10 @@ def create_share_links(content): except AttributeError: sub_title = "" - title = quote(f"{main_title}{sub_title}".encode()) + title = quote(f"{main_title}{sub_title}".encode("utf-8")) site_url = content.settings["SITEURL"] - url = quote(f"{site_url}/{content.url}".encode()) + url = quote(f"{site_url}/{content.url}".encode("utf-8")) content.share_post = {} for func in _create_link_functions: diff --git a/pelican/plugins/share_post/test_share_post.py b/pelican/plugins/share_post/test_share_post.py index 5ff33f9..a35fc59 100644 --- a/pelican/plugins/share_post/test_share_post.py +++ b/pelican/plugins/share_post/test_share_post.py @@ -1,5 +1,7 @@ import os +from share_post import run_plugin + from pelican.generators import ArticlesGenerator from pelican.tests.support import get_context, get_settings @@ -24,7 +26,7 @@ def test_share_post(tmp_folder): ) generator.generate_context() - share_post.run_plugin([generator]) + run_plugin([generator]) share_links = generator.articles[0].share_post @@ -61,8 +63,3 @@ def test_share_post(tmp_folder): share_links["reddit"] == "https://www.reddit.com/submit?url=/test-post.html&title=Test%20post" ) - - assert ( - share_links["bluesky"] - == "https://bsky.app/intent/compose?text=Test%20post%20/test-post.html" - ) diff --git a/pyproject.toml b/pyproject.toml index 90ed39b..4610bc5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,63 +1,51 @@ -[project] +[tool.poetry] name = "pelican-share-post" -version = "1.2.1" +version = "1.1.0" description = "A Pelican plugin to create share URLs of article" -authors = [{name = "Talha Mansoor", email = "talha131@gmail.com"}, {name = "Justin Mayer", email = "entroP@gmail.com"}] -license = {text = "MIT"} +authors = ["Talha Mansoor ", "Justin Mayer "] +license = "MIT" readme = "README.md" keywords = ["pelican", "plugin", "social"] +repository = "https://github.com/pelican-plugins/share-post" +documentation = "https://docs.getpelican.com" +packages = [ + { include = "pelican" }, +] + classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Framework :: Pelican", "Framework :: Pelican :: Plugins", "Intended Audience :: End Users/Desktop", - "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries :: Python Modules", ] -requires-python = ">=3.8.1,<4.0" -dependencies = [ - "pelican>=4.5", - "beautifulsoup4>=4.9.3", -] -[project.urls] -Homepage = "https://github.com/pelican-plugins/share-post" +[tool.poetry.urls] +"Funding" = "https://donate.getpelican.com/" "Issue Tracker" = "https://github.com/pelican-plugins/share-post/issues" -Funding = "https://donate.getpelican.com/" -[project.optional-dependencies] -markdown = ["markdown>=3.4"] +[tool.poetry.dependencies] +python = ">=3.7,<4.0" +pelican = ">=4.5" +markdown = {version = ">=3.2.2", optional = true} +beautifulsoup4 = "^4.9.3" -[tool.pdm] +[tool.poetry.dev-dependencies] +black = ">=22.3.0" +flake8 = "^3.9" +flake8-black = "^0.3" +invoke = "^2.1" +isort = "^5.4" +markdown = "^3.4" +pytest = "^6.0" +pytest-cov = "^2.8" +pytest-sugar = "^0.9.7" -[tool.pdm.dev-dependencies] -lint = [ - "invoke>=2.2", - "ruff>=0.5.0,<0.6.0" -] -test = [ - "markdown>=3.4", - "pytest>=7.0", - "pytest-cov>=4.0", - "pytest-sugar>=1.0", -] - -[tool.pdm.build] -source-includes = [ - "CHANGELOG.md", - "CONTRIBUTING.md", -] -includes = ["pelican/"] -excludes = ["**/.DS_Store", "**/test_data/**", "tasks.py"] +[tool.poetry.extras] +markdown = ["markdown"] [tool.autopub] project-name = "Share Post" @@ -65,45 +53,18 @@ git-username = "botpub" git-email = "52496925+botpub@users.noreply.github.com" append-github-contributor = true -[tool.ruff.lint] -select = [ - "B", # flake8-bugbear - "BLE", # flake8-blind-except - "C4", # flake8-comprehensions - "D", # pydocstyle - "E", # pycodestyle - "F", # pyflakes - "I", # isort - "ICN", # flake8-import-conventions - "ISC", # flake8-implicit-str-concat - "PGH", # pygrep-hooks - "PL", # pylint - "RET", # flake8-return - "RUF", # ruff-specific rules - "SIM", # flake8-simplify - "T10", # flake8-debugger - "T20", # flake8-print - "TID", # flake8-tidy-imports - "TRY", # tryceratops - "UP", # pyupgrade - "W", # pycodestyle - "YTT", # flake8-2020 -] +[tool.isort] +# Maintain compatibility with Black +profile = "black" +multi_line_output = 3 -ignore = [ - "D100", # missing docstring in public module - "D103", # missing docstring in public method - "D104", # missing docstring in public package - "D203", # blank line before class docstring - "D213", # multi-line docstring summary should start at the second line - "ISC001", # disabled so `ruff format` works without warning -] +# Sort imports within their section independent of the import type +force_sort_within_sections = true -[tool.ruff.lint.isort] -combine-as-imports = true -force-sort-within-sections = true -known-first-party = ["pelican"] +# Designate "pelican" as separate import section +known_pelican = "pelican" +sections = "FUTURE,STDLIB,THIRDPARTY,PELICAN,FIRSTPARTY,LOCALFOLDER" [build-system] -requires = ["pdm-backend"] -build-backend = "pdm.backend" +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/tasks.py b/tasks.py index 3a8b167..f0fbc52 100644 --- a/tasks.py +++ b/tasks.py @@ -1,15 +1,14 @@ from inspect import cleandoc -import logging import os from pathlib import Path from shutil import which +import sys from invoke import task -logger = logging.getLogger(__name__) - PKG_NAME = "share_post" PKG_PATH = Path(f"pelican/plugins/{PKG_NAME}") +TOOLS = ("poetry", "pre-commit") ACTIVE_VENV = os.environ.get("VIRTUAL_ENV", None) VENV_HOME = Path(os.environ.get("WORKON_HOME", "~/.local/share/virtualenvs")) @@ -17,50 +16,52 @@ VENV_PATH = Path(ACTIVE_VENV) if ACTIVE_VENV else (VENV_HOME.expanduser() / PKG_ VENV = str(VENV_PATH.expanduser()) BIN_DIR = "bin" if os.name != "nt" else "Scripts" VENV_BIN = Path(VENV) / Path(BIN_DIR) - -TOOLS = ("pdm", "pre-commit") -PDM = which("pdm") if which("pdm") else (VENV_BIN / "pdm") -CMD_PREFIX = f"{VENV_BIN}/" if ACTIVE_VENV else f"{PDM} run " +POETRY = which("poetry") if which("poetry") else (VENV_BIN / "poetry") +CMD_PREFIX = f"{VENV_BIN}/" if ACTIVE_VENV else f"{POETRY} run " PRECOMMIT = which("pre-commit") if which("pre-commit") else f"{CMD_PREFIX}pre-commit" -PTY = os.name != "nt" +PTY = True if os.name != "nt" else False @task -def tests(c, deprecations=False): - """Run the test suite, optionally with `--deprecations`.""" - deprecations_flag = "" if deprecations else "-W ignore::DeprecationWarning" - c.run(f"{CMD_PREFIX}pytest {deprecations_flag}", pty=PTY) +def tests(c): + """Run the test suite.""" + c.run(f"{CMD_PREFIX}pytest", pty=PTY) @task -def format(c, check=False, diff=False): - """Run Ruff's auto-formatter, optionally with `--check` or `--diff`.""" +def black(c, check=False, diff=False): + """Run Black auto-formatter, optionally with `--check` or `--diff`.""" check_flag, diff_flag = "", "" if check: check_flag = "--check" if diff: diff_flag = "--diff" - c.run( - f"{CMD_PREFIX}ruff format {check_flag} {diff_flag} {PKG_PATH} tasks.py", pty=PTY - ) + c.run(f"{CMD_PREFIX}black {check_flag} {diff_flag} {PKG_PATH} tasks.py") @task -def ruff(c, fix=False, diff=False): - """Run Ruff to ensure code meets project standards.""" - diff_flag, fix_flag = "", "" - if fix: - fix_flag = "--fix" +def isort(c, check=False, diff=False): + """Ensure imports are sorted according to project standards.""" + check_flag, diff_flag = "", "" + if check: + check_flag = "-c" if diff: diff_flag = "--diff" - c.run(f"{CMD_PREFIX}ruff check {diff_flag} {fix_flag} .", pty=PTY) + c.run(f"{CMD_PREFIX}isort {check_flag} {diff_flag} .") @task -def lint(c, fix=False, diff=False): +def flake8(c): + """Check code for PEP8 compliance via Flake8.""" + c.run(f"{CMD_PREFIX}flake8 {PKG_PATH} tasks.py") + + +@task +def lint(c, diff=False): """Check code style via linting tools.""" - ruff(c, fix=fix, diff=diff) - format(c, check=(not fix), diff=diff) + isort(c, check=True, diff=diff) + black(c, check=True, diff=diff) + flake8(c) @task @@ -68,34 +69,34 @@ def tools(c): """Install development tools in the virtual environment if not already on PATH.""" for tool in TOOLS: if not which(tool): - logger.info(f"** Installing {tool} **") + print(f"** Installing {tool}.") c.run(f"{CMD_PREFIX}pip install {tool}") @task def precommit(c): - """Install pre-commit hooks to .git/hooks/pre-commit.""" - logger.info("** Installing pre-commit hooks **") + """Install pre-commit hooks to `.git/hooks/pre-commit`.""" + print("** Installing pre-commit hooks.") c.run(f"{PRECOMMIT} install") @task def setup(c): """Set up the development environment.""" - if which("pdm") or ACTIVE_VENV: + if which("poetry") or ACTIVE_VENV: tools(c) - c.run(f"{CMD_PREFIX}python -m pip install --upgrade pip", pty=PTY) - c.run(f"{PDM} update --dev", pty=PTY) + c.run(f"{CMD_PREFIX}python -m pip install --upgrade pip") + c.run(f"{POETRY} install") precommit(c) - logger.info("\nDevelopment environment should now be set up and ready!\n") + print("\nDevelopment environment should now be set up and ready!\n") else: error_message = """ - PDM is not installed, and there is no active virtual environment available. + Poetry is not installed, and there is no active virtual environment available. You can either manually create and activate a virtual environment, or you can - install PDM via: + install Poetry via: - curl -sSL https://raw.githubusercontent.com/pdm-project/pdm/main/install-pdm.py | python3 - + curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python - Once you have taken one of the above two steps, run `invoke setup` again. """ # noqa: E501 - raise SystemExit(cleandoc(error_message)) + sys.exit(cleandoc(error_message)) diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..abbd0dc --- /dev/null +++ b/tox.ini @@ -0,0 +1,3 @@ +[flake8] +max-line-length = 88 +ignore = E203, W503