text:
# @gmod/gff

[![Build Status](https://img.shields.io/github/actions/workflow/status/GMOD/gff-js/push.yml?branch=master&logo=github&style=for-the-badge)](https://github.com/GMOD/gff-js/actions?query=branch%3Amaster+workflow%3APush+)

Read and write GFF3 data performantly. This module aims to be a complete
implementation of the [GFF3
specification](https://github.com/The-Sequence-Ontology/Specifications/blob/master/gff3.md).

- streaming parsing and streaming formatting
- proper escaping and unescaping of attribute and column values
- supports features with multiple locations and features with multiple parents
- reconstructs feature hierarchies of both `Parent` and `Derives_from`
  relationships
- parses FASTA sections
- does no validation except for referential integrity of `Parent` and
  `Derives_from` relationships (can disable Derives_from reference checking
  with `disableDerivesFromReferences`)
- only compatible with GFF3

## Install

    $ npm install --save @gmod/gff

## Usage

```js
const gff = require('@gmod/gff').default
// or in ES6 (recommended)
import gff from '@gmod/gff'

const fs = require('fs')

// parse a file from a file name
// parses only features and sequences by default,
// set options to parse directives and/or comments
fs.createReadStream('path/to/my/file.gff3')
  .pipe(gff.parseStream({ parseAll: true }))
  .on('data', (data) => {
    if (data.directive) {
      console.log('got a directive', data)
    } else if (data.comment) {
      console.log('got a comment', data)
    } else if (data.sequence) {
      console.log('got a sequence from a FASTA section')
    } else {
      console.log('got a feature', data)
    }
  })

// parse a string of gff3 synchronously
const stringOfGFF3 = fs.readFileSync('my_annotations.gff3').toString()
const arrayOfThings = gff.parseStringSync(stringOfGFF3)

// format an array of items to a string
const newStringOfGFF3 = gff.formatSync(arrayOfThings)

// format a stream of things to a stream of text.
// inserts sync marks automatically.
myStreamOfGFF3Objects
  .pipe(gff.formatStream())
  .pipe(fs.createWriteStream('my_new.gff3'))

// format a stream of things and write it to
// a gff3 file. inserts sync marks and a
// '##gff-version 3' header if one is not
// already present
gff.formatFile(
  myStreamOfGFF3Objects,
  fs.createWriteStream('my_new_2.gff3', { encoding: 'utf8' }),
)
```

## Object format

### features

In GFF3, features can have more than one location. We parse features
as arrayrefs of all the lines that share that feature's ID.
Values that are `.` in the GFF3 are `null` in the output.

A simple feature that's located in just one place:

```json
[
  {
    "seq_id": "ctg123",
    "source": null,
    "type": "gene",
    "start": 1000,
    "end": 9000,
    "score": null,
    "strand": "+",
    "phase": null,
    "attributes": {
      "ID": ["gene00001"],
      "Name": ["EDEN"]
    },
    "child_features": [],
    "derived_features": []
  }
]
```

A CDS called `cds00001` located in two places:

```json
[
  {
    "seq_id": "ctg123",
    "source": null,
    "type": "CDS",
    "start": 1201,
    "end": 1500,
    "score": null,
    "strand": "+",
    "phase": "0",
    "attributes": {
      "ID": ["cds00001"],
      "Parent": ["mRNA00001"]
    },
    "child_features": [],
    "derived_features": []
  },
  {
    "seq_id": "ctg123",
    "source": null,
    "type": "CDS",
    "start": 3000,
    "end": 3902,
    "score": null,
    "strand": "+",
    "phase": "0",
    "attributes": {
      "ID": ["cds00001"],
      "Parent": ["mRNA00001"]
    },
    "child_features": [],
    "derived_features": []
  }
]
```

### directives

```js
parseDirective("##gff-version 3\n")
// returns
{
  "directive": "gff-version",
  "value": "3"
}
```

```js
parseDirective('##sequence-region ctg123 1 1497228\n')
// returns
{
  "directive": "sequence-region",
  "value": "ctg123 1 1497228",
  "seq_id": "ctg123",
  "start": "1",
  "end": "1497228"
}
```

### comments

```js
parseComment('# hi this is a comment\n')
// returns
{
  "comment": "hi this is a comment"
}
```

### sequences

These come from any embedded `##FASTA` section in the GFF3 file.

```js
parseSequences(`##FASTA
>ctgA test contig
ACTGACTAGCTAGCATCAGCGTCGTAGCTATTATATTACGGTAGCCA`)[
  // returns
  {
    id: 'ctgA',
    description: 'test contig',
    sequence: 'ACTGACTAGCTAGCATCAGCGTCGTAGCTATTATATTACGGTAGCCA',
  }
]
```

## API

<!-- Generated by documentation.js. Update this documentation by updating the source code. -->

#### Table of Contents

- [ParseOptions](#parseoptions)
  - [disableDerivesFromReferences](#disablederivesfromreferences)
  - [encoding](#encoding)
  - [parseFeatures](#parsefeatures)
  - [parseDirectives](#parsedirectives)
  - [parseComments](#parsecomments)
  - [parseSequences](#parsesequences)
  - [parseAll](#parseall)
  - [bufferSize](#buffersize)
- [parseStream](#parsestream)
  - [Parameters](#parameters)
- [parseStringSync](#parsestringsync)
  - [Parameters](#parameters-1)
- [formatSync](#formatsync)
  - [Parameters](#parameters-2)
- [formatStream](#formatstream)
  - [Parameters](#parameters-3)
- [formatFile](#formatfile)
  - [Parameters](#parameters-4)

### ParseOptions

Parser options

#### disableDerivesFromReferences

Whether to resolve references to derives from features

Type: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)

#### encoding

Text encoding of the input GFF3. default 'utf8'

Type: BufferEncoding

#### parseFeatures

Whether to parse features, default true

Type: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)

#### parseDirectives

Whether to parse directives, default false

Type: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)

#### parseComments

Whether to parse comments, default false

Type: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)

#### parseSequences

Whether to parse sequences, default true

Type: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)

#### parseAll

Parse all features, directives, comments, and sequences. Overrides other
parsing options. Default false.

Type: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)

#### bufferSize

Maximum number of GFF3 lines to buffer, default 1000

Type: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)

### parseStream

Parse a stream of text data into a stream of feature, directive, comment,
an sequence objects.

#### Parameters

- `options` **[ParseOptions](#parseoptions)** Parsing options (optional, default `{}`)

Returns **GFFTransform** stream (in objectMode) of parsed items

### parseStringSync

Synchronously parse a string containing GFF3 and return an array of the
parsed items.

#### Parameters

- `str` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** GFF3 string
- `inputOptions` **({disableDerivesFromReferences: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?, encoding: BufferEncoding?, bufferSize: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?} | [undefined](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined))?** Parsing options

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<(GFF3Feature | GFF3Sequence)>** array of parsed features, directives, comments and/or sequences

### formatSync

Format an array of GFF3 items (features,directives,comments) into string of
GFF3. Does not insert synchronization (###) marks.

#### Parameters

- `items` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)\<GFF3Item>** Array of features, directives, comments and/or sequences

Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** the formatted GFF3

### formatStream

Format a stream of features, directives, comments and/or sequences into a
stream of GFF3 text.

Inserts synchronization (###) marks automatically.

#### Parameters

- `options` **FormatOptions** parser options (optional, default `{}`)

Returns **FormattingTransform**

### formatFile

Format a stream of features, directives, comments and/or sequences into a
GFF3 file and write it to the filesystem.

Inserts synchronization (###) marks and a ##gff-version
directive automatically (if one is not already present).

#### Parameters

- `stream` **Readable** the stream to write to the file
- `writeStream` **Writable**
- `options` **FormatOptions** parser options (optional, default `{}`)
- `filename` the file path to write to

Returns **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)\<null>** promise for null that resolves when the stream has been written

## About `util`

There is also a `util` module that contains super-low-level functions for dealing with lines and parts of lines.

```js
// non-ES6
const util = require('@gmod/gff').default.util
// or, with ES6
import gff from '@gmod/gff'
const util = gff.util

const gff3Lines = util.formatItem({
  seq_id: 'ctgA',
  ...
}))
```

## util

<!-- Generated by documentation.js. Update this documentation by updating the source code. -->

#### Table of Contents

- [unescape](#unescape)
  - [Parameters](#parameters)
- [escape](#escape)
  - [Parameters](#parameters-1)
- [escapeColumn](#escapecolumn)
  - [Parameters](#parameters-2)
- [parseAttributes](#parseattributes)
  - [Parameters](#parameters-3)
- [parseFeature](#parsefeature)
  - [Parameters](#parameters-4)
- [parseDirective](#parsedirective)
  - [Parameters](#parameters-5)
- [formatAttributes](#formatattributes)
  - [Parameters](#parameters-6)
- [formatFeature](#formatfeature)
  - [Parameters](#parameters-7)
- [formatDirective](#formatdirective)
  - [Parameters](#parameters-8)
- [formatComment](#formatcomment)
  - [Parameters](#parameters-9)
- [formatSequence](#formatsequence)
  - [Parameters](#parameters-10)
- [formatItem](#formatitem)
  - [Parameters](#parameters-11)
- [GFF3Attributes](#gff3attributes)
- [GFF3FeatureLine](#gff3featureline)
  - [seq_id](#seq_id)
  - [source](#source)
  - [type](#type)
  - [start](#start)
  - [end](#end)
  - [score](#score)
  - [strand](#strand)
  - [phase](#phase)
  - [attributes](#attributes)
- [GFF3FeatureLineWithRefs](#gff3featurelinewithrefs)
  - [child_features](#child_features)
  - [derived_features](#derived_features)
- [GFF3Feature](#gff3feature)
- [GFF3Directive](#gff3directive)
  - [directive](#directive)
  - [value](#value)
- [GFF3SequenceRegionDirective](#gff3sequenceregiondirective)
  - [value](#value-1)
  - [seq_id](#seq_id-1)
  - [start](#start-1)
  - [end](#end-1)
- [GFF3GenomeBuildDirective](#gff3genomebuilddirective)
  - [value](#value-2)
  - [source](#source-1)
  - [buildName](#buildname)
- [GFF3Comment](#gff3comment)
  - [comment](#comment)
- [GFF3Sequence](#gff3sequence)
  - [id](#id)
  - [description](#description)
  - [sequence](#sequence)

### unescape

Unescape a string value used in a GFF3 attribute.

#### Parameters

- `stringVal` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Escaped GFF3 string value

Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** An unescaped string value

### escape

Escape a value for use in a GFF3 attribute value.

#### Parameters

- `rawVal` **([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) | [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number))** Raw GFF3 attribute value

Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** An escaped string value

### escapeColumn

Escape a value for use in a GFF3 column value.

#### Parameters

- `rawVal` **([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) | [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number))** Raw GFF3 column value

Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** An escaped column value

### parseAttributes

Parse the 9th column (attributes) of a GFF3 feature line.

#### Parameters

- `attrString` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** String of GFF3 9th column

Returns **[GFF3Attributes](#gff3attributes)** Parsed attributes

### parseFeature

Parse a GFF3 feature line

#### Parameters

- `line` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** GFF3 feature line

Returns **[GFF3FeatureLine](#gff3featureline)** The parsed feature

### parseDirective

Parse a GFF3 directive line.

#### Parameters

- `line` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** GFF3 directive line

Returns **([GFF3Directive](#gff3directive) | [GFF3SequenceRegionDirective](#gff3sequenceregiondirective) | [GFF3GenomeBuildDirective](#gff3genomebuilddirective) | null)** The parsed directive

### formatAttributes

Format an attributes object into a string suitable for the 9th column of GFF3.

#### Parameters

- `attrs` **[GFF3Attributes](#gff3attributes)** Attributes

Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** GFF3 9th column string

### formatFeature

Format a feature object or array of feature objects into one or more lines of
GFF3.

#### Parameters

- `featureOrFeatures` **([GFF3FeatureLine](#gff3featureline) | [GFF3FeatureLineWithRefs](#gff3featurelinewithrefs) | [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<([GFF3FeatureLine](#gff3featureline) | [GFF3FeatureLineWithRefs](#gff3featurelinewithrefs))>)** A feature object or array of feature objects

Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** A string of one or more GFF3 lines

### formatDirective

Format a directive into a line of GFF3.

#### Parameters

- `directive` **[GFF3Directive](#gff3directive)** A directive object

Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** A directive line string

### formatComment

Format a comment into a GFF3 comment.
Yes I know this is just adding a # and a newline.

#### Parameters

- `comment` **[GFF3Comment](#gff3comment)** A comment object

Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** A comment line string

### formatSequence

Format a sequence object as FASTA

#### Parameters

- `seq` **[GFF3Sequence](#gff3sequence)** A sequence object

Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Formatted single FASTA sequence string

### formatItem

Format a directive, comment, sequence, or feature, or array of such items,
into one or more lines of GFF3.

#### Parameters

- `itemOrItems` **([GFF3FeatureLineWithRefs](#gff3featurelinewithrefs) | [GFF3Directive](#gff3directive) | [GFF3Comment](#gff3comment) | [GFF3Sequence](#gff3sequence) | [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<([GFF3FeatureLineWithRefs](#gff3featurelinewithrefs) | [GFF3Directive](#gff3directive) | [GFF3Comment](#gff3comment) | [GFF3Sequence](#gff3sequence))>)** A comment, sequence, or feature, or array of such items

Returns **([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) | [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>)** A formatted string or array of strings

### GFF3Attributes

A record of GFF3 attribute identifiers and the values of those identifiers

Type: Record<[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), ([Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)> | [undefined](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined))>

### GFF3FeatureLine

A representation of a single line of a GFF3 file

#### seq_id

The ID of the landmark used to establish the coordinate system for the current feature

Type: ([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) | null)

#### source

A free text qualifier intended to describe the algorithm or operating procedure that generated this feature

Type: ([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) | null)

#### type

The type of the feature

Type: ([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) | null)

#### start

The start coordinates of the feature

Type: ([number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number) | null)

#### end

The end coordinates of the feature

Type: ([number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number) | null)

#### score

The score of the feature

Type: ([number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number) | null)

#### strand

The strand of the feature

Type: ([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) | null)

#### phase

For features of type "CDS", the phase indicates where the next codon begins relative to the 5' end of the current CDS feature

Type: ([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) | null)

#### attributes

Feature attributes

Type: ([GFF3Attributes](#gff3attributes) | null)

### GFF3FeatureLineWithRefs

**Extends GFF3FeatureLine**

A GFF3 Feature line that includes references to other features defined in
their "Parent" or "Derives_from" attributes

#### child_features

An array of child features

Type: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[GFF3Feature](#gff3feature)>

#### derived_features

An array of features derived from this feature

Type: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[GFF3Feature](#gff3feature)>

### GFF3Feature

A GFF3 feature, which may include multiple individual feature lines

Type: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[GFF3FeatureLineWithRefs](#gff3featurelinewithrefs)>

### GFF3Directive

A GFF3 directive

#### directive

The name of the directive

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

#### value

The string value of the directive

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

### GFF3SequenceRegionDirective

**Extends GFF3Directive**

A GFF3 sequence-region directive

#### value

The string value of the directive

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

#### seq_id

The sequence ID parsed from the directive

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

#### start

The sequence start parsed from the directive

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

#### end

The sequence end parsed from the directive

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

### GFF3GenomeBuildDirective

**Extends GFF3Directive**

A GFF3 genome-build directive

#### value

The string value of the directive

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

#### source

The genome build source parsed from the directive

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

#### buildName

The genome build name parsed from the directive

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

### GFF3Comment

A GFF3 comment

#### comment

The text of the comment

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

### GFF3Sequence

A GFF3 FASTA single sequence

#### id

The ID of the sequence

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

#### description

The description of the sequence

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

#### sequence

The sequence

Type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)

## License

MIT © [Robert Buels](https://github.com/rbuels)

repository: GMOD/gff-js

gha_language: TypeScript

repo_name: GMOD/gff-js


text:
# Temporarily enable tax-exempt status when a customer is tagged

Tags: Customers, Tag, Tax

This task monitors customer tags, applying tax-exempt status when a certain tag is detected, and removing it (and the tag) after a certain amount of time. Useful when you need to regularly re-approve customers for tax exemption.

* View in the task library: [usemechanic.com/task/temporarily-enable-tax-exempt-status-when-a-customer-is-tagged](https://usemechanic.com/task/temporarily-enable-tax-exempt-status-when-a-customer-is-tagged)
* Task JSON, for direct import: [task.json](../../tasks/temporarily-enable-tax-exempt-status-when-a-customer-is-tagged.json)
* Preview task code: [script.liquid](./script.liquid)

## Default options

```json
{
  "tax_exempt_tag__required": "tax-exempt-for-30-days",
  "days_before_removing_tax_exempt_status__number_required": 30
}
```

[Learn about task options in Mechanic](https://docs.usemechanic.com/article/471-task-options)

## Subscriptions

```liquid
shopify/customers/update
user/customers/expire_tax_exempt
```

[Learn about event subscriptions in Mechanic](https://docs.usemechanic.com/article/408-subscriptions)

## Documentation

This task monitors customer tags, applying tax-exempt status when a certain tag is detected, and removing it (and the tag) after a certain amount of time. Useful when you need to regularly re-approve customers for tax exemption.

## Installing this task

Find this task [in the library at usemechanic.com](https://usemechanic.com/task/temporarily-enable-tax-exempt-status-when-a-customer-is-tagged), and use the "Try this task" button. Or, import [this task's JSON export](../../tasks/temporarily-enable-tax-exempt-status-when-a-customer-is-tagged.json) – see [Importing and exporting tasks](https://docs.usemechanic.com/article/505-importing-and-exporting-tasks) to learn how imports work.

## Contributions

Found a bug? Got an improvement to add? Start here: [../../CONTRIBUTING.md](../../CONTRIBUTING.md).

license: MIT

repository: Ferrallv/mechanic-tasks

branch_name: refs/heads/master

extension: md

gha_language: JavaScript

gha_license_id: MIT

license_type: permissive

repo_name: Ferrallv/mechanic-tasks


text:
# Home Assistant Plug-In for Tasker
This is a Tasker plug-in to allow calling services on a Home Assistant installation.

## Requirements
- Android 4.0 (API 14)
- [Tasker](https://tasker.joaoapps.com/)
- [Home Assistant 0.78](https://www.home-assistant.io/)

## Usage
- Generate a [Long-Lived Access Token](https://www.home-assistant.io/docs/authentication/) in Home Assistant.
- Create a new Task in Tasker.
- Add the Action 'Plugin' > 'Home Assistant Plug-In for Tasker' to the Task.
- Tap the edit button by 'Configuration'.
- Tap the '+' button near the top right to add a new Home Assistant server.
- Enter the details for your Home Assistant server. The Base URL must include the protocol, and **not** a trailing backslash (eg: `https://my.home-assistant.com`).
- Test the server, then click 'Save'.
- Select a Service, and optionally enter Service Data in JSON format.
- Test the Service call, then click 'Save'.

## To Do
- [x] Actions
- [ ] Conditions
- [ ] Tasker Variables


text:
---
layout:   character
title:    Ilya Zolnerowich
profile:  ilya.png
---

### Role ###
Ilya Zolnerowich is the chief commander of a large swath of Red Army forces south of Cairo.
His underlings have never seen him smile, not once.
In the presence of all, even Joseph Stalin himself, Ilya is almost completely silent,
choosing to communicate his thoughts only through pen and paper.
He has no family; all of them were lost in either the Russian Revolution or Stalin’s purges,
and rumor has it that he even turned his own mother over to the KGB.
His father died when he was very young:
he had collapsed in the basement of the family’s summer home,
his skin swollen and bursting at the seams.
He had shot himself.
Ilya was the one who found the body,
and hasn’t spoken a word since.

### Common Knowledge ###
Ilya was able to study psychology at Saint Petersburg State University with the help of his grandfather,
who was a professor of mathematics, and who also provided housing for him,
his mother and two siblings after his father died.
During the Russian Revolution, a group of three Bolsheviks raided his grandather’s apartment,
killing the professor and discovering the rest of the family holed up in a bathroom.
Only one made it out alive, screaming that a young man had
"stared his friends to death."
This caught the eye of the Cheka,
a newly formed security organization that used Ilya’s uncanny profiling abilities to catch enemies of the budding Soviet state.

### Wants ###
All Ilya ever seems to be interested in is his personal collection of Egyptian artifacts,
all of which bear the image of the same shrouded figure, the same scratched out cartouche.
Almost every other evening, one can hear Shostakovich's Fifth Symhpony emanating from Ilya's tent;
he carries a record of the Leningrad Philharmonic's performance of it wherever he goes.

### Tools ###
His glassy eyes hide intellect beyond belief.
Ilya is a skilled behavioural analyst and lingiust,
and he is rumored to be able to gaze into (and even seize control of) the minds of men.

### Flaws ###
Ilya still cannot block out the image of his father lying in a pool of his own blood,
and some days, these flashbacks confine him to bed until late afternoon.
Some nights, he has terrible sleep paralysis nightmares,
which his father's corpse stands at his bedside and slowly suffocates him with a pillow,
muttering "Haaa...Haaaa..."
What's more, his frantic urge to collect more artifacts seems to supercede all semblance of self-care.

repository: evan-erdos/trail-of-cthulhu

branch_name: refs/heads/gh-pages

gha_language: HTML

repo_name: evan-erdos/trail-of-cthulhu


text:
[![codeship][2]][1]

# lambda-s3-to-sqs

The purpose of this project is to maintain a simple lambda service which will load SQS messages from a text file uploaded to s3.

# Installation

1. In the AWS Console, create a new blank lambda function.
2. Configure the S3 trigger. We use "Object Created" Event with "txt" suffix.
3. Choose or create an IAM role with SQS and S3 access
4. Clone the repository and run `npm install`
5. Copy sample.env to .env and set your sqs url
6. Edit the deploy.sh script to point to your function and run `./bin/deploy.sh`

  [1]: https://www.codeship.io/projects/209658/
  [2]: https://img.shields.io/codeship/7e310930-f226-0134-1b93-5239b5a04655.svg


text:
logic-embedding
------
_A tool for embedding non-classical logics into higher-order logic (HOL)_

The tool translates a TPTP problem statement formulated in a non-classical logic
(using the logic specification format) into monomorphic or polymorphic THF.
A description of the tool is available as tool paper [^2], the underlying TPTP syntax is
described in [^3].

For references to the tool, please use [![DOI](https://zenodo.org/badge/328684921.svg)](https://zenodo.org/badge/latestdoi/328684921)

## Logics
We refer to the TPTP non-classical logic extension at http://tptp.org/NonClassicalLogic/ for a description of the
logic specification format and the problem syntax.

Currently, the following logics (logic families) are supported:

| Logic family name  | Description                                                                                |
|--------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `$modal`           | Normal (quantified) multi-modal logics, with box and diamond operator as `{$box}` and `{$dia}`, respectively. Short forms: `[.]` for box and `<.>` for diamond. Modal operators can be indexed in long form, e.g., `{$box(#someindex)}`.                                                                                |
| `$alethic_modal`   | Same as `$modal` only that the operators are called `{$necessary}` and `{$possible}` instead (short forms are identical).                                                                                |
| `$deontic_modal`   | Same as `$modal` only that the operators are called `{$obligatory}` and `{$permissible}` instead (short forms are identical).                                                                                |
| `$epistemic_modal` | Same as `$modal` only that the operators are called `{$knows}` and `{$canKnow}` instead (short forms are identical).                                                                                |
| `$$hybrid`         | Hybrid logics extend the modal logic family $modal with the notion of nominals, a special kind of atomic formula symbol that is true only in a specific world [2]. The logics represented by $$hybrid are first-order variants of H(E, @, ↓). A nominal symbol `n` is represented as `{$$nominal} @ (n)`, the shift operator @s as `{$$shift(#s)}`, and the bind operator ↓ x as `{$$bind(#X)}`. All other aspects are analogous to the modal logic representation above.                                                                                |
| `$$pal`            | Public announcement logic (PAL) is a propositional epistemic logic that allows for reasoning about knowledge. In contrast to $modal, PAL is a dynamic logic that supports updating the knowledge of agents via so-called announcement operators. The knowledge operator Ki is given by `{$$knows(#i)}`, the common knowledge operator CA , with A a set of agents, by `{$$common($$group := [...])}`, and the announcement [!ϕ] is represented as `{$$announce($$formula := phi)}`.                                                                                |
| `$$ddl`            | Deontic logics are formalisms for reasoning over norms, obligations, permissions and prohibitions. In contrast to modal logics used for this purpose (e.g., modal logic D), dyadic deontic logics (DDLs), named $$ddl, offer a more sophisticated representation of conditional norms using a dyadic obligation operator O(ϕ/ψ). They address paradoxes of other deontic logics in the context of so-called contrary-to-duty (CTD) situations. The concrete DDLs supported are the propositional system by Carmo and Jones and Åqvist’s propositional system E. The dyadic deontic operator O is represented by `{$$obl}` (short for obligatory). |
| `$$normative`      | Normative meta form, a semantically underspecified format for expressing deontic logic concepts. Can be translated into standard deontic logic (SDL/modal logics) or DDL (see above) as desired, see [^1] for details. Conditional obligations, permissions, prohibitions and expressied via `{$$obligation} @ (body, head)`, `{$$permission} @ (body, head)`, and `{$$prohibition} @ (body, head)`, respectively. Counts-as norms (constitutional norms) are expressed via `{$$constitutive} @ (body, head)`. It depends on the target logic how these concepts are compiled into a concrete logical format.                                     |

### Logic specifications
Non-classical logic languages quite commonly admit different concrete logics using the same syntax. In order to chose the exact logic intended for the input
problem, suitable parameters are given as properties to the logic specification:

| Logic family name | Parameter          | Description                                                                                |
|-------------------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `$modal`          | `$domains`         | Selects whether quantification semantics is varying domains, constant domains, cumulative domains or decreasing domains.

Accepted values: `$varying`, `$constant`, `$cumulative`, `$decreasing`                                                                                |
|                   | `$designation`     | Selects whether non-logical symbols (constants and function symbols) have rigid or flexible designation (i.e., the same interpretation in all worlds, or possibly different ones in different worlds).

 Accepted values: `$rigid`, `$flexible`                                                                                |
|                   | `$modalities`      | Selects the properties for the modal operators.

 Accepted values, for each modality: `$modal_system_X` where `X` ∈ {`K`, `KB`, `K4`, `K5`, `K45`, `KB5`, `D`, `DB`, `D4`, `D5`, `D45`, `T`, `B`, `S4`, `S5`, `S5U`}
_or a list of axiom schemes_
 [`$modal axiom X1` , ..., `$modal axiom Xn` ] `Xi` ∈ {`K`, `T`, `B`, `D`, `4`, `5`, `CD`, `C4`} |
| `$$hybrid`        | _same as `$modal`_ |                                                                                |
| `$$pal`           | _none_             |                                                                                |
| `$$ddl`           | `$$system`         | Selects which DDL logic system is employed: Carmo and Jones or Åqvist's system E.

Accepted values: `$$carmoJones` or `$$aqvistE`                                                                                |
| `$$normative`     | `$logic`           | Selects which deontic logic system should be used for compiling the semantically underspecified statements into concrete expressions.

 Accepted values: `$$sdl` for SDL, `$$carmoJones` for the DDL of Carmo and Jones, `$$aqvistE` for Aqvist's DDL E                                                                                |                                                                                |

### Examples

#### Logic `$modal`
The so-called Barcan formula is a modal logic formula that is valid if and only if the quantification domain of the underlying first-order
modal logic model is non-cumulative.

```
  tff(modal_k5, logic, $modal == [
     $designation == $rigid,
     $domains == $decreasing,
     $modalities == [$modal_axiom_K, $modal_axiom_5]
   ] ).

  tff(bf, conjecture, ( ![X]: ({$box} @ (f(X))) ) => {$box} @ (![X]: f(X)) ).
```

#### Logic `$$hybrid`

```
  tff(hybrid_s5,logic, $$hybrid == [
      $designation == $rigid,
      $domains == $varying,
      $modalities == $modal_system_S5
    ] ).

  tff(1, conjecture, ![X]: ({$box} @ ({$$shift(#n)} @ (
             {$$bind(#Y)} @ ((Y & p(X))
                          <=>
                          ({$$nominal} @ (n) & p(X))
                     )))) ).
```

#### Logic `$$pal`

```
tff(pal, logic, $$pal).

tff(c, conjecture, {$$announce($$formula := p)} @ ( {$$common($$group := [a,b,c,k])} @ (p) )).
```

#### Logic `$$ddl`

```
  tff(spec_e, logic, $$ddl == [ $$system == $$aqvistE ] ).

  tff(a1, axiom, {$$obl} @ (go,$true)).
  tff(a2, axiom, {$$obl} @ (tell, go)).
  tff(a3, axiom, {$$obl} @ (~tell, ~go)).
  tff(situation, axiom, ~go).
  tff(c, conjecture, {$$obl} @ (~tell,$true)).
```
This example encodes that (a1) you ought to go and help your neighbor, (a2) if you go then you ought to tell him/her that you are coming,
and (a3) if you don't go, then you ought not tell him/her. It can consistently be inferred that, if you actually don't go, then you ought not
tell.

### Extended specifications

#### Modal logic `$modal`: Per-modality specification

Multiple modal operators are defined like ...
```
thf(advanced,logic,(
    $modal ==
      [ $designation == $rigid,
        $domains == $cumulative,
        $modalities ==
          [ $modal_system_S5,
            {$box(#a)} == $modal_system_KB,
            {$box(#b)} == $modal_system_K ] ] )).
```
Here box operator a is system KB, box operator b is K. Of course, also lists of axiom schemes can be used. All further modal operators are S5 (if existent).

#### Modal logic `$modal`: Including interaction axiom schemes

Axiom schemas acting as interaction axioms between different modalities, can simply
be added as part of the `$modality` entry (see also [^4]):
```
tff(modal_system,logic,
    $modal ==
      [ $designation == $rigid,
        $domains == $cumulative,
        $modalities == [
          {$box(#always)} == $modal_system_S4,
          {$box(#load)} == $modal_system_K,
          {$box(#shoot)} == $modal_system_K,
			    {$box(#always)} @ (P) => {$box(#load)} @ (P),
			    {$box(#always)} @ (P) => {$box(#shoot)} @ (P) ] ] ).
```

## Usage
An executable JAR file is distributed with the most current release.

```
usage: embedproblem [-l <logic>] [-p <parameter>] [-s <spec>=<value>] [--tstp] <problem file> [<output file>]

 <problem file> can be either a file name or '-' (without parentheses) for stdin.
 If <output file> is specified, the result is written to <output file>, otherwise to stdout.

 Options:
  -l <logic>
     If <problem file> does not contain a logic specification statement, explicitly set
     the input format to <logic>. Ignored, if <problem file> contains a logic specification statement.
     Supported <logic>s are: $modal, $epistemic_modal, $$ddl, $$pal, $alethic_modal, $$hybrid, $deontic_modal

  -p <parameter>
     Pass transformation parameter <parameter> to the embedding procedure.

  -s <spec>=<value>
     If <problem file> does not contain a logic specification statement, explicitly set
     semantics of <spec> to <value>. In this case, -l needs to be provided.
     Ignored, if <problem file> contains a logic specification statement.

  --tstp
     Enable TSTP-compatible output: The output in <output file> (or stdout) will
     start with a SZS status value and the output will be wrapped within
     SZS BEGIN and SZS END block delimiters. Disabled by default.

  --version
     Prints the version number of the executable and terminates.

  --help
     Prints this description and terminates.
```

## Contact
In case of questions or comments, feel free to contact Alexander Steen (alexander.steen *at* uni-greifswald.de).

## Notes
The modal logic embedding is an extended and consolidated tool inspired by Tobias Gleißner's embedding tool at the leoprover/embed_modal repository.
This version makes use of the `scala-tptp-parser` library from leoprover/scala-tptp-parser that is much faster, in particular for larger input problems.

[^1]: A. Steen, D. Fuenmayor. Bridging between LegalRuleML and TPTP for Automated Normative Reasoning. In: 6th International Joint Conference on Rules and Reasoning Berlin, 26-28 September 2022, Lecture Notes in Computer Science, Vol.13752, pp. 244--260, Springer, 2022. DOI: https://doi.org/10.1007/978-3-031-21541-4_16.
[^2]: A. Steen. An Extensible Logic Embedding Tool for Lightweight Non-Classical Reasoning. In Eighth Workshop on Practical Aspects of Automated Reasoning (PAAR 2022). CEUR Workshop Proceedings, Vol. 3201, CEUR-WG.org, 2022. Available at https://ceur-ws.org/Vol-3201/paper13.pdf.
[^3]: A. Steen, D. Fuenmayor, T. Gleißner, G. Sutcliffe and C. Benzmüller. Automated Reasoning in Non-classical Logics in the TPTP World. In Eighth Workshop on Practical Aspects of Automated Reasoning (PAAR 2022). CEUR Workshop Proceedings, Vol. 3201, CEUR-WG.org, 2022. Available at https://ceur-ws.org/Vol-3201/paper11.pdf.
[^4]: M. Taprogge, A. Steen. Flexible Automation of Quantified Multi-Modal Logics with Interaction. In KI 2023: Advances in Artificial Intelligence. 46th German Conference on AI, Berlin, Germany, September 26–29, 2023, Proceedings, LNCS, Vol. 14236, Springer, 2023.

repository: leoprover/logic-embedding

gha_language: Scala

repo_name: leoprover/logic-embedding


text:
---
title: Echo
---

{% since %}v9.31.0{% endsince %}

Outputs an expression in the rendered HTML. This is identical to wrapping an expression in `{{` and `}}`, but works inside liquid tags and supports filters.

## echo

Input
```liquid
{% assign username = 'Bob' %}
{% echo username | append: ", welcome to LiquidJS!" | capitalize %}
```

Output
```text
Bob, welcome to LiquidJS!
```

repository: harttle/liquidjs

repo_name: harttle/liquidjs


text:
 corona-chart-app

 Animated chart of coronavirus data

  Get Started
    •
  Website
    •
  Docs
    •
  Blog
    •
  Forum
    •
  Videos
    •
  Community

## 💻 About the sample
Sample chart application that uses a REST API to retrieve and show updated statistics about the Corona/COVID-19 pandemics worldwide.

## 📹 Gifs and Screenshots

![Corona chart](https://i.imgur.com/al06e72.gif)

## :woman_technologist: Usage

- `git clone https://github.com/TotalCross/embedded-samples/` or download the .zip by clicking the green "Code" button next to repo name and choosing "Download ZIP".
- If you downloaded .zip file, uncompress it in a folder and open it.
- If you are using Linux, run `code <embedded-samples>` or open VS Code and Click in "File > Open..." and select embedded-samples/corona-chart-app in the file dialog that will be shown.
- With project opened in VS Code, navigate to corona-chart-app aplication.
- Look for its `RunCoronaChartApplication.java` and right-click.
- Choose the "Run" option in the popup.
- Tell us if you liked this sample :smiley:

#### If you prefer to use another IDE, like Eclipse, IntelliJ, on anyother, see [Getting Started](https://learn.totalcross.com/documentation/get-started)

## 🚧 Contributing to TotalCross Embedded Samples:
Choose the way to contribute and follow these steps:

### With code:
1. Fork this repository.
2. Create a branch: `git checkout -b <branch_name>`.
3. Make your changes and commit them: `git commit -m '<commit_message>'`
4. Push to the original branch: `git push origin <project_name>/<location>`
5. Create the [pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request).

### Help us to improve:
* Find bugs and let us know by creating a [bug report](https://github.com/TotalCross/totalcross-embedded-samples/issues/new?assignees=VaneskaSousa&labels=bug&template=bug_report.md&title=);
* Create [features request](https://github.com/TotalCross/totalcross-embedded-samples/issues/new?assignees=VaneskaSousa&labels=enhancement&template=feature_request.md&title=) to indicate the features you want to see working with [TotalCross](https://totalcross.com/);
* Be part of our [community](https://t.me/totalcrosscommunity).

## 📖 More Samples and Tutorials
* [Getting Started with TotalCross](https://learn.totalcross.com/documentation/get-started);
* [Tutorial Videos](https://www.youtube.com/channel/UCSXUBRBC4Ec3_o9R7-3XX-w);
* [Building GUI in Android Studio and running on Raspberry Pi](https://www.youtube.com/watch?v=7o3p14wQPsE)

## 📢 Contact
* [Community](https://t.me/totalcrosscommunity);
* [Twitter](https://twitter.com/totalcross);
* [Linkedin](https://linkedin.com/company/totalcross);
* [Instagram](https://www.instagram.com/totalcross/);
* [Facebook](www.facebook.com/TotalCross/);
* [Email](mailto:vaneska.sousa@totalcross.com).

## :page_facing_up: License
Copyright (c) TotalCross Platform. All rights reserved.

Licensed under the [MIT License](https://github.com/TotalCross/embedded-samples/blob/main/LICENSE).

repository: ikaratass/embedded-samples

branch_name: refs/heads/main

repo_name: ikaratass/embedded-samples


text:
## Known Bugs

* The background matplotlib dumps of logged tensorboard scalars sometimes outputs garbage images. The fonts are in the wrong place, and parts of the image are cut off. This may be due to some race condition. Perhaps multiple dumps were spawned at once and were clobbering the encoding of one another?

* The per-batch iteration metrics seem to jump on the x-axis in the tensorboard logs. Not sure why this is. Perhaps there is a scheduler bug?

* If PyQt5 is installed and there is a problem with the matplotlib qt backend
  then you may just get an error that crashes the system:

  ```
    QObject::moveToThread: Current thread (0x5636e99e0690) is not the object's thread (0x5636ea1e26b0).
    Cannot move to target thread (0x5636e99e0690)

    qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "$HOME/.local/conda/envs/py38/lib/python3.8/site-packages/cv2/qt/plugins" even though it was found.
    This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

    Available platform plugins are: xcb, eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl.

```

The workaround is to uninstall PyQt5, but that's not great. Need to detect that
this will happen before it does so we can warn and avoid it.

repository: VIAME/netharn

repo_name: VIAME/netharn


text:
## Changelog

### `@jupyter-lsp/jupyterlab-lsp 4.0.0-alpha.0` (not-yet-released)

- features:
  - implement jump target selector and jump to references ([#739])
  - implement settings UI using native JupyterLab 3.3 UI ([#778])
  - add option to show hover tooltip automatically ([#864], thanks @yamaton)
  - implement eliding for long paths/files in completer ([#893])
- bug fixes:
  - use correct websocket URL if configured as different from base URL ([#820], thanks @MikeSem)
  - clean up all completer styles when completer feature is disabled ([#829]).
  - fix `undefined` being inserted for path-like completion items with no `insertText` ([#833])
  - reduce signature flickering when typing and hover flicker when moving mouse ([#836])
  - fix sporadic misplacement of hover tooltips ([#860], thanks @yamaton)
  - handle potential race condition in feature settings loading ([#882])
- refactoring:
  - changed NPM packages namespace from `@krassowski` to `@jupyter-lsp` ([#862])
  - move client capabilities to features ([#738])
- downstreams:
  - use the host application's HTTP settings for requests to the REST and WebSocket routes ([#881])
  - source maps are provided for improved debugging ([#882])
  - the derived JSON Schema types are avilable as `SCHEMA` ([#882])
- documentation:
  - add missing `--channel` to conda instruction for texlab ([#789], thanks @justin-f-perez)
  - remove references to pylsp fork ([#800] and [#814], thanks @joelostblom and @nickfong)
  - add Robot Framework language server ([#724], thanks @bollwyvl)
  - add a list of third-party and community language servers ([#826], thanks @cccs-jc)
  - fix documentation of `.lsp_symlink` workaround ([#828])
- maintenance:
  - bump minimum required JupyterLab version to 3.3 (`>=3.3.0,<4.0.0a0`)
  - bump minimum required Node.js version to 14.0 (12.0 reached EOL in April)
  - use newer `@jupyterlab/builder` which provides third-party license information ([#882])

### `lsp-ws-connection 0.7.1` (not-yet-released)

- downstreams:
  - includes sourcemaps for easier debugging ([#882])
- maintenance:
  - handle notifcation promises more explicitly ([#882])

### `jupyter-lsp 1.6.0` (not-yet-released)

- dependencies:
  - uses `importlib_metadata` (or `importlib.metadata` on 3.10+) for `entry_points` ([#882])
- performance:
  - `entry_point` discovery is deferred until server has started, improving
    `jupyter_server` startup time ([#852])

[#724]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/724
[#738]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/738
[#778]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/778
[#789]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/789
[#800]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/800
[#814]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/814
[#820]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/820
[#826]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/826
[#829]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/829
[#833]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/833
[#836]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/836
[#852]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/852
[#860]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/860
[#864]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/864
[#882]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/882
[#893]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/893

### `@krassowski/jupyterlab-lsp 3.10.1` (2022-03-21)

- bug fixes:
  - fix navigation to files with names including characters which require encoding ([#758])
  - fix omissions in the main settings schema for correct rendering in JupyterLab 3.3 Settings Editor UI ([#779])
- maintenance
  - make tests pass with new JupyterLab 3.3 ([#777])
  - pin r-base version to fix Binder ([#766])
  - pin node-gyp to fix CI on Windows ([#772])
  - pin pytest-flake8 to fix CI
  - update development/testing environment dependencies: urijs, typedoc, url-parse

[#758]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/758
[#766]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/766
[#772]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/772
[#777]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/777
[#779]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/779

### `@krassowski/jupyterlab-lsp 3.10.0` (2022-01-01)

- features:
  - enable pre-filtering of completion matches by default ([#735])
  - add support for diagnostic tags: Deprecated, Unnecessary ([#736], [#737])
- bug fixes:
  - squash warnings and errors in web console ([#732])
  - fix signature blur and fix formatting when no arguments are present ([#734])
  - fixed with enabling of strict null checks:
    - previously changing kernels always led to restarting of LSP connection, even if the kernel language did not change; now the connection will be retained if possible
    - `markdownRenderer` is no longer implicitly required
    - diagnostics sorting with missing values for `source` and `severity` was improved and missing values will be consistently shown at the end
    - diagnostics placeholder was split into `Diagnostics are not available` and `No issues detected, great job!` which will now show up properly
- maintenance:
  - enable strict null checks and other strict settings ([#733])
  - specify client capabilities in features instead of hard-coding them ([#738])
  - bump minimum required JupyterLab version to 3.1 (`>=3.1.0,<4.0.0a0`)

[#732]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/732
[#733]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/733
[#734]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/734
[#735]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/735
[#736]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/736
[#737]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/737
[#738]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/738

### `@krassowski/code-jumpers 1.2.0` (2022-01-01)

- maintenance:
  - updates to API with respect to `null`/`undefined` values in course strict null checks activation ([#733])

### `@krassowski/jupyterlab-lsp 3.9.3` (2021-12-19)

- bug fixes:
  - workaround upstream issue in merging translation ([#726], thanks @fcollonval)

[#726]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/726

### `@krassowski/jupyterlab-lsp 3.9.2` (2021-12-12)

- bug fixes:
  - prevent very long completion details text from extending the completer indefinitely ([#698])
  - correct status translations ([#700], thanks @fcollonval)
  - fix translations in status pop-up ([#703])
  - workaround issue causing file rename when opening external files by jumping to them ([#712], thanks @jepcor97)
  - fix sorting by "Line:Ch" and "Cell" in Diagnostics Panel ([#717])
  - fix header border missing when scrolling in Diagnostics Panel ([#717])
- documentation improvements:
  - clarify that JupyterLab restart is needed after installation ([#714], thanks @3coins)

[#698]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/698
[#700]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/700
[#703]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/703
[#712]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/712
[#714]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/714
[#717]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/717

### `@krassowski/completion-theme 3.2.0` (2021-12-12)

- features:
  - add `details-below` layout allowing to change the completer arrangement ([#698])

### `jupyter-lsp 1.5.1` (2021-12-12)

- documentation improvements:
  - document troubleshooting steps for `texlab` server([#702])
- maintenance and upkeep:
  - migrate test configuration to `ServerApp` as needed ([#713])
  - address deprecation warnings ([#713])

[#702]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/702
[#713]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/713

### `@krassowski/jupyterlab-lsp 3.9.1` (2021-10-24)

- bug fixes:
  - fix build issues making it difficult to reuse/extend the package ([#696], thanks @cccs-jc)

[#696]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/696

### `jupyter-lsp 1.5.0` (2021-10-24):

- features:
  - add support for new `typescript-language-server` replacing `javascript-typescript-langserver`;
    despite the name both packages provide support for all four: JavaScript, JSX, TypeScript and TSX;
    the old `javascript-typescript-langserver` can still be used, but it is no longer maintained
    and we will not be supported, and specs may be removed in the next major release ([#697]).

[#697]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/697

### `@krassowski/jupyterlab-lsp 3.9.0` (2021-10-17)

- features:
  - signature help box will now persist while typing the arguments of a function ([#671])
  - the currently active argument will be highlighted in the signature help box
  - if the documentation exceeds a user-configurable number of lines the signature
    help box will only display the first line of the documentation and the following
    lines will be collapsed into an expandable details section.
  - the signature box is now displayed above the current line
  - the signature box takes up less space
  - you can now disable specific features in settings ([#689])
- bug fixes:
  - fix missing translation strings ([#675])
  - fix kernel completions not showing up for R ([#686])
  - fix tab completions not showing up in strings due to incomplete trigger kind invalidation ([#686])
  - fix path completions reconciliation for `pyls`/`pylsp` with `IPython` ([#686])
  - improve escaping rule for IPython magics overrides ([#688])
  - fix documentation panel not showing up when typing fast ([#692])

[#671]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/671
[#675]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/675
[#686]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/686
[#688]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/688
[#689]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/689
[#692]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/692

### `@krassowski/jupyterlab-lsp 3.8.1` (2021-08-02)

- bug fixes:
  - `%Rdevice` magic is now properly overridden and won't be extracted to R code ([#646])
  - Fix hover rendering for `MarkedString`s, fix hover disappearing when moving mouse towards it ([#653])

[#646]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/646
[#653]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/653

### `jupyter-lsp 1.4.1` (2021-08-02)

- bug fixes:
  - remove spurious `ValidationError` warnings for non-installed servers ([#645], thanks @karlaspuldaro)
  - reduce number and verbosity of logs on startup

[#645]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/645

### `@krassowski/jupyterlab-lsp 3.8.0` (2021-07-04)

- improvements:

  - add a note on manually enabling backend extension ([#621], thanks @icankeep)
  - in-app troubleshooting/installation help is now offered for servers which are needed but could not be detected
    (if auto-detection specification for those is present) ([#634])

- bug fixes:
  - fix rename shortcut registration in file editor ([#614])
  - improve performance of icon rendering in completer ([#625])
  - fix cache misses and concurrency issues for hover ([#630])

[#614]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/614
[#621]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/621
[#625]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/625
[#630]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/630
[#634]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/634

### `jupyter-lsp 1.4.0` (2021-07-04)

- features:

  - `troubleshoot` property was added to the language server spec, allowing to describe auto-detection troubleshooting
    ([#634])
  - new endpoint `specs` will list all language server specifications known to `jupyter-lsp` allowing frontends
    to suggest installation of specific language servers ([#634])

- changes:
  - `ShellSpec.is_installed()` signature changed; it now accepts the `LanguageServerManagerAPI` rather than the resolved
    command location (of `str` type); the specs using only `is_installed_args` are not affected; as this method was only
    used by internally by the `__call__` implementation (which was adjusted accordingly) this change should not break
    existing specs unless any of these methods were overridden in sub-classes.
  - `SpecBase` was moved to `types.py`; it can still be imported from `utils`, but doing so is discouraged
  - `ShellSpec.solve()` was added to facilitate discovery of command location

[#634]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/634

### `jupyter-lsp 1.3.0` (2021-06-02)

- features:
  - add auto-detection of pyright server ([#587], thanks @yuntan)

[#587]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/587

### `@krassowski/jupyterlab-lsp 3.7.0` (2021-05-31)

- features:

  - add ability to deactivate Kernel completions or LSP completion through the settings ([#586], thanks @Carreau)
  - allow to set a priority for LSP server, allowing to choose which server to use when multiple servers are installed ([#588])
  - add auto-detection of pyright server ([#587], thanks @yuntan)
  - update from JupyterLab Classic to RetroLab ([#602])
  - log server messages in user-accessible console ([#606])

- bug fixes:

  - workaround url-parse issue causing problems when using JupyterLab 3.0.15 ([#599])

- other changes:
  - drop Node 10 (EOL 2 weeks ago) testing on CI, add Node 15 ([#587])
  - update lsp-ws-connection dependencies ([#606])
  - old emit-based API of lsp-ws-connection is new deprecated and will be removed in the next major version; please use `serverNotifications`, `clientNotifications`, `clientRequests` and `serverRequests` instead ([#606])

[#586]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/586
[#588]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/588
[#599]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/599
[#602]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/602
[#606]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/606

### `jupyter-lsp 1.2.0` (2021-04-26)

- features:

  - add support for python-lsp-server, a community fork of pyls ([#584] and [#582], thanks @maresb)

- bug fixes:
  - fix encoding on Windows for non-conda installs ([#580], thanks @stonebig)

[#580]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/580
[#582]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/582
[#584]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/584

### `@krassowski/code-jumpers 1.1.0` (2021-04-26)

- features:

  - added translation support ([#557], thanks @JessicaBarh)

### `@krassowski/jupyterlab-lsp 3.6.0` (2021-04-26)

- features:

  - added translation support ([#557], thanks @JessicaBarh)

- bug fixes:

  - fixed name of jupyterlab-lsp package displayed in JupyterLab UI ([#570], thanks @marimeireles)
  - removed vendored CodeMirror from distribution ([#576])

[#557]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/557
[#570]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/570
[#576]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/576

### `@krassowski/jupyterlab-lsp 3.5.0` (2021-03-22)

- features:

  - adds `%%bigquery` IPython cell magic support for BigQuery ([#553], thanks @julioyildo)
  - completions filtering can be set to case-insensitive in settings ([#549])
  - completions filtering can hide exact matches ([#549])
  - the extra information displayed next to the completion label now can include 'detail' (usually module/package of origin), and can be customized in settings ([#549])

- bug fixes:

  - prevents throwing a highlights error when adding new cell with Shift + Enter ([#544])
  - fixes IPython `pinfo` and `pinfo2` (`?` and `??`) for identifiers containing `s` ([#547])
  - fixes incorrect behaviour of LSP features in some IPython magics with single line of content ([#560])
  - fixes name of jupyterlab-lsp package in JupyterLab

- for extension authors:

  - minimal functional extractor and code overrides APIs are now exported; these APIs cab be subject to change in future releases ([#562])

[#544]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/544
[#547]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/547
[#549]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/549
[#553]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/553
[#560]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/560
[#562]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/562

### `jupyter-lsp 1.1.4` (2021-02-21)

- bug fixes:

  - ensures `jupyter*_config.d` paths are searched for `language_servers`
    as documented in _Configuring_ ([#535])
  - uses more explicit file name for enabling `jupyter-lsp` in `notebook` and
    `jupyter_server ([#535])

[#535]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/535

### `@krassowski/jupyterlab-lsp 3.4.1` (2021-02-16)

- bug fixes:

  - fixed installation of the source version of the extension (causing build error if classic was not installed) ([#526])

[#526]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/526

### `@krassowski/jupyterlab-lsp 3.4.0` (2021-02-14)

- features:

  - the priority of the completions from kernel can now be changed by switching new `kernelCompletionsFirst` setting ([#520])
  - completer panel will now always render markdown documentation if available ([#520])
    - the implementation re-renders the panel as it is the best we can do until [jupyterlab#9663](https://github.com/jupyterlab/jupyterlab/pull/9663) is merged
  - the completer now uses `filterText` and `sortText` if available to better filter and sort completions ([#520], [#523])
  - completer `suppressInvokeIn` setting was removed; `suppressContinuousHintingIn` and `suppressTriggerCharacterIn` settings were added ([#521])
  - `suppressContinuousHintingIn` by default includes `def` to improve the experience when writing function names ([#521])
  - long file paths are now collapsed if composed of more than two segments to avoid status popover and diagnostics panel getting too wide ([#524])

- bug fixes:

  - user-invoked completion in strings works again ([#521])
  - completer documentation will now consistently show up after filtering the completion items ([#520])
  - completions containing HTML-like syntax will be displayed properly (an upstream issue) ([#520], [#523])
  - diagnostics panel will no longer break when foreign documents (e.g. `%%R` cell magics) are removed ([#522])

[#520]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/520
[#521]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/521
[#522]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/522
[#523]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/523
[#524]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/524

### `@krassowski/jupyterlab-lsp 3.3.1` (2021-02-07)

- bug fixes:

  - completion and signature suggestions get invalidated when editor changes ([#507])
  - signature suggestions now invalidate on cursor move to another line or backwards too ([#507])
  - LaTeX is now rendered in documentation panel of completer ([#506])
  - completion response returned as plain text use pre tag to retain whitespace formatting ([#506])
  - pre-formatted code font size was reduced to match font-size of the text in completion panel ([#506])
  - completer no longer spans the entire screen if it has long entries ([#506])

[#506]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/506
[#507]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/507
[#508]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/508

### `jupyter-lsp 1.1.3` (2020-02-07)

- features:

  - add config for the classic notebook server extension ([#504])

[#504]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/504

### `@krassowski/jupyterlab-lsp 3.3.0` (2021-01-31)

- features:

  - added a timeout for kernel completion, with the default of 600ms ([#496])
  - added an option to skip waiting for kernel completions if busy, off by default ([#496])

- bug fixes:

  - delayed completion suggestions will no longer show up if cursor moved to another line ([#496])
  - changes in notebooks after kernel restart or file rename will now be recorded by the language server again ([#496])
  - when either of kernel providers: kernel or LSP server fails, the completion from the other will still be shown ([#496])

[#496]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/496

### `jupyter-lsp 1.1.2` (2021-01-31)

- bug fixes:

  - fixed issues with language server messages being truncated in certain circumstances on Windows

[#494]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/494

### `@krassowski/jupyterlab-lsp 3.2.0` (2021-01-24)

- features:

  - documentation panel in completer now works for R language too: implemented `completionItem/resolve` ([#487])
  - kernel types returned by IPython and IJulia are now mapped to LSP types; you can customize the mappings in settings ([#487])

- bug fixes:

  - diagnostics panel works after kernel restart properly ([#485])
  - workaround was added to enable `jedi-language-server` diagnostics ([#485])
  - Julia language server will not crash when saving a non-Julia file: fixed sendSaved notification scope ([#491])

### `jupyter-lsp 1.1.1` (2021-01-24)

- bug fixes:

  - `PythonModuleSpec` no longer raises exception when the server module does not exist ([#485])

[#485]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/485
[#487]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/487
[#491]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/491

### `@krassowski/jupyterlab-lsp 3.1.0` (2021-01-17)

- features

  - make the extension work with `jupyterlab-classic` - experimental, not all features are functional yet ([#465])
  - new status "Server extension missing" and a dialog with advice was added to help users with atypical configurations ([#476])
  - for developers: the verbosity of console logs is now controllable from settings and set to warn by default ([#480])

- bug fixes:

  - namespace completions in R (after double and triple colon) now work properly ([#449])
  - improved status icon contrast when status item is active ([#465])
  - connection manager now properly keeps track of notebooks when multiple notebooks are open ([#474])
  - new cells added after kernel restart now work properly; kernel changes are handled correctly ([#478])
  - increase total timeout for language server connection ([#479])
  - fix status communication during initialization ([#479])

[#449]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/449
[#465]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/465
[#474]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/474
[#476]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/476
[#478]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/478
[#479]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/479
[#480]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/480

### `jupyter-lsp 1.1.0` (2021-01-17)

- features

  - added experimental detection of Julia and Jedi language servers ([#481])

- bug fixes:

  - send periodic pings on websocket channels to maintain connection ([#459], thanks @franckchen)
  - R languageserver is no longer incorrectly shown as available when not installed ([#463])
  - fix completion of very large namespaces (e.g. in R's base or in JavaScript) due to truncated message relay ([#477])

[#459]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/459
[#463]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/463
[#477]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/477
[#481]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/481

### `@krassowski/jupyterlab-lsp 3.0.0` (2021-01-06)

- features

  - support for JupyterLab 3.0 ([#452], [#402])

### `jupyter-lsp 1.0.0` (2021-01-06)

- features

  - support for JupyterLab 3.0 ([#452], [#402])

[#402]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/402
[#452]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/452

### `@krassowski/jupyterlab-lsp 2.1.2` (2021-01-02)

- features

  - highlights can now be auto-removed from the cells/editors on blur (set `removeOnBlur` to `true` in settings) ([#446])

- bug fixes
  - improved performance of completion and highlights by minimising the number of highlight requests and GUI redraws (token checking, debouncing, acting on a single response only) ([#433])
  - highlights now update after cell focus/blur events even if those do not trigger cursor movement ([#433])
  - trigger characters auto-invoke now works in continuous hinting mode again ([#434])

[#433]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/433
[#434]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/434
[#446]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/446

### `@krassowski/jupyterlab-lsp 2.1.1` (2020-12-15)

- bug fixes

  - fix crash "blank screen" caused by Mac command character included in jump-to schema file ([#429])

[#429]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/429

### `jupyter-lsp 0.9.3` (2020-12-13)

- features

  - the virtual documents' folder can be configured with `JP_LSP_VIRTUAL_DIR` or
    `LanguageServerManager.virtual_documents_dir`, with a potential benefit for
    JupyterHub installations (the default value remains _contents.root_dir_ / `.virtual_documents`)
    ([#416], thanks @fcollonval)

[#416]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/416

### `@krassowski/jupyterlab-lsp 2.1.0` (2020-12-13)

- features

  - added "click to jump" functionality (by default using Alt modifier) ([#423])
  - added "jump back" command, by default activated with Alt + o ([#423])
  - `.virtual_documents` location can now be customized ([#416])
  - tokens are now exported making them available for import from other extensions ([#414], thanks @martinRenou)

- bug fixes

  - context menu commands are now correctly registered where previously specific conditions were leading to race conditions ([#399], thanks @mnowacki-b)
  - handles characters that need escaping (spaces, non-ASCII characters) more
    robustly in files and folder names ([#403], thanks @bollwyvl and @avaissi)
  - moving cells now triggers the document update immediately leading to immediate diagnostics update ([#421])
  - changing cell type to `raw` or `markdown` and then back to `code` properly unbinds/binds event handlers and updates document ([#421])
  - pasted cells are added to the LSP document immediately, without the need for the user to enter them ([#421])
  - improved error message when language server cannot be found ([#413], thanks @martinRenou)
  - developer documentation got improved ([#412], thanks @karlaspuldaro)

[#399]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/399
[#403]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/403
[#412]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/412
[#413]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/413
[#414]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/414
[#421]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/421

### `@krassowski/code-jumpers 1.0.0` (2020-12-13)

- breaking changes
  - split away from `@krassowski/jupyterlab_go_to_definition`, renamed to `@krassowski/code-jumpers` ([#423]):
    - removed unused code
    - refactored history operations to track files and always use global location data
  - renamed `uri` to `contents_path` to help avoid programmer issues
    with characters requiring URI encoding ([#406])

[#406]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/406
[#423]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/423

### `@krassowski/jupyterlab-lsp 2.0.8` (2020-10-25)

- bug fixes

  - custom cell syntax highlighting is now properly removed when no longer needed ([#387])
  - the completer in continuous hinting now works well with the pasted text ([#389])
  - continuous hinting suggestions will no longer show up if the only hint is the same as the current token ([#391])
  - available options for hover modifier keys are now listed in the setting descriptions ([#377])

[#377]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/377
[#387]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/387
[#389]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/389
[#391]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/391

### `@krassowski/jupyterlab-lsp 2.0.7` (2020-09-18)

- bug fixes

  - fix syntax highlighting in hover tooltips and reduce unnecessary padding and margin ([#363])
  - greatly improve performance of hover action ([#363])
  - improve support for expanded hovers tooltips using deprecated API ([#363])
  - do not hide hover tooltips too eagerly (allowing selecting text/easy scrolling of longer tooltips) ([#363])

[#363]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/363

### `@krassowski/jupyterlab-lsp 2.0.6` (2020-09-15)

- bug fixes

  - fix syntax highlighting of %%language cells slowing down editing in notebooks ([#361])

[#361]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/361

### `@krassowski/jupyterlab-lsp 2.0.5` (2020-09-11)

- bug fixes

  - fix too aggressive overrides of IPython's pinfo (`?`) and pinfo2 (`??`) ([#352])

[#352]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/352

### `@krassowski/jupyterlab-lsp 2.0.4` (2020-09-11)

- bug fixes

  - improve code overrides for IPython line magics ([#346])
  - implement missing code overrides for IPython's pinfo (`?`) and pinfo2 (`??`) syntactic sugar ([#346])

[#346]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/346

### `@krassowski/jupyterlab-lsp 2.0.2` (2020-09-07)

- bug fixes

  - fix code overrides not being registered properly ([#340])

[#340]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/340

### `@krassowski/jupyterlab-lsp 2.0.1` (2020-09-07)

- bug fixes

  - bump version of `lsp-ws-connection` dependency to fix the LaTeX server issues (see [#337])

[#337]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/337

### `jupyter-lsp 0.9.2` (2020-09-03)

- autodetects the `sql` language server for `.sql` files ([#328][])
  - diagnostics are provided by `sqlint` which requires Node 11+
    to work well (in contrast to currently required Node 10+).

[#328]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/328

### `@krassowski/jupyterlab-lsp 2.0.0` (2020-09-03)

- features

  - support for JupyterLab 2.2 ([#301][])
  - completer now displays server-provided documentation,
    and a kernel icon for kernel suggestions without type information ([#301][])
  - add two icons themes for the completer (material and vscode) ([#322])
  - the documentation by the completer can be turned on or off ([#315])
  - continuous hinting (Hinterland mode) can be enabled in settings ([#315])
  - tokens in which the completer should not be triggered can be changed ([#315])
  - configuration for the following features is now exposed in the settings editor ([#318]):
    - diagnostics (display, filtering)
    - hover (modifier key)
  - rename operation status reporting got improved ([#318])
  - replaced the generic status icons with code check icon (coloured differently according to the status) ([#318])
  - added icons for all the features and their commands ([#318])
  - refactored the codebase with a new architecture which allows dynamic features, document widget adapter, and code editor registration ([#318])
  - the document in the connections list in the statusbar popover are now represented by easy-to-understand DocumentLocator (breadcrumbs) widget rather than an internal id ([bacc006])
  - syntax highlighting mode is adjusted to the language with the majority of the code in an editor ([#319])
  - copy diagnostics message and filter diagnostics from context menu of Diagnostic Panel ([#330])

- bug fixes

  - path-autocompletion issues were resolved upstream and this release adopts these changes
  - the missing caret and document connection icons were restored in the statusbar popover ([#318])
  - pressing "Cancel" rename during rename now correctly aborts the rename operation ([#318])
  - when a language server for a foreign document is not available an explanation is displayed (rather than the "Connecting..." status as before) ([4e5b2ad])
  - when jump target is not found a message is now shown instead of raising an exception ([00448d0])
  - fixed status message expiration and replacement ([8798f2d]), ([#329])
  - fixed some context command rank issues introduced after an attempt of migration to nulls ([#318])

[#301]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/301
[#315]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/315
[#318]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/318
[#319]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/319
[#322]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/322
[#329]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/329
[#330]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/330
[00448d0]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/318/commits/00448d0c55e7f9a1e7e0a5322f17610daac47dfe
[bacc006]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/318/commits/bacc0066da0727ff7397574914bf0401e4d8f7cb
[4e5b2ad]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/318/commits/4e5b2adf655120458cc8be4b453fe9a78c98e061
[8798f2d]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/318/commits/8798f2dcfd28da10a2b8d8f648974111caa52307

### `@krassowski/jupyterlab-lsp 1.1.2` (2020-08-05)

- bug fixes

  - emits console warnings instead of throwing errors in hover handlers and connections ([#299][], [#300][])
  - improve URL checks in message handling to enable LaTeX diagnostics to work when configured ([#288][])

[#299]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/299
[#300]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/300

### `jupyter-lsp 0.9.1` (2020-08-05)

- autodetects the `texlab` language server for `.tex` files ([#288][])
  - diagnostics _should_ be provided by `chktex` on save, but don't yet appear,
    but can be configured through the Advanced Settings Editor to appear on save or change

[#288]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/288

### `@krassowski/jupyterlab-lsp 1.1.0` (2020-07-20)

- features

  - language servers can now be configured from the Advanced Settings Editor ([#245][])

- bug fixes

  - fixes currently-highlighted token in dark editor themes against light lab theme
    (and vice versa) ([#195][])
  - restores sorting order-indicating caret icons in diagnostics panel table ([#261][])
  - handles document open and change operation ordering more predictably ([#284][])
  - fixes some pyflakes issues caused by line magics substitution ([#293][])
  - updated the link to the documentation of language servers ([#294][])

[#195]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/195
[#261]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/261
[#293]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/293
[#294]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/294

### `jupyter-lsp 0.9.0` (2020-07-20)

- features

  - language servers can now be configured from the Advanced Settings Editor ([#245][])

- bug fixes

  - handles document open and change operation ordering more predictably ([#284][])

### `lsp-ws-connection 0.5.0` (2020-07-20)

- features

  - language servers can now be configured from the Advanced Settings Editor ([#245][])

- bug fixes

  - handles document open and change operation ordering more predictably ([#284][])

[#245]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/245
[#284]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/284

### `@krassowski/jupyterlab-lsp 1.0.0` (2020-03-14)

- features

  - supports JupyterLab 2.0

### `@krassowski/jupyterlab_go_to_definition 1.0.0` (2020-03-14)

- features

  - supports JupyterLab 2.0

### `@krassowski/jupyterlab-lsp 0.8.0` (2020-03-12)

- features

  - opens a maximum of one WebSocket per language server ([#165][], [#199][])
  - lazy-loads language server protocol machinery ([#165][])
  - waits much longer for slow-starting language servers ([#165][])
  - cleans up documents, handlers, events, and signals more aggressively ([#165][])
  - ignores malformed diagnostic ranges, enabling markdown support ([#165][])
  - passes tests on Python 3.8 on Windows ([#165][])
  - improves support for rpy2 magic cells with parameters (
    [#206](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/206)
    )

- bug fixes

  - reports files are open only after installing all handlers to avoid missing messages ([#201][])

[#201]: https://github.com/jupyter-lsp/jupyterlab-lsp/issues/201

### `lsp-ws-connection 0.4.0` (2020-03-12)

- breaking changes

  - no longer assumes one document per connection ([#165][])
  - requires documents be opened explicitly ([#165][])
  - use of the `eventEmitter` pattern mostly deprecated in favor of `Promise`s
    ([#165][])

[#165]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/165

### `jupyter-lsp 0.8.0` (2020-03-12)

- breaking changes

  - websockets are now serviced by implementation key, rather than language
    under `lsp/ws/<server key>` ([#199][])
  - introduces schema version `2`, reporting status by server at `lsp/status` ([#199][])

- bugfixes:
  - handles language server reading/writing and shadow file operations in threads ([#199][])

[#199]: https://github.com/jupyter-lsp/jupyterlab-lsp/pull/199

### `jupyter-lsp 0.7.0`

- bugfixes
  - didSave no longer causes unwanted messages in logs (
    [#187](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/187)
    )

### `@krassowski/jupyterlab-lsp 0.7.1`

- features

  - users can now choose which columns to display
    in the diagnostic panel, using a context menu action (
    [#159](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/159)
    )
  - start the diagnostics panel docked at the bottom and improve
    the re-spawning of the diagnostics panel (
    [#166](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/166)
    )

- bugfixes

  - fixed various small bugs in the completer (
    [#162](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/162)
    )
  - fix documentation display in signature for LSP servers which
    return MarkupContent (
    [#164](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/164)
    )

### `lsp-ws-connection 0.3.1`

- added `sendSaved()` method (textDocument/didSave) (
  [#147](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/147)
  )
- fixed `getSignatureHelp()` off-by-one error (
  [#140](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/140)
  )

### `@krassowski/jupyterlab-lsp 0.7.0`

- features

  - reduced space taken up by the statusbar indicator (
    [#106](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/106)
    )
  - implemented statusbar popover with connections statuses (
    [#106](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/106)
    )
  - generates types for server data responses from JSON schema (
    [#110](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/110)
    )
  - added 'rename' function for notebooks, using shadow filesystem (
    [#115](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/115)
    )
  - added a UX workaround for rope rename issues when there is a
    SyntaxError in the Python code (
    [#127](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/127)
    )
  - added a widget panel with diagnostics (inspections), allowing to
    sort and explore diagnostics, and to go to the respective location
    in code (with a click); accessible from the context menu (
    [#129](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/129)
    )
  - all commands are now accessible from the command palette (
    [#142](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/142)
    )
  - bash LSP now also covers `%%bash` magic cell in addition to `%%sh` (
    [#144](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/144)
    )
  - rpy2 magics received enhanced support for argument parsing
    in both parent Python document (re-written overrides) and
    exctracted R documents (improved foreign code extractor) (
    [#148](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/148),
    [#153](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/153)
    )
  - console logs can now easily be redirected to a floating console
    windows for debugging of the browser tests (see CONTRIBUTING.md)

- bugfixes
  - diagnostics in foreign documents are now correctly updated (
    [133fd3d](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/129/commits/133fd3d71401c7e5affc0a8637ee157de65bef62)
    )
  - diagnostics are now always correctly displayed in the document they were intended for
  - the workaround for relative root path is now also applied on Mac (
    [#139](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/139)
    )
  - fixed LSP of R in Python (`%%R` magic cell from rpy2) (
    [#144](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/144)
    )
  - completion now work properly when the kernel is shut down (
    [#146](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/146)
    )
  - a lowercase completion option selected from an uppercase token
    will now correctly substitute the incomplete token (
    [#143](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/143)
    )
  - `didSave()` is emitted on file save, enabling the workaround
    used by R language server to lazily load `library(tidyverse)` (
    [#95](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/95),
    [#147](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/147),
    )
  - signature feature is now correctly working in notebooks (
    [#140](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/140)
    )

### `lsp-ws-connection 0.3.0`

- infrastructure
  - brought into monorepo [#107](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/107)
- dev
  - allows `initializeParams` to be overloaded by subclasses
  - adopts
    - typescript 3.7
    - prettier
    - tslint
  - added initialization checks before executing sendChange to comply
    with LSP specs [#115](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/115)

### `jupyter-lsp 0.7.0b0`

- features
  - adds a language server status endpoint (
    [#81](https://github.com/jupyter-lsp/jupyterlab-lsp/pull/81)
    )
  - adds more descriptive information to the language server spec (
    [#90](https://github.com/jupyter-lsp/jupyterlab-lsp/pulls/100)
    )
  - adds an extensible listener API (
    [#99](https://github.com/jupyter-lsp/jupyterlab-lsp/issues/99),
    [#100](https://github.com/jupyter-lsp/jupyterlab-lsp/pulls/100)
    )

### `@krassowski/jupyterlab-lsp 0.6.1`

- features
  - adds an indicator to the statusbar
  - and many other improvements, see the [release notes](https://github.com/jupyter-lsp/jupyterlab-lsp/releases/tag/v0.6.1)
- dependencies
  - removes unused npm dependencies

### `@krassowski/jupyterlab-lsp 0.6.0`

- features
  - allows "rename" action in file editor
- bugfixes
  - handles some non-standard diagnostic responses
- testing
  - adds browser-based testing for file editor
- dependencies
  - requires `jupyter-lsp`

### `jupyter-lsp 0.6.0b0`

- features
  - starts language servers on demand
  - accepts configuration via Jupyter config system (traitlets) and python
    `entry_point`s
  - autodetects language servers for bash, CSS, LESS, SASS, Dockerfile, YAML, JS,
    TypeScript, JSX, TSX, JSON, YAML

repository: krassowski/jupyterlab-lsp

repo_name: krassowski/jupyterlab-lsp


text:
# Blazor Server Size with Service Stack

.NET Core 3.1 Blazor Server Size with Service Stack

Based on [selfhost template](https://github.com/NetCoreTemplates/selfhost)

This Template is pre configured to work with ServiceStack, it provide an extension method which allow you to make authenticated call using a ServiceStack client.

This project use ServiceStack integrated authentication bridged over asp.net auth, so it can work seamless with asp.net core.

As an example i have converted the Forecast Service class in a ServiceStack Service which require authentication, so when you navigate to Fetch Data page it require you to login with the sample user.

![](https://raw.githubusercontent.com/nukedbit/blazor-servicestack/master/blazor-servicestack.jpg)

> Browse [source code]https://github.com/nukedbit/blazor-servicestack/), and install with [dotnet-new](https://docs.servicestack.net/dotnet-new):

    $ dotnet tool install -g x

    $ x new nukedbit/blazor-servicestack ProjectName

repository: nukedbit/blazor-servicestack

gha_language: C#

repo_name: nukedbit/blazor-servicestack


text:
# GreenProxy
Simple http proxy example

See the following link for instructions to start a new GreenLightning project.
https://github.com/oci-pronghorn/GreenLighter

repository: oci-pronghorn/GreenProxy

gha_language: Java

repo_name: oci-pronghorn/GreenProxy


text:
# Getting start with API application development
Go is very good for developing API applications which I think is the biggest strength compare to other dynamic languages. Beego provides powerful and quick setup tool for developing API applications, which gives you more focus on business logic.

## Quick setup
bee can setup a API application very quick by executing commands under any `$GOPATH/src`.

`bee api beeapi`

## Application directory structure

 ```
├── conf
│   └── app.conf
├── controllers
│   └── default.go
├── models
│    └── object.go
└── main.go
```

## Source code explanation

- app.conf has following configuration options for your API applications:

	- autorender = false  // Disable auto-render since API applications don't need.
	- copyrequestbody = true  // RESTFul applications sends raw body instead of form, so we need to read body specifically.

- main.go is for registering routers of RESTFul.

		beego.RESTRouter("/object", &controllers.ObejctController{})

Match rules as follows:

	URL						HTTP Verb					Functionality

	/object					POST						Creating Objects

	/object/objectId		GET						Retrieving Objects

	/object/objectId		PUT							Updating Objects

	/object					GET							Queries

	/object/objectId		DELETE						Deleting Objects

- ObejctController implemented corresponding methods:

	type ObejctController struct {
		beego.Controller
	}

	func (this *ObejctController) Post(){

	}

	func (this *ObejctController) Get(){

	}

	func (this *ObejctController) Put(){

	}

	func (this *ObejctController) Delete(){

	}

- models implemented corresponding object operation for adding, deleting, updating and getting.

## Test

- Add a new object:

		curl -X POST -d '{"Score":1337,"PlayerName":"Sean Plott"}' http://<IP_ADDRESS>:8080/object

	Returns a corresponding objectID:astaxie1373349756660423900

- Query a object:

	`curl -X GET http://<IP_ADDRESS>:8080/object/astaxie1373349756660423900`

- Query all objects:

	`curl -X GET http://<IP_ADDRESS>:8080/object`

- Update a object:

	`curl -X PUT -d '{"Score":10000}'http://<IP_ADDRESS>:8080/object/astaxie1373349756660423900`

- Delete a object:

	`curl -X DELETE http://<IP_ADDRESS>:8080/object/astaxie1373349756660423900`

repository: ChimeraCoder/golang-stuff

repo_name: ChimeraCoder/golang-stuff


text:
![Build](https://dev.azure.com/smalltalker/SubcaseMonitor/_apis/build/status/Continuous%20Integration)
![Deployment](https://vsrm.dev.azure.com/smalltalker/_apis/public/Release/badge/ebe36ad3-0e8c-4cce-beac-0fdd6f13c497/1/3)

# Support Subcase Visualization

## How to run development environment
* Install .NET Core 3.0 SDK, https://dotnet.microsoft.com/download/dotnet-core/3.0
* `cd Armadillo.Server`
* `dotnet run`
* To run in Linux environment also install the `gss-ntlmssp` package

## Contribution
Feel free to creare issues or pull requests! Staging environment is available at https://subcasemonitor-stage.azurewebsites.net, production is here https://subcasemonitor.com

repository: skalitin/Armadillo

repo_name: skalitin/Armadillo


text:
---
title: 'Package Build Types'
previousText: 'Package Builds'
previousUrl: '/docs/appflow/package/builds'
nextText: 'Generating Credentials'
nextUrl: '/docs/appflow/package/credentials'
---

There are a few different types of builds you can choose for each platform (iOS, Android) that have different
characteristics and requirements.

## Android Build Types
### Debug
Debug type Android builds do not require any signing certificates or security profiles and can be sideloaded directly onto
Android devices.

### Release
Release type Android builds are required if you want to release the `apk` on the Google Play Store. They require creating
[android signing credentials](/docs/appflow/package/credentials#android-credentials) and uploading them to
a `Production` type [security profile](/docs/appflow/package/adding-credentials#uploading-credentials).

## iOS Build Types
### Development
Code Signing with a development type builds allows your app to run on device through Xcode.
Development type iOS builds require [generating signing credentials and a provisioning profile](/docs/appflow/package/credentials#android-credentials) using:
* iOS development provisioning profile
* iOS development signing certificate
and should be stored in a `Development` type [security profile](/docs/appflow/package/adding-credentials#uploading-credentials)

### Ad Hoc
Code Signing with a Ad Hoc type builds allows you to distribute your app to devices specified in the provisioning profile.
And are also needed in order to test push notifications.
Ad Hoc type iOS builds require [generating signing credentials and a provisioning profile](/docs/appflow/package/credentials#android-credentials) using:
* iOS distribution provisioning profile
* iOS production signing certificate
and should be stored in a `Production` type [security profile](/docs/appflow/package/adding-credentials#uploading-credentials)

### App Store
Code Signing with a App Store type builds allows you to distribute you app using Testflight and the App Store.
App Store type iOS builds require [generating signing credentials and a provisioning profile](/docs/appflow/package/credentials#android-credentials) using:
* iOS distribution provisioning profile
* iOS production signing certificate
and should be stored in a `Production` type [security profile](/docs/appflow/package/adding-credentials#uploading-credentials)

### Enterprise

Enterprise iOS builds are only available on our scale plan and require you to have an
  Apple Developer Enterprise Account
  Please contact us if you require this feature.

Code Signing with Enterprise type builds allows you to distribute your app to devices outside of the App Store if you
are building apps for internal use and distribution.
Enterprise type iOS builds require [generating signing credentials and a provisioning profile](/docs/appflow/package/credentials#android-credentials) using:
* iOS distribution provisioning profile
* iOS production signing certificate
and should be stored in a `Production` type [security profile](/docs/appflow/package/adding-credentials#uploading-credentials)

repository: I-am-abdulazeez/ionic-docs

repo_name: I-am-abdulazeez/ionic-docs


text:
---
layout: post
title: Week Twelve
---

1. What did you do this past week?
    I didn't do much for this class last week. Ideally I would've worked on the next stage of the IDB project, but other homework got in the way of that.

2. What's in your way?
    A lack of time. This week is a little chaotic for me cause we need to finish the IDB project and I'll have to work on the last PintOS project because my OS group won't be able to meet much after this week.

3. What will you do next week?
    This upcoming week I will work on finishing the IDB project. Hopefully it won't take too long. So far we've written user stories and talked about we need to do.

My experience in the class:
    Last week we finished talking about databases and moved on to start talking about refactoring. I'm interested in big data, so I enjoy learning about databases. Refactoring is also a pretty important thing in CS, so I’m glad we’re learning about it. When coding, I find that I focus on solving the problem first without regard to beauty or efficiency of code. After all, functionality is the end goal. The issue with this approach though is that I often won't go back and fix things, so I end up with code that isn’t as good as it could be. It’s worth putting in the extra effort along the way to improve the code instead of leaving it all til the end.

On an unrelated note it’s surprising that the semester is almost over! I’m definitely going to appreciate the winter break. I need to sleep for a couple weeks straight.

Tip of the week:
[Here](http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all) is a website where you can practice querying a database. It doesn’t list the models, which makes it a little cumbersome to work with, but it’s a good way to test out what we’ve learned in class.

[When to refactor](http://blog.codeclimate.com/blog/2014/01/09/when-is-it-time-to-refactor/)

Laugh of the week: [Rescuing a princess using various programming languages](https://toggl.com/programming-princess)