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
Python Interactive Graphical System made during Computer Graphics classes (INE5420-2021.1)

PY-IGS - The PYthon Interactive Graphical System The PY-IGS Installation To install this software you will need these dependencies (with their thevelo

Enzo Coelho Albornoz 4 Dec 3, 2021
Simple Python tool to check if there is an Office 365 instance linked to a domain.

o365chk.py Simple Python script to check if there is an Office365 instance linked to a particular domain.

Steven Harris 37 Jan 2, 2023
A Blender addon to enable reloading linked libraries from UI.

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

null 3 Nov 27, 2022
Statically typed BNF with semantic actions; A frontend of frontend frameworks; Use your grammar everywhere.

Statically typed BNF with semantic actions; A frontend of frontend frameworks; Use your grammar everywhere.

Taine Zhao 56 Dec 14, 2022
A quick experiment to demonstrate Metamath formula parsing, where the grammar is embedded in a few additional 'syntax axioms'.

Warning: Hacked-up code ahead. (But it seems to work...) What it does This demonstrates an idea which I posted about several times on the Metamath mai

Marnix Klooster 1 Oct 21, 2021
Context-free grammar to Sublime-syntax file

Generate a sublime-syntax file from a non-left-recursive, follow-determined, context-free grammar

Haggai Nuchi 8 Nov 17, 2022
A simple string parser based on CLR to check whether a string is acceptable or not for a given grammar.

A simple string parser based on CLR to check whether a string is acceptable or not for a given grammar.

Bharath M Kulkarni 1 Dec 15, 2021
Python 3.9.4 Graphics and Compute Shader Framework and Primitives with no external module dependencies

pyshader Python 3.9.4 Graphics and Compute Shader Framework and Primitives with no external module dependencies Fully programmable shader model (even

Alastair Cota 1 Jan 11, 2022
TickerRain is an open-source web app that stores and analysis Reddit posts in a transparent and semi-interactive manner.

TickerRain is an open-source web app that stores and analysis Reddit posts in a transparent and semi-interactive manner

GonVas 180 Oct 8, 2022
IPython: Productive Interactive Computing

IPython: Productive Interactive Computing Overview Welcome to IPython. Our full documentation is available on ipython.readthedocs.io and contains info

IPython 15.6k Dec 31, 2022
Oppia is an online learning tool that enables anyone to easily create and share interactive activities

Oppia is an online learning tool that enables anyone to easily create and share interactive activities (called 'explorations'). These activities simulate a one-on-one conversation with a tutor, making it possible for students to learn by doing while getting feedback.

Oppia 4.7k Dec 29, 2022
A New, Interactive Approach to Learning Python

This is the repository for The Python Workshop, published by Packt. It contains all the supporting project files necessary to work through the course from start to finish.

Packt Workshops 231 Dec 26, 2022
An interactive course to git

OperatorEquals' Sandbox Git Course! Preface This Git course is an ongoing project containing use cases that I've met (and still meet) while working in

John Torakis 62 Sep 19, 2022
An interactive tool with which to explore the possible imaging performance of candidate ngEHT architectures.

ngEHTexplorer An interactive tool with which to explore the possible imaging performance of candidate ngEHT architectures. Welcome! ngEHTexplorer is a

Avery Broderick 7 Jan 28, 2022
A python library for writing parser-based interactive fiction.

About IntFicPy A python library for writing parser-based interactive fiction. Currently in early development. IntFicPy Docs Parser-based interactive f

Rita Lester 31 Nov 23, 2022
A VirtualBox manager with interactive mode

A VirtualBox manager with interactive mode

Luis Gerardo 1 Nov 21, 2021
Grimoire is a Python library for creating interactive fiction as hyperlinked html.

Grimoire Grimoire is a Python library for creating interactive fiction as hyperlinked html. Installation pip install grimoire-if Usage Check out the

Scott Russell 5 Oct 11, 2022
This interactive script demonstrates the Menezes-Vanstone-EC-Cryptosystem

Menezes-Vanstone-EC-Cryptosystem This interactive script demonstrates the Meneze

Nishaant Goswamy 1 Jan 2, 2022
A grammar of graphics for Python

plotnine Latest Release License DOI Build Status Coverage Documentation plotnine is an implementation of a grammar of graphics in Python, it is based

Hassan Kibirige 2.6k Feb 12, 2021
A grammar of graphics for Python

plotnine Latest Release License DOI Build Status Coverage Documentation plotnine is an implementation of a grammar of graphics in Python, it is based

Hassan Kibirige 2.6k Feb 18, 2021