<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>beforeRunningCommand</key>
	<string>nop</string>
	<key>command</key>
	<string>#!/usr/bin/python
"""Generate code to warn about a module's removal in Python 3.0.

XXX Not supported:
- Module's in a package do not have their full name generated.
- Package's __init__ module; should detect and use the package's name instead.

"""
py_template = """from warnings import warnpy3k
warnpy3k("the ${1:%s} module has been removed in Python 3.0", stacklevel=2)
del warnpy3k$0"""

c_template = """
if (PyErr_WarnPy3k("the ${1:%s} module has been removed in "
                   "Python 3.0", 2) &lt; 0)
    return;$0"""


import imp
import os

file_name = os.path.split(os.environ['TM_FILEPATH'])[1]

py_suffixes = reversed(sorted((suffix[0] for suffix in imp.get_suffixes() if suffix[2] == imp.PY_SOURCE), key=len))
c_suffixes = reversed(sorted((os.path.splitext(suffix[0])[0] + '.c'
                                for suffix in imp.get_suffixes() if suffix[2] == imp.C_EXTENSION), key=len))

pairings = ((py_suffixes, py_template), (c_suffixes, c_template))

def create_template(suffixes, template):
    for suffix in suffixes:
        if not file_name.endswith(suffix):
            continue
        module_name = file_name[:-len(suffix)]
        return template % module_name
    else:
        return None

for template in (create_template(*pair) for pair in pairings):
    if not template:
        continue
    print template,
    break
else:
    print 'XXX Could not generate code.'</string>
	<key>input</key>
	<string>none</string>
	<key>name</key>
	<string>2 to 3 - Module Deletion</string>
	<key>output</key>
	<string>insertAsSnippet</string>
	<key>tabTrigger</key>
	<string>2to3moddel</string>
	<key>uuid</key>
	<string>9519C22B-6AB8-41A1-94F6-079E0B45C147</string>
</dict>
</plist>
