From ef77a1477fa7ae95d6026271adb546124531b6f5 Mon Sep 17 00:00:00 2001 From: John Whitlock Date: Thu, 1 Oct 2015 17:01:02 -0500 Subject: [PATCH] bug 1128525 - Import new browser names and slugs This code switches to the new browser names and slugs, but falls back to the old behaviour if the name of Firefox is "Firefox" rather than "Firefox for Desktop". This will allow us to push code, then make the data changes. --- mdn/data.py | 45 +++++++++++++++++++++++++++------ mdn/tests/base.py | 12 +++++---- mdn/tests/test_compatibility.py | 30 ++++++++++++---------- mdn/tests/test_data.py | 33 +++++++++++++++++------- mdn/tests/test_scrape.py | 21 +++++++-------- 5 files changed, 95 insertions(+), 46 deletions(-) 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')