From fc9bf38a2ac2cdcedabd2b6947e5d59a06543681 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 17 Dec 2012 20:56:28 -0700 Subject: [PATCH] *Must* use `get` and `set` to access `config` values. The `config` object no longer stores config properties directly. Instead it stores them on an internal `settings` object, which makes it easier to serialize settings without getting them mixed up with non-setting state on the `config` object. --- spec/app/config-spec.coffee | 11 +++- spec/app/editor-spec.coffee | 8 +-- spec/app/project-spec.coffee | 4 +- spec/spec-helper.coffee | 2 +- src/app/config.coffee | 55 +++++++++++-------- src/app/editor.coffee | 4 +- src/app/project.coffee | 2 +- src/app/root-view.coffee | 13 ++--- .../tree-view/spec/tree-view-spec.coffee | 2 +- .../tree-view/src/directory-view.coffee | 2 +- 10 files changed, 60 insertions(+), 43 deletions(-) diff --git a/spec/app/config-spec.coffee b/spec/app/config-spec.coffee index ab35b7b02..63dfac4ae 100644 --- a/spec/app/config-spec.coffee +++ b/spec/app/config-spec.coffee @@ -15,8 +15,17 @@ describe "Config", -> expect(config.save).toHaveBeenCalled() expect(observeHandler).toHaveBeenCalledWith 42 + describe ".setDefaults(keyPath, defaults)", -> + it "assigns any previously-unassigned keys to the object at the key path", -> + config.set("foo.bar.baz", a: 1) + config.setDefaults("foo.bar.baz", a: 2, b: 3, c: 4) + expect(config.get("foo.bar.baz")).toEqual(a: 1, b: 3, c: 4) + + config.setDefaults("foo.quux", x: 0, y: 1) + expect(config.get("foo.quux")).toEqual(x: 0, y: 1) + describe ".update()", -> - it "updates observers if a value is mutated without the use of .set()", -> + it "updates observers if a value is mutated without the use of .set", -> config.set("foo.bar.baz", ["a"]) observeHandler = jasmine.createSpy "observeHandler" config.observe "foo.bar.baz", observeHandler diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 73b18f22a..eb954ba1b 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -1552,7 +1552,7 @@ describe "Editor", -> editor.setText " a line with tabs\tand spaces " editor.attachToDom() - expect(config.editor.showInvisibles).toBeFalsy() + expect(config.get("editor.showInvisibles")).toBeFalsy() expect(editor.renderedLines.find('.line').text()).toBe " a line with tabs and spaces " config.set("editor.showInvisibles", true) @@ -1574,8 +1574,8 @@ describe "Editor", -> rightEditor.setText(" \t ") leftEditor = rightEditor.splitLeft() - config.editor.showInvisibles = true - config.editor.invisibles = + config.set "editor.showInvisibles", true + config.set "editor.invisibles", eol: ";" space: "_" tab: "tab" @@ -1939,7 +1939,7 @@ describe "Editor", -> describe "when autosave is enabled", -> it "autosaves the current buffer when the editor loses focus or switches edit sessions", -> - config.set("editor.autosave", true) + config.set "editor.autosave", true rootView.attachToDom() editor2 = editor.splitRight() spyOn(editor2.activeEditSession, 'save') diff --git a/spec/app/project-spec.coffee b/spec/app/project-spec.coffee index 15f2fa1c1..40d8bf115 100644 --- a/spec/app/project-spec.coffee +++ b/spec/app/project-spec.coffee @@ -131,7 +131,7 @@ describe "Project", -> describe "when config.core.hideGitIgnoredFiles is true", -> it "ignores files that are present in .gitignore if the project is a git repo", -> - config.core.hideGitIgnoredFiles = true + config.set "core.hideGitIgnoredFiles", true project.setPath(require.resolve('fixtures/git/working-dir')) paths = null waitsForPromise -> @@ -153,7 +153,7 @@ describe "Project", -> it "ignores ignored.txt file", -> paths = null config.get("core.ignoredNames").push("ignored.txt") - config.set("core.ignoredNames", config.get("core.ignoredNames")) + config.update() waitsForPromise -> project.getFilePaths().done (foundPaths) -> paths = foundPaths diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index ea1d0d8c9..853ee226b 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -26,7 +26,7 @@ beforeEach -> spyOn(config, 'load') spyOn(config, 'save') config.assignDefaults() - config.editor.fontSize = 16 + config.set "editor.fontSize", 16 # make editor display updates synchronous spyOn(Editor.prototype, 'requestDisplayUpdate').andCallFake -> @updateDisplay() diff --git a/src/app/config.coffee b/src/app/config.coffee index 97ca52418..7d25f8ba9 100644 --- a/src/app/config.coffee +++ b/src/app/config.coffee @@ -13,8 +13,10 @@ require.paths.unshift userExtensionsDirPath module.exports = class Config configDirPath: configDirPath + settings: null load: -> + @settings = {} @loadUserConfig() @assignDefaults() @registerNewExtensions() @@ -24,13 +26,12 @@ class Config loadUserConfig: -> if fs.exists(configJsonPath) userConfig = JSON.parse(fs.read(configJsonPath)) - _.extend(this, userConfig) + _.extend(@settings, userConfig) assignDefaults: -> - @core ?= {} - _.defaults(@core, require('root-view').configDefaults) - @editor ?= {} - _.defaults(@editor, require('editor').configDefaults) + @settings ?= {} + @setDefaults "core", require('root-view').configDefaults + @setDefaults "editor", require('editor').configDefaults registerNewExtensions: -> shouldUpdate = false @@ -51,33 +52,45 @@ class Config _.unique(availableExtensions) requireExtensions: -> - for extensionName in config.core.extensions + for extensionName in config.get "core.extensions" requireExtension(extensionName) unless extensionName[0] == '!' get: (keyPath) -> - keyPath = keyPath.split(".") if typeof keyPath is 'string' - value = this - for key in keyPath + keys = @keysForKeyPath(keyPath) + value = @settings + for key in keys break unless value = value[key] value set: (keyPath, value) -> - if typeof keyPath is 'string' - keyPath = keyPath.split(".") - else - keyPath = new Array(keyPath...) - - hash = this - while keyPath.length > 1 - key = keyPath.shift() + keys = @keysForKeyPath(keyPath) + hash = @settings + while keys.length > 1 + key = keys.shift() hash[key] ?= {} hash = hash[key] - hash[keyPath.shift()] = value + hash[keys.shift()] = value @update() value + setDefaults: (keyPath, defaults) -> + keys = @keysForKeyPath(keyPath) + hash = @settings + for key in keys + hash[key] ?= {} + hash = hash[key] + + _.defaults hash, defaults + @update() + + keysForKeyPath: (keyPath) -> + if typeof keyPath is 'string' + keyPath.split(".") + else + new Array(keyPath...) + observe: (keyPath, callback) -> value = @get(keyPath) previousValue = _.clone(value) @@ -97,11 +110,7 @@ class Config @trigger 'update' save: -> - keysToWrite = _.clone(this) - delete keysToWrite.eventHandlersByEventName - delete keysToWrite.eventHandlersByNamespace - delete keysToWrite.configDirPath - fs.write(configJsonPath, JSON.stringify(keysToWrite, undefined, 2) + "\n") + fs.write(configJsonPath, JSON.stringify(@settings, undefined, 2) + "\n") requireUserInitScript: -> try diff --git a/src/app/editor.coffee b/src/app/editor.coffee index a0d524f17..95c612d20 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -324,7 +324,7 @@ class Editor extends View @hiddenInput.on 'focusout', => @isFocused = false @removeClass 'focused' - @autosave() if config.editor.autosave + @autosave() if config.get "editor.autosave" @overlayer.on 'mousedown', (e) => @overlayer.hide() @@ -450,7 +450,7 @@ class Editor extends View throw new Error("Edit session not found") unless @editSessions[index] if @activeEditSession - @autosave() if config.editor.autosave + @autosave() if config.get "editor.autosave" @saveScrollPositionForActiveEditSession() @activeEditSession.off(".editor") diff --git a/src/app/project.coffee b/src/app/project.coffee index b24d98daf..094e88b5d 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -61,7 +61,7 @@ class Project @ignoreRepositoryPath(path) ignoreRepositoryPath: (path) -> - config.core.hideGitIgnoredFiles and @repo.isPathIgnored(fs.join(@getPath(), path)) + config.get("core.hideGitIgnoredFiles") and @repo.isPathIgnored(fs.join(@getPath(), path)) resolve: (filePath) -> filePath = fs.join(@getPath(), filePath) unless filePath[0] == '/' diff --git a/src/app/root-view.coffee b/src/app/root-view.coffee index cbd61c731..429bf6b45 100644 --- a/src/app/root-view.coffee +++ b/src/app/root-view.coffee @@ -42,7 +42,7 @@ class RootView extends View config.load() - TextMateTheme.activate(config.core.theme ? 'IR_Black') + TextMateTheme.activate(config.get("core.theme") ? 'IR_Black') @handleEvents() @@ -79,18 +79,17 @@ class RootView extends View @setTitle("untitled") @command 'window:increase-font-size', => - config.editor.fontSize += 1 - config.update() + config.set("editor.fontSize", config.get("editor.fontSize") + 1) @command 'window:decrease-font-size', => - if config.editor.fontSize > 1 - config.editor.fontSize -= 1 - config.update() + fontSize = config.get "editor.fontSize" + config.set("editor.fontSize", fontSize - 1) if fontSize > 1 + @command 'window:focus-next-pane', => @focusNextPane() @command 'window:save-all', => @saveAll() @command 'window:toggle-invisibles', => - config.set("editor.showInvisibles", not config.editor.showInvisibles) + config.set("editor.showInvisibles", !config.get("editor.showInvisibles")) @command 'window:toggle-ignored-files', => config.set("core.hideGitIgnoredFiles", not config.core.hideGitIgnoredFiles) diff --git a/src/extensions/tree-view/spec/tree-view-spec.coffee b/src/extensions/tree-view/spec/tree-view-spec.coffee index 2669fb126..3826508f4 100644 --- a/src/extensions/tree-view/spec/tree-view-spec.coffee +++ b/src/extensions/tree-view/spec/tree-view-spec.coffee @@ -857,7 +857,7 @@ describe "TreeView", -> beforeEach -> ignoreFile = fs.join(require.resolve('fixtures/tree-view'), '.gitignore') fs.write(ignoreFile, 'tree-view.js') - config.core.hideGitIgnoredFiles = false + config.set "core.hideGitIgnoredFiles", false afterEach -> fs.remove(ignoreFile) if fs.exists(ignoreFile) diff --git a/src/extensions/tree-view/src/directory-view.coffee b/src/extensions/tree-view/src/directory-view.coffee index 65618b559..a039232b6 100644 --- a/src/extensions/tree-view/src/directory-view.coffee +++ b/src/extensions/tree-view/src/directory-view.coffee @@ -27,7 +27,7 @@ class DirectoryView extends View @directory.path isPathIgnored: (path) -> - config.core.hideGitIgnoredFiles and @project.repo?.isPathIgnored(path) + config.get("core.hideGitIgnoredFiles") and @project.repo?.isPathIgnored(path) buildEntries: -> @unwatchDescendantEntries()