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

Commit

Permalink
Merge pull request #64 from mdn/new_browser_idents_1128525
Browse files Browse the repository at this point in the history
bug 1128525 - Adjust browser names and slugs

+r groovecoder
  • Loading branch information
jwhitlock committed Oct 6, 2015
2 parents 69aa182 + ef77a14 commit 2c2520b
Show file tree
Hide file tree
Showing 6 changed files with 106 additions and 55 deletions.
13 changes: 1 addition & 12 deletions mdn/compatibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,21 +219,10 @@ def extract_feature_header(self, element):
self.add_issue('feature_header', element, header=header)
self.columns.append(header)

browser_name_fixes = {
'Firefox (Gecko)': 'Firefox',
'Firefox Mobile (Gecko)': 'Firefox Mobile',
'Firefox OS (Gecko)': 'Firefox OS',
'Safari (WebKit)': 'Safari',
'Windows Phone': 'IE Mobile',
'IE Phone': 'IE Mobile',
'IE': 'Internet Explorer',
}

def extract_browser_name(self, element):
colspan = int(element.attributes.get('colspan', 1))
raw_name = element.to_text()
fixed_name = self.browser_name_fixes.get(raw_name, raw_name)
browser_params = self.data.lookup_browser_params(fixed_name)
browser_params = self.data.lookup_browser_params(raw_name)
browser, browser_id, name, slug = browser_params
if not browser:
self.add_issue('unknown_browser', element, name=raw_name)
Expand Down
52 changes: 47 additions & 5 deletions mdn/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,38 @@ def __init__(self):
BrowserParams = namedtuple(
'BrowserParams', ['browser', 'browser_id', 'name', 'slug'])

# 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',
'Safari (WebKit)': 'Safari',
'Windows Phone': 'IE Mobile',
'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 @@ -34,20 +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

# Expand to full name, handle common alternate names
full_name = self.browser_name_fixes.get(name, name)

# Select the Browser ID and slug
if name not in self.browser_data:
browser_id = '_' + name
if full_name not in self.browser_data:
browser_id = '_' + full_name
# TODO: unique slugify instead of browser_id
self.browser_data[name] = self.BrowserParams(
None, browser_id, name, browser_id)
return self.browser_data[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 2c2520b

Please sign in to comment.