Pull out package-generator package into a separate repo

This commit is contained in:
Kevin Sawicki
2013-08-13 10:50:10 -07:00
parent 189b9051a9
commit b9585d1cf2
13 changed files with 1 additions and 281 deletions

View File

@@ -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",

View File

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

View File

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

View File

@@ -1,3 +0,0 @@
'main': './lib/package-generator'
'description': 'Generate and open a new sample package.'
'activationEvents': 'package-generator:generate'

View File

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

View File

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

View File

@@ -1,3 +0,0 @@
# DOCUMENT: link to keymap documentation
'body':
'meta-alt-ctrl-o': '__package-name__:toggle'

View File

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

View File

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

View File

@@ -1,2 +0,0 @@
'main': './lib/__package-name__'
'activationEvents': ['__package-name__:toggle']

View File

@@ -1,5 +0,0 @@
__PackageName__ = require '../lib/__package-name__'
describe "__PackageName__", ->
it "has one valid test", ->
expect("life").toBe "easy"

View File

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