diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index c074ed50eee..e8b44180f9e 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -0fa08d953e0d5497fe5366836d0ed54b9ff557d8 +31ea786fbf0a7874b44efcb1f8b43bc4536d9b7e diff --git a/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js b/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js index 312ab88de4a..5eda0ff8b1a 100644 --- a/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js +++ b/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js @@ -21,7 +21,7 @@ import { Mark } from 'prosemirror-model'; import { visitParents, SKIP } from 'unist-util-visit-parents'; -import { isFunction, isString, noop } from 'lodash'; +import { isFunction, isString, noop, mapValues } from 'lodash'; const NO_ATTRIBUTES = {}; @@ -73,28 +73,47 @@ function createSourceMapAttributes(hastNode, markdown) { } /** - * Compute ProseMirror node’s attributes from a Hast node. - * By default, this function includes sourcemap position - * information in the object returned. + * Creates a function that resolves the attributes + * of a ProseMirror node based on a hast node. * - * Other attributes are retrieved by invoking a getAttrs - * function provided by the ProseMirror node factory spec. - * - * @param {*} proseMirrorNodeSpec ProseMirror node spec object - * @param {HastNode} hastNode A hast node - * @param {Array} hastParents All the ancestors of the hastNode - * @param {String} markdown Markdown source file’s content - * - * @returns An object that contains a ProseMirror node’s attributes + * @param {Object} params Parameters + * @param {String} params.markdown Markdown source from which the AST was generated + * @param {Object} params.attributeTransformer An object that allows applying a transformation + * function to all the attributes listed in the attributes property. + * @param {Array} params.attributeTransformer.attributes A list of attributes names + * that the getAttrs function should apply the transformation + * @param {Function} params.attributeTransformer.transform A function that applies + * a transform operation on an attribute value. + * @returns A `getAttrs` function */ -function getAttrs(proseMirrorNodeSpec, hastNode, hastParents, markdown) { - const { getAttrs: specGetAttrs } = proseMirrorNodeSpec; +const getAttrsFactory = ({ attributeTransformer, markdown }) => + /** + * Compute ProseMirror node’s attributes from a Hast node. + * By default, this function includes sourcemap position + * information in the object returned. + * + * Other attributes are retrieved by invoking a getAttrs + * function provided by the ProseMirror node factory spec. + * + * @param {Object} proseMirrorNodeSpec ProseMirror node spec object + * @param {Object} hastNode A hast node + * @param {Array} hastParents All the ancestors of the hastNode + * @param {String} markdown Markdown source file’s content + * @returns An object that contains a ProseMirror node’s attributes + */ + function getAttrs(proseMirrorNodeSpec, hastNode, hastParents) { + const { getAttrs: specGetAttrs } = proseMirrorNodeSpec; + const attributes = { + ...createSourceMapAttributes(hastNode, markdown), + ...(isFunction(specGetAttrs) ? specGetAttrs(hastNode, hastParents, markdown) : {}), + }; - return { - ...createSourceMapAttributes(hastNode, markdown), - ...(isFunction(specGetAttrs) ? specGetAttrs(hastNode, hastParents, markdown) : {}), + return mapValues(attributes, (value, key) => + attributeTransformer.attributes.includes(key) + ? attributeTransformer.transform(value, key) + : value, + ); }; -} /** * Keeps track of the Hast -> ProseMirror conversion process. @@ -322,7 +341,13 @@ class HastToProseMirrorConverterState { * * @returns An object that contains ProseMirror node factories */ -const createProseMirrorNodeFactories = (schema, proseMirrorFactorySpecs, markdown) => { +const createProseMirrorNodeFactories = ( + schema, + proseMirrorFactorySpecs, + attributeTransformer, + markdown, +) => { + const getAttrs = getAttrsFactory({ attributeTransformer, markdown }); const factories = { root: { selector: 'root', @@ -355,20 +380,20 @@ const createProseMirrorNodeFactories = (schema, proseMirrorFactorySpecs, markdow const nodeType = schema.nodeType(proseMirrorName); state.closeUntil(parent); - state.openNode(nodeType, hastNode, getAttrs(factory, hastNode, parent, markdown), factory); + state.openNode(nodeType, hastNode, getAttrs(factory, hastNode, parent), factory); }; } else if (factory.type === 'inline') { const nodeType = schema.nodeType(proseMirrorName); factory.handle = (state, hastNode, parent) => { state.closeUntil(parent); - state.openNode(nodeType, hastNode, getAttrs(factory, hastNode, parent, markdown), factory); + state.openNode(nodeType, hastNode, getAttrs(factory, hastNode, parent), factory); // Inline nodes do not have children therefore they are immediately closed state.closeNode(); }; } else if (factory.type === 'mark') { const markType = schema.marks[proseMirrorName]; factory.handle = (state, hastNode, parent) => { - state.openMark(markType, hastNode, getAttrs(factory, hastNode, parent, markdown), factory); + state.openMark(markType, hastNode, getAttrs(factory, hastNode, parent), factory); }; } else if (factory.type === 'ignore') { factory.handle = noop; @@ -581,9 +606,15 @@ export const createProseMirrorDocFromMdastTree = ({ factorySpecs, wrappableTags, tree, + attributeTransformer, markdown, }) => { - const proseMirrorNodeFactories = createProseMirrorNodeFactories(schema, factorySpecs, markdown); + const proseMirrorNodeFactories = createProseMirrorNodeFactories( + schema, + factorySpecs, + attributeTransformer, + markdown, + ); const state = new HastToProseMirrorConverterState(); visitParents(tree, (hastNode, ancestors) => { diff --git a/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js b/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js index e38be672063..b9203daf0e8 100644 --- a/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js +++ b/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js @@ -125,6 +125,7 @@ const factorySpecs = { selector: 'img', getAttrs: (hastNode) => ({ src: hastNode.properties.src, + canonicalSrc: hastNode.properties.src, title: hastNode.properties.title, alt: hastNode.properties.alt, }), @@ -154,6 +155,7 @@ const factorySpecs = { type: 'mark', selector: 'a', getAttrs: (hastNode) => ({ + canonicalSrc: hastNode.properties.href, href: hastNode.properties.href, title: hastNode.properties.title, }), @@ -182,6 +184,31 @@ const factorySpecs = { }, }; +const resolveUrl = (url) => { + try { + return new URL(url, window.location.origin).toString(); + } catch { + return null; + } +}; + +const attributeTransformer = { + attributes: ['href', 'src'], + transform: (url) => { + if (!url) { + return url; + } + + /** + * Resolves a URL if provided. The URL is not resolved against + * the client origin initially to protect the URL protocol + * when it is available, for example, we want to preserve + * mailto and application-specific protocols + */ + return resolveUrl(url); + }, +}; + export default () => { return { deserialize: async ({ schema, markdown }) => { @@ -193,6 +220,7 @@ export default () => { factorySpecs, tree, wrappableTags, + attributeTransformer, markdown, }), skipRendering: ['footnoteReference', 'footnoteDefinition', 'code', 'definition'], diff --git a/app/assets/javascripts/content_editor/services/serialization_helpers.js b/app/assets/javascripts/content_editor/services/serialization_helpers.js index 97bad375aea..3f8019adcf9 100644 --- a/app/assets/javascripts/content_editor/services/serialization_helpers.js +++ b/app/assets/javascripts/content_editor/services/serialization_helpers.js @@ -1,4 +1,5 @@ import { uniq, isString, omit, isFunction } from 'lodash'; +import { removeLastSlashInUrlPath, removeUrlProtocol } from '../../lib/utils/url_utility'; const defaultAttrs = { td: { colspan: 1, rowspan: 1, colwidth: null }, @@ -497,9 +498,7 @@ const linkType = (sourceMarkdown) => { return LINK_HTML; }; -const removeUrlProtocol = (url) => url.replace(/^\w+:\/?\/?/, ''); - -const normalizeUrl = (url) => decodeURIComponent(removeUrlProtocol(url)); +const normalizeUrl = (url) => decodeURIComponent(removeLastSlashInUrlPath(removeUrlProtocol(url))); /** * Validates that the provided URL is well-formed diff --git a/app/assets/javascripts/lib/utils/url_utility.js b/app/assets/javascripts/lib/utils/url_utility.js index 597fa49120b..ca90eee69c7 100644 --- a/app/assets/javascripts/lib/utils/url_utility.js +++ b/app/assets/javascripts/lib/utils/url_utility.js @@ -669,3 +669,27 @@ export function constructWebIDEPath({ webIDEUrl(`/${sourceProjectFullPath}/merge_requests/${iid}`), ); } + +/** + * Examples + * + * http://gitlab.com => gitlab.com + * https://gitlab.com => gitlab.com + * + * @param {String} url + * @returns A url without a protocol / scheme + */ +export const removeUrlProtocol = (url) => url.replace(/^\w+:\/?\/?/, ''); + +/** + * Examples + * + * https://www.gitlab.com/path/ => https://www.gitlab.com/path + * https://www.gitlab.com/?query=search => https://www.gitlab.com?query=search + * https://www.gitlab.com/#fragment => https://www.gitlab.com#fragment + * + * @param {String} url + * @returns A URL that does not have a path that ends with slash + */ +export const removeLastSlashInUrlPath = (url) => + url.replace(/\/$/, '').replace(/\/(\?|#){1}([^/]*)$/, '$1$2'); diff --git a/app/assets/stylesheets/components/rich_content_editor.scss b/app/assets/stylesheets/components/rich_content_editor.scss deleted file mode 100644 index 59bd69955d3..00000000000 --- a/app/assets/stylesheets/components/rich_content_editor.scss +++ /dev/null @@ -1,54 +0,0 @@ -/** -* Overrides styles from ToastUI editor -*/ - -.tui-editor-defaultUI { - - // Toolbar buttons - .tui-editor-defaultUI-toolbar .toolbar-button { - color: $gray-500; - border: 0; - - &:hover, - &:active { - color: $blue-500; - border: 0; - } - } - - // Contextual menu's & popups - .tui-popup-wrapper { - @include gl-overflow-hidden; - @include gl-rounded-base; - @include gl-border-gray-200; - - hr { - @include gl-m-0; - @include gl-bg-gray-200; - } - - button { - @include gl-text-gray-700; - } - } - - /** - * Overrides styles from ToastUI's Code Mirror (markdown mode) editor. - * Toast UI internally overrides some of these using the `.tui-md-` prefix. - * https://codemirror.net/doc/manual.html#styling - */ - - .te-md-container .CodeMirror * { - @include gl-font-monospace; - @include gl-font-size-monospace; - @include gl-line-height-20; - } -} - -/** -* Styling below ensures that YouTube videos are displayed in the editor the same as they would in about.gitlab.com -* https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/main/source/stylesheets/_base.scss#L977 -*/ -.video_container { - padding-bottom: 56.25%; -} diff --git a/app/models/deploy_key.rb b/app/models/deploy_key.rb index f9acd398374..94ac2405f61 100644 --- a/app/models/deploy_key.rb +++ b/app/models/deploy_key.rb @@ -66,4 +66,9 @@ class DeployKey < Key query end + + # This is used for the internal logic of AuditEvents::BuildService. + def impersonated? + false + end end diff --git a/app/models/key.rb b/app/models/key.rb index 9f6029cc5d4..78b0a38bcaa 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -40,6 +40,7 @@ class Key < ApplicationRecord after_destroy :refresh_user_cache alias_attribute :fingerprint_md5, :fingerprint + alias_attribute :name, :title scope :preload_users, -> { preload(:user) } scope :for_user, -> (user) { where(user: user) } diff --git a/app/models/user.rb b/app/models/user.rb index 1bbad2491d9..f9f3de8e127 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1809,12 +1809,8 @@ class User < ApplicationRecord end def attention_requested_open_merge_requests_count(force: false) - if Feature.enabled?(:uncached_mr_attention_requests_count, self) + Rails.cache.fetch(attention_request_cache_key, force: force, expires_in: COUNT_CACHE_VALIDITY_PERIOD) do MergeRequestsFinder.new(self, attention: self.username, state: 'opened', non_archived: true).execute.count - else - Rails.cache.fetch(attention_request_cache_key, force: force, expires_in: COUNT_CACHE_VALIDITY_PERIOD) do - MergeRequestsFinder.new(self, attention: self.username, state: 'opened', non_archived: true).execute.count - end end end diff --git a/config/feature_flags/development/uncached_mr_attention_requests_count.yml b/config/feature_flags/development/audit_event_streaming_git_operations_deploy_key_event.yml similarity index 58% rename from config/feature_flags/development/uncached_mr_attention_requests_count.yml rename to config/feature_flags/development/audit_event_streaming_git_operations_deploy_key_event.yml index 239490ab1c2..026efae1253 100644 --- a/config/feature_flags/development/uncached_mr_attention_requests_count.yml +++ b/config/feature_flags/development/audit_event_streaming_git_operations_deploy_key_event.yml @@ -1,8 +1,8 @@ --- -name: uncached_mr_attention_requests_count -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84145 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357480 -milestone: '14.10' +name: audit_event_streaming_git_operations_deploy_key_event +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/93160 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/368765 +milestone: '15.3' type: development -group: group::code review +group: group::release default_enabled: false diff --git a/doc/administration/audit_event_streaming.md b/doc/administration/audit_event_streaming.md index 32214e6e5de..e2f19b2d45d 100644 --- a/doc/administration/audit_event_streaming.md +++ b/doc/administration/audit_event_streaming.md @@ -336,6 +336,7 @@ Users with at least the Owner role for a group can list event streaming destinat > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332747) in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `audit_event_streaming_git_operations`. Disabled by default. > - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/357211) in GitLab 15.0. > - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/357211) in GitLab 15.1 by default. +> - [Added `details.author_class` field](https://gitlab.com/gitlab-org/gitlab/-/issues/363876) in GitLab 15.3. FLAG: On self-managed GitLab, by default this feature is available. To hide the @@ -377,6 +378,7 @@ Fetch: "entity_type": "Project", "details": { "author_name": "Administrator", + "author_class": "User", "target_id": 29, "target_type": "Project", "target_details": "example-project", @@ -408,6 +410,7 @@ Push: "entity_type": "Project", "details": { "author_name": "Administrator", + "author_class": "User", "target_id": 29, "target_type": "Project", "target_details": "example-project", @@ -429,6 +432,42 @@ Push: } ``` +#### Example payloads for SSH events with Deploy Key + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/363876) in GitLab 15.3 [with a flag](../administration/feature_flags.md) named `audit_event_streaming_git_operations_deploy_key_event`. Disabled by default. + +Fetch: + +```json +{ + "id": 1, + "author_id": -3, + "entity_id": 29, + "entity_type": "Project", + "details": { + "author_name": "deploy-key-name", + "author_class": "DeployKey", + "target_id": 29, + "target_type": "Project", + "target_details": "example-project", + "custom_message": { + "protocol": "ssh", + "action": "git-upload-pack" + }, + "ip_address": "127.0.0.1", + "entity_path": "example-group/example-project" + }, + "ip_address": "127.0.0.1", + "author_name": "deploy-key-name", + "entity_path": "example-group/example-project", + "target_details": "example-project", + "created_at": "2022-07-26T05:43:53.662Z", + "target_type": "Project", + "target_id": 29, + "event_type": "repository_git_operation" +} +``` + ### Example payloads for HTTP and HTTPS events Fetch: @@ -441,6 +480,7 @@ Fetch: "entity_type": "Project", "details": { "author_name": "Administrator", + "author_class": "User", "target_id": 29, "target_type": "Project", "target_details": "example-project", @@ -472,6 +512,7 @@ Push: "entity_type": "Project", "details": { "author_name": "Administrator", + "author_class": "User", "target_id": 29, "target_type": "Project", "target_details": "example-project", @@ -493,6 +534,40 @@ Push: } ``` +#### Example payloads for HTTP and HTTPS events with Deploy Token + +Fetch: + +```json +{ + "id": 1, + "author_id": -2, + "entity_id": 22, + "entity_type": "Project", + "details": { + "author_name": "deploy-token-name", + "author_class": "DeployToken", + "target_id": 22, + "target_type": "Project", + "target_details": "example-project", + "custom_message": { + "protocol": "http", + "action": "git-upload-pack" + }, + "ip_address": "127.0.0.1", + "entity_path": "example-group/example-project" + }, + "ip_address": "127.0.0.1", + "author_name": "deploy-token-name", + "entity_path": "example-group/example-project", + "target_details": "example-project", + "created_at": "2022-07-26T05:46:25.850Z", + "target_type": "Project", + "target_id": 22, + "event_type": "repository_git_operation" +} +``` + ### Example payloads for events from GitLab UI download button Fetch: @@ -506,6 +581,7 @@ Fetch: "details": { "custom_message": "Repository Download Started", "author_name": "example_username", + "author_class": "User", "target_id": 29, "target_type": "Project", "target_details": "example-group/example-project", diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md index 0eb6d853531..b9e17280f98 100644 --- a/doc/user/discussions/index.md +++ b/doc/user/discussions/index.md @@ -49,6 +49,18 @@ to all the members of that project's group. This might be interpreted as spam. Notifications and mentions can be disabled in [a group's settings](../group/manage.md#disable-email-notifications). +### Mention a group in an issue or merge request + +When you mention a group in a comment, every member of the group gets a to-do item +added to their To-do list. + +1. Open the MR or issue. +1. In a comment, type `@` followed by the user, group, or subgroup namespace. + For example, `@alex`, `@alex-team`, or `@alex-team/marketing`. +1. Select **Comment**. + +A to-do item is created for all the group and subgroup members. + ## Add a comment to a merge request diff You can add comments to a merge request diff. These comments diff --git a/doc/user/group/index.md b/doc/user/group/index.md index 3e2672e725d..b8880feb743 100644 --- a/doc/user/group/index.md +++ b/doc/user/group/index.md @@ -48,29 +48,6 @@ For example, consider a user named Alex: | Alex creates a group for their team with the group name `alex-team`. The group and its projects are available at: `https://gitlab.example.com/alex-team`. | The namespace in this case is `alex-team`. | | Alex creates a subgroup of `alex-team` with the subgroup name `marketing`. The subgroup and its projects are available at: `https://gitlab.example.com/alex-team/marketing`. | The namespace in this case is `alex-team/marketing`. | -## Mention a group in an issue or merge request - -When you mention a group in a comment, every member of the group gets a to-do item -added to their To-do list. - -1. Open the MR or issue. -1. In a comment, type `@` followed by the user, group, or subgroup namespace. - For example, `@alex`, `@alex-team`, or `@alex-team/marketing`. -1. Select **Comment**. - -A to-do item is created for all the group and subgroup members. - -## Export members as CSV **(PREMIUM)** - -> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/287940) in GitLab 14.2. -> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/336520) in GitLab 14.5. - -You can export a list of members in a group or subgroup as a CSV. - -1. Go to your group or subgroup and select either **Group information > Members** or **Subgroup information > Members**. -1. Select **Export as CSV**. -1. After the CSV file has been generated, it is emailed as an attachment to the user that requested it. - ## Related topics - [Group wikis](../project/wiki/index.md) diff --git a/doc/user/group/manage.md b/doc/user/group/manage.md index c54d58931dc..b50a41ccf31 100644 --- a/doc/user/group/manage.md +++ b/doc/user/group/manage.md @@ -380,6 +380,17 @@ To disable group mentions: 1. Select **Disable group mentions**. 1. Select **Save changes**. +## Export members as CSV **(PREMIUM)** + +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/287940) in GitLab 14.2. +> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/336520) in GitLab 14.5. + +You can export a list of members in a group or subgroup as a CSV. + +1. Go to your group or subgroup and select either **Group information > Members** or **Subgroup information > Members**. +1. Select **Export as CSV**. +1. After the CSV file has been generated, it is emailed as an attachment to the user that requested it. + ## User cap for groups > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330027) in GitLab 14.7. diff --git a/glfm_specification/example_snapshots/html.yml b/glfm_specification/example_snapshots/html.yml index 105a0d26409..f89f03ecc31 100644 --- a/glfm_specification/example_snapshots/html.yml +++ b/glfm_specification/example_snapshots/html.yml @@ -1682,7 +1682,7 @@ static: |-
*foo*
wysiwyg: |- -

*foo*

+

*foo*

04_06__leaf_blocks__html_blocks__013: canonical: |
@@ -1723,7 +1723,7 @@ *bar* wysiwyg: |- -

+

*bar*

04_06__leaf_blocks__html_blocks__016: @@ -2065,7 +2065,7 @@ baz

wysiwyg: |-

Foo - + baz

04_06__leaf_blocks__html_blocks__040: canonical: | @@ -2145,7 +2145,7 @@

foo

wysiwyg: |-
[foo]: /url "title"
-

foo

+

foo

04_07__leaf_blocks__link_reference_definitions__002: canonical: |

foo

@@ -2153,7 +2153,7 @@

foo

wysiwyg: |-
[foo]: /url "the title"
-

foo

+

foo

04_07__leaf_blocks__link_reference_definitions__003: canonical: |

Foo*bar]

@@ -2161,7 +2161,7 @@

Foo*bar]

wysiwyg: |-
[foo*bar\]]: my_(url) "title (with parens)"
-

Foo*bar]

+

Foo*bar]

04_07__leaf_blocks__link_reference_definitions__004: canonical: |

Foo bar

@@ -2169,7 +2169,7 @@

Foo bar

wysiwyg: |-
[foo bar]: my url "title"
-

Foo bar

+

Foo bar

04_07__leaf_blocks__link_reference_definitions__005: canonical: |

-

foo

+ " canonicalsrc="/url">foo

04_07__leaf_blocks__link_reference_definitions__006: canonical: |

[foo]: /url 'title

@@ -2214,7 +2214,7 @@

foo

wysiwyg: |-
[foo]: /url
-

foo

+

foo

04_07__leaf_blocks__link_reference_definitions__008: canonical: |

[foo]:

@@ -2232,7 +2232,7 @@

foo

wysiwyg: |-
[foo]: 
-

foo

+

foo

04_07__leaf_blocks__link_reference_definitions__010: canonical: |

[foo]: (baz)

@@ -2250,14 +2250,14 @@

foo

wysiwyg: |-
[foo]: /url\bar*baz "foo"bar\baz"
-

foo

+

foo

04_07__leaf_blocks__link_reference_definitions__012: canonical: |

foo

static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: url
04_07__leaf_blocks__link_reference_definitions__013: canonical: | @@ -2265,7 +2265,7 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: first
[foo]: second
04_07__leaf_blocks__link_reference_definitions__014: @@ -2275,7 +2275,7 @@

Foo

wysiwyg: |-
[foo]: /url
-

Foo

+

Foo

04_07__leaf_blocks__link_reference_definitions__015: canonical: |

αγω

@@ -2283,7 +2283,7 @@

αγω

wysiwyg: |-
[αγω]: /φου
-

αγω

+

αγω

04_07__leaf_blocks__link_reference_definitions__016: canonical: "" static: "" @@ -2367,7 +2367,7 @@

bar

wysiwyg: |- -

Foo

+

Foo

[foo]: /url

bar

04_07__leaf_blocks__link_reference_definitions__024: @@ -2381,7 +2381,7 @@ wysiwyg: |-
[foo]: /url

bar

-

foo

+

foo

04_07__leaf_blocks__link_reference_definitions__025: canonical: |

=== @@ -2392,7 +2392,7 @@ wysiwyg: |-

[foo]: /url

=== - foo

+ foo

04_07__leaf_blocks__link_reference_definitions__026: canonical: |

foo, @@ -2406,9 +2406,9 @@

[foo]: /foo-url "foo"
[bar]: /bar-url "bar"
[baz]: /baz-url
-

foo, - bar, - baz

+

foo, + bar, + baz

04_07__leaf_blocks__link_reference_definitions__027: canonical: |

foo

@@ -2419,7 +2419,7 @@
wysiwyg: |- -

foo

+

foo

[foo]: /url
04_07__leaf_blocks__link_reference_definitions__028: canonical: "" @@ -4883,7 +4883,7 @@ static: |-

http://example.com?find=\*

wysiwyg: |- -

http://example.com?find=\*

+

http://example.com?find=\*

06_02__inlines__backslash_escapes__010: canonical: | @@ -4897,14 +4897,14 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

06_02__inlines__backslash_escapes__012: canonical: |

foo

static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: /bar* "ti*tle"
06_02__inlines__backslash_escapes__013: canonical: | @@ -4987,14 +4987,14 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

06_03__inlines__entity_and_numeric_character_references__009: canonical: |

foo

static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: /föö "föö"
06_03__inlines__entity_and_numeric_character_references__010: canonical: | @@ -5193,7 +5193,7 @@ static: |-

`

wysiwyg: |- -

`

+

`

06_04__inlines__code_spans__018: canonical: |

<http://foo.bar.baz>`

@@ -5207,7 +5207,7 @@ static: |-

http://foo.bar.`baz`

wysiwyg: |- -

http://foo.bar.`baz`

+

http://foo.bar.`baz`

06_04__inlines__code_spans__020: canonical: |

```foo``

@@ -5615,7 +5615,7 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

06_05__inlines__emphasis_and_strong_emphasis__055: canonical: |

foo @@ -5723,7 +5723,7 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

06_05__inlines__emphasis_and_strong_emphasis__070: canonical: |

** is not an empty emphasis

@@ -5744,7 +5744,7 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

06_05__inlines__emphasis_and_strong_emphasis__073: canonical: |

foo @@ -5827,7 +5827,7 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

06_05__inlines__emphasis_and_strong_emphasis__084: canonical: |

__ is not an empty emphasis

@@ -6107,21 +6107,21 @@ static: |-

*bar*

wysiwyg: |- -

*bar*

+

*bar*

06_05__inlines__emphasis_and_strong_emphasis__124: canonical: |

_foo bar_

static: |-

_foo bar_

wysiwyg: |- -

_foo bar_

+

_foo bar_

06_05__inlines__emphasis_and_strong_emphasis__125: canonical: |

*

static: |-

*

wysiwyg: |- -

*

+

*

06_05__inlines__emphasis_and_strong_emphasis__126: canonical: |

**

@@ -6156,14 +6156,14 @@ static: |-

**ahttp://foo.bar/?q=**

wysiwyg: |- -

**ahttp://foo.bar/?q=**

+

**ahttp://foo.bar/?q=**

06_05__inlines__emphasis_and_strong_emphasis__131: canonical: |

__ahttp://foo.bar/?q=__

static: |-

__ahttp://foo.bar/?q=__

wysiwyg: |- -

__ahttp://foo.bar/?q=__

+

__ahttp://foo.bar/?q=__

06_06__inlines__strikethrough_extension__001: canonical: |

Hi Hello, world!

@@ -6187,28 +6187,28 @@ static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__002: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__003: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__004: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__005: canonical: |

[link](/my uri)

@@ -6222,7 +6222,7 @@ static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__007: canonical: |

[link](foo @@ -6247,7 +6247,7 @@ static: |-

a

wysiwyg: |- -

a

+

a

06_07__inlines__links__010: canonical: |

[link](<foo>)

@@ -6274,35 +6274,35 @@ static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__013: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__014: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__015: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__016: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__017: canonical: |

link

@@ -6313,30 +6313,30 @@

link

link

wysiwyg: |- -

link

-

link

-

link

+

link

+

link

+

link

06_07__inlines__links__018: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__019: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__020: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__021: canonical: |

link @@ -6347,21 +6347,21 @@ link link

wysiwyg: |- -

linklinklink

+

linklinklink

06_07__inlines__links__022: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__023: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__024: canonical: |

[link](/url "title "and" title")

@@ -6375,14 +6375,14 @@ static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__026: canonical: |

link

static: |-

link

wysiwyg: |- -

link

+

link

06_07__inlines__links__027: canonical: |

[link] (/uri)

@@ -6396,7 +6396,7 @@ static: |-

link [foo [bar]]

wysiwyg: |- -

link [foo [bar]]

+

link [foo [bar]]

06_07__inlines__links__029: canonical: |

[link] bar](/uri)

@@ -6410,63 +6410,63 @@ static: |-

[link bar

wysiwyg: |- -

[link bar

+

[link bar

06_07__inlines__links__031: canonical: |

link [bar

static: |-

link [bar

wysiwyg: |- -

link [bar

+

link [bar

06_07__inlines__links__032: canonical: |

link foo bar #

static: |-

link foo bar #

wysiwyg: |- -

link foo bar#

+

link foo bar#

06_07__inlines__links__033: canonical: |

moon

static: |-

moon

wysiwyg: |- -

moon

+

moon

06_07__inlines__links__034: canonical: |

[foo bar](/uri)

static: |-

[foo bar](/uri)

wysiwyg: |- -

[foo bar](/uri)

+

[foo bar](/uri)

06_07__inlines__links__035: canonical: |

[foo [bar baz](/uri)](/uri)

static: |-

[foo [bar baz](/uri)](/uri)

wysiwyg: |- -

[foo [bar baz](/uri)](/uri)

+

[foo [bar baz](/uri)](/uri)

06_07__inlines__links__036: canonical: |

[foo](uri2)

static: |-

[foo](uri2)

wysiwyg: |- -

[foo](uri2)

+

[foo](uri2)

06_07__inlines__links__037: canonical: |

*foo*

static: |-

*foo*

wysiwyg: |- -

*foo*

+

*foo*

06_07__inlines__links__038: canonical: |

foo *bar

static: |-

foo *bar

wysiwyg: |- -

foo *bar

+

foo *bar

06_07__inlines__links__039: canonical: |

foo [bar baz]

@@ -6494,14 +6494,14 @@ static: |-

[foohttp://example.com/?search=](uri)

wysiwyg: |- -

[foohttp://example.com/?search=](uri)

+

[foohttp://example.com/?search=](uri)

06_07__inlines__links__043: canonical: |

foo

static: |-

foo

wysiwyg: |- -

foo

+

foo

[bar]: /url "title"
06_07__inlines__links__044: canonical: | @@ -6509,7 +6509,7 @@ static: |-

link [foo [bar]]

wysiwyg: |- -

link [foo [bar]]

+

link [foo [bar]]

[ref]: /uri
06_07__inlines__links__045: canonical: | @@ -6517,7 +6517,7 @@ static: |-

link [bar

wysiwyg: |- -

link [bar

+

link [bar

[ref]: /uri
06_07__inlines__links__046: canonical: | @@ -6525,7 +6525,7 @@ static: |-

link foo bar #

wysiwyg: |- -

link foo bar#

+

link foo bar#

[ref]: /uri
06_07__inlines__links__047: canonical: | @@ -6533,7 +6533,7 @@ static: |-

moon

wysiwyg: |- -

moon

+

moon

[ref]: /uri
06_07__inlines__links__048: canonical: | @@ -6541,7 +6541,7 @@ static: |-

[foo bar]ref

wysiwyg: |- -

[foo bar]ref

+

[foo bar]ref

[ref]: /uri
06_07__inlines__links__049: canonical: | @@ -6549,7 +6549,7 @@ static: |-

[foo bar baz]ref

wysiwyg: |- -

[foo bar baz]ref

+

[foo bar baz]ref

[ref]: /uri
06_07__inlines__links__050: canonical: | @@ -6557,7 +6557,7 @@ static: |-

*foo*

wysiwyg: |- -

*foo*

+

*foo*

[ref]: /uri
06_07__inlines__links__051: canonical: | @@ -6565,7 +6565,7 @@ static: |-

foo *bar

wysiwyg: |- -

foo *bar

+

foo *bar

[ref]: /uri
06_07__inlines__links__052: canonical: | @@ -6589,7 +6589,7 @@ static: |-

[foohttp://example.com/?search=][ref]

wysiwyg: |- -

[foohttp://example.com/?search=][ref]

+

[foohttp://example.com/?search=][ref]

[ref]: /uri
06_07__inlines__links__055: canonical: | @@ -6597,7 +6597,7 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

[bar]: /url "title"
06_07__inlines__links__056: canonical: | @@ -6605,7 +6605,7 @@ static: |-

Толпой is a Russian word.

wysiwyg: |- -

Толпой is a Russian word.

+

Толпой is a Russian word.

[толпой]: /url
06_07__inlines__links__057: canonical: | @@ -6614,14 +6614,14 @@

Baz

wysiwyg: |-
[foo bar]: /url
-

Baz

+

Baz

06_07__inlines__links__058: canonical: |

[foo] bar

static: |-

[foo] bar

wysiwyg: |- -

[foo] bar

+

[foo] bar

[bar]: /url "title"
06_07__inlines__links__059: canonical: | @@ -6632,7 +6632,7 @@ bar

wysiwyg: |-

[foo] - bar

+ bar

[bar]: /url "title"
06_07__inlines__links__060: canonical: | @@ -6642,7 +6642,7 @@ wysiwyg: |-
[foo]: /url1
[foo]: /url2
-

bar

+

bar

06_07__inlines__links__061: canonical: |

[bar][foo!]

@@ -6687,7 +6687,7 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

[ref\[]: /uri
06_07__inlines__links__066: canonical: | @@ -6696,7 +6696,7 @@

bar\

wysiwyg: |-
[bar\\]: /uri
-

bar\

+

bar\

06_07__inlines__links__067: canonical: |

[]

@@ -6729,7 +6729,7 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: /url "title"
06_07__inlines__links__070: canonical: | @@ -6737,7 +6737,7 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

[*foo* bar]: /url "title"
06_07__inlines__links__071: canonical: | @@ -6745,7 +6745,7 @@ static: |-

Foo

wysiwyg: |- -

Foo

+

Foo

[foo]: /url "title"
06_07__inlines__links__072: canonical: | @@ -6755,7 +6755,7 @@

foo []

wysiwyg: |- -

foo +

foo []

[foo]: /url "title"
06_07__inlines__links__073: @@ -6764,7 +6764,7 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: /url "title"
06_07__inlines__links__074: canonical: | @@ -6772,7 +6772,7 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

[*foo* bar]: /url "title"
06_07__inlines__links__075: canonical: | @@ -6780,7 +6780,7 @@ static: |-

[foo bar]

wysiwyg: |- -

[foo bar]

+

[foo bar]

[*foo* bar]: /url "title"
06_07__inlines__links__076: canonical: | @@ -6788,7 +6788,7 @@ static: |-

[[bar foo

wysiwyg: |- -

[[bar foo

+

[[bar foo

[foo]: /url
06_07__inlines__links__077: canonical: | @@ -6796,7 +6796,7 @@ static: |-

Foo

wysiwyg: |- -

Foo

+

Foo

[foo]: /url "title"
06_07__inlines__links__078: canonical: | @@ -6804,7 +6804,7 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

[foo]: /url
06_07__inlines__links__079: canonical: | @@ -6821,14 +6821,14 @@

*foo*

wysiwyg: |-
[foo*]: /url
-

*foo*

+

*foo*

06_07__inlines__links__081: canonical: |

foo

static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: /url1
[bar]: /url2
06_07__inlines__links__082: @@ -6837,7 +6837,7 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: /url1
06_07__inlines__links__083: canonical: | @@ -6845,7 +6845,7 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: /url1
06_07__inlines__links__084: canonical: | @@ -6853,7 +6853,7 @@ static: |-

foo(not a link)

wysiwyg: |- -

foo(not a link)

+

foo(not a link)

[foo]: /url1
06_07__inlines__links__085: canonical: | @@ -6861,7 +6861,7 @@ static: |-

[foo]bar

wysiwyg: |- -

[foo]bar

+

[foo]bar

[baz]: /url
06_07__inlines__links__086: canonical: | @@ -6869,7 +6869,7 @@ static: |-

foobaz

wysiwyg: |- -

foobaz

+

foobaz

[baz]: /url1
[bar]: /url2
06_07__inlines__links__087: @@ -6878,7 +6878,7 @@ static: |-

[foo]bar

wysiwyg: |- -

[foo]bar

+

[foo]bar

[baz]: /url1
[foo]: /url2
06_08__inlines__images__001: @@ -6887,14 +6887,14 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

06_08__inlines__images__002: canonical: |

foo bar

static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

[foo *bar*]: train.jpg "train & tracks"
06_08__inlines__images__003: canonical: | @@ -6902,21 +6902,21 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

06_08__inlines__images__004: canonical: |

foo bar

static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

06_08__inlines__images__005: canonical: |

foo bar

static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

[foo *bar*]: train.jpg "train & tracks"
06_08__inlines__images__006: canonical: | @@ -6924,7 +6924,7 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

[foobar]: train.jpg "train & tracks"
06_08__inlines__images__007: canonical: | @@ -6932,35 +6932,35 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

06_08__inlines__images__008: canonical: |

My foo bar

static: |-

My foo bar

wysiwyg: |- -

My foo bar

+

My foo bar

06_08__inlines__images__009: canonical: |

foo

static: |-

foo

wysiwyg: |- -

foo

+

foo

06_08__inlines__images__010: canonical: |

static: |-

wysiwyg: |- -

+

06_08__inlines__images__011: canonical: |

foo

static: |-

foo

wysiwyg: |- -

foo

+

foo

[bar]: /url
06_08__inlines__images__012: canonical: | @@ -6968,7 +6968,7 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

[bar]: /url
06_08__inlines__images__013: canonical: | @@ -6976,7 +6976,7 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: /url "title"
06_08__inlines__images__014: canonical: | @@ -6984,7 +6984,7 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

[*foo* bar]: /url "title"
06_08__inlines__images__015: canonical: | @@ -6992,7 +6992,7 @@ static: |-

Foo

wysiwyg: |- -

Foo

+

Foo

[foo]: /url "title"
06_08__inlines__images__016: canonical: | @@ -7002,7 +7002,7 @@

foo []

wysiwyg: |- -

foo +

foo []

[foo]: /url "title"
06_08__inlines__images__017: @@ -7011,7 +7011,7 @@ static: |-

foo

wysiwyg: |- -

foo

+

foo

[foo]: /url "title"
06_08__inlines__images__018: canonical: | @@ -7019,7 +7019,7 @@ static: |-

foo bar

wysiwyg: |- -

foo bar

+

foo bar

[*foo* bar]: /url "title"
06_08__inlines__images__019: canonical: | @@ -7037,7 +7037,7 @@ static: |-

Foo

wysiwyg: |- -

Foo

+

Foo

[foo]: /url "title"
06_08__inlines__images__021: canonical: | @@ -7053,7 +7053,7 @@ static: |-

!foo

wysiwyg: |- -

!foo

+

!foo

[foo]: /url "title"
06_09__inlines__autolinks__001: canonical: | @@ -7061,91 +7061,91 @@ static: |-

http://foo.bar.baz

wysiwyg: |- -

http://foo.bar.baz

+

http://foo.bar.baz

06_09__inlines__autolinks__002: canonical: |

http://foo.bar.baz/test?q=hello&id=22&boolean

static: |-

http://foo.bar.baz/test?q=hello&id=22&boolean

wysiwyg: |- -

http://foo.bar.baz/test?q=hello&id=22&boolean

+

http://foo.bar.baz/test?q=hello&id=22&boolean

06_09__inlines__autolinks__003: canonical: |

irc://foo.bar:2233/baz

static: |-

irc://foo.bar:2233/baz

wysiwyg: |- -

irc://foo.bar:2233/baz

+

irc://foo.bar:2233/baz

06_09__inlines__autolinks__004: canonical: |

MAILTO:FOO@BAR.BAZ

static: |-

MAILTO:FOO@BAR.BAZ

wysiwyg: |- -

MAILTO:FOO@BAR.BAZ

+

MAILTO:FOO@BAR.BAZ

06_09__inlines__autolinks__005: canonical: |

a+b+c:d

static: |-

a+b+c:d

wysiwyg: |- -

a+b+c:d

+

a+b+c:d

06_09__inlines__autolinks__006: canonical: |

made-up-scheme://foo,bar

static: |-

made-up-scheme://foo,bar

wysiwyg: |- -

made-up-scheme://foo,bar

+

made-up-scheme://foo,bar

06_09__inlines__autolinks__007: canonical: |

http://../

static: |-

http://../

wysiwyg: |- -

http://../

+

http://../

06_09__inlines__autolinks__008: canonical: |

localhost:5001/foo

static: |-

localhost:5001/foo

wysiwyg: |- -

localhost:5001/foo

+

localhost:5001/foo

06_09__inlines__autolinks__009: canonical: |

<http://foo.bar/baz bim>

static: |-

<http://foo.bar/baz bim>

wysiwyg: |- -

<http://foo.bar/baz bim>

+

<http://foo.bar/baz bim>

06_09__inlines__autolinks__010: canonical: |

http://example.com/\[\

static: |-

http://example.com/\[\

wysiwyg: |- -

http://example.com/\[\

+

http://example.com/\[\

06_09__inlines__autolinks__011: canonical: |

foo@bar.example.com

static: |-

foo@bar.example.com

wysiwyg: |- -

foo@bar.example.com

+

foo@bar.example.com

06_09__inlines__autolinks__012: canonical: |

foo+special@Bar.baz-bar0.com

static: |-

foo+special@Bar.baz-bar0.com

wysiwyg: |- -

foo+special@Bar.baz-bar0.com

+

foo+special@Bar.baz-bar0.com

06_09__inlines__autolinks__013: canonical: |

<foo+@bar.example.com>

static: |-

<foo+@bar.example.com>

wysiwyg: |- -

<foo+@bar.example.com>

+

<foo+@bar.example.com>

06_09__inlines__autolinks__014: canonical: |

<>

@@ -7159,7 +7159,7 @@ static: |-

< http://foo.bar >

wysiwyg: |- -

< http://foo.bar >

+

< http://foo.bar >

06_09__inlines__autolinks__016: canonical: |

<m:abc>

@@ -7180,28 +7180,28 @@ static: |-

http://example.com

wysiwyg: |- -

http://example.com

+

http://example.com

06_09__inlines__autolinks__019: canonical: |

foo@bar.example.com

static: |-

foo@bar.example.com

wysiwyg: |- -

foo@bar.example.com

+

foo@bar.example.com

06_10__inlines__autolinks_extension__001: canonical: |

www.commonmark.org

static: |-

www.commonmark.org

wysiwyg: |- -

www.commonmark.org

+

www.commonmark.org

06_10__inlines__autolinks_extension__002: canonical: |

Visit www.commonmark.org/help for more information.

static: |-

Visit www.commonmark.org/help for more information.

wysiwyg: |- -

Visit www.commonmark.org/help for more information.

+

Visit www.commonmark.org/help for more information.

06_10__inlines__autolinks_extension__003: canonical: |

Visit www.commonmark.org.

@@ -7210,8 +7210,8 @@

Visit www.commonmark.org.

Visit www.commonmark.org/a.b.

wysiwyg: |- -

Visit www.commonmark.org.

-

Visit www.commonmark.org/a.b.

+

Visit www.commonmark.org.

+

Visit www.commonmark.org/a.b.

06_10__inlines__autolinks_extension__004: canonical: |

www.google.com/search?q=Markup+(business)

@@ -7224,17 +7224,17 @@

(www.google.com/search?q=Markup+(business))

(www.google.com/search?q=Markup+(business)

wysiwyg: |- -

www.google.com/search?q=Markup+(business)

-

www.google.com/search?q=Markup+(business)))

-

(www.google.com/search?q=Markup+(business))

-

(www.google.com/search?q=Markup+(business)

+

www.google.com/search?q=Markup+(business)

+

www.google.com/search?q=Markup+(business)))

+

(www.google.com/search?q=Markup+(business))

+

(www.google.com/search?q=Markup+(business)

06_10__inlines__autolinks_extension__005: canonical: |

www.google.com/search?q=(business))+ok

static: |-

www.google.com/search?q=(business))+ok

wysiwyg: |- -

www.google.com/search?q=(business))+ok

+

www.google.com/search?q=(business))+ok

06_10__inlines__autolinks_extension__006: canonical: |

www.google.com/search?q=commonmark&hl=en

@@ -7243,15 +7243,15 @@

www.google.com/search?q=commonmark&hl=en

www.google.com/search?q=commonmark&hl;

wysiwyg: |- -

www.google.com/search?q=commonmark&hl=en

-

www.google.com/search?q=commonmark&hl;

+

www.google.com/search?q=commonmark&hl=en

+

www.google.com/search?q=commonmark&hl;

06_10__inlines__autolinks_extension__007: canonical: |

www.commonmark.org/he<lp

static: |-

www.commonmark.org/he<lp

wysiwyg: |- -

www.commonmark.org/he<lp

+

www.commonmark.org/he<lp

06_10__inlines__autolinks_extension__008: canonical: |

http://commonmark.org

@@ -7262,8 +7262,8 @@

(Visit https://encrypted.google.com/search?q=Markup+(business))

Anonymous FTP is available at ftp://foo.bar.baz.

wysiwyg: |- -

http://commonmark.org

-

(Visit https://encrypted.google.com/search?q=Markup+(business))

+

http://commonmark.org

+

(Visit https://encrypted.google.com/search?q=Markup+(business))

Anonymous FTP is available at ftp://foo.bar.baz.

06_10__inlines__autolinks_extension__009: canonical: | @@ -7271,14 +7271,14 @@ static: |-

foo@bar.baz

wysiwyg: |- -

foo@bar.baz

+

foo@bar.baz

06_10__inlines__autolinks_extension__010: canonical: |

hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.

static: |-

hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.

wysiwyg: |- -

hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.

+

hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.

06_10__inlines__autolinks_extension__011: canonical: |

a.b-c_d@a.b

@@ -7291,8 +7291,8 @@

a.b-c_d@a.b-

a.b-c_d@a.b_

wysiwyg: |- -

a.b-c_d@a.b

-

a.b-c_d@a.b.

+

a.b-c_d@a.b

+

a.b-c_d@a.b.

a.b-c_d@a.b-

a.b-c_d@a.b_

06_11__inlines__raw_html__001: diff --git a/glfm_specification/example_snapshots/prosemirror_json.yml b/glfm_specification/example_snapshots/prosemirror_json.yml index 7cb4757b368..73fcef4dbc0 100644 --- a/glfm_specification/example_snapshots/prosemirror_json.yml +++ b/glfm_specification/example_snapshots/prosemirror_json.yml @@ -3145,11 +3145,11 @@ { "type": "link", "attrs": { - "href": "bar", + "href": "http://test.host/bar", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "bar" } } ], @@ -3230,11 +3230,11 @@ { "type": "link", "attrs": { - "href": "foo", + "href": "http://test.host/foo", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "foo" } } ], @@ -3748,11 +3748,11 @@ { "type": "link", "attrs": { - "href": "bar", + "href": "http://test.host/bar", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "bar" } } ], @@ -3906,11 +3906,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -3947,11 +3947,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "the title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -3988,11 +3988,11 @@ { "type": "link", "attrs": { - "href": "my_(url)", + "href": "http://test.host/my_(url)", "target": "_blank", "class": null, "title": "title (with parens)", - "canonicalSrc": null + "canonicalSrc": "my_(url)" } } ], @@ -4029,11 +4029,11 @@ { "type": "link", "attrs": { - "href": "my%20url", + "href": "http://test.host/my%20url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "my%20url" } } ], @@ -4070,11 +4070,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "\ntitle\nline1\nline2\n", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -4144,11 +4144,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -4213,7 +4213,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "" } } ], @@ -4274,11 +4274,11 @@ { "type": "link", "attrs": { - "href": "/url%5Cbar*baz", + "href": "http://test.host/url%5Cbar*baz", "target": "_blank", "class": null, "title": "foo\"bar\\baz", - "canonicalSrc": null + "canonicalSrc": "/url%5Cbar*baz" } } ], @@ -4301,11 +4301,11 @@ { "type": "link", "attrs": { - "href": "url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "url" } } ], @@ -4342,11 +4342,11 @@ { "type": "link", "attrs": { - "href": "first", + "href": "http://test.host/first", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "first" } } ], @@ -4411,11 +4411,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -4452,11 +4452,11 @@ { "type": "link", "attrs": { - "href": "/%CF%86%CE%BF%CF%85", + "href": "http://test.host/%CF%86%CE%BF%CF%85", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/%CF%86%CE%BF%CF%85" } } ], @@ -4655,11 +4655,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -4739,11 +4739,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -4784,11 +4784,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -4853,11 +4853,11 @@ { "type": "link", "attrs": { - "href": "/foo-url", + "href": "http://test.host/foo-url", "target": "_blank", "class": null, "title": "foo", - "canonicalSrc": null + "canonicalSrc": "/foo-url" } } ], @@ -4873,11 +4873,11 @@ { "type": "link", "attrs": { - "href": "/bar-url", + "href": "http://test.host/bar-url", "target": "_blank", "class": null, "title": "bar", - "canonicalSrc": null + "canonicalSrc": "/bar-url" } } ], @@ -4893,11 +4893,11 @@ { "type": "link", "attrs": { - "href": "/baz-url", + "href": "http://test.host/baz-url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/baz-url" } } ], @@ -4920,11 +4920,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -10683,11 +10683,11 @@ { "type": "link", "attrs": { - "href": "http://example.com?find=%5C*", + "href": "http://example.com/?find=%5C*", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://example.com?find=%5C*" } } ], @@ -10719,11 +10719,11 @@ { "type": "link", "attrs": { - "href": "/bar*", + "href": "http://test.host/bar*", "target": "_blank", "class": null, "title": "ti*tle", - "canonicalSrc": null + "canonicalSrc": "/bar*" } } ], @@ -10746,11 +10746,11 @@ { "type": "link", "attrs": { - "href": "/bar*", + "href": "http://test.host/bar*", "target": "_blank", "class": null, "title": "ti*tle", - "canonicalSrc": null + "canonicalSrc": "/bar*" } } ], @@ -10905,11 +10905,11 @@ { "type": "link", "attrs": { - "href": "/f%C3%B6%C3%B6", + "href": "http://test.host/f%C3%B6%C3%B6", "target": "_blank", "class": null, "title": "föö", - "canonicalSrc": null + "canonicalSrc": "/f%C3%B6%C3%B6" } } ], @@ -10932,11 +10932,11 @@ { "type": "link", "attrs": { - "href": "/f%C3%B6%C3%B6", + "href": "http://test.host/f%C3%B6%C3%B6", "target": "_blank", "class": null, "title": "föö", - "canonicalSrc": null + "canonicalSrc": "/f%C3%B6%C3%B6" } } ], @@ -11466,11 +11466,11 @@ { "type": "link", "attrs": { - "href": "`", + "href": "http://test.host/%60", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "`" } } ], @@ -11517,11 +11517,11 @@ { "type": "link", "attrs": { - "href": "http://foo.bar.%60baz", + "href": "http://foo.bar.`baz/", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://foo.bar.%60baz" } } ], @@ -12673,11 +12673,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } }, { @@ -13143,11 +13143,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } }, { @@ -13212,11 +13212,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } }, { @@ -13571,11 +13571,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } }, { @@ -14477,11 +14477,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -14508,11 +14508,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -14536,11 +14536,11 @@ { "type": "image", "attrs": { - "src": "foo", + "src": "http://test.host/foo", "alt": null, "title": "*", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "foo" } } ] @@ -14662,7 +14662,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://foo.bar/?q=**" } } ], @@ -14693,7 +14693,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://foo.bar/?q=__" } } ], @@ -14764,11 +14764,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -14791,11 +14791,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -14822,7 +14822,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "" } } ], @@ -14849,7 +14849,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "" } } ], @@ -14887,11 +14887,11 @@ { "type": "link", "attrs": { - "href": "/my%20uri", + "href": "http://test.host/my%20uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/my%20uri" } } ], @@ -14944,11 +14944,11 @@ { "type": "link", "attrs": { - "href": "b)c", + "href": "http://test.host/b)c", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "b)c" } } ], @@ -15010,11 +15010,11 @@ { "type": "link", "attrs": { - "href": "(foo)", + "href": "http://test.host/(foo)", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "(foo)" } } ], @@ -15037,11 +15037,11 @@ { "type": "link", "attrs": { - "href": "foo(and(bar))", + "href": "http://test.host/foo(and(bar))", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "foo(and(bar))" } } ], @@ -15064,11 +15064,11 @@ { "type": "link", "attrs": { - "href": "foo(and(bar)", + "href": "http://test.host/foo(and(bar)", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "foo(and(bar)" } } ], @@ -15091,11 +15091,11 @@ { "type": "link", "attrs": { - "href": "foo(and(bar)", + "href": "http://test.host/foo(and(bar)", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "foo(and(bar)" } } ], @@ -15118,11 +15118,11 @@ { "type": "link", "attrs": { - "href": "foo):", + "href": "http://test.host/foo):", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "foo):" } } ], @@ -15145,11 +15145,11 @@ { "type": "link", "attrs": { - "href": "#fragment", + "href": "http://test.host/#fragment", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "#fragment" } } ], @@ -15166,11 +15166,11 @@ { "type": "link", "attrs": { - "href": "http://example.com#fragment", + "href": "http://example.com/#fragment", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://example.com#fragment" } } ], @@ -15187,11 +15187,11 @@ { "type": "link", "attrs": { - "href": "http://example.com?foo=3#frag", + "href": "http://example.com/?foo=3#frag", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://example.com?foo=3#frag" } } ], @@ -15214,11 +15214,11 @@ { "type": "link", "attrs": { - "href": "foo%5Cbar", + "href": "http://test.host/foo%5Cbar", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "foo%5Cbar" } } ], @@ -15241,11 +15241,11 @@ { "type": "link", "attrs": { - "href": "foo%20b%C3%A4", + "href": "http://test.host/foo%20b%C3%A4", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "foo%20b%C3%A4" } } ], @@ -15268,11 +15268,11 @@ { "type": "link", "attrs": { - "href": "%22title%22", + "href": "http://test.host/%22title%22", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "%22title%22" } } ], @@ -15295,11 +15295,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -15322,11 +15322,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title \"\"", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -15349,11 +15349,11 @@ { "type": "link", "attrs": { - "href": "/url%C2%A0%22title%22", + "href": "http://test.host/url%C2%A0%22title%22", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url%C2%A0%22title%22" } } ], @@ -15391,11 +15391,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title \"and\" title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -15418,11 +15418,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -15460,11 +15460,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -15506,11 +15506,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -15533,11 +15533,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -15560,11 +15560,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -15576,11 +15576,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } }, { @@ -15595,11 +15595,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } }, { @@ -15617,11 +15617,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } }, { @@ -15650,21 +15650,21 @@ { "type": "image", "attrs": { - "src": "moon.jpg", + "src": "http://test.host/moon.jpg", "alt": "moon", "title": null, "uploading": false, - "canonicalSrc": null + "canonicalSrc": "moon.jpg" }, "marks": [ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ] @@ -15690,11 +15690,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -15734,11 +15734,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } }, { @@ -15774,11 +15774,11 @@ { "type": "image", "attrs": { - "src": "uri3", + "src": "http://test.host/uri3", "alt": "[foo](uri2)", "title": null, "uploading": false, - "canonicalSrc": null + "canonicalSrc": "uri3" } } ] @@ -15802,11 +15802,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -15829,11 +15829,11 @@ { "type": "link", "attrs": { - "href": "baz*", + "href": "http://test.host/baz*", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "baz*" } } ], @@ -15927,7 +15927,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://example.com/?search=%5D(uri)" } } ], @@ -15950,11 +15950,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -15991,11 +15991,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -16032,11 +16032,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -16073,11 +16073,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -16089,11 +16089,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } }, { @@ -16108,11 +16108,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } }, { @@ -16130,11 +16130,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } }, { @@ -16177,21 +16177,21 @@ { "type": "image", "attrs": { - "src": "moon.jpg", + "src": "http://test.host/moon.jpg", "alt": "moon", "title": null, "uploading": false, - "canonicalSrc": null + "canonicalSrc": "moon.jpg" }, "marks": [ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ] @@ -16231,11 +16231,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -16251,11 +16251,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -16305,11 +16305,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } }, { @@ -16328,11 +16328,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -16373,11 +16373,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -16414,11 +16414,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -16530,7 +16530,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://example.com/?search=%5D%5Bref%5D" } } ], @@ -16567,11 +16567,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -16608,11 +16608,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -16667,11 +16667,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -16698,11 +16698,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -16743,11 +16743,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -16812,11 +16812,11 @@ { "type": "link", "attrs": { - "href": "/url1", + "href": "http://test.host/url1", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url1" } } ], @@ -16940,11 +16940,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -16995,11 +16995,11 @@ { "type": "link", "attrs": { - "href": "/uri", + "href": "http://test.host/uri", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/uri" } } ], @@ -17070,11 +17070,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17111,11 +17111,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } }, { @@ -17130,11 +17130,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17171,11 +17171,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17212,11 +17212,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17257,11 +17257,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17298,11 +17298,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } }, { @@ -17317,11 +17317,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17362,11 +17362,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } }, { @@ -17381,11 +17381,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17430,11 +17430,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17471,11 +17471,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17512,11 +17512,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17604,11 +17604,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17631,11 +17631,11 @@ { "type": "link", "attrs": { - "href": "/url2", + "href": "http://test.host/url2", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url2" } } ], @@ -17686,11 +17686,11 @@ { "type": "link", "attrs": { - "href": "/url1", + "href": "http://test.host/url1", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url1" } } ], @@ -17731,7 +17731,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "" } } ], @@ -17768,11 +17768,11 @@ { "type": "link", "attrs": { - "href": "/url1", + "href": "http://test.host/url1", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url1" } } ], @@ -17817,11 +17817,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -17858,11 +17858,11 @@ { "type": "link", "attrs": { - "href": "/url2", + "href": "http://test.host/url2", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url2" } } ], @@ -17874,11 +17874,11 @@ { "type": "link", "attrs": { - "href": "/url1", + "href": "http://test.host/url1", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url1" } } ], @@ -17933,11 +17933,11 @@ { "type": "link", "attrs": { - "href": "/url1", + "href": "http://test.host/url1", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "/url1" } } ], @@ -17985,11 +17985,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "foo", "title": "title", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } } ] @@ -18006,11 +18006,11 @@ { "type": "image", "attrs": { - "src": "train.jpg", + "src": "http://test.host/train.jpg", "alt": "foo bar", "title": "train & tracks", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "train.jpg" } } ] @@ -18041,11 +18041,11 @@ { "type": "image", "attrs": { - "src": "/url2", + "src": "http://test.host/url2", "alt": "foo bar", "title": null, "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url2" } } ] @@ -18062,11 +18062,11 @@ { "type": "image", "attrs": { - "src": "/url2", + "src": "http://test.host/url2", "alt": "foo bar", "title": null, "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url2" } } ] @@ -18083,11 +18083,11 @@ { "type": "image", "attrs": { - "src": "train.jpg", + "src": "http://test.host/train.jpg", "alt": "foo bar", "title": "train & tracks", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "train.jpg" } } ] @@ -18118,11 +18118,11 @@ { "type": "image", "attrs": { - "src": "train.jpg", + "src": "http://test.host/train.jpg", "alt": "foo bar", "title": "train & tracks", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "train.jpg" } } ] @@ -18153,11 +18153,11 @@ { "type": "image", "attrs": { - "src": "train.jpg", + "src": "http://test.host/train.jpg", "alt": "foo", "title": null, "uploading": false, - "canonicalSrc": null + "canonicalSrc": "train.jpg" } } ] @@ -18178,11 +18178,11 @@ { "type": "image", "attrs": { - "src": "/path/to/train.jpg", + "src": "http://test.host/path/to/train.jpg", "alt": "foo bar", "title": "title", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/path/to/train.jpg" } } ] @@ -18199,11 +18199,11 @@ { "type": "image", "attrs": { - "src": "url", + "src": "http://test.host/url", "alt": "foo", "title": null, "uploading": false, - "canonicalSrc": null + "canonicalSrc": "url" } } ] @@ -18220,11 +18220,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "", "title": null, "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } } ] @@ -18241,11 +18241,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "foo", "title": null, "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } } ] @@ -18276,11 +18276,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "foo", "title": null, "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } } ] @@ -18311,11 +18311,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "foo", "title": "title", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } } ] @@ -18346,11 +18346,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "foo bar", "title": "title", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } } ] @@ -18381,11 +18381,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "Foo", "title": "title", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } } ] @@ -18416,11 +18416,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "foo", "title": "title", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } }, { @@ -18455,11 +18455,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "foo", "title": "title", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } } ] @@ -18490,11 +18490,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "foo bar", "title": "title", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } } ] @@ -18549,11 +18549,11 @@ { "type": "image", "attrs": { - "src": "/url", + "src": "http://test.host/url", "alt": "Foo", "title": "title", "uploading": false, - "canonicalSrc": null + "canonicalSrc": "/url" } } ] @@ -18620,11 +18620,11 @@ { "type": "link", "attrs": { - "href": "/url", + "href": "http://test.host/url", "target": "_blank", "class": null, "title": "title", - "canonicalSrc": null + "canonicalSrc": "/url" } } ], @@ -18661,11 +18661,11 @@ { "type": "link", "attrs": { - "href": "http://foo.bar.baz", + "href": "http://foo.bar.baz/", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://foo.bar.baz" } } ], @@ -18692,7 +18692,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://foo.bar.baz/test?q=hello&id=22&boolean" } } ], @@ -18719,7 +18719,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "irc://foo.bar:2233/baz" } } ], @@ -18742,11 +18742,11 @@ { "type": "link", "attrs": { - "href": "MAILTO:FOO@BAR.BAZ", + "href": "mailto:FOO@BAR.BAZ", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "MAILTO:FOO@BAR.BAZ" } } ], @@ -18773,7 +18773,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "a+b+c:d" } } ], @@ -18800,7 +18800,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "made-up-scheme://foo,bar" } } ], @@ -18827,7 +18827,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://../" } } ], @@ -18854,7 +18854,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "localhost:5001/foo" } } ], @@ -18885,7 +18885,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://foo.bar/baz" } } ], @@ -18916,7 +18916,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://example.com/%5C%5B%5C" } } ], @@ -18943,7 +18943,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "mailto:foo@bar.example.com" } } ], @@ -18970,7 +18970,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "mailto:foo+special@Bar.baz-bar0.com" } } ], @@ -19001,7 +19001,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "mailto:foo+@bar.example.com" } } ], @@ -19047,11 +19047,11 @@ { "type": "link", "attrs": { - "href": "http://foo.bar", + "href": "http://foo.bar/", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://foo.bar" } } ], @@ -19108,11 +19108,11 @@ { "type": "link", "attrs": { - "href": "http://example.com", + "href": "http://example.com/", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://example.com" } } ], @@ -19139,7 +19139,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "mailto:foo@bar.example.com" } } ], @@ -19162,11 +19162,11 @@ { "type": "link", "attrs": { - "href": "http://www.commonmark.org", + "href": "http://www.commonmark.org/", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.commonmark.org" } } ], @@ -19197,7 +19197,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.commonmark.org/help" } } ], @@ -19228,11 +19228,11 @@ { "type": "link", "attrs": { - "href": "http://www.commonmark.org", + "href": "http://www.commonmark.org/", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.commonmark.org" } } ], @@ -19261,7 +19261,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.commonmark.org/a.b" } } ], @@ -19292,7 +19292,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.google.com/search?q=Markup+(business)" } } ], @@ -19313,7 +19313,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.google.com/search?q=Markup+(business)" } } ], @@ -19342,7 +19342,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.google.com/search?q=Markup+(business)" } } ], @@ -19371,7 +19371,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.google.com/search?q=Markup+(business)" } } ], @@ -19398,7 +19398,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.google.com/search?q=(business))+ok" } } ], @@ -19425,7 +19425,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.google.com/search?q=commonmark&hl=en" } } ], @@ -19446,7 +19446,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.google.com/search?q=commonmark" } } ], @@ -19477,7 +19477,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://www.commonmark.org/he" } } ], @@ -19504,11 +19504,11 @@ { "type": "link", "attrs": { - "href": "http://commonmark.org", + "href": "http://commonmark.org/", "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "http://commonmark.org" } } ], @@ -19533,7 +19533,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "https://encrypted.google.com/search?q=Markup+(business)" } } ], @@ -19573,7 +19573,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "mailto:foo@bar.baz" } } ], @@ -19604,7 +19604,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "mailto:hello+xyz@mail.example" } } ], @@ -19635,7 +19635,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "mailto:a.b-c_d@a.b" } } ], @@ -19656,7 +19656,7 @@ "target": "_blank", "class": null, "title": null, - "canonicalSrc": null + "canonicalSrc": "mailto:a.b-c_d@a.b" } } ], diff --git a/lib/api/support/git_access_actor.rb b/lib/api/support/git_access_actor.rb index 71395086ac2..f450630afdd 100644 --- a/lib/api/support/git_access_actor.rb +++ b/lib/api/support/git_access_actor.rb @@ -32,6 +32,10 @@ module API key || user end + def deploy_key_or_user + key.instance_of?(DeployKey) ? key : user + end + def username user&.username end diff --git a/lib/gitlab/audit/deploy_key_author.rb b/lib/gitlab/audit/deploy_key_author.rb new file mode 100644 index 00000000000..53029e9cc1c --- /dev/null +++ b/lib/gitlab/audit/deploy_key_author.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Gitlab + module Audit + class DeployKeyAuthor < Gitlab::Audit::NullAuthor + def initialize(name: nil) + super(id: -3, name: name) + end + + def name + @name || _('Deploy Key') + end + end + end +end diff --git a/lib/gitlab/audit/null_author.rb b/lib/gitlab/audit/null_author.rb index 08be6ae6d9f..cb0dfe45aef 100644 --- a/lib/gitlab/audit/null_author.rb +++ b/lib/gitlab/audit/null_author.rb @@ -24,6 +24,8 @@ module Gitlab Gitlab::Audit::UnauthenticatedAuthor.new(name: name) elsif id == -2 Gitlab::Audit::DeployTokenAuthor.new(name: name) + elsif id == -3 + Gitlab::Audit::DeployKeyAuthor.new(name: name) else Gitlab::Audit::DeletedAuthor.new(id: id, name: name) end diff --git a/lib/tasks/contracts/pipelines.rake b/lib/tasks/contracts/pipelines.rake index c018645722e..ad1936055d8 100644 --- a/lib/tasks/contracts/pipelines.rake +++ b/lib/tasks/contracts/pipelines.rake @@ -20,13 +20,24 @@ namespace :contracts do Pact::VerificationTask.new(:get_pipeline_header_data) do |pact| pact.uri( "#{contracts}/contracts/project/pipeline/show/pipelines#show-get_pipeline_header_data.json", - pact_helper: "#{provider}/pact_helpers/project/pipeline/get_pipeline_header_data_helper.rb" + pact_helper: "#{provider}/pact_helpers/project/pipeline/show/get_pipeline_header_data_helper.rb" + ) + end + + Pact::VerificationTask.new(:delete_pipeline) do |pact| + pact.uri( + "#{contracts}/contracts/project/pipeline/show/pipelines#show-delete_pipeline.json", + pact_helper: "#{provider}/pact_helpers/project/pipeline/show/delete_pipeline_helper.rb" ) end desc 'Run all pipeline contract tests' task 'test:pipelines', :contract_mr do |_t, arg| - errors = %w[get_list_project_pipelines get_pipeline_header_data].each_with_object([]) do |task, err| + errors = %w[ + get_list_project_pipelines + get_pipeline_header_data + delete_pipeline + ].each_with_object([]) do |task, err| Rake::Task["contracts:pipelines:pact:verify:#{task}"].execute rescue StandardError, SystemExit err << "contracts:pipelines:pact:verify:#{task}" diff --git a/lib/tasks/gitlab/gitaly.rake b/lib/tasks/gitlab/gitaly.rake index 18c68615637..960d0e51a47 100644 --- a/lib/tasks/gitlab/gitaly.rake +++ b/lib/tasks/gitlab/gitaly.rake @@ -34,7 +34,7 @@ Usage: rake "gitlab:gitaly:install[/installation/dir,/storage/path]") env["BUNDLE_DEPLOYMENT"] = 'false' end - output, status = Gitlab::Popen.popen([make_cmd, 'all', 'git'], nil, env) + output, status = Gitlab::Popen.popen([make_cmd, 'clean-build', 'all', 'git'], nil, env) raise "Gitaly failed to compile: #{output}" unless status&.zero? end end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 4dc897d3ddf..0b096e4da31 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -12731,6 +12731,9 @@ msgid_plural "Deploys" msgstr[0] "" msgstr[1] "" +msgid "Deploy Key" +msgstr "" + msgid "Deploy Keys" msgstr "" diff --git a/package.json b/package.json index d30b3f803c9..99e0049bda3 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,6 @@ "cache-loader": "^4.1.0", "canvas-confetti": "^1.4.0", "clipboard": "^2.0.8", - "codemirror": "^5.48.4", "codesandbox-api": "0.0.23", "compression-webpack-plugin": "^5.0.2", "copy-webpack-plugin": "^6.4.1", diff --git a/spec/contracts/consumer/fixtures/project/pipeline/delete_pipeline.fixture.js b/spec/contracts/consumer/fixtures/project/pipeline/delete_pipeline.fixture.js new file mode 100644 index 00000000000..4dbb694064b --- /dev/null +++ b/spec/contracts/consumer/fixtures/project/pipeline/delete_pipeline.fixture.js @@ -0,0 +1,19 @@ +const DeletePipeline = { + success: { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8', + }, + }, + + request: { + method: 'POST', + path: '/api/graphql', + }, + + variables: { + id: 'gid://gitlab/Ci::Pipeline/316112', + }, +}; + +export { DeletePipeline }; diff --git a/spec/contracts/consumer/resources/graphql/pipelines.js b/spec/contracts/consumer/resources/graphql/pipelines.js index 4f7ce58891c..b076006af17 100644 --- a/spec/contracts/consumer/resources/graphql/pipelines.js +++ b/spec/contracts/consumer/resources/graphql/pipelines.js @@ -23,3 +23,24 @@ export async function getPipelineHeaderDataRequest(endpoint) { data: graphqlQuery, }); } + +export async function deletePipeline(endpoint) { + const { url } = endpoint; + const query = await extractGraphQLQuery( + 'app/assets/javascripts/pipelines/graphql/mutations/delete_pipeline.mutation.graphql', + ); + const graphqlQuery = { + query, + variables: { + id: 'gid://gitlab/Ci::Pipeline/316112', + }, + }; + + return axios({ + baseURL: url, + url: '/api/graphql', + method: 'POST', + headers: { Accept: '*/*' }, + data: graphqlQuery, + }); +} diff --git a/spec/contracts/consumer/specs/project/pipeline/show.spec.js b/spec/contracts/consumer/specs/project/pipeline/show.spec.js index 0f1cc1c3108..2c5ba964e2e 100644 --- a/spec/contracts/consumer/specs/project/pipeline/show.spec.js +++ b/spec/contracts/consumer/specs/project/pipeline/show.spec.js @@ -6,24 +6,27 @@ import { GraphQLInteraction } from '@pact-foundation/pact'; import { extractGraphQLQuery } from '../../../helpers/graphql_query_extractor'; import { PipelineHeaderData } from '../../../fixtures/project/pipeline/get_pipeline_header_data.fixture'; -import { getPipelineHeaderDataRequest } from '../../../resources/graphql/pipelines'; +import { DeletePipeline } from '../../../fixtures/project/pipeline/delete_pipeline.fixture'; + +import { getPipelineHeaderDataRequest, deletePipeline } from '../../../resources/graphql/pipelines'; const CONSUMER_NAME = 'Pipelines#show'; const CONSUMER_LOG = '../logs/consumer.log'; const CONTRACT_DIR = '../contracts/project/pipeline/show'; -const PROVIDER_NAME = 'GET pipeline header data'; +const GET_PIPELINE_HEADER_DATA_PROVIDER_NAME = 'GET pipeline header data'; +const DELETE_PIPELINE_PROVIDER_NAME = 'DELETE pipeline'; // GraphQL query: getPipelineHeaderData pactWith( { consumer: CONSUMER_NAME, - provider: PROVIDER_NAME, + provider: GET_PIPELINE_HEADER_DATA_PROVIDER_NAME, log: CONSUMER_LOG, dir: CONTRACT_DIR, }, (provider) => { - describe(PROVIDER_NAME, () => { + describe(GET_PIPELINE_HEADER_DATA_PROVIDER_NAME, () => { beforeEach(async () => { const query = await extractGraphQLQuery( 'app/assets/javascripts/pipelines/graphql/queries/get_pipeline_header_data.query.graphql', @@ -50,4 +53,41 @@ pactWith( }, ); +// GraphQL query: deletePipeline +pactWith( + { + consumer: CONSUMER_NAME, + provider: DELETE_PIPELINE_PROVIDER_NAME, + log: CONSUMER_LOG, + dir: CONTRACT_DIR, + }, + + (provider) => { + describe(DELETE_PIPELINE_PROVIDER_NAME, () => { + beforeEach(async () => { + const query = await extractGraphQLQuery( + 'app/assets/javascripts/pipelines/graphql/mutations/delete_pipeline.mutation.graphql', + ); + const graphqlQuery = new GraphQLInteraction() + .given('a pipeline for a project exists') + .uponReceiving('a request to delete the pipeline') + .withQuery(query) + .withRequest(DeletePipeline.request) + .withVariables(DeletePipeline.variables) + .willRespondWith(DeletePipeline.success); + + provider.addInteraction(graphqlQuery); + }); + + it('returns a successful body', async () => { + const deletePipelineResponse = await deletePipeline({ + url: provider.mockService.baseUrl, + }); + + expect(deletePipelineResponse.status).toEqual(DeletePipeline.success.status); + }); + }); + }, +); + /* eslint-enable @gitlab/require-i18n-strings */ diff --git a/spec/contracts/contracts/project/pipeline/show/pipelines#show-delete_pipeline.json b/spec/contracts/contracts/project/pipeline/show/pipelines#show-delete_pipeline.json new file mode 100644 index 00000000000..795c8a6e197 --- /dev/null +++ b/spec/contracts/contracts/project/pipeline/show/pipelines#show-delete_pipeline.json @@ -0,0 +1,44 @@ +{ + "consumer": { + "name": "Pipelines#show" + }, + "provider": { + "name": "DELETE pipeline" + }, + "interactions": [ + { + "description": "a request to delete the pipeline", + "providerState": "a pipeline for a project exists", + "request": { + "method": "POST", + "path": "/api/graphql", + "headers": { + "content-type": "application/json" + }, + "body": { + "query": "mutation deletePipeline($id: CiPipelineID!) {\n pipelineDestroy(input: { id: $id }) {\n errors\n }\n}\n", + "variables": { + "id": "gid://gitlab/Ci::Pipeline/316112" + } + }, + "matchingRules": { + "$.body.query": { + "match": "regex", + "regex": "mutation\\s*deletePipeline\\(\\$id:\\s*CiPipelineID!\\)\\s*\\{\\s*pipelineDestroy\\(input:\\s*\\{\\s*id:\\s*\\$id\\s*\\}\\)\\s*\\{\\s*errors\\s*\\}\\s*\\}\\s*" + } + } + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json; charset=utf-8" + } + } + } + ], + "metadata": { + "pactSpecification": { + "version": "2.0.0" + } + } +} \ No newline at end of file diff --git a/spec/contracts/provider/pact_helpers/project/pipeline/show/delete_pipeline_helper.rb b/spec/contracts/provider/pact_helpers/project/pipeline/show/delete_pipeline_helper.rb new file mode 100644 index 00000000000..2d29fabfeca --- /dev/null +++ b/spec/contracts/provider/pact_helpers/project/pipeline/show/delete_pipeline_helper.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require_relative '../../../../spec_helper' +require_relative '../../../../states/project/pipeline/show_state' + +module Provider + module DeletePipelineHelper + Pact.service_provider "DELETE pipeline" do + app { Environments::Test.app } + + honours_pact_with 'Pipelines#show' do + pact_uri '../contracts/project/pipeline/show/pipelines#show-delete_pipeline.json' + end + end + end +end diff --git a/spec/contracts/provider/pact_helpers/project/pipeline/get_pipeline_header_data_helper.rb b/spec/contracts/provider/pact_helpers/project/pipeline/show/get_pipeline_header_data_helper.rb similarity index 76% rename from spec/contracts/provider/pact_helpers/project/pipeline/get_pipeline_header_data_helper.rb rename to spec/contracts/provider/pact_helpers/project/pipeline/show/get_pipeline_header_data_helper.rb index abb2781f987..4bc7dff2ef9 100644 --- a/spec/contracts/provider/pact_helpers/project/pipeline/get_pipeline_header_data_helper.rb +++ b/spec/contracts/provider/pact_helpers/project/pipeline/show/get_pipeline_header_data_helper.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true -require_relative '../../../spec_helper' -require_relative '../../../states/project/pipeline/pipeline_state' +require_relative '../../../../spec_helper' +require_relative '../../../../states/project/pipeline/pipeline_state' module Provider module GetPipelinesHeaderDataHelper diff --git a/spec/contracts/provider/states/project/pipeline/show_state.rb b/spec/contracts/provider/states/project/pipeline/show_state.rb new file mode 100644 index 00000000000..3365647cd13 --- /dev/null +++ b/spec/contracts/provider/states/project/pipeline/show_state.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +Pact.provider_states_for "Pipelines#show" do + provider_state "a pipeline for a project exists" do + set_up do + user = User.find_by(name: Provider::UsersHelper::CONTRACT_USER_NAME) + namespace = create(:namespace, name: 'gitlab-org') + project = create(:project, :repository, name: 'gitlab-qa', namespace: namespace, creator: user) + scheduled_job = create(:ci_build, :scheduled) + manual_job = create(:ci_build, :manual) + + project.add_maintainer(user) + + create( + :ci_pipeline, + :with_job, + :success, + id: 316112, + iid: 1, + project: project, + user: user, + duration: 10, + finished_at: '2022-06-01T02:47:31.432Z', + builds: [scheduled_job, manual_job] + ) + end + end +end diff --git a/spec/frontend/content_editor/remark_markdown_processing_spec.js b/spec/frontend/content_editor/remark_markdown_processing_spec.js index ddf49a4c18e..e1de2823726 100644 --- a/spec/frontend/content_editor/remark_markdown_processing_spec.js +++ b/spec/frontend/content_editor/remark_markdown_processing_spec.js @@ -257,7 +257,12 @@ describe('Client side Markdown processing', () => { expectedDoc: doc( paragraph( source('foo'), - image({ ...source('foo'), alt: 'foo', src: 'bar' }), + image({ + ...source('foo'), + alt: 'foo', + canonicalSrc: 'bar', + src: 'http://test.host/bar', + }), ), ), }, @@ -275,7 +280,12 @@ describe('Client side Markdown processing', () => { ), paragraph( source('foo'), - image({ ...source('foo'), alt: 'foo', src: 'bar' }), + image({ + ...source('foo'), + alt: 'foo', + src: 'http://test.host/bar', + canonicalSrc: 'bar', + }), ), ), }, @@ -287,7 +297,8 @@ describe('Client side Markdown processing', () => { link( { ...source('[GitLab](https://gitlab.com "Go to GitLab")'), - href: 'https://gitlab.com', + href: 'https://gitlab.com/', + canonicalSrc: 'https://gitlab.com', title: 'Go to GitLab', }, 'GitLab', @@ -305,7 +316,8 @@ describe('Client side Markdown processing', () => { link( { ...source('[GitLab](https://gitlab.com "Go to GitLab")'), - href: 'https://gitlab.com', + href: 'https://gitlab.com/', + canonicalSrc: 'https://gitlab.com', title: 'Go to GitLab', }, 'GitLab', @@ -322,7 +334,8 @@ describe('Client side Markdown processing', () => { link( { ...source('www.commonmark.org'), - href: 'http://www.commonmark.org', + canonicalSrc: 'http://www.commonmark.org', + href: 'http://www.commonmark.org/', }, 'www.commonmark.org', ), @@ -338,6 +351,7 @@ describe('Client side Markdown processing', () => { link( { ...source('www.commonmark.org/help'), + canonicalSrc: 'http://www.commonmark.org/help', href: 'http://www.commonmark.org/help', }, 'www.commonmark.org/help', @@ -355,6 +369,7 @@ describe('Client side Markdown processing', () => { link( { ...source('hello+xyz@mail.example'), + canonicalSrc: 'mailto:hello+xyz@mail.example', href: 'mailto:hello+xyz@mail.example', }, 'hello+xyz@mail.example', @@ -373,7 +388,8 @@ describe('Client side Markdown processing', () => { { sourceMapKey: null, sourceMarkdown: null, - href: 'https://gitlab.com', + canonicalSrc: 'https://gitlab.com', + href: 'https://gitlab.com/', }, 'https://gitlab.com', ), @@ -402,6 +418,7 @@ hard line break`, image({ ...source('![GitLab Logo](https://gitlab.com/logo.png "GitLab Logo")'), alt: 'GitLab Logo', + canonicalSrc: 'https://gitlab.com/logo.png', src: 'https://gitlab.com/logo.png', title: 'GitLab Logo', }), @@ -595,7 +612,12 @@ two paragraph( source('List item with an image ![bar](foo.png)'), 'List item with an image', - image({ ...source('![bar](foo.png)'), alt: 'bar', src: 'foo.png' }), + image({ + ...source('![bar](foo.png)'), + alt: 'bar', + canonicalSrc: 'foo.png', + src: 'http://test.host/foo.png', + }), ), ), ), @@ -944,8 +966,17 @@ Paragraph paragraph( source('[![moon](moon.jpg)](/uri)'), link( - { ...source('[![moon](moon.jpg)](/uri)'), href: '/uri' }, - image({ ...source('![moon](moon.jpg)'), src: 'moon.jpg', alt: 'moon' }), + { + ...source('[![moon](moon.jpg)](/uri)'), + canonicalSrc: '/uri', + href: 'http://test.host/uri', + }, + image({ + ...source('![moon](moon.jpg)'), + canonicalSrc: 'moon.jpg', + src: 'http://test.host/moon.jpg', + alt: 'moon', + }), ), ), ), @@ -975,12 +1006,26 @@ Paragraph source('~[moon](moon.jpg) and [sun](sun.jpg)~'), strike( source('~[moon](moon.jpg) and [sun](sun.jpg)~'), - link({ ...source('[moon](moon.jpg)'), href: 'moon.jpg' }, 'moon'), + link( + { + ...source('[moon](moon.jpg)'), + canonicalSrc: 'moon.jpg', + href: 'http://test.host/moon.jpg', + }, + 'moon', + ), ), strike(source('~[moon](moon.jpg) and [sun](sun.jpg)~'), ' and '), strike( source('~[moon](moon.jpg) and [sun](sun.jpg)~'), - link({ ...source('[sun](sun.jpg)'), href: 'sun.jpg' }, 'sun'), + link( + { + ...source('[sun](sun.jpg)'), + href: 'http://test.host/sun.jpg', + canonicalSrc: 'sun.jpg', + }, + 'sun', + ), ), ), ), @@ -1094,7 +1139,12 @@ _world_. paragraph( source('[GitLab][gitlab-url]'), link( - { ...source('[GitLab][gitlab-url]'), href: 'https://gitlab.com', title: 'GitLab' }, + { + ...source('[GitLab][gitlab-url]'), + href: 'https://gitlab.com/', + canonicalSrc: 'https://gitlab.com', + title: 'GitLab', + }, 'GitLab', ), ), diff --git a/spec/frontend/content_editor/services/markdown_serializer_spec.js b/spec/frontend/content_editor/services/markdown_serializer_spec.js index 422eb3f311b..d55e5fbadad 100644 --- a/spec/frontend/content_editor/services/markdown_serializer_spec.js +++ b/spec/frontend/content_editor/services/markdown_serializer_spec.js @@ -1213,42 +1213,47 @@ paragraph }; it.each` - mark | markdown | modifiedMarkdown | editAction - ${'bold'} | ${'**bold**'} | ${'**bold modified**'} | ${defaultEditAction} - ${'bold'} | ${'__bold__'} | ${'__bold modified__'} | ${defaultEditAction} - ${'bold'} | ${'bold'} | ${'bold modified'} | ${defaultEditAction} - ${'bold'} | ${'bold'} | ${'bold modified'} | ${defaultEditAction} - ${'italic'} | ${'_italic_'} | ${'_italic modified_'} | ${defaultEditAction} - ${'italic'} | ${'*italic*'} | ${'*italic modified*'} | ${defaultEditAction} - ${'italic'} | ${'italic'} | ${'italic modified'} | ${defaultEditAction} - ${'italic'} | ${'italic'} | ${'italic modified'} | ${defaultEditAction} - ${'link'} | ${'[gitlab](https://gitlab.com)'} | ${'[gitlab modified](https://gitlab.com)'} | ${defaultEditAction} - ${'link'} | ${'link'} | ${'link modified'} | ${defaultEditAction} - ${'link'} | ${'link www.gitlab.com'} | ${'modified link www.gitlab.com'} | ${prependContentEditAction} - ${'link'} | ${'link https://www.gitlab.com'} | ${'modified link https://www.gitlab.com'} | ${prependContentEditAction} - ${'link'} | ${'link(https://www.gitlab.com)'} | ${'modified link(https://www.gitlab.com)'} | ${prependContentEditAction} - ${'link'} | ${'link(engineering@gitlab.com)'} | ${'modified link(engineering@gitlab.com)'} | ${prependContentEditAction} - ${'link'} | ${'link '} | ${'modified link '} | ${prependContentEditAction} - ${'link'} | ${'link [https://www.gitlab.com>'} | ${'modified link \\[https://www.gitlab.com>'} | ${prependContentEditAction} - ${'link'} | ${'link '} | ${'modified link [https://www.gitlab.com>](https://www.gitlab.com%3E)'} | ${prependContentEditAction} - ${'link'} | ${'link **https://www.gitlab.com]**'} | ${'modified link [**https://www.gitlab.com\\]**](https://www.gitlab.com%5D)'} | ${prependContentEditAction} - ${'code'} | ${'`code`'} | ${'`code modified`'} | ${defaultEditAction} - ${'code'} | ${'code'} | ${'code modified'} | ${defaultEditAction} - ${'strike'} | ${'~~striked~~'} | ${'~~striked modified~~'} | ${defaultEditAction} - ${'strike'} | ${'striked'} | ${'striked modified'} | ${defaultEditAction} - ${'strike'} | ${'striked'} | ${'striked modified'} | ${defaultEditAction} - ${'strike'} | ${'striked'} | ${'striked modified'} | ${defaultEditAction} - ${'list'} | ${'- list item'} | ${'- list item modified'} | ${defaultEditAction} - ${'list'} | ${'* list item'} | ${'* list item modified'} | ${defaultEditAction} - ${'list'} | ${'+ list item'} | ${'+ list item modified'} | ${defaultEditAction} - ${'list'} | ${'- list item 1\n- list item 2'} | ${'- list item 1\n- list item 2 modified'} | ${defaultEditAction} - ${'list'} | ${'2) list item'} | ${'2) list item modified'} | ${defaultEditAction} - ${'list'} | ${'1. list item'} | ${'1. list item modified'} | ${defaultEditAction} - ${'taskList'} | ${'2) [ ] task list item'} | ${'2) [ ] task list item modified'} | ${defaultEditAction} - ${'taskList'} | ${'2) [x] task list item'} | ${'2) [x] task list item modified'} | ${defaultEditAction} + mark | markdown | modifiedMarkdown | editAction + ${'bold'} | ${'**bold**'} | ${'**bold modified**'} | ${defaultEditAction} + ${'bold'} | ${'__bold__'} | ${'__bold modified__'} | ${defaultEditAction} + ${'bold'} | ${'bold'} | ${'bold modified'} | ${defaultEditAction} + ${'bold'} | ${'bold'} | ${'bold modified'} | ${defaultEditAction} + ${'italic'} | ${'_italic_'} | ${'_italic modified_'} | ${defaultEditAction} + ${'italic'} | ${'*italic*'} | ${'*italic modified*'} | ${defaultEditAction} + ${'italic'} | ${'italic'} | ${'italic modified'} | ${defaultEditAction} + ${'italic'} | ${'italic'} | ${'italic modified'} | ${defaultEditAction} + ${'link'} | ${'[gitlab](https://gitlab.com)'} | ${'[gitlab modified](https://gitlab.com)'} | ${defaultEditAction} + ${'link'} | ${'link'} | ${'link modified'} | ${defaultEditAction} + ${'link'} | ${'link www.gitlab.com'} | ${'modified link www.gitlab.com'} | ${prependContentEditAction} + ${'link'} | ${'link https://www.gitlab.com'} | ${'modified link https://www.gitlab.com'} | ${prependContentEditAction} + ${'link'} | ${'link(https://www.gitlab.com)'} | ${'modified link(https://www.gitlab.com)'} | ${prependContentEditAction} + ${'link'} | ${'link(engineering@gitlab.com)'} | ${'modified link(engineering@gitlab.com)'} | ${prependContentEditAction} + ${'link'} | ${'link '} | ${'modified link '} | ${prependContentEditAction} + ${'link'} | ${'link [https://www.gitlab.com>'} | ${'modified link \\[https://www.gitlab.com>'} | ${prependContentEditAction} + ${'link'} | ${'link '} | ${'modified link [https://www.gitlab.com>](https://www.gitlab.com%3E)'} | ${prependContentEditAction} + ${'link'} | ${'link https://www.gitlab.com/path'} | ${'modified link https://www.gitlab.com/path'} | ${prependContentEditAction} + ${'link'} | ${'link https://www.gitlab.com?query=search'} | ${'modified link https://www.gitlab.com?query=search'} | ${prependContentEditAction} + ${'link'} | ${'link https://www.gitlab.com/#fragment'} | ${'modified link https://www.gitlab.com/#fragment'} | ${prependContentEditAction} + ${'link'} | ${'link https://www.gitlab.com/?query=search'} | ${'modified link https://www.gitlab.com/?query=search'} | ${prependContentEditAction} + ${'link'} | ${'link https://www.gitlab.com#fragment'} | ${'modified link https://www.gitlab.com#fragment'} | ${prependContentEditAction} + ${'link'} | ${'link **https://www.gitlab.com]**'} | ${'modified link [**https://www.gitlab.com\\]**](https://www.gitlab.com%5D)'} | ${prependContentEditAction} + ${'code'} | ${'`code`'} | ${'`code modified`'} | ${defaultEditAction} + ${'code'} | ${'code'} | ${'code modified'} | ${defaultEditAction} + ${'strike'} | ${'~~striked~~'} | ${'~~striked modified~~'} | ${defaultEditAction} + ${'strike'} | ${'striked'} | ${'striked modified'} | ${defaultEditAction} + ${'strike'} | ${'striked'} | ${'striked modified'} | ${defaultEditAction} + ${'strike'} | ${'striked'} | ${'striked modified'} | ${defaultEditAction} + ${'list'} | ${'- list item'} | ${'- list item modified'} | ${defaultEditAction} + ${'list'} | ${'* list item'} | ${'* list item modified'} | ${defaultEditAction} + ${'list'} | ${'+ list item'} | ${'+ list item modified'} | ${defaultEditAction} + ${'list'} | ${'- list item 1\n- list item 2'} | ${'- list item 1\n- list item 2 modified'} | ${defaultEditAction} + ${'list'} | ${'2) list item'} | ${'2) list item modified'} | ${defaultEditAction} + ${'list'} | ${'1. list item'} | ${'1. list item modified'} | ${defaultEditAction} + ${'taskList'} | ${'2) [ ] task list item'} | ${'2) [ ] task list item modified'} | ${defaultEditAction} + ${'taskList'} | ${'2) [x] task list item'} | ${'2) [x] task list item modified'} | ${defaultEditAction} `( - 'preserves original $mark syntax when sourceMarkdown is available for $content', + 'preserves original $mark syntax when sourceMarkdown is available for $markdown', async ({ markdown, modifiedMarkdown, editAction }) => { const { document } = await remarkMarkdownDeserializer().deserialize({ schema: tiptapEditor.schema, diff --git a/spec/frontend/lib/utils/url_utility_spec.js b/spec/frontend/lib/utils/url_utility_spec.js index 766da7034d9..312e4f636c3 100644 --- a/spec/frontend/lib/utils/url_utility_spec.js +++ b/spec/frontend/lib/utils/url_utility_spec.js @@ -1062,4 +1062,28 @@ describe('URL utility', () => { expect(urlUtils.PROMO_URL).toBe(url); }); }); + + describe('removeUrlProtocol', () => { + it.each` + input | output + ${'http://gitlab.com'} | ${'gitlab.com'} + ${'https://gitlab.com'} | ${'gitlab.com'} + ${'foo:bar.com'} | ${'bar.com'} + ${'gitlab.com'} | ${'gitlab.com'} + `('transforms $input to $output', ({ input, output }) => { + expect(urlUtils.removeUrlProtocol(input)).toBe(output); + }); + }); + + describe('removeLastSlashInUrlPath', () => { + it.each` + input | output + ${'https://www.gitlab.com/path/'} | ${'https://www.gitlab.com/path'} + ${'https://www.gitlab.com/?query=search'} | ${'https://www.gitlab.com?query=search'} + ${'https://www.gitlab.com/#fragment'} | ${'https://www.gitlab.com#fragment'} + ${'https://www.gitlab.com/hello'} | ${'https://www.gitlab.com/hello'} + `('transforms $input to $output', ({ input, output }) => { + expect(urlUtils.removeLastSlashInUrlPath(input)).toBe(output); + }); + }); }); diff --git a/spec/graphql/mutations/merge_requests/set_labels_spec.rb b/spec/graphql/mutations/merge_requests/set_labels_spec.rb index 1bb303cf99b..44bd9342b8e 100644 --- a/spec/graphql/mutations/merge_requests/set_labels_spec.rb +++ b/spec/graphql/mutations/merge_requests/set_labels_spec.rb @@ -64,7 +64,7 @@ RSpec.describe Mutations::MergeRequests::SetLabels do end context 'when passing operation_mode as REMOVE' do - subject { mutation.resolve(project_path: merge_request.project.full_path, iid: merge_request.iid, label_ids: label_ids, operation_mode: Types::MutationOperationModeEnum.enum[:remove])} + subject { mutation.resolve(project_path: merge_request.project.full_path, iid: merge_request.iid, label_ids: label_ids, operation_mode: Types::MutationOperationModeEnum.enum[:remove]) } it 'removes the labels, without removing others' do merge_request.update!(labels: [label, label2]) diff --git a/spec/graphql/mutations/releases/create_spec.rb b/spec/graphql/mutations/releases/create_spec.rb index 1f2c3ed537f..b6b9449aa39 100644 --- a/spec/graphql/mutations/releases/create_spec.rb +++ b/spec/graphql/mutations/releases/create_spec.rb @@ -11,9 +11,9 @@ RSpec.describe Mutations::Releases::Create do let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) } - let(:tag) { 'v1.1.0'} - let(:ref) { 'master'} - let(:name) { 'Version 1.0'} + let(:tag) { 'v1.1.0' } + let(:ref) { 'master' } + let(:name) { 'Version 1.0' } let(:description) { 'The first release :rocket:' } let(:released_at) { Time.parse('2018-12-10') } let(:milestones) { [milestone_12_3.title, milestone_12_4.title] } diff --git a/spec/graphql/mutations/releases/delete_spec.rb b/spec/graphql/mutations/releases/delete_spec.rb index 9934aea0031..09b420fe1ea 100644 --- a/spec/graphql/mutations/releases/delete_spec.rb +++ b/spec/graphql/mutations/releases/delete_spec.rb @@ -8,7 +8,7 @@ RSpec.describe Mutations::Releases::Delete do let_it_be(:reporter) { create(:user) } let_it_be(:developer) { create(:user) } let_it_be(:maintainer) { create(:user) } - let_it_be(:tag) { 'v1.1.0'} + let_it_be(:tag) { 'v1.1.0' } let_it_be(:release) { create(:release, project: project, tag: tag) } let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) } diff --git a/spec/graphql/mutations/releases/update_spec.rb b/spec/graphql/mutations/releases/update_spec.rb index 9fae703b85a..15b10ea0648 100644 --- a/spec/graphql/mutations/releases/update_spec.rb +++ b/spec/graphql/mutations/releases/update_spec.rb @@ -9,8 +9,8 @@ RSpec.describe Mutations::Releases::Update do let_it_be(:reporter) { create(:user) } let_it_be(:developer) { create(:user) } - let_it_be(:tag) { 'v1.1.0'} - let_it_be(:name) { 'Version 1.0'} + let_it_be(:tag) { 'v1.1.0' } + let_it_be(:name) { 'Version 1.0' } let_it_be(:description) { 'The first release :rocket:' } let_it_be(:released_at) { Time.parse('2018-12-10').utc } let_it_be(:created_at) { Time.parse('2018-11-05').utc } diff --git a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb index 53b673e255b..ba8a127bec5 100644 --- a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb @@ -12,7 +12,7 @@ RSpec.describe Resolvers::Ci::RunnerJobsResolver do let!(:build_one) { create(:ci_build, :success, name: 'Build One', runner: runner, pipeline: pipeline) } let!(:build_two) { create(:ci_build, :success, name: 'Build Two', runner: runner, pipeline: pipeline) } let!(:build_three) { create(:ci_build, :failed, name: 'Build Three', runner: runner, pipeline: pipeline) } - let!(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline)} + let!(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline) } let(:args) { {} } let(:runner) { create(:ci_runner, :project, projects: [project]) } diff --git a/spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb b/spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb index 8d0b8f9398d..e1c67bc7c18 100644 --- a/spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb +++ b/spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb @@ -17,7 +17,7 @@ RSpec.describe Resolvers::GroupMembers::NotificationEmailResolver do expect(described_class).to have_nullable_graphql_type(GraphQL::Types::String) end - subject { batch_sync { resolve_notification_email(developer.group_members.first, current_user) }} + subject { batch_sync { resolve_notification_email(developer.group_members.first, current_user) } } context 'when current_user is admin' do let(:current_user) { create(:user, :admin) } diff --git a/spec/graphql/resolvers/project_jobs_resolver_spec.rb b/spec/graphql/resolvers/project_jobs_resolver_spec.rb index bb711a4c857..eb9d31ea7e5 100644 --- a/spec/graphql/resolvers/project_jobs_resolver_spec.rb +++ b/spec/graphql/resolvers/project_jobs_resolver_spec.rb @@ -14,7 +14,7 @@ RSpec.describe Resolvers::ProjectJobsResolver do let_it_be(:failed_build) { create(:ci_build, :failed, name: 'Build Three', pipeline: pipeline) } let_it_be(:pending_build) { create(:ci_build, :pending, name: 'Build Three', pipeline: pipeline) } - let(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline)} + let(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline) } let(:args) { {} } let(:current_user) { create(:user) } diff --git a/spec/graphql/resolvers/projects/grafana_integration_resolver_spec.rb b/spec/graphql/resolvers/projects/grafana_integration_resolver_spec.rb index 854e763fbdd..546b8592546 100644 --- a/spec/graphql/resolvers/projects/grafana_integration_resolver_spec.rb +++ b/spec/graphql/resolvers/projects/grafana_integration_resolver_spec.rb @@ -7,7 +7,7 @@ RSpec.describe Resolvers::Projects::GrafanaIntegrationResolver do let_it_be(:project) { create(:project) } let_it_be(:current_user) { create(:user) } - let_it_be(:grafana_integration) { create(:grafana_integration, project: project)} + let_it_be(:grafana_integration) { create(:grafana_integration, project: project) } describe '#resolve' do context 'when object is not a project' do @@ -19,7 +19,7 @@ RSpec.describe Resolvers::Projects::GrafanaIntegrationResolver do end context 'when object is nil' do - it { expect(resolve_integration(obj: nil)).to eq nil} + it { expect(resolve_integration(obj: nil)).to eq nil } end end diff --git a/spec/graphql/resolvers/projects_resolver_spec.rb b/spec/graphql/resolvers/projects_resolver_spec.rb index 2685115d1a2..453fafb9590 100644 --- a/spec/graphql/resolvers/projects_resolver_spec.rb +++ b/spec/graphql/resolvers/projects_resolver_spec.rb @@ -142,7 +142,7 @@ RSpec.describe Resolvers::ProjectsResolver do context 'when no sort is provided' do it 'returns projects in descending order by id' do - is_expected.to match_array((visible_projecs + named_projects).sort_by { |p| p[:id]}.reverse ) + is_expected.to match_array((visible_projecs + named_projects).sort_by { |p| p[:id] }.reverse ) end end end diff --git a/spec/graphql/types/ci/job_token_scope_type_spec.rb b/spec/graphql/types/ci/job_token_scope_type_spec.rb index c1a3c4dd54d..457d46b6896 100644 --- a/spec/graphql/types/ci/job_token_scope_type_spec.rb +++ b/spec/graphql/types/ci/job_token_scope_type_spec.rb @@ -34,7 +34,7 @@ RSpec.describe GitlabSchema.types['CiJobTokenScopeType'] do subject { GitlabSchema.execute(query, context: { current_user: current_user }).as_json } let(:projects_field) { subject.dig('data', 'project', 'ciJobTokenScope', 'projects', 'nodes') } - let(:returned_project_paths) { projects_field.map { |project| project['path']} } + let(:returned_project_paths) { projects_field.map { |project| project['path'] } } context 'with access to scope' do before do diff --git a/spec/graphql/types/issue_type_spec.rb b/spec/graphql/types/issue_type_spec.rb index e7454b85357..2a0ae79b2c4 100644 --- a/spec/graphql/types/issue_type_spec.rb +++ b/spec/graphql/types/issue_type_spec.rb @@ -167,7 +167,7 @@ RSpec.describe GitlabSchema.types['Issue'] do shared_examples_for 'does not include private notes' do it "does not return private notes" do notes = subject.dig("data", "project", "issue", "notes", 'edges') - notes_body = notes.map {|n| n.dig('node', 'body')} + notes_body = notes.map { |n| n.dig('node', 'body') } expect(notes.size).to eq 1 expect(notes_body).not_to include(private_note_body) @@ -178,7 +178,7 @@ RSpec.describe GitlabSchema.types['Issue'] do shared_examples_for 'includes private notes' do it "returns all notes" do notes = subject.dig("data", "project", "issue", "notes", 'edges') - notes_body = notes.map {|n| n.dig('node', 'body')} + notes_body = notes.map { |n| n.dig('node', 'body') } expect(notes.size).to eq 2 expect(notes_body).to include(private_note_body) @@ -209,7 +209,7 @@ RSpec.describe GitlabSchema.types['Issue'] do end describe 'hidden', :enable_admin_mode do - let_it_be(:admin) { create(:user, :admin)} + let_it_be(:admin) { create(:user, :admin) } let_it_be(:banned_user) { create(:user, :banned) } let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :public) } diff --git a/spec/graphql/types/user_type_spec.rb b/spec/graphql/types/user_type_spec.rb index fec6a771640..dcf25ff0667 100644 --- a/spec/graphql/types/user_type_spec.rb +++ b/spec/graphql/types/user_type_spec.rb @@ -49,7 +49,7 @@ RSpec.describe GitlabSchema.types['User'] do end describe 'name field' do - let_it_be(:admin) { create(:user, :admin)} + let_it_be(:admin) { create(:user, :admin) } let_it_be(:user) { create(:user) } let_it_be(:requested_user) { create(:user, name: 'John Smith') } let_it_be(:requested_project_bot) { create(:user, :project_bot, name: 'Project bot') } diff --git a/spec/lib/api/support/git_access_actor_spec.rb b/spec/lib/api/support/git_access_actor_spec.rb index a09cabf4cd7..e1c800d25a7 100644 --- a/spec/lib/api/support/git_access_actor_spec.rb +++ b/spec/lib/api/support/git_access_actor_spec.rb @@ -83,6 +83,36 @@ RSpec.describe API::Support::GitAccessActor do end end + describe '#deploy_key_or_user' do + it 'returns a deploy key when the params contains deploy key' do + key = create(:deploy_key) + params = { key_id: key.id } + + expect(described_class.from_params(params).deploy_key_or_user).to eq(key) + end + + it 'returns a user when the params contains personal key' do + key = create(:key) + params = { key_id: key.id } + + expect(described_class.from_params(params).deploy_key_or_user).to eq(key.user) + end + + it 'returns a user when the params contains user id' do + user = create(:user) + params = { user_id: user.id } + + expect(described_class.from_params(params).deploy_key_or_user).to eq(user) + end + + it 'returns a user when the params contains user name' do + user = create(:user) + params = { username: user.username } + + expect(described_class.from_params(params).deploy_key_or_user).to eq(user) + end + end + describe '#username' do context 'when initialized with a User' do let(:user) { build(:user) } diff --git a/spec/lib/gitlab/audit/deploy_key_author_spec.rb b/spec/lib/gitlab/audit/deploy_key_author_spec.rb new file mode 100644 index 00000000000..72444f77c91 --- /dev/null +++ b/spec/lib/gitlab/audit/deploy_key_author_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Audit::DeployKeyAuthor do + describe '#initialize' do + it 'sets correct attributes' do + expect(described_class.new(name: 'Lorem deploy key')) + .to have_attributes(id: -3, name: 'Lorem deploy key') + end + + it 'sets default name when it is not provided' do + expect(described_class.new) + .to have_attributes(id: -3, name: 'Deploy Key') + end + end +end diff --git a/spec/lib/gitlab/audit/null_author_spec.rb b/spec/lib/gitlab/audit/null_author_spec.rb index 2045139a5f7..e2f71a34534 100644 --- a/spec/lib/gitlab/audit/null_author_spec.rb +++ b/spec/lib/gitlab/audit/null_author_spec.rb @@ -57,6 +57,15 @@ RSpec.describe Gitlab::Audit::NullAuthor do expect(subject.for(-2, audit_event)).to be_a(Gitlab::Audit::DeployTokenAuthor) expect(subject.for(-2, audit_event)).to have_attributes(id: -2, name: 'Test deploy token') end + + it 'returns DeployKeyAuthor when id equals -3', :aggregate_failures do + allow(audit_event).to receive(:[]).with(:author_name).and_return('Test deploy key') + allow(audit_event).to receive(:details).and_return({}) + allow(audit_event).to receive(:target_type) + + expect(subject.for(-3, audit_event)).to be_a(Gitlab::Audit::DeployKeyAuthor) + expect(subject.for(-3, audit_event)).to have_attributes(id: -3, name: 'Test deploy key') + end end describe '#current_sign_in_ip' do diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index f62183a213a..8dd34100593 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -5245,25 +5245,8 @@ RSpec.describe User do end it 'returns number of open merge requests from non-archived projects' do - expect(Rails.cache).not_to receive(:fetch) expect(user.attention_requested_open_merge_requests_count(force: true)).to eq 1 end - - context 'when uncached_mr_attention_requests_count is disabled' do - before do - stub_feature_flags(uncached_mr_attention_requests_count: false) - end - - it 'fetches from cache' do - expect(Rails.cache).to receive(:fetch).with( - user.attention_request_cache_key, - force: false, - expires_in: described_class::COUNT_CACHE_VALIDITY_PERIOD - ).and_call_original - - expect(user.attention_requested_open_merge_requests_count).to eq 1 - end - end end describe '#assigned_open_issues_count' do diff --git a/spec/requests/api/boards_spec.rb b/spec/requests/api/boards_spec.rb index feb11f2ffef..817e1324c7c 100644 --- a/spec/requests/api/boards_spec.rb +++ b/spec/requests/api/boards_spec.rb @@ -61,7 +61,7 @@ RSpec.describe API::Boards do delete api(url, user) expect(response).to have_gitlab_http_status(:no_content) - end.to change {board_parent.boards.count}.by(-1) + end.to change { board_parent.boards.count }.by(-1) end end diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb index 780e45cf443..e3d69d6b66a 100644 --- a/spec/requests/api/branches_spec.rb +++ b/spec/requests/api/branches_spec.rb @@ -201,7 +201,7 @@ RSpec.describe API::Branches do context 'when sort value is not supported' do it_behaves_like '400 response' do - let(:request) { get api(route, user), params: { sort: 'unknown' }} + let(:request) { get api(route, user), params: { sort: 'unknown' } } end end end diff --git a/spec/requests/api/ci/jobs_spec.rb b/spec/requests/api/ci/jobs_spec.rb index 84ef9f8db1b..57828e50320 100644 --- a/spec/requests/api/ci/jobs_spec.rb +++ b/spec/requests/api/ci/jobs_spec.rb @@ -158,7 +158,7 @@ RSpec.describe API::Ci::Jobs do context 'with basic auth header' do let(:personal_access_token) { create(:personal_access_token, user: user) } - let(:token) { personal_access_token.token} + let(:token) { personal_access_token.token } include_context 'with auth headers' do let(:header) { { Gitlab::Auth::AuthFinders::PRIVATE_TOKEN_HEADER => token } } diff --git a/spec/requests/api/ci/runner/jobs_request_post_spec.rb b/spec/requests/api/ci/runner/jobs_request_post_spec.rb index 746be1ccc44..cd58251cfcc 100644 --- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb +++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb @@ -29,7 +29,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do describe 'POST /api/v4/jobs/request' do let!(:last_update) {} - let!(:new_update) { } + let!(:new_update) {} let(:user_agent) { 'gitlab-runner 9.0.0 (9-0-stable; go1.7.4; linux/amd64)' } before do diff --git a/spec/requests/api/ci/runner/jobs_trace_spec.rb b/spec/requests/api/ci/runner/jobs_trace_spec.rb index c3c074d80d9..d42043a7fe5 100644 --- a/spec/requests/api/ci/runner/jobs_trace_spec.rb +++ b/spec/requests/api/ci/runner/jobs_trace_spec.rb @@ -61,7 +61,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_trace_chunks do end context 'when job has been updated recently' do - it { expect { patch_the_trace }.not_to change { job.updated_at }} + it { expect { patch_the_trace }.not_to change { job.updated_at } } it "changes the job's trace" do patch_the_trace @@ -70,7 +70,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_trace_chunks do end context 'when Runner makes a force-patch' do - it { expect { force_patch_the_trace }.not_to change { job.updated_at }} + it { expect { force_patch_the_trace }.not_to change { job.updated_at } } it "doesn't change the build.trace" do force_patch_the_trace diff --git a/spec/requests/api/ci/secure_files_spec.rb b/spec/requests/api/ci/secure_files_spec.rb index 6f16fe5460b..f1f22dfadc2 100644 --- a/spec/requests/api/ci/secure_files_spec.rb +++ b/spec/requests/api/ci/secure_files_spec.rb @@ -59,7 +59,7 @@ RSpec.describe API::Ci::SecureFiles do expect do post api("/projects/#{project.id}/secure_files", maintainer), params: file_params - end.not_to change {project.secure_files.count} + end.not_to change { project.secure_files.count } expect(response).to have_gitlab_http_status(:service_unavailable) end @@ -78,7 +78,7 @@ RSpec.describe API::Ci::SecureFiles do it 'returns a 201 when uploading a file when the ci_secure_files_read_only feature flag is disabled' do expect do post api("/projects/#{project.id}/secure_files", maintainer), params: file_params - end.to change {project.secure_files.count}.by(1) + end.to change { project.secure_files.count }.by(1) expect(response).to have_gitlab_http_status(:created) end @@ -249,7 +249,7 @@ RSpec.describe API::Ci::SecureFiles do it 'creates a secure file' do expect do post api("/projects/#{project.id}/secure_files", maintainer), params: file_params - end.to change {project.secure_files.count}.by(1) + end.to change { project.secure_files.count }.by(1) expect(response).to have_gitlab_http_status(:created) expect(json_response['name']).to eq('upload-keystore.jks') diff --git a/spec/requests/api/ci/triggers_spec.rb b/spec/requests/api/ci/triggers_spec.rb index a036a55f5f3..953dcb8a483 100644 --- a/spec/requests/api/ci/triggers_spec.rb +++ b/spec/requests/api/ci/triggers_spec.rb @@ -136,8 +136,8 @@ RSpec.describe API::Ci::Triggers do end context 'when triggered from another running job' do - let!(:trigger) { } - let!(:trigger_request) { } + let!(:trigger) {} + let!(:trigger_request) {} context 'when other job is triggered by a user' do let(:trigger_token) { create(:ci_build, :running, project: project, user: user).token } @@ -242,7 +242,7 @@ RSpec.describe API::Ci::Triggers do expect do post api("/projects/#{project.id}/triggers", user), params: { description: 'trigger' } - end.to change {project.triggers.count}.by(1) + end.to change { project.triggers.count }.by(1) expect(response).to have_gitlab_http_status(:created) expect(json_response).to include('description' => 'trigger') @@ -335,7 +335,7 @@ RSpec.describe API::Ci::Triggers do delete api("/projects/#{project.id}/triggers/#{trigger.id}", user) expect(response).to have_gitlab_http_status(:no_content) - end.to change {project.triggers.count}.by(-1) + end.to change { project.triggers.count }.by(-1) end it 'responds with 404 Not Found if requesting non-existing trigger' do diff --git a/spec/requests/api/ci/variables_spec.rb b/spec/requests/api/ci/variables_spec.rb index dc524e121d5..74ed8c1551d 100644 --- a/spec/requests/api/ci/variables_spec.rb +++ b/spec/requests/api/ci/variables_spec.rb @@ -116,7 +116,7 @@ RSpec.describe API::Ci::Variables do it 'creates variable' do expect do post api("/projects/#{project.id}/variables", user), params: { key: 'TEST_VARIABLE_2', value: 'PROTECTED_VALUE_2', protected: true, masked: true } - end.to change {project.variables.count}.by(1) + end.to change { project.variables.count }.by(1) expect(response).to have_gitlab_http_status(:created) expect(json_response['key']).to eq('TEST_VARIABLE_2') @@ -129,7 +129,7 @@ RSpec.describe API::Ci::Variables do it 'creates variable with optional attributes' do expect do post api("/projects/#{project.id}/variables", user), params: { variable_type: 'file', key: 'TEST_VARIABLE_2', value: 'VALUE_2' } - end.to change {project.variables.count}.by(1) + end.to change { project.variables.count }.by(1) expect(response).to have_gitlab_http_status(:created) expect(json_response['key']).to eq('TEST_VARIABLE_2') @@ -142,7 +142,7 @@ RSpec.describe API::Ci::Variables do it 'does not allow to duplicate variable key' do expect do post api("/projects/#{project.id}/variables", user), params: { key: variable.key, value: 'VALUE_2' } - end.to change {project.variables.count}.by(0) + end.to change { project.variables.count }.by(0) expect(response).to have_gitlab_http_status(:bad_request) end @@ -268,7 +268,7 @@ RSpec.describe API::Ci::Variables do delete api("/projects/#{project.id}/variables/#{variable.key}", user) expect(response).to have_gitlab_http_status(:no_content) - end.to change {project.variables.count}.by(-1) + end.to change { project.variables.count }.by(-1) end it 'responds with 404 Not Found if requesting non-existing variable' do @@ -295,7 +295,7 @@ RSpec.describe API::Ci::Variables do delete api("/projects/#{project.id}/variables/key1", user), params: { 'filter[environment_scope]': 'production' } expect(response).to have_gitlab_http_status(:no_content) - end.to change {project.variables.count}.by(-1) + end.to change { project.variables.count }.by(-1) expect(var1.reload).to be_present expect { var2.reload }.to raise_error(ActiveRecord::RecordNotFound) diff --git a/spec/requests/api/clusters/agents_spec.rb b/spec/requests/api/clusters/agents_spec.rb index 72d4266b9e3..5e3bdd69529 100644 --- a/spec/requests/api/clusters/agents_spec.rb +++ b/spec/requests/api/clusters/agents_spec.rb @@ -101,7 +101,7 @@ RSpec.describe API::Clusters::Agents do expect do post(api("/projects/#{project.id}/cluster_agents", user), params: { name: 'some-agent' }) - end.to change {project.cluster_agents.count}.by(1) + end.to change { project.cluster_agents.count }.by(1) aggregate_failures "testing response" do expect(response).to have_gitlab_http_status(:created) @@ -139,7 +139,7 @@ RSpec.describe API::Clusters::Agents do delete api("/projects/#{project.id}/cluster_agents/#{agent.id}", user) expect(response).to have_gitlab_http_status(:no_content) - end.to change {project.cluster_agents.count}.by(-1) + end.to change { project.cluster_agents.count }.by(-1) end it 'returns a 404 error when deleting non existent agent' do diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb index 9ef845f06bf..6dd163b908b 100644 --- a/spec/requests/api/commits_spec.rb +++ b/spec/requests/api/commits_spec.rb @@ -988,8 +988,8 @@ RSpec.describe API::Commits do it 'returns all refs with no scope' do get api(route, current_user), params: { per_page: 100 } - refs = project.repository.branch_names_contains(commit_id).map {|name| ['branch', name]} - refs.concat(project.repository.tag_names_contains(commit_id).map {|name| ['tag', name]}) + refs = project.repository.branch_names_contains(commit_id).map { |name| ['branch', name] } + refs.concat(project.repository.tag_names_contains(commit_id).map { |name| ['tag', name] }) expect(response).to have_gitlab_http_status(:ok) expect(response).to include_limited_pagination_headers @@ -1000,8 +1000,8 @@ RSpec.describe API::Commits do it 'returns all refs' do get api(route, current_user), params: { type: 'all', per_page: 100 } - refs = project.repository.branch_names_contains(commit_id).map {|name| ['branch', name]} - refs.concat(project.repository.tag_names_contains(commit_id).map {|name| ['tag', name]}) + refs = project.repository.branch_names_contains(commit_id).map { |name| ['branch', name] } + refs.concat(project.repository.tag_names_contains(commit_id).map { |name| ['tag', name] }) expect(response).to have_gitlab_http_status(:ok) expect(json_response.map { |r| [r['type'], r['name']] }.compact).to eq(refs) @@ -1010,7 +1010,7 @@ RSpec.describe API::Commits do it 'returns the branch refs' do get api(route, current_user), params: { type: 'branch', per_page: 100 } - refs = project.repository.branch_names_contains(commit_id).map {|name| ['branch', name]} + refs = project.repository.branch_names_contains(commit_id).map { |name| ['branch', name] } expect(response).to have_gitlab_http_status(:ok) expect(json_response.map { |r| [r['type'], r['name']] }.compact).to eq(refs) @@ -1019,7 +1019,7 @@ RSpec.describe API::Commits do it 'returns the tag refs' do get api(route, current_user), params: { type: 'tag', per_page: 100 } - refs = project.repository.tag_names_contains(commit_id).map {|name| ['tag', name]} + refs = project.repository.tag_names_contains(commit_id).map { |name| ['tag', name] } expect(response).to have_gitlab_http_status(:ok) expect(json_response.map { |r| [r['type'], r['name']] }.compact).to eq(refs) @@ -2036,7 +2036,7 @@ RSpec.describe API::Commits do context 'unsigned commit' do it_behaves_like '404 response' do let(:request) { get api(route, current_user) } - let(:message) { '404 Signature Not Found'} + let(:message) { '404 Signature Not Found' } end end diff --git a/spec/requests/api/conan_instance_packages_spec.rb b/spec/requests/api/conan_instance_packages_spec.rb index 54cad3093d7..e4747e0eb99 100644 --- a/spec/requests/api/conan_instance_packages_spec.rb +++ b/spec/requests/api/conan_instance_packages_spec.rb @@ -94,7 +94,7 @@ RSpec.describe API::ConanInstancePackages do end describe 'DELETE /api/v4/packages/conan/v1/conans/:package_name/package_version/:package_username/:package_channel' do - subject { delete api("/packages/conan/v1/conans/#{recipe_path}"), headers: headers} + subject { delete api("/packages/conan/v1/conans/#{recipe_path}"), headers: headers } it_behaves_like 'delete package endpoint' end diff --git a/spec/requests/api/conan_project_packages_spec.rb b/spec/requests/api/conan_project_packages_spec.rb index e28105eb8eb..48e36b55a68 100644 --- a/spec/requests/api/conan_project_packages_spec.rb +++ b/spec/requests/api/conan_project_packages_spec.rb @@ -93,7 +93,7 @@ RSpec.describe API::ConanProjectPackages do end describe 'DELETE /api/v4/projects/:id/packages/conan/v1/conans/:package_name/package_version/:package_username/:package_channel' do - subject { delete api("/projects/#{project_id}/packages/conan/v1/conans/#{recipe_path}"), headers: headers} + subject { delete api("/projects/#{project_id}/packages/conan/v1/conans/#{recipe_path}"), headers: headers } it_behaves_like 'delete package endpoint' end diff --git a/spec/requests/api/dependency_proxy_spec.rb b/spec/requests/api/dependency_proxy_spec.rb index 067852ef1e9..a8617fcb0bf 100644 --- a/spec/requests/api/dependency_proxy_spec.rb +++ b/spec/requests/api/dependency_proxy_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe API::DependencyProxy, api: true do let_it_be(:user) { create(:user) } - let_it_be(:blob) { create(:dependency_proxy_blob )} + let_it_be(:blob) { create(:dependency_proxy_blob ) } let_it_be(:group, reload: true) { blob.group } before do diff --git a/spec/requests/api/deployments_spec.rb b/spec/requests/api/deployments_spec.rb index 4328fd4dbe7..8d40ced495f 100644 --- a/spec/requests/api/deployments_spec.rb +++ b/spec/requests/api/deployments_spec.rb @@ -451,7 +451,7 @@ RSpec.describe API::Deployments do describe 'DELETE /projects/:id/deployments/:deployment_id' do let(:project) { create(:project, :repository) } let(:environment) { create(:environment, project: project) } - let(:commits) { project.repository.commits(nil, { limit: 2 })} + let(:commits) { project.repository.commits(nil, { limit: 2 }) } let!(:deploy) do create( :deployment, diff --git a/spec/requests/api/go_proxy_spec.rb b/spec/requests/api/go_proxy_spec.rb index 0143340de11..2b1250320ce 100644 --- a/spec/requests/api/go_proxy_spec.rb +++ b/spec/requests/api/go_proxy_spec.rb @@ -318,7 +318,7 @@ RSpec.describe API::GoProxy do context 'with a case sensitive project and versions' do let_it_be(:project) { create :project_empty_repo, :public, creator: user, path: 'MyGoLib' } let_it_be(:base) { "#{Settings.build_gitlab_go_url}/#{project.full_path}" } - let_it_be(:base_encoded) { base.gsub(/[A-Z]/) { |s| "!#{s.downcase}"} } + let_it_be(:base_encoded) { base.gsub(/[A-Z]/) { |s| "!#{s.downcase}" } } let_it_be(:modules) do create(:go_module_commit, :files, project: project, files: { 'README.md' => "Hi" }) diff --git a/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb b/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb index 6324db0be4a..484ddc3469b 100644 --- a/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb +++ b/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'get board lists' do let_it_be(:group_label2) { create(:group_label, group: group, name: 'Testing') } let(:params) { '' } - let(:board) { } + let(:board) {} let(:confidential) { false } let(:board_parent_type) { board_parent.class.to_s.downcase } let(:board_data) { graphql_data[board_parent_type]['boards']['nodes'][0] } diff --git a/spec/requests/api/graphql/boards/board_lists_query_spec.rb b/spec/requests/api/graphql/boards/board_lists_query_spec.rb index 39ff108a9e1..6fe2e41cf35 100644 --- a/spec/requests/api/graphql/boards/board_lists_query_spec.rb +++ b/spec/requests/api/graphql/boards/board_lists_query_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'get board lists' do let_it_be(:group_label2) { create(:group_label, group: group, name: 'Testing') } let(:params) { '' } - let(:board) { } + let(:board) {} let(:board_parent_type) { board_parent.class.to_s.downcase } let(:board_data) { graphql_data[board_parent_type]['boards']['edges'].first['node'] } let(:lists_data) { board_data['lists']['edges'] } diff --git a/spec/requests/api/graphql/mutations/award_emojis/add_spec.rb b/spec/requests/api/graphql/mutations/award_emojis/add_spec.rb index fdf5503a3a2..3879e58cecf 100644 --- a/spec/requests/api/graphql/mutations/award_emojis/add_spec.rb +++ b/spec/requests/api/graphql/mutations/award_emojis/add_spec.rb @@ -74,7 +74,7 @@ RSpec.describe 'Adding an AwardEmoji' do end describe 'marking Todos as done' do - let(:user) { current_user} + let(:user) { current_user } subject { post_graphql_mutation(mutation, current_user: user) } diff --git a/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb b/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb index 6b26e37e30c..7ddffa1ab0a 100644 --- a/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb +++ b/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb @@ -84,7 +84,7 @@ RSpec.describe 'Toggling an AwardEmoji' do end describe 'marking Todos as done' do - let(:user) { current_user} + let(:user) { current_user } subject { post_graphql_mutation(mutation, current_user: user) } diff --git a/spec/requests/api/graphql/mutations/releases/create_spec.rb b/spec/requests/api/graphql/mutations/releases/create_spec.rb index 1e62942c29d..2541072b766 100644 --- a/spec/requests/api/graphql/mutations/releases/create_spec.rb +++ b/spec/requests/api/graphql/mutations/releases/create_spec.rb @@ -16,10 +16,10 @@ RSpec.describe 'Creation of a new release' do let(:mutation_name) { :release_create } - let(:tag_name) { 'v7.12.5'} + let(:tag_name) { 'v7.12.5' } let(:tag_message) { nil } - let(:ref) { 'master'} - let(:name) { 'Version 7.12.5'} + let(:ref) { 'master' } + let(:name) { 'Version 7.12.5' } let(:description) { 'Release 7.12.5 :rocket:' } let(:released_at) { '2018-12-10' } let(:milestones) { [milestone_12_3.title, milestone_12_4.title] } diff --git a/spec/requests/api/graphql/mutations/releases/update_spec.rb b/spec/requests/api/graphql/mutations/releases/update_spec.rb index 0fa3d7de299..33d4e57904c 100644 --- a/spec/requests/api/graphql/mutations/releases/update_spec.rb +++ b/spec/requests/api/graphql/mutations/releases/update_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'Updating an existing release' do let_it_be(:milestone_12_4) { create(:milestone, project: project, title: '12.4') } let_it_be(:tag_name) { 'v1.1.0' } - let_it_be(:name) { 'Version 7.12.5'} + let_it_be(:name) { 'Version 7.12.5' } let_it_be(:description) { 'Release 7.12.5 :rocket:' } let_it_be(:released_at) { '2018-12-10' } let_it_be(:created_at) { '2018-11-05' } diff --git a/spec/requests/api/graphql/mutations/snippets/create_spec.rb b/spec/requests/api/graphql/mutations/snippets/create_spec.rb index 9a3cea3ca14..264fa5732c3 100644 --- a/spec/requests/api/graphql/mutations/snippets/create_spec.rb +++ b/spec/requests/api/graphql/mutations/snippets/create_spec.rb @@ -12,8 +12,8 @@ RSpec.describe 'Creating a Snippet' do let(:title) { 'Initial title' } let(:visibility_level) { 'public' } let(:action) { :create } - let(:file_1) { { filePath: 'example_file1', content: 'This is the example file 1' }} - let(:file_2) { { filePath: 'example_file2', content: 'This is the example file 2' }} + let(:file_1) { { filePath: 'example_file1', content: 'This is the example file 1' } } + let(:file_2) { { filePath: 'example_file2', content: 'This is the example file 2' } } let(:actions) { [{ action: action }.merge(file_1), { action: action }.merge(file_2)] } let(:project_path) { nil } let(:uploaded_files) { nil } @@ -149,7 +149,7 @@ RSpec.describe 'Creating a Snippet' do end context 'when there non ActiveRecord errors' do - let(:file_1) { { filePath: 'invalid://file/path', content: 'foobar' }} + let(:file_1) { { filePath: 'invalid://file/path', content: 'foobar' } } it_behaves_like 'a mutation that returns errors in the response', errors: ['Repository Error creating the snippet - Invalid file name'] it_behaves_like 'does not create snippet' diff --git a/spec/requests/api/graphql/mutations/timelogs/delete_spec.rb b/spec/requests/api/graphql/mutations/timelogs/delete_spec.rb index b674e77f093..d304bfbdf00 100644 --- a/spec/requests/api/graphql/mutations/timelogs/delete_spec.rb +++ b/spec/requests/api/graphql/mutations/timelogs/delete_spec.rb @@ -7,7 +7,7 @@ RSpec.describe 'Delete a timelog' do let_it_be(:author) { create(:user) } let_it_be(:project) { create(:project, :public) } let_it_be(:issue) { create(:issue, project: project) } - let_it_be(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800)} + let_it_be(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800) } let(:current_user) { nil } let(:mutation) { graphql_mutation(:timelogDelete, { 'id' => timelog.to_global_id.to_s }) } diff --git a/spec/requests/api/graphql/mutations/work_items/create_spec.rb b/spec/requests/api/graphql/mutations/work_items/create_spec.rb index 2a542cef5de..8233821053f 100644 --- a/spec/requests/api/graphql/mutations/work_items/create_spec.rb +++ b/spec/requests/api/graphql/mutations/work_items/create_spec.rb @@ -129,7 +129,7 @@ RSpec.describe 'Create a work item' do end context 'when parent work item is not found' do - let_it_be(:parent) { build_stubbed(:work_item, id: non_existing_record_id)} + let_it_be(:parent) { build_stubbed(:work_item, id: non_existing_record_id) } it 'returns a top level error' do post_graphql_mutation(mutation, current_user: current_user) diff --git a/spec/requests/api/graphql/mutations/work_items/update_spec.rb b/spec/requests/api/graphql/mutations/work_items/update_spec.rb index bd6ec4b9535..6ee3d5b1d35 100644 --- a/spec/requests/api/graphql/mutations/work_items/update_spec.rb +++ b/spec/requests/api/graphql/mutations/work_items/update_spec.rb @@ -103,7 +103,7 @@ RSpec.describe 'Update a work item' do let(:input) { { 'confidential' => true } } it_behaves_like 'toggling confidentiality' do - let(:values) { { old: false, new: true }} + let(:values) { { old: false, new: true } } end end @@ -115,7 +115,7 @@ RSpec.describe 'Update a work item' do end it_behaves_like 'toggling confidentiality' do - let(:values) { { old: true, new: false }} + let(:values) { { old: true, new: false } } end end end diff --git a/spec/requests/api/graphql/namespace/root_storage_statistics_spec.rb b/spec/requests/api/graphql/namespace/root_storage_statistics_spec.rb index 37cc502103d..8d8a0baae36 100644 --- a/spec/requests/api/graphql/namespace/root_storage_statistics_spec.rb +++ b/spec/requests/api/graphql/namespace/root_storage_statistics_spec.rb @@ -49,7 +49,7 @@ RSpec.describe 'rendering namespace statistics' do it_behaves_like 'a working namespace with storage statistics query' context 'when the namespace is public' do - let(:group) { create(:group, :public)} + let(:group) { create(:group, :public) } it 'hides statistics for unauthenticated requests' do post_graphql(query, current_user: nil) diff --git a/spec/requests/api/graphql/packages/conan_spec.rb b/spec/requests/api/graphql/packages/conan_spec.rb index 1f3732980d9..5bd5a71bbeb 100644 --- a/spec/requests/api/graphql/packages/conan_spec.rb +++ b/spec/requests/api/graphql/packages/conan_spec.rb @@ -8,7 +8,7 @@ RSpec.describe 'conan package details' do let_it_be(:package) { create(:conan_package, project: project) } let(:metadata) { query_graphql_fragment('ConanMetadata') } - let(:package_files_metadata) {query_graphql_fragment('ConanFileMetadata')} + let(:package_files_metadata) { query_graphql_fragment('ConanFileMetadata') } let(:query) do graphql_query_for(:package, { id: package_global_id }, <<~FIELDS) diff --git a/spec/requests/api/graphql/packages/helm_spec.rb b/spec/requests/api/graphql/packages/helm_spec.rb index 397096f70db..1675b8faa23 100644 --- a/spec/requests/api/graphql/packages/helm_spec.rb +++ b/spec/requests/api/graphql/packages/helm_spec.rb @@ -7,7 +7,7 @@ RSpec.describe 'helm package details' do let_it_be(:package) { create(:helm_package, project: project) } - let(:package_files_metadata) {query_graphql_fragment('HelmFileMetadata')} + let(:package_files_metadata) { query_graphql_fragment('HelmFileMetadata') } let(:query) do graphql_query_for(:package, { id: package_global_id }, <<~FIELDS) diff --git a/spec/requests/api/graphql/packages/package_spec.rb b/spec/requests/api/graphql/packages/package_spec.rb index 0335c1085b4..c28b37db5af 100644 --- a/spec/requests/api/graphql/packages/package_spec.rb +++ b/spec/requests/api/graphql/packages/package_spec.rb @@ -18,7 +18,7 @@ RSpec.describe 'package details' do let(:depth) { 3 } let(:excluded) { %w[metadata apiFuzzingCiConfiguration pipeline packageFiles] } let(:metadata) { query_graphql_fragment('ComposerMetadata') } - let(:package_files) {all_graphql_fields_for('PackageFile')} + let(:package_files) { all_graphql_fields_for('PackageFile') } let(:package_global_id) { global_id_of(composer_package) } let(:package_details) { graphql_data_at(:package) } diff --git a/spec/requests/api/graphql/project/base_service_spec.rb b/spec/requests/api/graphql/project/base_service_spec.rb index 5dc0f55db88..58d10ade8cf 100644 --- a/spec/requests/api/graphql/project/base_service_spec.rb +++ b/spec/requests/api/graphql/project/base_service_spec.rb @@ -26,7 +26,7 @@ RSpec.describe 'query Jira service' do ) end - let(:services) { graphql_data.dig('project', 'services', 'nodes')} + let(:services) { graphql_data.dig('project', 'services', 'nodes') } it_behaves_like 'unauthorized users cannot read services' diff --git a/spec/requests/api/graphql/project/jira_import_spec.rb b/spec/requests/api/graphql/project/jira_import_spec.rb index 98a3f08baa6..202220f4bf6 100644 --- a/spec/requests/api/graphql/project/jira_import_spec.rb +++ b/spec/requests/api/graphql/project/jira_import_spec.rb @@ -56,8 +56,8 @@ RSpec.describe 'query Jira import data' do ) end - let(:jira_imports) { graphql_data.dig('project', 'jiraImports', 'nodes')} - let(:jira_import_status) { graphql_data.dig('project', 'jiraImportStatus')} + let(:jira_imports) { graphql_data.dig('project', 'jiraImports', 'nodes') } + let(:jira_import_status) { graphql_data.dig('project', 'jiraImportStatus') } context 'when user cannot read Jira import data' do before do @@ -89,11 +89,11 @@ RSpec.describe 'query Jira import data' do context 'list of jira imports sorted ascending by scheduledAt time' do it 'retuns list of jira imports' do - jira_proket_keys = jira_imports.map {|ji| ji['jiraProjectKey']} - usernames = jira_imports.map {|ji| ji.dig('scheduledBy', 'username')} - imported_issues_count = jira_imports.map {|ji| ji.dig('importedIssuesCount')} - failed_issues_count = jira_imports.map {|ji| ji.dig('failedToImportCount')} - total_issue_count = jira_imports.map {|ji| ji.dig('totalIssueCount')} + jira_proket_keys = jira_imports.map { |ji| ji['jiraProjectKey'] } + usernames = jira_imports.map { |ji| ji.dig('scheduledBy', 'username') } + imported_issues_count = jira_imports.map { |ji| ji.dig('importedIssuesCount') } + failed_issues_count = jira_imports.map { |ji| ji.dig('failedToImportCount') } + total_issue_count = jira_imports.map { |ji| ji.dig('totalIssueCount') } expect(jira_imports.size).to eq 2 expect(jira_proket_keys).to eq %w(BB AA) diff --git a/spec/requests/api/group_variables_spec.rb b/spec/requests/api/group_variables_spec.rb index a7b4bea362f..4fed7dd7624 100644 --- a/spec/requests/api/group_variables_spec.rb +++ b/spec/requests/api/group_variables_spec.rb @@ -91,7 +91,7 @@ RSpec.describe API::GroupVariables do it 'creates variable' do expect do post api("/groups/#{group.id}/variables", user), params: { key: 'TEST_VARIABLE_2', value: 'PROTECTED_VALUE_2', protected: true, masked: true } - end.to change {group.variables.count}.by(1) + end.to change { group.variables.count }.by(1) expect(response).to have_gitlab_http_status(:created) expect(json_response['key']).to eq('TEST_VARIABLE_2') @@ -105,7 +105,7 @@ RSpec.describe API::GroupVariables do it 'creates variable with optional attributes' do expect do post api("/groups/#{group.id}/variables", user), params: { variable_type: 'file', key: 'TEST_VARIABLE_2', value: 'VALUE_2' } - end.to change {group.variables.count}.by(1) + end.to change { group.variables.count }.by(1) expect(response).to have_gitlab_http_status(:created) expect(json_response['key']).to eq('TEST_VARIABLE_2') @@ -119,7 +119,7 @@ RSpec.describe API::GroupVariables do it 'does not allow to duplicate variable key' do expect do post api("/groups/#{group.id}/variables", user), params: { key: variable.key, value: 'VALUE_2' } - end.to change {group.variables.count}.by(0) + end.to change { group.variables.count }.by(0) expect(response).to have_gitlab_http_status(:bad_request) end @@ -207,7 +207,7 @@ RSpec.describe API::GroupVariables do delete api("/groups/#{group.id}/variables/#{variable.key}", user) expect(response).to have_gitlab_http_status(:no_content) - end.to change {group.variables.count}.by(-1) + end.to change { group.variables.count }.by(-1) end it 'responds with 404 Not Found if requesting non-existing variable' do diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb index 3bc3cce5310..bc37f8e4655 100644 --- a/spec/requests/api/groups_spec.rb +++ b/spec/requests/api/groups_spec.rb @@ -864,7 +864,7 @@ RSpec.describe API::Groups do end describe 'PUT /groups/:id' do - let(:new_group_name) { 'New Group'} + let(:new_group_name) { 'New Group' } let(:file_path) { 'spec/fixtures/dk.png' } it_behaves_like 'group avatar upload' do diff --git a/spec/requests/api/helpers_spec.rb b/spec/requests/api/helpers_spec.rb index 8961f3177b6..c961fd9cfc8 100644 --- a/spec/requests/api/helpers_spec.rb +++ b/spec/requests/api/helpers_spec.rb @@ -26,8 +26,8 @@ RSpec.describe API::Helpers do } end - let(:header) { } - let(:request) { Grape::Request.new(env)} + let(:header) {} + let(:request) { Grape::Request.new(env) } let(:params) { request.params } before do diff --git a/spec/requests/api/internal/base_spec.rb b/spec/requests/api/internal/base_spec.rb index acfe476a864..cc329b87047 100644 --- a/spec/requests/api/internal/base_spec.rb +++ b/spec/requests/api/internal/base_spec.rb @@ -1451,7 +1451,7 @@ RSpec.describe API::Internal::Base do describe 'POST /internal/two_factor_otp_check' do let(:key_id) { key.id } - let(:otp) { '123456'} + let(:otp) { '123456' } subject do post api('/internal/two_factor_otp_check'), @@ -1472,7 +1472,7 @@ RSpec.describe API::Internal::Base do describe 'POST /internal/two_factor_manual_otp_check' do let(:key_id) { key.id } - let(:otp) { '123456'} + let(:otp) { '123456' } subject do post api('/internal/two_factor_manual_otp_check'), @@ -1493,7 +1493,7 @@ RSpec.describe API::Internal::Base do describe 'POST /internal/two_factor_push_otp_check' do let(:key_id) { key.id } - let(:otp) { '123456'} + let(:otp) { '123456' } subject do post api('/internal/two_factor_push_otp_check'), @@ -1514,7 +1514,7 @@ RSpec.describe API::Internal::Base do describe 'POST /internal/two_factor_manual_otp_check' do let(:key_id) { key.id } - let(:otp) { '123456'} + let(:otp) { '123456' } subject do post api('/internal/two_factor_manual_otp_check'), @@ -1534,7 +1534,7 @@ RSpec.describe API::Internal::Base do describe 'POST /internal/two_factor_push_otp_check' do let(:key_id) { key.id } - let(:otp) { '123456'} + let(:otp) { '123456' } subject do post api('/internal/two_factor_push_otp_check'), diff --git a/spec/requests/api/markdown_spec.rb b/spec/requests/api/markdown_spec.rb index 47e1f007daa..15283b5cc63 100644 --- a/spec/requests/api/markdown_spec.rb +++ b/spec/requests/api/markdown_spec.rb @@ -131,7 +131,7 @@ RSpec.describe API::Markdown do end context 'when not logged in' do - let(:user) { } + let(:user) {} it_behaves_like 'user without proper access' end @@ -176,7 +176,7 @@ RSpec.describe API::Markdown do end context 'when not logged in' do - let(:user) { } + let(:user) {} it_behaves_like 'user without proper access' end diff --git a/spec/requests/api/maven_packages_spec.rb b/spec/requests/api/maven_packages_spec.rb index 321592fd844..1b378788b6a 100644 --- a/spec/requests/api/maven_packages_spec.rb +++ b/spec/requests/api/maven_packages_spec.rb @@ -34,7 +34,7 @@ RSpec.describe API::MavenPackages do end let(:version) { '1.0-SNAPSHOT' } - let(:param_path) { "#{package_name}/#{version}"} + let(:param_path) { "#{package_name}/#{version}" } before do project.add_developer(user) diff --git a/spec/requests/api/members_spec.rb b/spec/requests/api/members_spec.rb index e4c2f17af47..3a722b7b518 100644 --- a/spec/requests/api/members_spec.rb +++ b/spec/requests/api/members_spec.rb @@ -187,8 +187,8 @@ RSpec.describe API::Members do end context 'with a subgroup' do - let(:group) { create(:group, :private)} - let(:subgroup) { create(:group, :private, parent: group)} + let(:group) { create(:group, :private) } + let(:subgroup) { create(:group, :private, parent: group) } let(:project) { create(:project, group: subgroup) } before do diff --git a/spec/requests/api/metrics/dashboard/annotations_spec.rb b/spec/requests/api/metrics/dashboard/annotations_spec.rb index 79a38702354..5e64ac7d481 100644 --- a/spec/requests/api/metrics/dashboard/annotations_spec.rb +++ b/spec/requests/api/metrics/dashboard/annotations_spec.rb @@ -10,7 +10,7 @@ RSpec.describe API::Metrics::Dashboard::Annotations do let(:dashboard) { 'config/prometheus/common_metrics.yml' } let(:starting_at) { Time.now.iso8601 } let(:ending_at) { 1.hour.from_now.iso8601 } - let(:params) { attributes_for(:metrics_dashboard_annotation, environment: environment, starting_at: starting_at, ending_at: ending_at, dashboard_path: dashboard)} + let(:params) { attributes_for(:metrics_dashboard_annotation, environment: environment, starting_at: starting_at, ending_at: ending_at, dashboard_path: dashboard) } shared_examples 'POST /:source_type/:id/metrics_dashboard/annotations' do |source_type| let(:url) { "/#{source_type.pluralize}/#{source.id}/metrics_dashboard/annotations" } diff --git a/spec/requests/api/notes_spec.rb b/spec/requests/api/notes_spec.rb index f6a65274ca2..89abb28140a 100644 --- a/spec/requests/api/notes_spec.rb +++ b/spec/requests/api/notes_spec.rb @@ -111,7 +111,7 @@ RSpec.describe API::Notes do system: false end - let(:test_url) {"/projects/#{ext_proj.id}/issues/#{ext_issue.iid}/notes"} + let(:test_url) { "/projects/#{ext_proj.id}/issues/#{ext_issue.iid}/notes" } shared_examples 'a notes request' do it 'is a note array response' do diff --git a/spec/requests/api/npm_project_packages_spec.rb b/spec/requests/api/npm_project_packages_spec.rb index 62809b432af..6061b3ba965 100644 --- a/spec/requests/api/npm_project_packages_spec.rb +++ b/spec/requests/api/npm_project_packages_spec.rb @@ -307,8 +307,8 @@ RSpec.describe API::NpmProjectPackages do expect { upload_package_with_token } .to change { project.packages.count }.by(1) .and change { Packages::PackageFile.count }.by(1) - .and change { Packages::Dependency.count}.by(4) - .and change { Packages::DependencyLink.count}.by(6) + .and change { Packages::Dependency.count }.by(4) + .and change { Packages::DependencyLink.count }.by(6) expect(response).to have_gitlab_http_status(:ok) end @@ -323,8 +323,8 @@ RSpec.describe API::NpmProjectPackages do expect { upload_package_with_token } .to change { project.packages.count }.by(1) .and change { Packages::PackageFile.count }.by(1) - .and not_change { Packages::Dependency.count} - .and change { Packages::DependencyLink.count}.by(6) + .and not_change { Packages::Dependency.count } + .and change { Packages::DependencyLink.count }.by(6) end end end diff --git a/spec/requests/api/nuget_group_packages_spec.rb b/spec/requests/api/nuget_group_packages_spec.rb index 1b71f0f9de1..c1375288809 100644 --- a/spec/requests/api/nuget_group_packages_spec.rb +++ b/spec/requests/api/nuget_group_packages_spec.rb @@ -73,7 +73,7 @@ RSpec.describe API::NugetGroupPackages do let(:include_prereleases) { true } let(:query_parameters) { { q: search_term, take: take, skip: skip, prerelease: include_prereleases }.compact } - subject { get api(url), headers: {}} + subject { get api(url), headers: {} } shared_examples 'handling mixed visibilities' do where(:group_visibility, :subgroup_visibility, :expected_status) do diff --git a/spec/requests/api/pages/pages_spec.rb b/spec/requests/api/pages/pages_spec.rb index 0eb2ae64f43..7d44ff533aa 100644 --- a/spec/requests/api/pages/pages_spec.rb +++ b/spec/requests/api/pages/pages_spec.rb @@ -19,7 +19,7 @@ RSpec.describe API::Pages do end it_behaves_like '404 response' do - let(:request) { delete api("/projects/#{project.id}/pages", admin)} + let(:request) { delete api("/projects/#{project.id}/pages", admin) } end end diff --git a/spec/requests/api/pages_domains_spec.rb b/spec/requests/api/pages_domains_spec.rb index 75183156c9d..cd4e8b30d8f 100644 --- a/spec/requests/api/pages_domains_spec.rb +++ b/spec/requests/api/pages_domains_spec.rb @@ -19,8 +19,8 @@ RSpec.describe API::PagesDomains do end let(:pages_domain_secure_params) { build(:pages_domain, domain: 'ssl.other-domain.test', project: project).slice(:domain, :certificate, :key) } - let(:pages_domain_secure_key_missmatch_params) {build(:pages_domain, :with_trusted_chain, project: project).slice(:domain, :certificate, :key) } - let(:pages_domain_secure_missing_chain_params) {build(:pages_domain, :with_missing_chain, project: project).slice(:certificate) } + let(:pages_domain_secure_key_missmatch_params) { build(:pages_domain, :with_trusted_chain, project: project).slice(:domain, :certificate, :key) } + let(:pages_domain_secure_missing_chain_params) { build(:pages_domain, :with_missing_chain, project: project).slice(:certificate) } let(:route) { "/projects/#{project.id}/pages/domains" } let(:route_domain) { "/projects/#{project.id}/pages/domains/#{pages_domain.domain}" } diff --git a/spec/requests/api/personal_access_tokens_spec.rb b/spec/requests/api/personal_access_tokens_spec.rb index 403c646ee32..f261e7db024 100644 --- a/spec/requests/api/personal_access_tokens_spec.rb +++ b/spec/requests/api/personal_access_tokens_spec.rb @@ -34,7 +34,7 @@ RSpec.describe API::PersonalAccessTokens do context 'logged in as a non-Administrator' do let_it_be(:current_user) { create(:user) } let_it_be(:user) { create(:user) } - let_it_be(:token) { create(:personal_access_token, user: current_user)} + let_it_be(:token) { create(:personal_access_token, user: current_user) } let_it_be(:other_token) { create(:personal_access_token, user: user) } let_it_be(:token_impersonated) { create(:personal_access_token, impersonation: true, user: current_user) } diff --git a/spec/requests/api/project_templates_spec.rb b/spec/requests/api/project_templates_spec.rb index 070fd6db3dc..87d70a87f42 100644 --- a/spec/requests/api/project_templates_spec.rb +++ b/spec/requests/api/project_templates_spec.rb @@ -77,7 +77,7 @@ RSpec.describe API::ProjectTemplates do expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(response).to match_response_schema('public_api/v4/template_list') - expect(json_response.map {|t| t['key']}).to match_array(%w(bug feature_proposal template_test)) + expect(json_response.map { |t| t['key'] }).to match_array(%w(bug feature_proposal template_test)) end it 'returns merge request templates' do @@ -86,7 +86,7 @@ RSpec.describe API::ProjectTemplates do expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(response).to match_response_schema('public_api/v4/template_list') - expect(json_response.map {|t| t['key']}).to match_array(%w(bug feature_proposal template_test)) + expect(json_response.map { |t| t['key'] }).to match_array(%w(bug feature_proposal template_test)) end it 'returns 400 for an unknown template type' do diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index ae689d7327b..d3c65e11ed7 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -1093,7 +1093,7 @@ RSpec.describe API::Projects do it 'does not create new project and respond with 403' do allow_any_instance_of(User).to receive(:projects_limit_left).and_return(0) expect { post api('/projects', user2), params: { name: 'foo' } } - .to change {Project.count}.by(0) + .to change { Project.count }.by(0) expect(response).to have_gitlab_http_status(:forbidden) end end diff --git a/spec/requests/api/pypi_packages_spec.rb b/spec/requests/api/pypi_packages_spec.rb index 9e0d3780fd8..6c130bb4963 100644 --- a/spec/requests/api/pypi_packages_spec.rb +++ b/spec/requests/api/pypi_packages_spec.rb @@ -41,7 +41,7 @@ RSpec.describe API::PypiPackages do it_behaves_like 'deploy token for package GET requests' context 'with group path as id' do - let(:url) { "/groups/#{CGI.escape(group.full_path)}/-/packages/pypi/simple"} + let(:url) { "/groups/#{CGI.escape(group.full_path)}/-/packages/pypi/simple" } it_behaves_like 'deploy token for package GET requests' end @@ -102,7 +102,7 @@ RSpec.describe API::PypiPackages do it_behaves_like 'deploy token for package GET requests' context 'with group path as id' do - let(:url) { "/groups/#{CGI.escape(group.full_path)}/-/packages/pypi/simple/#{package_name}"} + let(:url) { "/groups/#{CGI.escape(group.full_path)}/-/packages/pypi/simple/#{package_name}" } it_behaves_like 'deploy token for package GET requests' end diff --git a/spec/requests/api/release/links_spec.rb b/spec/requests/api/release/links_spec.rb index 2345c0063dd..57b2e005929 100644 --- a/spec/requests/api/release/links_spec.rb +++ b/spec/requests/api/release/links_spec.rb @@ -66,7 +66,7 @@ RSpec.describe API::Release::Links do end context 'when release does not exist' do - let!(:release) { } + let!(:release) {} it_behaves_like '404 response' do let(:request) { get api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer) } @@ -98,7 +98,7 @@ RSpec.describe API::Release::Links do end context 'when the release does not exists' do - let!(:release) { } + let!(:release) {} it_behaves_like '403 response' do let(:request) { get api("/projects/#{project.id}/releases/v0.1/assets/links", non_project_member) } @@ -409,7 +409,7 @@ RSpec.describe API::Release::Links do end context 'when there are no corresponding release link' do - let!(:release_link) { } + let!(:release_link) {} it_behaves_like '404 response' do let(:request) do @@ -510,7 +510,7 @@ RSpec.describe API::Release::Links do end context 'when there are no corresponding release link' do - let!(:release_link) { } + let!(:release_link) {} it_behaves_like '404 response' do let(:request) do diff --git a/spec/requests/api/releases_spec.rb b/spec/requests/api/releases_spec.rb index c050214ff50..1d9e3a6c887 100644 --- a/spec/requests/api/releases_spec.rb +++ b/spec/requests/api/releases_spec.rb @@ -962,7 +962,7 @@ RSpec.describe API::Releases do context 'with milestones' do let(:subject) { post api("/projects/#{project.id}/releases", maintainer), params: params } let(:milestone) { create(:milestone, project: project, title: 'v1.0') } - let(:returned_milestones) { json_response['milestones'].map {|m| m['title']} } + let(:returned_milestones) { json_response['milestones'].map { |m| m['title'] } } before do params.merge!(milestone_params) @@ -1120,7 +1120,7 @@ RSpec.describe API::Releases do end context 'when there are no corresponding releases' do - let!(:release) { } + let!(:release) {} it 'forbids the request' do put api("/projects/#{project.id}/releases/v0.1", maintainer), params: params @@ -1158,7 +1158,7 @@ RSpec.describe API::Releases do end context 'with milestones' do - let(:returned_milestones) { json_response['milestones'].map {|m| m['title']} } + let(:returned_milestones) { json_response['milestones'].map { |m| m['title'] } } subject { put api("/projects/#{project.id}/releases/v0.1", maintainer), params: params } @@ -1310,7 +1310,7 @@ RSpec.describe API::Releases do end context 'when there are no corresponding releases' do - let!(:release) { } + let!(:release) {} it 'forbids the request' do delete api("/projects/#{project.id}/releases/v0.1", maintainer) diff --git a/spec/requests/api/snippets_spec.rb b/spec/requests/api/snippets_spec.rb index 0ba1011684a..0dd6e484e8d 100644 --- a/spec/requests/api/snippets_spec.rb +++ b/spec/requests/api/snippets_spec.rb @@ -28,7 +28,7 @@ RSpec.describe API::Snippets, factory_default: :keep do expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array - expect(json_response.map { |snippet| snippet['id']} ).to contain_exactly( + expect(json_response.map { |snippet| snippet['id'] } ).to contain_exactly( public_snippet.id, internal_snippet.id, private_snippet.id) @@ -75,7 +75,7 @@ RSpec.describe API::Snippets, factory_default: :keep do it 'returns snippets available for user in given time range' do get api(path, personal_access_token: user_token) - expect(json_response.map { |snippet| snippet['id']} ).to contain_exactly( + expect(json_response.map { |snippet| snippet['id'] } ).to contain_exactly( private_snippet_in_time_range1.id, private_snippet_in_time_range2.id) end @@ -99,10 +99,10 @@ RSpec.describe API::Snippets, factory_default: :keep do expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array - expect(json_response.map { |snippet| snippet['id']} ).to contain_exactly( + expect(json_response.map { |snippet| snippet['id'] } ).to contain_exactly( public_snippet.id, public_snippet_other.id) - expect(json_response.map { |snippet| snippet['web_url']} ).to contain_exactly( + expect(json_response.map { |snippet| snippet['web_url'] } ).to contain_exactly( "http://localhost/-/snippets/#{public_snippet.id}", "http://localhost/-/snippets/#{public_snippet_other.id}") expect(json_response[0]['files'].first).to eq snippet_blob_file(public_snippet_other.blobs.first) @@ -126,7 +126,7 @@ RSpec.describe API::Snippets, factory_default: :keep do it 'returns public snippets available to user in given time range' do get api(path, personal_access_token: user_token) - expect(json_response.map { |snippet| snippet['id']} ).to contain_exactly( + expect(json_response.map { |snippet| snippet['id'] } ).to contain_exactly( public_snippet_in_time_range.id) end end diff --git a/spec/requests/api/unleash_spec.rb b/spec/requests/api/unleash_spec.rb index 7bdb89fb286..3ee895d9421 100644 --- a/spec/requests/api/unleash_spec.rb +++ b/spec/requests/api/unleash_spec.rb @@ -8,8 +8,8 @@ RSpec.describe API::Unleash do let_it_be(:project, refind: true) { create(:project) } let(:project_id) { project.id } - let(:params) { } - let(:headers) { } + let(:params) {} + let(:headers) {} shared_examples 'authenticated request' do context 'when using instance id' do @@ -57,7 +57,7 @@ RSpec.describe API::Unleash do context 'when using header' do let(:client) { create(:operations_feature_flags_client, project: project) } - let(:headers) { { "UNLEASH-INSTANCEID" => client.token }} + let(:headers) { { "UNLEASH-INSTANCEID" => client.token } } it 'responds with OK' do subject diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb index 05b16119a0e..3ffca7e3c62 100644 --- a/spec/requests/git_http_spec.rb +++ b/spec/requests/git_http_spec.rb @@ -225,7 +225,7 @@ RSpec.describe 'Git HTTP requests' do end context 'when namespace exists' do - let(:path) { "#{user.namespace.path}/new-project.git"} + let(:path) { "#{user.namespace.path}/new-project.git" } context 'when authenticated' do it 'creates a new project under the existing namespace' do diff --git a/spec/requests/groups/milestones_controller_spec.rb b/spec/requests/groups/milestones_controller_spec.rb index 43f0fc714b3..e6418c7694d 100644 --- a/spec/requests/groups/milestones_controller_spec.rb +++ b/spec/requests/groups/milestones_controller_spec.rb @@ -30,7 +30,7 @@ RSpec.describe Groups::MilestonesController do milestones = json_response expect(milestones.count).to eq(3) - expect(milestones.map {|x| x['title']}).not_to include(private_milestone.title) + expect(milestones.map { |x| x['title'] }).not_to include(private_milestone.title) end end diff --git a/spec/requests/jira_connect/subscriptions_controller_spec.rb b/spec/requests/jira_connect/subscriptions_controller_spec.rb index b10d07b3771..d8f329f13f5 100644 --- a/spec/requests/jira_connect/subscriptions_controller_spec.rb +++ b/spec/requests/jira_connect/subscriptions_controller_spec.rb @@ -18,12 +18,12 @@ RSpec.describe JiraConnect::SubscriptionsController do subject(:content_security_policy) { response.headers['Content-Security-Policy'] } - it { is_expected.to include('http://self-managed-gitlab.com/-/jira_connect/oauth_application_ids')} + it { is_expected.to include('http://self-managed-gitlab.com/-/jira_connect/oauth_application_ids') } context 'with no self-managed instance configured' do let_it_be(:installation) { create(:jira_connect_installation, instance_url: '') } - it { is_expected.not_to include('http://self-managed-gitlab.com')} + it { is_expected.not_to include('http://self-managed-gitlab.com') } end end end diff --git a/spec/requests/lfs_http_spec.rb b/spec/requests/lfs_http_spec.rb index acf83916f82..3529239a4d9 100644 --- a/spec/requests/lfs_http_spec.rb +++ b/spec/requests/lfs_http_spec.rb @@ -129,13 +129,13 @@ RSpec.describe 'Git LFS API and storage' do it_behaves_like 'LFS http 200 blob response' context 'when user password is expired' do - let_it_be(:user) { create(:user, password_expires_at: 1.minute.ago)} + let_it_be(:user) { create(:user, password_expires_at: 1.minute.ago) } it_behaves_like 'LFS http 401 response' end context 'when user is blocked' do - let_it_be(:user) { create(:user, :blocked)} + let_it_be(:user) { create(:user, :blocked) } it_behaves_like 'LFS http 401 response' end @@ -347,17 +347,17 @@ RSpec.describe 'Git LFS API and storage' do end context 'when user password is expired' do - let_it_be(:user) { create(:user, password_expires_at: 1.minute.ago)} + let_it_be(:user) { create(:user, password_expires_at: 1.minute.ago) } - let(:role) { :reporter} + let(:role) { :reporter } it_behaves_like 'LFS http 401 response' end context 'when user is blocked' do - let_it_be(:user) { create(:user, :blocked)} + let_it_be(:user) { create(:user, :blocked) } - let(:role) { :reporter} + let(:role) { :reporter } it_behaves_like 'LFS http 401 response' end @@ -1013,7 +1013,7 @@ RSpec.describe 'Git LFS API and storage' do end context 'when user is blocked' do - let_it_be(:user) { create(:user, :blocked)} + let_it_be(:user) { create(:user, :blocked) } it_behaves_like 'LFS http 401 response' end diff --git a/spec/requests/oauth/tokens_controller_spec.rb b/spec/requests/oauth/tokens_controller_spec.rb index 3895304dbde..e4cb28cc42b 100644 --- a/spec/requests/oauth/tokens_controller_spec.rb +++ b/spec/requests/oauth/tokens_controller_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe Oauth::TokensController do let(:cors_request_headers) { { 'Origin' => 'http://notgitlab.com' } } let(:other_headers) { {} } - let(:headers) { cors_request_headers.merge(other_headers)} + let(:headers) { cors_request_headers.merge(other_headers) } let(:allowed_methods) { 'POST, OPTIONS' } shared_examples 'cross-origin POST request' do diff --git a/spec/tasks/gitlab/gitaly_rake_spec.rb b/spec/tasks/gitlab/gitaly_rake_spec.rb index 70c7ddb1d6e..e57021f749b 100644 --- a/spec/tasks/gitlab/gitaly_rake_spec.rb +++ b/spec/tasks/gitlab/gitaly_rake_spec.rb @@ -66,7 +66,7 @@ RSpec.describe 'gitlab:gitaly namespace rake task', :silence_stdout do .with(%w[which gmake]) .and_return(['/usr/bin/gmake', 0]) expect(Gitlab::Popen).to receive(:popen) - .with(%w[gmake all git], nil, { "BUNDLE_GEMFILE" => nil, "RUBYOPT" => nil }) + .with(%w[gmake clean-build all git], nil, { "BUNDLE_GEMFILE" => nil, "RUBYOPT" => nil }) .and_return(['ok', 0]) subject @@ -78,7 +78,7 @@ RSpec.describe 'gitlab:gitaly namespace rake task', :silence_stdout do .with(%w[which gmake]) .and_return(['/usr/bin/gmake', 0]) expect(Gitlab::Popen).to receive(:popen) - .with(%w[gmake all git], nil, { "BUNDLE_GEMFILE" => nil, "RUBYOPT" => nil }) + .with(%w[gmake clean-build all git], nil, { "BUNDLE_GEMFILE" => nil, "RUBYOPT" => nil }) .and_return(['output', 1]) expect { subject }.to raise_error /Gitaly failed to compile: output/ @@ -95,14 +95,14 @@ RSpec.describe 'gitlab:gitaly namespace rake task', :silence_stdout do it 'calls make in the gitaly directory' do expect(Gitlab::Popen).to receive(:popen) - .with(%w[make all git], nil, { "BUNDLE_GEMFILE" => nil, "RUBYOPT" => nil }) + .with(%w[make clean-build all git], nil, { "BUNDLE_GEMFILE" => nil, "RUBYOPT" => nil }) .and_return(['output', 0]) subject end context 'when Rails.env is test' do - let(:command) { %w[make all git] } + let(:command) { %w[make clean-build all git] } before do stub_rails_env('test') diff --git a/yarn.lock b/yarn.lock index 4d7aae26d5b..939a19edafa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3458,11 +3458,6 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -codemirror@^5.48.4: - version "5.53.2" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.53.2.tgz#9799121cf8c50809cca487304e9de3a74d33f428" - integrity sha512-wvSQKS4E+P8Fxn/AQ+tQtJnF1qH5UOlxtugFLpubEZ5jcdH2iXTVinb+Xc/4QjshuOxRm4fUsU2QPF1JJKiyXA== - codesandbox-api@0.0.23: version "0.0.23" resolved "https://registry.yarnpkg.com/codesandbox-api/-/codesandbox-api-0.0.23.tgz#bf650a21b5f3c2369e03f0c19d10b4e2ba255b4f"