diff --git a/locales/en/LC_MESSAGES/energy_efficiency.mo b/locales/en/LC_MESSAGES/energy_efficiency.mo index 00bfa1d1..67a6b43f 100644 Binary files a/locales/en/LC_MESSAGES/energy_efficiency.mo and b/locales/en/LC_MESSAGES/energy_efficiency.mo differ diff --git a/locales/en/LC_MESSAGES/energy_efficiency.po b/locales/en/LC_MESSAGES/energy_efficiency.po index c9cc1478..99082936 100644 --- a/locales/en/LC_MESSAGES/energy_efficiency.po +++ b/locales/en/LC_MESSAGES/energy_efficiency.po @@ -19,7 +19,7 @@ msgid "TEXT_RUNNING_TEST" msgstr "## Test: 22 - Energy efficiency\n" msgid "TEXT_TRANSFER_SIZE" -msgstr "- Network transfer size: {0:.0f} {1}\n" +msgstr "- Network transfer size: {0:.2f} {1}\n" msgid "TEXT_WEBSITE_IS_VERY_GOOD" msgstr "- Webpage generates very little carbon dioxide!\n" diff --git a/locales/gov/LC_MESSAGES/energy_efficiency.mo b/locales/gov/LC_MESSAGES/energy_efficiency.mo index 00bfa1d1..67a6b43f 100644 Binary files a/locales/gov/LC_MESSAGES/energy_efficiency.mo and b/locales/gov/LC_MESSAGES/energy_efficiency.mo differ diff --git a/locales/gov/LC_MESSAGES/energy_efficiency.po b/locales/gov/LC_MESSAGES/energy_efficiency.po index c9cc1478..99082936 100644 --- a/locales/gov/LC_MESSAGES/energy_efficiency.po +++ b/locales/gov/LC_MESSAGES/energy_efficiency.po @@ -19,7 +19,7 @@ msgid "TEXT_RUNNING_TEST" msgstr "## Test: 22 - Energy efficiency\n" msgid "TEXT_TRANSFER_SIZE" -msgstr "- Network transfer size: {0:.0f} {1}\n" +msgstr "- Network transfer size: {0:.2f} {1}\n" msgid "TEXT_WEBSITE_IS_VERY_GOOD" msgstr "- Webpage generates very little carbon dioxide!\n" diff --git a/locales/sv/LC_MESSAGES/energy_efficiency.mo b/locales/sv/LC_MESSAGES/energy_efficiency.mo index 2b00b2a5..9a332d22 100644 Binary files a/locales/sv/LC_MESSAGES/energy_efficiency.mo and b/locales/sv/LC_MESSAGES/energy_efficiency.mo differ diff --git a/locales/sv/LC_MESSAGES/energy_efficiency.po b/locales/sv/LC_MESSAGES/energy_efficiency.po index 3b920d58..4f78abf0 100644 --- a/locales/sv/LC_MESSAGES/energy_efficiency.po +++ b/locales/sv/LC_MESSAGES/energy_efficiency.po @@ -19,7 +19,7 @@ msgid "TEXT_RUNNING_TEST" msgstr "## Test: 22 - Energieffektivitet\n" msgid "TEXT_TRANSFER_SIZE" -msgstr "- Nätverksstorlek: {0:.0f} {1}\n" +msgstr "- Nätverksstorlek: {0:.2f} {1}\n" msgid "TEXT_WEBSITE_IS_VERY_GOOD" msgstr "- Webbsidan genererar väldigt lite koldioxid!\n" diff --git a/tests/energy_efficiency.py b/tests/energy_efficiency.py index b87fa05e..7e816935 100644 --- a/tests/energy_efficiency.py +++ b/tests/energy_efficiency.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- from datetime import datetime +import json +import os from helpers.setting_helper import get_config from helpers.models import Rating from tests import energy_efficiency_carbon_percentiles -import tests.energy_efficiency_carbon_percentiles2022 as energy_efficiency_carbon_percentiles_2022 -from tests.performance_lighthouse import run_test as lighthouse_perf_run_test +from tests.sitespeed_base import get_result from tests.utils import get_translation # Code below is built from: https://gitlab.com/wholegrain/carbon-api-2-0 @@ -97,11 +98,7 @@ def cleaner_than(co2, year='current'): # scale. We can look in to writing a cron job that will generate and export # from the database once a month, that is then loaded in this file. - percentiles = False - if year == '2022': - percentiles = energy_efficiency_carbon_percentiles_2022.get_percentiles() - else: - percentiles = energy_efficiency_carbon_percentiles.get_percentiles() + percentiles = energy_efficiency_carbon_percentiles.get_percentiles() position = 0 # this should always be exactly 100 number of values for item in percentiles: @@ -125,14 +122,31 @@ def format_bytes(size): tuple: A tuple containing the converted size and the unit used for the conversion. The size is a float and the unit is a string. """ - power = 2**10 - n = 0 - power_labels = {0: '', 1: 'k', 2: 'm', 3: 'g', 4: 't'} - while size > power: - size /= power - n += 1 - return size, power_labels[n]+'b' + # Conversion factors + KB = 1024 + MB = KB * 1024 + GB = MB * 1024 + TB = GB * 1024 + # Convert bytes to different units + kilobytes_value = size / KB + megabytes_value = size / MB + gigabytes_value = size / GB + terabytes_value = size / TB + # Determine the closest unit + if terabytes_value >= 1: + closest_value = terabytes_value + unit = "TB" + elif gigabytes_value >= 1: + closest_value = gigabytes_value + unit = "GB" + elif megabytes_value >= 1: + closest_value = megabytes_value + unit = "MB" + else: + closest_value = kilobytes_value + + return float(f'{closest_value:.2f}'), unit def run_test(global_translation, url): """ @@ -151,8 +165,8 @@ def run_test(global_translation, url): result_dict = {} transfer_bytes = get_total_bytes_for_url( - global_translation, - url) + url, + result_dict) if transfer_bytes is None: rating = Rating(global_translation) rating.overall_review = global_translation('TEXT_SITE_UNAVAILABLE') @@ -164,7 +178,6 @@ def run_test(global_translation, url): result_dict['co2'] = co2 cleaner = cleaner_than(co2) * 100 - cleaner_2022 = cleaner_than(co2, '2022') * 100 result_dict['cleaner_than'] = cleaner review = '' @@ -192,11 +205,6 @@ def run_test(global_translation, url): int(cleaner), latest_generated_date) - old_generated_date = energy_efficiency_carbon_percentiles_2022.get_generated_date() - review += local_translation("TEXT_BETTER_THAN").format( - int(cleaner_2022), - old_generated_date) - transfer_info = format_bytes(transfer_bytes) review += local_translation("TEXT_TRANSFER_SIZE").format(transfer_info[0], transfer_info[1]) @@ -208,25 +216,79 @@ def run_test(global_translation, url): return (rating, result_dict) -def get_total_bytes_for_url(global_translation, url): +def get_total_bytes(filename, result_dict): + total_bytes = 0 + sources = [] + if not os.path.exists(filename): + return None + + with open(filename, encoding='utf-8') as json_input_file: + har_data = json.load(json_input_file) + + if 'log' in har_data: + har_data = har_data['log'] + + req_index = 1 + for entry in har_data["entries"]: + req = entry['request'] + res = entry['response'] + + if 'url' not in req: + continue + + if 'content' not in res: + continue + if 'mimeType' not in res['content']: + continue + if 'size' not in res['content']: + continue + + total_bytes += res['content']['size'] + sources.append({ + 'url': req['url'], + 'index': req_index, + 'size': res['content']['size'] + }) + req_index += 1 + + result_dict['sources'] = sources + return total_bytes + + +def get_total_bytes_for_url(url, result_dict): """ Runs a Lighthouse performance test on a given URL and returns the total byte weight of the page. This function is specifically designed to work with multilingual websites. - It uses the 'global_translation' - to handle the language-specific aspects of the website. Parameters: - global_translation (dict): A dictionary containing language-specific translations. url (str): The URL of the webpage to run the Lighthouse performance test on. Returns: - int: The total byte weight of the webpage as determined by the Lighthouse performance test. + int: The total byte weight of the webpage as determined by the sitespeed test. """ - lighthouse_perf_result = lighthouse_perf_run_test(global_translation, url, True) - - if not lighthouse_perf_result[0].isused(): - return None - transfer_bytes = lighthouse_perf_result[1]['total-byte-weight'] + # We don't need extra iterations for what we are using it for + sitespeed_iterations = 1 + sitespeed_arg = ( + '--shm-size=1g -b chrome ' + '--plugins.remove screenshot --plugins.remove html --plugins.remove metrics ' + '--browsertime.screenshot false --screenshot false --screenshotLCP false ' + '--browsertime.screenshotLCP false --chrome.cdp.performance false ' + '--browsertime.chrome.timeline false --videoParams.createFilmstrip false ' + '--visualMetrics false --visualMetricsPerceptual false ' + '--visualMetricsContentful false --browsertime.headless true ' + '--browsertime.chrome.includeResponseBodies all --utc true ' + '--browsertime.chrome.args ignore-certificate-errors ' + f'-n {sitespeed_iterations}') + if get_config('tests.sitespeed.xvfb'): + sitespeed_arg += ' --xvfb' + + (_, filename) = get_result( + url, + get_config('tests.sitespeed.docker.use'), + sitespeed_arg, + get_config('tests.sitespeed.timeout')) + + transfer_bytes = get_total_bytes(filename, result_dict) return transfer_bytes diff --git a/tests/energy_efficiency_carbon_percentiles2021.py b/tests/energy_efficiency_carbon_percentiles2021.py deleted file mode 100644 index 44242b9a..00000000 --- a/tests/energy_efficiency_carbon_percentiles2021.py +++ /dev/null @@ -1,133 +0,0 @@ -# This array was last generated with carbon-rating.py on 2021-12-12 -def get_generated_date(): - """ - Get the date when the data was generated. - - Returns: - str: A string that represents the date when the data was generated. - The date is in the format 'YYYY-MM-DD'. - """ - return '2021-12-12' - -def get_percentiles(): - """ - Get the precomputed percentiles of CO2 data. - - Returns: - list: A list of precomputed percentiles of the CO2 data. - The list contains 100 elements, - each representing the percentile from 1 to 100. - The percentiles are sorted in ascending order. - The percentile values are floats. - """ - return [ - 0.0953836, - 0.1410492, - 0.195002, - 0.2358364, - 0.262904, - 0.3000236, - 0.3182312, - 0.349924, - 0.38022120000000004, - 0.40702600000000005, - # 10 percentile - 0.42752480000000004, - 0.4498392, - 0.4772428, - 0.5048804, - 0.5216, - 0.5333804, - 0.5468992, - 0.5644688, - 0.5863052000000001, - 0.6014560000000001, - # 20 percentile - 0.6192776, - 0.6405636, - 0.6593608, - 0.6915084, - 0.70698, - 0.7236624, - 0.7420403999999999, - 0.7592104000000001, - 0.7842159999999999, - 0.80426, - # 30 percentile - 0.8257704, - 0.8471128, - 0.865516, - 0.8822332, - 0.902168, - 0.9264883999999999, - 0.9473739999999998, - 0.9767252000000001, - 0.9999304000000001, - 1.0191520000000003, - # 40 percentile - 1.0347444000000001, - 1.0572148000000001, - 1.0867584000000001, - 1.1122888, - 1.143956, - 1.1648304, - 1.1913983999999997, - 1.2126664, - 1.2412051999999998, - 1.27171, - # 50 percentile - 1.3091504000000003, - 1.3313284, - 1.3584724, - 1.3886472, - 1.420338, - 1.4487428, - 1.4820103999999998, - 1.5078003999999998, - 1.5452476, - 1.592982, - # 60 percentile - 1.6304788, - 1.666354, - 1.7338556000000003, - 1.7800792, - 1.8304320000000005, - 1.8739607999999999, - 1.9291192000000001, - 1.9680304, - 2.020606, - 2.0735059999999996, - # 70 percentile - 2.1504748, - 2.1879891999999996, - 2.2389408, - 2.3014731999999998, - 2.37685, - 2.440808, - 2.5242876, - 2.5912212000000006, - 2.711244, - 2.8313860000000006, - # 80 percentile - 2.9067716000000017, - 3.0417359999999998, - 3.195211599999998, - 3.3553764, - 3.481357999999999, - 3.6491988, - 3.845197600000001, - 4.056775199999997, - 4.318432, - 4.593262, - # 90 percentile - 4.950937600000001, - 5.188025599999999, - 5.551064800000001, - 5.972769999999999, - 6.473571999999994, - 7.134348799999998, - 8.014240000000001, - 10.102379199999978, - 13.86074479999998, - 29.59855 - ] diff --git a/tests/energy_efficiency_carbon_percentiles2022.py b/tests/energy_efficiency_carbon_percentiles2022.py deleted file mode 100644 index cadc5f1f..00000000 --- a/tests/energy_efficiency_carbon_percentiles2022.py +++ /dev/null @@ -1,133 +0,0 @@ -# This array was last generated with carbon-rating.py on 2022-12-16 -def get_generated_date(): - """ - Get the date when the data was generated. - - Returns: - str: A string that represents the date when the data was generated. - The date is in the format 'YYYY-MM-DD'. - """ - return '2022-12-16' - -def get_percentiles(): - """ - Get the precomputed percentiles of CO2 data. - - Returns: - list: A list of precomputed percentiles of the CO2 data. - The list contains 100 elements, - each representing the percentile from 1 to 100. - The percentiles are sorted in ascending order. - The percentile values are floats. - """ - return [ - 0.09973231387370034, - 0.16080354696745056, - 0.20362588258347242, - 0.2379187339514261, - 0.27656745606072947, - 0.30745744090969673, - 0.33184973107940746, - 0.3529047702283366, - 0.37534929773239417, - 0.39810352749424055, - # 10 percentile - 0.42508327717952193, - 0.4389412294057431, - 0.4562202545828302, - 0.4785825637696777, - 0.5068633860716945, - 0.5305798920731991, - 0.5477266613885061, - 0.5661989312880904, - 0.579879822949972, - 0.5960701396723743, - # 20 percentile - 0.6143280318508855, - 0.6330070592960808, - 0.6498430170875509, - 0.6694780148360645, - 0.6892955109640024, - 0.7101647842215606, - 0.7250250909520546, - 0.744704218197707, - 0.763463341885933, - 0.7899220982457044, - # 30 percentile - 0.8094173284721329, - 0.8283828359315404, - 0.8446715276722913, - 0.8657136655747891, - 0.884027165742591, - 0.9072240650011458, - 0.9295368189330097, - 0.9521169542114716, - 0.9772724314796505, - 1.0007404016001384, - # 40 percentile - 1.0238258919642773, - 1.0471724697959142, - 1.0710941779591143, - 1.0923557214516215, - 1.124570965740073, - 1.146183845138899, - 1.1746030242659617, - 1.1979125622573776, - 1.2310768439363453, - 1.2515047016501195, - # 50 percentile - 1.2795522645937627, - 1.3061630386311094, - 1.3351569502008265, - 1.3628026453467552, - 1.3917207530507585, - 1.4207824624790577, - 1.4529408809970128, - 1.4915141368433134, - 1.5291470606261284, - 1.554606947023887, - # 60 percentile - 1.5936143358412198, - 1.6352281140403822, - 1.6801844363885348, - 1.7187831209532685, - 1.7571613991771002, - 1.8028394920055058, - 1.8599011262235698, - 1.905627098350646, - 1.9640204546886495, - 2.023141995958402, - # 70 percentile - 2.0738455101034607, - 2.1401365513315884, - 2.2145383168173134, - 2.288088527695136, - 2.3726603939716004, - 2.450417219021078, - 2.5282657152636565, - 2.5990867940599562, - 2.7045361686886635, - 2.8158361741732807, - # 80 percentile - 2.8941146556964497, - 3.014464415320265, - 3.142870581337029, - 3.2905006896879754, - 3.43547236961074, - 3.6471893352084095, - 3.807560159901865, - 3.9759314212817936, - 4.240359033538238, - 4.474958891702117, - # 90 percentile - 4.721777182758359, - 5.040366506351629, - 5.525683098755043, - 5.968029039437439, - 6.511319842356704, - 7.102975344301667, - 8.126477029148848, - 9.81361661188916, - 12.361596299821109, - 46.09157958511321 - ]