2015-06-16 09:29:59 +08:00
|
|
|
|
path = require 'path'
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
{$, $$} = require '../src/space-pen-extensions'
|
|
|
|
|
Package = require '../src/package'
|
|
|
|
|
{Disposable} = require 'atom'
|
|
|
|
|
|
|
|
|
|
describe "PackageManager", ->
|
|
|
|
|
workspaceElement = null
|
|
|
|
|
|
|
|
|
|
beforeEach ->
|
2015-06-03 10:51:00 +08:00
|
|
|
|
workspaceElement = document.createElement('atom-workspace')
|
|
|
|
|
jasmine.attachToDOM(workspaceElement)
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
|
|
|
|
|
describe "::loadPackage(name)", ->
|
|
|
|
|
beforeEach ->
|
|
|
|
|
atom.config.set("core.disabledPackages", [])
|
|
|
|
|
|
|
|
|
|
it "returns the package", ->
|
|
|
|
|
pack = atom.packages.loadPackage("package-with-index")
|
|
|
|
|
expect(pack instanceof Package).toBe true
|
|
|
|
|
expect(pack.metadata.name).toBe "package-with-index"
|
|
|
|
|
|
|
|
|
|
it "returns the package if it has an invalid keymap", ->
|
|
|
|
|
spyOn(console, 'warn')
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, 'error')
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
pack = atom.packages.loadPackage("package-with-broken-keymap")
|
|
|
|
|
expect(pack instanceof Package).toBe true
|
|
|
|
|
expect(pack.metadata.name).toBe "package-with-broken-keymap"
|
|
|
|
|
|
|
|
|
|
it "returns the package if it has an invalid stylesheet", ->
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, 'warn')
|
|
|
|
|
spyOn(console, 'error')
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
pack = atom.packages.loadPackage("package-with-invalid-styles")
|
|
|
|
|
expect(pack instanceof Package).toBe true
|
|
|
|
|
expect(pack.metadata.name).toBe "package-with-invalid-styles"
|
|
|
|
|
expect(pack.stylesheets.length).toBe 0
|
|
|
|
|
|
|
|
|
|
it "returns null if the package has an invalid package.json", ->
|
|
|
|
|
spyOn(console, 'warn')
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, 'error')
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
expect(atom.packages.loadPackage("package-with-broken-package-json")).toBeNull()
|
2015-06-03 10:51:00 +08:00
|
|
|
|
expect(console.warn.callCount).toBe(2)
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
expect(console.warn.argsForCall[0][0]).toContain("Failed to load package.json")
|
|
|
|
|
|
|
|
|
|
it "returns null if the package is not found in any package directory", ->
|
|
|
|
|
spyOn(console, 'warn')
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, 'error')
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
expect(atom.packages.loadPackage("this-package-cannot-be-found")).toBeNull()
|
|
|
|
|
expect(console.warn.callCount).toBe(1)
|
|
|
|
|
expect(console.warn.argsForCall[0][0]).toContain("Could not resolve")
|
|
|
|
|
|
|
|
|
|
it "invokes ::onDidLoadPackage listeners with the loaded package", ->
|
|
|
|
|
loadedPackage = null
|
|
|
|
|
atom.packages.onDidLoadPackage (pack) -> loadedPackage = pack
|
|
|
|
|
|
|
|
|
|
atom.packages.loadPackage("package-with-main")
|
|
|
|
|
|
|
|
|
|
expect(loadedPackage.name).toBe "package-with-main"
|
|
|
|
|
|
|
|
|
|
describe "::unloadPackage(name)", ->
|
|
|
|
|
describe "when the package is active", ->
|
|
|
|
|
it "throws an error", ->
|
|
|
|
|
pack = null
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-main').then (p) -> pack = p
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.packages.isPackageLoaded(pack.name)).toBeTruthy()
|
|
|
|
|
expect(atom.packages.isPackageActive(pack.name)).toBeTruthy()
|
|
|
|
|
expect( -> atom.packages.unloadPackage(pack.name)).toThrow()
|
|
|
|
|
expect(atom.packages.isPackageLoaded(pack.name)).toBeTruthy()
|
|
|
|
|
expect(atom.packages.isPackageActive(pack.name)).toBeTruthy()
|
|
|
|
|
|
|
|
|
|
describe "when the package is not loaded", ->
|
|
|
|
|
it "throws an error", ->
|
|
|
|
|
expect(atom.packages.isPackageLoaded('unloaded')).toBeFalsy()
|
|
|
|
|
expect( -> atom.packages.unloadPackage('unloaded')).toThrow()
|
|
|
|
|
expect(atom.packages.isPackageLoaded('unloaded')).toBeFalsy()
|
|
|
|
|
|
|
|
|
|
describe "when the package is loaded", ->
|
|
|
|
|
it "no longers reports it as being loaded", ->
|
|
|
|
|
pack = atom.packages.loadPackage('package-with-main')
|
|
|
|
|
expect(atom.packages.isPackageLoaded(pack.name)).toBeTruthy()
|
|
|
|
|
atom.packages.unloadPackage(pack.name)
|
|
|
|
|
expect(atom.packages.isPackageLoaded(pack.name)).toBeFalsy()
|
|
|
|
|
|
|
|
|
|
it "invokes ::onDidUnloadPackage listeners with the unloaded package", ->
|
|
|
|
|
atom.packages.loadPackage('package-with-main')
|
|
|
|
|
unloadedPackage = null
|
|
|
|
|
atom.packages.onDidUnloadPackage (pack) -> unloadedPackage = pack
|
|
|
|
|
atom.packages.unloadPackage('package-with-main')
|
|
|
|
|
expect(unloadedPackage.name).toBe 'package-with-main'
|
|
|
|
|
|
|
|
|
|
describe "::activatePackage(id)", ->
|
|
|
|
|
describe "when called multiple times", ->
|
|
|
|
|
it "it only calls activate on the package once", ->
|
|
|
|
|
spyOn(Package.prototype, 'activateNow').andCallThrough()
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-index')
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-index')
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-index')
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(Package.prototype.activateNow.callCount).toBe 1
|
|
|
|
|
|
|
|
|
|
describe "when the package has a main module", ->
|
|
|
|
|
describe "when the metadata specifies a main module path˜", ->
|
|
|
|
|
it "requires the module at the specified path", ->
|
|
|
|
|
mainModule = require('./fixtures/packages/package-with-main/main-module')
|
|
|
|
|
spyOn(mainModule, 'activate')
|
|
|
|
|
pack = null
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-main').then (p) -> pack = p
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(mainModule.activate).toHaveBeenCalled()
|
|
|
|
|
expect(pack.mainModule).toBe mainModule
|
|
|
|
|
|
|
|
|
|
describe "when the metadata does not specify a main module", ->
|
|
|
|
|
it "requires index.coffee", ->
|
|
|
|
|
indexModule = require('./fixtures/packages/package-with-index/index')
|
|
|
|
|
spyOn(indexModule, 'activate')
|
|
|
|
|
pack = null
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-index').then (p) -> pack = p
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(indexModule.activate).toHaveBeenCalled()
|
|
|
|
|
expect(pack.mainModule).toBe indexModule
|
|
|
|
|
|
|
|
|
|
it "assigns config schema, including defaults when package contains a schema", ->
|
|
|
|
|
expect(atom.config.get('package-with-config-schema.numbers.one')).toBeUndefined()
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-config-schema')
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.config.get('package-with-config-schema.numbers.one')).toBe 1
|
|
|
|
|
expect(atom.config.get('package-with-config-schema.numbers.two')).toBe 2
|
|
|
|
|
|
|
|
|
|
expect(atom.config.set('package-with-config-schema.numbers.one', 'nope')).toBe false
|
|
|
|
|
expect(atom.config.set('package-with-config-schema.numbers.one', '10')).toBe true
|
|
|
|
|
expect(atom.config.get('package-with-config-schema.numbers.one')).toBe 10
|
|
|
|
|
|
|
|
|
|
describe "when a package has configDefaults", ->
|
|
|
|
|
beforeEach ->
|
|
|
|
|
jasmine.snapshotDeprecations()
|
|
|
|
|
|
|
|
|
|
afterEach ->
|
|
|
|
|
jasmine.restoreDeprecationsSnapshot()
|
|
|
|
|
|
|
|
|
|
it "still assigns configDefaults from the module though deprecated", ->
|
|
|
|
|
|
|
|
|
|
expect(atom.config.get('package-with-config-defaults.numbers.one')).toBeUndefined()
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-config-defaults')
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.config.get('package-with-config-defaults.numbers.one')).toBe 1
|
|
|
|
|
expect(atom.config.get('package-with-config-defaults.numbers.two')).toBe 2
|
|
|
|
|
|
|
|
|
|
describe "when the package has no main module", ->
|
|
|
|
|
it "does not throw an exception", ->
|
|
|
|
|
spyOn(console, "error")
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, "warn")
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
expect(-> atom.packages.activatePackage('package-without-module')).not.toThrow()
|
|
|
|
|
expect(console.error).not.toHaveBeenCalled()
|
|
|
|
|
expect(console.warn).not.toHaveBeenCalled()
|
|
|
|
|
|
|
|
|
|
it "passes the activate method the package's previously serialized state if it exists", ->
|
|
|
|
|
pack = null
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-serialization").then (p) -> pack = p
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(pack.mainModule.someNumber).not.toBe 77
|
|
|
|
|
pack.mainModule.someNumber = 77
|
|
|
|
|
atom.packages.deactivatePackage("package-with-serialization")
|
|
|
|
|
spyOn(pack.mainModule, 'activate').andCallThrough()
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-serialization")
|
|
|
|
|
runs ->
|
2015-06-03 10:51:00 +08:00
|
|
|
|
expect(pack.mainModule.activate.calls[0].args[0]).toEqual({someNumber: 77})
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
|
|
|
|
|
it "invokes ::onDidActivatePackage listeners with the activated package", ->
|
|
|
|
|
activatedPackage = null
|
|
|
|
|
atom.packages.onDidActivatePackage (pack) ->
|
|
|
|
|
activatedPackage = pack
|
|
|
|
|
|
|
|
|
|
atom.packages.activatePackage('package-with-main')
|
|
|
|
|
|
|
|
|
|
waitsFor -> activatedPackage?
|
|
|
|
|
runs -> expect(activatedPackage.name).toBe 'package-with-main'
|
|
|
|
|
|
|
|
|
|
describe "when the package throws an error while loading", ->
|
|
|
|
|
it "logs a warning instead of throwing an exception", ->
|
|
|
|
|
atom.config.set("core.disabledPackages", [])
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, "log")
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
spyOn(console, "warn")
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, "error")
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
expect(-> atom.packages.activatePackage("package-that-throws-an-exception")).not.toThrow()
|
|
|
|
|
expect(console.warn).toHaveBeenCalled()
|
|
|
|
|
|
|
|
|
|
describe "when the package is not found", ->
|
|
|
|
|
it "rejects the promise", ->
|
|
|
|
|
atom.config.set("core.disabledPackages", [])
|
|
|
|
|
|
|
|
|
|
onSuccess = jasmine.createSpy('onSuccess')
|
|
|
|
|
onFailure = jasmine.createSpy('onFailure')
|
|
|
|
|
spyOn(console, 'warn')
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, "error")
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
|
|
|
|
|
atom.packages.activatePackage("this-doesnt-exist").then(onSuccess, onFailure)
|
|
|
|
|
|
|
|
|
|
waitsFor "promise to be rejected", ->
|
|
|
|
|
onFailure.callCount > 0
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(console.warn.callCount).toBe 1
|
|
|
|
|
expect(onFailure.mostRecentCall.args[0] instanceof Error).toBe true
|
|
|
|
|
expect(onFailure.mostRecentCall.args[0].message).toContain "Failed to load package 'this-doesnt-exist'"
|
|
|
|
|
|
|
|
|
|
describe "keymap loading", ->
|
|
|
|
|
describe "when the metadata does not contain a 'keymaps' manifest", ->
|
|
|
|
|
it "loads all the .cson/.json files in the keymaps directory", ->
|
|
|
|
|
element1 = $$ -> @div class: 'test-1'
|
|
|
|
|
element2 = $$ -> @div class: 'test-2'
|
|
|
|
|
element3 = $$ -> @div class: 'test-3'
|
|
|
|
|
|
|
|
|
|
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-z', target:element1[0])).toHaveLength 0
|
|
|
|
|
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-z', target:element2[0])).toHaveLength 0
|
|
|
|
|
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-z', target:element3[0])).toHaveLength 0
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-keymaps")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-z', target:element1[0])[0].command).toBe "test-1"
|
|
|
|
|
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-z', target:element2[0])[0].command).toBe "test-2"
|
|
|
|
|
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-z', target:element3[0])).toHaveLength 0
|
|
|
|
|
|
|
|
|
|
describe "when the metadata contains a 'keymaps' manifest", ->
|
|
|
|
|
it "loads only the keymaps specified by the manifest, in the specified order", ->
|
|
|
|
|
element1 = $$ -> @div class: 'test-1'
|
|
|
|
|
element3 = $$ -> @div class: 'test-3'
|
|
|
|
|
|
|
|
|
|
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-z', target:element1[0])).toHaveLength 0
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-keymaps-manifest")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-z', target:element1[0])[0].command).toBe 'keymap-1'
|
|
|
|
|
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.menu.template = []
|
|
|
|
|
|
|
|
|
|
describe "when the metadata does not contain a 'menus' manifest", ->
|
|
|
|
|
it "loads all the .cson/.json files in the menus directory", ->
|
|
|
|
|
element = ($$ -> @div class: 'test-1')[0]
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-menus")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.menu.template.length).toBe 2
|
|
|
|
|
expect(atom.menu.template[0].label).toBe "Second to Last"
|
|
|
|
|
expect(atom.menu.template[1].label).toBe "Last"
|
|
|
|
|
|
|
|
|
|
describe "when the metadata contains a 'menus' manifest", ->
|
|
|
|
|
it "loads only the menus specified by the manifest, in the specified order", ->
|
|
|
|
|
element = ($$ -> @div class: 'test-1')[0]
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-menus-manifest")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.menu.template[0].label).toBe "Second to Last"
|
|
|
|
|
expect(atom.menu.template[1].label).toBe "Last"
|
|
|
|
|
|
|
|
|
|
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 style sheets from the styles directory as specified by the manifest", ->
|
|
|
|
|
one = require.resolve("./fixtures/packages/package-with-style-sheets-manifest/styles/1.css")
|
|
|
|
|
two = require.resolve("./fixtures/packages/package-with-style-sheets-manifest/styles/2.less")
|
|
|
|
|
three = require.resolve("./fixtures/packages/package-with-style-sheets-manifest/styles/3.css")
|
|
|
|
|
|
|
|
|
|
one = atom.themes.stringToId(one)
|
|
|
|
|
two = atom.themes.stringToId(two)
|
|
|
|
|
three = atom.themes.stringToId(three)
|
|
|
|
|
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(one)).toBeNull()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(two)).toBeNull()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(three)).toBeNull()
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-style-sheets-manifest")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(one)).not.toBeNull()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(two)).not.toBeNull()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(three)).toBeNull()
|
|
|
|
|
expect($('#jasmine-content').css('font-size')).toBe '1px'
|
|
|
|
|
|
|
|
|
|
describe "when the metadata does not contain a 'styleSheets' manifest", ->
|
|
|
|
|
it "loads all style sheets from the styles directory", ->
|
|
|
|
|
one = require.resolve("./fixtures/packages/package-with-styles/styles/1.css")
|
|
|
|
|
two = require.resolve("./fixtures/packages/package-with-styles/styles/2.less")
|
|
|
|
|
three = require.resolve("./fixtures/packages/package-with-styles/styles/3.test-context.css")
|
|
|
|
|
four = require.resolve("./fixtures/packages/package-with-styles/styles/4.css")
|
|
|
|
|
|
|
|
|
|
one = atom.themes.stringToId(one)
|
|
|
|
|
two = atom.themes.stringToId(two)
|
|
|
|
|
three = atom.themes.stringToId(three)
|
|
|
|
|
four = atom.themes.stringToId(four)
|
|
|
|
|
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(one)).toBeNull()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(two)).toBeNull()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(three)).toBeNull()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(four)).toBeNull()
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-styles")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(one)).not.toBeNull()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(two)).not.toBeNull()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(three)).not.toBeNull()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(four)).not.toBeNull()
|
|
|
|
|
expect($('#jasmine-content').css('font-size')).toBe '3px'
|
|
|
|
|
|
|
|
|
|
it "assigns the stylesheet's context based on the filename", ->
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-styles")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
count = 0
|
|
|
|
|
|
|
|
|
|
for styleElement in atom.styles.getStyleElements()
|
|
|
|
|
if styleElement.sourcePath.match /1.css/
|
|
|
|
|
expect(styleElement.context).toBe undefined
|
|
|
|
|
count++
|
|
|
|
|
|
|
|
|
|
if styleElement.sourcePath.match /2.less/
|
|
|
|
|
expect(styleElement.context).toBe undefined
|
|
|
|
|
count++
|
|
|
|
|
|
|
|
|
|
if styleElement.sourcePath.match /3.test-context.css/
|
|
|
|
|
expect(styleElement.context).toBe 'test-context'
|
|
|
|
|
count++
|
|
|
|
|
|
|
|
|
|
if styleElement.sourcePath.match /4.css/
|
|
|
|
|
expect(styleElement.context).toBe undefined
|
|
|
|
|
count++
|
|
|
|
|
|
|
|
|
|
expect(count).toBe 4
|
|
|
|
|
|
|
|
|
|
describe "scoped-property loading", ->
|
|
|
|
|
it "loads the scoped properties", ->
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-settings")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.config.get 'editor.increaseIndentPattern', scope: ['.source.omg']).toBe '^a'
|
|
|
|
|
|
|
|
|
|
describe "service registration", ->
|
|
|
|
|
it "registers the package's provided and consumed services", ->
|
|
|
|
|
consumerModule = require "./fixtures/packages/package-with-consumed-services"
|
|
|
|
|
firstServiceV3Disposed = false
|
|
|
|
|
firstServiceV4Disposed = false
|
|
|
|
|
secondServiceDisposed = false
|
|
|
|
|
spyOn(consumerModule, 'consumeFirstServiceV3').andReturn(new Disposable -> firstServiceV3Disposed = true)
|
|
|
|
|
spyOn(consumerModule, 'consumeFirstServiceV4').andReturn(new Disposable -> firstServiceV4Disposed = true)
|
|
|
|
|
spyOn(consumerModule, 'consumeSecondService').andReturn(new Disposable -> secondServiceDisposed = true)
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-consumed-services")
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-provided-services")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(consumerModule.consumeFirstServiceV3).toHaveBeenCalledWith('first-service-v3')
|
|
|
|
|
expect(consumerModule.consumeFirstServiceV4).toHaveBeenCalledWith('first-service-v4')
|
|
|
|
|
expect(consumerModule.consumeSecondService).toHaveBeenCalledWith('second-service')
|
|
|
|
|
|
|
|
|
|
consumerModule.consumeFirstServiceV3.reset()
|
|
|
|
|
consumerModule.consumeFirstServiceV4.reset()
|
|
|
|
|
consumerModule.consumeSecondService.reset()
|
|
|
|
|
|
|
|
|
|
atom.packages.deactivatePackage("package-with-provided-services")
|
|
|
|
|
|
|
|
|
|
expect(firstServiceV3Disposed).toBe true
|
|
|
|
|
expect(firstServiceV4Disposed).toBe true
|
|
|
|
|
expect(secondServiceDisposed).toBe true
|
|
|
|
|
|
|
|
|
|
atom.packages.deactivatePackage("package-with-consumed-services")
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-provided-services")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(consumerModule.consumeFirstServiceV3).not.toHaveBeenCalled()
|
|
|
|
|
expect(consumerModule.consumeFirstServiceV4).not.toHaveBeenCalled()
|
|
|
|
|
expect(consumerModule.consumeSecondService).not.toHaveBeenCalled()
|
|
|
|
|
|
|
|
|
|
describe "::deactivatePackage(id)", ->
|
|
|
|
|
afterEach ->
|
|
|
|
|
atom.packages.unloadPackages()
|
|
|
|
|
|
|
|
|
|
it "calls `deactivate` on the package's main module if activate was successful", ->
|
|
|
|
|
pack = null
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-deactivate").then (p) -> pack = p
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.packages.isPackageActive("package-with-deactivate")).toBeTruthy()
|
|
|
|
|
spyOn(pack.mainModule, 'deactivate').andCallThrough()
|
|
|
|
|
|
|
|
|
|
atom.packages.deactivatePackage("package-with-deactivate")
|
|
|
|
|
expect(pack.mainModule.deactivate).toHaveBeenCalled()
|
|
|
|
|
expect(atom.packages.isPackageActive("package-with-module")).toBeFalsy()
|
|
|
|
|
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, 'log')
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
spyOn(console, 'warn')
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, "error")
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
|
|
|
|
|
badPack = null
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-that-throws-on-activate").then (p) -> badPack = p
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.packages.isPackageActive("package-that-throws-on-activate")).toBeTruthy()
|
|
|
|
|
spyOn(badPack.mainModule, 'deactivate').andCallThrough()
|
|
|
|
|
|
|
|
|
|
atom.packages.deactivatePackage("package-that-throws-on-activate")
|
|
|
|
|
expect(badPack.mainModule.deactivate).not.toHaveBeenCalled()
|
|
|
|
|
expect(atom.packages.isPackageActive("package-that-throws-on-activate")).toBeFalsy()
|
|
|
|
|
|
|
|
|
|
it "does not serialize packages that have not been activated called on their main module", ->
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, 'log')
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
spyOn(console, 'warn')
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, "error")
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
badPack = null
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-that-throws-on-activate").then (p) -> badPack = p
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
spyOn(badPack.mainModule, 'serialize').andCallThrough()
|
|
|
|
|
|
|
|
|
|
atom.packages.deactivatePackage("package-that-throws-on-activate")
|
|
|
|
|
expect(badPack.mainModule.serialize).not.toHaveBeenCalled()
|
|
|
|
|
|
|
|
|
|
it "absorbs exceptions that are thrown by the package module's serialize method", ->
|
|
|
|
|
spyOn(console, 'error')
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-serialize-error')
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-serialization')
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
atom.packages.deactivatePackages()
|
|
|
|
|
expect(atom.packages.packageStates['package-with-serialize-error']).toBeUndefined()
|
|
|
|
|
expect(atom.packages.packageStates['package-with-serialization']).toEqual someNumber: 1
|
|
|
|
|
expect(console.error).toHaveBeenCalled()
|
|
|
|
|
|
|
|
|
|
it "absorbs exceptions that are thrown by the package module's deactivate method", ->
|
|
|
|
|
spyOn(console, 'error')
|
|
|
|
|
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-that-throws-on-deactivate")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(-> atom.packages.deactivatePackage("package-that-throws-on-deactivate")).not.toThrow()
|
|
|
|
|
expect(console.error).toHaveBeenCalled()
|
|
|
|
|
|
|
|
|
|
it "removes the package's keymaps", ->
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-keymaps')
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
atom.packages.deactivatePackage('package-with-keymaps')
|
|
|
|
|
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-z', target: ($$ -> @div class: 'test-1')[0])).toHaveLength 0
|
|
|
|
|
expect(atom.keymaps.findKeyBindings(keystrokes:'ctrl-z', target: ($$ -> @div class: 'test-2')[0])).toHaveLength 0
|
|
|
|
|
|
|
|
|
|
it "removes the package's stylesheets", ->
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage('package-with-styles')
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
atom.packages.deactivatePackage('package-with-styles')
|
|
|
|
|
one = require.resolve("./fixtures/packages/package-with-style-sheets-manifest/styles/1.css")
|
|
|
|
|
two = require.resolve("./fixtures/packages/package-with-style-sheets-manifest/styles/2.less")
|
|
|
|
|
three = require.resolve("./fixtures/packages/package-with-style-sheets-manifest/styles/3.css")
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(one)).not.toExist()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(two)).not.toExist()
|
|
|
|
|
expect(atom.themes.stylesheetElementForId(three)).not.toExist()
|
|
|
|
|
|
|
|
|
|
it "removes the package's scoped-properties", ->
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-settings")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.config.get 'editor.increaseIndentPattern', scope: ['.source.omg']).toBe '^a'
|
|
|
|
|
atom.packages.deactivatePackage("package-with-settings")
|
|
|
|
|
expect(atom.config.get 'editor.increaseIndentPattern', scope: ['.source.omg']).toBeUndefined()
|
|
|
|
|
|
|
|
|
|
it "invokes ::onDidDeactivatePackage listeners with the deactivated package", ->
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage("package-with-main")
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
deactivatedPackage = null
|
|
|
|
|
atom.packages.onDidDeactivatePackage (pack) -> deactivatedPackage = pack
|
|
|
|
|
atom.packages.deactivatePackage("package-with-main")
|
|
|
|
|
expect(deactivatedPackage.name).toBe "package-with-main"
|
|
|
|
|
|
|
|
|
|
describe "::activate()", ->
|
|
|
|
|
beforeEach ->
|
|
|
|
|
jasmine.snapshotDeprecations()
|
|
|
|
|
spyOn(console, 'warn')
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, "error")
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
atom.packages.loadPackages()
|
|
|
|
|
|
|
|
|
|
loadedPackages = atom.packages.getLoadedPackages()
|
|
|
|
|
expect(loadedPackages.length).toBeGreaterThan 0
|
|
|
|
|
|
|
|
|
|
afterEach ->
|
|
|
|
|
atom.packages.deactivatePackages()
|
|
|
|
|
atom.packages.unloadPackages()
|
|
|
|
|
jasmine.restoreDeprecationsSnapshot()
|
|
|
|
|
|
|
|
|
|
it "activates all the packages, and none of the themes", ->
|
|
|
|
|
packageActivator = spyOn(atom.packages, 'activatePackages')
|
|
|
|
|
themeActivator = spyOn(atom.themes, 'activatePackages')
|
|
|
|
|
|
|
|
|
|
atom.packages.activate()
|
|
|
|
|
|
|
|
|
|
expect(packageActivator).toHaveBeenCalled()
|
|
|
|
|
expect(themeActivator).toHaveBeenCalled()
|
|
|
|
|
|
|
|
|
|
packages = packageActivator.mostRecentCall.args[0]
|
|
|
|
|
expect(['atom', 'textmate']).toContain(pack.getType()) for pack in packages
|
|
|
|
|
|
|
|
|
|
themes = themeActivator.mostRecentCall.args[0]
|
|
|
|
|
expect(['theme']).toContain(theme.getType()) for theme in themes
|
|
|
|
|
|
|
|
|
|
it "calls callbacks registered with ::onDidActivateInitialPackages", ->
|
|
|
|
|
package1 = atom.packages.loadPackage('package-with-main')
|
|
|
|
|
package2 = atom.packages.loadPackage('package-with-index')
|
|
|
|
|
package3 = atom.packages.loadPackage('package-with-activation-commands')
|
|
|
|
|
spyOn(atom.packages, 'getLoadedPackages').andReturn([package1, package2])
|
|
|
|
|
|
|
|
|
|
activateSpy = jasmine.createSpy('activateSpy')
|
|
|
|
|
atom.packages.onDidActivateInitialPackages(activateSpy)
|
|
|
|
|
|
|
|
|
|
atom.packages.activate()
|
|
|
|
|
waitsFor -> activateSpy.callCount > 0
|
|
|
|
|
runs ->
|
|
|
|
|
jasmine.unspy(atom.packages, 'getLoadedPackages')
|
|
|
|
|
expect(package1 in atom.packages.getActivePackages()).toBe true
|
|
|
|
|
expect(package2 in atom.packages.getActivePackages()).toBe true
|
|
|
|
|
expect(package3 in atom.packages.getActivePackages()).toBe false
|
|
|
|
|
|
|
|
|
|
describe "::enablePackage(id) and ::disablePackage(id)", ->
|
|
|
|
|
describe "with packages", ->
|
|
|
|
|
it "enables a disabled package", ->
|
|
|
|
|
packageName = 'package-with-main'
|
|
|
|
|
atom.config.pushAtKeyPath('core.disabledPackages', packageName)
|
|
|
|
|
atom.packages.observeDisabledPackages()
|
|
|
|
|
expect(atom.config.get('core.disabledPackages')).toContain packageName
|
|
|
|
|
|
|
|
|
|
pack = atom.packages.enablePackage(packageName)
|
|
|
|
|
loadedPackages = atom.packages.getLoadedPackages()
|
|
|
|
|
activatedPackages = null
|
|
|
|
|
waitsFor ->
|
|
|
|
|
activatedPackages = atom.packages.getActivePackages()
|
|
|
|
|
activatedPackages.length > 0
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(loadedPackages).toContain(pack)
|
|
|
|
|
expect(activatedPackages).toContain(pack)
|
|
|
|
|
expect(atom.config.get('core.disabledPackages')).not.toContain packageName
|
|
|
|
|
|
|
|
|
|
it "disables an enabled package", ->
|
|
|
|
|
packageName = 'package-with-main'
|
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.packages.activatePackage(packageName)
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
atom.packages.observeDisabledPackages()
|
|
|
|
|
expect(atom.config.get('core.disabledPackages')).not.toContain packageName
|
|
|
|
|
|
|
|
|
|
pack = atom.packages.disablePackage(packageName)
|
|
|
|
|
|
|
|
|
|
activatedPackages = atom.packages.getActivePackages()
|
|
|
|
|
expect(activatedPackages).not.toContain(pack)
|
|
|
|
|
expect(atom.config.get('core.disabledPackages')).toContain packageName
|
|
|
|
|
|
|
|
|
|
it "returns null if the package cannot be loaded", ->
|
|
|
|
|
spyOn(console, 'warn')
|
2015-06-16 09:29:59 +08:00
|
|
|
|
spyOn(console, "error")
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
expect(atom.packages.enablePackage("this-doesnt-exist")).toBeNull()
|
|
|
|
|
expect(console.warn.callCount).toBe 1
|
|
|
|
|
|
|
|
|
|
describe "with themes", ->
|
|
|
|
|
didChangeActiveThemesHandler = null
|
|
|
|
|
|
|
|
|
|
beforeEach ->
|
2015-06-16 09:29:59 +08:00
|
|
|
|
theme_dir = path.resolve(__dirname, '../internal_packages')
|
|
|
|
|
atom.packages.packageDirPaths.unshift(theme_dir)
|
fix(drafts): Various improvements and fixes to drafts, draft state management
Summary:
This diff contains a few major changes:
1. Scribe is no longer used for the text editor. It's just a plain contenteditable region. The toolbar items (bold, italic, underline) still work. Scribe was causing React inconcistency issues in the following scenario:
- View thread with draft, edit draft
- Move to another thread
- Move back to thread with draft
- Move to another thread. Notice that one or more messages from thread with draft are still there.
There may be a way to fix this, but I tried for hours and there are Github Issues open on it's repository asking for React compatibility, so it may be fixed soon. For now contenteditable is working great.
2. Action.saveDraft() is no longer debounced in the DraftStore. Instead, firing that action causes the save to happen immediately, and the DraftStoreProxy has a new "DraftChangeSet" class which is responsbile for batching saves as the user interacts with the ComposerView. There are a couple big wins here:
- In the future, we may want to be able to call Action.saveDraft() in other situations and it should behave like a normal action. We may also want to expose the DraftStoreProxy as an easy way of backing interactive draft UI.
- Previously, when you added a contact to To/CC/BCC, this happened:
<input> -> Action.saveDraft -> (delay!!) -> Database -> DraftStore -> DraftStoreProxy -> View Updates
Increasing the delay to something reasonable like 200msec meant there was 200msec of lag before you saw the new view state.
To fix this, I created a new class called DraftChangeSet which is responsible for accumulating changes as they're made and firing Action.saveDraft. "Adding" a change to the change set also causes the Draft provided by the DraftStoreProxy to change immediately (the changes are a temporary layer on top of the database object). This means no delay while changes are being applied. There's a better explanation in the source!
This diff includes a few minor fixes as well:
1. Draft.state is gone—use Message.object = draft instead
2. String model attributes should never be null
3. Pre-send checks that can cancel draft send
4. Put the entire curl history and task queue into feedback reports
5. Cache localIds for extra speed
6. Move us up to latest React
Test Plan: No new tests - once we lock down this new design I'll write tests for the DraftChangeSet
Reviewers: evan
Reviewed By: evan
Differential Revision: https://review.inboxapp.com/D1125
2015-02-04 08:24:31 +08:00
|
|
|
|
waitsForPromise ->
|
|
|
|
|
atom.themes.activateThemes()
|
|
|
|
|
|
|
|
|
|
afterEach ->
|
|
|
|
|
atom.themes.deactivateThemes()
|
|
|
|
|
|
|
|
|
|
it "enables and disables a theme", ->
|
|
|
|
|
packageName = 'theme-with-package-file'
|
|
|
|
|
|
|
|
|
|
expect(atom.config.get('core.themes')).not.toContain packageName
|
|
|
|
|
expect(atom.config.get('core.disabledPackages')).not.toContain packageName
|
|
|
|
|
|
|
|
|
|
# enabling of theme
|
|
|
|
|
pack = atom.packages.enablePackage(packageName)
|
|
|
|
|
|
|
|
|
|
waitsFor ->
|
|
|
|
|
pack in atom.packages.getActivePackages()
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.config.get('core.themes')).toContain packageName
|
|
|
|
|
expect(atom.config.get('core.disabledPackages')).not.toContain packageName
|
|
|
|
|
|
|
|
|
|
didChangeActiveThemesHandler = jasmine.createSpy('didChangeActiveThemesHandler')
|
|
|
|
|
didChangeActiveThemesHandler.reset()
|
|
|
|
|
atom.themes.onDidChangeActiveThemes didChangeActiveThemesHandler
|
|
|
|
|
|
|
|
|
|
pack = atom.packages.disablePackage(packageName)
|
|
|
|
|
|
|
|
|
|
waitsFor ->
|
|
|
|
|
didChangeActiveThemesHandler.callCount is 1
|
|
|
|
|
|
|
|
|
|
runs ->
|
|
|
|
|
expect(atom.packages.getActivePackages()).not.toContain pack
|
|
|
|
|
expect(atom.config.get('core.themes')).not.toContain packageName
|
|
|
|
|
expect(atom.config.get('core.themes')).not.toContain packageName
|
|
|
|
|
expect(atom.config.get('core.disabledPackages')).not.toContain packageName
|