1
0
mirror of https://github.com/arsenetar/send2trash.git synced 2026-01-25 16:11:39 +00:00

5 Commits
1.7.1 ... 1.8.0

Author SHA1 Message Date
484913ba0f Update version for 1.8.0 release 2021-08-08 21:51:06 -05:00
d249f0106b Fix #59, initialize and uninitialize COM for threading 2021-08-07 22:16:33 -05:00
94e1ec007a Add ability to handle pathlib paths
- Handle pathlib paths across all implementations, plat_other already did
- Move preprocessing code to common location
2021-08-07 21:48:10 -05:00
84c220cbd9 Change extra requires to filter on platform
Also created one extra `nativeLib` to replace the orignal two.  Will remove
the others after a couple releases.
2021-08-07 21:04:40 -05:00
6612545110 Add note about pyobjc to README, add extra option 2021-06-22 21:36:14 -05:00
10 changed files with 62 additions and 20 deletions

View File

@@ -1,5 +1,13 @@
Changes
=======
Version 1.8.0 -- 2021/08/08
---------------------------
* Add compatibility with pathlib paths (#49)
* Fix thread compatibility of modern windows implementation (#59)
* Fix handling of UNC names in legacy windows implementation (#57)
Version 1.7.1 -- 2021/06/21
---------------------------

View File

@@ -3,11 +3,11 @@ Send2Trash -- Send files to trash on all platforms
==================================================
Send2Trash is a small package that sends files to the Trash (or Recycle Bin) *natively* and on
*all platforms*. On OS X, it uses native ``FSMoveObjectToTrashSync`` Cocoa calls. On Windows, it
uses native ``IFileOperation`` call if on Vista or newer and pywin32 is installed or falls back
to ``SHFileOperation`` calls. On other platforms, if `PyGObject`_ and `GIO`_ are available, it
will use this. Otherwise, it will fallback to its own implementation of the `trash specifications
from freedesktop.org`_.
*all platforms*. On OS X, it uses native ``FSMoveObjectToTrashSync`` Cocoa calls or can use pyobjc
with NSFileManager. On Windows, it uses native ``IFileOperation`` call if on Vista or newer and
pywin32 is installed or falls back to ``SHFileOperation`` calls. On other platforms, if `PyGObject`_
and `GIO`_ are available, it will use this. Otherwise, it will fallback to its own implementation of
the `trash specifications from freedesktop.org`_.
``ctypes`` is used to access native libraries, so no compilation is necessary.
@@ -22,10 +22,14 @@ issues and fixes would be most appreciated.
Installation
------------
You can download it with pip::
You can download it with pip:
python -m pip install -U send2trash
To install with pywin32 or pyobjc required specify the extra `nativeLib`:
python -m pip install -U send2trash[nativeLib]
or you can download the source from http://github.com/arsenetar/send2trash and install it with::
>>> python setup.py install

View File

@@ -6,11 +6,11 @@
from gi.repository import GObject, Gio
from .exceptions import TrashPermissionError
from .util import preprocess_paths
def send2trash(paths):
if not isinstance(paths, list):
paths = [paths]
paths = preprocess_paths(paths)
for path in paths:
try:
f = Gio.File.new_for_path(path)

View File

@@ -10,6 +10,7 @@ from ctypes import cdll, byref, Structure, c_char, c_char_p
from ctypes.util import find_library
from .compat import binary_type
from .util import preprocess_paths
Foundation = cdll.LoadLibrary(find_library("Foundation"))
CoreServices = cdll.LoadLibrary(find_library("CoreServices"))
@@ -40,8 +41,7 @@ def check_op_result(op_result):
def send2trash(paths):
if not isinstance(paths, list):
paths = [paths]
paths = preprocess_paths(paths)
paths = [
path.encode("utf-8") if not isinstance(path, binary_type) else path
for path in paths

View File

@@ -6,6 +6,7 @@
from Foundation import NSFileManager, NSURL
from .compat import text_type
from .util import preprocess_paths
def check_op_result(op_result):
@@ -16,8 +17,7 @@ def check_op_result(op_result):
def send2trash(paths):
if not isinstance(paths, list):
paths = [paths]
paths = preprocess_paths(paths)
paths = [
path.decode("utf-8") if not isinstance(path, text_type) else path
for path in paths

View File

@@ -30,6 +30,7 @@ except ImportError:
from urllib import quote
from .compat import text_type, environb
from .util import preprocess_paths
from .exceptions import TrashPermissionError
try:
@@ -172,8 +173,7 @@ def get_dev(path):
def send2trash(paths):
if not isinstance(paths, list):
paths = [paths]
paths = preprocess_paths(paths)
for path in paths:
if isinstance(path, text_type):
path_b = fsencode(path)

View File

@@ -7,6 +7,8 @@
from __future__ import unicode_literals
import os.path as op
from .compat import text_type
from .util import preprocess_paths
from ctypes import (
windll,
Structure,
@@ -101,8 +103,7 @@ def get_short_path_name(long_name):
def send2trash(paths):
if not isinstance(paths, list):
paths = [paths]
paths = preprocess_paths(paths)
# convert data type
paths = [
text_type(path, "mbcs") if not isinstance(path, text_type) else path

View File

@@ -7,6 +7,7 @@
from __future__ import unicode_literals
import os.path as op
from .compat import text_type
from .util import preprocess_paths
from platform import version
import pythoncom
import pywintypes
@@ -15,8 +16,7 @@ from .IFileOperationProgressSink import CreateSink
def send2trash(paths):
if not isinstance(paths, list):
paths = [paths]
paths = preprocess_paths(paths)
# convert data type
paths = [
text_type(path, "mbcs") if not isinstance(path, text_type) else path
@@ -26,6 +26,8 @@ def send2trash(paths):
paths = [op.abspath(path) if not op.isabs(path) else path for path in paths]
# remove the leading \\?\ if present
paths = [path[4:] if path.startswith("\\\\?\\") else path for path in paths]
# Need to initialize the com before using
pythoncom.CoInitialize()
# create instance of file operation object
fileop = pythoncom.CoCreateInstance(
shell.CLSID_FileOperation, None, pythoncom.CLSCTX_ALL, shell.IID_IFileOperation,
@@ -65,3 +67,6 @@ def send2trash(paths):
# convert to standard OS error, allows other code to get a
# normal errno
raise OSError(None, error.strerror, path, error.hresult)
finally:
# Need to make sure we call this once fore every init
pythoncom.CoUninitialize()

16
send2trash/util.py Normal file
View File

@@ -0,0 +1,16 @@
# encoding: utf-8
# Copyright 2017 Virgil Dupras
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/bsd_license
def preprocess_paths(paths):
if not isinstance(paths, list):
paths = [paths]
# Convert items such as pathlib paths to strings
paths = [
path.__fspath__() if hasattr(path, "__fspath__") else path for path in paths
]
return paths

View File

@@ -24,7 +24,7 @@ with open("README.rst", "rt") as f1, open("CHANGES.rst", "rt") as f2:
setup(
name="Send2Trash",
version="1.7.1",
version="1.8.0",
author="Andrew Senetar",
author_email="arsenetar@voltaicideas.net",
packages=["send2trash"],
@@ -34,8 +34,16 @@ setup(
license="BSD License",
description="Send file to trash natively under Mac OS X, Windows and Linux.",
long_description=LONG_DESCRIPTION,
long_description_content_type="text/x-rst",
classifiers=CLASSIFIERS,
extras_require={"win32": ["pywin32"]},
extras_require={
"win32": ['pywin32; sys_platform == "win32"'],
"objc": ['pyobjc-framework-Cocoa; sys_platform == "darwin"'],
"nativeLib": [
'pywin32; sys_platform == "win32"',
'pyobjc-framework-Cocoa; sys_platform == "darwin"',
],
},
project_urls={"Bug Reports": "https://github.com/arsenetar/send2trash/issues"},
entry_points={"console_scripts": ["send2trash=send2trash.__main__:main"]},
)