From f4c3e412a2103d50555cfbde62453eae1fffde10 Mon Sep 17 00:00:00 2001 From: Denis Treskunov Date: Sun, 9 Feb 2020 21:59:51 -0800 Subject: [PATCH 1/5] fix bugs in showMoonTimes in clock module 1. as reported on https://github.com/MichMich/MagicMirror/pull/1885, toLocaleString is not supported on old iPad Safari 2. SunCalc.getMoonTimes returns moonRise/moonSet times for the given date, so moonRise can be after moonSet. We want to display the most relevant times, which are today's moonRise and the next moonSet. --- modules/default/clock/clock.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/default/clock/clock.js b/modules/default/clock/clock.js index 96c31143..6e70f1e2 100644 --- a/modules/default/clock/clock.js +++ b/modules/default/clock/clock.js @@ -179,11 +179,19 @@ Module.register("clock",{ if (this.config.showMoonTimes) { const moonIllumination = SunCalc.getMoonIllumination(now.toDate()); const moonTimes = SunCalc.getMoonTimes(now, this.config.lat, this.config.lon); - const isVisible = now.isBetween(moonTimes.rise, moonTimes.set); - const illuminatedFractionString = moonIllumination.fraction.toLocaleString(undefined, {style: 'percent'}); + const moonRise = moonTimes.rise; + var moonSet; + if (moment(moonTimes.set).isAfter(moonTimes.rise)) { + moonSet = moonTimes.set; + } else { + const nextMoonTimes = SunCalc.getMoonTimes(now.clone().add(1, 'day'), this.config.lat, this.config.lon); + moonSet = nextMoonTimes.set; + } + const isVisible = now.isBetween(moonRise, moonSet) || moonTimes.alwaysUp === true; + const illuminatedFractionString = moonIllumination.fraction.toFixed(2) * 100 + '%'; moonWrapper.innerHTML = ' ' + illuminatedFractionString + '' + - ' ' + formatTime(this.config, moonTimes.rise) + ''+ - ' ' + formatTime(this.config, moonTimes.set) + ''; + ' ' + (moonRise ? formatTime(this.config, moonRise) : '...') + ''+ + ' ' + (moonSet ? formatTime(this.config, moonSet) : '...') + ''; } /**************************************************************** From de6a9f5811786b0fe64d67425851740af48a4883 Mon Sep 17 00:00:00 2001 From: Felix Wiedenbach Date: Mon, 10 Feb 2020 18:56:55 +0100 Subject: [PATCH 2/5] fix timing issue in weather tests => returning response by url instead of index --- tests/e2e/modules/weather_spec.js | 45 ++++++++----------- tests/node_modules/webdriverajaxstub/index.js | 4 +- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/tests/e2e/modules/weather_spec.js b/tests/e2e/modules/weather_spec.js index dad11f50..ea916e5e 100644 --- a/tests/e2e/modules/weather_spec.js +++ b/tests/e2e/modules/weather_spec.js @@ -8,14 +8,7 @@ const helpers = require("../global-setup"); const {generateWeather, generateWeatherForecast} = require("./mocks"); -const wait = () => new Promise(res => setTimeout(res, 3000)); - -// See issue: https://github.com/MichMich/MagicMirror/issues/1840 -// Skipping the weather tests for now since these seem to give issues. -// Please send a PR if you know how to fix these. Thanks! - - -describe.skip("Weather module", function() { +describe("Weather module", function() { let app; @@ -49,7 +42,7 @@ describe.skip("Weather module", function() { it("should render wind speed and wind direction", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); return app.client.waitUntilTextExists(".weather .normal.medium span:nth-child(2)", "6 WSW", 10000); }); @@ -59,7 +52,7 @@ describe.skip("Weather module", function() { const sunset = moment().startOf("day").unix(); const weather = generateWeather({sys: {sunrise, sunset}}); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather .normal.medium span.wi.dimmed.wi-sunrise", 10000); @@ -71,7 +64,7 @@ describe.skip("Weather module", function() { const sunset = moment().endOf("day").unix(); const weather = generateWeather({sys: {sunrise, sunset}}); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather .normal.medium span.wi.dimmed.wi-sunset", 10000); @@ -80,7 +73,7 @@ describe.skip("Weather module", function() { it("should render temperature with icon", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather .large.light span.wi.weathericon.wi-snow", 10000); @@ -89,7 +82,7 @@ describe.skip("Weather module", function() { it("should render feels like temperature", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); return app.client.waitUntilTextExists(".weather .normal.medium span.dimmed", "Feels like -5.6°", 10000); }); @@ -102,14 +95,14 @@ describe.skip("Weather module", function() { it("should render useBeaufort = false", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); return app.client.waitUntilTextExists(".weather .normal.medium span:nth-child(2)", "12", 10000); }); it("should render showWindDirectionAsArrow = true", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather .normal.medium sup i.fa-long-arrow-up", 10000); const element = await app.client.getHTML(".weather .normal.medium sup i.fa-long-arrow-up"); @@ -119,7 +112,7 @@ describe.skip("Weather module", function() { it("should render showHumidity = true", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitUntilTextExists(".weather .normal.medium span:nth-child(3)", "93", 10000); return app.client.waitForExist(".weather .normal.medium sup i.wi-humidity", 10000); @@ -127,7 +120,7 @@ describe.skip("Weather module", function() { it("should render degreeLabel = true", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitUntilTextExists(".weather .large.light span.bright", "1°C", 10000); @@ -151,7 +144,7 @@ describe.skip("Weather module", function() { speed: 11.8 * 2.23694 }, }); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitUntilTextExists(".weather .normal.medium span:nth-child(2)", "6 WSW", 10000); await app.client.waitUntilTextExists(".weather .large.light span.bright", "34,7°", 10000); @@ -169,7 +162,7 @@ describe.skip("Weather module", function() { speed: 11.8 * 2.23694 }, }); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitUntilTextExists(".weather .normal.medium span:nth-child(3)", "93,7", 10000); await app.client.waitUntilTextExists(".weather .large.light span.bright", "34,7°", 10000); @@ -192,7 +185,7 @@ describe.skip("Weather module", function() { it("should render days", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); const days = ["Fri", "Sat", "Sun", "Mon", "Tue"]; @@ -203,7 +196,7 @@ describe.skip("Weather module", function() { it("should render icons", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); const icons = ["day-cloudy", "rain", "day-sunny", "day-sunny", "day-sunny"]; @@ -214,7 +207,7 @@ describe.skip("Weather module", function() { it("should render max temperatures", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); const temperatures = ["24.4°", "21.0°", "22.9°", "23.4°", "20.6°"]; @@ -225,7 +218,7 @@ describe.skip("Weather module", function() { it("should render min temperatures", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); const temperatures = ["15.3°", "13.6°", "13.8°", "13.9°", "10.9°"]; @@ -236,7 +229,7 @@ describe.skip("Weather module", function() { it("should render fading of rows", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); const opacities = [1, 1, 0.8, 0.5333333333333333, 0.2666666666666667]; @@ -256,14 +249,14 @@ describe.skip("Weather module", function() { it("should render custom table class", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather table.myTableClass", 10000); }); it("should render colored rows", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather table.myTableClass", 10000); diff --git a/tests/node_modules/webdriverajaxstub/index.js b/tests/node_modules/webdriverajaxstub/index.js index ed524ddb..031de5ac 100644 --- a/tests/node_modules/webdriverajaxstub/index.js +++ b/tests/node_modules/webdriverajaxstub/index.js @@ -3,7 +3,7 @@ function plugin (wdInstance, requests) { throw new Error("You can't use WebdriverAjaxStub with this version of WebdriverIO"); } - function stub(requests, done) { + function stub({template, data}, done) { window.XMLHttpRequest = function () { this.open = function (method, url) { this.method = method; @@ -13,7 +13,7 @@ function plugin (wdInstance, requests) { this.send = function () { this.status = 200; this.readyState = 4; - const response = requests.shift() || []; + const response = this.url.includes('.njk') ? template : data; this.response = response; this.responseText = response; this.onreadystatechange(); From cd7b6450c6d472cd2eb2f1e23141e81603caed5e Mon Sep 17 00:00:00 2001 From: fewieden Date: Mon, 10 Feb 2020 21:51:29 +0100 Subject: [PATCH 3/5] Run tests also on lts and last stable version of nodejs --- .travis.yml | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5f8f6024..b6f2e352 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,24 @@ dist: trusty language: node_js node_js: - - "10" + - 10 + - lts/* + - node before_install: - npm i -g npm before_script: - - yarn danger ci - - npm install grunt-cli -g - - "export DISPLAY=:99.0" - - "export ELECTRON_DISABLE_SANDBOX=1" - - "sh -e /etc/init.d/xvfb start" - - sleep 5 + - yarn danger ci + - npm install grunt-cli -g + - "export DISPLAY=:99.0" + - "export ELECTRON_DISABLE_SANDBOX=1" + - "sh -e /etc/init.d/xvfb start" + - sleep 5 script: -- npm run test:e2e -- npm run test:unit -- grunt + - npm run test:e2e + - npm run test:unit + - grunt after_script: - - npm list + - npm list cache: - directories: - - node_modules + directories: + - node_modules From 56392e41d0d6803a9cf5cdf2a2f3fca5b082ef90 Mon Sep 17 00:00:00 2001 From: fewieden Date: Mon, 10 Feb 2020 22:05:43 +0100 Subject: [PATCH 4/5] Add 1840 to changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0debd80f..49128c11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,13 +20,14 @@ This project adheres to [Semantic Versioning](http://semver.org/). - The `clock` module now optionally displays sun and moon data, including rise/set times, remaining daylight, and percent of moon illumination. - Added Hebrew translation. - Add HTTPS support and update config.js.sample - +- Run tests on long term support and latest stable version of nodejs ### Fixed - Force declaration of public ip adress in config file (ISSUE #1852) - Fixes `run-start.sh`: If running in docker-container, don't check the environment, just start electron (ISSUE #1859) - Fix calendar time offset for recurring events crossing Daylight Savings Time (ISSUE #1798) - Fix regression in currentweather module causing 'undefined' to show up when config.hideTemp is false +- Fixed weather tests [#1840](https://github.com/MichMich/MagicMirror/issues/1840) ### Updated - Remove documentation from core repository and link to new dedicated docs site: [docs.magicmirror.builders](https://docs.magicmirror.builders). From c925e8847522e0f122778fac82b3b4fca5d49bf7 Mon Sep 17 00:00:00 2001 From: buxxi Date: Tue, 11 Feb 2020 18:13:39 +0100 Subject: [PATCH 5/5] Adding support for ignoring update check for certain modules --- CHANGELOG.md | 1 + .../default/updatenotification/node_helper.js | 27 ++++++++++++++----- .../updatenotification/updatenotification.js | 1 + 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0debd80f..c9bf13c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - The `clock` module now optionally displays sun and moon data, including rise/set times, remaining daylight, and percent of moon illumination. - Added Hebrew translation. - Add HTTPS support and update config.js.sample +- Added the ability to configure a list of modules that shouldn't be update checked. ### Fixed diff --git a/modules/default/updatenotification/node_helper.js b/modules/default/updatenotification/node_helper.js index 03ecd745..818697c0 100644 --- a/modules/default/updatenotification/node_helper.js +++ b/modules/default/updatenotification/node_helper.js @@ -22,7 +22,7 @@ module.exports = NodeHelper.create({ simpleGits.push({"module": "default", "git": SimpleGit(path.normalize(__dirname + "/../../../"))}); for (moduleName in modules) { - if (defaultModules.indexOf(moduleName) < 0) { + if (!this.ignoreUpdateChecking(moduleName)) { // Default modules are included in the main MagicMirror repo var moduleFolder = path.normalize(__dirname + "/../../" + moduleName); @@ -56,15 +56,15 @@ module.exports = NodeHelper.create({ this.config = payload; } else if(notification === "MODULES") { // if this is the 1st time thru the update check process - if(this.updateProcessStarted==false ){ - this.updateProcessStarted=true; + if (!this.updateProcessStarted) { + this.updateProcessStarted = true; this.configureModules(payload); - this.preformFetch(); + this.performFetch(); } } }, - preformFetch() { + performFetch() { var self = this; simpleGits.forEach(function(sg) { sg.git.fetch().status(function(err, data) { @@ -91,8 +91,23 @@ module.exports = NodeHelper.create({ var self = this; clearTimeout(this.updateTimer); this.updateTimer = setTimeout(function() { - self.preformFetch(); + self.performFetch(); }, delay); + }, + + ignoreUpdateChecking: function(moduleName) { + // Should not check for updates for default modules + if (defaultModules.indexOf(moduleName) >= 0) { + return true; + } + + // Should not check for updates for ignored modules + if (this.config.ignoreModules.indexOf(moduleName) >= 0) { + return true; + } + + // The rest of the modules that passes should check for updates + return false; } }); diff --git a/modules/default/updatenotification/updatenotification.js b/modules/default/updatenotification/updatenotification.js index d4bdc568..35a018bf 100644 --- a/modules/default/updatenotification/updatenotification.js +++ b/modules/default/updatenotification/updatenotification.js @@ -3,6 +3,7 @@ Module.register("updatenotification", { defaults: { updateInterval: 10 * 60 * 1000, // every 10 minutes refreshInterval: 24 * 60 * 60 * 1000, // one day + ignoreModules: [] }, suspended: false,