SimpleService

A PyObjC Example without documentation

Sources

ServiceTest.py

import Cocoa
import objc


def serviceSelector(fn):
    # this is the signature of service selectors
    return objc.selector(fn, signature=b"v@:@@o^@")


def ERROR(s):
    # NSLog(u"ERROR: %s", s)
    return s


class ServiceTest(Cocoa.NSObject):
    @serviceSelector
    def doOpenFileService_userData_error_(self, pboard, data, error):
        try:
            types = pboard.types()
            pboardString = None
            if Cocoa.NSStringPboardType in types:
                pboardString = pboard.stringForType_(Cocoa.NSStringPboardType)
            if pboardString is None:
                return ERROR(
                    Cocoa.NSLocalizedString(
                        "Error: Pasteboard doesn't contain a string.",
                        "Pasteboard couldn't give string.",
                    )
                )

            if not Cocoa.NSWorkspace.sharedWorkspace().openFile_(pboardString):
                return ERROR(
                    Cocoa.NSLocalizedString(
                        "Error: Couldn't open file %s.",
                        "Couldn't perform service operation for file %s.",
                    )
                    % pboardString
                )

            return ERROR(None)
        except:  # noqa: E722, B001
            import traceback

            traceback.print_exc()
            return ERROR("Exception, see traceback")

    @serviceSelector
    def doCapitalizeService_userData_error_(self, pboard, data, err):
        # NSLog(u"doCapitalizeService_userData_error_(%s, %s)", pboard, data)
        try:
            types = pboard.types()
            pboardString = None
            if Cocoa.NSStringPboardType in types:
                pboardString = pboard.stringForType_(Cocoa.NSStringPboardType)
            if pboardString is None:
                return ERROR(
                    Cocoa.NSLocalizedString(
                        "Error: Pasteboard doesn't contain a string.",
                        "Pasteboard couldn't give string.",
                    )
                )

            newString = Cocoa.NSString.capitalizedString(pboardString)

            if not newString:
                return ERROR(
                    Cocoa.NSLocalizedString(
                        "Error: Couldn't capitalize string %s.",
                        "Couldn't perform service operation for string %s.",
                    )
                    % pboardString
                )

            types = [Cocoa.NSStringPboardType]
            pboard.declareTypes_owner_([Cocoa.NSStringPboardType], None)
            pboard.setString_forType_(newString, Cocoa.NSStringPboardType)
            return ERROR(None)
        except:  # noqa: E722, B001
            import traceback

            traceback.print_exc()
            return ERROR("Exception, see traceback")

SimpleService_main.py

from Cocoa import NSRegisterServicesProvider
from PyObjCTools import AppHelper
from ServiceTest import ServiceTest


def main():
    serviceProvider = ServiceTest.alloc().init()
    NSRegisterServicesProvider(serviceProvider, "PyObjCSimpleService")
    AppHelper.runConsoleEventLoop()


if __name__ == "__main__":
    main()

rebuild.py

#!/usr/bin/env python
"""
Quickie script to update the services
"""
import AppKit

AppKit.NSUpdateDynamicServices()

setup.py

"""
Script for building the example.

Usage:
    python3 setup.py py2app
"""

from setuptools import setup

plist = {
    "CFBundleIdentifier": "net.sf.pyobjc.PyObjCSimpleService",
    "CFBundleName": "PyObjCSimpleService",
    "LSBackgroundOnly": 1,
    "NSServices": [
        {
            "NSKeyEquivalent": {"default": "F"},
            "NSMenuItem": {"default": "Open File"},
            "NSMessage": "doOpenFileService",
            "NSPortName": "PyObjCSimpleService",
            "NSSendTypes": ["NSStringPboardType"],
        },
        {
            "NSMenuItem": {"default": "Capitalize String"},
            "NSMessage": "doCapitalizeService",
            "NSPortName": "PyObjCSimpleService",
            "NSReturnTypes": ["NSStringPboardType"],
            "NSSendTypes": ["NSStringPboardType"],
        },
    ],
}


setup(
    name="Simple Service",
    app=["SimpleService_main.py"],
    options={"py2app": {"plist": plist}},
    setup_requires=["py2app", "pyobjc-framework-Cocoa"],
)