enqueuer-cucumber
Version:
Plugin to implement cucumber steps as enqueuer requisitions
228 lines (206 loc) • 9.28 kB
text/typescript
'use strict';
import debug from 'debug';
import * as _ from 'lodash';
import { Configuration, InputPublisherModel, InputRequisitionModel, InputSubscriptionModel } from 'enqueuer';
import { RequisitionFilePatternParser } from 'enqueuer/js/requisition-runners/requisition-file-pattern-parser';
import { CucumberMatcher } from './cucumber-expressions';
export interface EnqueuerStep {
step?: InputRequisitionModel | InputSubscriptionModel | InputPublisherModel;
variables?: { [key: string]: any };
}
export class EnqueuerData {
private requisitionsCache: Map<string, InputRequisitionModel>;
private publishersCache: Map<string, InputPublisherModel>;
private subscriptionsCache: Map<string, InputSubscriptionModel>;
private groupsCache: Map<string, InputRequisitionModel>;
private requisitionFileParser: RequisitionFilePatternParser;
private cucumberMatcher: CucumberMatcher;
private debugger = {
build: debug('EnqueuerCucumber:EnqueuerData:Build'),
runtime: debug('EnqueuerCucumber:EnqueuerData')
};
constructor() {
this.requisitionsCache = new Map<string, InputRequisitionModel>();
this.publishersCache = new Map<string, InputPublisherModel>();
this.subscriptionsCache = new Map<string, InputSubscriptionModel>();
this.groupsCache = new Map<string, InputRequisitionModel>();
this.cucumberMatcher = new CucumberMatcher();
}
public initEnqueuer() {
this.debugger.build('Initializing enqueuer');
const configuration = Configuration.getInstance();
this.requisitionFileParser = new RequisitionFilePatternParser(configuration.getFiles());
const enqueuerRequisitions = this.requisitionFileParser.parse();
this.debugger.build('Enqueuer Requisitions loaded: %J', enqueuerRequisitions);
this.debugger.build('Building cache for enqueuer requisitions');
this.buildRequisitionsCache(enqueuerRequisitions);
if (this.debugger.build.enabled) {
this.debugger.build('Requisitions cache ready: %J', Array.from(this.requisitionsCache.keys()));
this.debugger.build('Publishers cache ready: %J', Array.from(this.publishersCache.keys()));
this.debugger.build('Subscriptions cache ready: %J', Array.from(this.subscriptionsCache.keys()));
this.debugger.build('Groups cache ready: %J', Array.from(this.groupsCache.keys()));
}
}
public getRequisitions() {
return Array.from(this.requisitionsCache.values());
}
public getRequisitionNames() {
return Array.from(this.requisitionsCache.keys());
}
public getPublishers() {
return Array.from(this.publishersCache.values());
}
public getPublisherNames() {
return Array.from(this.publishersCache.keys());
}
public getSubscriptions() {
return Array.from(this.subscriptionsCache.values());
}
public getSubscriptionNames() {
return Array.from(this.subscriptionsCache.keys());
}
public getGroups() {
return Array.from(this.groupsCache.values());
}
public getGroupNames() {
return Array.from(this.groupsCache.keys());
}
public getRequisitionStep(name: string, createIfNotExist?: boolean) {
this.debugger.runtime('Searching for a matching requisition step for <<%s>>', name);
const result: EnqueuerStep = {};
result.step = this.cloneStep(this.requisitionsCache.get(name));
if (!result.step) {
for (const reqName of this.getRequisitionNames()) {
const values: Array<string> = this.cucumberMatcher.match(reqName, name);
if (values && values.length) {
const requisition = this.requisitionsCache.get(reqName);
if (requisition.variables && requisition.variables.length >= values.length) {
result.step = _.chain(requisition)
.omit('publishers', 'subscriptions', 'requisitions', 'groups')
.clone()
.value() as InputRequisitionModel;
this.mergeStepVariables(result, values);
}
}
}
}
if (result.step) {
result.step.publishers = [];
result.step.subscriptions = [];
result.step.requisitions = [];
delete result.step.groups;
} else if (createIfNotExist) {
result.step = this.getDefaultRequisition(name);
}
if (result.step) {
this.debugger.runtime('Requisition Step for <<%s>>: %J', name, result);
}
return result;
}
public getPublisherStep(name: string) {
this.debugger.runtime('Searching for a matching publisher step for <<%s>>', name);
const result: EnqueuerStep = {};
result.step = this.cloneStep(this.publishersCache.get(name));
if (!result.step) {
for (const pubName of this.getPublisherNames()) {
const values: Array<string> = this.cucumberMatcher.match(pubName, name);
if (values && values.length) {
const publisher = this.publishersCache.get(pubName);
if (publisher.variables && publisher.variables.length >= values.length) {
result.step = _.clone(publisher);
this.mergeStepVariables(result, values);
}
}
}
}
if (result.step) {
this.debugger.runtime('Publisher Step for <<%s>>: %J', name, result);
}
return result;
}
public getSubscriptionStep(name: string) {
this.debugger.runtime('Searching for a matching subscription step for <<%s>>', name);
const result: EnqueuerStep = {};
result.step = this.cloneStep(this.subscriptionsCache.get(name));
if (!result.step) {
for (const subName of this.getSubscriptionNames()) {
const values: Array<string> = this.cucumberMatcher.match(subName, name);
if (values && values.length) {
const subscription = this.subscriptionsCache.get(subName);
if (subscription.variables && subscription.variables.length >= values.length) {
result.step = _.clone(subscription);
this.mergeStepVariables(result, values);
}
}
}
}
if (result.step) {
this.debugger.runtime('Subscription Step for <<%s>>: %J', name, result);
}
return result;
}
public getGroupStep(name: string) {
this.debugger.runtime('Searching for a matching group step for <<%s>>', name);
const result: EnqueuerStep = {};
result.step = this.cloneStep(this.groupsCache.get(name));
if (!result.step) {
for (const groupName of this.getGroupNames()) {
const values: Array<string> = this.cucumberMatcher.match(groupName, name);
if (values && values.length) {
const group = this.groupsCache.get(groupName);
if (group.variables && group.variables.length >= values.length) {
result.step = _.clone(group);
this.mergeStepVariables(result, values);
}
}
}
}
if (result.step) {
this.debugger.runtime('Group Step for <<%s>>: %J', name, result);
}
return result;
}
public getDefaultRequisition(name: string): any {
return _.clone({
name: name,
publishers: [],
requisitions: [],
subscriptions: []
});
}
private mergeStepVariables(result: EnqueuerStep, values: Array<string>) {
result.variables = {};
values.forEach((value, index) => {
result.variables[result.step.variables[index]] = value;
});
}
private buildRequisitionsCache(requisitions: Array<InputRequisitionModel>) {
requisitions.forEach(requisition => {
this.requisitionsCache.set(requisition.name, requisition);
if (requisition.publishers) {
requisition.publishers.forEach(publisher => {
this.publishersCache.set(publisher.name, publisher);
});
}
if (requisition.subscriptions) {
requisition.subscriptions.forEach(subscription => {
this.subscriptionsCache.set(subscription.name, subscription);
});
}
if (requisition.groups) {
requisition.groups.forEach((group: InputRequisitionModel) => {
this.groupsCache.set(group.name, group);
});
}
if (requisition.requisitions) {
this.buildRequisitionsCache(requisition.requisitions);
}
});
}
private cloneStep(step: InputRequisitionModel | InputSubscriptionModel | InputPublisherModel) {
if (step) {
return _.clone(step);
}
return null;
}
}