diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2017-08-08 12:56:28 -0700 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2017-08-28 16:53:04 -0700 |
commit | 362268d9a506c1d87f197bccef6fed0dcb83d629 (patch) | |
tree | cf0f48c8c93ff908cfbe37aece817af7b716ca81 | |
parent | 593539bd091dfc53af62180b6a5559487213f953 (diff) |
Use new Address class
This just wries the new Address class into alot for use, and fixes up a
few places where such fixups are needed.
Fixes #1107
-rw-r--r-- | alot/account.py | 7 | ||||
-rw-r--r-- | alot/commands/thread.py | 6 | ||||
-rw-r--r-- | alot/defaults/alot.rc.spec | 8 | ||||
-rw-r--r-- | tests/commands/thread_test.py | 78 | ||||
-rw-r--r-- | tests/settings/manager_test.py | 7 |
5 files changed, 58 insertions, 48 deletions
diff --git a/alot/account.py b/alot/account.py index 01a536d0..e561f0c9 100644 --- a/alot/account.py +++ b/alot/account.py @@ -201,7 +201,7 @@ class Account(object): signature_filename=None, signature_as_attachment=False, sent_box=None, sent_tags=None, draft_box=None, draft_tags=None, abook=None, sign_by_default=False, - encrypt_by_default=u"none", + encrypt_by_default=u"none", case_sensitive_username=False, **_): sent_tags = sent_tags or [] if 'sent' not in sent_tags: @@ -210,8 +210,9 @@ class Account(object): if 'draft' not in draft_tags: draft_tags.append('draft') - self.address = address - self.aliases = aliases or [] + self.address = Address.from_string(address, case_sensitive=case_sensitive_username) + self.aliases = [Address.from_string(a, case_sensitive=case_sensitive_username) + for a in (aliases or [])] self.alias_regexp = alias_regexp self.realname = realname self.gpg_key = gpg_key diff --git a/alot/commands/thread.py b/alot/commands/thread.py index 02017ae9..437a9bd0 100644 --- a/alot/commands/thread.py +++ b/alot/commands/thread.py @@ -71,11 +71,13 @@ def determine_sender(mail, action='reply'): # pick the most important account that has an address in candidates # and use that accounts realname and the address found here for account in my_accounts: - acc_addresses = [re.escape(a) for a in account.get_addresses()] + acc_addresses = [re.escape(unicode(a)) for a in account.get_addresses()] if account.alias_regexp is not None: acc_addresses.append(account.alias_regexp) for alias in acc_addresses: - regex = re.compile('^' + alias + '$', flags=re.IGNORECASE) + regex = re.compile( + u'^' + unicode(alias) + u'$', + flags=re.IGNORECASE if not account.address.case_sensitive else 0) for seen_name, seen_address in candidate_addresses: if regex.match(seen_address): logging.debug("match!: '%s' '%s'", seen_address, alias) diff --git a/alot/defaults/alot.rc.spec b/alot/defaults/alot.rc.spec index 97de329d..eeae4348 100644 --- a/alot/defaults/alot.rc.spec +++ b/alot/defaults/alot.rc.spec @@ -355,6 +355,14 @@ thread_focus_linewise = boolean(default=True) # use your default key. gpg_key = gpg_key_hint(default=None) + # Whether the server treats the address as case-senstive or + # case-insensitve (True for the former, False for the latter) + # + # .. note:: The vast majority (if not all) SMTP servers in modern use + # treat usernames as case insenstive, you should only set + # this if you know that you need it. + case_sensitive_username = boolean(default=False) + # address book for this account [[[abook]]] # type identifier for address book diff --git a/tests/commands/thread_test.py b/tests/commands/thread_test.py index ede9e3b7..6897a953 100644 --- a/tests/commands/thread_test.py +++ b/tests/commands/thread_test.py @@ -151,77 +151,77 @@ class TestDetermineSender(unittest.TestCase): self.assertTupleEqual(cm2.exception.args, expected) def test_default_account_is_used_if_no_match_is_found(self): - account1 = _AccountTestClass(address='foo@example.com') - account2 = _AccountTestClass(address='bar@example.com') - expected = ('foo@example.com', account1) + account1 = _AccountTestClass(address=u'foo@example.com') + account2 = _AccountTestClass(address=u'bar@example.com') + expected = (u'foo@example.com', account1) self._test(accounts=[account1, account2], expected=expected) def test_matching_address_and_account_are_returned(self): - account1 = _AccountTestClass(address='foo@example.com') - account2 = _AccountTestClass(address='to@example.com') - account3 = _AccountTestClass(address='bar@example.com') - expected = ('to@example.com', account2) + account1 = _AccountTestClass(address=u'foo@example.com') + account2 = _AccountTestClass(address=u'to@example.com') + account3 = _AccountTestClass(address=u'bar@example.com') + expected = (u'to@example.com', account2) self._test(accounts=[account1, account2, account3], expected=expected) def test_force_realname_includes_real_name_in_returned_address_if_defined(self): - account1 = _AccountTestClass(address='foo@example.com') - account2 = _AccountTestClass(address='to@example.com', realname='Bar') - account3 = _AccountTestClass(address='baz@example.com') - expected = ('Bar <to@example.com>', account2) + account1 = _AccountTestClass(address=u'foo@example.com') + account2 = _AccountTestClass(address=u'to@example.com', realname='Bar') + account3 = _AccountTestClass(address=u'baz@example.com') + expected = (u'Bar <to@example.com>', account2) self._test(accounts=[account1, account2, account3], expected=expected, force_realname=True) def test_doesnt_fail_with_force_realname_if_real_name_not_defined(self): - account1 = _AccountTestClass(address='foo@example.com') - account2 = _AccountTestClass(address='to@example.com') - account3 = _AccountTestClass(address='bar@example.com') - expected = ('to@example.com', account2) + account1 = _AccountTestClass(address=u'foo@example.com') + account2 = _AccountTestClass(address=u'to@example.com') + account3 = _AccountTestClass(address=u'bar@example.com') + expected = (u'to@example.com', account2) self._test(accounts=[account1, account2, account3], expected=expected, force_realname=True) def test_with_force_address_main_address_is_used_regardless_of_matching_address(self): # In python 3.4 this and the next test could be written as subtests. - account1 = _AccountTestClass(address='foo@example.com') - account2 = _AccountTestClass(address='bar@example.com', - aliases=['to@example.com']) - account3 = _AccountTestClass(address='bar@example.com') - expected = ('bar@example.com', account2) + account1 = _AccountTestClass(address=u'foo@example.com') + account2 = _AccountTestClass(address=u'bar@example.com', + aliases=[u'to@example.com']) + account3 = _AccountTestClass(address=u'bar@example.com') + expected = (u'bar@example.com', account2) self._test(accounts=[account1, account2, account3], expected=expected, force_address=True) def test_without_force_address_matching_address_is_used(self): # In python 3.4 this and the previous test could be written as # subtests. - account1 = _AccountTestClass(address='foo@example.com') - account2 = _AccountTestClass(address='bar@example.com', - aliases=['to@example.com']) - account3 = _AccountTestClass(address='baz@example.com') - expected = ('to@example.com', account2) + account1 = _AccountTestClass(address=u'foo@example.com') + account2 = _AccountTestClass(address=u'bar@example.com', + aliases=[u'to@example.com']) + account3 = _AccountTestClass(address=u'baz@example.com') + expected = (u'to@example.com', account2) self._test(accounts=[account1, account2, account3], expected=expected, force_address=False) def test_uses_to_header_if_present(self): - account1 = _AccountTestClass(address='foo@example.com') - account2 = _AccountTestClass(address='to@example.com') - account3 = _AccountTestClass(address='bar@example.com') - expected = ('to@example.com', account2) + account1 = _AccountTestClass(address=u'foo@example.com') + account2 = _AccountTestClass(address=u'to@example.com') + account3 = _AccountTestClass(address=u'bar@example.com') + expected = (u'to@example.com', account2) self._test(accounts=[account1, account2, account3], expected=expected) def test_header_order_is_more_important_than_accounts_order(self): - account1 = _AccountTestClass(address='cc@example.com') - account2 = _AccountTestClass(address='to@example.com') - account3 = _AccountTestClass(address='bcc@example.com') - expected = ('to@example.com', account2) + account1 = _AccountTestClass(address=u'cc@example.com') + account2 = _AccountTestClass(address=u'to@example.com') + account3 = _AccountTestClass(address=u'bcc@example.com') + expected = (u'to@example.com', account2) self._test(accounts=[account1, account2, account3], expected=expected) def test_accounts_can_be_found_by_alias_regex_setting(self): - account1 = _AccountTestClass(address='foo@example.com') - account2 = _AccountTestClass(address='to@example.com', + account1 = _AccountTestClass(address=u'foo@example.com') + account2 = _AccountTestClass(address=u'to@example.com', alias_regexp=r'to\+.*@example.com') - account3 = _AccountTestClass(address='bar@example.com') - mailstring = self.mailstring.replace('to@example.com', - 'to+some_tag@example.com') + account3 = _AccountTestClass(address=u'bar@example.com') + mailstring = self.mailstring.replace(u'to@example.com', + u'to+some_tag@example.com') mail = email.message_from_string(mailstring) - expected = ('to+some_tag@example.com', account2) + expected = (u'to+some_tag@example.com', account2) self._test(accounts=[account1, account2, account3], expected=expected, mail=mail) diff --git a/tests/settings/manager_test.py b/tests/settings/manager_test.py index d56c4364..a09dbf15 100644 --- a/tests/settings/manager_test.py +++ b/tests/settings/manager_test.py @@ -123,17 +123,17 @@ class TestSettingsManagerGetAccountByAddress(utilities.TestCaseClassCleanup): cls.manager = SettingsManager(alot_rc=f.name) def test_exists_addr(self): - acc = self.manager.get_account_by_address('that_guy@example.com') + acc = self.manager.get_account_by_address(u'that_guy@example.com') self.assertEqual(acc.realname, 'That Guy') def test_doesnt_exist_return_default(self): - acc = self.manager.get_account_by_address('doesntexist@example.com', + acc = self.manager.get_account_by_address(u'doesntexist@example.com', return_default=True) self.assertEqual(acc.realname, 'That Guy') def test_doesnt_exist_raise(self): with self.assertRaises(NoMatchingAccount): - self.manager.get_account_by_address('doesntexist@example.com') + self.manager.get_account_by_address(u'doesntexist@example.com') def test_doesnt_exist_no_default(self): with tempfile.NamedTemporaryFile() as f: @@ -148,7 +148,6 @@ class TestSettingsManagerGetAccountByAddress(utilities.TestCaseClassCleanup): 'That Guy <a_dude@example.com>') self.assertEqual(acc.realname, 'A Dude') - @unittest.expectedFailure def test_address_case(self): """Some servers do not differentiate addresses by case. |