Skip to content

Commit

Permalink
Merge pull request #3585 from trabus/generate-in-repo-addon
Browse files Browse the repository at this point in the history
[ENHANCEMENT] Add in-repo-addon generate and destroy support
  • Loading branch information
stefanpenner committed Mar 25, 2015
2 parents a3dcdcc + a5c49f5 commit 19965fa
Show file tree
Hide file tree
Showing 11 changed files with 322 additions and 23 deletions.
8 changes: 7 additions & 1 deletion blueprints/component-addon/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ module.exports = {
}
return options.dasherizedModuleName;
},
__root__: function(options) {
if (options.inRepoAddon) {
return path.join('lib', options.inRepoAddon, 'app');
}
return 'app';
}
};
},

Expand All @@ -36,7 +42,7 @@ module.exports = {
},

locals: function(options) {
var addonRawName = options.project.pkg.name;
var addonRawName = options.inRepoAddon ? options.inRepoAddon : options.project.pkg.name;
var addonName = stringUtil.dasherize(addonRawName);
var fileName = stringUtil.dasherize(options.entity.name);
var pathName = [addonName, 'components', fileName].join('/');
Expand Down
2 changes: 1 addition & 1 deletion blueprints/component/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ module.exports = {
var importTemplate = '';
var contents = '';
// if we're in an addon, build import statement
if (options.project.isEmberCLIAddon()) {
if (options.project.isEmberCLIAddon() || options.inRepoAddon) {
if(options.pod) {
templatePath = './template'
} else {
Expand Down
3 changes: 2 additions & 1 deletion lib/commands/destroy.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ module.exports = Command.extend({
availableOptions: [
{ name: 'dry-run', type: Boolean, default: false, aliases: ['d'] },
{ name: 'verbose', type: Boolean, default: false, aliases: ['v'] },
{ name: 'pod', type: Boolean, default: false, aliases: ['p'] }
{ name: 'pod', type: Boolean, default: false, aliases: ['p'] },
{ name: 'in-repo-addon', type: String, default: null, aliases: ['in-repo', 'ir']}
],

anonymousOptions: [
Expand Down
5 changes: 3 additions & 2 deletions lib/commands/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ module.exports = Command.extend({
availableOptions: [
{ name: 'dry-run', type: Boolean, default: false, aliases: ['d'] },
{ name: 'verbose', type: Boolean, default: false, aliases: ['v'] },
{ name: 'pod', type: Boolean, default: false, aliases: ['p'] }
{ name: 'pod', type: Boolean, default: false, aliases: ['p'] },
{ name: 'in-repo-addon', type: String, default: null, aliases: ['in-repo', 'ir']}
],

anonymousOptions: [
Expand Down Expand Up @@ -65,7 +66,7 @@ module.exports = Command.extend({
args: rawArgs
};

if(this.settings && this.settings.usePods) {
if (this.settings && this.settings.usePods) {
commandOptions.pod = !commandOptions.pod;
}

Expand Down
28 changes: 23 additions & 5 deletions lib/models/blueprint.js
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,6 @@ Blueprint.prototype.install = function(options) {
this.testing = options.testing;
this.pod = options.pod;
this.hasPath = hasPathToken(this.files());

var actions = {
write: function(info) {
ui.writeLine(' ' + chalk.green('create') + ' ' + info.displayPath);
Expand Down Expand Up @@ -386,15 +385,25 @@ Blueprint.prototype.install = function(options) {
ui.writeLine('installing');

if (dryRun) {
ui.writeLine(chalk.yellow('You specified the dry-run flag, so no changes will be written.'));
ui.writeLine(chalk.yellow('You specified the dry-run flag, so no changes will' +
' be written.'));
}

if(options.entity) {
options.entity.name = this.normalizeEntityName(options.entity.name);
}

if (!this.hasPath && this.pod && verbose) {
ui.writeLine(chalk.yellow('You specified the pod flag, but this blueprint does not support pod structure. It will be generated with the default structure.'));
ui.writeLine(chalk.yellow('You specified the pod flag, but this blueprint does' +
' not support pod structure. It will be generated with the default structure.'));
}

if (options.inRepoAddon) {
if (!inRepoAddonExists(options.inRepoAddon, this.project.root)) {
throw new SilentError('You specified the in-repo-addon flag, but the' +
' in-repo-addon \'' + options.inRepoAddon + '\' does not exist. Please' +
' check the name and try again.');
}
}

var locals = this._locals(options);
Expand Down Expand Up @@ -531,7 +540,10 @@ Blueprint.prototype._fileMapTokens = function(options) {
}
return inflector.pluralize(blueprintName);
},
__root__: function() {
__root__: function(options) {
if (options.inRepoAddon) {
return path.join('lib',options.inRepoAddon, 'addon');
}
if (options.inAddon) {
return 'addon';
}
Expand Down Expand Up @@ -703,14 +715,15 @@ Blueprint.prototype._locals = function(options) {
var moduleName = options.entity && options.entity.name || packageName;
var podModulePrefix = this.project.config().podModulePrefix || '';
var podPath = podModulePrefix.substr(podModulePrefix.lastIndexOf('/') + 1);
var inAddon = this.project.isEmberCLIAddon();
var inAddon = this.project.isEmberCLIAddon() || options.inRepoAddon !== null;
var sanitizedModuleName = moduleName.replace(/\//g, '-');
var customLocals = this.locals(options);

var fileMapVariables = {
pod: this.pod,
podPath: podPath,
inAddon: inAddon,
inRepoAddon: options.inRepoAddon,
blueprintName: this.name,
dasherizedModuleName: stringUtils.dasherize(moduleName),
locals: customLocals
Expand Down Expand Up @@ -1286,6 +1299,11 @@ function hasPathToken(files) {
return files.join().match(/__path__/);
}

function inRepoAddonExists(name, root) {
var addonPath = path.join(root, 'lib', name);
return fs.existsSync(addonPath);
}

function podDeprecations(config, ui){
/*
var podModulePrefix = config.podModulePrefix || '';
Expand Down
3 changes: 1 addition & 2 deletions lib/tasks/generate-from-blueprint.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ module.exports = Task.extend({
})
.then(function() {
if (!addonBlueprint) { return; }

if (!this.project.isEmberCLIAddon()) { return; }
if (!this.project.isEmberCLIAddon() && blueprintOptions.inRepoAddon === null) { return; }

if (addonBlueprint.locals === Blueprint.prototype.locals) {
addonBlueprint.locals = function(options) {
Expand Down
57 changes: 56 additions & 1 deletion tests/acceptance/destroy-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,17 @@ describe('Acceptance: ember destroy', function() {
'--skip-bower'
]);
}


function initInRepoAddon() {
return initApp().then(function() {
return ember([
'generate',
'in-repo-addon',
'my-addon'
]);
});
}

function generate(args) {
var generateArgs = ['generate'].concat(args);
return ember(generateArgs);
Expand All @@ -73,6 +83,14 @@ describe('Acceptance: ember destroy', function() {
return ember(generateArgs);
});
}

function generateInRepoAddon(args) {
var generateArgs = ['generate'].concat(args);

return initInRepoAddon().then(function() {
return ember(generateArgs);
});
}

function destroy(args) {
var destroyArgs = ['destroy'].concat(args);
Expand Down Expand Up @@ -123,6 +141,19 @@ describe('Acceptance: ember destroy', function() {
assertFilesNotExist(files);
});
}

function assertDestroyAfterGenerateInRepoAddon(args, files) {
return generateInRepoAddon(args)
.then(function() {
assertFilesExist(files);
})
.then(function() {
return destroy(args);
})
.then(function() {
assertFilesNotExist(files);
});
}

it('controller foo', function() {
var commandArgs = ['controller', 'foo'];
Expand Down Expand Up @@ -498,6 +529,30 @@ describe('Acceptance: ember destroy', function() {
return assertDestroyAfterGenerateInAddon(commandArgs, files);
});

it('in-repo-addon component x-foo', function() {
var commandArgs = ['component', 'x-foo', '--in-repo-addon=my-addon'];
var files = [
'lib/my-addon/addon/components/x-foo.js',
'lib/my-addon/addon/templates/components/x-foo.hbs',
'lib/my-addon/app/components/x-foo.js',
'tests/unit/components/x-foo-test.js'
];

return assertDestroyAfterGenerateInRepoAddon(commandArgs, files);
});

it('in-repo-addon component nested/x-foo', function() {
var commandArgs = ['component', 'nested/x-foo', '--in-repo-addon=my-addon'];
var files = [
'lib/my-addon/addon/components/nested/x-foo.js',
'lib/my-addon/addon/templates/components/nested/x-foo.hbs',
'lib/my-addon/app/components/nested/x-foo.js',
'tests/unit/components/nested/x-foo-test.js'
];

return assertDestroyAfterGenerateInRepoAddon(commandArgs, files);
});

it('acceptance-test foo', function() {
var commandArgs = ['acceptance-test', 'foo'];
var files = ['tests/acceptance/foo-test.js'];
Expand Down
82 changes: 82 additions & 0 deletions tests/acceptance/generate-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ describe('Acceptance: ember generate', function() {
'--skip-bower'
]);
}

function initInRepoAddon() {
return initApp().then(function() {
return ember([
'generate',
'in-repo-addon',
'my-addon'
]);
});
}

function generate(args) {
var generateArgs = ['generate'].concat(args);
Expand All @@ -76,6 +86,14 @@ describe('Acceptance: ember generate', function() {
return ember(generateArgs);
});
}

function generateInRepoAddon(args) {
var generateArgs = ['generate'].concat(args);

return initInRepoAddon().then(function() {
return ember(generateArgs);
});
}

it('controller foo', function() {
return generate(['controller', 'foo']).then(function() {
Expand Down Expand Up @@ -1275,6 +1293,70 @@ describe('Acceptance: ember generate', function() {
});
});

it('in-repo-addon component x-foo', function() {
return generateInRepoAddon(['component', 'x-foo', '--in-repo-addon=my-addon']).then(function() {
assertFile('lib/my-addon/addon/components/x-foo.js', {
contains: [
"import Ember from 'ember';",
"import layout from '../templates/components/x-foo';",
"export default Ember.Component.extend({",
"layout: layout",
"});"
]
});
assertFile('lib/my-addon/addon/templates/components/x-foo.hbs', {
contains: "{{yield}}"
});
assertFile('lib/my-addon/app/components/x-foo.js', {
contains: [
"import xFoo from 'my-addon/components/x-foo';",
"export default xFoo;"
]
});
assertFile('tests/unit/components/x-foo-test.js', {
contains: [
"import {" + EOL +
" moduleForComponent," + EOL +
" test" + EOL +
"} from 'ember-qunit';",
"moduleForComponent('x-foo'"
]
});
});
});

it('in-repo-addon component nested/x-foo', function() {
return generateInRepoAddon(['component', 'nested/x-foo', '--in-repo-addon=my-addon']).then(function() {
assertFile('lib/my-addon/addon/components/nested/x-foo.js', {
contains: [
"import Ember from 'ember';",
"import layout from '../../templates/components/nested/x-foo';",
"export default Ember.Component.extend({",
"layout: layout",
"});"
]
});
assertFile('lib/my-addon/addon/templates/components/nested/x-foo.hbs', {
contains: "{{yield}}"
});
assertFile('lib/my-addon/app/components/nested/x-foo.js', {
contains: [
"import nestedXFoo from 'my-addon/components/nested/x-foo';",
"export default nestedXFoo;"
]
});
assertFile('tests/unit/components/nested/x-foo-test.js', {
contains: [
"import {" + EOL +
" moduleForComponent," + EOL +
" test" + EOL +
"} from 'ember-qunit';",
"moduleForComponent('nested/x-foo'"
]
});
});
});

it('availableOptions work with aliases.', function() {
return generate(['route', 'foo', '-resource']).then(function() {
assertFile('app/router.js', {
Expand Down

0 comments on commit 19965fa

Please sign in to comment.