Skip to content

Commit

Permalink
Merge branch 'main' into elenatanasoiu/cop-links
Browse files Browse the repository at this point in the history
  • Loading branch information
issyl0 authored Oct 26, 2022
2 parents ffeb9fb + 2a2a9d0 commit 174d2c7
Show file tree
Hide file tree
Showing 13 changed files with 251 additions and 214 deletions.
1 change: 1 addition & 0 deletions CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @github/ruby-architecture-reviewers
73 changes: 73 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies within all project spaces, and it also applies when
an individual is representing the project or its community in public spaces.
Examples of representing a project or community include using an official
project e-mail address, posting via an official social media account, or acting
as an appointed representative at an online or offline event. Representation of
a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at [email protected]. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org
42 changes: 42 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Contributing

We welcome your contributions to the project. Thank you!

Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.


## What to contribute

This repository, `rubocop-github`, is part of a broader RuboCop ecosystem.

If the Cop you would like to propose is **generally applicable outside of GitHub**:

1. Propose the change upstream in the core open source project (e.g. [`rubocop`](https://github.com/rubocop/rubocop), or [`rubocop-rails`](https://github.com/rubocop/rubocop-rails)), where it will have maximal visibility and discussion/feedback.
1. Patch the change provisionally into GitHub's project(s), for immediate benefit; that can include this repository.
1. ...if the proposal is accepted, remove the patch and pull the updated upstream.
1. ...if the proposal is not accepted, we usually learn something about our proposal, and we then choose whether to maintain the patch ourselves, discard it, or identify a better open-source home for it.

If the Cop is **only applicable for GitHub**, then this is the right place to propose it.

## How to contribute a Pull Request

1. Fork and clone the repository
1. [Build it and make sure the tests pass](README.md#Testing) on your machine
1. Create a new branch: `git checkout -b my-branch-name`
1. Make your change, add tests, and make sure the tests still pass
1. Push to your fork and submit a Pull Request
1. Pat yourself on the back and wait for your pull request to be reviewed and merged.

## For Maintainers

### Releasing a new version

1. Update `rubocop-github.gemspec` with the next version number
1. Update the `CHANGELOG` with changes and contributor
1. Run `bundle` to update gem version contained in the lockfile
1. Make a commit: `Release v{VERSION}`
1. Tag the commit : `git tag v{VERSION}`
1. Create the package: `gem build rubocop-github.gemspec`
1. Push to GitHub: `git push origin && git push origin --tags`
1. Push to Rubygems: `gem push rubocop-github-{VERSION}.gem`
1. Publish a new release on GitHub: https://github.com/github/rubocop-github/releases/new
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# RuboCop GitHub ![CI](https://github.com/github/rubocop-github/workflows/CI/badge.svg?event=push)

This repository provides recommended RuboCop configuration and additional Cops for use on GitHub open source and internal Ruby projects.
This repository provides recommended RuboCop configuration and additional Cops for use on GitHub open source and internal Ruby projects, and is the home of [GitHub's Ruby Style Guide](./STYLEGUIDE.md).

## Usage

Expand Down
128 changes: 128 additions & 0 deletions STYLEGUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ This is GitHub's Ruby Style Guide, inspired by [RuboCop's guide][rubocop-guide].
1. [Conditional keywords](#conditional-keywords)
2. [Ternary operator](#ternary-operator)
17. [Syntax](#syntax)
18. [Rails](#rails)
1. [content_for](#content_for)
2. [Instance Variables in Views](#instance-variables-in-views)

## Layout

Expand Down Expand Up @@ -951,4 +954,129 @@ result = hash.map { |_, v| v + 1 }
Refactoring is even better. It's worth looking hard at any code that explicitly checks types.

## Rails

### content_for

Limit usage of `content_for` helper. The use of `content_for` is the same as setting an instance variable plus `capture`.

``` erb
<% content_for :foo do %>
Hello
<% end %>
```

Is effectively the same as

``` erb
<% @foo_content = capture do %>
Hello
<% end %>
```

See "Instance Variables in Views" below.

#### Common Anti-patterns

**Using `content_for` within the same template to capture data.**

Instead, just use `capture`.

``` erb
<!-- bad -->
<% content_for :page do %>
Hello
<% end %>
<% if foo? %>
<div class="container">
<%= yield :page %>
</div>
<% else %>
<%= yield :page %>
<% end %>
```

Simply capture and use a local variable since the result is only needed in this template.

``` erb
<!-- good -->
<% page = capture do %>
Hello
<% end %>
<% if foo? %>
<div class="container">
<%= page %>
</div>
<% else %>
<%= page %>
<% end %>
```

**Using `content_for` to pass content to a subtemplate.**

Instead, `render layout:` with a block.

``` erb
<!-- bad -->
<% content_for :page do %>
Hello
<% end %>
<%= render partial: "page" %>
<!-- _page.html.erb -->
<div class="container">
<%= yield :page %>
</div>
```

Pass the content in a block directly to the `render` function.

``` erb
<!-- good -->
<%= render layout: "page" do %>
Hello
<% end %>
<!-- _page.html.erb -->
<div class="container">
<%= yield %>
</div>
```

### Instance Variables in Views

In general, passing data between templates with instance variables is discouraged. This even applies from controllers to templates, not just between partials.

`:locals` can be used to pass data from a controller just like partials.

``` ruby
def show
render "blob/show", locals: {
:repository => current_repository,
:commit => current_commit,
:blob => current_blob
}
end
```

Rails implicit renders are also discouraged.

Always explicitly render templates with a full directory path. This makes template callers easier to trace. You can find all the callers of `"app/view/site/hompage.html.erb"` with a simple project search for `"site/homepage"`.

``` ruby
def homepage
render "site/homepage"
end
```

#### Exceptions

There are some known edge cases where you might be forced to use instance variables. In these cases, its okay to do so.

##### Legacy templates

If you need to call a subview that expects an instance variable be set. If possible consider refactoring the subview to accept a local instead.

##### Layouts

Unfortunately the only way to get data into a layout template is with instance variables. You can't explicitly pass locals to them.
[rubocop-guide]: https://github.com/rubocop-hq/ruby-style-guide
20 changes: 4 additions & 16 deletions config/default.yml
Original file line number Diff line number Diff line change
Expand Up @@ -182,16 +182,14 @@ Layout/HeredocIndentation:
Enabled: false

Layout/IndentationConsistency:
Enabled: false
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#indentation

Layout/IndentationStyle:
Enabled: true
EnforcedStyle: spaces
IndentationWidth: 2
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#default-indentation

Layout/IndentationWidth:
Enabled: true
Width: 2
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#default-indentation

Expand Down Expand Up @@ -262,11 +260,9 @@ Layout/SingleLineBlockChain:
Enabled: false

Layout/SpaceAfterColon:
Enabled: true
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#spaces-operators

Layout/SpaceAfterComma:
Enabled: true
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#spaces-operators

Layout/SpaceAfterMethodName:
Expand All @@ -276,18 +272,16 @@ Layout/SpaceAfterNot:
Enabled: true

Layout/SpaceAfterSemicolon:
Enabled: true
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#spaces-operators

Layout/SpaceAroundBlockParameters:
Enabled: true

Layout/SpaceAroundEqualsInParameterDefault:
Enabled: true
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#spaces-around-equals

Layout/SpaceAroundKeyword:
Enabled: false
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#spaces-operators

Layout/SpaceAroundMethodCallOperator:
Enabled: false
Expand Down Expand Up @@ -317,7 +311,6 @@ Layout/SpaceInLambdaLiteral:
Enabled: false

Layout/SpaceInsideArrayLiteralBrackets:
Enabled: true
EnforcedStyle: no_space
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#no-spaces-braces

Expand Down Expand Up @@ -349,7 +342,6 @@ Layout/TrailingEmptyLines:
Enabled: true

Layout/TrailingWhitespace:
Enabled: true
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#trailing-whitespace

Lint/AmbiguousAssignment:
Expand Down Expand Up @@ -691,7 +683,7 @@ Lint/UnreachableLoop:
# TODO: Enable this since it's in the styleguide.
Lint/UnusedBlockArgument:
Enabled: false
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#spaces-around-equals
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#underscore-unused-vars

Lint/UnusedMethodArgument:
Enabled: false
Expand Down Expand Up @@ -1090,7 +1082,6 @@ Style/DateTime:
Enabled: false

Style/DefWithParentheses:
Enabled: true
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#method-parens-when-arguments

Style/Dir:
Expand Down Expand Up @@ -1178,7 +1169,6 @@ Style/FloatDivision:
Enabled: false

Style/For:
Enabled: true
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#avoid-for

Style/FormatString:
Expand Down Expand Up @@ -1215,7 +1205,6 @@ Style/HashLikeCase:
Enabled: false

Style/HashSyntax:
Enabled: true
EnforcedStyle: ruby19_no_mixed_keys
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#symbols-as-keys

Expand Down Expand Up @@ -1316,7 +1305,6 @@ Style/MultilineIfModifier:
Enabled: false

Style/MultilineIfThen:
Enabled: true
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#no-then-for-multi-line-if-unless

Style/MultilineInPatternThen:
Expand Down Expand Up @@ -1583,8 +1571,8 @@ Style/StringHashKeys:
Enabled: false

Style/StringLiterals:
Enabled: true
EnforcedStyle: double_quotes
StyleGuide: https://github.com/github/rubocop-github/blob/main/STYLEGUIDE.md#double-quotes

Style/StringLiteralsInInterpolation:
Enabled: false
Expand Down
Loading

0 comments on commit 174d2c7

Please sign in to comment.