~ knotless Search/
↑↓ move↵ open⇧↵ all results

chadtmiller.com/pds.js

An atproto PDS in JavaScript, for Cloudflare Workers and Node

0
0
main
86 lines · 3.0 KB Raw History
/**
 * Weighing a repository's files into the shares the language bar paints.
 */

import { describe, expect, it } from 'vitest';
import { languageOf, languageShares, percent } from '../src/lib/languages.js';

/** @param {string} path @param {number} size */
const file = (path, size) => ({ path, size });

describe('languageOf', () => {
  it('reads the language from the extension', () => {
    expect(languageOf('src/app.tsx')).toBe('TypeScript');
    expect(languageOf('src/app.jsx')).toBe('JavaScript');
    expect(languageOf('main.go')).toBe('Go');
    expect(languageOf('style.scss')).toBe('SCSS');
  });

  it('reads the language from the name where there is no extension', () => {
    expect(languageOf('Dockerfile')).toBe('Dockerfile');
    expect(languageOf('docker/Containerfile')).toBe('Dockerfile');
    expect(languageOf('Makefile.am')).toBe('Makefile');
    expect(languageOf('justfile')).toBe('Just');
  });

  it('gives data and prose files no language', () => {
    expect(languageOf('package.json')).toBe('');
    expect(languageOf('README.md')).toBe('');
    expect(languageOf('.github/workflows/ci.yml')).toBe('');
    expect(languageOf('LICENSE')).toBe('');
  });

  it('gives vendored and generated paths no language', () => {
    expect(languageOf('node_modules/left-pad/index.js')).toBe('');
    expect(languageOf('packages/app/dist/bundle.js')).toBe('');
    expect(languageOf('public/vendor.min.js')).toBe('');
    expect(languageOf('vendor/github.com/pkg/errors.go')).toBe('');
    // A directory whose name only starts with an ignored one still counts.
    expect(languageOf('distributed/worker.js')).toBe('JavaScript');
  });
});

describe('languageShares', () => {
  it('ranks languages by bytes and shares out the languaged bytes', () => {
    const shares = languageShares([
      file('src/app.ts', 700),
      file('src/util.ts', 100),
      file('src/app.css', 200),
      file('package-lock.json', 100000),
    ]);
    expect(shares.map((row) => row.name)).toEqual(['TypeScript', 'CSS']);
    expect(shares[0].share).toBeCloseTo(80);
    expect(shares[1].share).toBeCloseTo(20);
    expect(shares[0].color).toBe('#3178c6');
  });

  it('adds everything past the sixth language together as Other', () => {
    const shares = languageShares([
      file('a.ts', 100),
      file('b.js', 90),
      file('c.py', 80),
      file('d.go', 70),
      file('e.rs', 60),
      file('f.rb', 50),
      file('g.lua', 40),
      file('h.php', 30),
    ]);
    expect(shares).toHaveLength(7);
    expect(shares[6].name).toBe('Other');
    expect(shares[6].bytes).toBe(70);
    expect(shares.reduce((sum, row) => sum + row.share, 0)).toBeCloseTo(100);
  });

  it('reports nothing for a repository with no languaged file', () => {
    expect(languageShares([file('README.md', 500)])).toEqual([]);
    expect(languageShares([])).toEqual([]);
  });
});

describe('percent', () => {
  it('prints one decimal, and a floor for a share below it', () => {
    expect(percent(98.34)).toBe('98.3%');
    expect(percent(0.1)).toBe('0.1%');
    expect(percent(0.02)).toBe('<0.1%');
  });
});