mirror of
https://github.com/atom/atom.git
synced 2026-01-22 21:38:10 -05:00
Respect service{Provisions,Dependencies} in packages' metadata
This commit is contained in:
13
spec/fixtures/packages/package-with-service-dependencies/index.coffee
vendored
Normal file
13
spec/fixtures/packages/package-with-service-dependencies/index.coffee
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
module.exports =
|
||||
activate: ->
|
||||
|
||||
deactivate: ->
|
||||
|
||||
handleFirstServiceV3: (service) ->
|
||||
service('first-service-v3-used')
|
||||
|
||||
handleFirstServiceV4: (service) ->
|
||||
service('first-service-v4-used')
|
||||
|
||||
handleSecondService: (service) ->
|
||||
service('second-service-used')
|
||||
17
spec/fixtures/packages/package-with-service-dependencies/package.json
vendored
Normal file
17
spec/fixtures/packages/package-with-service-dependencies/package.json
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "package-with-service-dependencies",
|
||||
|
||||
"serviceDependencies": {
|
||||
"service-1": {
|
||||
"versions": {
|
||||
"0.3.1": "handleFirstServiceV3",
|
||||
"0.4.1": "handleFirstServiceV4"
|
||||
}
|
||||
},
|
||||
"service-2": {
|
||||
"versions": {
|
||||
"0.5.1": "handleSecondService"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
13
spec/fixtures/packages/package-with-service-provisions/index.coffee
vendored
Normal file
13
spec/fixtures/packages/package-with-service-provisions/index.coffee
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
module.exports =
|
||||
activate: ->
|
||||
|
||||
deactivate: ->
|
||||
|
||||
firstServiceV3: ->
|
||||
'first-service-v3'
|
||||
|
||||
firstServiceV4: ->
|
||||
'first-service-v4'
|
||||
|
||||
secondService: ->
|
||||
'second-service'
|
||||
19
spec/fixtures/packages/package-with-service-provisions/package.json
vendored
Normal file
19
spec/fixtures/packages/package-with-service-provisions/package.json
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "package-with-service-provisions",
|
||||
|
||||
"serviceProvisions": {
|
||||
"service-1": {
|
||||
"description": "The first service",
|
||||
"versions": {
|
||||
"0.3.1": "firstServiceV3",
|
||||
"0.4.1": "firstServiceV4"
|
||||
}
|
||||
},
|
||||
"service-2": {
|
||||
"description": "The second service",
|
||||
"versions": {
|
||||
"0.5.1": "secondService"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{$, $$} = require '../src/space-pen-extensions'
|
||||
Package = require '../src/package'
|
||||
{Disposable} = require 'atom'
|
||||
|
||||
describe "PackageManager", ->
|
||||
workspaceElement = null
|
||||
@@ -445,6 +446,82 @@ describe "PackageManager", ->
|
||||
runs ->
|
||||
expect(atom.config.get 'editor.increaseIndentPattern', scope: ['.source.omg']).toBe '^a'
|
||||
|
||||
describe "service registration", ->
|
||||
it "registers the package's service providers", ->
|
||||
service1V3 = null
|
||||
atom.services.consume "service-1", "^0.3", (service) ->
|
||||
service1V3 = service
|
||||
new Disposable -> service1V3 = 'deactivated'
|
||||
|
||||
service1V4 = null
|
||||
atom.services.consume "service-1", "^0.4", (service) ->
|
||||
service1V4 = service
|
||||
new Disposable -> service1V4 = 'deactivated'
|
||||
|
||||
service2V5 = null
|
||||
atom.services.consume "service-2", "^0.5", (service) ->
|
||||
service2V5 = service
|
||||
new Disposable -> service2V5 = 'deactivated'
|
||||
|
||||
# Incompatible
|
||||
service2V6 = null
|
||||
atom.services.consume "service-2", "^0.6", (service) ->
|
||||
service2V6 = service
|
||||
new Disposable -> service2V6 = 'deactivated'
|
||||
|
||||
waitsForPromise ->
|
||||
atom.packages.activatePackage("package-with-service-provisions")
|
||||
|
||||
runs ->
|
||||
expect(service1V3).toBe 'first-service-v3'
|
||||
expect(service1V4).toBe 'first-service-v4'
|
||||
expect(service2V5).toBe 'second-service'
|
||||
expect(service2V6).toBeNull()
|
||||
|
||||
atom.packages.deactivatePackage("package-with-service-provisions")
|
||||
|
||||
expect(service1V3).toBe 'deactivated'
|
||||
expect(service1V4).toBe 'deactivated'
|
||||
expect(service2V5).toBe 'deactivated'
|
||||
expect(service2V6).toBeNull()
|
||||
|
||||
it "registers the package's service dependencies", ->
|
||||
waitsForPromise ->
|
||||
atom.packages.activatePackage("package-with-service-dependencies")
|
||||
|
||||
runs ->
|
||||
service1V3Spy = jasmine.createSpy('service1V3')
|
||||
service1V4Spy = jasmine.createSpy('service1V4')
|
||||
service2V5Spy = jasmine.createSpy('service2V5')
|
||||
service2V6Spy = jasmine.createSpy('service2V6')
|
||||
|
||||
atom.services.provide "service-1", "0.3.1", service1V3Spy
|
||||
atom.services.provide "service-1", "0.4.1", service1V4Spy
|
||||
atom.services.provide "service-2", "0.5.1", service2V5Spy
|
||||
atom.services.provide "service-2", "0.6.1", service2V5Spy # incompatible
|
||||
|
||||
expect(service1V3Spy).toHaveBeenCalledWith('first-service-v3-used')
|
||||
expect(service1V4Spy).toHaveBeenCalledWith('first-service-v4-used')
|
||||
expect(service2V5Spy).toHaveBeenCalledWith('second-service-used')
|
||||
expect(service2V6Spy).not.toHaveBeenCalled()
|
||||
|
||||
atom.packages.deactivatePackage("package-with-service-dependencies")
|
||||
|
||||
service1V3Spy.reset()
|
||||
service1V4Spy.reset()
|
||||
service2V5Spy.reset()
|
||||
service2V6Spy.reset()
|
||||
|
||||
atom.services.provide "service-1", "0.3.1", service1V3Spy
|
||||
atom.services.provide "service-1", "0.4.1", service1V4Spy
|
||||
atom.services.provide "service-2", "0.5.1", service2V5Spy
|
||||
atom.services.provide "service-2", "0.6.1", service2V5Spy # incompatible
|
||||
|
||||
expect(service1V3Spy).not.toHaveBeenCalled()
|
||||
expect(service1V4Spy).not.toHaveBeenCalled()
|
||||
expect(service2V5Spy).not.toHaveBeenCalled()
|
||||
expect(service2V6Spy).not.toHaveBeenCalled()
|
||||
|
||||
describe "::deactivatePackage(id)", ->
|
||||
afterEach ->
|
||||
atom.packages.unloadPackages()
|
||||
|
||||
@@ -159,6 +159,7 @@ class Package
|
||||
if @requireMainModule()
|
||||
@mainModule.activate(atom.packages.getPackageState(@name) ? {})
|
||||
@mainActivated = true
|
||||
@activateServices()
|
||||
catch e
|
||||
console.warn "Failed to activate package named '#{@name}'", e.stack
|
||||
|
||||
@@ -209,6 +210,15 @@ class Package
|
||||
settings.activate() for settings in @settings
|
||||
@settingsActivated = true
|
||||
|
||||
activateServices: ->
|
||||
for name, {versions} of @metadata.serviceProvisions
|
||||
for version, methodName of versions
|
||||
@activationDisposables.add atom.services.provide(name, version, @mainModule[methodName]())
|
||||
|
||||
for name, {versions} of @metadata.serviceDependencies
|
||||
for version, methodName of versions
|
||||
@activationDisposables.add atom.services.consume(name, version, @mainModule[methodName].bind(@mainModule))
|
||||
|
||||
loadKeymaps: ->
|
||||
if @bundledPackage and packagesCache[@name]?
|
||||
@keymaps = (["#{atom.packages.resourcePath}#{path.sep}#{keymapPath}", keymapObject] for keymapPath, keymapObject of packagesCache[@name].keymaps)
|
||||
|
||||
Reference in New Issue
Block a user