From bd88a0de1552cbed3019e9a98dc4edd4dbc9c37f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 4 Feb 2013 12:38:00 -0800 Subject: [PATCH] Support CSON config file Use ~/.atom/config.cson as the new default when no config file exists. ~/.atom/config.json is still the default if they both exist. --- spec/app/config-spec.coffee | 37 ++++++++++++++++++++++++++++--------- src/app/config.coffee | 9 +++++---- src/stdlib/fs.coffee | 8 ++++++++ 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/spec/app/config-spec.coffee b/spec/app/config-spec.coffee index 7edf47dcf..661ef3c78 100644 --- a/spec/app/config-spec.coffee +++ b/spec/app/config-spec.coffee @@ -22,17 +22,36 @@ describe "Config", -> spyOn(fs, 'write') jasmine.unspy config, 'save' - it "writes any non-default properties to the config.json in the user's .atom directory", -> - config.set("a.b.c", 1) - config.set("a.b.d", 2) - config.set("x.y.z", 3) - config.setDefaults("a.b", e: 4, f: 5) + describe "when ~/.atom/config.json exists", -> + it "writes any non-default properties to ~/.atom/config.json", -> + config.configFilePath = fs.join(config.configDirPath, "config.json") + config.set("a.b.c", 1) + config.set("a.b.d", 2) + config.set("x.y.z", 3) + config.setDefaults("a.b", e: 4, f: 5) - fs.write.reset() - config.save() + fs.write.reset() + config.save() - writtenConfig = JSON.parse(fs.write.argsForCall[0][1]) - expect(writtenConfig).toEqual config.settings + expect(fs.write.argsForCall[0][0]).toBe(fs.join(config.configDirPath, "config.json")) + writtenConfig = JSON.parse(fs.write.argsForCall[0][1]) + expect(writtenConfig).toEqual config.settings + + describe "when ~/.atom/config.json doesn't exist", -> + it "writes any non-default properties to ~/.atom/config.cson", -> + config.configFilePath = fs.join(config.configDirPath, "config.cson") + config.set("a.b.c", 1) + config.set("a.b.d", 2) + config.set("x.y.z", 3) + config.setDefaults("a.b", e: 4, f: 5) + + fs.write.reset() + config.save() + + expect(fs.write.argsForCall[0][0]).toBe(fs.join(config.configDirPath, "config.cson")) + {CoffeeScript} = require 'coffee-script' + writtenConfig = CoffeeScript.eval(fs.write.argsForCall[0][1], bare: true) + expect(writtenConfig).toEqual config.settings describe ".setDefaults(keyPath, defaults)", -> it "assigns any previously-unassigned keys to the object at the key path", -> diff --git a/src/app/config.coffee b/src/app/config.coffee index 26efbd674..af002a134 100644 --- a/src/app/config.coffee +++ b/src/app/config.coffee @@ -3,7 +3,6 @@ _ = require 'underscore' EventEmitter = require 'event-emitter' configDirPath = fs.absolute("~/.atom") -configJsonPath = fs.join(configDirPath, "config.json") userInitScriptPath = fs.join(configDirPath, "user.coffee") bundledPackagesDirPath = fs.join(resourcePath, "src/packages") bundledThemesDirPath = fs.join(resourcePath, "themes") @@ -27,6 +26,8 @@ class Config core: _.clone(require('root-view').configDefaults) editor: _.clone(require('editor').configDefaults) @settings = {} + @configFilePath = fs.resolveExtension(fs.join(configDirPath, 'config'), ['json', 'cson']) + @configFilePath ?= fs.join(configDirPath, 'config.cson') load: -> @loadUserConfig() @@ -35,8 +36,8 @@ class Config atom.loadPackages() loadUserConfig: -> - if fs.exists(configJsonPath) - userConfig = JSON.parse(fs.read(configJsonPath)) + if fs.exists(@configFilePath) + userConfig = fs.readObject(@configFilePath) _.extend(@settings, userConfig) get: (keyPath) -> @@ -77,7 +78,7 @@ class Config @trigger 'updated' save: -> - fs.write(configJsonPath, JSON.stringify(@settings, undefined, 2) + "\n") + fs.writeObject(@configFilePath, @settings) requireUserInitScript: -> try diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index d553d6361..9225913ec 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -188,6 +188,14 @@ module.exports = else JSON.parse(contents) + writeObject: (path, object) -> + if @extension(path) is '.cson' + CSON = require 'cson' + content = CSON.stringify(object) + else + content = JSON.stringify(object, undefined, 2) + @write(path, "#{content}\n") + readPlist: (path) -> plist = require 'plist' object = null