Grammar of Scalable Linked Interactive Nucleotide Graphics

Overview

Gosling.js

npm version build status codecov code style: prettier online editor docs

Gosling.js is a declarative grammar for interactive (epi)genomics visualization on the Web.

teaser

⚠️ Please be aware that the grammar of Gosling.js may change to some extent before the first official release.

Why Gosling?

The Gosling's key features compared to existing visualization libraries and grammars are as follows:

  • Encoding/Data Scalability: Gosling scales from whole genomes to single nucleotides via semantic zooming that updates visual encodings dynamically and by using the rendering and data access capabilities of our HiGlass genomics visualization framework.

  • Expressiveness: Gosling is designed to be expressive enough to generate pretty much any visualization of genome-mapped data, which we accomplished by basing the grammar on our taxonomy of (epi)genomics data visualizations.

  • Interactivity: Gosling has intuitive and effective user interactions built in, including zooming and panning and brushing and linking. This enables flexible visualizations that cover a wide range of visual analysis scenarios, like overview + detail views with brushes or comparative views.

Learn More About Gosling

Contributing to Gosling.js

We welcome and greatly appreciate your contribution to this project! Please read CONTRIBUTING.md to find guidelines.

Contact

Team

Citation

L'Yi et al., 2021. “Gosling: A Grammar-based Toolkit for Scalable and Interactive Genomics Data Visualization.”

@article{lyi2021gosling,
  title={Gosling: A Grammar-based Toolkit for Scalable and Interactive Genomics Data Visualization},
  author={Sehi L'Yi and Qianwen Wang and Fritz Lekschas and Nils Gehlenborg},
  year={2021},
  journal={IEEE Transactions on Visualization and Computer Graphics},
  publisher={IEEE},
  doi={10.1109/TVCG.2021.3114876},
}

License

This project is licensed under the terms of the MIT license.

Comments
  • feat(editor): support javascript editor

    feat(editor): support javascript editor

    image

    Supporting a javascript editor enables:

    • more structured and easy-to-read code, especially for multi-view visualizations
    • comments & annotations in the code example
    opened by wangqianwen0418 14
  • Grammars about the responsive design

    Grammars about the responsive design

    @sehilyi, I am planning to update docs about the responsive design. Going through the responsive examples, I have some thoughts and questions and would like to hear your opinions.

    • I am wondering whether we can specify the conditions using a more unified expression, e.g., something like alt.condtion in altair. Instead of specifying a spec at two different places,
          "layout": "circular",
          "responsiveSpec": [
            {
              "spec": {"layout": "linear"},
              "selectivity": [
                {"measure": "aspectRatio", "operation": "GT", "threshold": 1.5}
              ]
            }
          ],
    

    maybe we can use something like (assuming now the type layout = string|condition)

      "layout": {
        "ifTrue": "linear", 
        "ifFalse": "circular",
        "condition":  {"measure": "aspectRatio", "operation": "GT", "threshold": 1.5}
      }
    
    • the same goes for the responsiveSize. instead of specifying it at two places
    "responsiveSize": {"width": true},
     "width": 400,
    

    do you think it will be more convenient to write the below?

    "width": {
      "ifTrue": 400,
      "ifFalse": "vw", // not sure what is the best way to express the screen size here
      "condition": {"measure": "width", "operation": "GT", "threshold": 1000}
    }
    

    or just "width": "vw" if the width is always the width of the screen.

    This definition is also consistent with the type definition of the visibility object, by considering the default value as "ifTrue": "visible", "ifFalse": "invisible".

    • In a circular layout, the height of a track has no meaning in terms of the number of pixels. Will it be confusing if a user wants a circular chart to respond to the change of (screen) height? What is the proper way to define that?
    enhancement 
    opened by wangqianwen0418 13
  • feat: replace webpack/webpack-dev-server with vite

    feat: replace webpack/webpack-dev-server with vite

    Builds off of #494, but replaces the webpack-dev-server/build with vite. I think ideally we could just use Vite to unify the build, but the build.js script gives us better control over the "package".

    opened by manzt 11
  • feat: replace jest with vitest

    feat: replace jest with vitest

    Vitest is a unit-testing framework that is intended to be a drop-in replacement for Jest. The main benefit is that is reuses Vite's config, transformers, resolvers, and plugins. This means that the testing environment more closely mimics the final build, and we no longer need to worry about making things work in Jest and our build.

    opened by manzt 8
  • feat!: merge axis channels (e.g., `x` and `xe`); group channels as an `encoding` property

    feat!: merge axis channels (e.g., `x` and `xe`); group channels as an `encoding` property

    Fix #506 Fix #482

    Summary of Changes

    In addition to #533, this PR changes grammar around visual channels.

    This PR contains a relatively large amount of changes, but many parts are changes on the examples (src/example/*.ts) and tests (*.test.ts) reflecting the grammatical changes that have been introduced in this PR. This PR introduces the following major grammatical changes.

    C1. Axis channels are combined

    from:

    x: { field: 'start', type: 'genomic', axis: 'top', linkingId: 'overview' },
    xe: { field: 'end', type: 'genomic', axis: 'top' }
    

    to:

    x: { startField: 'start', endField: 'end', type: 'genomic', axis: 'top', linkingId: 'overview' }
    

    This way, axis channels convey a more clear meaning:

    • multiple axes do not exist for the x-axis (i.e., x and xe) or the y-axis (i.e., y and ye).
    • Instead, multiple fields can be used for a single axis (i.e., startField and endField in an x channel).

    More importantly, this prevents users from making uncertain specs, such as

    • using different types for the single axis (e.g., nominal field for y and then quantitative field for ye)
    • defining properties multiple times for a single axis that should be defined only once (e.g., axis: 'top' or linkingId: 'overview'):
    x: { field: 'start', type: 'genomic', axis: 'top', linkingId: 'overview' },
    xe: { field: 'end', type: 'genomic', axis: 'bottom', linkingId: 'ab' }
    

    C2. The encoding property is added

    Track now has a encoding property that wraps all channels:

    tracks: [{
       mark: 'line',
       encoding: {
          x: { startField: 'start', endField: 'end', type: 'genomic', axis: 'top', linkingId: 'overview' },
          color: { value: 'black' }
       },
       width: 100,
       height: 30
    }]
    

    This is consistent with the Vega-Lite and is beneficial in gos (https://github.com/gosling-lang/gos/issues/34#issuecomment-904798525).

    C3. TemplateTrack modified accordingly

    As we made a grammatical change to channels (i.e., x and xe --> x: { startField: ...., endField: ..., ...}), the template mapper logic was changed as well:

    // part of a TemplateTrackDef spec
    x: { base: { startField: 'startPosition', endField: 'endPosition', ... }
    

    C4. DataTrack is removed entirely

    We did not support DataTrack anymore, but it was still included in our code. I removed all related codes. We could support a similar feature with Track Templates in Gosling in the future:

    { template: 'vector-track', data: { ... }, width: 1000, height: 30}
    

    To Test Locally

    Run the following command to update your local gosling.schema.json since this PR updates the grammar.

    yarn schema
    

    BREAKING CHANGE

    This PR introduces breaking changes. To change your existing specification for previous versions (~v0.9.9), you need to change your spec following the instructions described below.

    If you are using multiple fields for a single axis in your spec:

    x: { field: 'start', type: 'genomic', axis: 'top', linkingId: 'overview' },
    xe: { field: 'end', type: 'genomic', axis: 'top' }
    

    You need to combine them to a single axis using up to four fields (i.e., startField, endField, startField2, endField2):

    x: { startField: 'start', endField: 'end', type: 'genomic', axis: 'top', linkingId: 'overview' }
    

    Single-field axes are not changed (i.e., field properties are used):

    x: { field: 'position', type: 'genomic', axis: 'top', linkingId: 'overview' }
    

    Add an encoding property to all tracks.

    From:

    tracks: [{
       data: ...,
       mark: ...,
       x: ...,
       y: ...,
       ...
    }]
    

    To:

    tracks: [{
       data: ...,
       mark: ...,
       encoding: {
          x: ...,
          y: ...,
          ...
       },
       ...
    }]
    

    TODO

    • [x] Update all example specs that use multiple fields for a single axis
    • [x] Update encoding parts of all marks
    • [x] Update all tests
    • [ ] Rename '|xe - x|' threshold to 'assignedWidth'?
    opened by sehilyi 8
  • zoomToGene doesn't work as expected

    zoomToGene doesn't work as expected

    There are 3 views in the following spec: 1) ideogram, 2) CN point plot, 3) gene annotation. The views are linked using the same linkingId. zoomToGene jumps to a specific gene, the first views go to the right region, but the last one keeps intact.

    I built a search bar for jumping to any region. How can I use higlass auto-completion to get gene suggestion and then go to the corresponding location?

    export const getOverviewSpec = (hoveredGene, hotGenes, enabled) => {
      return {
        "arrangement": "vertical",
        "title": "Large Rearrangment Auditing",
        "assembly": "hg19",
        "spacing": 0,
        "views": [
          {
            //"xDomain": { "chromosome": "1" },
            "linkingId": "mychoics_plus",
            "width": 1000,
            "height": 20, // reduce the track height
            "data": {
              "url": "https://dataviz.brbiotech.com/shared/cytoBand.hg19.tsv",
              "type": "csv",
              "separator": "\t",
              "chromosomeField": "chrom",
              "genomicFields": ["chromStart", "chromEnd"]
            },
            "x": {
              "field": "chromStart",
              "type": "genomic",
              "axis": "none"
            },
            "xe": { "field": "chromEnd", "type": "genomic" },
            "alignment": "overlay",
            "tracks": [
              {
                id: "ov-track-1",
                "mark": "text",
                "dataTransform": [{ "type": "filter", "field": "gieStain", "oneOf": ["acen"], "not": true }],
                "text": { "field": "name", "type": "nominal" },
                "color": {
                  "field": "gieStain",
                  "type": "nominal",
                  "domain": ["gneg", "gpos25", "gpos50", "gpos75", "gpos100", "gvar"],
                  "range": ["black", "black", "black", "black", "white", "black"]
                },
                "visibility": [
                  {
                    "operation": "less-than",
                    "measure": "width",
                    "threshold": "|xe-x|",
                    "transitionPadding": 10,
                    "target": "mark"
                  }
                ],
                "style": { "textStrokeWidth": 0 }
              },
              {
                id: "ov-track-2",
                "mark": "rect",
                "dataTransform": [{ "type": "filter", "field": "gieStain", "oneOf": ["acen"], "not": true }],
                "color": {
                  "field": "gieStain",
                  "type": "nominal",
                  "domain": ["gneg", "gpos25", "gpos50", "gpos75", "gpos100", "gvar"],
                  "range": [
                    "white",
                    "#D9D9D9",
                    "#979797",
                    "#636363",
                    "black",
                    "#A0A0F2"
                  ]
                }
              },
              {
                id: "ov-track-3",
                "mark": "triangleRight",
                "dataTransform": [
                  { "type": "filter", "field": "gieStain", "oneOf": ["acen"] },
                  { "type": "filter", "field": "name", "include": "q" }
                ],
                "color": { "value": "#B40101" }
              },
              {
                id: "ov-track-4",
                "mark": "triangleLeft",
                "dataTransform": [
                  { "type": "filter", "field": "gieStain", "oneOf": ["acen"] },
                  { "type": "filter", "field": "name", "include": "p" }
                ],
                "color": { "value": "#B40101" }
              }
            ],
            "size": { "value": 20 },
            "stroke": { "value": "gray" },
            "strokeWidth": { "value": 0.5 }
          },
          {
            alignment: "overlay",
            "linkingId": "mychoics_plus",
            genomePositionSearchBox: {
                autocompleteServer: 'https://higlass.io/api/v1',
                autocompleteId: 'P0PLbQMwTYGy-5uPIQid7A',
                chromInfoServer: 'https://higlass.io/api/v1',
                chromInfoId: 'hg19'
            },
    				data: {
    					url: "https://dataviz.brbiotech.com/RS20210907013FFP.panelData.tsv",
    					type: "csv",
    					separator: "\t",
    					sampleLength: 10000,
    					chromosomeField: "chr",
    					genomicFields: ["uniProbeStart"],
    					quantitativeFields: ["CN"]
    				},
            mark: "point",
            x: { field: "uniProbeStart", type: "genomic" },
            y: { field: "CN", type: "quantitative" },
            size: { value: 4 },
            tooltip: [
              { field: "chr", type: "nominal", alt: "Chromosome" },
              { field: "uniProbeStart", type: "genomic", alt: "Position" },
              { field: "gene", type: "nominal", alt: "Gene" },
            ],
            opacity: { value: 0.5 },
            tracks: [
              {
                id: "ov-track-5",
                color: { value: "#C7D2FE" },
                //overlayOnPreviousTrack: true,
              },
              { 
                "id": "ov-track-6",
                dataTransform: [
                  { type: 'filter', field: 'gene', oneOf: [hoveredGene] }
                ],
                "color": { "value": "#6366F1" },
                //overlayOnPreviousTrack: true,
              },
              {
                id: "ov-track-6-2",
                dataTransform: [
                  { type: 'filter', field: 'gene', oneOf: hotGenes }
                ],
                "color": {
                  "field": "gene",
                  "type": "nominal",
                  legend: true,
                  "domain": hotGenes,
                },
                //overlayOnPreviousTrack: true,
              }
            ],
            style: { inlineLegend: true },
            width: 1000,
            height: 400
          },
          {
            "alignment": "overlay",
            "title": "hg19 | Genes",
            "linkingId": "mychoics_plus",
            //"xDomain": { "chromosome": "1" },
            "data": {
              "url": "https://higlass.io/api/v1/tileset_info/?d=OHJakQICQD6gTD7skx4EWA",
              "type": "beddb",
              "genomicFields": [
                {"index": 1, "name": "start"},
                {"index": 2, "name": "end"}
              ],
              "valueFields": [
                {"index": 5, "name": "strand", "type": "nominal"},
                {"index": 3, "name": "name", "type": "nominal"}
              ],
              "exonIntervalFields": [
                {"index": 12, "name": "start"},
                {"index": 13, "name": "end"}
              ]
            },
            "tracks": [
              {
                id: "ov-track-8",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["gene"]}
                ],
                "mark": "text",
                "text": {"field": "name", "type": "nominal"},
                "x": {"field": "start", "type": "genomic"},
                "xe": {"field": "end", "type": "genomic"},
                "style": {"dy": -15, "outline": "black", "outlineWidth": 0}
              },
              {
                id: "ov-track-7",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["gene"]},
                  {"type": "filter", "field": "strand", "oneOf": ["+"]}
                ],
                "mark": "triangleRight",
                "x": {"field": "end", "type": "genomic", "axis": "none"},
                "size": {"value": 15}
              },
              {
                id: "ov-track-9",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["gene"]},
                  {"type": "filter", "field": "strand", "oneOf": ["-"]}
                ],
                "mark": "triangleLeft",
                "x": {"field": "start", "type": "genomic"},
                "size": {"value": 15},
                "style": {
                  "align": "right",
                  "outline": "black",
                  "outlineWidth": 0
                }
              },
              {
                id: "ov-track-10",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["exon"]}
                ],
                "mark": "rect",
                "x": {"field": "start", "type": "genomic"},
                "size": {"value": 15},
                "xe": {"field": "end", "type": "genomic"}
              },
              {
                id: "ov-track-11",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["gene"]},
                  {"type": "filter", "field": "strand", "oneOf": ["+"]}
                ],
                "mark": "rule",
                "x": {"field": "start", "type": "genomic"},
                "strokeWidth": {"value": 2},
                "xe": {"field": "end", "type": "genomic"},
                "style": {
                  "linePattern": {"type": "triangleRight", "size": 3.5},
                  "outline": "black",
                  "outlineWidth": 0
                }
              },
              {
                id: "ov-track-12",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["gene"]},
                  {"type": "filter", "field": "strand", "oneOf": ["-"]}
                ],
                "mark": "rule",
                "x": {"field": "start", "type": "genomic"},
                "strokeWidth": {"value": 2},
                "xe": {"field": "end", "type": "genomic"},
                "style": {
                  "linePattern": {"type": "triangleLeft", "size": 3.5},
                  "outline": "black",
                  "outlineWidth": 0
                }
              }
            ],
            "row": {
              "field": "strand",
              "type": "nominal",
              "domain": ["+", "-"]
            },
            "color": {
              "field": "strand",
              "type": "nominal",
              "domain": ["+", "-"],
            },
            "visibility": [
              {
                "operation": "less-than",
                "measure": "width",
                "threshold": "|xe-x|",
                "transitionPadding": 10,
                "target": "mark"
              }
            ],
            "width": 1000,
            "height": 100
          },
        ]
      };
    };
    
    
    bug🐛 documentation 
    opened by zhangzhen 8
  • feat: support native matrix visualization

    feat: support native matrix visualization

    This PR adds native support of matrix data. Example of drawing matrix using matrix format data:

    {
         data: {
              url: GOSLING_PUBLIC_DATA.matrixMicroC,
              type: 'matrix'
          },
          mark: 'bar',
          x: { field: 'xs', type: 'genomic', axis: 'none' },
          xe: { field: 'xe', type: 'genomic', axis: 'none' },
          y: { field: 'ys', type: 'genomic', axis: 'none' },
          ye: { field: 'ye', type: 'genomic', axis: 'none' },
          color: { field: 'value', type: 'quantitative', range: 'warm' },
          width: 600,
          height: 600
    }
    

    Screenshots

    Screen Shot 2021-12-16 at 5 48 01 PM

    https://user-images.githubusercontent.com/9922882/146459349-a7f10f91-2476-40f6-8f3e-e99b488946bc.mov

    There are multiple follow up things to do:

    • [ ] Axis on 2D tracks seem to be broken. This needs to be fixed.
    • [ ] Improving the rendering performance. Zooming is slow with dense Hi-C data.
    • [ ] Supporting log scale color (e.g., color: { ..., scale: 'log' })
    • [ ] Supporting horizontal rules. Currently, we support vertical rules (see the MATRIX example).
    • [ ] Somehow, the right-top part along the diagonal is zero values. Need to confirm if data itself only contains the left-bottom part to reduce performance. In this case, we need to properly manipulate data when loaded.
    opened by sehilyi 7
  • Support custom chromsizes

    Support custom chromsizes

    Adding a custom-defined genome is easy for higlass, while doing this is hard for gosling. Could you please guide me in modifying the source code for gosling to achieve this? After finishing the modification, zooming, panning and zoom_to are expected to function correctly. Besides, sequence abstraction can be easily implemented by add a custom-defined genome to gosling.

    enhancement P5 D? 
    opened by zhangzhen 6
  • Axis w/o

    Axis w/o "chr"?

    Hi,

    I'm playing around with using gosling to display information w/o a chromosome (a random contig and annotations), and was wondering if it's possible to remove the "chrN: " from the axis? e.g.

    image

    Thanks!

    enhancement question 
    opened by tshauck 6
  • More concise (text-based) columnar data definitions

    More concise (text-based) columnar data definitions

    Apologies for the lack on context behind the choice, but I don't know if I understand the motivation for including quantitativeFields, genomicFields, and chromosomeField in the CSV data definition. These fields aren't marked as required in the docs, but every example I've seen includes their use.

    Motivation

    To my knowledge, these columns inform how the CSV is parsed but this interpretation is also captured elsewhere in the track definition (type: genomic, quantitative, categorical, etc), so really it's an abstraction leak. I see how the chromosomeField is currently necessary, but I'm curious if that information could also be captured in the "genomic" type rather than the data definition.

    As a motivating example, what is the expected behavior if I use a field type that differs from the data definition? I assume the track type takes precedent, and if so we don't need the data definition since a type is required on all tracks.

    import gosling as gos
    
    data = gos.csv('./data.csv', genomicFields=['start', 'end'], chromosomeField='chr', quantitativeFields=['value'])
    
    gos.Track(data).encode(x=gos.Channel('start:G'), y=gos.Channel('value:N')) # value doesn't match data definition
    

    Proposal

    Remove quantitativeFields, genomicFields, and maybe chromosomeField from CSV definition. This would make specifying CSV data more concise and avoid the case where data definition does not match track definition.

    import gosling as gos
    import pandas as pd
    
    data = gos.csv('./data.csv')
    data = pd.read_csv('./data.csv').gos.csv() # no arguments needed
    

    Approach

    Use build-in (d3?) auto-parsing of CSV into memory. We can coerce any data-types that are mis-interpreted based on the track definition. Perhaps as an extension to #575, we can think about if there is a way to include chromosome field in the X encoding definition.

    interface X {
      type: 'genomic';
      // tuples represent chromosome position OR chromosome region
      field: [chrom: string, start: string] | [chrom: string, start: string, end: string];
      // ...
    }
    
    documentation enhancement 
    opened by manzt 5
  • feat: more precise channel types (e.g., `X`, `Y`, and `Color` instead of `Channel`)

    feat: more precise channel types (e.g., `X`, `Y`, and `Color` instead of `Channel`)

    This PR uses more precise types of individual channels, like X, Y, and Color. This allows checking gosling.js specs more precisely, e.g., row cannot be encoded with a genomic field:

    row: { ..., type: "genomic" } // Error
    

    or x is always mapped to a genomic field:

    x: { ..., type: "quantitative" } // Error
    

    Genomic domain is used for only x-axis channels:

    y: { ..., domain: { chromosome: '1' } } // Error
    

    Towards #506

    opened by sehilyi 5
  • chore(deps): bump json5 from 1.0.1 to 1.0.2

    chore(deps): bump json5 from 1.0.1 to 1.0.2

    Bumps json5 from 1.0.1 to 1.0.2.

    Release notes

    Sourced from json5's releases.

    v1.0.2

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295). This has been backported to v1. (#298)
    Changelog

    Sourced from json5's changelog.

    Unreleased [code, diff]

    v2.2.3 [code, diff]

    v2.2.2 [code, diff]

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1 [code, diff]

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)

    v2.2.0 [code, diff]

    • New: Accurate and documented TypeScript declarations are now included. There is no need to install @types/json5. (#236, #244)

    v2.1.3 [code, diff]

    • Fix: An out of memory bug when parsing numbers has been fixed. (#228, #229)

    v2.1.2 [code, diff]

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): bump decode-uri-component from 0.2.0 to 0.2.2

    chore(deps): bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): bump qs from 6.10.1 to 6.11.0

    chore(deps): bump qs from 6.10.1 to 6.11.0

    Bumps qs from 6.10.1 to 6.11.0.

    Changelog

    Sourced from qs's changelog.

    6.11.0

    • [New] [Fix] stringify: revert 0e903c0; add commaRoundTrip option (#442)
    • [readme] fix version badge

    6.10.5

    • [Fix] stringify: with arrayFormat: comma, properly include an explicit [] on a single-item array (#434)

    6.10.4

    • [Fix] stringify: with arrayFormat: comma, include an explicit [] on a single-item array (#441)
    • [meta] use npmignore to autogenerate an npmignore file
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbol, object-inspect, tape

    6.10.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [actions] reuse common workflows
    • [Dev Deps] update eslint, @ljharb/eslint-config, object-inspect, tape

    6.10.2

    • [Fix] stringify: actually fix cyclic references (#426)
    • [Fix] stringify: avoid encoding arrayformat comma when encodeValuesOnly = true (#424)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] add note and links for coercing primitive values (#408)
    • [actions] update codecov uploader
    • [actions] update workflows
    • [Tests] clean up stringify tests slightly
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, object-inspect, safe-publish-latest, tape
    Commits
    • 56763c1 v6.11.0
    • ddd3e29 [readme] fix version badge
    • c313472 [New] [Fix] stringify: revert 0e903c0; add commaRoundTrip option
    • 95bc018 v6.10.5
    • 0e903c0 [Fix] stringify: with arrayFormat: comma, properly include an explicit `[...
    • ba9703c v6.10.4
    • 4e44019 [Fix] stringify: with arrayFormat: comma, include an explicit [] on a s...
    • 113b990 [Dev Deps] update object-inspect
    • c77f38f [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbol, tape
    • 2cf45b2 [meta] use npmignore to autogenerate an npmignore file
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • gos.overlay Fails when

    gos.overlay Fails when "background" parameter is filled in.

    Here is a screenshot:

    image

    When the "background" parameter is set in mark_line(), the gos.overlay() does not overlay the marks inside "tracks". Instead it does a simple line graph using the LAST gosling track inside "tracks"

    Using streamlit, the output looks like this. image

    When I remove the "background parameter from mark_line() as such:

    image

    I get the intended display. However, if I want the background to be anything other than white I cannot.

    image

    bug🐛 P5 
    opened by AlexAdrian-Hamazaki 1
  • Ability to label Vertically Aligned views or Track Stacks

    Ability to label Vertically Aligned views or Track Stacks

    Hi, I am currently using the python implementation of gos. As far as I'm aware, I don't believe there is an option to "label" a set of vertical views, or a several vertically stacked tracks. Please correct me if I'm wrong!

    This could be a potentially important feature in the future.

    enhancement 
    opened by AlexAdrian-Hamazaki 2
Releases(v0.9.28)
Owner
Gosling
The data visualization grammar of scalable linked interactive nucleotide graphics. A project of the Gehlenborg Lab at @hms-dbmi.
Gosling
An easy-to-learn, dynamic, interpreted, procedural programming language

Gen Programming Language WARNING!! THIS LANGUAGE IS IN DEVELOPMENT. ANYTHING CAN CHANGE AT ANY MOMENT. Gen is a dynamic, interpreted, procedural progr

Gen Programming Language 7 Oct 17, 2022
Data Applications Project

DBMS project- Hotel Franchise Data and application project By TEAM Kurukunda Bhargavi Pamulapati Pallavi Greeshma Amaraneni What is this project about

Greeshma 1 Nov 28, 2021
Pampy: The Pattern Matching for Python you always dreamed of.

Pampy: Pattern Matching for Python Pampy is pretty small (150 lines), reasonably fast, and often makes your code more readable and hence easier to rea

Claudio Santini 3.5k Dec 30, 2022
A streamlit app for exploring image search results from HuggingPics

title emoji colorFrom colorTo sdk app_file pinned huggingpics-explorer 🤗 blue red streamlit app.py false huggingpics-explorer A streamlit app for exp

Nathan Raw 4 Sep 10, 2022
Checking-For-Fibonacci-Syquence-In-Python - Checking For Fibonacci Syquence In Python

Checking-For-Fibonacci-Syquence-In-Python The Fibonacci sequence is a set of num

John Michael Oliba 1 Feb 14, 2022
A Blender addon to enable reloading linked libraries from UI.

library_reload_linked_libraries A Blender addon to enable reloading linked libraries from UI.

3 Nov 27, 2022
Anki for desktop computers

Anki This repo contains the source code for the computer version of Anki. If you'd like to try development builds of Anki but don't feel comfortable b

Ankitects 12.9k Jan 09, 2023
Wordle is fun, so let's ruin it with computers.

ruin-wordle Wordle is fun, so let's ruin it with computers. Metrics This repository assesses two metrics about each algorithm: Success: how many of th

Charles Tapley Hoyt 11 Feb 11, 2022
A collection of software that serve no purpose other than waste your time. Forking is encouraged!

the-useless-collection A collection of software that serve no purpose other than waste your time. Forking is encouraged! Requires Python 3.9. Usage Go

Imsad2 1 Mar 16, 2022
Scitizen - Help scientific research for the benefit of mankind and humanity 🔬

Scitizen - Help scientific research for the benefit of mankind and humanity 🔬 Scitizen has been built from the ground up to give everyone the possibi

Pierre CORBEL 21 Mar 08, 2022
Fastest Semantle solver this side of the Mississippi

semantle Fastest Semantle solver this side of the Mississippi. Roughly 3 average turns to win Measured against (part of) the word2vec-google-news-300

Frank Odom 8 Dec 26, 2022
Domoticz-hyundai-kia - Domoticz Hyundai-Kia plugin for Domoticz home automation system

Domoticz Hyundai-Kia plugin Author: Creasol https://www.creasol.it/domotics For

Creasol 7 Aug 03, 2022
Traditionally, there is considerable friction for developers when setting up development environments

This self-led, half-day training will teach participants the patterns and best practices for working with GitHub Codespaces

CSE Labs at Spark 12 Dec 02, 2022
Lookup for interesting stuff in SMB shares

SMBSR - what is that? Well, SMBSR is a python script which given a CIDR/IP/IP_file/HOSTNAME(s) enumerates all the SMB services listening (445) among t

Vincenzo 112 Dec 15, 2022
Leveraging pythonic forces to defeat different coding challenges 🐍

Pyforces Leveraging pythonic forces to defeat different coding challenges! Table of Contents Pyforces Tests Pyforces Pyforces is a study repo with a c

Igor Grillo Peternella 8 Dec 14, 2022
Install packages with pip as if you were in the past!

A PyPI time machine Do you wish you could just install packages with pip as if you were at some fixed date in the past? If so, the PyPI time machine i

Thomas Robitaille 51 Jan 09, 2023
Two predictive attributes (Speed and Angle) and one attribute target (Power)

Two predictive attributes (Speed and Angle) and one attribute target (Power). A container crane has the function of transporting containers from one point to another point. The difficulty of this tas

Astitva Veer Garg 1 Jan 11, 2022
Awesome & interesting talks about programming

Programming Talks I watch a lot of talks that I love to share with my friends, fellows and coworkers. As I consider all GitHubbers my friends (oh yeah

Veit Heller 7k Dec 26, 2022
Lightweight and Modern kernel for VK Bots

This is the kernel for creating VK Bots written in Python 3.9

Yrvijo 4 Nov 21, 2021
Algorand Python API examples

Algorand-Py Algorand Python API examples This repo will hold example scripts to monitor activities on Algorand main net. You can: Monitor your assets

Karthik Dutt 2 Jan 23, 2022