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
Linux Security and Monitoring Scripts

Linux Security and Monitoring Scripts These are a collection of security and monitoring scripts you can use to monitor your Linux installation for sec

Andre Pawlowski 65 Aug 27, 2022
Zotero references script (and app)

A little script (and PyInstaller build) for a very specific, somewhat hack-ish purpose: managing and exporting project references with Zotero and its API.

Marius Rödder 0 Dec 05, 2021
Headless - Wrapper around Ghidra's analyzeHeadless script

Wrapper around Ghidra's analyzeHeadless script, could be helpful to some? Don't tell me anything is wrong with it, it works on my machine.

8 Oct 29, 2022
log4shell pwner for vulnerable minecraft servers

Log4-hell name supposed to be Log4$hell but oh well log4shell pwner for vulnerable minecraft servers install all reqs python + a minecraft client for

1 Jan 05, 2022
Forward RSS feeds to your email address, community maintained

Getting Started With rss2email We highly recommend that you watch the rss2email project on GitHub so you can keep up to date with the latest version,

248 Dec 28, 2022
Python Programming Bootcamp

python-bootcamp Python Programming Bootcamp Begin: 27th August 2021 End: 8th September 2021 Registration deadline: 22nd August 2021 Fees: No course or

Rohitash Chandra 11 Oct 19, 2022
Groupe du projet Python en 2TL2-4

Présentation Projet EpheCom Ce logiciel a été développé dans le cadre scolaire. EpheCom est un logiciel de communications - vocale et écrite - en temp

1 Dec 26, 2021
A basic notes app to store your notes.

Notes Webapp A basic notes webapp to keep your notes.You can add, edit and delete notes after signing up. To add a note type your note in the text box

2 Oct 23, 2021
Simple application that does transformation with HPF and LPFs.

Simple application that applies Butterworth, Gaussian & Ideal kernels on HPF and LPFs -aka Frequency Domain Filtering- Upload image from sidebar, set

Merve Noyan 3 Jul 06, 2022
Additional useful operations for Python

Pyteal Extensions Additional useful operations for Python Available Operations MulDiv64: calculate m1*m2/d with no overflow on multiplication (TEAL 3+

Ulam Labs 11 Dec 14, 2022
Removes all archived super productivity tasks. Just run the python script.

delete-archived-sp-tasks.py Removes all archived super productivity tasks. Just run the python script. This is helpful to do a cleanup every 3-6 month

Ben Herbst 1 Jan 09, 2022
A self contained invitation management system for gatekeeping.

Invitease Description A self contained invitation management system for gatekeeping. Purpose Serves as a focal point for inviting guests to a venue pr

מעגן מיכאל 7 Jul 19, 2022
Python tools for experimenting with differentiable intonation cost measures

Differentiable Intonation Tools The Differentiable Intonation Tools (dit) are a collection of Python functions to analyze the intonation in multitrack

Simon Schwär 2 Mar 27, 2022
A simple weather app.

keather A simple weather app. This is currently not finished. Dependencies: yay -S python-beautifulsoup4 tk

1 Jan 09, 2022
Curso de Python 3 do Básico ao Avançado

Curso de Python 3 do Básico ao Avançado Desafio: Buscador de arquivos Criar um programa que faça a pesquisa de arquivos. É fornecido o caminho e um te

Diego Guedes 1 Jan 21, 2022
Python bindings for `ign-msgs` and `ign-transport`

Python Ignition This project aims to provide Python bindings for ignition-msgs and ignition-transport. It is a work in progress... C++ and Python libr

Rhys Mainwaring 3 Nov 08, 2022
🤖️ Plugin for Sentry which allows sending notification via DingTalk robot.

Sentry DingTalk Sentry 集成钉钉机器人通知 Requirments sentry = 21.5.1 特性 发送异常通知到钉钉 支持钉钉机器人webhook设置关键字 配置环境变量 DINGTALK_WEBHOOK: Optional(string) DINGTALK_CUST

1 Nov 04, 2021
WordPress-style shortcodes for Python

Python Shortcodes WordPress-style shortcodes for Python Create and use WordPress-style shortcodes in your Python based app. Example # static output de

Bob 1 Dec 22, 2021
Catalogue CRUD Application

This Python program creates a relational SQL database hosted on the Snowflake platform, then opens a CRUD GUI to manipulate and view the data. In this application, it is used as a book catalogue. CUR

0 Dec 13, 2022
Python API for HotBits random data generator

HotBits Python API Python API for HotBits random data generator. Description This project is random data generator. It uses is HotBits API web service

Filip Š 2 Sep 11, 2020