Create package-generator package

This commit is contained in:
Corey Johnson
2013-02-04 08:55:38 -08:00
parent d049f47844
commit e1219b9fcf
14 changed files with 174 additions and 0 deletions

View File

@@ -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'

View File

@@ -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))

View File

@@ -0,0 +1,7 @@
PackageGeneratorView = require 'package-generator/lib/package-generator-view'
module.exports =
view: null
activate: (state) ->
@view = new PackageGeneratorView()

View File

@@ -0,0 +1 @@
'main': 'lib/package-generator'

View File

@@ -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)

View File

@@ -0,0 +1,3 @@
.package-generator .error {
display: none;
}