From 027ebc78c4c990025ef212afcfb6ed5e7ff6a8cb Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 27 Jan 2015 12:09:59 -0800 Subject: [PATCH] Respect service{Provisions,Dependencies} in packages' metadata --- .../index.coffee | 13 ++++ .../package.json | 17 ++++ .../index.coffee | 13 ++++ .../package.json | 19 +++++ spec/package-manager-spec.coffee | 77 +++++++++++++++++++ src/package.coffee | 10 +++ 6 files changed, 149 insertions(+) create mode 100644 spec/fixtures/packages/package-with-service-dependencies/index.coffee create mode 100644 spec/fixtures/packages/package-with-service-dependencies/package.json create mode 100644 spec/fixtures/packages/package-with-service-provisions/index.coffee create mode 100644 spec/fixtures/packages/package-with-service-provisions/package.json diff --git a/spec/fixtures/packages/package-with-service-dependencies/index.coffee b/spec/fixtures/packages/package-with-service-dependencies/index.coffee new file mode 100644 index 000000000..a6ac7b7e9 --- /dev/null +++ b/spec/fixtures/packages/package-with-service-dependencies/index.coffee @@ -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') diff --git a/spec/fixtures/packages/package-with-service-dependencies/package.json b/spec/fixtures/packages/package-with-service-dependencies/package.json new file mode 100644 index 000000000..655acb709 --- /dev/null +++ b/spec/fixtures/packages/package-with-service-dependencies/package.json @@ -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" + } + } + } +} diff --git a/spec/fixtures/packages/package-with-service-provisions/index.coffee b/spec/fixtures/packages/package-with-service-provisions/index.coffee new file mode 100644 index 000000000..5d2350106 --- /dev/null +++ b/spec/fixtures/packages/package-with-service-provisions/index.coffee @@ -0,0 +1,13 @@ +module.exports = + activate: -> + + deactivate: -> + + firstServiceV3: -> + 'first-service-v3' + + firstServiceV4: -> + 'first-service-v4' + + secondService: -> + 'second-service' diff --git a/spec/fixtures/packages/package-with-service-provisions/package.json b/spec/fixtures/packages/package-with-service-provisions/package.json new file mode 100644 index 000000000..d5950628e --- /dev/null +++ b/spec/fixtures/packages/package-with-service-provisions/package.json @@ -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" + } + } + } +} diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 26e76bc47..01a3ee793 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -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() diff --git a/src/package.coffee b/src/package.coffee index 0af5c9cb6..30eb3ec13 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -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)