mirror of https://github.com/doccano/doccano.git
pythonannotation-tooldatasetsactive-learningtext-annotationdatasetnatural-language-processingdata-labelingmachine-learning
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.2 KiB
137 lines
3.2 KiB
import MockAdatper from 'axios-mock-adapter';
|
|
import HTTP, { defaultHttpClient } from '../http';
|
|
|
|
function newId() {
|
|
return Number((Math.random() * 100000).toFixed(0));
|
|
}
|
|
|
|
function parseOffset(url) {
|
|
const offset = url.match(/offset=(\d+)/);
|
|
return offset ? Number(offset[1]) : 0;
|
|
}
|
|
|
|
function parseDocId(url) {
|
|
return Number(url.split('/')[5]);
|
|
}
|
|
|
|
function parseAnnotationId(url) {
|
|
return Number(url.split('/')[7]);
|
|
}
|
|
|
|
export default class DemoApi {
|
|
constructor(data, labelField) {
|
|
this.data = data;
|
|
this.labelField = labelField;
|
|
this.mocks = [new MockAdatper(HTTP), new MockAdatper(defaultHttpClient)];
|
|
this.pageSize = 5;
|
|
}
|
|
|
|
getMe() {
|
|
return [200, this.data.me];
|
|
}
|
|
|
|
getLabels() {
|
|
return [200, this.data.labels];
|
|
}
|
|
|
|
getStatistics() {
|
|
return [200, {
|
|
total: this.data.docs.length,
|
|
remaining: this.data.docs.filter(doc => doc.annotations.length === 0).length,
|
|
}];
|
|
}
|
|
|
|
getDocs(config) {
|
|
const offset = parseOffset(config.url);
|
|
|
|
return [200, {
|
|
results: this.data.docs.slice(Math.max(offset - 1, 0), this.pageSize),
|
|
count: this.data.docs.length,
|
|
next: offset + this.pageSize <= this.data.docs.length
|
|
? config.url.replace(`offset=${offset}`, `offset=${offset + this.pageSize}`)
|
|
: null,
|
|
previous: offset - this.pageSize >= 0
|
|
? config.url.replace(`offset=${offset}`, `offset=${offset - this.pageSize}`)
|
|
: null,
|
|
}];
|
|
}
|
|
|
|
getProject() {
|
|
return [200, this.data.project];
|
|
}
|
|
|
|
postAnnotations(config) {
|
|
const docId = parseDocId(config.url);
|
|
const body = JSON.parse(config.data);
|
|
|
|
const doc = this.data.docs.find(_ => _.id === docId);
|
|
if (!doc) {
|
|
return [404, {}];
|
|
}
|
|
|
|
let annotation = doc.annotations.find(_ => _[this.labelField] === body[this.labelField]);
|
|
if (!annotation) {
|
|
annotation = { id: newId(), ...body };
|
|
doc.annotations.push(annotation);
|
|
}
|
|
|
|
return [200, annotation];
|
|
}
|
|
|
|
deleteAnnotations(config) {
|
|
const docId = parseDocId(config.url);
|
|
const annotationId = parseAnnotationId(config.url);
|
|
|
|
const doc = this.data.docs.find(_ => _.id === docId);
|
|
if (!doc) {
|
|
return [404, {}];
|
|
}
|
|
|
|
doc.annotations = doc.annotations.filter(el => el.id !== annotationId);
|
|
return [200, {}];
|
|
}
|
|
|
|
start() {
|
|
this.mocks.forEach((mock) => {
|
|
mock.onGet(/\/v1\/.*/g).reply((config) => {
|
|
if (config.url.endsWith('/me')) {
|
|
return this.getMe();
|
|
}
|
|
|
|
if (config.url.endsWith('/labels')) {
|
|
return this.getLabels();
|
|
}
|
|
|
|
if (config.url.endsWith('/statistics')) {
|
|
return this.getStatistics();
|
|
}
|
|
|
|
if (config.url.indexOf('/docs') !== -1) {
|
|
return this.getDocs(config);
|
|
}
|
|
|
|
return this.getProject();
|
|
});
|
|
|
|
mock.onPost(/\/v1\/.*/g).reply((config) => {
|
|
if (config.url.endsWith('/annotations')) {
|
|
return this.postAnnotations(config);
|
|
}
|
|
|
|
return [404, {}];
|
|
});
|
|
|
|
mock.onDelete(/\/v1\/.*/g).reply((config) => {
|
|
if (config.url.indexOf('/annotations') !== -1) {
|
|
return this.deleteAnnotations(config);
|
|
}
|
|
|
|
return [404, {}];
|
|
});
|
|
});
|
|
}
|
|
|
|
stop() {
|
|
this.mocks.forEach(mock => mock.reset());
|
|
}
|
|
}
|