diff --git a/package.json b/package.json index 9db87cf39..1b1419843 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "image-view": "0.1.0", "link": "0.1.0", "markdown-preview": "0.1.0", + "package-generator": "0.1.0", "spell-check": "0.1.0", "symbols-view": "0.1.0", "terminal": "0.3.0", diff --git a/src/packages/package-generator/lib/package-generator-view.coffee b/src/packages/package-generator/lib/package-generator-view.coffee deleted file mode 100644 index 588a0246a..000000000 --- a/src/packages/package-generator/lib/package-generator-view.coffee +++ /dev/null @@ -1,90 +0,0 @@ -{View} = require 'space-pen' -Editor = require 'editor' -$ = require 'jquery' -_ = require 'underscore' -fsUtils = require 'fs-utils' -path = require 'path' - -module.exports = -class PackageGeneratorView extends View - previouslyFocusedElement: null - - @content: -> - @div class: 'package-generator overlay from-top', => - @subview 'miniEditor', new Editor(mini: true) - @div class: 'error', outlet: 'error' - @div class: 'message', outlet: 'message' - - initialize: -> - rootView.command "package-generator:generate", => @attach() - @miniEditor.on 'focusout', => @detach() - @on 'core:confirm', => @confirm() - @on 'core:cancel', => @detach() - - attach: -> - @previouslyFocusedElement = $(':focus') - @message.text("Enter package path") - placeholderName = "package-name" - @miniEditor.setText(path.join(config.userPackagesDirPath, placeholderName)) - pathLength = @miniEditor.getText().length - @miniEditor.setSelectedBufferRange([[0, pathLength - placeholderName.length], [0, pathLength]]) - - rootView.append(this) - @miniEditor.focus() - - detach: -> - return unless @hasParent() - @previouslyFocusedElement?.focus() - super - - confirm: -> - if @validPackagePath() - @createPackageFiles() - atom.open(@getPackagePath()) - @detach() - - getPackagePath: -> - packagePath = @miniEditor.getText() - packageName = _.dasherize(path.basename(packagePath)) - path.join(path.dirname(packagePath), packageName) - - validPackagePath: -> - if fsUtils.exists(@getPackagePath()) - @error.text("Path already exists at '#{@getPackagePath()}'") - @error.show() - false - else - true - - createPackageFiles: -> - templatePath = fsUtils.resolveOnLoadPath(path.join("package-generator", "template")) - packageName = path.basename(@getPackagePath()) - - for templateChildPath in fsUtils.listTreeSync(templatePath) - relativePath = templateChildPath.replace(templatePath, "") - relativePath = relativePath.replace(/^\//, '') - relativePath = relativePath.replace(/\.template$/, '') - relativePath = @replacePackageNamePlaceholders(relativePath, packageName) - - sourcePath = path.join(@getPackagePath(), relativePath) - if fsUtils.isDirectorySync(templateChildPath) - fsUtils.makeTree(sourcePath) - if fsUtils.isFileSync(templateChildPath) - fsUtils.makeTree(path.dirname(sourcePath)) - content = @replacePackageNamePlaceholders(fsUtils.read(templateChildPath), packageName) - fsUtils.writeSync(sourcePath, content) - - replacePackageNamePlaceholders: (string, packageName) -> - placeholderRegex = /__(?:(package-name)|([pP]ackageName)|(package_name))__/g - string = string.replace placeholderRegex, (match, dash, camel, underscore) -> - if dash - _.dasherize(packageName) - else if camel - if /[a-z]/.test(camel[0]) - packageName = packageName[0].toLowerCase() + packageName[1...] - else if /[A-Z]/.test(camel[0]) - packageName = packageName[0].toUpperCase() + packageName[1...] - _.camelize(packageName) - - else if underscore - _.underscore(packageName) diff --git a/src/packages/package-generator/lib/package-generator.coffee b/src/packages/package-generator/lib/package-generator.coffee deleted file mode 100644 index 04a6dc2a5..000000000 --- a/src/packages/package-generator/lib/package-generator.coffee +++ /dev/null @@ -1,7 +0,0 @@ -PackageGeneratorView = require './package-generator-view' - -module.exports = - view: null - - activate: (state) -> - @view = new PackageGeneratorView() diff --git a/src/packages/package-generator/package.cson b/src/packages/package-generator/package.cson deleted file mode 100644 index 6a6467efd..000000000 --- a/src/packages/package-generator/package.cson +++ /dev/null @@ -1,3 +0,0 @@ -'main': './lib/package-generator' -'description': 'Generate and open a new sample package.' -'activationEvents': 'package-generator:generate' diff --git a/src/packages/package-generator/spec/package-generator-spec.coffee b/src/packages/package-generator/spec/package-generator-spec.coffee deleted file mode 100644 index babf1c559..000000000 --- a/src/packages/package-generator/spec/package-generator-spec.coffee +++ /dev/null @@ -1,107 +0,0 @@ -RootView = require 'root-view' -fsUtils = require 'fs-utils' -path = require 'path' - -describe 'Package Generator', -> - [packageGenerator] = [] - - beforeEach -> - window.rootView = new RootView - rootView.open('sample.js') - atom.activatePackage("package-generator") - - describe "when package-generator:generate is triggered", -> - it "displays a miniEditor", -> - rootView.trigger("package-generator:generate") - packageGeneratorView = rootView.find(".package-generator") - expect(packageGeneratorView).toExist() - - describe "when core:cancel is triggered", -> - it "detaches from the DOM and focuses the the previously focused element", -> - rootView.attachToDom() - rootView.trigger("package-generator:generate") - packageGeneratorView = rootView.find(".package-generator").view() - expect(packageGeneratorView.miniEditor.isFocused).toBeTruthy() - expect(rootView.getActiveView().isFocused).toBeFalsy() - - packageGeneratorView.trigger("core:cancel") - expect(packageGeneratorView.hasParent()).toBeFalsy() - expect(rootView.getActiveView().isFocused).toBeTruthy() - - describe "when a package is generated", -> - [packageName, packagePath] = [] - - beforeEach -> - spyOn(atom, "open") - - packageName = "sweet-package-dude" - packagePath = "/tmp/atom-packages/#{packageName}" - fsUtils.remove(packagePath) if fsUtils.exists(packagePath) - - afterEach -> - fsUtils.remove(packagePath) if fsUtils.exists(packagePath) - - it "forces the package's name to be lowercase with dashes", -> - packageName = "CamelCaseIsForTheBirds" - packagePath = path.join(path.dirname(packagePath), packageName) - rootView.trigger("package-generator:generate") - packageGeneratorView = rootView.find(".package-generator").view() - packageGeneratorView.miniEditor.setText(packagePath) - packageGeneratorView.trigger "core:confirm" - - expect(packagePath).not.toExistOnDisk() - expect(path.join(path.dirname(packagePath), "camel-case-is-for-the-birds")).toExistOnDisk() - - it "correctly lays out the package files and closes the package generator view", -> - rootView.attachToDom() - rootView.trigger("package-generator:generate") - packageGeneratorView = rootView.find(".package-generator").view() - expect(packageGeneratorView.hasParent()).toBeTruthy() - packageGeneratorView.miniEditor.setText(packagePath) - packageGeneratorView.trigger "core:confirm" - - expect("#{packagePath}/package.cson").toExistOnDisk() - expect("#{packagePath}/lib/#{packageName}.coffee").toExistOnDisk() - expect("#{packagePath}/lib/#{packageName}-view.coffee").toExistOnDisk() - expect("#{packagePath}/spec/#{packageName}-spec.coffee").toExistOnDisk() - expect("#{packagePath}/spec/#{packageName}-view-spec.coffee").toExistOnDisk() - expect("#{packagePath}/keymaps/#{packageName}.cson").toExistOnDisk() - expect("#{packagePath}/stylesheets/#{packageName}.css").toExistOnDisk() - - expect(packageGeneratorView.hasParent()).toBeFalsy() - expect(rootView.getActiveView().isFocused).toBeTruthy() - - it "replaces instances of packageName placeholders in template files", -> - rootView.trigger("package-generator:generate") - packageGeneratorView = rootView.find(".package-generator").view() - expect(packageGeneratorView.hasParent()).toBeTruthy() - packageGeneratorView.miniEditor.setText(packagePath) - packageGeneratorView.trigger "core:confirm" - - lines = fsUtils.read("#{packagePath}/package.cson").split("\n") - expect(lines[0]).toBe "'main': './lib\/#{packageName}'" - - lines = fsUtils.read("#{packagePath}/lib/#{packageName}.coffee").split("\n") - expect(lines[0]).toBe "SweetPackageDudeView = require './sweet-package-dude-view'" - expect(lines[3]).toBe " sweetPackageDudeView: null" - - it "displays an error when the package path already exists", -> - rootView.attachToDom() - fsUtils.makeTree(packagePath) - rootView.trigger("package-generator:generate") - packageGeneratorView = rootView.find(".package-generator").view() - - expect(packageGeneratorView.hasParent()).toBeTruthy() - expect(packageGeneratorView.error).not.toBeVisible() - packageGeneratorView.miniEditor.setText(packagePath) - packageGeneratorView.trigger "core:confirm" - expect(packageGeneratorView.hasParent()).toBeTruthy() - expect(packageGeneratorView.error).toBeVisible() - - it "opens the package", -> - rootView.trigger("package-generator:generate") - packageGeneratorView = rootView.find(".package-generator").view() - packageGeneratorView.miniEditor.setText(packagePath) - packageGeneratorView.trigger "core:confirm" - - expect(atom.open).toHaveBeenCalledWith(packagePath) diff --git a/src/packages/package-generator/stylesheets/package-generator.less b/src/packages/package-generator/stylesheets/package-generator.less deleted file mode 100644 index 1db9954fa..000000000 --- a/src/packages/package-generator/stylesheets/package-generator.less +++ /dev/null @@ -1,3 +0,0 @@ -.package-generator .error { - display: none; -} \ No newline at end of file diff --git a/src/packages/package-generator/template/keymaps/__package-name__.cson.template b/src/packages/package-generator/template/keymaps/__package-name__.cson.template deleted file mode 100644 index b3213a6a9..000000000 --- a/src/packages/package-generator/template/keymaps/__package-name__.cson.template +++ /dev/null @@ -1,3 +0,0 @@ -# DOCUMENT: link to keymap documentation -'body': - 'meta-alt-ctrl-o': '__package-name__:toggle' diff --git a/src/packages/package-generator/template/lib/__package-name__-view.coffee.template b/src/packages/package-generator/template/lib/__package-name__-view.coffee.template deleted file mode 100644 index 215b8fdbf..000000000 --- a/src/packages/package-generator/template/lib/__package-name__-view.coffee.template +++ /dev/null @@ -1,25 +0,0 @@ -{$$, View} = require 'space-pen' - -module.exports = -class __PackageName__View extends View - @content: -> - @div class: '__package-name__ overlay from-top', => - @div "The __PackageName__ package is Alive! It's ALIVE!", class: "message" - - initialize: (serializeState) -> - rootView.command "__package-name__:toggle", => @toggle() - - # Returns an object that can be retrieved when package is activated - serialize: -> - - # Tear down any state and detach - destroy: -> - @detach() - - toggle: -> - console.log "__PackageName__View was toggled!" - if @hasParent() - @detach() - else - rootView.append(this) - diff --git a/src/packages/package-generator/template/lib/__package-name__.coffee.template b/src/packages/package-generator/template/lib/__package-name__.coffee.template deleted file mode 100644 index 7592196fe..000000000 --- a/src/packages/package-generator/template/lib/__package-name__.coffee.template +++ /dev/null @@ -1,13 +0,0 @@ -__PackageName__View = require './__package-name__-view' - -module.exports = - __packageName__View: null - - activate: (state) -> - @__packageName__View = new __PackageName__View(state.__packageName__ViewState) - - deactivate: -> - @__packageName__View.destroy() - - serialize: -> - __packageName__ViewState: @__packageName__View.serialize() diff --git a/src/packages/package-generator/template/package.cson b/src/packages/package-generator/template/package.cson deleted file mode 100644 index 7da6f6611..000000000 --- a/src/packages/package-generator/template/package.cson +++ /dev/null @@ -1,2 +0,0 @@ -'main': './lib/__package-name__' -'activationEvents': ['__package-name__:toggle'] diff --git a/src/packages/package-generator/template/spec/__package-name__-spec.coffee.template b/src/packages/package-generator/template/spec/__package-name__-spec.coffee.template deleted file mode 100644 index f0d203f4a..000000000 --- a/src/packages/package-generator/template/spec/__package-name__-spec.coffee.template +++ /dev/null @@ -1,5 +0,0 @@ -__PackageName__ = require '../lib/__package-name__' - -describe "__PackageName__", -> - it "has one valid test", -> - expect("life").toBe "easy" diff --git a/src/packages/package-generator/template/spec/__package-name__-view-spec.coffee.template b/src/packages/package-generator/template/spec/__package-name__-view-spec.coffee.template deleted file mode 100644 index a9008665c..000000000 --- a/src/packages/package-generator/template/spec/__package-name__-view-spec.coffee.template +++ /dev/null @@ -1,21 +0,0 @@ -__PackageName__View = require '../lib/__package-name__-view' -RootView = require 'root-view' - -# This spec is focused because it starts with an `f`. Remove the `f` -# to unfocus the spec. -# -# Press meta-alt-ctrl-s to run the specs -fdescribe "__PackageName__View", -> - __packageName__ = null - - beforeEach -> - window.rootView = new RootView - __packageName__ = atom.activatePackage('__packageName__', immediate: true) - - describe "when the __package-name__:toggle event is triggered", -> - it "attaches and then detaches the view", -> - expect(rootView.find('.__package-name__')).not.toExist() - rootView.trigger '__package-name__:toggle' - expect(rootView.find('.__package-name__')).toExist() - rootView.trigger '__package-name__:toggle' - expect(rootView.find('.__package-name__')).not.toExist() diff --git a/src/packages/package-generator/template/stylesheets/__package-name__.css.template b/src/packages/package-generator/template/stylesheets/__package-name__.css.template deleted file mode 100644 index f6fe86ba8..000000000 --- a/src/packages/package-generator/template/stylesheets/__package-name__.css.template +++ /dev/null @@ -1,2 +0,0 @@ -.__package-name__ { -}