From b87f117b4c46a8df2bdcabde40344262cdcab925 Mon Sep 17 00:00:00 2001 From: Dean Jackson Date: Sat, 25 Jun 2016 16:48:59 +0200 Subject: [PATCH] Add support for Alfred 3-only updates --- alfred-workflow-1.17.4.zip | Bin 0 -> 76501 bytes docs/user-manual/update.rst | 36 ++-- requirements-test.txt | 5 + .../{info.plist.test => info.plist.alfred2} | 0 tests/data/info.plist.alfred3 | 78 +++++++++ tests/info.plist.test | 62 ------- tests/test_update.py | 2 + tests/test_update_alfred3.py | 135 ++++++++++++++ tests/test_update_versions.py | 5 +- tests/test_web.py | 10 +- tests/test_web_broken.py | 73 ++++++++ tests/test_workflow.py | 5 + tests/util.py | 6 +- tox.ini | 1 + workflow/update.py | 164 ++++++++++++++---- workflow/version | 2 +- workflow/web.py | 11 +- workflow/workflow.py | 6 +- 18 files changed, 481 insertions(+), 120 deletions(-) create mode 100644 alfred-workflow-1.17.4.zip create mode 100644 requirements-test.txt rename tests/data/{info.plist.test => info.plist.alfred2} (100%) create mode 100644 tests/data/info.plist.alfred3 delete mode 100644 tests/info.plist.test create mode 100644 tests/test_update_alfred3.py create mode 100644 tests/test_web_broken.py diff --git a/alfred-workflow-1.17.4.zip b/alfred-workflow-1.17.4.zip new file mode 100644 index 0000000000000000000000000000000000000000..0efcec5be60b205dadb320d8feaf38449a6de586 GIT binary patch literal 76501 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

ZuU_p-u?B`QYp-G}H?RNwG?UL) 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 literal 0 HcmV?d00001 diff --git a/docs/user-manual/update.rst b/docs/user-manual/update.rst index 9ed2d1d4..c9502d03 100644 --- a/docs/user-manual/update.rst +++ b/docs/user-manual/update.rst @@ -21,16 +21,10 @@ Users can turn off automatic checks for updates with the ``workflow:noautoupdate :ref:`magic argument ` and back on again with ``workflow:autoupdate``. -.. danger:: - - If you are not careful, you might accidentally overwrite a local version of - the workflow you're working on and lose all your changes! It's a good idea - to make sure you increase the version number *before* you start making any - changes. - Currently, only updates from `GitHub releases`_ are supported. + GitHub releases =============== @@ -39,9 +33,10 @@ For your workflow to be able to recognise and download newer versions, the be one of the versions (i.e. tags) in the corresponding GitHub repo's releases list. See :ref:`version-numbers` for more information. -There must be **one (and only one)** ``.alfredworkflow`` binary attached to a -release otherwise the release will be ignored. This is the file that will be -downloaded and installed via Alfred's default installation mechanism. +There must be **one (and only one)** ``.alfredworkflow`` and/or **one (and only +one)** ``.alfred3workflow`` binary attached to a release otherwise the release +will be ignored. This is the file that will be downloaded and installed via +Alfred's default installation mechanism. .. important:: @@ -50,6 +45,27 @@ downloaded and installed via Alfred's default installation mechanism. been enabled or the ``prereleases`` key is set to ``True`` in the ``update_settings`` :class:`dict`. + +Supporting Alfred 2 and Alfred 3 +-------------------------------- + +Alfred 3 workflows are fundamentally incompatible with Alfred 2. + +If you want to make a new release of an existing workflow that breaks +compatibility with Alfred 2, it's important that you use the alternate +``.alfred3workflow`` file extension for your release binaries to prevent Alfred +2 installations trying to update themselves to death. + +You can have both an ``.alfredworkflow`` file and an ``.alfred3workflow`` file +in the same release. If Alfred-Workflow is running under Alfred 3, it will +prefer the ``.alfred3workflow`` if present. Under Alfred 2, or if the release +contains no ``.alfred3workflow`` file, Alfred-Workflow will use the +``.alfredworkflow`` file. + +There may only be one file of each type, however, or the release will be +considered invalid. + + Configuration ============= diff --git a/requirements-test.txt b/requirements-test.txt new file mode 100644 index 00000000..8ef03839 --- /dev/null +++ b/requirements-test.txt @@ -0,0 +1,5 @@ +pytest==2.8.7 +pytest-cov==2.2.1 +pytest-httpbin==0.2.0 +pytest-localserver==0.3.5 +tox==2.3.1 diff --git a/tests/data/info.plist.test b/tests/data/info.plist.alfred2 similarity index 100% rename from tests/data/info.plist.test rename to tests/data/info.plist.alfred2 diff --git a/tests/data/info.plist.alfred3 b/tests/data/info.plist.alfred3 new file mode 100644 index 00000000..bdf8aa30 --- /dev/null +++ b/tests/data/info.plist.alfred3 @@ -0,0 +1,78 @@ + + + + + bundleid + net.deanishe.alfred-workflow + connections + + createdby + Dean Jackson + description + Test alfred-workflow library + disabled + + name + Alfred-Workflow Test + objects + + + config + + alfredfiltersresults + + argumenttype + 0 + escaping + 102 + keyword + wftest + queuedelaycustom + 1 + queuedelayimmediatelyinitially + + queuedelaymode + 0 + queuemode + 1 + runningsubtext + Doin' stuff… + script + python test.py "$@" + scriptargtype + 1 + scriptfile + + subtext + Test alfred-workflow Python lib + title + Alfred-Workflow Test + type + 0 + withspace + + + type + alfred.workflow.input.scriptfilter + uid + 5F480F88-2088-4D34-B621-ACEBCB5E6753 + version + 2 + + + readme + + uidata + + 5F480F88-2088-4D34-B621-ACEBCB5E6753 + + xpos + 30 + ypos + 30 + + + webaddress + + + diff --git a/tests/info.plist.test b/tests/info.plist.test deleted file mode 100644 index a4a416af..00000000 --- a/tests/info.plist.test +++ /dev/null @@ -1,62 +0,0 @@ - - - - - bundleid - net.deanishe.alfred-workflow - connections - - createdby - Dean Jackson - description - Test alfred-workflow library - disabled - - name - Alfred-Workflow Test - objects - - - config - - argumenttype - 0 - escaping - 102 - keyword - wftest - runningsubtext - Doin' stuff… - script - python test.py "{query}" - subtext - Test alfred-workflow Python lib - title - Alfred-Workflow Test - type - 0 - withspace - - - type - alfred.workflow.input.scriptfilter - uid - 5F480F88-2088-4D34-B621-ACEBCB5E6753 - version - 0 - - - readme - - uidata - - 5F480F88-2088-4D34-B621-ACEBCB5E6753 - - ypos - 10 - - - webaddress - - - diff --git a/tests/test_update.py b/tests/test_update.py index d09a5d42..5810f41c 100644 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -84,6 +84,8 @@ def info(request): """Ensure `info.plist` exists in the working directory.""" create_info_plist() + os.environ['alfred_version'] = '2.4' + update._wf = None request.addfinalizer(delete_info_plist) diff --git a/tests/test_update_alfred3.py b/tests/test_update_alfred3.py new file mode 100644 index 00000000..9241ec58 --- /dev/null +++ b/tests/test_update_alfred3.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# Copyright (c) 2014 Fabio Niephaus , +# Dean Jackson +# +# MIT Licence. See http://opensource.org/licenses/MIT +# +# Created on 2014-08-16 +# + +# TODO: Offline tests using pytest_localserver + +""" +test_update_alfred3.py +""" + +from __future__ import print_function + +import os + +import pytest + +from util import create_info_plist, delete_info_plist, INFO_PLIST_TEST3 +from workflow import update + + +@pytest.fixture(scope='module') +def info(request): + """Ensure `info.plist` exists in the working directory.""" + create_info_plist() + os.environ['alfred_version'] = '2.4' + update._wf = None + request.addfinalizer(delete_info_plist) + + +@pytest.fixture(scope='module') +def info3(request): + """Ensure `info.plist` exists in the working directory.""" + create_info_plist(INFO_PLIST_TEST3) + os.environ['alfred_version'] = '3.0.2' + update._wf = None + request.addfinalizer(delete_info_plist) + + +def test_valid_releases_alfred2(info): + """Valid releases for Alfred 2.""" + # Valid release for 2 & 3 + r = update._validate_release({'tag_name': 'v1.2', 'assets': [ + {'browser_download_url': + 'blah.alfredworkflow'}], + 'prerelease': False}) + + assert r is not None + assert r['prerelease'] is False + assert r['download_url'] == 'blah.alfredworkflow' + + # Valid release for 3 only + r = update._validate_release({'tag_name': 'v1.2', 'assets': [ + {'browser_download_url': + 'blah.alfred3workflow'}], + 'prerelease': False}) + + assert r is None + + # Invalid release + r = update._validate_release({'tag_name': 'v1.2', 'assets': [ + {'browser_download_url': + 'blah.alfred3workflow'}, + {'browser_download_url': + 'blah2.alfred3workflow'}], + 'prerelease': False}) + + assert r is None + + # Valid for 2 & 3 with separate workflows + r = update._validate_release({'tag_name': 'v1.2', 'assets': [ + {'browser_download_url': + 'blah.alfredworkflow'}, + {'browser_download_url': + 'blah.alfred3workflow'}], + 'prerelease': False}) + + assert r is not None + assert r['version'] == 'v1.2' + assert r['download_url'] == 'blah.alfredworkflow' + + +def test_valid_releases_alfred3(info3): + """Valid releases for Alfred 3.""" + # Valid release for 2 & 3 + r = update._validate_release({'tag_name': 'v1.2', 'assets': [ + {'browser_download_url': + 'blah.alfredworkflow'}], + 'prerelease': False}) + + assert r is not None + assert r['download_url'] == 'blah.alfredworkflow' + + # Valid release for 3 only + print('alfred_version=', os.environ['alfred_version']) + print('version=', update.wf().alfred_version) + r = update._validate_release({'tag_name': 'v1.2', 'assets': [ + {'browser_download_url': + 'blah.alfred3workflow'}], + 'prerelease': False}) + + assert r is not None + assert r['download_url'] == 'blah.alfred3workflow' + + # Invalid release + r = update._validate_release({'tag_name': 'v1.2', 'assets': [ + {'browser_download_url': + 'blah.alfred3workflow'}, + {'browser_download_url': + 'blah2.alfred3workflow'}], + 'prerelease': False}) + + assert r is None + + # Valid for 2 & 3 with separate workflows + r = update._validate_release({'tag_name': 'v1.2', 'assets': [ + {'browser_download_url': + 'blah.alfredworkflow'}, + {'browser_download_url': + 'blah.alfred3workflow'}], + 'prerelease': False}) + + assert r is not None + assert r['version'] == 'v1.2' + assert r['download_url'] == 'blah.alfred3workflow' + + +if __name__ == '__main__': # pragma: no cover + pytest.main([__file__]) diff --git a/tests/test_update_versions.py b/tests/test_update_versions.py index a57434fe..197d8803 100644 --- a/tests/test_update_versions.py +++ b/tests/test_update_versions.py @@ -7,9 +7,8 @@ # # Created on 2014-08-16 # -""" -test_versions.py -""" + +"""Test `update.Version` class.""" from __future__ import print_function diff --git a/tests/test_web.py b/tests/test_web.py index f71cc6c4..632996e9 100644 --- a/tests/test_web.py +++ b/tests/test_web.py @@ -209,9 +209,12 @@ def test_no_encoding(self): def test_xml_encoding(self): """XML is decoded""" - url = self.httpbin.url + '/response-headers' + # Why doesn't this work with a local httpbin? + # url = self.httpbin.url + '/response-headers' + url = 'http://httpbin.org/response-headers' params = {'Content-Type': 'text/xml;charset=UTF-8'} r = web.get(url, params) + r.raise_for_status() self.assertEqual(r.encoding, 'utf-8') self.assert_(isinstance(r.text, unicode)) @@ -224,11 +227,14 @@ def test_html_encoding(self): def test_default_encoding(self): """Default encodings for mimetypes""" - url = self.httpbin.url + '/response-headers' + # Why doesn't this work with a local httpbin? + # url = self.httpbin.url + '/response-headers' + url = 'http://httpbin.org/response-headers' # params = {'Content-Type': 'application/json'} # httpbin returns JSON by default. web.py should automatically # set `encoding` to UTF-8 when mimetype = 'application/json' r = web.get(url) + r.raise_for_status() self.assertEqual(r.encoding, 'utf-8') self.assert_(isinstance(r.text, unicode)) diff --git a/tests/test_web_broken.py b/tests/test_web_broken.py new file mode 100644 index 00000000..70fa6c44 --- /dev/null +++ b/tests/test_web_broken.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# Copyright (c) 2016 Dean Jackson +# +# MIT Licence. See http://opensource.org/licenses/MIT +# +# Created on 2016-02-23 +# +""" +test_web2.py + +""" + +from __future__ import print_function, unicode_literals + + +import os + +import pytest +import pytest_httpbin + +from workflow import web + + +DATA_DIR = os.path.join(os.path.dirname(__file__), 'data') + + +# Broken. Why doesn't this work with the local httpbin? +def no_test_default_encoding(httpbin): + """Default encodings for mimetypes.""" + url = httpbin.url + '/response-headers' + r = web.get(url) + r.raise_for_status() + # httpbin returns JSON by default. web.py should automatically + # set `encoding` to UTF-8 when mimetype = 'application/json' + assert r.encoding == 'utf-8' + assert isinstance(r.text, unicode) + + +# Broken. Why doesn't this work with the local httpbin? +def no_test_xml_encoding(httpbin): + """XML is decoded.""" + url = httpbin.url + '/response-headers' + params = {'Content-Type': 'text/xml; charset=UTF-8'} + r = web.get(url, params) + r.raise_for_status() + assert r.encoding == 'utf-8' + assert isinstance(r.text, unicode) + + +def test_default_encoding_remote(httpbin): + """Default encodings for mimetypes.""" + url = 'http://httpbin.org/response-headers' + r = web.get(url) + r.raise_for_status() + # httpbin returns JSON by default. web.py should automatically + # set `encoding` to UTF-8 when mimetype = 'application/json' + assert r.encoding == 'utf-8' + assert isinstance(r.text, unicode) + + +def test_xml_encoding_remote(httpbin): + """XML is decoded.""" + url = 'http://httpbin.org/response-headers' + params = {'Content-Type': 'text/xml; charset=UTF-8'} + r = web.get(url, params) + r.raise_for_status() + assert r.encoding == 'utf-8' + assert isinstance(r.text, unicode) + +if __name__ == '__main__': # pragma: no cover + pytest.main([__file__]) diff --git a/tests/test_workflow.py b/tests/test_workflow.py index 7de43787..ac2d69cf 100644 --- a/tests/test_workflow.py +++ b/tests/test_workflow.py @@ -1161,6 +1161,11 @@ def cb(wf): self.assertEqual(wf.last_version_run, Version(vstr)) wf.reset() + def test_alfred_version(self): + """Workflow: alfred_version correct.""" + wf = Workflow() + self.assertEqual(wf.alfred_version, Version('2.4')) + #################################################################### # Helpers #################################################################### diff --git a/tests/util.py b/tests/util.py index aa89f591..d3192c19 100644 --- a/tests/util.py +++ b/tests/util.py @@ -22,7 +22,11 @@ import tempfile INFO_PLIST_TEST = os.path.join(os.path.abspath(os.path.dirname(__file__)), - 'info.plist.test') + 'data/info.plist.alfred2') + +INFO_PLIST_TEST3 = os.path.join(os.path.abspath(os.path.dirname(__file__)), + 'data/info.plist.alfred3') + INFO_PLIST_PATH = os.path.join(os.path.abspath(os.getcwdu()), 'info.plist') diff --git a/tox.ini b/tox.ini index 7936d3ab..d8dc811c 100644 --- a/tox.ini +++ b/tox.ini @@ -10,6 +10,7 @@ addopts = --tb=long --color=auto --cov-report="" + --doctest-modules [tox] envlist=py26, py27 diff --git a/workflow/update.py b/workflow/update.py index 28f0f0ca..7094838a 100644 --- a/workflow/update.py +++ b/workflow/update.py @@ -49,16 +49,37 @@ def wf(): class Version(object): - """Mostly semantic versioning + """Mostly semantic versioning. The main difference to proper :ref:`semantic versioning ` is that this implementation doesn't require a minor or patch version. + + Version strings may also be prefixed with "v", e.g.: + + >>> v = Version('v1.1.1') + >>> v.tuple + (1, 1, 1, '') + + >>> v = Version('2.0') + >>> v.tuple + (2, 0, 0, '') + + >>> Version('3.1-beta').tuple + (3, 1, 0, 'beta') + + >>> Version('1.0.1') > Version('0.0.1') + True """ #: Match version and pre-release/build information in version strings match_version = re.compile(r'([0-9\.]+)(.+)?').match def __init__(self, vstr): + """Create new `Version` object. + + Args: + vstr (basestring): Semantic version string. + """ self.vstr = vstr self.major = 0 self.minor = 0 @@ -101,7 +122,7 @@ def _parse(self, vstr): # wf().logger.debug('version str `{}` -> {}'.format(vstr, repr(self))) def _parse_dotted_string(self, s): - """Parse string ``s`` into list of ints and strings""" + """Parse string ``s`` into list of ints and strings.""" parsed = [] parts = s.split('.') for p in parts: @@ -112,8 +133,7 @@ def _parse_dotted_string(self, s): @property def tuple(self): - """Version number as a tuple of major, minor, patch, pre-release""" - + """Version number as a tuple of major, minor, patch, pre-release.""" return (self.major, self.minor, self.patch, self.suffix) def __lt__(self, other): @@ -195,21 +215,74 @@ def download_workflow(url): def build_api_url(slug): - """Generate releases URL from GitHub slug + """Generate releases URL from GitHub slug. :param slug: Repo name in form ``username/repo`` :returns: URL to the API endpoint for the repo's releases - """ - + """ if len(slug.split('/')) != 2: raise ValueError('Invalid GitHub slug : {0}'.format(slug)) return RELEASES_BASE.format(slug) +def _validate_release(release): + """Return release for running version of Alfred.""" + alf3 = wf().alfred_version.major == 3 + + downloads = {'.alfredworkflow': [], '.alfred3workflow': []} + dl_count = 0 + version = release['tag_name'] + + for asset in release.get('assets', []): + url = asset.get('browser_download_url') + if not url: # pragma: nocover + continue + + ext = os.path.splitext(url)[1].lower() + if ext not in downloads: + continue + + # Ignore Alfred 3-only files if Alfred 2 is running + if ext == '.alfred3workflow' and not alf3: + continue + + downloads[ext].append(url) + dl_count += 1 + + # download_urls.append(url) + + if dl_count == 0: + wf().logger.warning( + 'Invalid release {0} : No workflow file'.format(version)) + return None + + for k in downloads: + if len(downloads[k]) > 1: + wf().logger.warning( + 'Invalid release %s : multiple %s files'.format(version, k)) + return None + + # Prefer .alfred3workflow file if there is one and Alfred 3 is + # running. + if alf3 and len(downloads['.alfred3workflow']): + download_url = downloads['.alfred3workflow'][0] + + else: + download_url = downloads['.alfredworkflow'][0] + + wf().logger.debug('Release `{0}` : {1}'.format(version, download_url)) + + return { + 'version': version, + 'download_url': download_url, + 'prerelease': release['prerelease'] + } + + def get_valid_releases(github_slug, prereleases=False): - """Return list of all valid releases + """Return list of all valid releases. :param github_slug: ``username/repo`` for workflow's GitHub repo :param prereleases: Whether to include pre-releases. @@ -224,7 +297,6 @@ def get_valid_releases(github_slug, prereleases=False): ``v`` will be stripped. """ - api_url = build_api_url(github_slug) releases = [] @@ -239,34 +311,58 @@ def retrieve_releases(): slug = github_slug.replace('/', '-') for release in wf().cached_data('gh-releases-{0}'.format(slug), retrieve_releases): - version = release['tag_name'] - download_urls = [] - for asset in release.get('assets', []): - url = asset.get('browser_download_url') - if not url or not url.endswith('.alfredworkflow'): - continue - download_urls.append(url) - - # Validate release - if release['prerelease'] and not prereleases: - wf().logger.warning( - 'Invalid release {0} : pre-release detected'.format(version)) - continue - if not download_urls: - wf().logger.warning( - 'Invalid release {0} : No workflow file'.format(version)) + + wf().logger.debug('Release : %r', release) + + release = _validate_release(release) + if release is None: + wf().logger.debug('Invalid release') continue - if len(download_urls) > 1: - wf().logger.warning( - 'Invalid release {0} : multiple workflow files'.format(version)) + + elif release['prerelease'] and not prereleases: + wf().logger.debug('Ignoring prerelease : %s', release['version']) continue - wf().logger.debug('Release `{0}` : {1}'.format(version, url)) - releases.append({ - 'version': version, - 'download_url': download_urls[0], - 'prerelease': release['prerelease'] - }) + releases.append(release) + + # else: + + # try: + # valid = _validate_release(release) + # except Exception as err: + # wf().logger.exception(err) + # raise err + # else: + # wf().logger.debug('valid=%r', valid) + + # version = release['tag_name'] + # download_urls = [] + # for asset in release.get('assets', []): + # url = asset.get('browser_download_url') + # if not url or not url.endswith('.alfredworkflow'): + # continue + # download_urls.append(url) + + # # Validate release + # if release['prerelease'] and not prereleases: + # wf().logger.warning( + # 'Invalid release {0} : pre-release detected'.format(version)) + # continue + # if not download_urls: + # wf().logger.warning( + # 'Invalid release {0} : No workflow file'.format(version)) + # continue + # if len(download_urls) > 1: + # wf().logger.warning( + # 'Invalid release {0} : multiple workflow files'.format(version)) + # continue + + # wf().logger.debug('Release `{0}` : {1}'.format(version, url)) + # releases.append({ + # 'version': version, + # 'download_url': download_urls[0], + # 'prerelease': release['prerelease'] + # }) return releases diff --git a/workflow/version b/workflow/version index 021c75ee..250f3597 100644 --- a/workflow/version +++ b/workflow/version @@ -1 +1 @@ -1.17.3 \ No newline at end of file +1.17.4 \ No newline at end of file diff --git a/workflow/web.py b/workflow/web.py index 3f63bdec..488f1aba 100644 --- a/workflow/web.py +++ b/workflow/web.py @@ -7,9 +7,7 @@ # Created on 2014-02-15 # -""" -A lightweight HTTP library with a requests-like interface. -""" +"""Lightweight HTTP library with a requests-like interface.""" from __future__ import print_function @@ -28,7 +26,7 @@ import zlib -USER_AGENT = u'Alfred-Workflow/1.17 (+http://www.deanishe.net/alfred-workflow)' +USER_AGENT = u'Alfred-Workflow/1.17.4 (+http://www.deanishe.net/alfred-workflow)' # Valid characters for multipart form data boundaries BOUNDARY_CHARS = string.digits + string.ascii_letters @@ -79,7 +77,7 @@ def str_dict(dic): - """Convert keys and values in ``dic`` into UTF-8-encoded :class:`str` + """Convert keys and values in ``dic`` into UTF-8-encoded :class:`str`. :param dic: :class:`dict` of Unicode strings :returns: :class:`dict` @@ -99,7 +97,7 @@ def str_dict(dic): class NoRedirectHandler(urllib2.HTTPRedirectHandler): - """Prevent redirections""" + """Prevent redirections.""" def redirect_request(self, *args): return None @@ -572,6 +570,7 @@ def request(method, url, params=None, data=None, headers=None, cookies=None, query = urllib.urlencode(str_dict(params), doseq=True) url = urlparse.urlunsplit((scheme, netloc, path, query, fragment)) + print('URL={0!r}\nDATA={1!r}\nHEADERS={2!r}'.format(url, data, headers)) req = urllib2.Request(url, data, headers) return Response(req, stream) diff --git a/workflow/workflow.py b/workflow/workflow.py index 4c4f6bb9..6e68e965 100644 --- a/workflow/workflow.py +++ b/workflow/workflow.py @@ -1029,7 +1029,6 @@ def setdefault(self, key, value=None): self.save() return ret - class Workflow(object): """Create new :class:`Workflow` instance. @@ -1128,6 +1127,11 @@ def __init__(self, default_settings=None, update_settings=None, # info.plist contents and alfred_* environment variables ---------- + @property + def alfred_version(self): + from update import Version + return Version(self.alfred_env.get('version')) + @property def alfred_env(self): """Alfred's environmental variables minus the ``alfred_`` prefix.