Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
2bb1dbf21f
commit
f5ef42977e
2
Gemfile
2
Gemfile
|
@ -255,7 +255,7 @@ gem 'slack-messenger', '~> 2.3.4'
|
|||
gem 'hangouts-chat', '~> 0.0.5', require: 'hangouts_chat'
|
||||
|
||||
# Asana integration
|
||||
gem 'asana', '~> 0.10.3'
|
||||
gem 'asana', '~> 0.10.13'
|
||||
|
||||
# FogBugz integration
|
||||
gem 'ruby-fogbugz', '~> 0.2.1'
|
||||
|
|
|
@ -83,11 +83,11 @@ GEM
|
|||
apollo_upload_server (2.1.0)
|
||||
actionpack (>= 4.2)
|
||||
graphql (>= 1.8)
|
||||
asana (0.10.3)
|
||||
asana (0.10.13)
|
||||
faraday (~> 1.0)
|
||||
faraday_middleware (~> 1.0)
|
||||
faraday_middleware-multi_json (~> 0.0)
|
||||
oauth2 (~> 1.4)
|
||||
oauth2 (>= 1.4, < 3)
|
||||
asciidoctor (2.0.15)
|
||||
asciidoctor-include-ext (0.4.0)
|
||||
asciidoctor (>= 1.5.6, < 3.0.0)
|
||||
|
@ -1454,7 +1454,7 @@ DEPENDENCIES
|
|||
addressable (~> 2.8)
|
||||
akismet (~> 3.0)
|
||||
apollo_upload_server (~> 2.1.0)
|
||||
asana (~> 0.10.3)
|
||||
asana (~> 0.10.13)
|
||||
asciidoctor (~> 2.0.10)
|
||||
asciidoctor-include-ext (~> 0.4.0)
|
||||
asciidoctor-kroki (~> 0.5.0)
|
||||
|
|
|
@ -54,25 +54,25 @@ export default {
|
|||
<ide-tree-list @tree-ready="$emit('tree-ready')">
|
||||
<template #header>
|
||||
{{ __('Edit') }}
|
||||
<div class="ide-tree-actions ml-auto d-flex" data-testid="ide-root-actions">
|
||||
<div class="ide-tree-actions gl-ml-auto gl-display-flex" data-testid="ide-root-actions">
|
||||
<new-entry-button
|
||||
:label="__('New file')"
|
||||
:show-label="false"
|
||||
class="d-flex border-0 p-0 mr-3"
|
||||
class="gl-display-flex gl-border-0 gl-p-0 gl-mr-5"
|
||||
icon="doc-new"
|
||||
data-qa-selector="new_file_button"
|
||||
@click="createNewFile()"
|
||||
/>
|
||||
<upload
|
||||
:show-label="false"
|
||||
class="d-flex mr-3"
|
||||
button-css-classes="border-0 p-0"
|
||||
class="gl-display-flex gl-mr-5"
|
||||
button-css-classes="gl-border-0 gl-p-0"
|
||||
@create="createTempEntry"
|
||||
/>
|
||||
<new-entry-button
|
||||
:label="__('New directory')"
|
||||
:show-label="false"
|
||||
class="d-flex border-0 p-0"
|
||||
class="gl-display-flex gl-border-0 gl-p-0"
|
||||
icon="folder-new"
|
||||
data-qa-selector="new_directory_button"
|
||||
@click="createNewFolder()"
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<script>
|
||||
import { GlBadge, GlTab, GlTabs, GlLoadingIcon } from '@gitlab/ui';
|
||||
import { s__ } from '~/locale';
|
||||
import { limitedCounterWithDelimiter } from '~/lib/utils/text_utility';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
|
@ -29,7 +30,7 @@ export default {
|
|||
return [
|
||||
{
|
||||
text: s__('Jobs|All'),
|
||||
count: this.allJobsCount,
|
||||
count: limitedCounterWithDelimiter(this.allJobsCount),
|
||||
scope: null,
|
||||
testId: 'jobs-all-tab',
|
||||
showBadge: true,
|
||||
|
|
|
@ -498,3 +498,17 @@ export const markdownConfig = {
|
|||
* escaped to `'fix-'\''bug-behavior'\'''`.
|
||||
*/
|
||||
export const escapeShellString = (str) => `'${str.replace(allSingleQuotes, () => "'\\''")}'`;
|
||||
|
||||
/**
|
||||
* Adds plus character as delimiter for count
|
||||
* if count is greater than limit of 1000
|
||||
* FE creation of `app/helpers/numbers_helper.rb`
|
||||
*
|
||||
* @param {Number} count
|
||||
* @return {Number|String}
|
||||
*/
|
||||
export const limitedCounterWithDelimiter = (count) => {
|
||||
const limit = 1000;
|
||||
|
||||
return count > limit ? '1,000+' : count;
|
||||
};
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
%p= _('Transfer group to another parent group.')
|
||||
= form_for group, url: transfer_group_path(group), method: :put, html: { id: form_id, class: 'js-group-transfer-form' } do |f|
|
||||
%ul
|
||||
- learn_more_link_start = '<a href="https://docs.gitlab.com/ee/user/project/index.html#redirects-when-changing-repository-paths" target="_blank" rel="noopener noreferrer">'.html_safe
|
||||
- learn_more_link_start = '<a href="https://docs.gitlab.com/ee/user/project/repository/index.html#what-happens-when-a-repository-path-changes" target="_blank" rel="noopener noreferrer">'.html_safe
|
||||
- warning_text = s_("GroupSettings|Be careful. Changing a group's parent can have unintended side effects. %{learn_more_link_start}Learn more.%{learn_more_link_end}") % { learn_more_link_start: learn_more_link_start, learn_more_link_end: '</a>'.html_safe }
|
||||
%li= warning_text.html_safe
|
||||
%li= s_('GroupSettings|You can only transfer the group to a group you manage.')
|
||||
|
|
|
@ -785,6 +785,8 @@ the `approvals_before_merge` parameter:
|
|||
field `merge_user` can be either user who merged this merge request,
|
||||
user who set it to merge when pipeline succeeds or `null`.
|
||||
Field `merged_by` (user who merged this merge request or `null`) has been deprecated.
|
||||
- `pipeline` is an old parameter and should not be used. Use `head_pipeline` instead,
|
||||
as it is faster and returns more information.
|
||||
|
||||
## Get single MR participants
|
||||
|
||||
|
|
|
@ -136,10 +136,10 @@ NOTE:
|
|||
#### Markdown snapshot testing
|
||||
|
||||
_Markdown snapshot testing_ refers to the automated testing performed in
|
||||
the GitLab codebase, which is driven by snapshot fixture data derived from the
|
||||
GLFM specification. It consists of both backend RSpec tests and frontend Jest tests
|
||||
which use the fixture data. This fixture data is contained in YAML files. These files
|
||||
can be generated and updated based on the Markdown examples in the specification,
|
||||
the GitLab codebase, which is driven by "example_snapshots" fixture data derived from all of
|
||||
the examples in the GLFM specification. It consists of both backend RSpec tests and frontend Jest
|
||||
tests which use the fixture data. This fixture data is contained in YAML files. These files
|
||||
are generated and updated based on the Markdown examples in the specification,
|
||||
and the existing GLFM parser and render implementations. They may also be
|
||||
manually updated as necessary to test-drive incomplete implementations.
|
||||
Regarding the terminology used here:
|
||||
|
@ -159,7 +159,7 @@ Regarding the terminology used here:
|
|||
[Jest snapshot testing](https://jestjs.io/docs/snapshot-testing), as used elsewhere
|
||||
in the GitLab frontend testing suite. However, the Markdown snapshot testing does
|
||||
follow the same philosophy and patterns as Jest snapshot testing:
|
||||
1. Snapshot fixture data is represented as files which are checked into source control.
|
||||
1. Snapshot example fixture data is represented as files which are checked into source control.
|
||||
1. The files can be automatically generated and updated based on the implementation
|
||||
of the code under tests.
|
||||
1. The files can also be manually updated when necessary, for example, to test-drive
|
||||
|
@ -168,9 +168,15 @@ Regarding the terminology used here:
|
|||
[Rails database fixture files](https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html).
|
||||
It instead refers to _test fixtures_ in the
|
||||
[more generic definition](https://en.wikipedia.org/wiki/Test_fixture#Software),
|
||||
as input data to support automated testing. However, fixture files still exist, so
|
||||
they are colocated under the `spec/fixtures` directory with the rest of
|
||||
the fixture data for the GitLab Rails application.
|
||||
as input data to support automated testing.
|
||||
1. These example snapshots fixture files are generated from and closely related to the rest of the
|
||||
GLFM specification. Therefore, the `example_snapshots` directory is colocated under the
|
||||
`glfm_specification` directory with the rest of the
|
||||
GLFM [specification files](#specification-files). They are intentionally _not_
|
||||
located under the `spec/fixtures` directory with the rest of
|
||||
the fixture data for the GitLab Rails application. In practice, developers have found
|
||||
it simpler and more understandable to have everything under the `glfm_specification` directory
|
||||
rather than splitting these files into the `spec/fixtures` directory.
|
||||
|
||||
<!-- vale gitlab.InclusionCultural = YES -->
|
||||
|
||||
|
@ -395,9 +401,10 @@ The documentation on the implementation is split into three sections:
|
|||
|
||||
1. [Scripts](#scripts).
|
||||
1. [Specification files](#specification-files).
|
||||
1. Example snapshot files: These YAML files are used as input data
|
||||
1. [Example snapshot files](#example-snapshot-files):
|
||||
These YAML files are used as input data
|
||||
or fixtures to drive the various tests, and are located under
|
||||
`spec/fixtures/glfm/example_snapshots`. All example snapshot files are automatically
|
||||
`glfm_specification/example_snapshots`. All example snapshot files are automatically
|
||||
generated based on the specification files and the implementation of the parsers and renderers.
|
||||
However, they can also be directly edited if necessary, such as to
|
||||
test-drive an incomplete implementation.
|
||||
|
@ -662,16 +669,16 @@ controls the behavior of the [scripts](#scripts) and [tests](#types-of-markdown-
|
|||
The following optional entries are supported for each example. They all default to `false`:
|
||||
|
||||
- `skip_update_example_snapshots`: When true, skips any addition or update of any this example's entries
|
||||
in the [`spec/fixtures/glfm/example_snapshots/html.yml`](#specfixturesglfmexample_snapshotshtmlyml) file
|
||||
or the [`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml`](#specfixturesglfmexample_snapshotsprosemirror_jsonyml) file.
|
||||
in the [`glfm_specification/example_snapshots/html.yml`](#glfm_specificationexample_snapshotshtmlyml) file
|
||||
or the [`glfm_specification/example_snapshots/prosemirror_json.yml`](#glfm_specificationexample_snapshotsprosemirror_jsonyml) file.
|
||||
If this value is truthy, then no other `skip_update_example_snapshot_*` entries can be truthy,
|
||||
and an error is raised if any of them are.
|
||||
- `skip_update_example_snapshot_html_static`: When true, skips addition or update of this example's [static HTML](#static-html)
|
||||
entry in the [`spec/fixtures/glfm/example_snapshots/html.yml`](#specfixturesglfmexample_snapshotshtmlyml) file.
|
||||
entry in the [`glfm_specification/example_snapshots/html.yml`](#glfm_specificationexample_snapshotshtmlyml) file.
|
||||
- `skip_update_example_snapshot_html_wysiwyg`: When true, skips addition or update of this example's [WYSIWYG HTML](#wysiwyg-html)
|
||||
entry in the [`spec/fixtures/glfm/example_snapshots/html.yml`](#specfixturesglfmexample_snapshotshtmlyml) file.
|
||||
entry in the [`glfm_specification/example_snapshots/html.yml`](#glfm_specificationexample_snapshotshtmlyml) file.
|
||||
- `skip_update_example_snapshot_prosemirror_json`: When true, skips addition or update of this example's
|
||||
entry in the [`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml`](#specfixturesglfmexample_snapshotsprosemirror_jsonyml) file.
|
||||
entry in the [`glfm_specification/example_snapshots/prosemirror_json.yml`](#glfm_specificationexample_snapshotsprosemirror_jsonyml) file.
|
||||
- `skip_running_conformance_static_tests`: When true, skips running the [Markdown conformance tests](#markdown-conformance-testing)
|
||||
of the [static HTML](#static-html) for this example.
|
||||
- `skip_running_conformance_wysiwyg_tests`: When true, skips running the [Markdown conformance tests](#markdown-conformance-testing)
|
||||
|
@ -681,7 +688,7 @@ The following optional entries are supported for each example. They all default
|
|||
- `skip_running_snapshot_wysiwyg_html_tests`: When true, skips running the [Markdown snapshot tests](#markdown-snapshot-testing)
|
||||
of the [WYSIWYG HTML](#wysiwyg-html) for this example.
|
||||
- `skip_running_snapshot_prosemirror_json_tests`: When true, skips running the [Markdown snapshot tests](#markdown-snapshot-testing)
|
||||
of the [ProseMirror JSON](#specfixturesglfmexample_snapshotsprosemirror_jsonyml) for this example.
|
||||
of the [ProseMirror JSON](#glfm_specificationexample_snapshotsprosemirror_jsonyml) for this example.
|
||||
|
||||
`glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml` sample entry:
|
||||
|
||||
|
@ -808,9 +815,9 @@ key in `glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.ym
|
|||
can be used to disable automatic generation of some examples. They can instead
|
||||
be manually edited as necessary to help drive the implementations.
|
||||
|
||||
#### `spec/fixtures/glfm/example_snapshots/examples_index.yml`
|
||||
#### `glfm_specification/example_snapshots/examples_index.yml`
|
||||
|
||||
[`spec/fixtures/glfm/example_snapshots/examples_index.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/fixtures/glfm/example_snapshots/examples_index.yml)
|
||||
[`glfm_specification/example_snapshots/examples_index.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/example_snapshots/examples_index.yml)
|
||||
is the main list of all
|
||||
CommonMark, GFM, and GLFM example names, each with a unique canonical name.
|
||||
|
||||
|
@ -836,7 +843,7 @@ CommonMark, GFM, and GLFM example names, each with a unique canonical name.
|
|||
examples where multiple examples exist for the same Section 7 subsection are
|
||||
added to the end of the sub-section.
|
||||
|
||||
`spec/fixtures/glfm/example_snapshots/examples_index.yml` sample entries:
|
||||
`glfm_specification/example_snapshots/examples_index.yml` sample entries:
|
||||
|
||||
```yaml
|
||||
02_01_preliminaries_characters_and_lines_1:
|
||||
|
@ -856,10 +863,10 @@ CommonMark, GFM, and GLFM example names, each with a unique canonical name.
|
|||
source_specification: gitlab
|
||||
```
|
||||
|
||||
#### `spec/fixtures/glfm/example_snapshots/markdown.yml`
|
||||
#### `glfm_specification/example_snapshots/markdown.yml`
|
||||
|
||||
[`spec/fixtures/glfm/example_snapshots/markdown.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/fixtures/glfm/example_snapshots/markdown.yml) contains the original Markdown
|
||||
for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
|
||||
[`glfm_specification/example_snapshots/markdown.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/example_snapshots/markdown.yml) contains the original Markdown
|
||||
for each entry in `glfm_specification/example_snapshots/examples_index.yml`
|
||||
|
||||
- For CommonMark and GFM Markdown,
|
||||
it is generated (or updated) from the standard GFM
|
||||
|
@ -868,17 +875,17 @@ for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
|
|||
`glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt`
|
||||
input specification file.
|
||||
|
||||
`spec/fixtures/glfm/example_snapshots/markdown.yml` sample entry:
|
||||
`glfm_specification/example_snapshots/markdown.yml` sample entry:
|
||||
|
||||
```yaml
|
||||
06_04_inlines_emphasis_and_strong_emphasis_1: |
|
||||
*foo bar*
|
||||
```
|
||||
|
||||
#### `spec/fixtures/glfm/example_snapshots/html.yml`
|
||||
#### `glfm_specification/example_snapshots/html.yml`
|
||||
|
||||
[`spec/fixtures/glfm/example_snapshots/html.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/fixtures/glfm/example_snapshots/html.yml)
|
||||
contains the HTML for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
|
||||
[`glfm_specification/example_snapshots/html.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/example_snapshots/html.yml)
|
||||
contains the HTML for each entry in `glfm_specification/example_snapshots/examples_index.yml`
|
||||
|
||||
Three types of entries exist, with different HTML for each:
|
||||
|
||||
|
@ -889,13 +896,13 @@ Three types of entries exist, with different HTML for each:
|
|||
`glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt`.
|
||||
- **Static**
|
||||
- This is the static (backend (Ruby)-generated) HTML for each entry in
|
||||
`spec/fixtures/glfm/example_snapshots/examples_index.yml`.
|
||||
`glfm_specification/example_snapshots/examples_index.yml`.
|
||||
- It is generated/updated from backend [Markdown API](../../../api/markdown.md)
|
||||
(or the underlying internal classes) via the `update-example-snapshots.rb` script,
|
||||
but can be manually updated for static examples with incomplete implementations.
|
||||
- **WYSIWYG**
|
||||
- The WYSIWYG (frontend, JavaScript-generated) HTML for each entry in
|
||||
`spec/fixtures/glfm/example_snapshots/examples_index.yml`.
|
||||
`glfm_specification/example_snapshots/examples_index.yml`.
|
||||
- It is generated (or updated) from the frontend Content Editor implementation via the
|
||||
`update-example-snapshots.rb` script. It can be manually updated for WYSIWYG
|
||||
examples with incomplete implementations.
|
||||
|
@ -903,7 +910,7 @@ Three types of entries exist, with different HTML for each:
|
|||
Any exceptions or failures which occur when generating HTML are replaced with an
|
||||
`Error - check implementation` value.
|
||||
|
||||
`spec/fixtures/glfm/example_snapshots/html.yml` sample entry:
|
||||
`glfm_specification/example_snapshots/html.yml` sample entry:
|
||||
|
||||
```yaml
|
||||
06_04_inlines_emphasis_and_strong_emphasis_1:
|
||||
|
@ -919,16 +926,16 @@ NOTE:
|
|||
The actual `static` or `WYSIWYG` entries may differ from the example `html.yml`,
|
||||
depending on how the implementations evolve.
|
||||
|
||||
#### `spec/fixtures/glfm/example_snapshots/prosemirror_json.yml`
|
||||
#### `glfm_specification/example_snapshots/prosemirror_json.yml`
|
||||
|
||||
[`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/fixtures/glfm/example_snapshots/prosemirror_json.yml)
|
||||
contains the ProseMirror JSON for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
|
||||
[`glfm_specification/example_snapshots/prosemirror_json.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/example_snapshots/prosemirror_json.yml)
|
||||
contains the ProseMirror JSON for each entry in `glfm_specification/example_snapshots/examples_index.yml`
|
||||
|
||||
- It is generated (or updated) from the frontend code via the `update-example-snapshots.rb`
|
||||
script, but can be manually updated for examples with incomplete implementations.
|
||||
- Any exceptions or failures when generating are replaced with a `Error - check implementation` value.
|
||||
|
||||
`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml` sample entry:
|
||||
`glfm_specification/example_snapshots/prosemirror_json.yml` sample entry:
|
||||
|
||||
```yaml
|
||||
06_04_inlines_emphasis_and_strong_emphasis_1: |-
|
||||
|
|
|
@ -81,6 +81,10 @@ module Gitlab
|
|||
:update_gateway,
|
||||
to: :istio_client
|
||||
|
||||
delegate :get_ingresses, :patch_ingress, to: :networking_client
|
||||
|
||||
delegate :get_deployments, to: :apps_client
|
||||
|
||||
attr_reader :api_prefix, :kubeclient_options
|
||||
|
||||
DEFAULT_KUBECLIENT_OPTIONS = {
|
||||
|
@ -127,46 +131,6 @@ module Gitlab
|
|||
validate_url!
|
||||
end
|
||||
|
||||
# Deployments resource is currently on the apis/extensions api group
|
||||
# until Kubernetes 1.15. Kubernetest 1.16+ has deployments resources in
|
||||
# the apis/apps api group.
|
||||
#
|
||||
# As we still support Kubernetes 1.12+, we will need to support both.
|
||||
def get_deployments(**args)
|
||||
extensions_client.discover unless extensions_client.discovered
|
||||
|
||||
if extensions_client.respond_to?(:get_deployments)
|
||||
extensions_client.get_deployments(**args)
|
||||
else
|
||||
apps_client.get_deployments(**args)
|
||||
end
|
||||
end
|
||||
|
||||
# Ingresses resource is currently on the apis/extensions api group
|
||||
# until Kubernetes 1.21. Kubernetest 1.22+ has ingresses resources in
|
||||
# the networking.k8s.io/v1 api group.
|
||||
#
|
||||
# As we still support Kubernetes 1.12+, we will need to support both.
|
||||
def get_ingresses(**args)
|
||||
extensions_client.discover unless extensions_client.discovered
|
||||
|
||||
if extensions_client.respond_to?(:get_ingresses)
|
||||
extensions_client.get_ingresses(**args)
|
||||
else
|
||||
networking_client.get_ingresses(**args)
|
||||
end
|
||||
end
|
||||
|
||||
def patch_ingress(*args)
|
||||
extensions_client.discover unless extensions_client.discovered
|
||||
|
||||
if extensions_client.respond_to?(:patch_ingress)
|
||||
extensions_client.patch_ingress(*args)
|
||||
else
|
||||
networking_client.patch_ingress(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def create_or_update_cluster_role_binding(resource)
|
||||
update_cluster_role_binding(resource)
|
||||
end
|
||||
|
|
|
@ -41118,9 +41118,6 @@ msgstr ""
|
|||
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
|
||||
msgstr ""
|
||||
|
||||
msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
|
||||
msgstr ""
|
||||
|
||||
msgid "UsageQuota|Buy additional minutes"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
@ -247,7 +247,7 @@
|
|||
"prosemirror-test-builder": "^1.0.6",
|
||||
"purgecss": "^4.0.3",
|
||||
"purgecss-from-html": "^4.0.3",
|
||||
"sass": "^1.32.12",
|
||||
"sass": "^1.49.9",
|
||||
"stylelint": "^14.3.0",
|
||||
"timezone-mock": "^1.0.8",
|
||||
"vue-jest": "4.0.1",
|
||||
|
|
|
@ -21,7 +21,7 @@ module Glfm
|
|||
GLFM_SPEC_TXT_PATH = specification_path.join('output/spec.txt')
|
||||
|
||||
# Example Snapshot (ES) files
|
||||
es_fixtures_path = File.expand_path("../../../spec/fixtures/glfm/example_snapshots", __dir__)
|
||||
es_fixtures_path = File.expand_path("../../../glfm_specification/example_snapshots", __dir__)
|
||||
ES_EXAMPLES_INDEX_YML_PATH = File.join(es_fixtures_path, 'examples_index.yml')
|
||||
ES_MARKDOWN_YML_PATH = File.join(es_fixtures_path, 'markdown.yml')
|
||||
ES_HTML_YML_PATH = File.join(es_fixtures_path, 'html.yml')
|
||||
|
|
|
@ -5,19 +5,6 @@ jest.mock('~/emoji');
|
|||
|
||||
const glfmSpecificationDir = path.join(__dirname, '..', '..', '..', 'glfm_specification');
|
||||
|
||||
const glfmExampleSnapshotsDir = path.join(
|
||||
__dirname,
|
||||
'..',
|
||||
'..',
|
||||
'fixtures',
|
||||
'glfm',
|
||||
'example_snapshots',
|
||||
);
|
||||
|
||||
// See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#markdown-snapshot-testing
|
||||
// for documentation on this spec.
|
||||
describeMarkdownSnapshots(
|
||||
'CE markdown snapshots in ContentEditor',
|
||||
glfmSpecificationDir,
|
||||
glfmExampleSnapshotsDir,
|
||||
);
|
||||
describeMarkdownSnapshots('CE markdown snapshots in ContentEditor', glfmSpecificationDir);
|
||||
|
|
|
@ -25,11 +25,7 @@ const loadExamples = (dir, fileName) => {
|
|||
};
|
||||
|
||||
// eslint-disable-next-line jest/no-export
|
||||
export const describeMarkdownSnapshots = (
|
||||
description,
|
||||
glfmSpecificationDir,
|
||||
glfmExampleSnapshotsDir,
|
||||
) => {
|
||||
export const describeMarkdownSnapshots = (description, glfmSpecificationDir) => {
|
||||
let actualHtmlAndJsonExamples;
|
||||
let skipRunningSnapshotWysiwygHtmlTests;
|
||||
let skipRunningSnapshotProsemirrorJsonTests;
|
||||
|
@ -38,6 +34,7 @@ export const describeMarkdownSnapshots = (
|
|||
path.join(glfmSpecificationDir, 'input', 'gitlab_flavored_markdown'),
|
||||
'glfm_example_status.yml',
|
||||
);
|
||||
const glfmExampleSnapshotsDir = path.join(glfmSpecificationDir, 'example_snapshots');
|
||||
const markdownExamples = loadExamples(glfmExampleSnapshotsDir, 'markdown.yml');
|
||||
const expectedHtmlExamples = loadExamples(glfmExampleSnapshotsDir, 'html.yml');
|
||||
const expectedProseMirrorJsonExamples = loadExamples(
|
||||
|
|
|
@ -384,4 +384,17 @@ describe('text_utility', () => {
|
|||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('limitedCounterWithDelimiter', () => {
|
||||
it('returns 1,000+ for count greater than 1000', () => {
|
||||
const expectedOutput = '1,000+';
|
||||
|
||||
expect(textUtils.limitedCounterWithDelimiter(1001)).toBe(expectedOutput);
|
||||
expect(textUtils.limitedCounterWithDelimiter(2300)).toBe(expectedOutput);
|
||||
});
|
||||
|
||||
it('returns exact number for count less than 1000', () => {
|
||||
expect(textUtils.limitedCounterWithDelimiter(120)).toBe(120);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -171,20 +171,6 @@ RSpec.describe Gitlab::Kubernetes::KubeClient do
|
|||
end
|
||||
end
|
||||
|
||||
describe '#extensions_client' do
|
||||
subject { client.extensions_client }
|
||||
|
||||
it_behaves_like 'a Kubeclient'
|
||||
|
||||
it 'has the extensions API group endpoint' do
|
||||
expect(subject.api_endpoint.to_s).to match(%r{\/apis\/extensions\Z})
|
||||
end
|
||||
|
||||
it 'has the api_version' do
|
||||
expect(subject.instance_variable_get(:@api_version)).to eq('v1beta1')
|
||||
end
|
||||
end
|
||||
|
||||
describe '#istio_client' do
|
||||
subject { client.istio_client }
|
||||
|
||||
|
@ -307,86 +293,38 @@ RSpec.describe Gitlab::Kubernetes::KubeClient do
|
|||
end
|
||||
end
|
||||
|
||||
describe '#get_deployments' do
|
||||
let(:extensions_client) { client.extensions_client }
|
||||
describe 'apps/v1 API group' do
|
||||
let(:apps_client) { client.apps_client }
|
||||
|
||||
include_examples 'redirection not allowed', 'get_deployments'
|
||||
include_examples 'dns rebinding not allowed', 'get_deployments'
|
||||
|
||||
it 'delegates to the extensions client' do
|
||||
expect(extensions_client).to receive(:get_deployments)
|
||||
|
||||
client.get_deployments
|
||||
end
|
||||
|
||||
context 'extensions does not have deployments for Kubernetes 1.16+ clusters' do
|
||||
before do
|
||||
WebMock
|
||||
.stub_request(:get, api_url + '/apis/extensions/v1beta1')
|
||||
.to_return(kube_response(kube_1_16_extensions_v1beta1_discovery_body))
|
||||
end
|
||||
describe 'get_deployments' do
|
||||
include_examples 'redirection not allowed', 'get_deployments'
|
||||
include_examples 'dns rebinding not allowed', 'get_deployments'
|
||||
|
||||
it 'delegates to the apps client' do
|
||||
expect(apps_client).to receive(:get_deployments)
|
||||
expect(client).to delegate_method(:get_deployments).to(:apps_client)
|
||||
end
|
||||
|
||||
client.get_deployments
|
||||
it 'responds to the method' do
|
||||
expect(client).to respond_to :get_deployments
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#get_ingresses' do
|
||||
let(:extensions_client) { client.extensions_client }
|
||||
describe 'networking.k8s.io/v1 API group' do
|
||||
let(:networking_client) { client.networking_client }
|
||||
|
||||
include_examples 'redirection not allowed', 'get_ingresses'
|
||||
include_examples 'dns rebinding not allowed', 'get_ingresses'
|
||||
[:get_ingresses, :patch_ingress].each do |method|
|
||||
describe "##{method}" do
|
||||
include_examples 'redirection not allowed', method
|
||||
include_examples 'dns rebinding not allowed', method
|
||||
|
||||
it 'delegates to the extensions client' do
|
||||
expect(extensions_client).to receive(:get_ingresses)
|
||||
it 'delegates to the networking client' do
|
||||
expect(client).to delegate_method(method).to(:networking_client)
|
||||
end
|
||||
|
||||
client.get_ingresses
|
||||
end
|
||||
|
||||
context 'extensions does not have deployments for Kubernetes 1.22+ clusters' do
|
||||
before do
|
||||
WebMock
|
||||
.stub_request(:get, api_url + '/apis/extensions/v1beta1')
|
||||
.to_return(kube_response(kube_1_22_extensions_v1beta1_discovery_body))
|
||||
end
|
||||
|
||||
it 'delegates to the apps client' do
|
||||
expect(networking_client).to receive(:get_ingresses)
|
||||
|
||||
client.get_ingresses
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#patch_ingress' do
|
||||
let(:extensions_client) { client.extensions_client }
|
||||
let(:networking_client) { client.networking_client }
|
||||
|
||||
include_examples 'redirection not allowed', 'patch_ingress'
|
||||
include_examples 'dns rebinding not allowed', 'patch_ingress'
|
||||
|
||||
it 'delegates to the extensions client' do
|
||||
expect(extensions_client).to receive(:patch_ingress)
|
||||
|
||||
client.patch_ingress
|
||||
end
|
||||
|
||||
context 'extensions does not have ingress for Kubernetes 1.22+ clusters' do
|
||||
before do
|
||||
WebMock
|
||||
.stub_request(:get, api_url + '/apis/extensions/v1beta1')
|
||||
.to_return(kube_response(kube_1_22_extensions_v1beta1_discovery_body))
|
||||
end
|
||||
|
||||
it 'delegates to the apps client' do
|
||||
expect(networking_client).to receive(:patch_ingress)
|
||||
|
||||
client.patch_ingress
|
||||
it 'responds to the method' do
|
||||
expect(client).to respond_to method
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -7,6 +7,5 @@ require 'spec_helper'
|
|||
RSpec.describe API::Markdown, 'Snapshot' do
|
||||
# noinspection RubyMismatchedArgumentType (ignore RBS type warning: __dir__ can be nil, but 2nd argument can't be nil)
|
||||
glfm_specification_dir = File.expand_path('../../../glfm_specification', __dir__)
|
||||
glfm_example_snapshots_dir = File.expand_path('../../fixtures/glfm/example_snapshots', __dir__)
|
||||
include_context 'with API::Markdown Snapshot shared context', glfm_specification_dir, glfm_example_snapshots_dir
|
||||
include_context 'with API::Markdown Snapshot shared context', glfm_specification_dir
|
||||
end
|
||||
|
|
|
@ -39,9 +39,6 @@ module KubernetesHelpers
|
|||
|
||||
def stub_kubeclient_discover_base(api_url)
|
||||
WebMock.stub_request(:get, api_url + '/api/v1').to_return(kube_response(kube_v1_discovery_body))
|
||||
WebMock
|
||||
.stub_request(:get, api_url + '/apis/extensions/v1beta1')
|
||||
.to_return(kube_response(kube_extensions_v1beta1_discovery_body))
|
||||
WebMock
|
||||
.stub_request(:get, api_url + '/apis/apps/v1')
|
||||
.to_return(kube_response(kube_apps_v1_discovery_body))
|
||||
|
@ -149,7 +146,7 @@ module KubernetesHelpers
|
|||
|
||||
def stub_kubeclient_deployments(namespace, status: nil)
|
||||
stub_kubeclient_discover(service.api_url)
|
||||
deployments_url = service.api_url + "/apis/extensions/v1beta1/namespaces/#{namespace}/deployments"
|
||||
deployments_url = service.api_url + "/apis/apps/v1/namespaces/#{namespace}/deployments"
|
||||
response = { status: status } if status
|
||||
|
||||
WebMock.stub_request(:get, deployments_url).to_return(response || kube_deployments_response)
|
||||
|
@ -157,7 +154,7 @@ module KubernetesHelpers
|
|||
|
||||
def stub_kubeclient_ingresses(namespace, status: nil, method: :get, resource_path: "", response: kube_ingresses_response)
|
||||
stub_kubeclient_discover(service.api_url)
|
||||
ingresses_url = service.api_url + "/apis/extensions/v1beta1/namespaces/#{namespace}/ingresses#{resource_path}"
|
||||
ingresses_url = service.api_url + "/apis/networking.k8s.io/v1/namespaces/#{namespace}/ingresses#{resource_path}"
|
||||
response = { status: status } if status
|
||||
|
||||
WebMock.stub_request(method, ingresses_url).to_return(response)
|
||||
|
@ -314,24 +311,6 @@ module KubernetesHelpers
|
|||
}
|
||||
end
|
||||
|
||||
# From Kubernetes 1.16+ Deployments are no longer served from apis/extensions
|
||||
def kube_1_16_extensions_v1beta1_discovery_body
|
||||
{
|
||||
"kind" => "APIResourceList",
|
||||
"resources" => [
|
||||
{ "name" => "ingresses", "namespaced" => true, "kind" => "Deployment" }
|
||||
]
|
||||
}
|
||||
end
|
||||
|
||||
# From Kubernetes 1.22+ Ingresses are no longer served from apis/extensions
|
||||
def kube_1_22_extensions_v1beta1_discovery_body
|
||||
{
|
||||
"kind" => "APIResourceList",
|
||||
"resources" => []
|
||||
}
|
||||
end
|
||||
|
||||
def kube_knative_discovery_body
|
||||
{
|
||||
"kind" => "APIResourceList",
|
||||
|
@ -339,18 +318,6 @@ module KubernetesHelpers
|
|||
}
|
||||
end
|
||||
|
||||
def kube_extensions_v1beta1_discovery_body
|
||||
{
|
||||
"kind" => "APIResourceList",
|
||||
"resources" => [
|
||||
{ "name" => "deployments", "namespaced" => true, "kind" => "Deployment" },
|
||||
{ "name" => "ingresses", "namespaced" => true, "kind" => "Ingress" }
|
||||
]
|
||||
}
|
||||
end
|
||||
|
||||
# Yes, deployments are defined in both apis/extensions/v1beta1 and apis/v1
|
||||
# (for Kubernetes < 1.16). This matches what Kubenetes API server returns.
|
||||
def kube_apps_v1_discovery_body
|
||||
{
|
||||
"kind" => "APIResourceList",
|
||||
|
|
|
@ -5,12 +5,12 @@ require 'spec_helper'
|
|||
# See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#markdown-snapshot-testing
|
||||
# for documentation on this spec.
|
||||
# rubocop:disable Layout/LineLength
|
||||
RSpec.shared_context 'with API::Markdown Snapshot shared context' do |glfm_specification_dir, glfm_example_snapshots_dir|
|
||||
RSpec.shared_context 'with API::Markdown Snapshot shared context' do |glfm_specification_dir|
|
||||
# rubocop:enable Layout/LineLength
|
||||
include ApiHelpers
|
||||
|
||||
markdown_examples, html_examples = %w[markdown.yml html.yml].map do |file_name|
|
||||
yaml = File.read("#{glfm_example_snapshots_dir}/#{file_name}")
|
||||
yaml = File.read("#{glfm_specification_dir}/example_snapshots/#{file_name}")
|
||||
YAML.safe_load(yaml, symbolize_names: true, aliases: true)
|
||||
end
|
||||
|
||||
|
|
17
yarn.lock
17
yarn.lock
|
@ -6920,6 +6920,11 @@ immer@^7.0.7:
|
|||
resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.7.tgz#9dfe713d49bf871cc59aedfce59b1992fa37a977"
|
||||
integrity sha512-Q8yYwVADJXrNfp1ZUAh4XDHkcoE3wpdpb4mC5abDSajs2EbW8+cGdPyAnglMyLnm7EF6ojD2xBFX7L5i4TIytw==
|
||||
|
||||
immutable@^4.0.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
|
||||
integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
|
||||
|
||||
import-fresh@^3.0.0, import-fresh@^3.2.1:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
|
||||
|
@ -11132,12 +11137,14 @@ sane@^4.0.3:
|
|||
minimist "^1.1.1"
|
||||
walker "~1.0.5"
|
||||
|
||||
sass@^1.32.12:
|
||||
version "1.32.12"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.12.tgz#a2a47ad0f1c168222db5206444a30c12457abb9f"
|
||||
integrity sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA==
|
||||
sass@^1.49.9:
|
||||
version "1.49.9"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.9.tgz#b15a189ecb0ca9e24634bae5d1ebc191809712f9"
|
||||
integrity sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==
|
||||
dependencies:
|
||||
chokidar ">=3.0.0 <4.0.0"
|
||||
immutable "^4.0.0"
|
||||
source-map-js ">=0.6.2 <2.0.0"
|
||||
|
||||
sax@1.2.1, sax@>=0.6.0:
|
||||
version "1.2.1"
|
||||
|
@ -11495,7 +11502,7 @@ source-list-map@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
|
||||
integrity sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==
|
||||
|
||||
source-map-js@^1.0.1:
|
||||
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
||||
|
|
Loading…
Reference in New Issue