From e1219b9fcfd2ec9a94882b68697189b348f8494f Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 4 Feb 2013 08:55:38 -0800 Subject: [PATCH] Create package-generator package --- src/app/keymaps/editor.cson | 5 ++ .../keymaps/pacakge-generator.cson | 0 .../lib/package-generator-view.coffee | 68 ++++++++++++++ .../lib/package-generator.coffee | 7 ++ src/packages/package-generator/package.cson | 1 + .../spec/package-generator-spec.coffee | 90 +++++++++++++++++++ .../stylesheets/package-generator.css | 3 + .../template/keymaps/__packageName__.cson | 0 .../template/lib/__packageName__-view.coffee | 0 .../template/lib/__packageName__.coffee | 0 .../package-generator/template/package.cson | 0 .../template/spec/__packageName__-spec.coffee | 0 .../spec/__packageName__-view-spec.coffee | 0 .../template/stylesheets/__packageName__.css | 0 14 files changed, 174 insertions(+) create mode 100644 src/packages/package-generator/keymaps/pacakge-generator.cson create mode 100644 src/packages/package-generator/lib/package-generator-view.coffee create mode 100644 src/packages/package-generator/lib/package-generator.coffee create mode 100644 src/packages/package-generator/package.cson create mode 100644 src/packages/package-generator/spec/package-generator-spec.coffee create mode 100644 src/packages/package-generator/stylesheets/package-generator.css create mode 100644 src/packages/package-generator/template/keymaps/__packageName__.cson create mode 100644 src/packages/package-generator/template/lib/__packageName__-view.coffee create mode 100644 src/packages/package-generator/template/lib/__packageName__.coffee create mode 100644 src/packages/package-generator/template/package.cson create mode 100644 src/packages/package-generator/template/spec/__packageName__-spec.coffee create mode 100644 src/packages/package-generator/template/spec/__packageName__-view-spec.coffee create mode 100644 src/packages/package-generator/template/stylesheets/__packageName__.css diff --git a/src/app/keymaps/editor.cson b/src/app/keymaps/editor.cson index b29d0ddd7..a388609cc 100644 --- a/src/app/keymaps/editor.cson +++ b/src/app/keymaps/editor.cson @@ -44,3 +44,8 @@ 'ctrl-meta-up': 'editor:move-line-up' 'ctrl-meta-down': 'editor:move-line-down' 'meta-D': 'editor:duplicate-line' + +'.editor.mini': + 'enter': 'core:confirm', + 'escape': 'core:cancel' + 'meta-w': 'core:cancel' diff --git a/src/packages/package-generator/keymaps/pacakge-generator.cson b/src/packages/package-generator/keymaps/pacakge-generator.cson new file mode 100644 index 000000000..e69de29bb diff --git a/src/packages/package-generator/lib/package-generator-view.coffee b/src/packages/package-generator/lib/package-generator-view.coffee new file mode 100644 index 000000000..3c66a30ec --- /dev/null +++ b/src/packages/package-generator/lib/package-generator-view.coffee @@ -0,0 +1,68 @@ +{View} = require 'space-pen' +Editor = require 'editor' +$ = require 'jquery' +fs = require 'fs' + +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(fs.join(config.userPackagesDirPath, placeholderName)); + pathLength = @miniEditor.getText().length + @miniEditor.setSelectedBufferRange([[0, pathLength - placeholderName.length], [0, pathLength]]) + @miniEditor.focus() + rootView.append(this) + + detach: -> + return unless @hasParent() + @previouslyFocusedElement?.focus() + super + + confirm: -> + if @validPackagePath() + @createPackageFiles() + atom.open(@getPackagePath()) + @detach() + + getPackagePath: -> + @miniEditor.getText() + + validPackagePath: -> + if fs.exists(@getPackagePath()) + @error.text("Path already exists at '#{@getPackagePath()}'") + @error.show() + false + else + true + + createPackageFiles: -> + templatePath = require.resolve(fs.join("package-generator", "template")) + packageName = fs.base(@getPackagePath()) + + for path in fs.listTree(templatePath) + relativePath = path.replace(templatePath, "") + relativePath = relativePath.replace(/^\//, '') + relativePath = relativePath.replace("__packageName__", packageName) + + sourcePath = fs.join(@getPackagePath(), relativePath) + if fs.isDirectory(path) + fs.makeTree(sourcePath) + if fs.isFile(path) + fs.makeTree(fs.directory(sourcePath)) + fs.write(sourcePath, fs.read(path)) diff --git a/src/packages/package-generator/lib/package-generator.coffee b/src/packages/package-generator/lib/package-generator.coffee new file mode 100644 index 000000000..57bdab66c --- /dev/null +++ b/src/packages/package-generator/lib/package-generator.coffee @@ -0,0 +1,7 @@ +PackageGeneratorView = require 'package-generator/lib/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 new file mode 100644 index 000000000..44ce0ee64 --- /dev/null +++ b/src/packages/package-generator/package.cson @@ -0,0 +1 @@ +'main': 'lib/package-generator' \ No newline at end of file diff --git a/src/packages/package-generator/spec/package-generator-spec.coffee b/src/packages/package-generator/spec/package-generator-spec.coffee new file mode 100644 index 000000000..fccf785fe --- /dev/null +++ b/src/packages/package-generator/spec/package-generator-spec.coffee @@ -0,0 +1,90 @@ +RootView = require 'root-view' +fs = require 'fs' + +describe 'Package Generator', -> + [packageGenerator] = [] + + beforeEach -> + new RootView(require.resolve('fixtures/sample.js')) + atom.loadPackage("package-generator") + + afterEach -> + rootView.deactivate() + + 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.getActiveEditor().isFocused).toBeFalsy() + + packageGeneratorView.trigger("core:cancel") + expect(packageGeneratorView.hasParent()).toBeFalsy() + expect(rootView.getActiveEditor().isFocused).toBeTruthy() + + describe "when a package is generated", -> + [packageName, packagePath] = [] + + beforeEach -> + spyOn(atom, "open") + + packageName = "sweet-package-dude" + packagePath = "/tmp/atom-packages/#{packageName}" + fs.remove(packagePath) if fs.exists(packagePath) + + @addMatchers + toExistOnDisk: (expected) -> + notText = this.isNot and " not" or "" + @message = -> return "Expected path '" + @actual + notText + "' to exist." + fs.exists(@actual) + + afterEach -> + fs.remove(packagePath) if fs.exists(packagePath) + + it "correctly lays out the package files and closes the package generator view", -> + rootView.trigger("package-generator:generate") + packageGeneratorView = rootView.find(".package-generator").view() + expect(packageGeneratorView.hasParent()).toBeTruthy() + packageGeneratorView.miniEditor.setText(packagePath) + packageGeneratorView.miniEditor.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.getActiveEditor().isFocused).toBeTruthy() + + it "displays an error when the package path already exists", -> + rootView.attachToDom() + fs.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.miniEditor.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.css b/src/packages/package-generator/stylesheets/package-generator.css new file mode 100644 index 000000000..1db9954fa --- /dev/null +++ b/src/packages/package-generator/stylesheets/package-generator.css @@ -0,0 +1,3 @@ +.package-generator .error { + display: none; +} \ No newline at end of file diff --git a/src/packages/package-generator/template/keymaps/__packageName__.cson b/src/packages/package-generator/template/keymaps/__packageName__.cson new file mode 100644 index 000000000..e69de29bb diff --git a/src/packages/package-generator/template/lib/__packageName__-view.coffee b/src/packages/package-generator/template/lib/__packageName__-view.coffee new file mode 100644 index 000000000..e69de29bb diff --git a/src/packages/package-generator/template/lib/__packageName__.coffee b/src/packages/package-generator/template/lib/__packageName__.coffee new file mode 100644 index 000000000..e69de29bb diff --git a/src/packages/package-generator/template/package.cson b/src/packages/package-generator/template/package.cson new file mode 100644 index 000000000..e69de29bb diff --git a/src/packages/package-generator/template/spec/__packageName__-spec.coffee b/src/packages/package-generator/template/spec/__packageName__-spec.coffee new file mode 100644 index 000000000..e69de29bb diff --git a/src/packages/package-generator/template/spec/__packageName__-view-spec.coffee b/src/packages/package-generator/template/spec/__packageName__-view-spec.coffee new file mode 100644 index 000000000..e69de29bb diff --git a/src/packages/package-generator/template/stylesheets/__packageName__.css b/src/packages/package-generator/template/stylesheets/__packageName__.css new file mode 100644 index 000000000..e69de29bb