Respect service{Provisions,Dependencies} in packages' metadata

This commit is contained in:
Max Brunsfeld
2015-01-27 12:09:59 -08:00
parent d9fb54ad6f
commit 027ebc78c4
6 changed files with 149 additions and 0 deletions

View 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')

View 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"
}
}
}
}

View File

@@ -0,0 +1,13 @@
module.exports =
activate: ->
deactivate: ->
firstServiceV3: ->
'first-service-v3'
firstServiceV4: ->
'first-service-v4'
secondService: ->
'second-service'

View 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"
}
}
}
}

View File

@@ -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()

View File

@@ -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)