mirror of
https://github.com/atom/atom.git
synced 2026-01-23 13:58:08 -05:00
Pull out package-generator package into a separate repo
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
@@ -1,7 +0,0 @@
|
||||
PackageGeneratorView = require './package-generator-view'
|
||||
|
||||
module.exports =
|
||||
view: null
|
||||
|
||||
activate: (state) ->
|
||||
@view = new PackageGeneratorView()
|
||||
@@ -1,3 +0,0 @@
|
||||
'main': './lib/package-generator'
|
||||
'description': 'Generate and open a new sample package.'
|
||||
'activationEvents': 'package-generator:generate'
|
||||
@@ -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)
|
||||
@@ -1,3 +0,0 @@
|
||||
.package-generator .error {
|
||||
display: none;
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
# DOCUMENT: link to keymap documentation
|
||||
'body':
|
||||
'meta-alt-ctrl-o': '__package-name__:toggle'
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
@@ -1,2 +0,0 @@
|
||||
'main': './lib/__package-name__'
|
||||
'activationEvents': ['__package-name__:toggle']
|
||||
@@ -1,5 +0,0 @@
|
||||
__PackageName__ = require '../lib/__package-name__'
|
||||
|
||||
describe "__PackageName__", ->
|
||||
it "has one valid test", ->
|
||||
expect("life").toBe "easy"
|
||||
@@ -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()
|
||||
@@ -1,2 +0,0 @@
|
||||
.__package-name__ {
|
||||
}
|
||||
Reference in New Issue
Block a user