Spaces:
Runtime error
Runtime error
// @ts-check | |
import { execSync } from 'child_process'; | |
import { docsNotebooks } from './docs-notebooks.js'; | |
import { NotebookContentReader } from './notebook-content-reader.js'; | |
/** @typedef {import('./notebook-content-reader.js').INotebookMetadata} INotebookMetadata */ | |
export class NotebookMetadataCollector extends NotebookContentReader { | |
/** | |
* @private | |
* @returns {string} | |
*/ | |
_getNotebookTitle() { | |
const { cells } = this._getNotebookJson(); | |
const firstCellContent = cells[0].source.join(''); | |
const titleRegexp = /# (?<title>.+)/g; | |
const match = titleRegexp.exec(firstCellContent); | |
if (!match || !match.groups || !match.groups.title) { | |
return ''; | |
} | |
const markdownLinkRegExp = /\[(.+)\]\(.+\)/g; | |
return match.groups.title.replace(markdownLinkRegExp, (value, group) => `${group || value}`).trim(); | |
} | |
/** | |
* @private | |
* @returns {string | null} | |
*/ | |
_getImageUrl() { | |
const imageUrl = this._getMetadataFromNotebookFile('imageUrl'); | |
return imageUrl || null; | |
} | |
/** | |
* @private | |
* @returns {string} | |
*/ | |
_getNotebookCreatedDate() { | |
return execSync( | |
`git log --follow -1 --pretty=format:"%ad" --date=iso --diff-filter=AC -- ${this._absoluteNotebookPath}` | |
).toString(); | |
} | |
/** | |
* @private | |
* @returns {string} | |
*/ | |
_getNotebookModifiedDate() { | |
return execSync( | |
`git log -1 --pretty=format:"%ad" --date=iso --diff-filter=a -- ${this._absoluteNotebookPath}` | |
).toString(); | |
} | |
/** | |
* @private | |
* @returns {string} | |
*/ | |
_getNotebookGitHubLink() { | |
return `https://github.com/openvinotoolkit/openvino_notebooks/blob/latest/notebooks/${this._notebookFilePath}`; | |
} | |
/** | |
* @private | |
* @returns {string | null} | |
*/ | |
_getDocsLink() { | |
const { latestDocsNotebooks, latestOVReleaseTag } = docsNotebooks; | |
const notebookFileName = this._notebookFileName.replace('.ipynb', ''); | |
const docsVersion = latestOVReleaseTag.split('.').slice(0, 2)[0]; | |
const docsUrl = `https://docs.openvino.ai/${docsVersion}/notebooks/${notebookFileName}-with-output.html`; | |
return latestDocsNotebooks.includes(this._notebookFilePath) ? docsUrl : null; | |
} | |
/** | |
* @private | |
* @returns {string | null} | |
*/ | |
_getNotebookColabLink() { | |
const readmeContent = this._getReadmeContent(); | |
const colabBadgeRegExp = new RegExp( | |
`\\[!\\[Colab\\]\\(.+\\)\\]\\((?<link>.+(?:${this._notebookFileName}))\\)`, | |
'g' | |
); | |
const match = colabBadgeRegExp.exec(readmeContent); | |
if (!match || !match.groups || !match.groups.link) { | |
return null; | |
} | |
return match.groups.link; | |
} | |
/** | |
* @private | |
* @returns {string | null} | |
*/ | |
_getNotebookBinderLink() { | |
const readmeContent = this._getReadmeContent(); | |
const binderBadgeRegExp = new RegExp( | |
`\\[!\\[Binder\\]\\(.+\\)\\]\\((?<link>.+(?:${this._notebookFileName}))\\)`, | |
'g' | |
); | |
const match = binderBadgeRegExp.exec(readmeContent); | |
if (!match || !match.groups || !match.groups.link) { | |
return null; | |
} | |
return match.groups.link; | |
} | |
/** | |
* @private | |
* @returns {INotebookMetadata['tags']['libraries']} | |
*/ | |
_getLibrariesTags() { | |
const codeCells = this._getCodeCells(); | |
const content = codeCells.map(({ source }) => source.join('\n')).join('\n'); | |
const tags = []; | |
for (const [tag, patterns] of Object.entries(librariesPatterns)) { | |
if (patterns.some((pattern) => content.includes(pattern))) { | |
tags.push(tag); | |
} | |
} | |
return tags; | |
} | |
/** | |
* @private | |
* @returns {INotebookMetadata['tags']} | |
*/ | |
_getTags() { | |
const tags = this._getMetadataFromNotebookFile('tags'); | |
const libraries = this._getLibrariesTags(); | |
return { | |
categories: [], | |
tasks: [], | |
other: [], | |
...tags, | |
libraries, | |
}; | |
} | |
/** | |
* Collects and returns new metadata object | |
* | |
* @public | |
* @returns {INotebookMetadata} | |
*/ | |
getMetadata() { | |
return { | |
title: this._getNotebookTitle(), | |
path: this._notebookFilePath, | |
imageUrl: this._getImageUrl(), | |
createdDate: this._getNotebookCreatedDate(), | |
modifiedDate: this._getNotebookModifiedDate() || this._getNotebookCreatedDate(), | |
links: { | |
github: this._getNotebookGitHubLink(), | |
docs: this._getDocsLink(), | |
colab: this._getNotebookColabLink(), | |
binder: this._getNotebookBinderLink(), | |
}, | |
tags: this._getTags(), | |
}; | |
} | |
} | |
/** @typedef {typeof import('../shared/notebook-tags.js').LIBRARIES_VALUES} LIBRARIES_VALUES */ | |
/** @type {Record<LIBRARIES_VALUES[number], string[]>} */ | |
const librariesPatterns = { | |
NNCF: ['import nncf', 'from nncf'], | |
'Model Converter': ['ov.convert_model(', 'openvino.convert_model(', '! ovc'], | |
'Model Server': ['import ovmsclient', 'from ovmsclient'], | |
'Open Model Zoo': ['omz_downloader', 'omz_converter', 'omz_info_dumper'], | |
'Benchmark Tool': ['benchmark_app'], | |
'Optimum Intel': ['import optimum.intel', 'from optimum.intel'], | |
Transformers: ['import transformers', 'from transformers'], | |
Diffusers: ['import diffusers', 'from diffusers'], | |
TensorFlow: ['import tensorflow', 'from tensorflow'], | |
'TF Lite': ['.tflite'], | |
PyTorch: ['import torch', 'from torch'], | |
ONNX: ['.onnx'], | |
PaddlePaddle: ['import paddle', 'from paddle'], | |
Ultralytics: ['import ultralytics', 'from ultralytics'], | |
Gradio: ['import gradio', 'from gradio'], | |
'OpenVINO Tokenizers': ['import openvino_tokenizers', 'from openvino_tokenizers'], | |
}; | |