Skip to content

Commit

Permalink
feature: added platforms flag. closes #32.
Browse files Browse the repository at this point in the history
  • Loading branch information
dwmkerr committed Jun 2, 2017
1 parent bce210e commit 9020323
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 20 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ test/NativeApp/android/native_app/src/main/res
npm-debug.log
src/label/test-images/*-output.png
src/resize/test-images/*output.png
.nyc_output/
10 changes: 5 additions & 5 deletions bin/app-icon.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
// eslint-disable-next-line
'use strict';

const chalk = require('chalk');
const program = require('commander');
const pack = require('../package.json');
const isImagemagickInstalled = require('../src/imagemagick/is-imagemagick-installed');
Expand All @@ -21,7 +22,8 @@ program
.description('Generate all app icons from a single input icon')
.option('-i, --icon [icon]', "The icon to use. Defaults to 'icon.png'", 'icon.png')
.option('-s, --search [optional]', "The folder to search from. Defaults to './'", './')
.action(({ icon, search }) => {
.option('-p, --platforms [optional]', "The platforms to generate icons for. Defaults to 'android,ios'", 'android,ios')
.action(({ icon, search, platforms }) => {
isImagemagickInstalled()
.catch((err) => { throw err; })
.then((imageMagickInstalled) => {
Expand All @@ -40,12 +42,10 @@ program
return process.exit(1);
}
// Generate some icons.
return generate(icon, search);
return generate({ icon, search, platforms });
})
.catch((generateErr) => {
console.error('An error occurred generating the icons...');
console.log(generateErr);
throw generateErr;
console.error(chalk.red(`An error occurred generating the icons: ${generateErr.message}`));
});
});

Expand Down
9 changes: 4 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
},
"scripts": {
"start": "./bin/app-icon.js",
"test": "mocha './src/**/*.specs.js'",
"test:debug": "mocha -d --debug-brk -w --inspect './src/**/*.specs.js'",
"cov": "istanbul cover --dir './artifacts/coverage' -x './src/**/*.specs.js' _mocha './src/**/*.specs.js'",
"test": "mocha -t 10000 './src/**/*.specs.js'",
"test:debug": "mocha -d --debug-brk -w --inspect './src/**/*.specs.js'" ,
"cov": "nyc --reporter text --reporter html --reporter lcov --report-dir './artifacts/coverage' -x './src/**/*.specs.js' mocha --timeout 10000 './src/**/*.specs.js'",
"lint": "eslint ."
},
"repository": {
Expand All @@ -35,9 +35,8 @@
"eslint": "^3.17.1",
"eslint-config-airbnb-base": "^11.1.1",
"eslint-plugin-import": "^2.2.0",
"istanbul": "^0.4.5",
"mocha": "^3.0.2",
"node-inspector": "^1.1.1"
"nyc": "^11.0.1"
},
"dependencies": {
"chalk": "^1.1.3",
Expand Down
26 changes: 20 additions & 6 deletions src/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,41 @@ const findIconsetFolders = require('./ios/find-iconset-folders');
const generateIconsetIcons = require('./ios/generate-iconset-icons');
const findAndroidManifests = require('./android/find-android-manifests');
const generateManifestIcons = require('./android/generate-manifest-icons');
const validateParameters = require('./validate-parameters');

module.exports = function generate(parameters) {
// Validate and coerce the parameters.
const { sourceIcon, searchRoot, platforms } = validateParameters(parameters);

// Set up the results object.
const results = { iconsets: [], manifests: [] };

module.exports = function generate(sourceIcon, searchRoot) {
return findIconsetFolders(searchRoot)
.then(iconSets => Promise.all(iconSets.map((iconset) => {
if (!platforms.includes('ios')) return null;

console.log(`Found iOS iconset: ${iconset}...`);

return generateIconsetIcons(sourceIcon, iconset)
.then((results) => {
results.icons.forEach((icon) => {
.then(({ icons }) => {
results.iconsets.push({ iconset, icons });
icons.forEach((icon) => {
console.log(` ${chalk.green('✓')} Generated ${icon}`);
});
console.log(` ${chalk.green('✓')} Updated Contents.json`);
});
})))
.then(() => findAndroidManifests(searchRoot))
.then(manifests => Promise.all(manifests.map((manifest) => {
if (!platforms.includes('android')) return null;

console.log(`Found Android Manifest: ${manifest}...`);
return generateManifestIcons(sourceIcon, manifest).then((results) => {
results.icons.forEach((icon) => {
return generateManifestIcons(sourceIcon, manifest).then(({ icons }) => {
results.manifests.push({ manifest, icons });
icons.forEach((icon) => {
console.log(` ${chalk.green('✓')} Generated ${icon}`);
});
});
})));
})))
.then(() => results);
};
13 changes: 9 additions & 4 deletions src/generate.specs.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
const expect = require('chai').expect;
const generate = require('./generate');

const sourceIcon = 'icon.png';

describe('generate', () => {
it('should be able to generate React Native icons', () => {
it('should be able to generate test app icons', () => {
const parameters = {
sourceIcon: 'icon.png',
searchPath: './',
};

// Delete all of the files we're expecting to create, then generate them.
return generate(sourceIcon, './test/ReactNativeIconTest').then((results) => {
return generate(parameters).then((results) => {
// TODO: Check we found the manifests etc etc
expect(results).not.to.equal(null);
expect(results.iconsets.length).to.equal(3);
expect(results.manifests.length).to.equal(4);
});
});
});
18 changes: 18 additions & 0 deletions src/validate-parameters.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
module.exports = function validateParameters(parameters) {
// Validate or assign the source icon.
const sourceIcon = parameters.sourceIcon || 'icon.png';

// Validate or assign the search path.
const searchRoot = parameters.searchRoot || './';

// Validate or assign the platforms.
const platformsString = parameters.platforms || 'android,ios';
const platforms = platformsString.split(',');
for (let i = 0; i < platforms.length; i += 1) {
if (!/android|ios/.test(platforms[i])) {
throw new Error(`${platforms[i]} is not a valid platform.`);
}
}

return { sourceIcon, searchRoot, platforms };
};
39 changes: 39 additions & 0 deletions src/validate-parameters.specs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
const assert = require('assert');
const validateParameters = require('./validate-parameters');

describe('validateParameters', () => {
function validParameters() {
return {
sourceIcon: 'icon.png',
searchRoot: './',
platforms: 'android,ios',
};
}

it('should provide a default source icon', () => {
const params = validParameters();
delete params.sourceIcon;
const parameters = validateParameters(params);
assert.equal(parameters.sourceIcon, 'icon.png');
});

it('should provide a default search root', () => {
const params = validParameters();
delete params.searchRoot;
const parameters = validateParameters(params);
assert.equal(parameters.searchRoot, './');
});

it('should provide a default set of platforms', () => {
const params = validParameters();
delete params.platforms;
const parameters = validateParameters(params);
assert.deepEqual(parameters.platforms, ['android', 'ios']);
});

it('should reject invalid platforms', () => {
const params = validParameters();
params.platforms = 'android,jos';
assert.throws(() => validateParameters(params), /jos.*not a valid platform/);
});
});

0 comments on commit 9020323

Please sign in to comment.