Gracefully handle empty keymaps and menus

Closes atom/settings-view#310
This commit is contained in:
Kevin Sawicki
2015-01-07 09:18:18 -08:00
parent 462af79d21
commit 6fe7eb086f
6 changed files with 26 additions and 2 deletions

View File

@@ -0,0 +1,4 @@
{
"name": "package-with-empty-keymap",
"version": "1.0.0"
}

View File

@@ -0,0 +1,4 @@
{
"name": "package-with-empty-menu",
"version": "1.0.0"
}

View File

@@ -273,6 +273,14 @@ describe "PackageManager", ->
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-n', target:element1[0])[0].command).toBe 'keymap-2'
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-y', target:element3[0])).toHaveLength 0
describe "when the keymap file is empty", ->
it "does not throw an error on activation", ->
waitsForPromise ->
atom.packages.activatePackage("package-with-empty-keymap")
runs ->
expect(atom.packages.isPackageActive("package-with-empty-keymap")).toBe true
describe "menu loading", ->
beforeEach ->
atom.contextMenu.definitions = []
@@ -311,6 +319,14 @@ describe "PackageManager", ->
expect(atom.contextMenu.templateForElement(element)[1].label).toBe "Menu item 1"
expect(atom.contextMenu.templateForElement(element)[2]).toBeUndefined()
describe "when the menu file is empty", ->
it "does not throw an error on activation", ->
waitsForPromise ->
atom.packages.activatePackage("package-with-empty-menu")
runs ->
expect(atom.packages.isPackageActive("package-with-empty-menu")).toBe true
describe "stylesheet loading", ->
describe "when the metadata contains a 'stylesheets' manifest", ->
it "loads stylesheets from the stylesheets directory as specified by the manifest", ->

View File

@@ -206,13 +206,13 @@ class Package
if @bundledPackage and packagesCache[@name]?
@keymaps = (["#{atom.packages.resourcePath}#{path.sep}#{keymapPath}", keymapObject] for keymapPath, keymapObject of packagesCache[@name].keymaps)
else
@keymaps = @getKeymapPaths().map (keymapPath) -> [keymapPath, CSON.readFileSync(keymapPath)]
@keymaps = @getKeymapPaths().map (keymapPath) -> [keymapPath, CSON.readFileSync(keymapPath) ? {}]
loadMenus: ->
if @bundledPackage and packagesCache[@name]?
@menus = (["#{atom.packages.resourcePath}#{path.sep}#{menuPath}", menuObject] for menuPath, menuObject of packagesCache[@name].menus)
else
@menus = @getMenuPaths().map (menuPath) -> [menuPath, CSON.readFileSync(menuPath)]
@menus = @getMenuPaths().map (menuPath) -> [menuPath, CSON.readFileSync(menuPath) ? {}]
getKeymapPaths: ->
keymapsDirPath = path.join(@path, 'keymaps')