Merge pull request #31 from MichMich/develop

synch to Develop
This commit is contained in:
sam detweiler 2019-12-28 15:01:54 -06:00 committed by GitHub
commit 525c235d3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 1432 additions and 898 deletions

View File

@ -1,7 +1,12 @@
dist: trusty dist: trusty
language: node_js language: node_js
node_js: node_js:
- "8" - "10
before_install:
- npm i -g npm
before_script: before_script:
- yarn danger ci - yarn danger ci
- npm install grunt-cli -g - npm install grunt-cli -g

View File

@ -4,14 +4,16 @@ All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/). This project adheres to [Semantic Versioning](http://semver.org/).
### Added ### Added
- move node_helper module to dedicated github repo, to prevent being erased accidentally
- new upgrade script to help users consume regular updates installers/upgrade-script.sh - new upgrade script to help users consume regular updates installers/upgrade-script.sh
- new script to help setup pm2, without install installers/fixuppm2.sh - new script to help setup pm2, without install installers/fixuppm2.sh
### Updated ### Updated
- updated compliments.js to handle newline in text, as textfields to not interpolate contents
- updated raspberry.sh installer script to handle new platform issues, split node/npm, pm2, and screen saver changes - updated raspberry.sh installer script to handle new platform issues, split node/npm, pm2, and screen saver changes
- improve handling for armv6l devices, where electron support has gone away, add optional serveronly config option - improve handling for armv6l devices, where electron support has gone away, add optional serveronly config option
- change electron version
---
❤️ **Donate:** Enjoying MagicMirror²? [Please consider a donation!](https://magicmirror.builders/donate) With your help we can continue to improve the MagicMirror² core. ❤️ **Donate:** Enjoying MagicMirror²? [Please consider a donation!](https://magicmirror.builders/donate) With your help we can continue to improve the MagicMirror² core.
@ -21,11 +23,13 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Added ### Added
- Timestamps in log output - Timestamps in log output
- Padding in dateheader mode of the calendar module
### Updated ### Updated
### Fixed ### Fixed
- Fixed issue in weatherforecast module where predicted amount of rain was not using the decimal symbol specified in config.js. - Fixed issue in weatherforecast module where predicted amount of rain was not using the decimal symbol specified in config.js.
- Module header now updates correctly, if a module need to dynamically show/hide its header based on a condition.
## [2.9.0] - 2019-10-01 ## [2.9.0] - 2019-10-01

View File

@ -39,11 +39,13 @@ var MM = (function() {
dom.opacity = 0; dom.opacity = 0;
wrapper.appendChild(dom); wrapper.appendChild(dom);
if (typeof module.getHeader() !== "undefined" && module.getHeader() !== "") {
var moduleHeader = document.createElement("header"); var moduleHeader = document.createElement("header");
moduleHeader.innerHTML = module.getHeader(); moduleHeader.innerHTML = module.getHeader();
moduleHeader.className = "module-header"; moduleHeader.className = "module-header";
dom.appendChild(moduleHeader); dom.appendChild(moduleHeader);
if (typeof module.getHeader() === "undefined" || module.getHeader() !== "") {
moduleHeader.style = "display: none;";
} }
var moduleContent = document.createElement("div"); var moduleContent = document.createElement("div");
@ -210,9 +212,8 @@ var MM = (function() {
contentWrapper[0].innerHTML = ""; contentWrapper[0].innerHTML = "";
contentWrapper[0].appendChild(newContent); contentWrapper[0].appendChild(newContent);
if( headerWrapper.length > 0 && newHeader) {
headerWrapper[0].innerHTML = newHeader; headerWrapper[0].innerHTML = newHeader;
} headerWrapper[0].style = headerWrapper.length > 0 && newHeader ? undefined : "display: none;";
}; };
/* hideModule(module, speed, callback) /* hideModule(module, speed, callback)

View File

@ -24,7 +24,7 @@ var Server = function(config, callback) {
console.log("Starting server on port " + port + " ... "); console.log("Starting server on port " + port + " ... ");
server.listen(port, config.address ? config.address : null); server.listen(port, config.address ? config.address : "localhost");
if (config.ipWhitelist instanceof Array && config.ipWhitelist.length === 0) { if (config.ipWhitelist instanceof Array && config.ipWhitelist.length === 0) {
console.info(Utils.colors.warn("You're using a full whitelist configuration to allow for all IPs")); console.info(Utils.colors.warn("You're using a full whitelist configuration to allow for all IPs"));

View File

@ -180,6 +180,7 @@ Module.register("calendar", {
dateCell.colSpan = "3"; dateCell.colSpan = "3";
dateCell.innerHTML = dateAsString; dateCell.innerHTML = dateAsString;
dateCell.style.paddingTop = "10px";
dateRow.appendChild(dateCell); dateRow.appendChild(dateCell);
wrapper.appendChild(dateRow); wrapper.appendChild(dateRow);

View File

@ -36,9 +36,10 @@ Module.register("compliments", {
morningStartTime: 3, morningStartTime: 3,
morningEndTime: 12, morningEndTime: 12,
afternoonStartTime: 12, afternoonStartTime: 12,
afternoonEndTime: 17 afternoonEndTime: 17,
random: true
}, },
lastIndexUsed:-1,
// Set currentweather from module // Set currentweather from module
currentWeatherType: "", currentWeatherType: "",
@ -147,19 +148,43 @@ Module.register("compliments", {
* return compliment string - A compliment. * return compliment string - A compliment.
*/ */
randomCompliment: function() { randomCompliment: function() {
// get the current time of day compliments list
var compliments = this.complimentArray(); var compliments = this.complimentArray();
var index = this.randomIndex(compliments); // variable for index to next message to display
let index=0
// are we randomizing
if(this.config.random){
// yes
index = this.randomIndex(compliments);
}
else{
// no, sequetial
// if doing sequential, don't fall off the end
index = (this.lastIndexUsed >= (compliments.length-1))?0: ++this.lastIndexUsed
}
return compliments[index]; return compliments[index];
}, },
// Override dom generator. // Override dom generator.
getDom: function() { getDom: function() {
var complimentText = this.randomCompliment();
var compliment = document.createTextNode(complimentText);
var wrapper = document.createElement("div"); var wrapper = document.createElement("div");
wrapper.className = this.config.classes ? this.config.classes : "thin xlarge bright pre-line"; wrapper.className = this.config.classes ? this.config.classes : "thin xlarge bright pre-line";
// get the compliment text
var complimentText = this.randomCompliment();
// split it into parts on newline text
var parts= complimentText.split('\n')
// create a span to hold it all
var compliment=document.createElement('span')
// process all the parts of the compliment text
for (part of parts){
// create a text element for each part
compliment.appendChild(document.createTextNode(part))
// add a break `
compliment.appendChild(document.createElement('BR'))
}
// remove the last break
compliment.lastElementChild.remove();
wrapper.appendChild(compliment); wrapper.appendChild(compliment);
return wrapper; return wrapper;

View File

@ -1,125 +0,0 @@
/* Magic Mirror
* Node Helper Superclass
*
* By Michael Teeuw http://michaelteeuw.nl
* MIT Licensed.
*/
var Class = require("../../../js/class.js");
var express = require("express");
var path = require("path");
NodeHelper = Class.extend({
init: function() {
console.log("Initializing new module helper ...");
},
loaded: function(callback) {
console.log("Module helper loaded: " + this.name);
callback();
},
start: function() {
console.log("Starting module helper: " + this.name);
},
/* stop()
* Called when the MagicMirror server receives a `SIGINT`
* Close any open connections, stop any sub-processes and
* gracefully exit the module.
*
*/
stop: function() {
console.log("Stopping module helper: " + this.name);
},
/* socketNotificationReceived(notification, payload)
* This method is called when a socket notification arrives.
*
* argument notification string - The identifier of the notification.
* argument payload mixed - The payload of the notification.
*/
socketNotificationReceived: function(notification, payload) {
console.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload);
},
/* setName(name)
* Set the module name.
*
* argument name string - Module name.
*/
setName: function(name) {
this.name = name;
},
/* setPath(path)
* Set the module path.
*
* argument path string - Module path.
*/
setPath: function(path) {
this.path = path;
},
/* sendSocketNotification(notification, payload)
* Send a socket notification to the node helper.
*
* argument notification string - The identifier of the notification.
* argument payload mixed - The payload of the notification.
*/
sendSocketNotification: function(notification, payload) {
this.io.of(this.name).emit(notification, payload);
},
/* setExpressApp(app)
* Sets the express app object for this module.
* This allows you to host files from the created webserver.
*
* argument app Express app - The Express app object.
*/
setExpressApp: function(app) {
this.expressApp = app;
var publicPath = this.path + "/public";
app.use("/" + this.name, express.static(publicPath));
},
/* setSocketIO(io)
* Sets the socket io object for this module.
* Binds message receiver.
*
* argument io Socket.io - The Socket io object.
*/
setSocketIO: function(io) {
var self = this;
self.io = io;
console.log("Connecting socket for: " + this.name);
var namespace = this.name;
io.of(namespace).on("connection", function(socket) {
// add a catch all event.
var onevent = socket.onevent;
socket.onevent = function(packet) {
var args = packet.data || [];
onevent.call(this, packet); // original call
packet.data = ["*"].concat(args);
onevent.call(this, packet); // additional call to catch-all
};
// register catch all.
socket.on("*", function(notification, payload) {
if (notification !== "*") {
//console.log('received message in namespace: ' + namespace);
self.socketNotificationReceived(notification, payload);
}
});
});
}
});
NodeHelper.create = function(moduleDefinition) {
return NodeHelper.extend(moduleDefinition);
};
module.exports = NodeHelper;

2099
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -34,8 +34,8 @@
}, },
"homepage": "https://magicmirror.builders", "homepage": "https://magicmirror.builders",
"devDependencies": { "devDependencies": {
"chai": "^4.1.2", "chai": "latest",
"chai-as-promised": "^7.1.1", "chai-as-promised": "latest",
"current-week-number": "^1.0.7", "current-week-number": "^1.0.7",
"danger": "^3.1.3", "danger": "^3.1.3",
"grunt": "latest", "grunt": "latest",
@ -47,16 +47,16 @@
"http-auth": "^3.2.3", "http-auth": "^3.2.3",
"jsdom": "^11.6.2", "jsdom": "^11.6.2",
"jshint": "^2.10.2", "jshint": "^2.10.2",
"mocha": "^4.1.0", "mocha": "latest",
"mocha-each": "^1.1.0", "mocha-each": "latest",
"mocha-logger": "^1.0.6", "mocha-logger": "latest",
"spectron": "^3.8.0", "spectron": "^8.0.0",
"stylelint": "latest", "stylelint": "latest",
"stylelint-config-standard": "latest", "stylelint-config-standard": "latest",
"time-grunt": "latest" "time-grunt": "latest"
}, },
"optionalDependencies": { "optionalDependencies": {
"electron": "^3.0.13" "electron": "^6.0.12"
}, },
"dependencies": { "dependencies": {
"colors": "^1.1.2", "colors": "^1.1.2",
@ -68,6 +68,7 @@
"iconv-lite": "latest", "iconv-lite": "latest",
"lodash": "^4.17.11", "lodash": "^4.17.11",
"moment": "latest", "moment": "latest",
"node_helper": "git://github.com/sdetweil/nodehelper.git",
"request": "^2.88.0", "request": "^2.88.0",
"rrule": "^2.6.2", "rrule": "^2.6.2",
"rrule-alt": "^2.2.8", "rrule-alt": "^2.2.8",

View File

@ -7,10 +7,12 @@ if [ -z "$DISPLAY" ]; then #If not set DISPLAY is SSH remote or tty
fi fi
# get the processor architecture # get the processor architecture
arch=$(uname -m) arch=$(uname -m)
# got the config option, if any
serveronly=$(grep -i serveronly: config/config.js | awk '{print tolower($2)}' | tr -d ,\"\') # get the config option, if any
# only check non comment lines
serveronly=$(grep -v '^\s//' config/config.js | grep -i serveronly: | awk '{print tolower($2)}' | tr -d ,\"\')
# set default if not defined in config # set default if not defined in config
serveronly="${serveronly:=false}" serveronly=${serveronly:-false}
# check for xwindows running # check for xwindows running
xorg=$(pgrep Xorg) xorg=$(pgrep Xorg)
#check for macOS #check for macOS
@ -60,5 +62,5 @@ if [ "$serveronly." != "false." -o "$arch" == "armv6l" ] || [ "$xorg." == "."
fi fi
else else
# we can use electron directly # we can use electron directly
`electron js/electron.js $1`; electron js/electron.js $1;
fi fi

View File

@ -35,7 +35,10 @@ describe("Vendors", function () {
it(`should return 200 HTTP code for vendor "${vendor}"`, function () { it(`should return 200 HTTP code for vendor "${vendor}"`, function () {
urlVendor = "http://localhost:8080/vendor/" + vendors[vendor]; urlVendor = "http://localhost:8080/vendor/" + vendors[vendor];
request.get(urlVendor, function (err, res, body) { request.get(urlVendor, function (err, res, body) {
if (!err)
expect(res.statusCode).to.equal(200); expect(res.statusCode).to.equal(200);
else
mlog.pending(`There error vendor 200 test ${err}`);
}); });
}); });
}); });