1
0
mirror of https://github.com/arsenetar/send2trash.git synced 2026-03-12 02:41:39 +00:00

21 Commits

Author SHA1 Message Date
91d0698967 Merge pull request #91 from arsenetar/as/misc-fixes
chore: Upgrade version to 1.8.3, bump CI
2024-04-06 18:53:45 -05:00
5c47eb063c fix(ci): Use alternative setup-python to allow 2.7
The setup python action has removed 2.7, we want to keep it for the
moment.  Using an alternative action that supports 2.7.
2024-04-06 16:51:34 -07:00
c7a23884a9 chore: Upgrade version to 1.8.3, bump CI
- Upgrade version to 1.8.3, add changelog entry
- Fix minor flake8 error that can be ignored
- Update CI workflow to use newer actions and python versions
2024-04-06 16:36:23 -07:00
78fa300cac Merge pull request #90 from yogeshiitm/master
Fix bug when source and destination directories are on different file systems
2024-03-28 01:17:37 -05:00
Yogesh Agarwala
baeb9e59f9 Fix bug in send2trash: Use os.fsdecode() in shutil.move()
`shutil.move()` function expects string paths, not byte paths. This bug is leading to failure when src and dst are on on the different file system.
2024-03-23 05:37:21 +05:30
0a48c26f68 Merge pull request #88 from PalmtopTiger/iterable-types
Support for any iterable type as input data
2024-02-19 09:08:53 -06:00
Andrey Efremov
ed039dc892 Support for any iterable type as input data 2024-01-11 14:25:22 +07:00
e59ddcae98 Merge pull request #79 from mgorny/wheel
Remove redundant wheel dep from pyproject.toml
2023-05-03 02:41:22 -05:00
Michał Górny
19cf5d941a Remove redundant wheel dep from pyproject.toml
Remove the redundant `wheel` dependency, as it is added by the backend
automatically.  Listing it explicitly in the documentation was
a historical mistake and has been fixed since, see:
f7d30a9529
2023-04-27 18:12:32 +02:00
0244f53e2e fix(build): Fix syntax in setup.cfg, add python 3.11 2023-04-27 00:28:59 -05:00
1625d56345 Update version & changelog for 1.8.2 2023-04-27 00:22:55 -05:00
63e770d29e Merge pull request #78 from arsenetar/as/fix-ci
fix(ci): Update to latest actions, fix python versions
2023-04-27 00:03:55 -05:00
bfd3e08661 fix(ci): Update to latest actions, fix python versions
- Update to latest actions
- Change OS for older python 3.6, 3.5 to run
2023-04-26 23:54:52 -05:00
490fe02245 Merge pull request #73 from sobolevn/patch-1
TravisCI is not used anymore
2023-04-26 23:54:24 -05:00
d6d904c774 Merge pull request #77 from BoboTiG/patch-1
win/legacy: tiny logic simplification
2023-04-26 23:36:39 -05:00
Mickaël Schoentgen
0a36688a4b win/legacy: tiny logic simplification 2023-04-02 17:08:25 +02:00
Nikita Sobolev
955f8091da TravisCI is not used anymore 2022-10-11 23:57:46 +03:00
0ef9b3294a fix(tests): Correct windows tests to run on python <3.6 2022-07-26 22:51:16 -05:00
4b9bc4bc31 fix(win): Prevent exception on empty list
Add check for when an empty list remains after preprocessing and do
not continue for both legacy and modern windows implementations.

Fix #71
2022-07-26 22:42:30 -05:00
be402728fb Update setup.cfg for changes in d37197c, fix #68. 2022-06-01 02:06:14 -05:00
448224954b Replace relative imports with absolute 2022-06-01 00:22:46 -05:00
19 changed files with 154 additions and 131 deletions

View File

@@ -18,7 +18,7 @@ on:
# The branches below must be a subset of the branches above # The branches below must be a subset of the branches above
branches: [master] branches: [master]
schedule: schedule:
- cron: '25 5 * * 4' - cron: "25 5 * * 4"
jobs: jobs:
analyze: analyze:
@@ -32,18 +32,18 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
language: [ 'python' ] language: ["python"]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more: # Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@v1 uses: github/codeql-action/init@v2
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file. # If you wish to specify custom queries, you can do so here or in a config file.
@@ -54,7 +54,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below) # If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild - name: Autobuild
uses: github/codeql-action/autobuild@v1 uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell. # Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl # 📚 https://git.io/JvXDl
@@ -68,4 +68,4 @@ jobs:
# make release # make release
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1 uses: github/codeql-action/analyze@v2

View File

@@ -12,9 +12,9 @@ jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Set up Python 3.x - name: Set up Python 3.x
uses: actions/setup-python@v2 uses: actions/setup-python@v5
with: with:
python-version: 3.x python-version: 3.x
- name: Install dependencies - name: Install dependencies
@@ -31,36 +31,36 @@ jobs:
matrix: matrix:
include: include:
- os: ubuntu-latest - os: ubuntu-latest
python-version: 3.10.0-alpha - 3.10.0 python-version: 3.12
- os: ubuntu-latest
python-version: 3.11
- os: ubuntu-latest
python-version: "3.10"
- os: ubuntu-latest - os: ubuntu-latest
python-version: 3.9 python-version: 3.9
- os: ubuntu-latest - os: ubuntu-latest
python-version: 3.8 python-version: 3.8
- os: ubuntu-latest - os: ubuntu-latest
python-version: 3.7 python-version: 3.7
- os: ubuntu-latest
python-version: 3.6
- os: ubuntu-latest
python-version: 3.5
- os: ubuntu-latest - os: ubuntu-latest
python-version: 2.7 python-version: 2.7
# - os: macos-latest # - os: macos-latest
# python-version: 3.9 # python-version: 3.11
# - os: macos-latest # - os: macos-latestgit push
# python-version: 3.8 # python-version: 3.8
# - os: macos-latest # - os: macos-latest
# python-version: 2.7 # python-version: 2.7
- os: windows-latest - os: windows-latest
python-version: 3.9 python-version: 3.12
- os: windows-latest - os: windows-latest
python-version: 3.8 python-version: 3.8
- os: windows-latest - os: windows-latest
python-version: 2.7 python-version: 2.7
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }} - name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2 uses: LizardByte/setup-python-action@master
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
- name: Install dependencies - name: Install dependencies

View File

@@ -1,19 +0,0 @@
language: python
matrix:
include:
- python: "2.7"
arch: ppc64le
- python: "3.6"
arch: ppc64le
- python: "3.7"
arch: ppc64le
- python: "3.8"
arch: ppc64le
- python: "3.9"
arch: ppc64le
install:
- python -m pip install tox
before_script:
- export TOXENV=$(echo py$TRAVIS_PYTHON_VERSION | tr -d .)
script:
- python -m tox

View File

@@ -1,9 +1,20 @@
Changes Changes
======= =======
Version 1.8.3 -- 2024/04/06
---------------------------
* Add support for any iterable type as input by @PalmtopTiger in https://github.com/arsenetar/send2trash/pull/88
* fix: Use os.fsdecode() for arguments to shutil.move() by @yogeshiitm in https://github.com/arsenetar/send2trash/pull/90
Version 1.8.2 -- 2023/04/27
---------------------------
* win/legacy: tiny logic simplification by @BoboTiG in https://github.com/arsenetar/send2trash/pull/77
* TravisCI is not used anymore by @sobolevn in https://github.com/arsenetar/send2trash/pull/73
* fix(ci): Update to latest actions, fix python versions by @arsenetar in https://github.com/arsenetar/send2trash/pull/78
Version 1.8.1b0 -- 2021/09/20 Version 1.8.1b0 -- 2021/09/20
----------------------------- -----------------------------
* Add fallback to HOMETRASH when cross device errors happen in plat_other (#26, $41, #63) * Add fallback to HOMETRASH when cross device errors happen in plat_other (#26, #41, #63)
Version 1.8.0 -- 2021/08/08 Version 1.8.0 -- 2021/08/08
--------------------------- ---------------------------

View File

@@ -1,5 +1,5 @@
[build-system] [build-system]
requires = ["setuptools >= 40.6.0", "wheel"] requires = ["setuptools >= 40.6.0"]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
[tool.black] [tool.black]

View File

@@ -6,16 +6,16 @@
import sys import sys
from .exceptions import TrashPermissionError # noqa: F401 from send2trash.exceptions import TrashPermissionError # noqa: F401
if sys.platform == "darwin": if sys.platform == "darwin":
from .mac import send2trash from send2trash.mac import send2trash
elif sys.platform == "win32": elif sys.platform == "win32":
from .win import send2trash from send2trash.win import send2trash
else: else:
try: try:
# If we can use gio, let's use it # If we can use gio, let's use it
from .plat_gio import send2trash from send2trash.plat_gio import send2trash
except ImportError: except ImportError:
# Oh well, let's fallback to our own Freedesktop trash implementation # Oh well, let's fallback to our own Freedesktop trash implementation
from .plat_other import send2trash # noqa: F401 from send2trash.plat_other import send2trash # noqa: F401

View File

@@ -18,3 +18,8 @@ else:
text_type = unicode # noqa: F821 text_type = unicode # noqa: F821
binary_type = str binary_type = str
environb = os.environ environb = os.environ
try:
from collections.abc import Iterable as iterable_type
except ImportError:
from collections import Iterable as iterable_type # noqa: F401

View File

@@ -1,5 +1,5 @@
import errno import errno
from .compat import PY3 from send2trash.compat import PY3
if PY3: if PY3:
_permission_error = PermissionError # noqa: F821 _permission_error = PermissionError # noqa: F821

View File

@@ -11,10 +11,10 @@ from sys import version_info
macos_ver = tuple(int(part) for part in mac_ver()[0].split(".")) macos_ver = tuple(int(part) for part in mac_ver()[0].split("."))
if version_info >= (3, 6) and macos_ver >= (10, 9): if version_info >= (3, 6) and macos_ver >= (10, 9):
try: try:
from .modern import send2trash from send2trash.mac.modern import send2trash
except ImportError: except ImportError:
# Try to fall back to ctypes version, although likely problematic still # Try to fall back to ctypes version, although likely problematic still
from .legacy import send2trash from send2trash.mac.legacy import send2trash
else: else:
# Just use the old version otherwise # Just use the old version otherwise
from .legacy import send2trash # noqa: F401 from send2trash.mac.legacy import send2trash # noqa: F401

View File

@@ -9,8 +9,8 @@ from __future__ import unicode_literals
from ctypes import cdll, byref, Structure, c_char, c_char_p from ctypes import cdll, byref, Structure, c_char, c_char_p
from ctypes.util import find_library from ctypes.util import find_library
from ..compat import binary_type from send2trash.compat import binary_type
from ..util import preprocess_paths from send2trash.util import preprocess_paths
Foundation = cdll.LoadLibrary(find_library("Foundation")) Foundation = cdll.LoadLibrary(find_library("Foundation"))
CoreServices = cdll.LoadLibrary(find_library("CoreServices")) CoreServices = cdll.LoadLibrary(find_library("CoreServices"))

View File

@@ -5,8 +5,8 @@
# http://www.hardcoded.net/licenses/bsd_license # http://www.hardcoded.net/licenses/bsd_license
from Foundation import NSFileManager, NSURL from Foundation import NSFileManager, NSURL
from ..compat import text_type from send2trash.compat import text_type
from ..util import preprocess_paths from send2trash.util import preprocess_paths
def check_op_result(op_result): def check_op_result(op_result):

View File

@@ -5,8 +5,8 @@
# http://www.hardcoded.net/licenses/bsd_license # http://www.hardcoded.net/licenses/bsd_license
from gi.repository import GObject, Gio from gi.repository import GObject, Gio
from .exceptions import TrashPermissionError from send2trash.exceptions import TrashPermissionError
from .util import preprocess_paths from send2trash.util import preprocess_paths
def send2trash(paths): def send2trash(paths):

View File

@@ -30,9 +30,9 @@ except ImportError:
# Python 2 # Python 2
from urllib import quote from urllib import quote
from .compat import text_type, environb from send2trash.compat import text_type, environb
from .util import preprocess_paths from send2trash.util import preprocess_paths
from .exceptions import TrashPermissionError from send2trash.exceptions import TrashPermissionError
try: try:
fsencode = os.fsencode # Python 3 fsencode = os.fsencode # Python 3
@@ -115,7 +115,7 @@ def trash_move(src, dst, topdir=None, cross_dev=False):
f.write(info_for(src, topdir)) f.write(info_for(src, topdir))
destpath = op.join(filespath, destname) destpath = op.join(filespath, destname)
if cross_dev: if cross_dev:
shutil.move(src, destpath) shutil.move(fsdecode(src), fsdecode(destpath))
else: else:
os.rename(src, destpath) os.rename(src, destpath)

View File

@@ -5,9 +5,13 @@
# which should be included with this package. The terms are also available at # which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/bsd_license # http://www.hardcoded.net/licenses/bsd_license
from send2trash.compat import text_type, binary_type, iterable_type
def preprocess_paths(paths): def preprocess_paths(paths):
if not isinstance(paths, list): if isinstance(paths, iterable_type) and not isinstance(paths, (text_type, binary_type)):
paths = list(paths)
elif not isinstance(paths, list):
paths = [paths] paths = [paths]
# Convert items such as pathlib paths to strings # Convert items such as pathlib paths to strings
paths = [path.__fspath__() if hasattr(path, "__fspath__") else path for path in paths] paths = [path.__fspath__() if hasattr(path, "__fspath__") else path for path in paths]

View File

@@ -11,10 +11,10 @@ from platform import version
if int(version().split(".", 1)[0]) >= 6: if int(version().split(".", 1)[0]) >= 6:
try: try:
# Attempt to use pywin32 to use IFileOperation # Attempt to use pywin32 to use IFileOperation
from .modern import send2trash from send2trash.win.modern import send2trash
except ImportError: except ImportError:
# use SHFileOperation as fallback # use SHFileOperation as fallback
from .legacy import send2trash from send2trash.win.legacy import send2trash
else: else:
# use SHFileOperation as fallback # use SHFileOperation as fallback
from .legacy import send2trash # noqa: F401 from send2trash.win.legacy import send2trash # noqa: F401

View File

@@ -6,8 +6,9 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import os.path as op import os.path as op
from ..compat import text_type
from ..util import preprocess_paths from send2trash.compat import text_type
from send2trash.util import preprocess_paths
from ctypes import ( from ctypes import (
windll, windll,
@@ -85,10 +86,7 @@ def convert_sh_file_opt_result(result):
0x10074: 0x57, # DE_ROOTDIR | ERRORONDEST -> ERROR_INVALID_PARAMETER 0x10074: 0x57, # DE_ROOTDIR | ERRORONDEST -> ERROR_INVALID_PARAMETER
} }
if result in results.keys(): return results.get(result, result)
return results[result]
else:
return result
def prefix_and_path(path): def prefix_and_path(path):
@@ -142,6 +140,8 @@ def get_short_path_name(long_name):
def send2trash(paths): def send2trash(paths):
paths = preprocess_paths(paths) paths = preprocess_paths(paths)
if not paths:
return
# convert data type # convert data type
paths = [text_type(path, "mbcs") if not isinstance(path, text_type) else path for path in paths] paths = [text_type(path, "mbcs") if not isinstance(path, text_type) else path for path in paths]
# convert to full paths # convert to full paths

View File

@@ -6,17 +6,19 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import os.path as op import os.path as op
from ..compat import text_type from send2trash.compat import text_type
from ..util import preprocess_paths from send2trash.util import preprocess_paths
from platform import version from platform import version
import pythoncom import pythoncom
import pywintypes import pywintypes
from win32com.shell import shell, shellcon from win32com.shell import shell, shellcon
from .IFileOperationProgressSink import create_sink from send2trash.win.IFileOperationProgressSink import create_sink
def send2trash(paths): def send2trash(paths):
paths = preprocess_paths(paths) paths = preprocess_paths(paths)
if not paths:
return
# convert data type # convert data type
paths = [text_type(path, "mbcs") if not isinstance(path, text_type) else path for path in paths] paths = [text_type(path, "mbcs") if not isinstance(path, text_type) else path for path in paths]
# convert to full paths # convert to full paths

View File

@@ -1,6 +1,6 @@
[metadata] [metadata]
name = Send2Trash name = Send2Trash
version = 1.8.1b0 version = 1.8.3
url = https://github.com/arsenetar/send2trash url = https://github.com/arsenetar/send2trash
project_urls = project_urls =
Bug Reports = https://github.com/arsenetar/send2trash/issues Bug Reports = https://github.com/arsenetar/send2trash/issues
@@ -20,22 +20,28 @@ classifiers =
Operating System :: POSIX Operating System :: POSIX
Programming Language :: Python :: 2.7 Programming Language :: Python :: 2.7
Programming Language :: Python :: 3 Programming Language :: Python :: 3
Programming Language :: Python :: 3.5
Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Programming Language :: Python :: 3.12
Topic :: Desktop Environment :: File Managers Topic :: Desktop Environment :: File Managers
[options] [options]
packages = send2trash packages = find:
tests_require = pytest tests_require = pytest
python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*
[options.packages.find]
include=
send2trash*
[options.extras_require] [options.extras_require]
win32 = pywin32; sys_platform == "win32" win32 =
objc = pyobjc-framework-Cocoa; sys_platform == "darwin" pywin32; sys_platform == "win32"
objc =
pyobjc-framework-Cocoa; sys_platform == "darwin"
nativeLib = nativeLib =
pywin32; sys_platform == "win32" pywin32; sys_platform == "win32"
pyobjc-framework-Cocoa; sys_platform == "darwin" pyobjc-framework-Cocoa; sys_platform == "darwin"

View File

@@ -204,3 +204,17 @@ def test_trash_long_multifile_legacy(longfiles):
# ) # )
# def test_trash_long_folder_legacy(self): # def test_trash_long_folder_legacy(self):
# self._trash_folder(s2t_legacy) # self._trash_folder(s2t_legacy)
def test_trash_nothing_legacy():
try:
s2t_legacy([])
except Exception as ex:
assert False, "Exception thrown when trashing nothing: {}".format(ex)
def test_trash_nothing_modern():
try:
s2t_modern([])
except Exception as ex:
assert False, "Exception thrown when trashing nothing: {}".format(ex)