Commit afc52737 authored by Marcia Ramos's avatar Marcia Ramos

Merge branch 'docs-double-spaces' into 'master'

Fix double spaced sentences in two docs dirs

See merge request gitlab-org/gitlab!24763
parents 7b79ae26 c1d9d574
...@@ -171,7 +171,7 @@ keys must be manually replicated to the **secondary** node. ...@@ -171,7 +171,7 @@ keys must be manually replicated to the **secondary** node.
sudo -i sudo -i
``` ```
1. Edit `/etc/gitlab/gitlab.rb` and add a **unique** name for your node. You will need this in the next steps: 1. Edit `/etc/gitlab/gitlab.rb` and add a **unique** name for your node. You will need this in the next steps:
```ruby ```ruby
# The unique identifier for the Geo node. # The unique identifier for the Geo node.
......
...@@ -45,7 +45,7 @@ query. ...@@ -45,7 +45,7 @@ query.
## Can I `git push` to a **secondary** node? ## Can I `git push` to a **secondary** node?
Yes! Pushing directly to a **secondary** node (for both HTTP and SSH, including Git LFS) was [introduced](https://about.gitlab.com/releases/2018/09/22/gitlab-11-3-released/) in [GitLab Premium](https://about.gitlab.com/pricing/#self-managed) 11.3. Yes! Pushing directly to a **secondary** node (for both HTTP and SSH, including Git LFS) was [introduced](https://about.gitlab.com/releases/2018/09/22/gitlab-11-3-released/) in [GitLab Premium](https://about.gitlab.com/pricing/#self-managed) 11.3.
## How long does it take to have a commit replicated to a **secondary** node? ## How long does it take to have a commit replicated to a **secondary** node?
......
...@@ -227,7 +227,7 @@ remember to run `sudo gitlab-ctl reconfigure` again before trying the ...@@ -227,7 +227,7 @@ remember to run `sudo gitlab-ctl reconfigure` again before trying the
#### Gitaly #### Gitaly
Next we will configure each Gitaly server assigned to Praefect. Configuration for these Next we will configure each Gitaly server assigned to Praefect. Configuration for these
is the same as a normal standalone Gitaly server, except that we use storage names and is the same as a normal standalone Gitaly server, except that we use storage names and
auth tokens from Praefect instead of GitLab. auth tokens from Praefect instead of GitLab.
......
...@@ -16,9 +16,9 @@ source and the target.** ...@@ -16,9 +16,9 @@ source and the target.**
## Target directory is empty: use a tar pipe ## Target directory is empty: use a tar pipe
If the target directory `/mnt/gitlab/repositories` is empty the If the target directory `/mnt/gitlab/repositories` is empty the
simplest thing to do is to use a tar pipe. This method has low simplest thing to do is to use a tar pipe. This method has low
overhead and tar is almost always already installed on your system. overhead and tar is almost always already installed on your system.
However, it is not possible to resume an interrupted tar pipe: if However, it is not possible to resume an interrupted tar pipe: if
that happens then all data must be copied again. that happens then all data must be copied again.
```shell ```shell
...@@ -82,7 +82,7 @@ repository at a time. ...@@ -82,7 +82,7 @@ repository at a time.
In addition to rsync we will use [GNU In addition to rsync we will use [GNU
Parallel](http://www.gnu.org/software/parallel/). This utility is Parallel](http://www.gnu.org/software/parallel/). This utility is
not included in GitLab so you need to install it yourself with apt not included in GitLab so you need to install it yourself with apt
or yum. Also note that the GitLab scripts we used below were added or yum. Also note that the GitLab scripts we used below were added
in GitLab 8.1. in GitLab 8.1.
** This process does not clean up repositories at the target location that no ** This process does not clean up repositories at the target location that no
......
...@@ -75,7 +75,7 @@ Otherwise, you can set the `GITLAB_UNICORN_MEMORY_MIN` and `GITLAB_UNICORN_MEMOR ...@@ -75,7 +75,7 @@ Otherwise, you can set the `GITLAB_UNICORN_MEMORY_MIN` and `GITLAB_UNICORN_MEMOR
This is what a Unicorn worker memory restart looks like in unicorn_stderr.log. This is what a Unicorn worker memory restart looks like in unicorn_stderr.log.
You see that worker 4 (PID 125918) is inspecting itself and decides to exit. You see that worker 4 (PID 125918) is inspecting itself and decides to exit.
The threshold memory value was 254802235 bytes, about 250MB. With GitLab this The threshold memory value was 254802235 bytes, about 250MB. With GitLab this
threshold is a random value between 200 and 250 MB. The master process (PID threshold is a random value between 200 and 250 MB. The master process (PID
117565) then reaps the worker process and spawns a new 'worker 4' with PID 117565) then reaps the worker process and spawns a new 'worker 4' with PID
127549. 127549.
......
...@@ -166,7 +166,7 @@ GIT_CURL_VERBOSE=1 GIT_TRACE=1 git clone <repository> ...@@ -166,7 +166,7 @@ GIT_CURL_VERBOSE=1 GIT_TRACE=1 git clone <repository>
# A single project # A single project
project = Project.find_by_full_path('PROJECT_PATH') project = Project.find_by_full_path('PROJECT_PATH')
# All projects in a particular namespace. Can be a username, a group # All projects in a particular namespace. Can be a username, a group
# ('gitlab-org'), or even include subgroups ('gitlab-org/distribution') # ('gitlab-org'), or even include subgroups ('gitlab-org/distribution')
namespace = Namespace.find_by_full_path('NAMESPACE_PATH') namespace = Namespace.find_by_full_path('NAMESPACE_PATH')
projects = namespace.all_projects projects = namespace.all_projects
...@@ -997,7 +997,7 @@ gitlab_rails['env'] = { ...@@ -997,7 +997,7 @@ gitlab_rails['env'] = {
} }
``` ```
Then `gitlab-ctl reconfigure; gitlab-ctl restart sidekiq`. The Sidekiq logs will now include additional data for troubleshooting. Then `gitlab-ctl reconfigure; gitlab-ctl restart sidekiq`. The Sidekiq logs will now include additional data for troubleshooting.
### Sidekiq kill signals ### Sidekiq kill signals
......
...@@ -133,7 +133,7 @@ sudo !! ...@@ -133,7 +133,7 @@ sudo !!
### Memory, Disk, & CPU usage ### Memory, Disk, & CPU usage
```shell ```shell
# disk space info. The '-h' gives the data in human-readable values # disk space info. The '-h' gives the data in human-readable values
df -h df -h
# size of each file/dir and its contents in the current dir # size of each file/dir and its contents in the current dir
...@@ -186,7 +186,7 @@ Be aware that strace can have major impacts to system performance when it is run ...@@ -186,7 +186,7 @@ Be aware that strace can have major impacts to system performance when it is run
### The Strace Parser tool ### The Strace Parser tool
Our [strace-parser tool](https://gitlab.com/wchandler/strace-parser) can be used to Our [strace-parser tool](https://gitlab.com/wchandler/strace-parser) can be used to
provide a high level summary of the `strace` output. It is similar to `strace -C`, provide a high level summary of the `strace` output. It is similar to `strace -C`,
but provides much more detailed statistics. but provides much more detailed statistics.
MacOS and Linux binaries [are available](https://gitlab.com/gitlab-com/support/toolbox/strace-parser/-/tags), MacOS and Linux binaries [are available](https://gitlab.com/gitlab-com/support/toolbox/strace-parser/-/tags),
...@@ -198,7 +198,7 @@ First run the tool with no arguments other than the strace output file name to g ...@@ -198,7 +198,7 @@ First run the tool with no arguments other than the strace output file name to g
a summary of the top processes sorted by time spent actively performing tasks. You a summary of the top processes sorted by time spent actively performing tasks. You
can also sort based on total time, # of syscalls made, PID #, and # of child processes can also sort based on total time, # of syscalls made, PID #, and # of child processes
using the `-S` or `--sort` flag. The number of results defaults to 25 processes, but using the `-S` or `--sort` flag. The number of results defaults to 25 processes, but
can be changed using the `-c`/`--count` option. See `--help` for full details. can be changed using the `-c`/`--count` option. See `--help` for full details.
```shell ```shell
$ ./strace-parser strace.txt $ ./strace-parser strace.txt
......
...@@ -105,7 +105,7 @@ ORDER BY pg_relation_size(indexrelname::regclass) desc; ...@@ -105,7 +105,7 @@ ORDER BY pg_relation_size(indexrelname::regclass) desc;
``` ```
This query outputs a list containing all indexes that are never used and sorts This query outputs a list containing all indexes that are never used and sorts
them by indexes sizes in descending order. This query can be useful to them by indexes sizes in descending order. This query can be useful to
determine if any previously indexes are useful after all. More information on determine if any previously indexes are useful after all. More information on
the meaning of the various columns can be found at the meaning of the various columns can be found at
<https://www.postgresql.org/docs/current/monitoring-stats.html>. <https://www.postgresql.org/docs/current/monitoring-stats.html>.
......
...@@ -107,7 +107,7 @@ confidence in their solution will not have been reached. ...@@ -107,7 +107,7 @@ confidence in their solution will not have been reached.
Before the review, the author is requested to submit comments on the merge Before the review, the author is requested to submit comments on the merge
request diff alerting the reviewer to anything important as well as for anything request diff alerting the reviewer to anything important as well as for anything
that demands further explanation or attention. Examples of content that may that demands further explanation or attention. Examples of content that may
warrant a comment could be: warrant a comment could be:
- The addition of a linting rule (Rubocop, JS etc) - The addition of a linting rule (Rubocop, JS etc)
...@@ -181,8 +181,8 @@ vulnerabilities must be either empty or containing: ...@@ -181,8 +181,8 @@ vulnerabilities must be either empty or containing:
Maintainers should **never** dismiss vulnerabilities to "empty" the list, Maintainers should **never** dismiss vulnerabilities to "empty" the list,
without duly verifying them. without duly verifying them.
Note that certain Merge Requests may target a stable branch. These are rare Note that certain Merge Requests may target a stable branch. These are rare
events. These types of Merge Requests cannot be merged by the Maintainer. events. These types of Merge Requests cannot be merged by the Maintainer.
Instead these should be sent to the [Release Manager](https://about.gitlab.com/community/release-managers/). Instead these should be sent to the [Release Manager](https://about.gitlab.com/community/release-managers/).
## Best practices ## Best practices
......
...@@ -82,9 +82,9 @@ When you submit code to GitLab, we really want it to get merged, but there will ...@@ -82,9 +82,9 @@ When you submit code to GitLab, we really want it to get merged, but there will
When maintainers are reading through a merge request they may request guidance from other maintainers. If merge request maintainers conclude that the code should not be merged, our reasons will be fully disclosed. If it has been decided that the code quality is not up to GitLab’s standards, the merge request maintainer will refer the author to our docs and code style guides, and provide some guidance. When maintainers are reading through a merge request they may request guidance from other maintainers. If merge request maintainers conclude that the code should not be merged, our reasons will be fully disclosed. If it has been decided that the code quality is not up to GitLab’s standards, the merge request maintainer will refer the author to our docs and code style guides, and provide some guidance.
Sometimes style guides will be followed but the code will lack structural integrity, or the maintainer will have reservations about the code’s overall quality. When there is a reservation the maintainer will inform the author and provide some guidance. The author may then choose to update the merge request. Once the merge request has been updated and reassigned to the maintainer, they will review the code again. Once the code has been resubmitted any number of times, the maintainer may choose to close the merge request with a summary of why it will not be merged, as well as some guidance. If the merge request is closed the maintainer will be open to discussion as to how to improve the code so it can be approved in the future. Sometimes style guides will be followed but the code will lack structural integrity, or the maintainer will have reservations about the code’s overall quality. When there is a reservation the maintainer will inform the author and provide some guidance. The author may then choose to update the merge request. Once the merge request has been updated and reassigned to the maintainer, they will review the code again. Once the code has been resubmitted any number of times, the maintainer may choose to close the merge request with a summary of why it will not be merged, as well as some guidance. If the merge request is closed the maintainer will be open to discussion as to how to improve the code so it can be approved in the future.
GitLab will do its best to review community contributions as quickly as possible. Specially appointed developers review community contributions daily. You may take a look at the [team page](https://about.gitlab.com/company/team/) for the merge request coach who specializes in the type of code you have written and mention them in the merge request. For example, if you have written some JavaScript in your code then you should mention the frontend merge request coach. If your code has multiple disciplines you may mention multiple merge request coaches. GitLab will do its best to review community contributions as quickly as possible. Specially appointed developers review community contributions daily. You may take a look at the [team page](https://about.gitlab.com/company/team/) for the merge request coach who specializes in the type of code you have written and mention them in the merge request. For example, if you have written some JavaScript in your code then you should mention the frontend merge request coach. If your code has multiple disciplines you may mention multiple merge request coaches.
GitLab receives a lot of community contributions, so if your code has not been reviewed within two days (excluding weekend and public holidays) of its initial submission feel free to re-mention the appropriate merge request coach. GitLab receives a lot of community contributions, so if your code has not been reviewed within two days (excluding weekend and public holidays) of its initial submission feel free to re-mention the appropriate merge request coach.
......
...@@ -193,7 +193,7 @@ You might get an error such as ...@@ -193,7 +193,7 @@ You might get an error such as
This is because you've exceeded the disk space threshold - it thinks you don't have enough disk space left, based on the default 95% threshold. This is because you've exceeded the disk space threshold - it thinks you don't have enough disk space left, based on the default 95% threshold.
In addition, the `read_only_allow_delete` setting will be set to `true`. It will block indexing, `forcemerge`, etc In addition, the `read_only_allow_delete` setting will be set to `true`. It will block indexing, `forcemerge`, etc
``` ```
curl "http://localhost:9200/gitlab-development/_settings?pretty" curl "http://localhost:9200/gitlab-development/_settings?pretty"
......
...@@ -85,15 +85,15 @@ browser's developer console while on any page within GitLab. ...@@ -85,15 +85,15 @@ browser's developer console while on any page within GitLab.
#### Important Considerations #### Important Considerations
- **Keep Entry Points Lite:** - **Keep Entry Points Lite:**
Page-specific JavaScript entry points should be as lite as possible. These Page-specific JavaScript entry points should be as lite as possible. These
files are exempt from unit tests, and should be used primarily for files are exempt from unit tests, and should be used primarily for
instantiation and dependency injection of classes and methods that live in instantiation and dependency injection of classes and methods that live in
modules outside of the entry point script. Just import, read the DOM, modules outside of the entry point script. Just import, read the DOM,
instantiate, and nothing else. instantiate, and nothing else.
- **Entry Points May Be Asynchronous:** - **Entry Points May Be Asynchronous:**
_DO NOT ASSUME_ that the DOM has been fully loaded and available when an _DO NOT ASSUME_ that the DOM has been fully loaded and available when an
entry point script is run. If you require that some code be run after the entry point script is run. If you require that some code be run after the
DOM has loaded, you should attach an event handler to the `DOMContentLoaded` DOM has loaded, you should attach an event handler to the `DOMContentLoaded`
event with: event with:
...@@ -113,7 +113,7 @@ browser's developer console while on any page within GitLab. ...@@ -113,7 +113,7 @@ browser's developer console while on any page within GitLab.
with a relative path (e.g. `import initMyWidget from './my_widget';`). with a relative path (e.g. `import initMyWidget from './my_widget';`).
- If a class or module is _used by multiple routes_, place it within a - If a class or module is _used by multiple routes_, place it within a
shared directory at the closest common parent directory for the entry shared directory at the closest common parent directory for the entry
points that import it. For example, if `my_widget.js` is imported within points that import it. For example, if `my_widget.js` is imported within
both `pages/widget/show/index.js` and `pages/widget/run/index.js`, then both `pages/widget/show/index.js` and `pages/widget/run/index.js`, then
place the module at `pages/widget/shared/my_widget.js` and import it with place the module at `pages/widget/shared/my_widget.js` and import it with
a relative path if possible (e.g. `../shared/my_widget`). a relative path if possible (e.g. `../shared/my_widget`).
...@@ -122,7 +122,7 @@ browser's developer console while on any page within GitLab. ...@@ -122,7 +122,7 @@ browser's developer console while on any page within GitLab.
For GitLab Enterprise Edition, page-specific entry points will override their For GitLab Enterprise Edition, page-specific entry points will override their
Community Edition counterparts with the same name, so if Community Edition counterparts with the same name, so if
`ee/app/assets/javascripts/pages/foo/bar/index.js` exists, it will take `ee/app/assets/javascripts/pages/foo/bar/index.js` exists, it will take
precedence over `app/assets/javascripts/pages/foo/bar/index.js`. If you want precedence over `app/assets/javascripts/pages/foo/bar/index.js`. If you want
to minimize duplicate code, you can import one entry point from the other. to minimize duplicate code, you can import one entry point from the other.
This is not done automatically to allow for flexibility in overriding This is not done automatically to allow for flexibility in overriding
functionality. functionality.
...@@ -131,7 +131,7 @@ browser's developer console while on any page within GitLab. ...@@ -131,7 +131,7 @@ browser's developer console while on any page within GitLab.
For any code that does not need to be run immediately upon page load, (e.g. For any code that does not need to be run immediately upon page load, (e.g.
modals, dropdowns, and other behaviors that can be lazy-loaded), you can split modals, dropdowns, and other behaviors that can be lazy-loaded), you can split
your module into asynchronous chunks with dynamic import statements. These your module into asynchronous chunks with dynamic import statements. These
imports return a Promise which will be resolved once the script has loaded: imports return a Promise which will be resolved once the script has loaded:
```javascript ```javascript
......
...@@ -140,7 +140,7 @@ long we're still performing work. ...@@ -140,7 +140,7 @@ long we're still performing work.
GitHub has a rate limit of 5 000 API calls per hour. The number of requests GitHub has a rate limit of 5 000 API calls per hour. The number of requests
necessary to import a project is largely dominated by the number of unique users necessary to import a project is largely dominated by the number of unique users
involved in a project (e.g. issue authors). Other data such as issue pages involved in a project (e.g. issue authors). Other data such as issue pages
and comments typically only requires a few dozen requests to import. This is and comments typically only requires a few dozen requests to import. This is
because we need the Email address of users in order to map them to GitLab users. because we need the Email address of users in order to map them to GitLab users.
We handle this by doing the following: We handle this by doing the following:
......
...@@ -188,9 +188,9 @@ code readability and test output. ...@@ -188,9 +188,9 @@ code readability and test output.
### Better output in tests ### Better output in tests
When comparing expected and actual values in tests, use When comparing expected and actual values in tests, use
[testify/require.Equal](https://godoc.org/github.com/stretchr/testify/require#Equal), [`testify/require.Equal`](https://godoc.org/github.com/stretchr/testify/require#Equal),
[testify/require.EqualError](https://godoc.org/github.com/stretchr/testify/require#EqualError), [`testify/require.EqualError`](https://godoc.org/github.com/stretchr/testify/require#EqualError),
[testify/require.EqualValues](https://godoc.org/github.com/stretchr/testify/require#EqualValues), [`testify/require.EqualValues`](https://godoc.org/github.com/stretchr/testify/require#EqualValues),
and others to improve readability when comparing structs, errors, and others to improve readability when comparing structs, errors,
large portions of text, or JSON documents: large portions of text, or JSON documents:
......
...@@ -129,7 +129,7 @@ importer progresses. Here's what to do: ...@@ -129,7 +129,7 @@ importer progresses. Here's what to do:
## Multi-destination Logging ## Multi-destination Logging
GitLab is transitioning from unstructured/plaintext logs to structured/JSON logs. During this transition period some logs will be recorded in multiple formats through multi-destination logging. GitLab is transitioning from unstructured/plaintext logs to structured/JSON logs. During this transition period some logs will be recorded in multiple formats through multi-destination logging.
### How to use multi-destination logging ### How to use multi-destination logging
......
...@@ -267,7 +267,7 @@ end ...@@ -267,7 +267,7 @@ end
Here the call to `disable_statement_timeout` will use the connection local to Here the call to `disable_statement_timeout` will use the connection local to
the `with_multiple_threads` block, instead of re-using the global connection the `with_multiple_threads` block, instead of re-using the global connection
pool. This ensures each thread has its own connection object, and won't time pool. This ensures each thread has its own connection object, and won't time
out when trying to obtain one. out when trying to obtain one.
**NOTE:** PostgreSQL has a maximum amount of connections that it allows. This **NOTE:** PostgreSQL has a maximum amount of connections that it allows. This
......
...@@ -26,7 +26,7 @@ by [`Namespaces#with_statistics`](https://gitlab.com/gitlab-org/gitlab/blob/4ab5 ...@@ -26,7 +26,7 @@ by [`Namespaces#with_statistics`](https://gitlab.com/gitlab-org/gitlab/blob/4ab5
Additionally, the pattern that is currently used to update the project statistics Additionally, the pattern that is currently used to update the project statistics
(the callback) doesn't scale adequately. It is currently one of the largest (the callback) doesn't scale adequately. It is currently one of the largest
[database queries transactions on production](https://gitlab.com/gitlab-org/gitlab-foss/issues/62488) [database queries transactions on production](https://gitlab.com/gitlab-org/gitlab-foss/issues/62488)
that takes the most time overall. We can't add one more query to it as that takes the most time overall. We can't add one more query to it as
it will increase the transaction's length. it will increase the transaction's length.
Because of all of the above, we can't apply the same pattern to store Because of all of the above, we can't apply the same pattern to store
......
...@@ -103,7 +103,7 @@ You also can move around in the callstack with these commands: ...@@ -103,7 +103,7 @@ You also can move around in the callstack with these commands:
## Short commands ## Short commands
When you use `binding.pry` instead of `byebug`, the short commands When you use `binding.pry` instead of `byebug`, the short commands
like `s`, `n`, `f`, and `c` do not work. To reinstall them, add this like `s`, `n`, `f`, and `c` do not work. To reinstall them, add this
to `~/.pryrc`: to `~/.pryrc`:
```ruby ```ruby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
> This doc refers to <https://gitlab.com/gitlab-org/gitlab/blob/master/app/models/concerns/reactive_caching.rb>. > This doc refers to <https://gitlab.com/gitlab-org/gitlab/blob/master/app/models/concerns/reactive_caching.rb>.
The `ReactiveCaching` concern is used for fetching some data in the background and store it The `ReactiveCaching` concern is used for fetching some data in the background and store it
in the Rails cache, keeping it up-to-date for as long as it is being requested. If the in the Rails cache, keeping it up-to-date for as long as it is being requested. If the
data hasn't been requested for `reactive_cache_lifetime`, it will stop being refreshed, data hasn't been requested for `reactive_cache_lifetime`, it will stop being refreshed,
and then be removed. and then be removed.
......
...@@ -21,4 +21,4 @@ The more of the following that are true, the more likely you should choose the f ...@@ -21,4 +21,4 @@ The more of the following that are true, the more likely you should choose the f
## Consider a façade-first approach ## Consider a façade-first approach
The façade approach is not necessarily a final step. It can (and possibly *should*) be treated as the first step, where later iterations will accomplish the complete rename. The façade approach is not necessarily a final step. It can (and possibly *should*) be treated as the first step, where later iterations will accomplish the complete rename.
...@@ -165,7 +165,7 @@ and secondaries are set up a bit differently: ...@@ -165,7 +165,7 @@ and secondaries are set up a bit differently:
For replicas, colocating is advantageous because it reduces network hops For replicas, colocating is advantageous because it reduces network hops
and hence latency. However, for the primary, colocating is and hence latency. However, for the primary, colocating is
disadvantageous because PgBouncer would become a single point of failure disadvantageous because PgBouncer would become a single point of failure
and cause errors. When a failover occurs, one of two things could and cause errors. When a failover occurs, one of two things could
happen: happen:
- The primary disappears from the network. - The primary disappears from the network.
...@@ -212,7 +212,7 @@ Redis process. ...@@ -212,7 +212,7 @@ Redis process.
#### High availability/Risks #### High availability/Risks
Single-core: Like PgBouncer, a single Redis process can only use one Single-core: Like PgBouncer, a single Redis process can only use one
core. It does not support multi-threading. core. It does not support multi-threading.
Dumb secondaries: Redis secondaries (aka slaves) don't actually Dumb secondaries: Redis secondaries (aka slaves) don't actually
handle any load. Unlike PostgreSQL secondaries, they don't even serve handle any load. Unlike PostgreSQL secondaries, they don't even serve
......
...@@ -126,7 +126,7 @@ Note that unlike `Gitlab::Popen.popen`, `IO.popen` does not capture standard err ...@@ -126,7 +126,7 @@ Note that unlike `Gitlab::Popen.popen`, `IO.popen` does not capture standard err
## Avoid user input at the start of path strings ## Avoid user input at the start of path strings
Various methods for opening and reading files in Ruby can be used to read the Various methods for opening and reading files in Ruby can be used to read the
standard output of a process instead of a file. The following two commands do standard output of a process instead of a file. The following two commands do
roughly the same: roughly the same:
```ruby ```ruby
...@@ -138,7 +138,7 @@ The key is to open a 'file' whose name starts with a `|`. ...@@ -138,7 +138,7 @@ The key is to open a 'file' whose name starts with a `|`.
Affected methods include Kernel#open, File::read, File::open, IO::open and IO::read. Affected methods include Kernel#open, File::read, File::open, IO::open and IO::read.
You can protect against this behavior of 'open' and 'read' by ensuring that an You can protect against this behavior of 'open' and 'read' by ensuring that an
attacker cannot control the start of the filename string you are opening. For attacker cannot control the start of the filename string you are opening. For
instance, the following is sufficient to protect against accidentally starting instance, the following is sufficient to protect against accidentally starting
a shell command with `|`: a shell command with `|`:
......
...@@ -536,7 +536,7 @@ reset before each example, add the `:prometheus` tag to the Rspec test. ...@@ -536,7 +536,7 @@ reset before each example, add the `:prometheus` tag to the Rspec test.
### Matchers ### Matchers
Custom matchers should be created to clarify the intent and/or hide the Custom matchers should be created to clarify the intent and/or hide the
complexity of RSpec expectations.They should be placed under complexity of RSpec expectations. They should be placed under
`spec/support/matchers/`. Matchers can be placed in subfolder if they apply to `spec/support/matchers/`. Matchers can be placed in subfolder if they apply to
a certain type of specs only (e.g. features, requests etc.) but shouldn't be if a certain type of specs only (e.g. features, requests etc.) but shouldn't be if
they apply to multiple type of specs. they apply to multiple type of specs.
......
...@@ -27,7 +27,7 @@ Runtime::Browser.visit(:gitlab, Some::Page) ...@@ -27,7 +27,7 @@ Runtime::Browser.visit(:gitlab, Some::Page)
### Clicks ### Clicks
When we perform a click within our tests, we expect something to occur. That something could be a component to now When we perform a click within our tests, we expect something to occur. That something could be a component to now
appear on the webpage, or the test to navigate away from the page entirely. appear on the webpage, or the test to navigate away from the page entirely.
Dynamic element validation is instituted when using Dynamic element validation is instituted when using
...@@ -57,7 +57,7 @@ Simply put, a required element is a visible HTML element that appears on a UI co ...@@ -57,7 +57,7 @@ Simply put, a required element is a visible HTML element that appears on a UI co
#### Application #### Application
Requiring elements is very easy. By adding `required: true` as a parameter to an `element`, you've now made it Requiring elements is very easy. By adding `required: true` as a parameter to an `element`, you've now made it
a requirement that the element appear on the page upon navigation. a requirement that the element appear on the page upon navigation.
## Examples ## Examples
......
...@@ -152,7 +152,7 @@ Things to note: ...@@ -152,7 +152,7 @@ Things to note:
- The name of the element and the qa_selector must match and be snake_cased - The name of the element and the qa_selector must match and be snake_cased
- If the element appears on the page unconditionally, add `required: true` to the element. See - If the element appears on the page unconditionally, add `required: true` to the element. See
[Dynamic element validation](dynamic_element_validation.md) [Dynamic element validation](dynamic_element_validation.md)
- You may see `.qa-selector` classes in existing Page Objects. We should prefer the [`data-qa-selector`](#data-qa-selector-vs-qa-selector) - You may see `.qa-selector` classes in existing Page Objects. We should prefer the [`data-qa-selector`](#data-qa-selector-vs-qa-selector)
method of definition over the `.qa-selector` CSS class method of definition over the `.qa-selector` CSS class
### `data-qa-selector` vs `.qa-selector` ### `data-qa-selector` vs `.qa-selector`
...@@ -173,7 +173,7 @@ and we should prefer the `data-qa-selector` method of definition. ...@@ -173,7 +173,7 @@ and we should prefer the `data-qa-selector` method of definition.
A common occurrence in automated testing is selecting a single "one-of-many" element. A common occurrence in automated testing is selecting a single "one-of-many" element.
In a list of several items, how do you differentiate what you are selecting on? In a list of several items, how do you differentiate what you are selecting on?
The most common workaround for this is via text matching. Instead, a better practice is The most common workaround for this is via text matching. Instead, a better practice is
by matching on that specific element by a unique identifier, rather than by text. by matching on that specific element by a unique identifier, rather than by text.
We got around this by adding the `data-qa-*` extensible selection mechanism. We got around this by adding the `data-qa-*` extensible selection mechanism.
......
...@@ -59,7 +59,7 @@ project = table(:projects).create!(id: 1, name: 'gitlab1', path: 'gitlab1') ...@@ -59,7 +59,7 @@ project = table(:projects).create!(id: 1, name: 'gitlab1', path: 'gitlab1')
#### `migrate!` #### `migrate!`
Use the `migrate!` helper to run the migration that is under test. It will not only Use the `migrate!` helper to run the migration that is under test. It will not only
run the migration, but will also bump the schema version in the `schema_migrations` run the migration, but will also bump the schema version in the `schema_migrations`
table. It is necessary because in the `after` hook we trigger the rest of table. It is necessary because in the `after` hook we trigger the rest of
the migrations, and we need to know where to start. Example: the migrations, and we need to know where to start. Example:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment