Skip to content

Commit

Permalink
Ensure Workflow.settings is only accessed via the main Workflow instance
Browse files Browse the repository at this point in the history
  • Loading branch information
deanishe committed Jul 30, 2015
1 parent a57bcc9 commit 41eec92
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 46 deletions.
Binary file not shown.
47 changes: 29 additions & 18 deletions src/client.py
Expand Up @@ -22,13 +22,11 @@
from urllib import quote

from workflow.background import run_in_background, is_running
from workflow import Workflow

from common import ONE_DAY, appname, bundleid
import verbose_json as json

wf = Workflow()
log = wf.logger
log = None

match_bundle_id = re.compile(r'kMDItemCFBundleIdentifier = "(.+)"').match

Expand Down Expand Up @@ -83,11 +81,14 @@ class Formatter(object):
"""

def __init__(self, client):
global log
self.client = client
self.wf = self.client.wf
log = self.wf.logger
# Load rules
client_rules = {}
for path in [wf.workflowfile('client_rules.json'),
wf.datafile('client_rules.json')]:
for path in [self.wf.workflowfile('client_rules.json'),
self.wf.datafile('client_rules.json')]:
if not os.path.exists(path):
continue
log.debug(
Expand Down Expand Up @@ -181,7 +182,10 @@ class Client(object):
system default and which is the default for MailTo (if one is set)
"""

def __init__(self):
def __init__(self, wf):
global log
self.wf = wf
log = wf.logger
self.all_email_apps = []
self.system_default_app = {}
self.update()
Expand All @@ -194,22 +198,24 @@ def get_default_app(self):
"""

# return wf.settings.get('default_app') or self.system_default_app()
# return self.wf.settings.get('default_app') or self.system_default_app()

return wf.settings.get('default_app') or self.system_default_app
return self.wf.settings.get('default_app') or self.system_default_app

def set_default_app(self, app_path):
"""Set default email client to application at ``app_path``"""
d = {'path': app_path}
d['name'] = appname(app_path)
d['bundleid'] = bundleid(app_path)
wf.settings['default_app'] = d
self.wf.settings['default_app'] = d
# wf.settings.save()
log.debug('Set default app to : %r', d)

default_app = property(get_default_app, set_default_app)

def build_url(self, emails):
"""Return mailto: URL built with appropriate formatter"""
contacts = wf.cached_data('contacts', max_age=0)
contacts = self.wf.cached_data('contacts', max_age=0)

if not contacts:
raise ValueError('No contacts available')
Expand All @@ -229,13 +235,13 @@ def build_url(self, emails):
bundleid = app

formatter = Formatter(bundleid)
return formatter.get_url(recipients, wf.settings.get('use_name', True))
return formatter.get_url(recipients, self.wf.settings.get('use_name', True))

def update(self, force=False):
"""Load apps from cache, update if required"""
self.all_email_apps = wf.cached_data('all_apps', max_age=0)
self.system_default_app = wf.cached_data('system_default_app',
max_age=0)
self.all_email_apps = self.wf.cached_data('all_apps', max_age=0)
self.system_default_app = self.wf.cached_data('system_default_app',
max_age=0)
if self.all_email_apps is None:
self.all_email_apps = []
if self.system_default_app is None:
Expand All @@ -244,14 +250,15 @@ def update(self, force=False):
do_update = False
if force:
do_update = True
elif not wf.cached_data_fresh('all_apps', MAX_APP_CACHE_AGE):
elif not self.wf.cached_data_fresh('all_apps', MAX_APP_CACHE_AGE):
do_update = True
elif not wf.cached_data_fresh('system_default_app', MAX_APP_CACHE_AGE):
elif not self.wf.cached_data_fresh('system_default_app',
MAX_APP_CACHE_AGE):
do_update = True
# Update if required
if do_update:
log.debug('Updating application caches ...')
cmd = ['/usr/bin/python', wf.workflowfile('update_apps.py')]
cmd = ['/usr/bin/python', self.wf.workflowfile('update_apps.py')]
run_in_background('update-apps', cmd)

@property
Expand All @@ -264,12 +271,16 @@ def empty(self):


if __name__ == '__main__':
from workflow import Workflow
wf = Workflow()

def timeit(func, *args, **kwargs):
s = time()
func(*args, **kwargs)
d = time() - s
log.debug('{} run in {:0.3f} seconds'.format(func.__name__, d))
c = Client()

c = Client(wf)
wf.reset()
log.info('First run')
timeit(c.update)
Expand Down
42 changes: 21 additions & 21 deletions src/info.plist
Expand Up @@ -108,6 +108,25 @@
<key>version</key>
<integer>0</integer>
</dict>
<dict>
<key>config</key>
<dict>
<key>concurrently</key>
<false/>
<key>escaping</key>
<integer>0</integer>
<key>script</key>
<string>/usr/bin/python mailto.py {query}</string>
<key>type</key>
<integer>0</integer>
</dict>
<key>type</key>
<string>alfred.workflow.action.script</string>
<key>uid</key>
<string>CED507AD-5BAE-4B73-89F4-B5821D117157</string>
<key>version</key>
<integer>0</integer>
</dict>
<dict>
<key>config</key>
<dict>
Expand All @@ -133,25 +152,6 @@
<key>version</key>
<integer>0</integer>
</dict>
<dict>
<key>config</key>
<dict>
<key>concurrently</key>
<false/>
<key>escaping</key>
<integer>0</integer>
<key>script</key>
<string>/usr/bin/python mailto.py {query}</string>
<key>type</key>
<integer>0</integer>
</dict>
<key>type</key>
<string>alfred.workflow.action.script</string>
<key>uid</key>
<string>CED507AD-5BAE-4B73-89F4-B5821D117157</string>
<key>version</key>
<integer>0</integer>
</dict>
<dict>
<key>config</key>
<dict>
Expand Down Expand Up @@ -221,7 +221,7 @@ You can add multiple recipients or Groups from your Contacts and/or enter email
<key>75819088-6422-47FD-8865-62A41152B307</key>
<dict>
<key>ypos</key>
<real>190</real>
<real>130</real>
</dict>
<key>8550C579-13D1-4CC6-984E-11A6ADEC72EA</key>
<dict>
Expand All @@ -236,7 +236,7 @@ You can add multiple recipients or Groups from your Contacts and/or enter email
<key>CED507AD-5BAE-4B73-89F4-B5821D117157</key>
<dict>
<key>ypos</key>
<real>70</real>
<real>10</real>
</dict>
<key>CF6D257B-1578-4C99-A089-2DBAA53E61F4</key>
<dict>
Expand Down
12 changes: 6 additions & 6 deletions src/mailto.py
Expand Up @@ -148,7 +148,7 @@ def run(self, wf):
def do_search(self):
"""Search contacts"""
from client import Client
client = Client()
client = Client(self.wf)

log.debug('Searching contacts')

Expand Down Expand Up @@ -373,7 +373,7 @@ def do_compose(self):

query = self.args.query
log.debug('Composing email to {}'.format(query))
client = Client()
client = Client(self.wf)
emails = [s.strip() for s in query.split(',') if s.strip()]
url = client.build_url(emails)
log.debug('URL : {!r}'.format(url))
Expand Down Expand Up @@ -416,7 +416,7 @@ def do_reload(self):
from contacts import Contacts
from client import Client
Contacts().update(force=True)
Client().update(force=True)
Client(self.wf).update(force=True)
self.notify('Refreshing contacts and app caches…')
run_alfred('{} '.format(CONFIG_KEYWORD))
return 0
Expand Down Expand Up @@ -537,7 +537,7 @@ def do_config(self):
def get_config_items(self):
"""Return list of all configuration items"""
from client import Client
client = Client()
client = Client(self.wf)
items = []
help_text = ' // ↩ to change'

Expand Down Expand Up @@ -731,7 +731,7 @@ def get_config_items(self):
def choose_client(self, query):
"""Select a new email client"""
from client import Client
client = Client()
client = Client(self.wf)
log.debug('Choosing email client')
log.debug('query : {}'.format(query))
# apps list a list of tuples [(name, path), ...]
Expand Down Expand Up @@ -815,7 +815,7 @@ def choose_client(self, query):
def do_setclient(self):
"""Change default email client"""
from client import Client
client = Client()
client = Client(self.wf)
app_path = self.args.query
log.debug('Setting new client to : {}'.format(app_path))

Expand Down
2 changes: 1 addition & 1 deletion src/version
@@ -1 +1 @@
2.1.1
2.1.2

0 comments on commit 41eec92

Please sign in to comment.