diff --git a/mdn/data.py b/mdn/data.py index 15585d4..020b6e9 100644 --- a/mdn/data.py +++ b/mdn/data.py @@ -24,7 +24,8 @@ def __init__(self): BrowserParams = namedtuple( 'BrowserParams', ['browser', 'browser_id', 'name', 'slug']) - browser_name_fixes = { + # bug 1128525 changes names and slugs so that desktop isn't implied + pre_1128525_name_fixes = { 'Firefox (Gecko)': 'Firefox', 'Firefox Mobile (Gecko)': 'Firefox Mobile', 'Firefox OS (Gecko)': 'Firefox OS', @@ -33,6 +34,27 @@ def __init__(self): 'IE Phone': 'IE Mobile', 'IE': 'Internet Explorer', } + post_1128525_name_fixes = { + 'Android': 'Android Browser', + 'BlackBerry': 'BlackBerry Browser', + 'Chrome': 'Chrome for Desktop', + 'Firefox (Gecko)': 'Firefox for Desktop', + 'Firefox Mobile (Gecko)': 'Firefox for Android', + 'Firefox Mobile': 'Firefox for Android', + 'Firefox OS (Gecko)': 'Firefox OS', + 'Firefox': 'Firefox for Desktop', + 'IE Mobile': 'Internet Explorer Mobile', + 'IE Phone': 'Internet Explorer Mobile', + 'IE': 'Internet Explorer for Desktop', + 'iOS Safari': 'Safari for iOS', + 'Internet Explorer': 'Internet Explorer for Desktop', + 'Opera': 'Opera for Desktop', + 'Opera (Presto)': 'Opera for Desktop', + 'Safari (WebKit)': 'Safari for Desktop', + 'Safari Mobile': 'Safari for iOS', + 'Safari': 'Safari for Desktop', + 'Windows Phone': 'Internet Explorer Mobile', + } def lookup_browser_params(self, name, locale='en'): """Get or create the browser ID, name, and slug given a raw name. @@ -44,23 +66,30 @@ def lookup_browser_params(self, name, locale='en'): * slug - A unique slug for this browser """ # Load existing browser data + # Also, detect if names and slugs have been changed by bug 1128525 if self.browser_data is None: self.browser_data = {} for browser in Browser.objects.all(): key = browser.name[locale] + if key == 'Firefox': + self.browser_name_fixes = self.pre_1128525_name_fixes + if key == 'Firefox for Desktop': + self.browser_name_fixes = self.post_1128525_name_fixes self.browser_data[key] = self.BrowserParams( browser, browser.pk, key, browser.slug) + if not hasattr(self, 'browser_name_fixes'): + self.browser_name_fixes = self.pre_1128525_name_fixes - # Handle common alternate names - fixed_name = self.browser_name_fixes.get(name, name) + # Expand to full name, handle common alternate names + full_name = self.browser_name_fixes.get(name, name) # Select the Browser ID and slug - if fixed_name not in self.browser_data: - browser_id = '_' + fixed_name + if full_name not in self.browser_data: + browser_id = '_' + full_name # TODO: unique slugify instead of browser_id - self.browser_data[fixed_name] = self.BrowserParams( - None, browser_id, fixed_name, browser_id) - return self.browser_data[fixed_name] + self.browser_data[full_name] = self.BrowserParams( + None, browser_id, full_name, browser_id) + return self.browser_data[full_name] FeatureParams = namedtuple( 'FeatureParams', ['feature', 'feature_id', 'slug']) diff --git a/mdn/tests/base.py b/mdn/tests/base.py index 9a78242..1ae08e9 100644 --- a/mdn/tests/base.py +++ b/mdn/tests/base.py @@ -58,11 +58,13 @@ class TestCase(BaseTestCase): ('Feature', 'web-css-background-size-contain_and_cover'): { '_req': {'parent': ('Feature', 'web-css-background-size')}, 'name': '{"en": "contain and cover"}'}, - ('Browser', 'chrome'): {'name': '{"en": "Chrome"}'}, - ('Browser', 'firefox'): {'name': '{"en": "Firefox"}'}, - ('Version', ('chrome', '1.0')): {}, - ('Version', ('firefox', 'current')): {}, - ('Version', ('firefox', '1.0')): {}, + ('Browser', 'chrome_desktop'): { + 'name': '{"en": "Chrome for Desktop"}'}, + ('Browser', 'firefox_desktop'): { + 'name': '{"en": "Firefox for Desktop"}'}, + ('Version', ('chrome_desktop', '1.0')): {}, + ('Version', ('firefox_desktop', 'current')): {}, + ('Version', ('firefox_desktop', '1.0')): {}, } def get_instance(self, model_cls_name, slug): diff --git a/mdn/tests/test_compatibility.py b/mdn/tests/test_compatibility.py index 06f7db5..a4f9cef 100644 --- a/mdn/tests/test_compatibility.py +++ b/mdn/tests/test_compatibility.py @@ -17,7 +17,7 @@ class TestCompatSectionExtractor(TestCase): def setUp(self): self.feature = self.get_instance('Feature', 'web-css-background-size') self.visitor = KumaVisitor() - self.version = self.get_instance('Version', ('firefox', '1.0')) + self.version = self.get_instance('Version', ('firefox_desktop', '1.0')) def construct_html( self, header=None, pre_table=None, feature=None, @@ -56,7 +56,8 @@ def get_default_compat_div(self): return { 'name': u'desktop', 'browsers': [{ - 'id': browser_id, 'name': 'Firefox', 'slug': 'firefox'}], + 'id': browser_id, 'name': 'Firefox for Desktop', + 'slug': 'firefox_desktop'}], 'versions': [{ 'browser': browser_id, 'id': version_id, 'version': '1.0'}], 'features': [{ @@ -160,9 +161,9 @@ def test_compat_mobile_table(self): expected_mobile = { 'name': 'mobile', 'browsers': [{ - 'id': '_Safari Mobile', - 'name': 'Safari Mobile', - 'slug': '_Safari Mobile', + 'id': '_Safari for iOS', + 'name': 'Safari for iOS', + 'slug': '_Safari for iOS', }], 'features': [{ 'id': '_contain and cover', @@ -170,15 +171,15 @@ def test_compat_mobile_table(self): 'slug': 'web-css-background-size_contain_and_cover', }], 'versions': [{ - 'id': '_Safari Mobile-1.0', + 'id': '_Safari for iOS-1.0', 'version': '1.0', - 'browser': '_Safari Mobile', + 'browser': '_Safari for iOS', }], 'supports': [{ - 'id': '__contain and cover-_Safari Mobile-1.0', + 'id': '__contain and cover-_Safari for iOS-1.0', 'feature': '_contain and cover', 'support': 'yes', - 'version': '_Safari Mobile-1.0', + 'version': '_Safari for iOS-1.0', 'footnote': "It's really supported.", 'footnote_id': ('1', 581, 584), }], @@ -602,24 +603,25 @@ def test_version(self): self.assert_support('1.0', [{'version': '1.0'}], [{'support': 'yes'}]) def test_version_matches(self): - version = self.get_instance('Version', ('firefox', '1.0')) + version = self.get_instance('Version', ('firefox_desktop', '1.0')) self.set_browser(version.browser) self.assert_support( '1.0', [{'version': '1.0', 'id': version.id}], [{'support': 'yes'}]) def test_new_version_existing_browser(self): - browser = self.get_instance('Browser', 'firefox') + browser = self.get_instance('Browser', 'firefox_desktop') self.set_browser(browser) issue = ( 'unknown_version', 4, 7, - {'browser_id': browser.id, 'browser_name': {"en": "Firefox"}, - 'browser_slug': 'firefox', 'version': '2.0'}) + {'browser_id': browser.id, + 'browser_name': {"en": "Firefox for Desktop"}, + 'browser_slug': 'firefox_desktop', 'version': '2.0'}) self.assert_support( '2.0', [{'version': '2.0'}], [{'support': 'yes'}], issues=[issue]) def test_support_matches(self): - version = self.get_instance('Version', ('firefox', '1.0')) + version = self.get_instance('Version', ('firefox_desktop', '1.0')) self.set_browser(version.browser) feature = self.get_instance( 'Feature', 'web-css-background-size-contain_and_cover') diff --git a/mdn/tests/test_data.py b/mdn/tests/test_data.py index cf5bb6d..dff2a70 100644 --- a/mdn/tests/test_data.py +++ b/mdn/tests/test_data.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from mdn.data import Data -from webplatformcompat.models import Feature, Support +from webplatformcompat.models import Browser, Feature, Support from .base import TestCase @@ -23,14 +23,28 @@ def assert_browser_params(self, raw_name, browser, b_id, name, slug): new_params = self.data.lookup_browser_params(raw_name) self.assertEqual(params, new_params) - def test_browser_params_new(self): + def test_browser_params_new_pre_1128525(self): + self.create(Browser, slug="chrome", name='{"en": "Chrome"}') + self.create(Browser, slug="firefox", name='{"en": "Firefox"}') self.assert_browser_params( - 'Firefox', None, '_Firefox', 'Firefox', '_Firefox') + 'Safari', None, '_Safari', 'Safari', '_Safari') + + def test_browser_params_new_defaults_to_pre_1128525(self): + self.assert_browser_params( + 'Safari', None, '_Safari', 'Safari', '_Safari') + + def test_browser_params_new_post_1128525(self): + self.get_instance('Browser', 'chrome_desktop') + self.get_instance('Browser', 'firefox_desktop') + self.assert_browser_params( + 'Safari', None, '_Safari for Desktop', 'Safari for Desktop', + '_Safari for Desktop') def test_browser_params_match(self): - match = self.get_instance('Browser', 'firefox') + match = self.get_instance('Browser', 'firefox_desktop') self.assert_browser_params( - 'Firefox', match, match.id, 'Firefox', 'firefox') + 'Firefox', match, match.id, 'Firefox for Desktop', + 'firefox_desktop') class TestLookupFeatureParams(TestDataBase): @@ -114,7 +128,8 @@ def test_not_found_but_others(self): class TestLookupSupportId(TestDataBase): def setUp(self): super(TestLookupSupportId, self).setUp() - self.version = self.get_instance('Version', ('firefox', 'current')) + self.version = self.get_instance( + 'Version', ('firefox_desktop', 'current')) self.feature = self.get_instance( 'Feature', 'web-css-background-size-contain_and_cover') @@ -146,7 +161,7 @@ def test_found(self): class TestLookupVersionParams(TestDataBase): def setUp(self): super(TestLookupVersionParams, self).setUp() - self.browser = self.get_instance('Browser', 'firefox') + self.browser = self.get_instance('Browser', 'firefox_desktop') def test_new_browser(self): params = self.data.lookup_version_params('_browser', 'Browser', '1.0') @@ -157,10 +172,10 @@ def test_new_version(self): params = self.data.lookup_version_params( self.browser.id, self.browser.name['en'], '1.0') self.assertIsNone(params.version) - self.assertEqual('_Firefox-1.0', params.version_id) + self.assertEqual('_Firefox for Desktop-1.0', params.version_id) def test_existing_version(self): - version = self.get_instance('Version', ('firefox', 'current')) + version = self.get_instance('Version', ('firefox_desktop', 'current')) params = self.data.lookup_version_params( self.browser.id, self.browser.name['en'], 'current') self.assertEqual(version, params.version) diff --git a/mdn/tests/test_scrape.py b/mdn/tests/test_scrape.py index 41e233c..02f0352 100644 --- a/mdn/tests/test_scrape.py +++ b/mdn/tests/test_scrape.py @@ -61,13 +61,14 @@ def get_sample_compat(self): """ - version = self.get_instance('Version', ('firefox', '1.0')) + version = self.get_instance('Version', ('firefox_desktop', '1.0')) browser_id = version.browser_id version_id = version.id expected_compat = [{ 'name': u'desktop', 'browsers': [{ - 'id': browser_id, 'name': 'Firefox', 'slug': 'firefox'}], + 'id': browser_id, 'name': 'Firefox for Desktop', + 'slug': 'firefox_desktop'}], 'versions': [{ 'browser': browser_id, 'id': version_id, 'version': '1.0'}], 'features': [{ @@ -395,12 +396,12 @@ def test_new_section(self): self.assertDataEqual(expected, section_content) def test_load_browser(self): - browser = self.get_instance('Browser', 'firefox') + browser = self.get_instance('Browser', 'firefox_desktop') view = ScrapedViewFeature(self.page, self.empty_scrape()) browser_content = view.load_browser(browser.id) expected = { - 'id': str(browser.id), 'name': {'en': 'Firefox'}, 'note': None, - 'slug': browser.slug} + 'id': str(browser.id), 'name': {'en': 'Firefox for Desktop'}, + 'note': None, 'slug': browser.slug} self.assertDataEqual(expected, browser_content) def test_new_browser(self): @@ -415,7 +416,7 @@ def test_new_browser(self): self.assertDataEqual(expected, browser_content) def test_load_version(self): - version = self.get_instance('Version', ('firefox', '1.0')) + version = self.get_instance('Version', ('firefox_desktop', '1.0')) view = ScrapedViewFeature(self.page, self.empty_scrape()) version_content = view.load_version(version.id) expected = { @@ -526,7 +527,7 @@ def test_new_feature_canonical(self): self.assertDataEqual(expected, feature_content) def test_load_support(self): - version = self.get_instance('Version', ('firefox', '1.0')) + version = self.get_instance('Version', ('firefox_desktop', '1.0')) feature = self.get_instance( 'Feature', 'web-css-background-size-contain_and_cover') support = self.create(Support, version=version, feature=feature) @@ -652,7 +653,7 @@ def test_load_compat_table_new_resources(self): self.assertDataEqual(expected, out) def test_load_compat_table_existing_resources(self): - version = self.get_instance('Version', ('firefox', '1.0')) + version = self.get_instance('Version', ('firefox_desktop', '1.0')) browser = version.browser feature = self.get_instance( 'Feature', 'web-css-background-size-contain_and_cover') @@ -691,7 +692,7 @@ def test_load_compat_table_existing_resources(self): self.assertDataEqual(expected, out) def test_load_compat_table_basic_support(self): - version = self.get_instance('Version', ('firefox', '1.0')) + version = self.get_instance('Version', ('firefox_desktop', '1.0')) browser = version.browser feature = self.feature browser_id = str(browser.id) @@ -728,7 +729,7 @@ def test_load_compat_table_basic_support(self): self.assertDataEqual(expected, out) def test_load_compat_table_new_support_with_note(self): - version = self.get_instance('Version', ('firefox', '1.0')) + version = self.get_instance('Version', ('firefox_desktop', '1.0')) browser = version.browser feature = self.get_instance( 'Feature', 'web-css-background-size-contain_and_cover')