Skip to content
This repository has been archived by the owner on Nov 10, 2017. It is now read-only.

Commit

Permalink
bug 1128525 - Import new browser names and slugs
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jwhitlock committed Oct 2, 2015
1 parent 8747b27 commit ef77a14
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 46 deletions.
45 changes: 37 additions & 8 deletions mdn/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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.
Expand All @@ -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'])
Expand Down
12 changes: 7 additions & 5 deletions mdn/tests/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,13 @@ class TestCase(BaseTestCase):
('Feature', 'web-css-background-size-contain_and_cover'): {
'_req': {'parent': ('Feature', 'web-css-background-size')},
'name': '{"en": "<code>contain</code> and <code>cover</code>"}'},
('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):
Expand Down
30 changes: 16 additions & 14 deletions mdn/tests/test_compatibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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': [{
Expand Down Expand Up @@ -160,25 +161,25 @@ 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',
'name': '<code>contain</code> and <code>cover</code>',
'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),
}],
Expand Down Expand Up @@ -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')
Expand Down
33 changes: 24 additions & 9 deletions mdn/tests/test_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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):
Expand Down Expand Up @@ -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')

Expand Down Expand Up @@ -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')
Expand All @@ -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)
Expand Down
21 changes: 11 additions & 10 deletions mdn/tests/test_scrape.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,14 @@ def get_sample_compat(self):
</table>
</div>
"""
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': [{
Expand Down Expand Up @@ -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):
Expand All @@ -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 = {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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')
Expand Down

0 comments on commit ef77a14

Please sign in to comment.