Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,007 changes: 641 additions & 366 deletions package-lock.json

Large diffs are not rendered by default.

14 changes: 12 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"test:coverage:view": "node scripts/view-coverage.js",
"lint": "eslint src/js tests/js && prettier --write src/js tests/js",
"lint:fix": "eslint --fix --cache src/js tests/js && prettier --write src/js tests/js",
"transpile": "tsc -p tsconfig-transpile.json",
"transpile": "tsc -p tsconfig.json",
"prettier": "prettier --check src/js tests/js",
"prepare": "husky install"
},
Expand All @@ -25,6 +25,16 @@
".babelrc",
"tsconfig.json"
],
"exports": {
".": {
"types": "./dist/js/index.d.ts",
"default": "./dist/js/index.js"
},
"./types": {
"types": "./dist/js/types.d.ts",
"default": "./dist/js/types.js"
}
},
"author": "Exabyte Inc.",
"bugs": {
"url": "https://github.com/Exabyte-io/ade/issues"
Expand All @@ -42,7 +52,7 @@
"@exabyte-io/eslint-config": "2025.5.13-0",
"@mat3ra/utils": "2025.9.20-0",
"@mat3ra/code": "2025.8.7-0",
"@mat3ra/esse": "2025.8.14-0",
"@mat3ra/esse": "2025.11.26-0",
"@mat3ra/made": "2025.7.15-0",
"@mat3ra/standata": "2025.10.1-0",
"@mat3ra/tsconfig": "2024.6.3-0",
Expand Down
62 changes: 14 additions & 48 deletions src/js/context/ContextProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,64 +9,26 @@
* to next one, for example data about material to track when it is changed.
* @notes Should hold static data only (see `setData` method), no classes or functions
*/
import { ContextProviderSchema, Name as ContextProviderNameEnum } from "@mat3ra/esse/dist/js/types";
import { Utils } from "@mat3ra/utils";
import lodash from "lodash";

export interface ContextProviderInstance {
constructor: typeof ContextProvider;
config: ContextProviderConfig;
}

export interface ContextProviderConfig {
name: ContextProviderName | `${ContextProviderName}`;
domain?: string;
entityName?: string;
data?: object;
extraData?: object;
isEdited?: boolean;
context?: object;
}

// TODO: separate application-specific CPs
export enum ContextProviderName {
PlanewaveCutoffDataManager = "PlanewaveCutoffDataManager",
KGridFormDataManager = "KGridFormDataManager",
QGridFormDataManager = "QGridFormDataManager",
IGridFormDataManager = "IGridFormDataManager",
QPathFormDataManager = "QPathFormDataManager",
IPathFormDataManager = "IPathFormDataManager",
KPathFormDataManager = "KPathFormDataManager",
ExplicitKPathFormDataManager = "ExplicitKPathFormDataManager",
ExplicitKPath2PIBAFormDataManager = "ExplicitKPath2PIBAFormDataManager",
HubbardJContextManager = "HubbardJContextManager",
HubbardUContextManager = "HubbardUContextManager",
HubbardVContextManager = "HubbardVContextManager",
HubbardContextManagerLegacy = "HubbardContextManagerLegacy",
NEBFormDataManager = "NEBFormDataManager",
BoundaryConditionsFormDataManager = "BoundaryConditionsFormDataManager",
MLSettingsDataManager = "MLSettingsDataManager",
MLTrainTestSplitDataManager = "MLTrainTestSplitDataManager",
IonDynamicsContextProvider = "IonDynamicsContextProvider",
CollinearMagnetizationDataManager = "CollinearMagnetizationDataManager",
NonCollinearMagnetizationDataManager = "NonCollinearMagnetizationDataManager",
QEPWXInputDataManager = "QEPWXInputDataManager",
QENEBInputDataManager = "QENEBInputDataManager",
VASPInputDataManager = "VASPInputDataManager",
VASPNEBInputDataManager = "VASPNEBInputDataManager",
NWChemInputDataManager = "NWChemInputDataManager",
config: ContextProviderSchema;
}

export interface ContextProviderStatic {
getConstructorConfig: (config: ContextProviderConfig) => ContextProviderInstance;
createConfigFromContext: (config: ContextProviderConfig) => ContextProviderConfig;
getConstructorConfig: (config: ContextProviderSchema) => ContextProviderInstance;
createConfigFromContext: (config: ContextProviderSchema) => ContextProviderSchema;
getExtraDataKeyByName: (name: string) => string;
getIsEditedKeyByName: (name: string) => string;
}

export default class ContextProvider {
config: ContextProviderConfig;
export default class ContextProvider implements ContextProviderSchema {
config: ContextProviderSchema;

name: `${ContextProviderName}`;
name: ContextProviderNameEnum;

domain?: string;

Expand All @@ -78,7 +40,11 @@ export default class ContextProvider {

isEdited?: boolean;

constructor(config: ContextProviderConfig) {
context?: object;

[k: string]: unknown;

constructor(config: ContextProviderSchema) {
this.config = config;
this.name = config.name; // property name, ie. "kpath"
this.domain = config.domain || "default";
Expand All @@ -99,14 +65,14 @@ export default class ContextProvider {
this.yieldData = this.yieldData.bind(this);
}

static getConstructorConfig(config: ContextProviderConfig): ContextProviderInstance {
static getConstructorConfig(config: ContextProviderSchema): ContextProviderInstance {
return {
constructor: this.prototype.constructor as typeof ContextProvider,
config,
};
}

static createConfigFromContext(config: ContextProviderConfig) {
static createConfigFromContext(config: ContextProviderSchema) {
const data = lodash.get(config.context, config.name);
const isEdited = lodash.get(config.context, this.getIsEditedKeyByName(config.name));
const extraData = lodash.get(config.context, this.getExtraDataKeyByName(config.name));
Expand Down
11 changes: 11 additions & 0 deletions src/js/context/JSONSchemaDataProvider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/* eslint-disable class-methods-use-this */
import JinjaContextProvider from "./JinjaContextProvider";

/**
* @summary Provides jsonSchema only.
*/
export default class JSONSchemaDataProvider extends JinjaContextProvider {
get jsonSchema() {
throw new Error("Not implemented.");
}
}
20 changes: 3 additions & 17 deletions src/js/context/JSONSchemaFormDataProvider.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
/* eslint-disable class-methods-use-this */
import type { UiSchema } from "react-jsonschema-form";

import ContextProvider, { type ContextProviderConfig } from "./ContextProvider";

interface JSONSchemaFormDataProviderConfig extends ContextProviderConfig {
isUsingJinjaVariables?: boolean;
}
import JSONSchemaDataProvider from "./JSONSchemaDataProvider";

/**
* @summary Provides jsonSchema and uiSchema for generating react-jsonschema-form
Expand All @@ -17,18 +13,8 @@ interface JSONSchemaFormDataProviderConfig extends ContextProviderConfig {
* formData={provider.getData(unit.important)} />
* ```
*/
export default class JSONSchemaFormDataProvider extends ContextProvider {
isUsingJinjaVariables: boolean;

constructor(config: JSONSchemaFormDataProviderConfig) {
super(config);
this.isUsingJinjaVariables = Boolean(config?.isUsingJinjaVariables);
}

get jsonSchema() {
throw new Error("Not implemented.");
}

// TODO: MOVE to WebApp/ave or wove
export default class JSONSchemaFormDataProvider extends JSONSchemaDataProvider {
get uiSchema(): UiSchema {
throw new Error("Not implemented.");
}
Expand Down
16 changes: 16 additions & 0 deletions src/js/context/JinjaContextProvider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { ContextProviderSchema } from "@mat3ra/esse/dist/js/types";

import ContextProvider from "./ContextProvider";

interface JSONSchemaDataProviderConfig extends ContextProviderSchema {
isUsingJinjaVariables?: boolean;
}

export default class JinjaContextProvider extends ContextProvider {
isUsingJinjaVariables: boolean;

constructor(config: JSONSchemaDataProviderConfig) {
super(config);
this.isUsingJinjaVariables = Boolean(config.isUsingJinjaVariables);
}
}
28 changes: 27 additions & 1 deletion src/js/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,32 @@
import Application from "./application";
import { applicationMixin, applicationStaticMixin } from "./applicationMixin";
import ApplicationRegistry from "./ApplicationRegistry";
import ContextProvider from "./context/ContextProvider";
import JSONSchemaFormDataProvider from "./context/JSONSchemaFormDataProvider";
import Executable from "./executable";
import { executableMixin } from "./executableMixin";
import Flavor from "./flavor";
import { flavorMixin } from "./flavorMixin";
import Template from "./template";
import { templateMixin, templateStaticMixin } from "./templateMixin";

export { Application, Executable, Flavor, Template };
const allApplications = ApplicationRegistry.getUniqueAvailableApplicationNames();

export {
Application,
Executable,
Flavor,
Template,
ApplicationRegistry,
ContextProvider,
JSONSchemaFormDataProvider,
executableMixin,
flavorMixin,
applicationMixin,
applicationStaticMixin,
templateMixin,
templateStaticMixin,
allApplications,
};

export type * from "./types";
17 changes: 9 additions & 8 deletions src/js/templateMixin.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import type { InMemoryEntity } from "@mat3ra/code/dist/js/entity";
import type { NamedInMemoryEntity } from "@mat3ra/code/dist/js/entity/mixins/NamedEntityMixin";
import { Utils } from "@mat3ra/utils";
import type { Constructor } from "@mat3ra/code/dist/js/utils/types";
import JSONSchemasInterface from "@mat3ra/esse/dist/js/esse/JSONSchemasInterface";
import type { AnyObject } from "@mat3ra/esse/dist/js/esse/types";
import type { TemplateSchema } from "@mat3ra/esse/dist/js/types";
import type {
ContextProviderNameEnum,
ContextProviderSchema,
TemplateSchema,
} from "@mat3ra/esse/dist/js/types";
import { Utils } from "@mat3ra/utils";
import nunjucks from "nunjucks";

import ContextProvider, {
type ContextProviderConfig,
type ContextProviderName,
} from "./context/ContextProvider";
import ContextProvider from "./context/ContextProvider";
import ContextProviderRegistryContainer from "./context/ContextProviderRegistryContainer";

export type TemplateBase = InMemoryEntity & NamedInMemoryEntity;
Expand Down Expand Up @@ -200,11 +201,11 @@ export function templateMixin(item: TemplateBase) {

export type ContextProviderConfigMapEntry = {
providerCls: typeof ContextProvider;
config: ContextProviderConfig;
config: ContextProviderSchema;
};

export type ContextProviderConfigMap = Partial<
Record<ContextProviderName, ContextProviderConfigMapEntry>
Record<ContextProviderNameEnum, ContextProviderConfigMapEntry>
>;

export type TemplateStaticMixin = {
Expand Down
15 changes: 15 additions & 0 deletions src/js/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { ApplicationMixin, ApplicationStaticMixin } from "./applicationMixin";
import type { CreateApplicationConfig } from "./ApplicationRegistry";
import type { ExecutableMixin } from "./executableMixin";
import type { FlavorMixin } from "./flavorMixin";
import type { TemplateMixin, TemplateStaticMixin } from "./templateMixin";

export type {
FlavorMixin,
ExecutableMixin,
ApplicationMixin,
ApplicationStaticMixin,
CreateApplicationConfig,
TemplateMixin,
TemplateStaticMixin,
};
22 changes: 20 additions & 2 deletions src/py/mat3ra/ade/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,24 @@
from mat3ra.ade.application import Application
from mat3ra.ade.executable import Executable
from mat3ra.ade.flavor import Flavor, FlavorInput
from mat3ra.ade.template import ContextProvider, Template
from mat3ra.ade.template import (
ContextProvider,
ContextProviderName,
JinjaContextProvider,
JSONSchemaDataProvider,
JSONSchemaFormDataProvider,
Template,
)

__all__ = ["Application", "Executable", "Flavor", "FlavorInput", "Template", "ContextProvider"]
__all__ = [
"Application",
"Executable",
"Flavor",
"FlavorInput",
"Template",
"ContextProvider",
"ContextProviderName",
"JinjaContextProvider",
"JSONSchemaDataProvider",
"JSONSchemaFormDataProvider",
]
Loading
Loading