All files CodeSnippetContentsService.ts

100% Statements 24/24
100% Branches 2/2
100% Functions 6/6
100% Lines 24/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 1212x                             2x         2x 2x 2x 2x       4x 2x   4x                     2x 2x         1x   1x                                         4x 4x 1x   3x                               2x 2x 1x   1x                     1x 1x   1x                        
import { ContentsManager, Drive, Contents } from '@jupyterlab/services';
 
export interface ICodeSnippet {
  name: string;
  description: string;
  language: string;
  // code separated by new line
  code: string[];
  id: number;
  tags?: string[];
}
 
/**
 * Singleton contentsService class
 */
export class CodeSnippetContentsService {
  drive: Drive;
  contentsManager: ContentsManager;
  private static instance: CodeSnippetContentsService;
  private constructor() {
    const drive = new Drive({ name: 'snippetDrive ' });
    const contentsManager = new ContentsManager({ defaultDrive: drive });
    this.drive = drive;
    this.contentsManager = contentsManager;
  }
 
  static getInstance(): CodeSnippetContentsService {
    if (!this.instance) {
      this.instance = new CodeSnippetContentsService();
    }
    return this.instance;
  }
 
  /**
   * Get the metadata information in the given path
   * @param path path to a file/directory
   */
  async getData(
    path: string,
    type: Contents.ContentType
  ): Promise<Contents.IModel> {
    try {
      const data = await this.contentsManager.get(path, {
        type: type,
        //   format: 'text',
        content: true
      });
      return data;
    } catch (error) {
      return error;
    }
    // const data = await this.contentsManager.get(path, {
    //   type: type,
    //   //   format: 'text',
    //   content: true
    // });
    // return data;
  }
 
  /**
   * Create a file/directory if it does not exist. Otherwise, save the change in a file/directory in the given path
   * @param path path to a file/directory
   * @param options options that specify if it's a file or directory and additial information
   * Usage: save('snippets', { type: 'directory' }) to create/save a directory
   *        save('snippets/test.json', {type: 'file', format: 'text', content: 'Lorem ipsum dolor sit amet'})
   */
  async save(
    path: string,
    options?: Partial<Contents.IModel>
  ): Promise<Contents.IModel> {
    try {
      const changedModel = await this.contentsManager.save(path, options);
      return changedModel;
    } catch (error) {
      return error;
    }
  }
 
  /**
   * Change the order of snippets
   * @param oldPath
   * @param newPath
   */
 
  /**
   * Rename the file or directory (not case sensitive)
   * @param oldPath change from
   * @param newPath change to
   */
  async rename(oldPath: string, newPath: string): Promise<Contents.IModel> {
    try {
      const changedModel = await this.contentsManager.rename(oldPath, newPath);
      return changedModel;
    } catch (error) {
      return error;
    }
    // const changedModel = await this.contentsManager.rename(oldPath, newPath);
    // return changedModel;
  }
 
  /**
   * Delete the file/directory in the given path
   * @param path path to a file/directory
   */
  async delete(path: string): Promise<void> {
    try {
      await this.contentsManager.delete(path);
    } catch (error) {
      return;
    }
  }
 
  // async renameAndSave(
  //   oldPath: string,
  //   newPath: string
  // ): Promise<Contents.IModel> {
  //   this.rename(oldPath, newPath);
  //   this.save(newPath);
  // }
}