Skip to content

Commit

Permalink
Update for cloning (#104)
Browse files Browse the repository at this point in the history
* Added another way to resolve named dependencies

* Added a rename callback to directory copying

* Merged rename callback into existing argument
  • Loading branch information
Animagne authored Nov 15, 2023
1 parent 6354730 commit c0e0f20
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 14 deletions.
16 changes: 16 additions & 0 deletions cloud-agnostic/core/src/NamedDependency.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ import { Container, interfaces } from "inversify";
import { Dependency } from "./Dependency";
import { DependencyConfig } from "./DependencyConfig";

export class NamedInstance<T> {
constructor(
public readonly instance: T,
public readonly instanceName: string
) {}
}

export abstract class NamedDependency extends Dependency {
protected abstract _registerInstance(
container: Container,
Expand All @@ -30,6 +37,15 @@ export abstract class NamedDependency extends Dependency {
serviceIdentifier: interfaces.ServiceIdentifier<T>,
instanceName: string
): void {
container
.bind(NamedInstance<T>)
.toDynamicValue(() => {
return new NamedInstance<T>(
childContainer.get(serviceIdentifier),
instanceName
);
})
.inSingletonScope();
container
.bind(serviceIdentifier)
.toDynamicValue(() => {
Expand Down
21 changes: 19 additions & 2 deletions cloud-agnostic/core/src/test/Bindable.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import { expect } from "chai";
import { Container } from "inversify";

import { Bindable, DependenciesConfig } from "..";
import { Bindable, DependenciesConfig, NamedInstance } from "..";
import { DependencyError, DependencyTypeError } from "../internal";

import { ConcreteTest, Test, TestConfig } from "./Test";
Expand Down Expand Up @@ -127,7 +127,7 @@ describe(`${Bindable.name}`, () => {
validateTestObject(test, testConfigWithOneInstance[0]);
});

it(`should resolve multiple registered named dependency instance`, () => {
it(`should resolve multiple registered named dependency instances by name`, () => {
const setup = new TestSetupWithNamedInstances(
new Container(),
dependenciesConfigWithMultipleInstances
Expand All @@ -147,4 +147,21 @@ describe(`${Bindable.name}`, () => {
validateTestObject(test, testConfigWithMultipleInstances[0]);
validateTestObject(test2, testConfigWithMultipleInstances[1]);
});

it(`should resolve multiple registered named dependency instances as array`, () => {
const setup = new TestSetupWithNamedInstances(
new Container(),
dependenciesConfigWithMultipleInstances
);

setup.start();

const tests: NamedInstance<Test>[] = setup.container.getAll(
NamedInstance<Test>
);

expect(tests.length).to.be.equal(2);
validateTestObject(tests[0]?.instance, testConfigWithMultipleInstances[0]);
validateTestObject(tests[1]?.instance, testConfigWithMultipleInstances[1]);
});
});
27 changes: 17 additions & 10 deletions storage/core/src/server/ServerStorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,14 +192,11 @@ export abstract class ServerStorage
private async copyObjectWithKey(
sourceStorage: ServerStorage,
sourceReference: ObjectReference,
targetDirectory: BaseDirectory
targetReference: ObjectReference
): Promise<string> {
const newTaskKey = this.buildTaskKey(sourceReference);
try {
await this.copyObject(sourceStorage, sourceReference, {
...sourceReference,
baseDirectory: targetDirectory.baseDirectory,
});
await this.copyObject(sourceStorage, sourceReference, targetReference);
return newTaskKey;
} catch (error) {
throw { key: newTaskKey, error };
Expand All @@ -210,7 +207,8 @@ export abstract class ServerStorage
* Copies objects from a base directory in another {@link ServerStorage} instance to this storage.
* @param {ServerStorage} sourceStorage source storage. Must be of the same type as this storage.
* @param {BaseDirectory} sourceDirectory base directory in the source storage that will be copied.
* @param {BaseDirectory} targetDirectory base directory in the target storage.
* @param {BaseDirectory} target base directory in the target storage or a callback to generate object
* reference in the target storage.
* @param {Function} predicate optional predicate to filter objects to copy. If not specified, all
* objects from the sourceDirectory will be copied.
* @returns {Promise<void>}
Expand All @@ -219,7 +217,9 @@ export abstract class ServerStorage
public async copyDirectory(
sourceStorage: ServerStorage,
sourceDirectory: BaseDirectory,
targetDirectory: BaseDirectory,
target:
| BaseDirectory
| ((objectReference: ObjectReference) => ObjectReference),
predicate?: (objectReference: ObjectReference) => boolean,
copyOptions: CopyOptions = {
maxPageSize: 100,
Expand All @@ -243,15 +243,22 @@ export abstract class ServerStorage
}
};

for await (const object of this.listObjectsFiltered(
for await (const sourceReference of this.listObjectsFiltered(
sourceStorage,
sourceDirectory,
copyOptions.maxPageSize,
predicate
)) {
const targetReference =
target instanceof Function
? target(sourceReference)
: {
...sourceReference,
baseDirectory: target.baseDirectory,
};
taskMap.set(
this.buildTaskKey(object),
this.copyObjectWithKey(sourceStorage, object, targetDirectory)
this.buildTaskKey(sourceReference),
this.copyObjectWithKey(sourceStorage, sourceReference, targetReference)
);
if (taskMap.size >= copyOptions.maxConcurrency) {
await handleSingleTask();
Expand Down
21 changes: 19 additions & 2 deletions tests/backend-storage/src/common-tests/ServerStorage.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -974,7 +974,12 @@ describe(`${ServerStorage.name}: ${serverStorage.constructor.name}`, () => {
await serverStorage.copyDirectory(
serverStorage,
sourceTestDirectory.baseDirectory,
targetTestDirectory.baseDirectory,
(object: ObjectReference) => {
return {
...targetTestDirectory.baseDirectory,
objectName: `2-${object.objectName}`,
};
},
(object) =>
object.objectName === sourceReference1.objectName ||
object.objectName === sourceReference3.objectName
Expand All @@ -985,7 +990,7 @@ describe(`${ServerStorage.name}: ${serverStorage.constructor.name}`, () => {
...targetTestDirectory.baseDirectory,
objectName: sourceReference1.objectName,
})
).to.eventually.be.true;
).to.eventually.be.false;
await expect(
serverStorage.objectExists({
...targetTestDirectory.baseDirectory,
Expand All @@ -997,6 +1002,18 @@ describe(`${ServerStorage.name}: ${serverStorage.constructor.name}`, () => {
...targetTestDirectory.baseDirectory,
objectName: sourceReference3.objectName,
})
).to.eventually.be.false;
await expect(
serverStorage.objectExists({
...targetTestDirectory.baseDirectory,
objectName: `2-${sourceReference1.objectName}`,
})
).to.eventually.be.true;
await expect(
serverStorage.objectExists({
...targetTestDirectory.baseDirectory,
objectName: `2-${sourceReference3.objectName}`,
})
).to.eventually.be.true;
});
});
Expand Down

0 comments on commit c0e0f20

Please sign in to comment.