Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Completed example #2

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 16 additions & 140 deletions .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,155 +2,31 @@
"env": {
"browser": true,
"node": true,
"es6": true
},

"extends": [
"eslint:recommended",
"plugin:import/errors",
"plugin:import/warnings"
],

"ecmaFeatures": {
"arrowFunctions": true,
"binaryLiterals": true,
"blockBindings": true,
"classes": true,
"defaultParams": true,
"destructuring": true,
"forOf": true,
"generators": true,
"modules": true,
"objectLiteralComputedProperties": true,
"objectLiteralDuplicateProperties": true,
"objectLiteralShorthandMethods": true,
"objectLiteralShorthandProperties": true,
"octalLiterals": true,
"regexUFlag": true,
"regexYFlag": true,
"spread": true,
"superInFunctions": true,
"templateStrings": true,
"unicodeCodePointEscapes": true,
"globalReturn": true,
"jsx": false
"mocha": true
},

"parserOptions": {
"ecmaVersion": 2017,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
},

"extends": [
"eslint:recommended",
"plugin:import/errors",
"plugin:import/warnings"
],

"rules": {
"comma-style": [2, "last"],
"constructor-super": 2,
"curly": [2, "multi-line"],
"dot-location": [2, "property"],
"eol-last": 2,
"eqeqeq": [2, "allow-null"],
"handle-callback-err": [2, "^(err|error)$" ],
"import/no-unresolved": [2, {"ignore": ["^electron$"]}],
"indent": [2, 2, { "SwitchCase": 1 }],
"key-spacing": [2, { "beforeColon": false, "afterColon": true }],
"keyword-spacing": [2, { "before": true, "after": true }],
"new-cap": [2, { "newIsCap": true, "capIsNew": false }],
"new-parens": 2,
"no-array-constructor": 2,
"no-caller": 2,
"no-class-assign": 2,
"no-cond-assign": 2,
"no-const-assign": 2,
"no-constant-condition": [2, { "checkLoops": false }],
"no-control-regex": 2,
"no-delete-var": 2,
"no-dupe-args": 2,
"no-dupe-class-members": 2,
"no-dupe-keys": 2,
"no-duplicate-case": 2,
"no-duplicate-imports": 2,
"no-empty-character-class": 2,
"no-empty-pattern": 2,
"no-eval": 2,
"no-ex-assign": 2,
"no-extend-native": 2,
"no-extra-bind": 2,
"no-extra-boolean-cast": 2,
"no-extra-parens": [2, "functions"],
"no-fallthrough": 2,
"no-floating-decimal": 2,
"no-func-assign": 2,
"no-implied-eval": 2,
"no-inner-declarations": [2, "functions"],
"no-invalid-regexp": 2,
"no-irregular-whitespace": 2,
"no-iterator": 2,
"no-label-var": 2,
"no-labels": [2, { "allowLoop": false, "allowSwitch": false }],
"no-lone-blocks": 2,
"no-mixed-spaces-and-tabs": 2,
"no-multi-spaces": 2,
"no-multi-str": 2,
"no-multiple-empty-lines": [2, { "max": 1 }],
"no-native-reassign": 2,
"no-negated-in-lhs": 2,
"no-new": 2,
"no-new-func": 2,
"no-new-object": 2,
"no-new-require": 2,
"no-new-symbol": 2,
"no-new-wrappers": 2,
"no-obj-calls": 2,
"no-octal": 2,
"no-octal-escape": 2,
"no-path-concat": 2,
"no-proto": 2,
"no-redeclare": 2,
"no-regex-spaces": 2,
"no-return-assign": [2, "except-parens"],
"no-self-assign": 2,
"no-self-compare": 2,
"no-sequences": 2,
"no-shadow-restricted-names": 2,
"no-sparse-arrays": 2,
"no-this-before-super": 2,
"no-throw-literal": 2,
"no-trailing-spaces": 2,
"no-undef": 2,
"no-undef-init": 2,
"no-unexpected-multiline": 2,
"no-unmodified-loop-condition": 2,
"no-unneeded-ternary": [2, { "defaultAssignment": false }],
"no-unreachable": 2,
"no-unused-vars": [2, { "vars": "all", "args": "none" }],
"no-useless-call": 2,
"no-useless-computed-key": 2,
"no-useless-constructor": 2,
"no-useless-escape": 2,
"no-useless-rename": 2,
"no-whitespace-before-property": 2,
"no-with": 2,
"object-property-newline": [2, { "allowMultiplePropertiesPerLine": true }],
"one-var": [2, { "initialized": "never" }],
"operator-linebreak": [2, "after", { "overrides": { "?": "before", ":": "before" } }],
"padded-blocks": [2, "never"],
"quotes": [2, "single", { "avoidEscape": true, "allowTemplateLiterals": true }],
"rest-spread-spacing": [2, "never"],
"semi": [2, "always"],
"semi-spacing": [2, { "before": false, "after": true }],
"space-before-blocks": [2, "always"],
"space-before-function-paren": [2, "never"],
"space-in-parens": [2, "never"],
"space-infix-ops": 2,
"space-unary-ops": [2, { "words": true, "nonwords": false }],
"spaced-comment": [2, "always", { "line": { "markers": ["*package", "!", ","] }, "block": { "balanced": true, "markers": ["*package", "!", ","], "exceptions": ["*"] } }],
"template-curly-spacing": [2, "never"],
"unicode-bom": [2, "never"],
"use-isnan": 2,
"valid-typeof": 2,
"wrap-iife": [2, "any"],
"yield-star-spacing": [2, "both"],
"yoda": [2, "never"]
"comma-dangle": ["error", {
"arrays": "only-multiline",
"objects": "only-multiline",
"imports": "only-multiline",
"exports": "only-multiline",
"functions": "only-multiline"
}],
"no-console": "off"
}
}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ build/Release
# Dependency directories
node_modules
jspm_packages
yarn.lock
package-lock.json

# Optional npm cache directory
.npm
Expand Down
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Clipmaster 9000 with Tests

Automated tests for the [Clipmaster 9000](https://github.com/electron-in-action/clipmaster-9000) application. This is an example appication from [_Electron in Action_](https://bit.ly/electronjs).

The `master` branch is a starting point.

- [Completed example](https://github.com/electron-in-action/clipmaster-9000-spectron/tree/completed-example)
2 changes: 1 addition & 1 deletion app/main.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { app, BrowserWindow, globalShortcut, Menu } = require('electron');
const { app, BrowserWindow, globalShortcut } = require('electron');

let mainWindow;

Expand Down
67 changes: 12 additions & 55 deletions app/renderer.js
Original file line number Diff line number Diff line change
@@ -1,34 +1,24 @@
const { clipboard, ipcRenderer, shell } = require('electron');

const request = require('request').defaults({
url: 'https://api.github.com/gists',
headers: { 'User-Agent': 'Clipmaster 9000' }
});
const { clipboard, ipcRenderer } = require('electron');

const clippingsList = document.getElementById('clippings-list');
const copyFromClipboardButton = document.getElementById('copy-from-clipboard');

ipcRenderer.on('create-new-clipping', (event) => {
ipcRenderer.on('create-new-clipping', () => {
addClippingToList();
new Notification('Clipping Added', {
body: `${clipboard.readText()}`
body: `${clipboard.readText()}`,
});
});

ipcRenderer.on('write-to-clipboard', (event) => {
ipcRenderer.on('write-to-clipboard', () => {
const clipping = clippingsList.firstChild;
writeToClipboard(getClippingText(clipping));
new Notification('Clipping Copied', {
body: `${clipboard.readText()}`
body: `${clipboard.readText()}`,
});
});

ipcRenderer.on('publish-clipping', (event) => {
const clipping = clippingsList.firstChild;
publishClipping(getClippingText(clipping));
});

const createClippingElement = (clippingText) => {
const createClippingElement = clippingText => {
const clippingElement = document.createElement('article');

clippingElement.classList.add('clippings-list-item');
Expand All @@ -37,7 +27,6 @@ const createClippingElement = (clippingText) => {
<div class="clipping-text" disabled="true"></div>
<div class="clipping-controls">
<button class="copy-clipping">&rarr; Clipboard</button>
<button class="publish-clipping">Publish</button>
<button class="remove-clipping">Remove</button>
</div>
`;
Expand All @@ -55,60 +44,28 @@ const addClippingToList = () => {

copyFromClipboardButton.addEventListener('click', addClippingToList);

clippingsList.addEventListener('click', (event) => {
clippingsList.addEventListener('click', event => {
const hasClass = className => event.target.classList.contains(className);

const clippingListItem = getButtonParent(event);

if (hasClass('remove-clipping')) removeClipping(clippingListItem);
if (hasClass('copy-clipping')) writeToClipboard(getClippingText(clippingListItem));
if (hasClass('publish-clipping')) publishClipping(getClippingText(clippingListItem));
if (hasClass('copy-clipping'))
{writeToClipboard(getClippingText(clippingListItem));}
});

const removeClipping = (target) => {
const removeClipping = target => {
target.remove();
};

const writeToClipboard = (clippingText) => {
const writeToClipboard = clippingText => {
clipboard.writeText(clippingText);
};

const publishClipping = (clippingText) => {
console.log(request.post);
request.post(toJSON(clippingText), (err, response, body) => {
if (err) {
return new Notification('Error Publishing Your Clipping', {
body: JSON.parse(err).message
});
}

const gistUrl = JSON.parse(body).html_url;
const notification = new Notification('Your Clipping Has Been Published', {
body: `Click to open ${gistUrl} in your browser.`
});

notification.onclick = () => { shell.openExternal(gistUrl); };

clipboard.writeText(gistUrl);
});
};

const getButtonParent = ({ target }) => {
return target.parentNode.parentNode;
};

const getClippingText = (clippingListItem) => {
const getClippingText = clippingListItem => {
return clippingListItem.querySelector('.clipping-text').innerText;
};

const toJSON = (clippingText) => {
return {
body: JSON.stringify({
description: 'Created with Clipmaster 9000',
public: 'true',
files: {
'clipping.txt': { content: clippingText }
}
})
};
};
Loading