Add same-codebase support for python 2.7.

When I opted for two codebases for python2/python3,
Send2Trash used C modules and it was easier to just have two
packages. With the ctypes version, supporting both python
versions becomes trivial and it's much more convenient to
merge them back into a single codebase.

I've only tested this code on Linux. I've converted plat_osx and
plat_win, but they only work theoretically.
This commit is contained in:
Virgil Dupras 2013-07-19 18:42:32 -04:00
parent a8dbb1ac63
commit bb8ed834da
9 changed files with 51 additions and 17 deletions

View File

@ -1,4 +1,4 @@
Copyright (c) 2010, Hardcoded Software Inc., http://www.hardcoded.net Copyright (c) 2013, Hardcoded Software, http://www.hardcoded.net
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

View File

@ -1 +1 @@
include CHANGES include CHANGES.rst

View File

@ -2,19 +2,25 @@
Send2Trash -- Send files to trash on all platforms Send2Trash -- Send files to trash on all platforms
================================================== ==================================================
This is a Python 3 package. The Python 2 package is at http://pypi.python.org/pypi/Send2Trash .
Send2Trash is a small package that sends files to the Trash (or Recycle Bin) *natively* and on 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 (and ugly) ``SHFileOperation`` win32 calls. On other platforms, it follows the trash specifications from freedesktop.org. *all platforms*. On OS X, it uses native ``FSMoveObjectToTrashSync`` Cocoa calls, on Windows, it
uses native (and ugly) ``SHFileOperation`` win32 calls. On other platforms, it follows the trash
specifications from freedesktop.org.
``ctypes`` is used to access native libraries, so no compilation is necessary. ``ctypes`` is used to access native libraries, so no compilation is necessary.
Send2Trash supports Python 2.7 and up (Python 3 is supported).
Installation Installation
------------ ------------
Download the source from http://github.com/hsoft/send2trash and install it with:: You can download it with pip::
>>> python setup.py install pip install Send2Trash
or you can download the source from http://github.com/hsoft/send2trash and install it with::
>>> python setup.py install
Usage Usage
----- -----
@ -22,4 +28,4 @@ Usage
>>> from send2trash import send2trash >>> from send2trash import send2trash
>>> send2trash('some_file') >>> send2trash('some_file')
When there's a problem ``OSError`` is raised. When there's a problem ``OSError`` is raised.

View File

@ -1,4 +1,4 @@
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) # Copyright 2013 Hardcoded Software (http://www.hardcoded.net)
# This software is licensed under the "BSD" License as described in the "LICENSE" file, # 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 # which should be included with this package. The terms are also available at

13
send2trash/compat.py Normal file
View File

@ -0,0 +1,13 @@
# Copyright 2013 Hardcoded Software (http://www.hardcoded.net)
# 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
import sys
if sys.version < '3':
text_type = unicode
binary_type = str
else:
text_type = str
binary_type = bytes

View File

@ -1,12 +1,16 @@
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) # Copyright 2013 Hardcoded Software (http://www.hardcoded.net)
# This software is licensed under the "BSD" License as described in the "LICENSE" file, # 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 # 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 __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
Foundation = cdll.LoadLibrary(find_library('Foundation')) Foundation = cdll.LoadLibrary(find_library('Foundation'))
CoreServices = cdll.LoadLibrary(find_library('CoreServices')) CoreServices = cdll.LoadLibrary(find_library('CoreServices'))
@ -33,7 +37,7 @@ def check_op_result(op_result):
raise OSError(msg) raise OSError(msg)
def send2trash(path): def send2trash(path):
if not isinstance(path, bytes): if not isinstance(path, binary_type):
path = path.encode('utf-8') path = path.encode('utf-8')
fp = FSRef() fp = FSRef()
opts = kFSPathMakeRefDoNotFollowLeafSymlink opts = kFSPathMakeRefDoNotFollowLeafSymlink

View File

@ -1,4 +1,4 @@
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) # Copyright 2013 Hardcoded Software (http://www.hardcoded.net)
# This software is licensed under the "BSD" License as described in the "LICENSE" file, # 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 # which should be included with this package. The terms are also available at
@ -14,12 +14,18 @@
# For external volumes this implementation will raise an exception if it can't # For external volumes this implementation will raise an exception if it can't
# find or create the user's trash directory. # find or create the user's trash directory.
from __future__ import unicode_literals
import sys import sys
import os import os
import os.path as op import os.path as op
from datetime import datetime from datetime import datetime
import stat import stat
from urllib.parse import quote try:
from urllib.parse import quote
except ImportError:
# Python 2
from urllib import quote
FILES_DIR = 'files' FILES_DIR = 'files'
INFO_DIR = 'info' INFO_DIR = 'info'

View File

@ -1,13 +1,17 @@
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) # Copyright 2013 Hardcoded Software (http://www.hardcoded.net)
# This software is licensed under the "BSD" License as described in the "LICENSE" file, # 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 # 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 __future__ import unicode_literals
from ctypes import windll, Structure, byref, c_uint from ctypes import windll, Structure, byref, c_uint
from ctypes.wintypes import HWND, UINT, LPCWSTR, BOOL from ctypes.wintypes import HWND, UINT, LPCWSTR, BOOL
import os.path as op import os.path as op
from .compat import text_type
shell32 = windll.shell32 shell32 = windll.shell32
SHFileOperationW = shell32.SHFileOperationW SHFileOperationW = shell32.SHFileOperationW
@ -35,8 +39,8 @@ FOF_ALLOWUNDO = 64
FOF_NOERRORUI = 1024 FOF_NOERRORUI = 1024
def send2trash(path): def send2trash(path):
if not isinstance(path, str): if not isinstance(path, text_type):
path = str(path, 'mbcs') path = text_type(path, 'mbcs')
if not op.isabs(path): if not op.isabs(path):
path = op.abspath(path) path = op.abspath(path)
fileop = SHFILEOPSTRUCTW() fileop = SHFILEOPSTRUCTW()

View File

@ -10,6 +10,7 @@ CLASSIFIERS = [
'Operating System :: MacOS :: MacOS X', 'Operating System :: MacOS :: MacOS X',
'Operating System :: Microsoft :: Windows', 'Operating System :: Microsoft :: Windows',
'Operating System :: POSIX', 'Operating System :: POSIX',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Topic :: Desktop Environment :: File Managers', 'Topic :: Desktop Environment :: File Managers',
] ]
@ -17,7 +18,7 @@ CLASSIFIERS = [
LONG_DESCRIPTION = open('README.rst', 'rt').read() + '\n\n' + open('CHANGES.rst', 'rt').read() LONG_DESCRIPTION = open('README.rst', 'rt').read() + '\n\n' + open('CHANGES.rst', 'rt').read()
setup( setup(
name='Send2Trash3k', name='Send2Trash',
version='1.2.0', version='1.2.0',
author='Hardcoded Software', author='Hardcoded Software',
author_email='hsoft@hardcoded.net', author_email='hsoft@hardcoded.net',