mirror of
https://github.com/atom/atom.git
synced 2026-01-24 06:18:03 -05:00
Create package-generator package
This commit is contained in:
@@ -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'
|
||||
|
||||
@@ -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))
|
||||
@@ -0,0 +1,7 @@
|
||||
PackageGeneratorView = require 'package-generator/lib/package-generator-view'
|
||||
|
||||
module.exports =
|
||||
view: null
|
||||
|
||||
activate: (state) ->
|
||||
@view = new PackageGeneratorView()
|
||||
1
src/packages/package-generator/package.cson
Normal file
1
src/packages/package-generator/package.cson
Normal file
@@ -0,0 +1 @@
|
||||
'main': 'lib/package-generator'
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
.package-generator .error {
|
||||
display: none;
|
||||
}
|
||||
Reference in New Issue
Block a user