├── Gemfile
├── .rubocop.yml
├── dist
├── i18n
│ └── locale.json
├── packwerk
│ └── package.json
├── sidekiq.json
├── rails
│ ├── cache.json
│ ├── recurring.json
│ ├── cable.json
│ ├── queue.json
│ ├── database.json
│ └── storage.json
├── rorvswild.json
├── shoryuken.json
├── index.html
├── pghero.json
├── vite.json
├── rails.rb
├── i18n-tasks.json
├── mongoid.json
├── scout_apm.json
├── lefthook.json
├── kamal
│ └── deploy.json
├── honeybadger.json
└── standard.json
├── LICENSE
├── Gemfile.lock
├── README.md
└── .rubocop-https---www-goodcop-style-base-yml
/Gemfile:
--------------------------------------------------------------------------------
1 |
2 | source 'https://rubygems.org'
3 |
4 | gem "rubocop"
5 |
--------------------------------------------------------------------------------
/.rubocop.yml:
--------------------------------------------------------------------------------
1 | # yaml-language-server: $schema=./dist/rubocop.json
2 |
3 | inherit_from:
4 | - "https://www.goodcop.style/base.yml"
5 |
6 | AllCops:
7 | TargetRubyVersion: 3.4
8 |
9 | Layout/HashAlignment:
10 | EnforcedHashRocketStyle: table
11 |
--------------------------------------------------------------------------------
/dist/i18n/locale.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/rails/locale.json",
4 | "title": "I18n Locale",
5 | "type": "object",
6 | "definitions": {
7 | "config": {
8 | "type": "object",
9 | "propertyNames": {
10 | "type": "string"
11 | },
12 | "additionalProperties": {
13 | "oneOf": [{ "type": "string" }, { "$ref": "#/definitions/config" }]
14 | }
15 | }
16 | },
17 | "additionalProperties": {
18 | "$ref": "#/definitions/config"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT No Attribution License
2 |
3 | Copyright (c) 2025 Joel Drapper
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so.
11 |
12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18 | SOFTWARE.
19 |
--------------------------------------------------------------------------------
/dist/packwerk/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/packwerk/package.json",
4 | "title": "Packwerk Package",
5 | "type": "object",
6 | "properties": {
7 | "metadata": {
8 | "type": "object",
9 | "markdownDescription": "[Docs](https://github.com/Shopify/packwerk/blob/main/USAGE.md#package-metadata)"
10 | },
11 | "enforce_dependencies": {
12 | "anyOf": [
13 | {
14 | "type": "boolean"
15 | },
16 | {
17 | "enum": [
18 | "strict"
19 | ]
20 | }
21 | ]
22 | },
23 | "dependencies": {
24 | "type": "array",
25 | "uniqueItems": true,
26 | "items": {
27 | "type": "string"
28 | }
29 | },
30 | "require": {
31 | "type": "array",
32 | "uniqueItems": true,
33 | "items": {
34 | "type": "string"
35 | }
36 | },
37 | "offenses_formatter": {
38 | "type": "string"
39 | }
40 | },
41 | "additionalProperties": false
42 | }
43 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | ast (2.4.3)
5 | json (2.12.2)
6 | language_server-protocol (3.17.0.5)
7 | lint_roller (1.1.0)
8 | parallel (1.27.0)
9 | parser (3.3.8.0)
10 | ast (~> 2.4.1)
11 | racc
12 | prism (1.4.0)
13 | racc (1.8.1)
14 | rainbow (3.1.1)
15 | regexp_parser (2.10.0)
16 | rubocop (1.76.1)
17 | json (~> 2.3)
18 | language_server-protocol (~> 3.17.0.2)
19 | lint_roller (~> 1.1.0)
20 | parallel (~> 1.10)
21 | parser (>= 3.3.0.2)
22 | rainbow (>= 2.2.2, < 4.0)
23 | regexp_parser (>= 2.9.3, < 3.0)
24 | rubocop-ast (>= 1.45.0, < 2.0)
25 | ruby-progressbar (~> 1.7)
26 | unicode-display_width (>= 2.4.0, < 4.0)
27 | rubocop-ast (1.45.1)
28 | parser (>= 3.3.7.2)
29 | prism (~> 1.4)
30 | ruby-progressbar (1.13.0)
31 | unicode-display_width (3.1.4)
32 | unicode-emoji (~> 4.0, >= 4.0.4)
33 | unicode-emoji (4.0.4)
34 |
35 | PLATFORMS
36 | arm64-darwin-24
37 | ruby
38 |
39 | DEPENDENCIES
40 | rubocop
41 |
42 | BUNDLED WITH
43 | 2.6.7
44 |
--------------------------------------------------------------------------------
/dist/sidekiq.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/sidekiq.json",
4 | "title": "Sidekiq configuration",
5 | "markdownDescription": "[Sidekiq Docs](https://github.com/sidekiq/sidekiq/wiki/Advanced-Options#the-sidekiq-configuration-file)",
6 | "definitions": {
7 | "environment": {
8 | "properties": {
9 | "concurrency": {
10 | "type": "integer",
11 | "minimum": 0
12 | },
13 | "queues": {
14 | "type": "array",
15 | "uniqueItems": true,
16 | "items": {
17 | "oneOf": [
18 | {
19 | "type": "string"
20 | },
21 | {
22 | "type": "array",
23 | "items": [{ "type": "string" }, { "type": "integer" }],
24 | "additionalItems": false,
25 | "minItems": 2
26 | }
27 | ]
28 | },
29 | "minItems": 1
30 | }
31 | },
32 | "additionalProperties": false
33 | }
34 | },
35 | "$ref": "#/definitions/environment",
36 | "properties": {
37 | "development": { "$ref": "#/definitions/environment" },
38 | "production": { "$ref": "#/definitions/environment" },
39 | "staging": { "$ref": "#/definitions/environment" }
40 | },
41 | "additionalProperties": {
42 | "$ref": "#/definitions/environment"
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/dist/rails/cache.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/rails/cache.json",
4 | "title": "Solid Cache configuration",
5 | "type": "object",
6 | "definitions": {
7 | "erb": { "type": "string", "pattern": "^<%=.*%>$" },
8 | "environment": {
9 | "type": "object",
10 | "properties": {
11 | "databases": {
12 | "type": "array",
13 | "uniqueItems": true,
14 | "items": {
15 | "type": "string"
16 | }
17 | },
18 | "encrypt": {
19 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }]
20 | },
21 | "store_options": {
22 | "type": "object",
23 | "properties": {
24 | "max_age": {
25 | "anyOf": [
26 | { "type": "integer", "minimum": 0 },
27 | { "$ref": "#/definitions/erb" }
28 | ]
29 | },
30 | "max_size": {
31 | "anyOf": [
32 | { "type": "integer", "minimum": 0 },
33 | { "$ref": "#/definitions/erb" }
34 | ]
35 | },
36 | "namespace": {
37 | "type": "string"
38 | }
39 | },
40 | "additionalProperties": false
41 | }
42 | },
43 | "additionalProperties": false
44 | }
45 | },
46 | "additionalProperties": {
47 | "$ref": "#/definitions/environment"
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/dist/rorvswild.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/rorvswild.json",
4 | "title": "RoRvsWild configuration",
5 | "type": "object",
6 | "definitions": {
7 | "constant": {
8 | "type": "string",
9 | "pattern": "^(?:::)?[A-Z][a-zA-Z0-9_]*(?:::[A-Z][a-zA-Z0-9_]*)*$"
10 | },
11 | "environment": {
12 | "properties": {
13 | "api_key": {
14 | "type": "string"
15 | },
16 | "ignore_requests": {
17 | "type": "array",
18 | "uniqueItems": true,
19 | "items": {
20 | "type": "string",
21 | "pattern": "^(?:::)?[A-Z][a-zA-Z0-9_]*(?:::[A-Z][a-zA-Z0-9_]*)*#.+$"
22 | },
23 | "examples": [["HeartbeatController#show"]]
24 | },
25 | "ignore_jobs": {
26 | "type": "array",
27 | "uniqueItems": true,
28 | "items": {
29 | "$ref": "#/definitions/constant"
30 | }
31 | },
32 | "ignore_exceptions": {
33 | "type": "array",
34 | "uniqueItems": true,
35 | "items": {
36 | "$ref": "#/definitions/constant"
37 | }
38 | },
39 | "ignore_plugins": {
40 | "type": "array",
41 | "uniqueItems": true,
42 | "items": {
43 | "enum": [
44 | "ActionController",
45 | "ActionMailer",
46 | "ActionView",
47 | "ActiveJob",
48 | "ActiveRecord",
49 | "DelayedJob",
50 | "Elasticsearch",
51 | "Mongo",
52 | "NetHttp",
53 | "Redis",
54 | "Resque",
55 | "Sidekiq"
56 | ]
57 | }
58 | }
59 | }
60 | }
61 | },
62 | "additionalProperties": {
63 | "$ref": "#/definitions/environment"
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/dist/shoryuken.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/shoryuken.json",
4 | "title": "Shoryuken options",
5 | "definitions": {
6 | "erb": {
7 | "type": "string",
8 | "pattern": "^<%=.*%>$"
9 | }
10 | },
11 | "properties": {
12 | "logfile": {
13 | "type": "string"
14 | },
15 | "pidfile": {
16 | "type": "string"
17 | },
18 | "queues": {
19 | "type": "array",
20 | "markdownDescription": "[Docs](https://github.com/ruby-shoryuken/shoryuken/wiki/Shoryuken-options#queues)",
21 | "uniqueItems": true,
22 | "items": {
23 | "oneOf": [
24 | {
25 | "type": "string"
26 | },
27 | {
28 | "type": "array",
29 | "items": [
30 | { "type": "string" },
31 | {
32 | "anyOf": [
33 | { "type": "integer" },
34 | { "$ref": "#/definitions/erb" }
35 | ]
36 | }
37 | ],
38 | "additionalItems": false,
39 | "minItems": 2
40 | }
41 | ]
42 | },
43 | "minItems": 1
44 | },
45 | "delay": {
46 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
47 | "markdownDescription": "Delay is the number of seconds to pause fetching from when an empty queue.\n\n[Docs](https://github.com/ruby-shoryuken/shoryuken/wiki/Shoryuken-options#delay)",
48 | "default": 0
49 | },
50 | "concurrency": {
51 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
52 | "markdownDescription": "[Docs](https://github.com/ruby-shoryuken/shoryuken/wiki/Shoryuken-options#concurrency)",
53 | "default": 25
54 | },
55 | "cache_visibility_timeout": {
56 | "anyOf": [
57 | { "type": ["integer", "boolean"] },
58 | { "$ref": "#/definitions/erb" }
59 | ],
60 | "markdownDescription": "[Docs](https://github.com/ruby-shoryuken/shoryuken/wiki/Shoryuken-options#cache_visibility_timeout)"
61 | }
62 | },
63 | "additionalProperties": false
64 | }
65 |
--------------------------------------------------------------------------------
/dist/rails/recurring.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/rails/recurring.json",
4 | "title": "SolidQueue Recurring Configuration",
5 | "type": "object",
6 | "definitions": {
7 | "environment": {
8 | "markdownDescription": "[Docs](https://guides.rubyonrails.org/active_job_basics.html#recurring-tasks)",
9 | "additionalProperties": {
10 | "oneOf": [
11 | { "$ref": "#/definitions/task" },
12 | { "$ref": "#/definitions/job" }
13 | ]
14 | }
15 | },
16 | "schedule": {
17 | "type": "string",
18 | "markdownDescription": "Natural langauge cron schedule such as \"every 5 minutes\" or \"every day at 5pm\".\n\n[Fugit Docs](https://github.com/floraison/fugit?tab=readme-ov-file#fugitcron)"
19 | },
20 | "priority": {
21 | "title": "Example",
22 | "markdownDescription": "Numeric priority value (any positive integer) used when enqueuing the job. The smaller the value, the higher the priority. `0` is the highest priority.",
23 | "type": "integer",
24 | "minimum": 0
25 | },
26 | "task": {
27 | "properties": {
28 | "command": {
29 | "type": "string",
30 | "markdownDescription": "Ruby code that will be evaluated in the context of a job (`SolidQueue::RecurringJob`)."
31 | },
32 | "schedule": {
33 | "$ref": "#/definitions/schedule"
34 | },
35 | "priority": {
36 | "$ref": "#/definitions/priority"
37 | },
38 | "queue": {
39 | "type": "string"
40 | }
41 | },
42 | "required": ["command", "schedule"],
43 | "additionalProperties": false
44 | },
45 | "job": {
46 | "properties": {
47 | "class": {
48 | "type": "string",
49 | "pattern": "^(?:::)?[A-Z][a-zA-Z0-9_]*(?:::[A-Z][a-zA-Z0-9_]*)*Job$"
50 | },
51 | "args": {
52 | "type": ["array", "object"]
53 | },
54 | "schedule": {
55 | "$ref": "#/definitions/schedule"
56 | },
57 | "priority": {
58 | "$ref": "#/definitions/priority"
59 | },
60 | "queue": {
61 | "type": "string"
62 | }
63 | },
64 | "required": ["class", "schedule"],
65 | "additionalProperties": false
66 | }
67 | },
68 | "properties": {
69 | "production": { "$ref": "#/definitions/environment" }
70 | },
71 | "additionalProperties": {
72 | "$ref": "#/definitions/environment"
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/dist/rails/cable.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/rails/cable.json",
4 | "title": "",
5 | "type": "object",
6 | "definitions": {
7 | "erb": { "type": "string", "pattern": "^<%=.*%>$" },
8 | "environment": {
9 | "title": "Environment",
10 | "anyOf": [
11 | { "$ref": "#/definitions/redis" },
12 | { "$ref": "#/definitions/async" },
13 | { "$ref": "#/definitions/test" },
14 | { "$ref": "#/definitions/solid_cable" },
15 | {
16 | "type": "object",
17 | "properties": {
18 | "adapter": {
19 | "type": "string",
20 | "not": {
21 | "enum": ["redis", "async", "test", "solid_cable"]
22 | }
23 | }
24 | },
25 | "additionalProperties": true
26 | }
27 | ]
28 | },
29 | "redis": {
30 | "type": "object",
31 | "properties": {
32 | "adapter": {
33 | "const": "redis"
34 | },
35 | "url": {
36 | "type": "string"
37 | },
38 | "channel_prefix": {
39 | "type": "string"
40 | },
41 | "ssl_params": {
42 | "markdownDescription": "Parameters passed to [`OpenSSL::SSL::SSLContext#set_params`](https://docs.ruby-lang.org/en/master/OpenSSL/SSL/SSLContext.html#method-i-set_params).",
43 | "type": "object",
44 | "properties": {
45 | "ciphers": {},
46 | "ciphersuites": {},
47 | "ecdh_curves": {},
48 | "max_version": {},
49 | "min_version": {},
50 | "security_level": {},
51 | "session_cache_mode": {},
52 | "session_cache_size": {},
53 | "ssl_version": {},
54 | "tmp_dh": {}
55 | },
56 | "additionalProperties": true
57 | }
58 | },
59 | "required": ["adapter", "url"],
60 | "additionalProperties": false
61 | },
62 | "async": {
63 | "type": "object",
64 | "properties": {
65 | "adapter": {
66 | "const": "async"
67 | }
68 | },
69 | "additionalProperties": false
70 | },
71 | "test": {
72 | "type": "object",
73 | "properties": {
74 | "adapter": {
75 | "const": "test"
76 | }
77 | },
78 | "additionalProperties": false
79 | },
80 | "solid_cable": {
81 | "type": "object",
82 | "properties": {
83 | "adapter": {
84 | "const": "solid_cable"
85 | },
86 | "connects_to": {
87 | "type": "object"
88 | },
89 | "polling_interval": {
90 | "type": "string",
91 | "examples": ["0.1 seconds"]
92 | },
93 | "message_retention": {
94 | "type": "string",
95 | "examples": ["1.day"]
96 | },
97 | "autotrim": {
98 | "type": "boolean",
99 | "default": true
100 | },
101 | "silence_polling": {
102 | "type": "boolean",
103 | "default": true
104 | },
105 | "use_skip_locked": {
106 | "type": "boolean"
107 | },
108 | "trim_batch_size": {
109 | "type": "integer",
110 | "default": 100
111 | }
112 | },
113 | "additionalProperties": false
114 | }
115 | },
116 | "additionalProperties": {
117 | "$ref": "#/definitions/environment"
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/dist/rails/queue.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/rails/queue.json",
4 | "title": "Rails Queue Configuration",
5 | "type": "object",
6 | "definitions": {
7 | "erb": { "type": "string", "pattern": "^<%=.*%>$" },
8 | "environment": {
9 | "type": "object",
10 | "description": "Queue environment configuration",
11 | "properties": {
12 | "dispatchers": {
13 | "$ref": "#/definitions/actors",
14 | "markdownDescription": "Dispatchers select jobs scheduled to run for the future. When it's time for these jobs to run, dispatchers move them from the `solid_queue_scheduled_executions` table to the `solid_queue_ready_executions` table so workers can pick them up. They also manage concurrency-related maintenance."
15 | },
16 | "workers": {
17 | "$ref": "#/definitions/actors",
18 | "markdownDescription": "Workers pick up jobs that are ready to run. These jobs are taken from the `solid_queue_ready_executions` table."
19 | }
20 | },
21 | "additionalProperties": false
22 | },
23 | "actors": {
24 | "type": "array",
25 | "uniqueItems": true,
26 | "items": { "$ref": "#/definitions/actor" }
27 | },
28 | "actor": {
29 | "type": "object",
30 | "properties": {
31 | "polling_interval": {
32 | "oneOf": [
33 | { "type": "number", "minimum": 0 },
34 | { "$ref": "#/definitions/erb" }
35 | ],
36 | "markdownDescription": "Time in seconds workers/dispatchers wait before checking for more jobs."
37 | },
38 | "batch_size": {
39 | "oneOf": [
40 | { "type": "integer", "minimum": 1 },
41 | { "$ref": "#/definitions/erb" }
42 | ],
43 | "markdownDescription": "Number of jobs dispatched in a batch."
44 | },
45 | "concurrency_maintenance_interval": {
46 | "oneOf": [
47 | { "type": "number", "minimum": 0 },
48 | { "$ref": "#/definitions/erb" }
49 | ],
50 | "markdownDescription": "Time in seconds the dispatcher waits before checking for blocked jobs that can be unblocked."
51 | },
52 | "queues": {
53 | "oneOf": [
54 | {
55 | "type": "array",
56 | "uniqueItems": true,
57 | "items": { "type": "string" }
58 | },
59 | { "type": "string" }
60 | ],
61 | "markdownDescription": "List of queues workers fetch jobs from. Supports * for all queues or queue name prefixes."
62 | },
63 | "threads": {
64 | "oneOf": [
65 | { "type": "integer", "minimum": 1 },
66 | { "$ref": "#/definitions/erb" }
67 | ],
68 | "markdownDescription": "Maximum size of the thread pool for each worker. Determines how many jobs a worker fetches at once."
69 | },
70 | "processes": {
71 | "oneOf": [
72 | { "type": "integer", "minimum": 1 },
73 | { "$ref": "#/definitions/erb" }
74 | ],
75 | "markdownDescription": "Number of worker processes forked by the supervisor. Each process can dedicate a CPU core."
76 | },
77 | "concurrency_maintenance": {
78 | "oneOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
79 | "markdownDescription": "Whether the dispatcher performs concurrency maintenance work."
80 | }
81 | },
82 | "additionalProperties": false
83 | }
84 | },
85 | "properties": {
86 | "production": { "$ref": "#/definitions/environment" },
87 | "development": { "$ref": "#/definitions/environment" },
88 | "test": { "$ref": "#/definitions/environment" }
89 | },
90 | "additionalProperties": {
91 | "$ref": "#/definitions/environment"
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/dist/rails/database.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/rails/database.json",
4 | "title": "Rails Database Configuration",
5 | "description": "A list of environments and their respective database configurations.",
6 | "type": "object",
7 | "definitions": {
8 | "erb": {
9 | "type": "string",
10 | "pattern": "^<%=.*%>$"
11 | },
12 | "environment": {
13 | "title": "Database environment",
14 | "additionalProperties": { "$ref": "#/definitions/database" }
15 | },
16 | "database": {
17 | "title": "Database",
18 | "description": "Guide: https://guides.rubyonrails.org/configuring.html#configuring-a-database",
19 | "type": "object",
20 | "properties": {
21 | "adapter": {
22 | "type": "string",
23 | "examples": ["postgresql", "mysql2", "sqlite3"]
24 | },
25 | "url": {
26 | "type": "string"
27 | },
28 | "host": {
29 | "type": "string",
30 | "examples": ["localhost", "127.0.0.1"]
31 | },
32 | "port": {
33 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
34 | "examples": [3306, 5432]
35 | },
36 | "migrations_paths": {
37 | "type": "string"
38 | },
39 | "retry_deadline": {
40 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }]
41 | },
42 | "query_cache": {
43 | "description": "Enable or disable query caching.",
44 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }]
45 | },
46 | "database": {
47 | "type": "string"
48 | },
49 | "username": {
50 | "type": "string"
51 | },
52 | "password": {
53 | "type": "string"
54 | },
55 | "pool": {
56 | "markdownDescription": "A connection pool synchronizes thread access to a limited number of database connections. This value sets the maximum number of connections that can be open to the database at the same time.\n\nIn most cases, this should be set to at least the number of threads your server manages.",
57 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }]
58 | },
59 | "timeout": {
60 | "description": "Specifies the timeout in milliseconds for database operations.",
61 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
62 | "default": 1000
63 | },
64 | "socket": {
65 | "type": "string"
66 | },
67 | "advisory_locks": {
68 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }]
69 | },
70 | "statement_limit": {
71 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }]
72 | },
73 | "connection_retries": {
74 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }]
75 | },
76 | "encoding": {
77 | "type": "string",
78 | "examples": ["unicode", "utf8mb4"]
79 | }
80 | },
81 | "required": ["adapter"]
82 | }
83 | },
84 | "properties": {
85 | "default": {
86 | "oneOf": [
87 | { "$ref": "#/definitions/environment" },
88 | { "$ref": "#/definitions/database" }
89 | ]
90 | },
91 | "production": {
92 | "oneOf": [
93 | { "$ref": "#/definitions/environment" },
94 | { "$ref": "#/definitions/database" }
95 | ]
96 | },
97 | "development": {
98 | "oneOf": [
99 | { "$ref": "#/definitions/environment" },
100 | { "$ref": "#/definitions/database" }
101 | ]
102 | },
103 | "test": {
104 | "oneOf": [
105 | { "$ref": "#/definitions/environment" },
106 | { "$ref": "#/definitions/database" }
107 | ]
108 | }
109 | },
110 | "additionalProperties": {
111 | "oneOf": [
112 | { "$ref": "#/definitions/environment" },
113 | { "$ref": "#/definitions/database" }
114 | ]
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/dist/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Ruby Schema - JSON Schemas for Ruby Configs
7 |
8 |
9 |
10 |
11 |
12 |
13 | Ruby Schema
14 |
15 |
16 | JSON Schemas for Ruby YAML, JSON, and TOML Configs
17 |
18 |
19 |
20 |
21 |
22 | Configuration is hard. Whether it's YAML with its
23 | significant whitespace and ambiguous booleans, JSON with its strict
24 | syntax, or TOML with its specific formatting rules, it's easy to make
25 | mistakes. Most configs need to be just so to work properly,
26 | yet they're often unspecified and poorly documented.
27 |
28 |
29 |
30 | Ruby Schema makes configuration easier. We provide
31 | JSON schemas for common Ruby gems, supporting YAML, JSON, and TOML
32 | formats. Get auto-complete, validation, and inline documentation right
33 | in your text editor.
34 |
35 |
36 |
37 | With Ruby Schema, your configuration files become intelligent –
38 | catching errors before you run your code and guiding you with
39 | contextual help as you type, regardless of whether you prefer YAML,
40 | JSON, or TOML.
41 |
42 |
43 |
44 |
45 |
46 |
47 | 🚀 Auto-complete
48 |
49 |
50 | Get intelligent suggestions as you type, speeding up configuration
51 | and reducing typos.
52 |
53 |
54 |
55 |
✅ Validation
56 |
57 | Catch configuration errors instantly, before they cause runtime
58 | failures.
59 |
60 |
61 |
62 |
63 | 📚 Inline Documentation
64 |
65 |
66 | See helpful documentation right in your editor, no need to search
67 | through docs.
68 |
69 |
70 |
71 |
72 |
73 |
Quick Start for Rails
74 |
75 | Install all Ruby schemas in your Rails app with one command:
76 |
77 |
78 | bundle exec rails app:template
80 | LOCATION=https://www.rubyschema.org/rails.rb
82 |
83 |
84 |
85 |
93 |
94 |
95 |
96 | By
97 | Joel Drapper
102 |
103 |
104 |
105 |
106 |
107 |
--------------------------------------------------------------------------------
/dist/pghero.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/pghero.json",
4 | "title": "Pghero Configuration",
5 | "type": "object",
6 | "definitions": {
7 | "erb": {
8 | "type": "string",
9 | "pattern": "^<%=.*%>$"
10 | }
11 | },
12 | "properties": {
13 | "databases": {
14 | "type": "object",
15 | "propertyNames": { "type": "string" },
16 | "additionalProperties": {
17 | "type": "object",
18 | "properties": {
19 | "url": {
20 | "type": "string"
21 | },
22 | "aws_db_instance_identifier": {
23 | "type": "string"
24 | },
25 | "gcp_database_id": {
26 | "type": "string"
27 | },
28 | "azure_resource_id": {
29 | "type": "string"
30 | }
31 | },
32 | "additionalProperties": false,
33 | "required": ["url"]
34 | }
35 | },
36 | "long_running_query_sec": {
37 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
38 | "markdownDescription": "Minimum time for long running queries",
39 | "examples": [60]
40 | },
41 | "slow_query_ms": {
42 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
43 | "markdownDescription": "Minimum average time for slow queries",
44 | "examples": [20]
45 | },
46 | "slow_query_calls": {
47 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
48 | "markdownDescription": "Minimum calls for slow queries",
49 | "examples": [100]
50 | },
51 | "total_connections_threshold": {
52 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
53 | "markdownDescription": "Minimum connections for high connections warning",
54 | "examples": [500]
55 | },
56 | "explain": {
57 | "anyOf": [
58 | { "type": "boolean" },
59 | { "const": "analyze" },
60 | { "$ref": "#/definitions/erb" }
61 | ],
62 | "markdownDescription": "Explain functionality"
63 | },
64 | "explain_timeout_sec": {
65 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
66 | "markdownDescription": "Statement timeout for explain"
67 | },
68 | "visualize_url": {
69 | "type": "string",
70 | "markdownDescription": "Visualize URL for explain"
71 | },
72 | "time_zone": {
73 | "type": "string",
74 | "markdownDescription": "Time zone (defaults to app time zone)",
75 | "examples": ["Pacific Time (US & Canada)"]
76 | },
77 | "username": {
78 | "type": "string"
79 | },
80 | "password": {
81 | "type": "string",
82 | "examples": ["<%= ENV[\"PGHERO_PASSWORD\"] %>"]
83 | },
84 | "stats_database_url": {
85 | "type": "string",
86 | "examples": ["<%= ENV[\"PGHERO_STATS_DATABASE_URL\"] %>"]
87 | },
88 | "aws_access_key_id": {
89 | "type": "string",
90 | "examples": ["<%= ENV[\"AWS_ACCESS_KEY_ID\"] %>"]
91 | },
92 | "aws_secret_access_key": {
93 | "type": "string",
94 | "examples": ["<%= ENV[\"AWS_SECRET_ACCESS_KEY\"] %>"]
95 | },
96 | "aws_region": {
97 | "anyOf": [
98 | {
99 | "enum": [
100 | "af-south-1",
101 | "ap-east-1",
102 | "ap-east-2",
103 | "ap-northeast-1",
104 | "ap-northeast-2",
105 | "ap-northeast-3",
106 | "ap-south-1",
107 | "ap-south-2",
108 | "ap-southeast-1",
109 | "ap-southeast-2",
110 | "ap-southeast-3",
111 | "ap-southeast-4",
112 | "ap-southeast-5",
113 | "ap-southeast-7",
114 | "ca-central-1",
115 | "ca-west-1",
116 | "eu-central-1",
117 | "eu-central-2",
118 | "eu-north-1",
119 | "eu-south-1",
120 | "eu-south-2",
121 | "eu-west-1",
122 | "eu-west-2",
123 | "eu-west-3",
124 | "il-central-1",
125 | "me-central-1",
126 | "me-south-1",
127 | "mx-central-1",
128 | "sa-east-1",
129 | "us-east-1",
130 | "us-east-2",
131 | "us-gov-east-1",
132 | "us-gov-west-1",
133 | "us-west-1",
134 | "us-west-2"
135 | ]
136 | },
137 | { "type": "string" }
138 | ]
139 | },
140 | "filter_data": {
141 | "type": "boolean",
142 | "markdownDescription": "Filter data from queries (experimental)"
143 | }
144 | },
145 | "additionalProperties": false
146 | }
147 |
--------------------------------------------------------------------------------
/dist/vite.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/vite.json",
4 | "definitions": {
5 | "environment": {
6 | "properties": {
7 | "autoBuild": {
8 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#autobuild)",
9 | "type": "boolean"
10 | },
11 | "host": {
12 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#host)",
13 | "type": "string"
14 | },
15 | "port": {
16 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#port)",
17 | "type": "integer"
18 | },
19 | "https": {
20 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#https)",
21 | "type": "boolean"
22 | },
23 | "buildCacheDir": {
24 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#buildcachedir)",
25 | "type": "string"
26 | },
27 | "publicDir": {
28 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#publicdir)",
29 | "type": "string"
30 | },
31 | "publicOutputDir": {
32 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#publicoutputdir)",
33 | "type": "string"
34 | },
35 | "assetsDir": {
36 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#assetsdir)",
37 | "type": "string"
38 | },
39 | "sourceCodeDir": {
40 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#sourcecodedir)",
41 | "type": "string"
42 | },
43 | "entrypointsDir": {
44 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#entrypointsdir)",
45 | "type": "string"
46 | },
47 | "additionalEntrypoints": {
48 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#additionalentrypoints)",
49 | "type": "array",
50 | "uniqueItems": true,
51 | "items": { "type": "string" }
52 | },
53 | "assetHost": {
54 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#assethost)",
55 | "type": "string"
56 | },
57 | "base": {
58 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#base)",
59 | "type": "string"
60 | },
61 | "devServerConnectTimeout": {
62 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#devserverconnecttimeout)",
63 | "type": "number",
64 | "minimum": 0
65 | },
66 | "hideBuildConsoleOutput": {
67 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#hidebuildconsoleoutput)",
68 | "type": "boolean"
69 | },
70 | "packageManager": {
71 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#packagemanager)",
72 | "enum": ["npm", "pnpm", "yarn", "bun"]
73 | },
74 | "root": {
75 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#root)",
76 | "type": "string"
77 | },
78 | "skipCompatibilityCheck": {
79 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#skipcompatibilitycheck)",
80 | "type": "boolean"
81 | },
82 | "skipProxy": {
83 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#skipproxy-experimental)",
84 | "type": "boolean"
85 | },
86 | "viteBinPath": {
87 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#vitebinpath)",
88 | "type": "string"
89 | },
90 | "watchAdditionalPaths": {
91 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#watchadditionalpaths)",
92 | "type": "array",
93 | "uniqueItems": true,
94 | "items": { "type": "string" }
95 | },
96 | "ssrBuildEnabled": {
97 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#ssrbuildenabled)",
98 | "type": "boolean"
99 | },
100 | "ssrEntrypoint": {
101 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#ssrentrypoint)",
102 | "type": "string"
103 | },
104 | "ssrOutputDir": {
105 | "markdownDescription": "[Docs](https://vite-ruby.netlify.app/config/#ssroutputdir)",
106 | "type": "string"
107 | }
108 | },
109 | "additionalProperties": false
110 | }
111 | },
112 | "properties": {
113 | "all": {
114 | "$ref": "#/definitions/environment"
115 | },
116 | "development": {
117 | "$ref": "#/definitions/environment"
118 | },
119 | "test": {
120 | "$ref": "#/definitions/environment"
121 | }
122 | },
123 | "additionalProperties": {
124 | "$ref": "#/definitions/environment"
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/dist/rails.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | updated_files = []
4 | skipped_files = []
5 | failed_files = []
6 |
7 | yaml_schemas = {
8 | "./.circleci/config.yml" => "https://json.schemastore.org/circleciconfig.json",
9 | "./.github/workflows/**/*.yml" => "https://json.schemastore.org/github-workflow.json",
10 | "./.honeybadger.yml" => "https://www.rubyschema.org/honeybadger.json",
11 | "./.rubocop.yml" => "https://www.rubyschema.org/rubocop.json",
12 | "./.standard.yml" => "https://www.rubyschema.org/standard.json",
13 | "./app/**/package.yml" => "https://www.rubyschema.org/packwerk/package.json",
14 | "./config/cable.yml" => "https://www.rubyschema.org/rails/cable.json",
15 | "./config/cache.yml" => "https://www.rubyschema.org/rails/cache.json",
16 | "./config/database.yml" => "https://www.rubyschema.org/rails/database.json",
17 | "./config/deploy.yml" => "https://www.rubyschema.org/kamal/deploy.json",
18 | "./config/honeybadger.yml" => "https://www.rubyschema.org/honeybadger.json",
19 | "./config/i18n-tasks.yml" => "https://www.rubyschema.org/i18n-tasks.json",
20 | "./config/i18n-tasks.yml.erb" => "https://www.rubyschema.org/i18n-tasks.json",
21 | "./config/locales/**/*.yml" => "https://www.rubyschema.org/i18n/locale.json",
22 | "./config/mongoid.yml" => "https://www.rubyschema.org/mongoid.json",
23 | "./config/pghero.yml" => "https://www.rubyschema.org/pghero.json",
24 | "./config/recurring.yml" => "https://www.rubyschema.org/rails/recurring.json",
25 | "./config/rorvswild.yml" => "https://www.rubyschema.org/rorvswild.json",
26 | "./config/scout_apm.yml" => "https://www.rubyschema.org/scout_apm.json",
27 | "./config/sidekiq.yml" => "https://www.rubyschema.org/sidekiq.json",
28 | "./config/storage.yml" => "https://www.rubyschema.org/rails/storage.json",
29 | "./lefthook.yml" => "https://www.rubyschema.org/lefthook.json",
30 | "./shoryuken.yml" => "https://www.rubyschema.org/shoryuken.json",
31 | }.freeze
32 |
33 | json_schemas = {
34 | "./.prettierrc" => "https://www.schemastore.org/prettierrc.json",
35 | "./.stylelintrc" => "https://www.schemastore.org/stylelintrc.json",
36 | "./config/vite.json" => "https://www.rubyschema.org/vite.json",
37 | "./lefthook.json" => "https://www.rubyschema.org/lefthook.json",
38 | "./tsconfig.json" => "https://www.schemastore.org/tsconfig.json",
39 | }.freeze
40 |
41 | toml_schemas = {
42 | "./lefthook.toml" => "https://www.rubyschema.org/lefthook.json",
43 | }.freeze
44 |
45 | yaml_schemas.each do |pattern, schema_url|
46 | schema_comment = "# yaml-language-server: $schema=#{schema_url}"
47 |
48 | Dir.glob(pattern).each do |file_path|
49 | source = File.read(file_path).split("\n")
50 |
51 | source.reject! do |line|
52 | line.start_with? "# yaml-language-server: $schema="
53 | end
54 |
55 | unless source.include?("%YAML 1.1")
56 | if (position = source.index("---"))
57 | source.insert(position, "%YAML 1.1")
58 | else
59 | source.unshift("%YAML 1.1", "---")
60 | end
61 | end
62 |
63 | source.unshift(schema_comment)
64 |
65 | File.write(file_path, source.join("\n") + "\n")
66 | updated_files << file_path
67 | rescue => e
68 | failed_files << { file: file_path, error: e.message }
69 | end
70 | end
71 |
72 | json_schemas.each do |pattern, schema_url|
73 | Dir.glob(pattern).each do |file_path|
74 | source = File.read(file_path)
75 | parsed = JSON.parse(source)
76 |
77 | if parsed.key?("$schema")
78 | if parsed["$schema"] == schema_url
79 | skipped_files << file_path
80 | next
81 | else
82 | updated_content = source.gsub(
83 | /"\$schema":\s*"[^"]*"/,
84 | "\"$schema\": \"#{schema_url}\""
85 | )
86 | end
87 | else
88 | if parsed.empty?
89 | indent = source.match(/^(\s*)\{/)[1]
90 | schema_line = "\n#{indent}\"$schema\": \"#{schema_url}\""
91 | updated_content = source.sub(/(\{\s*\n?\s*)(\})/, "\\1#{schema_line}\n\\2")
92 | else
93 | indent = source.match(/^(\s*)\{/)[1]
94 | schema_line = "\n#{indent}\"$schema\": \"#{schema_url}\","
95 | updated_content = source.sub(/(\{\s*\n)/, "\\1#{schema_line}\n")
96 | end
97 | end
98 |
99 | JSON.parse(updated_content)
100 | File.write(file_path, updated_content)
101 | updated_files << file_path
102 | rescue JSON::ParserError => e
103 | failed_files << { file: file_path, error: "JSON parsing failed: #{e.message}" }
104 | rescue => e
105 | failed_files << { file: file_path, error: e.message }
106 | end
107 | end
108 |
109 | toml_schemas.each do |pattern, schema_url|
110 | schema_comment = "#:schema #{schema_url}"
111 |
112 | Dir.glob(pattern).each do |file_path|
113 | source = File.read(file_path).split("\n")
114 |
115 | source.reject! do |line|
116 | line.start_with? "#:schema "
117 | end
118 |
119 | source.unshift(schema_comment)
120 |
121 | File.write(file_path, source.join("\n") + "\n")
122 | updated_files << file_path
123 | rescue => e
124 | failed_files << { file: file_path, error: e.message }
125 | end
126 | end
127 |
128 | say "\n\e[1mAdding Schemas:\e[0m\n\n"
129 |
130 | skipped_files.sort.each do |file|
131 | say "\e[32m~\e[0m #{file}"
132 | end
133 |
134 | updated_files.sort.each do |file|
135 | say "\e[33m+\e[0m #{file}"
136 | end
137 |
138 | failed_files.each do |item|
139 | say "\e[31m✗\e[0m #{item[:file]}"
140 | say " \e[31m#{item[:error]}\e[0m"
141 | end
142 |
143 | say "\n"
144 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Ruby Schema
2 |
3 | YAML is an incredibly difficult language for me. Between significant whitespace, bare strings and ambiguous booleans, I find it quite impossible to follow. And although the language has improved over time, 15 years since the v1.2 spec was released, Ruby is still stuck on the 1.1 spec.
4 |
5 | Most YAML configs need to be _just so_ in order to work properly yet they are often unspecified, poorly documented and lack proper validation.
6 |
7 | Despite all this, YAML is the primary language for Ruby Gem configs and there's nothing you or I can do about it.
8 |
9 | The good news is, modern text editors support language servers and there's a fantastic language server for YAML files. All we need to do is tell the language server which version of YAML we're using (1.1) and give it a data schema.
10 |
11 | Ruby schema is a collection of JSON schemas for common Ruby gems. With these schemas, we can now enjoy auto-complete, validation and inline documentation right in our YAML files.
12 |
13 | 
14 |
15 | ## Rails
16 |
17 | To install all the Ruby schemas in a Rails, you can run:
18 |
19 | ```
20 | bundle exec rails app:template LOCATION=https://www.rubyschema.org/rails.rb
21 | ```
22 |
23 | You can run it again for updates as new schemas are released.
24 |
25 | ## Editor Setup
26 |
27 | Alternatively, you may configure your editor once to use the available schemas so all your Rails projects can use them.
28 |
29 | ### Nvim
30 |
31 | Update your LSP Config to include the custom YAML schemas for the respective files. For example, using [LazyVim](www.lazyvim.org) update or create your `plugins/lsp-config.lua`.
32 |
33 | ```lua
34 | return {
35 | {
36 | "neovim/nvim-lspconfig",
37 | opts = {
38 | servers = {
39 | yamlls = {
40 | settings = {
41 | yaml = {
42 | schemas = {
43 | ["https://www.rubyschema.org/honeybadger.json"] = "honeybadger.yml",
44 | ["https://www.rubyschema.org/i18n-tasks.json"] = "i18n-tasks.yml",
45 | ["https://www.rubyschema.org/lefthook.json"] = "lefthook.yml",
46 | ["https://www.rubyschema.org/mongoid.json"] = "mongoid.yml",
47 | ["https://www.rubyschema.org/pghero.json"] = "pghero.yml",
48 | ["https://www.rubyschema.org/rorvswild.json"] = "rorvswild.yml",
49 | ["https://www.rubyschema.org/rubocop.json"] = ".rubocop.yml",
50 | ["https://www.rubyschema.org/scout_apm.json"] = "scout_apm.yml",
51 | ["https://www.rubyschema.org/shoryuken.json"] = "shoryuken.yml",
52 | ["https://www.rubyschema.org/sidekiq.json"] = "sidekiq.yml",
53 | ["https://www.rubyschema.org/standard.json"] = ".standard.yml",
54 | ["https://www.rubyschema.org/vite.json"] = "vite.yml",
55 | ["https://www.rubyschema.org/i18n/locale.json"] = "locale/*.yml",
56 | ["https://www.rubyschema.org/kamal/deploy.json"] = "deploy.yml",
57 | ["https://www.rubyschema.org/packwerk/package.json"] = "package.yml",
58 | ["https://www.rubyschema.org/rails/cable.json"] = "cable.yml",
59 | ["https://www.rubyschema.org/rails/cache.json"] = "cache.yml",
60 | ["https://www.rubyschema.org/rails/database.json"] = "database.yml",
61 | ["https://www.rubyschema.org/rails/queue.json"] = "queue.yml",
62 | ["https://www.rubyschema.org/rails/recurring.json"] = "recurring.yml", ["https://www.rubyschema.org/rails/storage.json"] = "storage.yml",
63 | },
64 | },
65 | },
66 | },
67 | },
68 | },
69 | },
70 | }
71 | ```
72 |
73 | ## Manual
74 |
75 | YFor YAML files, add this to the top of your file:
76 |
77 | ```yml
78 | # yaml-language-server: $schema=
79 |
80 | %YAML 1.1
81 | ---
82 | ```
83 |
84 | For JSON files, add this property:
85 |
86 | ```json
87 | {
88 | "$schema": ""
89 | }
90 | ```
91 |
92 | For TOML files, add this comment:
93 |
94 | ```toml
95 | #:schema
96 | ```
97 |
98 | You can find a list of available schemas below or in the [dist directory](./dist)
99 |
100 | ## Available Schemas
101 |
102 | | Name | File | Schema URL |
103 | |------|-----------|------------|
104 | | Rails DB | `database.yml` | `https://www.rubyschema.org/rails/database.json` |
105 | | ActiveStorage | `storage.yml` | `https://www.rubyschema.org/rails/storage.json` |
106 | | SolidQueue | `recurring.yml` | `https://www.rubyschema.org/rails/recurring.json` |
107 | | SolidQueue | `queue.yml` | `https://www.rubyschema.org/rails/queue.json` |
108 | | SolidCache | `cache.yml` | `https://www.rubyschema.org/rails/cache.json` |
109 | | SolidCable | `cable.yml` | `https://www.rubyschema.org/rails/cable.json` |
110 | | Rubocop | `rubocop.yml` | `https://www.rubyschema.org/rubocop.json` |
111 | | Vite | `vite.json` | `https://www.rubyschema.org/vite.json` |
112 | | Kamal | `deploy.yml` | `https://www.rubyschema.org/kamal/deploy.json` |
113 | | I18n | `locales/{language}.yml` | `https://www.rubyschema.org/i18n/locale.json` |
114 | | Sidekiq | `sidekiq.yml` | `https://www.rubyschema.org/sidekiq.json` |
115 | | RoRvsWild | `rorvswild.yml` | `https://www.rubyschema.org/rorvswild.json` |
116 | | Standard | `standard.yml` | `https://www.rubyschema.org/standard.json` |
117 | | Honeybadger | `honeybadger.yml` | `https://www.rubyschema.org/honeybadger.json` |
118 | | Shoryuken | `shoryuken.yml` | `https://www.rubyschema.org/shoryuken.json` |
119 | | Packwerk | `package.yml` | `https://www.rubyschema.org/packwerk/package.json` |
120 | | Lefthook | `lefthook.yml` | `https://www.rubyschema.org/lefthook.json` |
121 | | Lefthook | `lefthook.json` | `https://www.rubyschema.org/lefthook.json` |
122 | | Lefthook | `lefthook.toml` | `https://www.rubyschema.org/lefthook.json` |
123 | | Scout AMP | `scout_apm.yml` | `https://www.rubyschema.org/scout_apm.json` |
124 | | Mongoid | `mongoid.yml` | `https://www.rubyschema.org/mongoid.json` |
125 | | Pghero | `pghero.yml` | `https://www.rubyschema.org/pghero.json` |
126 | | I18n-tasks | `i18n-tasks.yml` | `https://www.rubyschema.org/i18n-tasks.json` |
127 |
128 |
129 | ## Contributing
130 |
131 | If you find an issue with a schema, for example it says that something is invalid when it isn't, please open an issue with an example.
132 |
133 | The schemas are written in JSON Schema version 7 (since that's the version that YAML LSP supports). They are currently committed directly to the `dist` folder, which is deployed automatically to Cloudflare.
134 |
135 | You can test the schemas locally by replacing the `$schema` URL with a relative path. In Zed, you need to run the `editor: restart language server` command each time you make changes to the schema.
136 |
137 | ## Why is it called RubySchema?
138 |
139 | I know it's confusing. RubySchema provides JSON Schemas for YAML files. 🤯 The name reflects the purpose of providing schemas specifically for the Ruby community, where a lot of Ruby gems rely on YAML/JSON configuration files. There's another project called [JSON Schema Store](https://www.schemastore.org) with a significantly wider scope.
140 |
--------------------------------------------------------------------------------
/dist/i18n-tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/i18n-tasks.json",
4 | "title": "I18n-tasks config",
5 | "definitions": {
6 | "erb": {
7 | "type": "string",
8 | "pattern": "^<%=.*%>$"
9 | },
10 | "google": {
11 | "type": "object",
12 | "properties": {
13 | "backend": {
14 | "const": "google"
15 | },
16 | "google_translate_api_key": {
17 | "type": "string"
18 | }
19 | },
20 | "additionalProperties": false,
21 | "required": ["google_translate_api_key"]
22 | },
23 | "deepl": {
24 | "type": "object",
25 | "properties": {
26 | "backend": {
27 | "const": "deepl"
28 | },
29 | "deepl_api_key": {
30 | "type": "string"
31 | },
32 | "deepl_host": {
33 | "type": "string"
34 | },
35 | "deepl_version": {
36 | "type": "string"
37 | },
38 | "deepl_glossary_ids": {
39 | "type": "array",
40 | "uniqueItems": true,
41 | "items": { "type": "string" }
42 | },
43 | "deepl_options": {
44 | "type": "object",
45 | "properties": {
46 | "formality": {
47 | "anyOf": [{ "enum": ["prefer_less"] }, { "type": "string" }]
48 | }
49 | }
50 | },
51 | "deepl_locale_aliases": {
52 | "type": "object",
53 | "propertyNames": { "type": "string" },
54 | "additionalProperties": { "type": "string" }
55 | }
56 | },
57 | "additionalProperties": false,
58 | "required": ["deepl_api_key"]
59 | },
60 | "yandex": {
61 | "type": "object",
62 | "properties": {
63 | "backend": {
64 | "const": "yandex"
65 | },
66 | "yandex_api_key": {
67 | "type": "string"
68 | }
69 | },
70 | "additionalProperties": false,
71 | "required": ["yandex_api_key"]
72 | },
73 | "openai": {
74 | "type": "object",
75 | "properties": {
76 | "backend": {
77 | "const": "openai"
78 | },
79 | "openai_api_key": {
80 | "type": "string"
81 | },
82 | "openai_model": {
83 | "type": "string"
84 | }
85 | },
86 | "additionalProperties": false,
87 | "required": ["openai_api_key"]
88 | },
89 | "watsonx": {
90 | "type": "object",
91 | "properties": {
92 | "backend": {
93 | "const": "watsonx"
94 | },
95 | "watsonx_api_key": {
96 | "type": "string"
97 | },
98 | "watsonx_project_id": {
99 | "type": "string"
100 | },
101 | "watsonx_model": {
102 | "type": "string"
103 | }
104 | },
105 | "additionalProperties": false,
106 | "required": ["watsonx_api_key", "watsonx_project_id"]
107 | }
108 | },
109 | "properties": {
110 | "base_locale": {
111 | "type": "string"
112 | },
113 | "locales": {
114 | "type": "array",
115 | "uniqueItems": true,
116 | "items": {
117 | "type": "string"
118 | }
119 | },
120 | "data": {
121 | "type": "object",
122 | "properties": {
123 | "adapter": {
124 | "type": "string"
125 | },
126 | "read": {
127 | "type": "array",
128 | "markdownDescription": "Locale files or `Dir.glob` patterns where translations are read from:",
129 | "uniqueItems": true,
130 | "items": {
131 | "type": "string"
132 | }
133 | },
134 | "write": {
135 | "type": "array",
136 | "uniqueItems": true,
137 | "items": {
138 | "anyOf": [
139 | { "type": "string" },
140 | {
141 | "type": "array",
142 | "uniqueItems": true,
143 | "items": { "type": "string" },
144 | "minItems": 2,
145 | "maxItems": 2
146 | }
147 | ]
148 | }
149 | },
150 | "external": {
151 | "type": "array",
152 | "uniqueItems": true,
153 | "items": {
154 | "type": "string"
155 | }
156 | },
157 | "yaml": {
158 | "type": "object",
159 | "properties": {
160 | "write": {
161 | "type": "object",
162 | "properties": {
163 | "line_width": {
164 | "anyOf": [
165 | { "type": "integer", "minimum": -1 },
166 | { "$ref": "#/definitions/erb" }
167 | ],
168 | "markdownDescription": "Set to `-1` in order to prevent wrapping lines at 80 characters"
169 | }
170 | },
171 | "additionalProperties": false
172 | }
173 | },
174 | "additionalProperties": false
175 | },
176 | "json": {
177 | "type": "object",
178 | "properties": {
179 | "write": {
180 | "type": "object",
181 | "properties": {
182 | "indent": {
183 | "type": "string",
184 | "default": " "
185 | },
186 | "space": {
187 | "type": "string",
188 | "default": " "
189 | },
190 | "object_nl": {
191 | "type": "string",
192 | "default": "\n"
193 | },
194 | "array_nl": {
195 | "type": "string",
196 | "default": "\n"
197 | }
198 | },
199 | "additionalProperties": false
200 | }
201 | },
202 | "additionalProperties": false
203 | }
204 | },
205 | "additionalProperties": false
206 | },
207 | "search": {
208 | "type": "object",
209 | "properties": {
210 | "paths": {
211 | "type": "array",
212 | "uniqueItems": true,
213 | "items": {
214 | "type": "string"
215 | }
216 | },
217 | "relative_roots": {
218 | "type": "array",
219 | "uniqueItems": true,
220 | "items": {
221 | "type": "string"
222 | }
223 | },
224 | "relative_exclude_method_name_paths": {
225 | "type": "array",
226 | "uniqueItems": true,
227 | "items": {
228 | "type": "string"
229 | }
230 | },
231 | "exclude": {
232 | "type": "array",
233 | "markdownDescription": "Files or `File.fnmatch` patterns to exclude from search. Some files are always excluded regardless of this setting:",
234 | "uniqueItems": true,
235 | "items": {
236 | "type": "string"
237 | }
238 | },
239 | "only": {
240 | "type": "array",
241 | "markdownDescription": "Alternatively, the only files or `File.fnmatch patterns` to search in `paths`. If specified, this settings takes priority over `exclude`, but `exclude` still applies.",
242 | "uniqueItems": true,
243 | "items": {
244 | "type": "string"
245 | }
246 | },
247 | "strict": {
248 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }]
249 | },
250 | "prism": {
251 | "anyOf": [
252 | { "enum": ["rails", "ruby"] },
253 | { "$ref": "#/definitions/erb" }
254 | ]
255 | }
256 | },
257 | "additionalProperties": false
258 | },
259 | "translation": {
260 | "oneOf": [
261 | { "$ref": "#/definitions/google" },
262 | { "$ref": "#/definitions/deepl" },
263 | { "$ref": "#/definitions/yandex" },
264 | { "$ref": "#/definitions/openai" },
265 | { "$ref": "#/definitions/watsonx" }
266 | ]
267 | }
268 | },
269 | "additionalProperties": false
270 | }
271 |
--------------------------------------------------------------------------------
/dist/mongoid.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/mongoid.json",
4 | "title": "Mongoid configuration",
5 | "type": "object",
6 | "definitions": {
7 | "environment": {
8 | "type": "object",
9 | "properties": {
10 | "clients": {
11 | "type": "object",
12 | "additionalProperties": {
13 | "$ref": "#/definitions/client"
14 | }
15 | },
16 | "options": {
17 | "type": "object",
18 | "properties": {
19 | "allow_bson5_decimal128": {
20 | "type": "boolean"
21 | },
22 | "allow_duplicate_index_declarations": {
23 | "type": "boolean"
24 | },
25 | "app_name": {
26 | "type": ["string", "null"]
27 | },
28 | "around_callbacks_for_embeds": {
29 | "type": "boolean"
30 | },
31 | "async_query_executor": {
32 | "enum": ["immediate", "global_thread_pool"]
33 | },
34 | "belongs_to_required_by_default": {
35 | "type": "boolean"
36 | },
37 | "discriminator_key": {
38 | "type": "string"
39 | },
40 | "duplicate_fields_exception": {
41 | "type": "boolean"
42 | },
43 | "global_executor_concurrency": {
44 | "type": ["integer", "null"]
45 | },
46 | "immutable_ids": {
47 | "type": "boolean"
48 | },
49 | "include_root_in_json": {
50 | "type": "boolean"
51 | },
52 | "include_type_for_serialization": {
53 | "type": "boolean"
54 | },
55 | "join_contexts": {
56 | "type": "boolean"
57 | },
58 | "legacy_persistence_context_behavior": {
59 | "type": "boolean"
60 | },
61 | "legacy_readonly": {
62 | "type": "boolean"
63 | },
64 | "log_level": {
65 | "enum": ["debug", "info", "warn", "error", "fatal", "unknown"]
66 | },
67 | "map_big_decimal_to_decimal128": {
68 | "type": "boolean"
69 | },
70 | "preload_models": {
71 | "type": "boolean"
72 | },
73 | "prevent_multiple_calls_of_embedded_callbacks": {
74 | "type": "boolean"
75 | },
76 | "raise_not_found_error": {
77 | "type": "boolean"
78 | },
79 | "scope_overwrite_exception": {
80 | "type": "boolean"
81 | },
82 | "use_utc": {
83 | "type": "boolean"
84 | }
85 | },
86 | "additionalProperties": false
87 | },
88 | "driver_options": {
89 | "type": "object",
90 | "properties": {
91 | "broken_view_aggregate": {
92 | "type": "boolean"
93 | },
94 | "broken_view_options": {
95 | "type": "boolean"
96 | },
97 | "validate_update_replace": {
98 | "type": "boolean"
99 | }
100 | },
101 | "additionalProperties": false
102 | }
103 | }
104 | },
105 | "client": {
106 | "type": "object",
107 | "properties": {
108 | "uri": {
109 | "type": "string",
110 | "markdownDescription": "Supplies your connection URI, including the database name."
111 | },
112 | "database": {
113 | "type": "string",
114 | "markdownDescription": "Defines the name of the default database. (required)"
115 | },
116 | "hosts": {
117 | "type": "array",
118 | "uniqueItems": true,
119 | "minItems": 1,
120 | "items": { "type": "string" }
121 | },
122 | "options": {
123 | "$ref": "#/definitions/clientOptions"
124 | }
125 | },
126 | "anyOf": [
127 | {
128 | "required": ["uri"]
129 | },
130 | {
131 | "required": ["database", "hosts"]
132 | }
133 | ],
134 | "additionalProperties": false
135 | },
136 | "clientOptions": {
137 | "type": "object",
138 | "properties": {
139 | "write": {
140 | "type": "object",
141 | "properties": {
142 | "w": {
143 | "type": "integer"
144 | }
145 | },
146 | "additionalProperties": false
147 | },
148 | "read": {
149 | "type": "object",
150 | "properties": {
151 | "mode": {
152 | "enum": [
153 | "secondary_preferred",
154 | "primary",
155 | "primary_preferred",
156 | "nearest"
157 | ]
158 | },
159 | "tag_sets": {
160 | "type": "array",
161 | "uniqueItems": true,
162 | "items": {
163 | "type": "object",
164 | "properties": {
165 | "use": {
166 | "type": "string"
167 | }
168 | },
169 | "additionalProperties": false
170 | }
171 | }
172 | },
173 | "additionalProperties": false
174 | },
175 | "user": {
176 | "type": "string"
177 | },
178 | "password": {
179 | "type": "string"
180 | },
181 | "roles": {
182 | "type": "array",
183 | "uniqueItems": true,
184 | "items": {
185 | "type": "string"
186 | }
187 | },
188 | "auth_mech": {
189 | "enum": [
190 | "scram",
191 | "scram256",
192 | "mongodb_cr",
193 | "mongodb_x509",
194 | "gssapi",
195 | "aws",
196 | "plain"
197 | ]
198 | },
199 | "auth_source": {
200 | "type": "string"
201 | },
202 | "connect": {
203 | "enum": ["direct", "replica_set", "sharded"]
204 | },
205 | "heartbeat_frequency": {
206 | "type": "number",
207 | "minimum": 0,
208 | "default": 10
209 | },
210 | "local_threshold": {
211 | "type": "number",
212 | "minimum": 0,
213 | "default": 0.015
214 | },
215 | "server_selection_timeout": {
216 | "type": "number",
217 | "minimum": 0,
218 | "default": 30
219 | },
220 | "max_pool_size": {
221 | "type": "integer",
222 | "minimum": 0,
223 | "default": 5
224 | },
225 | "min_pool_size": {
226 | "type": "integer",
227 | "minimum": 0,
228 | "default": 1
229 | },
230 | "wait_queue_timeout": {
231 | "type": "number",
232 | "minimum": 0,
233 | "default": 5
234 | },
235 | "connect_timeout": {
236 | "type": "number",
237 | "minimum": 0,
238 | "default": 10
239 | },
240 | "replica_set": {
241 | "type": "string"
242 | },
243 | "compressors": {
244 | "type": "array",
245 | "uniqueItems": true,
246 | "items": {
247 | "enum": ["zstd", "snappy", "zlib"]
248 | }
249 | },
250 | "ssl": {
251 | "type": "boolean"
252 | },
253 | "ssl_cert": {
254 | "type": "string"
255 | },
256 | "ssl_key": {
257 | "type": "string",
258 | "examples": ["/path/to/my.key"]
259 | },
260 | "ssl_key_pass_phrase": {
261 | "type": "string"
262 | },
263 | "ssl_verify": {
264 | "type": "boolean",
265 | "default": true
266 | },
267 | "ssl_ca_cert": {
268 | "type": "string",
269 | "examples": ["/path/to/ca.cert"]
270 | },
271 | "truncate_logs": {
272 | "type": "boolean",
273 | "default": true
274 | }
275 | },
276 | "additionalProperties": false
277 | }
278 | },
279 | "additionalProperties": {
280 | "$ref": "#/definitions/environment"
281 | }
282 | }
283 |
--------------------------------------------------------------------------------
/dist/rails/storage.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/rails/storage.json",
4 | "title": "Rails Storage Configuration",
5 | "description": "Configuration for ActiveStorage.",
6 | "type": "object",
7 | "definitions": {
8 | "disk_service": {
9 | "description": "Disk Service",
10 | "properties": {
11 | "service": {
12 | "const": "Disk"
13 | },
14 | "root": {
15 | "type": "string",
16 | "default": "<%= Rails.root.join(\"storage\") %>"
17 | }
18 | },
19 | "required": ["service", "root"],
20 | "additionalProperties": false
21 | },
22 | "s3_service": {
23 | "description": "",
24 | "properties": {
25 | "service": {
26 | "const": "S3"
27 | },
28 | "endpoint": {
29 | "type": "string"
30 | },
31 | "access_key_id": {
32 | "type": "string",
33 | "default": "<%= Rails.application.credentials.dig(:aws, :access_key_id) %>"
34 | },
35 | "secret_access_key": {
36 | "type": "string",
37 | "default": "<%= Rails.application.credentials.dig(:aws, :secret_access_key) %>"
38 | },
39 | "region": {
40 | "anyOf": [
41 | { "type": "string" },
42 | {
43 | "enum": [
44 | "af-south-1",
45 | "ap-east-1",
46 | "ap-east-2",
47 | "ap-northeast-1",
48 | "ap-northeast-2",
49 | "ap-northeast-3",
50 | "ap-south-1",
51 | "ap-south-2",
52 | "ap-southeast-1",
53 | "ap-southeast-2",
54 | "ap-southeast-3",
55 | "ap-southeast-4",
56 | "ap-southeast-5",
57 | "ap-southeast-7",
58 | "ca-central-1",
59 | "ca-west-1",
60 | "eu-central-1",
61 | "eu-central-2",
62 | "eu-north-1",
63 | "eu-south-1",
64 | "eu-south-2",
65 | "eu-west-1",
66 | "eu-west-2",
67 | "eu-west-3",
68 | "il-central-1",
69 | "me-central-1",
70 | "me-south-1",
71 | "mx-central-1",
72 | "sa-east-1",
73 | "us-east-1",
74 | "us-east-2",
75 | "us-gov-east-1",
76 | "us-gov-west-1",
77 | "us-west-1",
78 | "us-west-2"
79 | ]
80 | }
81 | ]
82 | },
83 | "bucket": {
84 | "type": "string"
85 | },
86 | "http_open_timeout": {
87 | "type": ["integer", "string"]
88 | },
89 | "http_read_timeout": {
90 | "type": ["integer", "string"]
91 | },
92 | "retry_limit": {
93 | "type": ["integer", "string"]
94 | },
95 | "upload": {
96 | "type": "object",
97 | "properties": {
98 | "server_side_encryption": {
99 | "enum": ["aws:kms", "AES256"]
100 | },
101 | "cache_control": {
102 | "type": "string",
103 | "default": "private, max-age=<%= 1.day.to_i %>"
104 | }
105 | }
106 | }
107 | },
108 | "required": ["service", "access_key_id", "secret_access_key", "bucket"],
109 | "additionalProperties": false
110 | },
111 | "gcs_service": {
112 | "properties": {
113 | "service": {
114 | "const": "GCS"
115 | },
116 | "project": {
117 | "type": "string"
118 | },
119 | "credentials": {
120 | "oneOf": [
121 | {
122 | "description": "Your GCS keyfile path.",
123 | "type": "string",
124 | "default": "<%= Rails.root.join(\"path/to/gcs.keyfile\") %>"
125 | },
126 | {
127 | "type": "object",
128 | "title": "GCS Credentials",
129 | "properties": {
130 | "type": {
131 | "anyOf": [
132 | { "type": "string" },
133 | { "enum": ["service_account"] }
134 | ]
135 | },
136 | "project_id": { "type": "string" },
137 | "private_key_id": {
138 | "type": "string",
139 | "default": "<%= Rails.application.credentials.dig(:gcs, :private_key_id) %>"
140 | },
141 | "private_key": {
142 | "type": "string",
143 | "default": "<%= Rails.application.credentials.dig(:gcs, :private_key).dump %>"
144 | },
145 | "client_email": { "type": "string" },
146 | "client_id": { "type": "string" },
147 | "auth_uri": { "type": "string" },
148 | "token_uri": { "type": "string" },
149 | "auth_provider_x509_cert_url": { "type": "string" },
150 | "client_x509_cert_url": { "type": "string" }
151 | }
152 | }
153 | ]
154 | },
155 | "iam": {
156 | "type": "boolean"
157 | },
158 | "bucket": {
159 | "type": "string"
160 | },
161 | "cache_control": {
162 | "type": "string"
163 | }
164 | },
165 | "anyOf": [
166 | {
167 | "required": ["service", "project", "bucket", "credentials"]
168 | },
169 | {
170 | "required": ["service", "project", "bucket", "iam"]
171 | }
172 | ],
173 | "additionalProperties": false
174 | },
175 | "azure_storage_service": {
176 | "properties": {
177 | "service": {
178 | "const": "AzureStorage"
179 | },
180 | "storage_account_name": {
181 | "type": "string"
182 | },
183 | "storage_access_key": {
184 | "type": "string",
185 | "default": "<%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %>"
186 | }
187 | },
188 | "required": ["service", "storage_account_name", "storage_access_key"],
189 | "additionalProperties": false
190 | },
191 | "mirror_service": {
192 | "properties": {
193 | "service": {
194 | "const": "Mirror"
195 | },
196 | "primary": {
197 | "type": "string"
198 | },
199 | "mirrors": {
200 | "type": "array",
201 | "uniqueItems": true,
202 | "items": {
203 | "type": "string"
204 | }
205 | }
206 | },
207 | "required": ["service", "primary", "mirrors"],
208 | "additionalProperties": false
209 | },
210 | "service": {
211 | "type": "object",
212 | "anyOf": [
213 | { "$ref": "#/definitions/disk_service" },
214 | { "$ref": "#/definitions/s3_service" },
215 | { "$ref": "#/definitions/gcs_service" },
216 | { "$ref": "#/definitions/azure_storage_service" },
217 | { "$ref": "#/definitions/mirror_service" }
218 | ]
219 | }
220 | },
221 | "properties": {
222 | "test": {
223 | "$ref": "#/definitions/service",
224 | "default": {
225 | "service": "Disk",
226 | "root": "<%= Rails.root.join(\"tmp/storage\") %>"
227 | }
228 | },
229 | "local": {
230 | "$ref": "#/definitions/service",
231 | "default": {
232 | "service": "Disk",
233 | "root": "<%= Rails.root.join(\"storage\") %>"
234 | }
235 | },
236 | "amazon": {
237 | "$ref": "#/definitions/service",
238 | "default": {
239 | "service": "S3",
240 | "access_key_id": "<%= Rails.application.credentials.dig(:aws, :access_key_id) %>",
241 | "secret_access_key": "<%= Rails.application.credentials.dig(:aws, :secret_access_key) %>",
242 | "region": "us-east-1",
243 | "bucket": "your_own_bucket-<%= Rails.env %>"
244 | }
245 | },
246 | "google": {
247 | "$ref": "#/definitions/service",
248 | "default": {
249 | "service": "GCS",
250 | "project": "your_project",
251 | "credentials": "<%= Rails.root.join(\"path/to/gcs.keyfile\") %>",
252 | "bucket": "your_own_bucket-<%= Rails.env %>"
253 | }
254 | },
255 | "microsoft": {
256 | "$ref": "#/definitions/service",
257 | "default": {
258 | "service": "AzureStorage",
259 | "storage_account_name": "your_account_name",
260 | "storage_access_key": "<%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %>",
261 | "container": "your_container_name-<%= Rails.env %>"
262 | }
263 | },
264 | "mirror": {
265 | "$ref": "#/definitions/service",
266 | "default": {
267 | "service": "Mirror",
268 | "primary": "local",
269 | "mirrors": ["amazon", "google", "microsoft"]
270 | }
271 | }
272 | },
273 | "additionalProperties": { "$ref": "#/definitions/service" }
274 | }
275 |
--------------------------------------------------------------------------------
/dist/scout_apm.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/scout_apm.json",
4 | "title": "Scout APM configuration",
5 | "type": "object",
6 | "definitions": {
7 | "erb": { "type": "string", "pattern": "^<%=.*%>$" },
8 | "constant": {
9 | "type": "string",
10 | "pattern": "^(?:::)?[A-Z][a-zA-Z0-9_]*(?:::[A-Z][a-zA-Z0-9_]*)*$"
11 | }
12 | },
13 | "properties": {
14 | "name": {
15 | "type": "string",
16 | "markdownDescription": "Name of the application",
17 | "examples": ["Photos App"]
18 | },
19 | "key": {
20 | "type": "string",
21 | "markdownDescription": "The organization API key.",
22 | "examples": ["<%= Rails.application.credentials.dig(:scout, :key) %>"]
23 | },
24 | "monitor": {
25 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
26 | "markdownDescription": "Whether monitoring should be enabled.",
27 | "default": false
28 | },
29 | "auto_instruments": {
30 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
31 | "markdownDescription": "Instrument custom code with Auto Instruments.",
32 | "default": false
33 | },
34 | "log_level": {
35 | "anyOf": [
36 | { "enum": ["DEBUG", "INFO", "WARN", "ERROR", "FATAL", "UNKNOWN"] },
37 | { "$ref": "#/definitions/erb" }
38 | ],
39 | "markdownDescription": "The logging level of the agent.",
40 | "default": "INFO"
41 | },
42 | "detailed_middleware": {
43 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
44 | "markdownDescription": "When true, the time spent in each middleware is visible in transaction traces vs. an aggregrate across all middlewares. This adds additional overhead and is disabled by default as middleware is an uncommon bottleneck.",
45 | "default": false
46 | },
47 | "hostname": {
48 | "type": "string",
49 | "markdownDescription": "Allows renaming of the node/host name"
50 | },
51 | "revision_sha": {
52 | "type": "string",
53 | "markdownDescription": "The Git SHA that corresponds to the version of the app being deployed."
54 | },
55 | "scm_subdirectory": {
56 | "type": "string",
57 | "markdownDescription": "The relative path from the base of your Git repo to the directory which contains your application code."
58 | },
59 | "sample_rate": {
60 | "anyOf": [
61 | { "type": "integer", "minimum": 0, "maximum": 100 },
62 | { "$ref": "#/definitions/erb" }
63 | ],
64 | "markdownDescription": "Gobal sample rate for your application. Rate should be `1` - `100` serving as a percentage of requests to capture (ex: `80` to capture 80% of requests)."
65 | },
66 | "endpoint_sample_rate": {
67 | "anyOf": [
68 | { "type": "integer", "minimum": 0, "maximum": 100 },
69 | { "$ref": "#/definitions/erb" }
70 | ],
71 | "markdownDescription": "Sample rate for all endpoints. `sample_endpoints` will override this rate for matching endpoints. Rate should be `1` - `100` serving as a percentage of requests to capture."
72 | },
73 | "job_sample_rate": {
74 | "anyOf": [
75 | { "type": "integer", "minimum": 0, "maximum": 100 },
76 | { "$ref": "#/definitions/erb" }
77 | ],
78 | "markdownDescription": "Sample rate for all jobs. sample_jobs will override this rate for matching jobs. Rate should be `1` - `100` serving as a percentage of requests to capture."
79 | },
80 | "ignore_endpoints": {
81 | "type": "array",
82 | "markdownDescription": "An Array of web endpoints that Scout should not instrument. Routes that match the prefixed path (ex: `['/health', '/status']`) will be ignored by the agent. Replaces old ignore configuration.",
83 | "uniqueItems": true,
84 | "items": {
85 | "type": "string"
86 | }
87 | },
88 | "ignore_jobs": {
89 | "type": "array",
90 | "markdownDescription": "An Array of job names that Scout should not instrument. Jobs with exact name match will be ignored by the agent.",
91 | "uniqueItems": true,
92 | "items": {
93 | "anyOf": [
94 | {
95 | "type": "string",
96 | "pattern": "^(?:::)?[A-Z][a-zA-Z0-9_]*(?:::[A-Z][a-zA-Z0-9_]*)*Job$"
97 | },
98 | { "$ref": "#/definitions/erb" }
99 | ]
100 | }
101 | },
102 | "sample_endpoints": {
103 | "type": "array",
104 | "markdownDescription": "An Array of web endpoints that Scout should sample at the provided rate (ex: `['/busy_endpoint:50']`). Rate should be `1` - `100` serving as a percentage of requests to capture.",
105 | "uniqueItems": true,
106 | "items": {
107 | "anyOf": [
108 | {
109 | "type": "string",
110 | "pattern": "^.+:(100|[1-9]?[0-9])$"
111 | },
112 | { "$ref": "#/definitions/erb" }
113 | ]
114 | }
115 | },
116 | "sample_jobs": {
117 | "type": "array",
118 | "markdownDescription": "An Array of job names that Scout should sample at the provided rate (ex: `['MyJob:70']`). Rate should be `1` - `100` serving as a percentage of requests to capture.",
119 | "uniqueItems": true,
120 | "items": {
121 | "anyOf": [
122 | {
123 | "type": "string",
124 | "pattern": "^(?:::)?[A-Z][a-zA-Z0-9_]*(?:::[A-Z][a-zA-Z0-9_]*)*Job:(100|[1-9]?[0-9])$"
125 | },
126 | { "$ref": "#/definitions/erb" }
127 | ]
128 | }
129 | },
130 | "max_traces": {
131 | "anyOf": [
132 | { "type": "integer", "minimum": 0 },
133 | { "$ref": "#/definitions/erb" }
134 | ]
135 | },
136 | "enable_background_jobs": {
137 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
138 | "markdownDescription": "Indicates if background jobs should be monitored."
139 | },
140 | "collect_remote_ip": {
141 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
142 | "markdownDescription": "Automatically capture end user IP addresses as part of each trace’s context."
143 | },
144 | "record_queue_time": {
145 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
146 | "markdownDescription": "Automatically capture request queue time when a queuing request header is found."
147 | },
148 | "auto_instruments_ignore": {
149 | "type": "array",
150 | "markdownDescription": "Excludes the listed files names from being auto instrumented.",
151 | "uniqueItems": true,
152 | "items": {
153 | "type": "string"
154 | },
155 | "examples": [["application_controller"]]
156 | },
157 | "errors_ignored_exceptions": {
158 | "type": "array",
159 | "markdownDescription": "Excludes certain exceptions from being reported",
160 | "uniqueItems": true,
161 | "items": {
162 | "$ref": "#/definitions/constant"
163 | },
164 | "examples": [
165 | ["ActiveRecord::RecordNotFound", "ActionController::RoutingError"]
166 | ]
167 | },
168 | "errors_filtered_params": {
169 | "type": "array",
170 | "markdownDescription": "Filtered parameters in exceptions",
171 | "uniqueItems": true,
172 | "items": {
173 | "type": "string"
174 | },
175 | "examples": [["password", "s3-key"]]
176 | },
177 | "log_file_path": {
178 | "anyOf": [{ "type": "string" }, { "enum": ["stdout"] }],
179 | "markdownDescription": "The path to the scout_apm.log log file directory. Use `stdout` to log to `STDOUT`."
180 | },
181 | "proxy": {
182 | "type": "string",
183 | "markdownDescription": "Specify the proxy URL if a proxy is required."
184 | },
185 | "host": {
186 | "type": "string",
187 | "markdownDescription": "The protocol + domain where the agent should report.",
188 | "examples": ["https://scoutapm.com"]
189 | },
190 | "uri_reporting": {
191 | "anyOf": [
192 | { "enum": ["filtered_params", "path"] },
193 | { "$ref": "#/definitions/erb" }
194 | ],
195 | "markdownDescription": "By default Scout reports the URL and filtered query parameters with transaction traces. Sensitive parameters in the URL will be redacted. To exclude query params entirely, use path."
196 | },
197 | "disabled_instruments": {
198 | "type": "array",
199 | "markdownDescription": "An Array of instruments that Scout should not install. Each Array element should should be a string-ified, case-sensitive class name.",
200 | "uniqueItems": true,
201 | "items": {
202 | "anyOf": [
203 | { "$ref": "#/definitions/constant" },
204 | { "$ref": "#/definitions/erb" }
205 | ]
206 | },
207 | "examples": [["Elasticsearch", "HttpClient"]]
208 | },
209 | "timeline_traces": {
210 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
211 | "markdownDescription": "Send traces in both the summary and timeline formats."
212 | },
213 | "use_prepend": {
214 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
215 | "markdownDescription": "Where supported, use Method#prepend for instrumentation."
216 | },
217 | "alias_method_instruments": {
218 | "type": "array",
219 | "markdownDescription": "If `use_prepend` is set to `true`, specify which particular instruments should still use the alias_method approach. Each Array element should should be a string-ified, case-sensitive class name.",
220 | "uniqueItems": true,
221 | "items": {
222 | "anyOf": [
223 | { "$ref": "#/definitions/constant" },
224 | { "$ref": "#/definitions/erb" }
225 | ]
226 | },
227 | "examples": [["Elasticsearch", "HttpClient"]]
228 | },
229 | "prepend_instruments": {
230 | "type": "array",
231 | "markdownDescription": "If use_prepend is set to false, specify which particular instruments should use the prepend approach. Each Array element should should be a string-ified, case-sensitive class name.",
232 | "uniqueItems": true,
233 | "items": {
234 | "anyOf": [
235 | { "$ref": "#/definitions/constant" },
236 | { "$ref": "#/definitions/erb" }
237 | ]
238 | },
239 | "examples": [["Elasticsearch", "HttpClient"]]
240 | }
241 | },
242 | "additionalProperties": false,
243 | "required": ["key"]
244 | }
245 |
--------------------------------------------------------------------------------
/dist/lefthook.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/lefthook.json",
4 | "title": "Lefthook configuration",
5 | "definitions": {
6 | "hook": {
7 | "properties": {
8 | "files": {
9 | "type": "string",
10 | "markdownDescription": "A custom git command for files to be referenced in {files} template.",
11 | "examples": ["git diff --name-only master"]
12 | },
13 | "parallel": {
14 | "type": "boolean",
15 | "markdownDescription": "Run commands and scripts concurrently.",
16 | "default": false
17 | },
18 | "piped": {
19 | "type": "boolean",
20 | "markdownDescription": "Stop running commands and scripts if one of them fail.",
21 | "default": false
22 | },
23 | "follow": {
24 | "type": "boolean",
25 | "markdownDescription": "Follow the STDOUT of the running commands and scripts.",
26 | "default": false
27 | },
28 | "exclude_tags": {
29 | "anyOf": [
30 | { "type": "string" },
31 | {
32 | "type": "array",
33 | "uniqueItems": true,
34 | "items": { "type": "string" }
35 | }
36 | ],
37 | "markdownDescription": "Tags or command names that you want to exclude. This option can be overwritten with `LEFTHOOK_EXCLUDE` env variable."
38 | },
39 | "skip": { "$ref": "#/definitions/skip" },
40 | "only": { "$ref": "#/definitions/only" },
41 | "jobs": {
42 | "type": "array",
43 | "uniqueItems": true,
44 | "items": { "$ref": "#/definitions/job" }
45 | },
46 | "commands": {
47 | "type": "object",
48 | "propertyNames": { "type": "string" },
49 | "additionalProperties": { "$ref": "#/definitions/command" }
50 | },
51 | "scripts": {
52 | "type": "array",
53 | "uniqueItems": true,
54 | "items": { "$ref": "#/definitions/script" }
55 | }
56 | },
57 | "additionalProperties": false
58 | },
59 | "condition": {
60 | "oneOf": [
61 | {
62 | "enum": ["rebase", "merge", "merge-commit"]
63 | },
64 | {
65 | "type": "object",
66 | "properties": {
67 | "ref": {
68 | "type": "string"
69 | }
70 | },
71 | "additionalProperties": false,
72 | "required": ["ref"]
73 | },
74 | {
75 | "type": "object",
76 | "properties": {
77 | "run": {
78 | "type": "string"
79 | }
80 | },
81 | "additionalProperties": false,
82 | "required": ["run"]
83 | }
84 | ]
85 | },
86 | "job": {
87 | "type": "object",
88 | "properties": {
89 | "name": {
90 | "type": "string",
91 | "markdownDescription": "Name of a job. Will be printed in summary. If specified, the jobs can be merged with a jobs of the same name in a local config or extends."
92 | },
93 | "run": {
94 | "type": "string"
95 | },
96 | "script": {
97 | "type": "string"
98 | },
99 | "runner": {
100 | "type": "string"
101 | },
102 | "group": {
103 | "type": "object",
104 | "properties": {
105 | "parallel": {
106 | "type": "boolean"
107 | },
108 | "piped": {
109 | "type": "boolean"
110 | },
111 | "jobs": {
112 | "type": "array",
113 | "uniqueItems": true,
114 | "items": { "$ref": "#/definitions/job" }
115 | }
116 | }
117 | },
118 | "skip": {
119 | "$ref": "#/definitions/skip"
120 | },
121 | "only": {
122 | "$ref": "#/definitions/only"
123 | },
124 | "tags": {
125 | "$ref": "#/definitions/tags"
126 | },
127 | "glob": {
128 | "$ref": "#/definitions/glob"
129 | },
130 | "files": {
131 | "$ref": "#/definitions/files"
132 | },
133 | "file_types": {
134 | "$ref": "#/definitions/file_types"
135 | },
136 | "env": {
137 | "$ref": "#/definitions/env"
138 | },
139 | "root": {
140 | "type": "string"
141 | },
142 | "exclude": {
143 | "$ref": "#/definitions/exclude"
144 | },
145 | "fail_text": {
146 | "type": "string"
147 | },
148 | "stage_fixed": {
149 | "type": "boolean",
150 | "default": false
151 | },
152 | "interactive": {
153 | "type": "boolean",
154 | "default": false
155 | },
156 | "use_stdin": {
157 | "type": "boolean"
158 | }
159 | },
160 | "additionalProperties": false
161 | },
162 | "command": {
163 | "type": "object",
164 | "properties": {
165 | "run": {
166 | "type": "string"
167 | },
168 | "skip": {
169 | "$ref": "#/definitions/skip"
170 | },
171 | "only": {
172 | "$ref": "#/definitions/only"
173 | },
174 | "tags": {
175 | "$ref": "#/definitions/tags"
176 | },
177 | "glob": {
178 | "$ref": "#/definitions/glob"
179 | },
180 | "files": {
181 | "$ref": "#/definitions/files"
182 | },
183 | "file_types": {
184 | "$ref": "#/definitions/file_types"
185 | },
186 | "env": {
187 | "$ref": "#/definitions/env"
188 | },
189 | "root": {
190 | "type": "string"
191 | },
192 | "exclude": {
193 | "$ref": "#/definitions/exclude"
194 | },
195 | "fail_text": {
196 | "type": "string"
197 | },
198 | "stage_fixed": {
199 | "type": "boolean",
200 | "default": false
201 | },
202 | "interactive": {
203 | "type": "boolean",
204 | "default": false
205 | },
206 | "use_stdin": {
207 | "type": "boolean"
208 | },
209 | "priority": {
210 | "type": "integer",
211 | "markdownDescription": "This option makes sense only when parallel: false or piped: true is set.\n\nValue 0 is considered an +Infinity, so commands or scripts with priority: 0 or without this setting will be run at the very end.",
212 | "minimum": 0
213 | }
214 | },
215 | "additionalProperties": false,
216 | "required": ["run"]
217 | },
218 | "script": {
219 | "type": "object",
220 | "properties": {
221 | "runner": {
222 | "type": "string"
223 | },
224 | "skip": {
225 | "$ref": "#/definitions/condition"
226 | },
227 | "only": {
228 | "$ref": "#/definitions/condition"
229 | },
230 | "tags": {
231 | "$ref": "#/definitions/tags"
232 | },
233 | "env": {
234 | "$ref": "#/definitions/env"
235 | },
236 | "fail_text": {
237 | "type": "string"
238 | },
239 | "stage_fixed": {
240 | "type": "boolean",
241 | "default": false
242 | },
243 | "interactive": {
244 | "type": "boolean",
245 | "default": false
246 | },
247 | "use_stdin": {
248 | "type": "boolean"
249 | },
250 | "priority": {
251 | "type": "integer",
252 | "markdownDescription": "This option makes sense only when parallel: false or piped: true is set.\n\nValue 0 is considered an +Infinity, so commands or scripts with priority: 0 or without this setting will be run at the very end.",
253 | "minimum": 0
254 | }
255 | },
256 | "additionalProperties": false
257 | },
258 | "env": {
259 | "type": "object",
260 | "propertyNames": { "type": "string" },
261 | "additionalProperties": { "type": "string" }
262 | },
263 | "tags": {
264 | "type": "array",
265 | "uniqueItems": true,
266 | "items": {
267 | "type": "string"
268 | }
269 | },
270 | "glob": {
271 | "anyOf": [
272 | {
273 | "type": "string"
274 | },
275 | {
276 | "type": "array",
277 | "uniqueItems": true,
278 | "items": {
279 | "type": "string"
280 | }
281 | }
282 | ]
283 | },
284 | "files": {
285 | "type": "string",
286 | "markdownDescription": "A custom git command for files or directories to be referenced in {files} template for run setting.",
287 | "examples": ["git diff --name-only master"]
288 | },
289 | "file_type": {
290 | "enum": [
291 | "text",
292 | "binary",
293 | "executable",
294 | "not executable",
295 | "symlink",
296 | "not symlink"
297 | ]
298 | },
299 | "file_types": {
300 | "oneOf": [
301 | {
302 | "$ref": "#/definitions/file_type"
303 | },
304 | {
305 | "type": "array",
306 | "uniqueItems": true,
307 | "items": {
308 | "$ref": "#/definitions/file_type"
309 | }
310 | }
311 | ]
312 | },
313 | "exclude": {
314 | "type": "array",
315 | "markdownDescription": "A list of globs to be excluded.",
316 | "uniqueItems": true,
317 | "items": {
318 | "type": "string"
319 | }
320 | },
321 | "skip": {
322 | "anyOf": [
323 | { "$ref": "#/definitions/condition" },
324 | {
325 | "type": "array",
326 | "uniqueItems": true,
327 | "items": { "$ref": "#/definitions/condition" }
328 | }
329 | ],
330 | "markdownDescription": "You can skip all or specific commands and scripts using the `skip` option. You can also skip when merging, rebasing, or being on a specific branch. Globs are available for branches."
331 | },
332 | "only": {
333 | "anyOf": [
334 | { "$ref": "#/definitions/condition" },
335 | {
336 | "type": "array",
337 | "uniqueItems": true,
338 | "items": { "$ref": "#/definitions/condition" }
339 | }
340 | ],
341 | "markdownDescription": "You can force a command, script, or the whole hook to execute only in certain conditions. This option acts like the opposite of `skip`. It accepts the same values but skips execution only if the condition is _not_ satisfied."
342 | }
343 | },
344 | "properties": {
345 | "assert_lefthook_installed": {
346 | "type": "boolean",
347 | "markdownDescription": "When set to `true`, fail (with exit status 1) if lefthook executable can't be found in $PATH, under node_modules/, as a Ruby gem, or other supported method. This makes sure git hook won't omit lefthook rules if lefthook ever was installed.",
348 | "default": false
349 | },
350 | "colors": {
351 | "anyOf": [
352 | { "const": "auto" },
353 | { "const": false },
354 | {
355 | "type": "object",
356 | "propertyNames": { "type": "string" },
357 | "additionalProperties": {
358 | "anyOf": [
359 | { "type": "integer" },
360 | {
361 | "type": "string",
362 | "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
363 | }
364 | ]
365 | }
366 | }
367 | ]
368 | },
369 | "extends": {
370 | "type": "array",
371 | "uniqueItems": true,
372 | "items": {
373 | "type": "string"
374 | }
375 | },
376 | "lefthook": {
377 | "type": "string",
378 | "markdownDescription": "Provide a full path to lefthook executable or a command to run lefthook. Bourne shell (`sh`) syntax is supported."
379 | },
380 | "min_version": {
381 | "type": "string",
382 | "pattern": "^\\d+(\\.\\d+){1,2}$"
383 | },
384 | "no_tty": {
385 | "type": "boolean",
386 | "markdownDescription": "Whether hide spinner and other interactive things."
387 | },
388 | "output": {
389 | "enum": [
390 | "meta",
391 | "summary",
392 | "success",
393 | "failure",
394 | "execution",
395 | "execution_out",
396 | "execution_info",
397 | "skips"
398 | ]
399 | },
400 | "rc": {
401 | "type": "string"
402 | },
403 | "remotes": {
404 | "type": "array",
405 | "uniqueItems": true,
406 | "items": {
407 | "properties": {
408 | "git_url": {
409 | "type": "string",
410 | "markdownDescription": "A URL to Git repository. It will be accessed with privileges of the machine lefthook runs on."
411 | },
412 | "ref": {
413 | "type": "string",
414 | "markdownDescription": "An optional branch or tag name."
415 | },
416 | "refetch": {
417 | "type": "boolean",
418 | "markdownDescription": "Force remote config refetching on every run. Lefthook will be refetching the specified remote every time it is called.",
419 | "default": false
420 | },
421 | "refetch_frequency": {
422 | "type": "string",
423 | "markdownDescription": "Specifies how frequently Lefthook should refetch the remote configuration. This can be set to always, never or a time duration like 24h, 30m, etc.",
424 | "anyOf": [
425 | { "enum": ["always", "never"] },
426 | { "pattern": "^\\d+[hm]" }
427 | ]
428 | },
429 | "configs": {
430 | "type": "array",
431 | "markdownDescription": "An optional array of config paths from remote's root.",
432 | "uniqueItems": true,
433 | "items": {
434 | "type": "string"
435 | }
436 | }
437 | }
438 | }
439 | },
440 | "source_dir": {
441 | "type": "string",
442 | "markdownDescription": "Change a directory for script files. Directory for script files contains folders with git hook names which contain script files.\n\n[Docs](https://lefthook.dev/configuration/source_dir.html)",
443 | "default": ".lefthook/"
444 | },
445 | "source_dir_local": {
446 | "type": "string",
447 | "markdownDescription": "Change a directory for _local_ script files (not stored in VCS).",
448 | "default": ".lefthook-local/"
449 | },
450 | "skip_lfs": {
451 | "type": "boolean",
452 | "markdownDescription": "Skip running LFS hooks even if it exists on your system.",
453 | "default": false
454 | },
455 | "templates": {
456 | "type": "array",
457 | "markdownDescription": "Provide custom replacement for templates in run values.",
458 | "uniqueItems": true,
459 | "items": {
460 | "type": "object",
461 | "minItems": 1,
462 | "maxItems": 1,
463 | "propertyNames": { "type": "string" },
464 | "additionalProperties": { "type": "string" }
465 | }
466 | },
467 | "pre-commit": {
468 | "$ref": "#/definitions/hook"
469 | },
470 | "pre-push": {
471 | "$ref": "#/definitions/hook"
472 | }
473 | },
474 | "additionalProperties": {
475 | "$ref": "#/definitions/hook"
476 | }
477 | }
478 |
--------------------------------------------------------------------------------
/dist/kamal/deploy.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/kamal/deploy.json",
4 | "title": "Kamal Deployment Configuration",
5 | "definitions": {
6 | "registry": {
7 | "type": "object",
8 | "properties": {
9 | "server": {
10 | "type": "string"
11 | },
12 | "username": {
13 | "type": "string"
14 | },
15 | "password": {
16 | "anyOf": [
17 | { "type": "string" },
18 | {
19 | "type": "array",
20 | "uniqueItems": true,
21 | "items": { "type": "string" }
22 | }
23 | ]
24 | }
25 | }
26 | },
27 | "env": {
28 | "properties": {
29 | "clear": {
30 | "type": "object",
31 | "additionalProperties": {
32 | "type": ["string", "number", "boolean", "null"]
33 | }
34 | },
35 | "secret": {
36 | "type": "array",
37 | "uniqueItems": true,
38 | "items": { "type": "string" }
39 | },
40 | "tags": {
41 | "type": "object",
42 | "additionalProperties": {
43 | "clear": {
44 | "type": "object",
45 | "additionalProperties": {
46 | "type": ["string", "number", "boolean", "null"]
47 | }
48 | },
49 | "secret": {
50 | "type": "array",
51 | "uniqueItems": true,
52 | "items": { "type": "string" }
53 | }
54 | }
55 | }
56 | }
57 | },
58 | "proxy": {
59 | "type": "object",
60 | "allOf": [
61 | {
62 | "properties": {
63 | "app_port": {
64 | "$ref": "#/definitions/port"
65 | },
66 | "ssl": {
67 | "type": "boolean"
68 | },
69 | "ssl_redirect": {
70 | "type": "boolean"
71 | },
72 | "forward_headers": {
73 | "type": "boolean"
74 | },
75 | "response_timeout": {
76 | "type": "integer"
77 | },
78 | "healthcheck": {
79 | "type": "object",
80 | "properties": {
81 | "interval": {
82 | "type": "integer"
83 | },
84 | "path": {
85 | "type": "string"
86 | },
87 | "timeout": {
88 | "type": "integer"
89 | }
90 | }
91 | },
92 | "buffering": {
93 | "type": "object",
94 | "properties": {
95 | "requests": {
96 | "type": "boolean"
97 | },
98 | "responses": {
99 | "type": "boolean"
100 | },
101 | "max_request_body": {
102 | "type": "integer",
103 | "minimum": 0
104 | },
105 | "max_response_body": {
106 | "type": "integer",
107 | "minimum": 0
108 | },
109 | "memory": {
110 | "type": "integer",
111 | "minimum": 0
112 | }
113 | }
114 | },
115 | "logging": {
116 | "type": "object",
117 | "properties": {
118 | "request_headers": {
119 | "type": "array",
120 | "uniqueItems": true,
121 | "items": {
122 | "type": "string"
123 | }
124 | },
125 | "response_headers": {
126 | "type": "array",
127 | "uniqueItems": true,
128 | "items": {
129 | "type": "string"
130 | }
131 | }
132 | }
133 | }
134 | }
135 | },
136 | {
137 | "oneOf": [
138 | {
139 | "properties": {
140 | "host": {
141 | "type": "string"
142 | }
143 | },
144 | "required": ["host"]
145 | },
146 | {
147 | "properties": {
148 | "hosts": {
149 | "type": "array",
150 | "uniqueItems": true,
151 | "items": {
152 | "type": "string"
153 | }
154 | }
155 | },
156 | "required": ["hosts"]
157 | }
158 | ]
159 | }
160 | ]
161 | },
162 | "port": {
163 | "type": "integer",
164 | "minimum": 1,
165 | "maximum": 65535
166 | },
167 | "hosts": {
168 | "type": "array",
169 | "uniqueItems": true,
170 | "items": {
171 | "anyOf": [
172 | { "type": "string" },
173 | {
174 | "type": "object",
175 | "additionalProperties": {
176 | "anyOf": [
177 | { "type": "string" },
178 | {
179 | "type": "array",
180 | "uniqueItems": true,
181 | "items": { "type": "string" }
182 | }
183 | ]
184 | }
185 | }
186 | ]
187 | }
188 | },
189 | "logging": {
190 | "type": "object",
191 | "properties": {
192 | "driver": {
193 | "type": "string"
194 | },
195 | "options": {
196 | "type": "object",
197 | "additionalProperties": true
198 | }
199 | },
200 | "required": ["driver"]
201 | }
202 | },
203 | "properties": {
204 | "service": {
205 | "type": "string"
206 | },
207 | "image": {
208 | "type": "string"
209 | },
210 | "labels": {
211 | "type": "object",
212 | "additionalProperties": {
213 | "type": "string"
214 | }
215 | },
216 | "volumes": {
217 | "type": "array",
218 | "markdownDescription": "Additional volumes to mount into the container\n\n[Kamal Docs](https://kamal-deploy.org/docs/configuration/overview/#volumes)",
219 | "uniqueItems": true,
220 | "items": {
221 | "type": "string"
222 | }
223 | },
224 | "registry": {
225 | "$ref": "#/definitions/registry"
226 | },
227 | "servers": {
228 | "oneOf": [
229 | { "$ref": "#/definitions/hosts" },
230 | {
231 | "type": "object",
232 | "properties": {
233 | "hosts": {
234 | "$ref": "#/definitions/hosts"
235 | },
236 | "cmd": {
237 | "type": "string"
238 | },
239 | "options": {
240 | "type": "object",
241 | "properties": {
242 | "memory": {
243 | "type": "string"
244 | },
245 | "cpus": {
246 | "type": "integer"
247 | }
248 | }
249 | },
250 | "logging": {
251 | "$ref": "#/definitions/logging"
252 | },
253 | "proxy": {
254 | "type": "boolean"
255 | },
256 | "labels": {
257 | "type": "array",
258 | "uniqueItems": true,
259 | "items": {
260 | "type": "string"
261 | }
262 | },
263 | "env": {
264 | "type": "object"
265 | },
266 | "asset_path": {
267 | "type": "string"
268 | }
269 | }
270 | }
271 | ]
272 | },
273 | "env": {
274 | "$ref": "#/definitions/env"
275 | },
276 | "asset_path": {
277 | "type": "string"
278 | },
279 | "hooks_path": {
280 | "type": "string"
281 | },
282 | "error_pages_path": {
283 | "type": "string"
284 | },
285 | "require_destination": {
286 | "type": "boolean"
287 | },
288 | "primary_role": {
289 | "type": "string"
290 | },
291 | "allow_empty_roles": {
292 | "type": "boolean"
293 | },
294 | "retain_containers": {
295 | "type": "integer",
296 | "minimum": 0
297 | },
298 | "minimum_version": {
299 | "type": "number"
300 | },
301 | "readiness_delay": {
302 | "type": "integer"
303 | },
304 | "deploy_timeout": {
305 | "type": "integer"
306 | },
307 | "drain_timeout": {
308 | "type": "integer"
309 | },
310 | "run_directory": {
311 | "type": "string"
312 | },
313 | "ssh": {
314 | "type": "object",
315 | "properties": {
316 | "user": {
317 | "type": "string"
318 | },
319 | "port": {
320 | "type": "string"
321 | },
322 | "proxy": {
323 | "type": "string"
324 | },
325 | "proxy_command": {
326 | "type": "string"
327 | },
328 | "log_level": {
329 | "enum": ["debug", "fatal"]
330 | },
331 | "keys_only": {
332 | "type": "boolean"
333 | },
334 | "keys": {
335 | "type": "array",
336 | "uniqueItems": true,
337 | "items": { "type": "string" }
338 | },
339 | "key_data": {
340 | "type": "array",
341 | "uniqueItems": true,
342 | "items": { "type": "string" }
343 | },
344 | "config": {
345 | "type": "boolean"
346 | }
347 | }
348 | },
349 | "builder": {
350 | "type": "object",
351 | "properties": {
352 | "arch": {
353 | "anyOf": [
354 | { "enum": ["amd64", "arm64"] },
355 | {
356 | "type": "array",
357 | "uniqueItems": true,
358 | "items": { "enum": ["amd64", "arm64"] }
359 | }
360 | ]
361 | },
362 | "remote": {
363 | "type": "string"
364 | },
365 | "local": {
366 | "type": "boolean"
367 | },
368 | "cache": {
369 | "type": "object",
370 | "properties": {
371 | "type": {
372 | "enum": ["gha", "registry"]
373 | },
374 | "options": {
375 | "type": "string"
376 | },
377 | "image": {
378 | "type": "string"
379 | }
380 | }
381 | },
382 | "context": {
383 | "type": "string"
384 | },
385 | "dockerfile": {
386 | "type": "string"
387 | },
388 | "target": {
389 | "type": "string"
390 | },
391 | "args": {
392 | "type": "object",
393 | "additionalProperties": {
394 | "type": "string"
395 | }
396 | },
397 | "secrets": {
398 | "type": "array",
399 | "uniqueItems": true,
400 | "items": {
401 | "type": "string"
402 | }
403 | },
404 | "ssh": {
405 | "type": "string"
406 | },
407 | "driver": {
408 | "type": "string"
409 | },
410 | "provenance": {
411 | "type": "string"
412 | },
413 | "sbom": {
414 | "type": "boolean"
415 | }
416 | }
417 | },
418 | "accessories": {
419 | "type": "object",
420 | "additionalProperties": {
421 | "type": "object",
422 | "allOf": [
423 | {
424 | "properties": {
425 | "service": {
426 | "type": "string"
427 | },
428 | "image": {
429 | "type": "string"
430 | },
431 | "registry": {
432 | "$ref": "#/definitions/registry"
433 | },
434 | "cmd": {
435 | "type": "string"
436 | },
437 | "port": {
438 | "type": "string"
439 | },
440 | "labels": {
441 | "type": "object",
442 | "additionalProperties": {
443 | "type": "string"
444 | }
445 | },
446 | "options": {
447 | "type": "object",
448 | "additionalProperties": true
449 | },
450 | "env": {
451 | "$ref": "#/definitions/env"
452 | },
453 | "files": {
454 | "type": "array",
455 | "uniqueItems": true,
456 | "items": {
457 | "type": "string"
458 | }
459 | },
460 | "directories": {
461 | "type": "array",
462 | "uniqueItems": true,
463 | "items": {
464 | "type": "string"
465 | }
466 | },
467 | "volumes": {
468 | "type": "array",
469 | "uniqueItems": true,
470 | "items": {
471 | "type": "string"
472 | }
473 | },
474 | "network": {
475 | "type": "string"
476 | },
477 | "proxy": {
478 | "$ref": "#/definitions/proxy"
479 | }
480 | }
481 | },
482 | {
483 | "oneOf": [
484 | {
485 | "properties": {
486 | "host": {
487 | "type": "string"
488 | }
489 | },
490 | "required": ["host"]
491 | },
492 | {
493 | "properties": {
494 | "hosts": {
495 | "type": "array",
496 | "uniqueItems": true,
497 | "items": { "type": "string" }
498 | }
499 | },
500 | "required": ["hosts"]
501 | },
502 | {
503 | "properties": {
504 | "role": {
505 | "type": "string"
506 | }
507 | },
508 | "required": ["role"]
509 | },
510 | {
511 | "properties": {
512 | "roles": {
513 | "type": "array",
514 | "uniqueItems": true,
515 | "items": { "type": "string" }
516 | }
517 | },
518 | "required": ["roles"]
519 | },
520 | {
521 | "properties": {
522 | "tag": {
523 | "type": "string"
524 | }
525 | },
526 | "required": ["tag"]
527 | },
528 | {
529 | "properties": {
530 | "tags": {
531 | "type": "array",
532 | "uniqueItems": true,
533 | "items": { "type": "string" }
534 | }
535 | },
536 | "required": ["tags"]
537 | }
538 | ]
539 | }
540 | ]
541 | }
542 | },
543 | "proxy": {
544 | "$ref": "#/definitions/proxy"
545 | },
546 | "boot": {
547 | "type": "object",
548 | "properties": {
549 | "limit": {
550 | "anyOf": [
551 | { "type": "integer" },
552 | { "type": "string", "pattern": "^\\d+%$" }
553 | ]
554 | },
555 | "wait": {
556 | "type": "integer"
557 | }
558 | }
559 | },
560 | "logging": {
561 | "$ref": "#/definitions/logging"
562 | },
563 | "aliases": {
564 | "type": "object",
565 | "additionalProperties": {
566 | "type": "string"
567 | }
568 | }
569 | },
570 | "additionalProperties": false,
571 | "patternProperties": {
572 | "^x-": {}
573 | },
574 | "required": ["service"]
575 | }
576 |
--------------------------------------------------------------------------------
/.rubocop-https---www-goodcop-style-base-yml:
--------------------------------------------------------------------------------
1 | # yaml-language-server: $schema=https://www.rubyschema.org/rubocop.json
2 | ---
3 | AllCops:
4 | DisabledByDefault: true
5 |
6 | Layout/ArgumentAlignment:
7 | Enabled: true
8 | EnforcedStyle: with_fixed_indentation
9 |
10 | Layout/ArrayAlignment:
11 | Enabled: true
12 | EnforcedStyle: with_fixed_indentation
13 |
14 | Layout/AssignmentIndentation:
15 | Enabled: true
16 |
17 | Layout/BeginEndAlignment:
18 | Enabled: true
19 | EnforcedStyleAlignWith: start_of_line
20 |
21 | Layout/BlockAlignment:
22 | Enabled: true
23 | EnforcedStyleAlignWith: either
24 |
25 | Layout/BlockEndNewline:
26 | Enabled: true
27 |
28 | Layout/ClosingHeredocIndentation:
29 | Enabled: true
30 |
31 | Layout/ClosingParenthesisIndentation:
32 | Enabled: true
33 |
34 | Layout/CommentIndentation:
35 | Enabled: true
36 | AllowForAlignment: true
37 |
38 | Layout/ConditionPosition:
39 | Enabled: true
40 |
41 | Layout/DefEndAlignment:
42 | Enabled: true
43 | EnforcedStyleAlignWith: start_of_line
44 |
45 | Layout/DotPosition:
46 | Enabled: true
47 | EnforcedStyle: leading
48 |
49 | Layout/ElseAlignment:
50 | Enabled: true
51 |
52 | Layout/EmptyComment:
53 | Enabled: true
54 | AllowBorderComment: true
55 | AllowMarginComment: true
56 |
57 | Layout/EmptyLineAfterMagicComment:
58 | Enabled: true
59 |
60 | Layout/EmptyLineAfterMultilineCondition:
61 | Enabled: true
62 |
63 | Layout/EmptyLineBetweenDefs:
64 | Enabled: true
65 | EmptyLineBetweenMethodDefs: true
66 | EmptyLineBetweenClassDefs: true
67 | EmptyLineBetweenModuleDefs: true
68 | AllowAdjacentOneLineDefs: true
69 | NumberOfEmptyLines: 1
70 |
71 | Layout/EmptyLines:
72 | Enabled: true
73 |
74 | Layout/EmptyLinesAroundAccessModifier:
75 | Enabled: true
76 | EnforcedStyle: around
77 |
78 | Layout/EmptyLinesAroundArguments:
79 | Enabled: true
80 |
81 | Layout/EmptyLinesAroundAttributeAccessor:
82 | Enabled: true
83 | AllowAliasSyntax: true
84 | AllowedMethods:
85 | - alias_method
86 | - public
87 | - protected
88 | - private
89 |
90 | Layout/EmptyLinesAroundBeginBody:
91 | Enabled: true
92 |
93 | Layout/EmptyLinesAroundBlockBody:
94 | Enabled: true
95 |
96 | Layout/EmptyLinesAroundClassBody:
97 | Enabled: true
98 | EnforcedStyle: no_empty_lines
99 |
100 | Layout/EmptyLinesAroundExceptionHandlingKeywords:
101 | Enabled: true
102 |
103 | Layout/EmptyLinesAroundMethodBody:
104 | Enabled: true
105 |
106 | Layout/EmptyLinesAroundModuleBody:
107 | Enabled: true
108 | EnforcedStyle: no_empty_lines
109 |
110 | Layout/EndAlignment:
111 | Enabled: true
112 | EnforcedStyleAlignWith: start_of_line
113 |
114 | Layout/EndOfLine:
115 | Enabled: true
116 | EnforcedStyle: native
117 |
118 | Layout/ExtraSpacing:
119 | Enabled: true
120 | AllowForAlignment: true
121 | AllowBeforeTrailingComments: false
122 | ForceEqualSignAlignment: false
123 |
124 | Layout/FirstArrayElementLineBreak:
125 | Enabled: true
126 | AllowMultilineFinalElement: false
127 |
128 | Layout/FirstHashElementLineBreak:
129 | Enabled: true
130 | AllowMultilineFinalElement: false
131 |
132 | Layout/FirstParameterIndentation:
133 | Enabled: true
134 | EnforcedStyle: consistent
135 |
136 | Layout/HashAlignment:
137 | Enabled: true
138 | EnforcedHashRocketStyle: key
139 | EnforcedColonStyle: key
140 | EnforcedLastArgumentHashStyle: always_inspect
141 |
142 | Layout/HeredocArgumentClosingParenthesis:
143 | Enabled: true
144 |
145 | Layout/HeredocIndentation:
146 | Enabled: true
147 |
148 | Layout/IndentationConsistency:
149 | Enabled: true
150 | EnforcedStyle: normal
151 |
152 | Layout/IndentationStyle:
153 | Enabled: true
154 | EnforcedStyle: spaces
155 |
156 | Layout/IndentationWidth:
157 | Enabled: true
158 | Width: 2
159 |
160 | Layout/InitialIndentation:
161 | Enabled: true
162 |
163 | Layout/LeadingCommentSpace:
164 | Enabled: true
165 | AllowRBSInlineAnnotation: true
166 |
167 | Layout/LeadingEmptyLines:
168 | Enabled: true
169 |
170 | Layout/LineContinuationSpacing:
171 | Enabled: true
172 | EnforcedStyle: space
173 |
174 | Layout/LineEndStringConcatenationIndentation:
175 | Enabled: true
176 | EnforcedStyle: indented
177 |
178 | Layout/MultilineArrayBraceLayout:
179 | Enabled: true
180 | EnforcedStyle: new_line
181 |
182 | Layout/MultilineArrayLineBreaks:
183 | Enabled: true
184 | AllowMultilineFinalElement: false
185 |
186 | Layout/MultilineAssignmentLayout:
187 | Enabled: true
188 | EnforcedStyle: same_line
189 |
190 | Layout/MultilineBlockLayout:
191 | Enabled: true
192 |
193 | Layout/MultilineHashBraceLayout:
194 | Enabled: true
195 | EnforcedStyle: new_line
196 |
197 | Layout/MultilineHashKeyLineBreaks:
198 | Enabled: true
199 | AllowMultilineFinalElement: false
200 |
201 | Layout/MultilineMethodCallIndentation:
202 | Enabled: true
203 | EnforcedStyle: indented
204 |
205 | Layout/MultilineMethodDefinitionBraceLayout:
206 | Enabled: true
207 | EnforcedStyle: new_line
208 |
209 | Layout/MultilineOperationIndentation:
210 | Enabled: true
211 | EnforcedStyle: indented
212 |
213 | Layout/ParameterAlignment:
214 | Enabled: true
215 | EnforcedStyle: with_fixed_indentation
216 |
217 | Layout/RescueEnsureAlignment:
218 | Enabled: true
219 |
220 | Layout/SpaceAfterColon:
221 | Enabled: true
222 |
223 | Layout/SpaceAfterComma:
224 | Enabled: true
225 |
226 | Layout/SpaceAfterMethodName:
227 | Enabled: true
228 |
229 | Layout/SpaceAfterNot:
230 | Enabled: true
231 |
232 | Layout/SpaceAfterSemicolon:
233 | Enabled: true
234 |
235 | Layout/SpaceAroundBlockParameters:
236 | Enabled: true
237 | EnforcedStyleInsidePipes: no_space
238 |
239 | Layout/SpaceAroundEqualsInParameterDefault:
240 | Enabled: true
241 | EnforcedStyle: space
242 |
243 | Layout/SpaceAroundKeyword:
244 | Enabled: true
245 |
246 | Layout/SpaceAroundMethodCallOperator:
247 | Enabled: true
248 |
249 | Layout/SpaceAroundOperators:
250 | Enabled: true
251 | AllowForAlignment: false
252 | EnforcedStyleForExponentOperator: space
253 | EnforcedStyleForRationalLiterals: space
254 |
255 | Layout/SpaceBeforeBlockBraces:
256 | Enabled: true
257 | EnforcedStyle: space
258 | EnforcedStyleForEmptyBraces: space
259 |
260 | Layout/SpaceBeforeBrackets:
261 | Enabled: true
262 |
263 | Layout/SpaceBeforeComma:
264 | Enabled: true
265 |
266 | Layout/SpaceBeforeComment:
267 | Enabled: true
268 |
269 | Layout/SpaceBeforeFirstArg:
270 | Enabled: true
271 |
272 | Layout/SpaceBeforeSemicolon:
273 | Enabled: true
274 |
275 | Layout/SpaceInLambdaLiteral:
276 | Enabled: true
277 | EnforcedStyle: require_space
278 |
279 | Layout/SpaceInsideArrayLiteralBrackets:
280 | Enabled: true
281 | EnforcedStyle: no_space
282 |
283 | Layout/SpaceInsideArrayPercentLiteral:
284 | Enabled: true
285 |
286 | Layout/SpaceInsideBlockBraces:
287 | Enabled: true
288 | EnforcedStyle: space
289 | EnforcedStyleForEmptyBraces: no_space
290 | SpaceBeforeBlockParameters: true
291 |
292 | Layout/SpaceInsideHashLiteralBraces:
293 | Enabled: true
294 | EnforcedStyle: space
295 | EnforcedStyleForEmptyBraces: no_space
296 |
297 | Layout/SpaceInsideParens:
298 | Enabled: true
299 | EnforcedStyle: no_space
300 |
301 | Layout/SpaceInsidePercentLiteralDelimiters:
302 | Enabled: true
303 |
304 | Layout/SpaceInsideRangeLiteral:
305 | Enabled: true
306 |
307 | Layout/SpaceInsideReferenceBrackets:
308 | Enabled: true
309 | EnforcedStyle: no_space
310 | EnforcedStyleForEmptyBrackets: no_space
311 |
312 | Layout/SpaceInsideStringInterpolation:
313 | Enabled: true
314 | EnforcedStyle: no_space
315 |
316 | Layout/TrailingEmptyLines:
317 | Enabled: true
318 | EnforcedStyle: final_newline
319 |
320 | Layout/TrailingWhitespace:
321 | Enabled: true
322 | AllowInHeredoc: true
323 |
324 | Lint/AmbiguousAssignment:
325 | Enabled: true
326 |
327 | Lint/AmbiguousOperator:
328 | Enabled: true
329 |
330 | Lint/AmbiguousOperatorPrecedence:
331 | Enabled: true
332 |
333 | Lint/AmbiguousRange:
334 | Enabled: true
335 | RequireParenthesesForMethodChains: true
336 |
337 | Lint/AmbiguousRegexpLiteral:
338 | Enabled: true
339 |
340 | Lint/AssignmentInCondition:
341 | Enabled: true
342 | AllowSafeAssignment: true
343 |
344 | Lint/BigDecimalNew:
345 | Enabled: true
346 |
347 | Lint/CircularArgumentReference:
348 | Enabled: true
349 |
350 | Lint/ConstantDefinitionInBlock:
351 | Enabled: true
352 |
353 | Lint/ConstantOverwrittenInRescue:
354 | Enabled: true
355 |
356 | Lint/Debugger:
357 | Enabled: true
358 |
359 | Lint/DeprecatedClassMethods:
360 | Enabled: true
361 |
362 | Lint/DeprecatedConstants:
363 | Enabled: true
364 |
365 | Lint/DeprecatedOpenSSLConstant:
366 | Enabled: true
367 |
368 | Lint/DisjunctiveAssignmentInConstructor:
369 | Enabled: true
370 |
371 | Lint/DuplicateCaseCondition:
372 | Enabled: true
373 |
374 | Lint/DuplicateHashKey:
375 | Enabled: true
376 |
377 | Lint/DuplicateMagicComment:
378 | Enabled: true
379 |
380 | Lint/DuplicateMatchPattern:
381 | Enabled: true
382 |
383 | Lint/DuplicateMethods:
384 | Enabled: true
385 |
386 | Lint/DuplicateRegexpCharacterClassElement:
387 | Enabled: true
388 |
389 | Lint/DuplicateRequire:
390 | Enabled: true
391 |
392 | Lint/DuplicateRescueException:
393 | Enabled: true
394 |
395 | Lint/EachWithObjectArgument:
396 | Enabled: true
397 |
398 | Lint/ElseLayout:
399 | Enabled: true
400 |
401 | Lint/EmptyBlock:
402 | Enabled: true
403 | AllowComments: true
404 | AllowEmptyLambdas: true
405 |
406 | Lint/EmptyConditionalBody:
407 | Enabled: true
408 | AllowComments: true
409 |
410 | Lint/EmptyEnsure:
411 | Enabled: true
412 |
413 | Lint/EmptyExpression:
414 | Enabled: true
415 |
416 | Lint/EmptyFile:
417 | Enabled: true
418 | AllowComments: true
419 |
420 | Lint/EmptyInPattern:
421 | Enabled: true
422 | AllowComments: true
423 |
424 | Lint/EmptyInterpolation:
425 | Enabled: true
426 |
427 | Lint/EnsureReturn:
428 | Enabled: true
429 |
430 | Lint/ErbNewArguments:
431 | Enabled: true
432 |
433 | Lint/FlipFlop:
434 | Enabled: true
435 |
436 | Lint/FloatComparison:
437 | Enabled: true
438 |
439 | Lint/FloatOutOfRange:
440 | Enabled: true
441 |
442 | Lint/FormatParameterMismatch:
443 | Enabled: true
444 |
445 | Lint/HashCompareByIdentity:
446 | Enabled: true
447 |
448 | Lint/HeredocMethodCallPosition:
449 | Enabled: true
450 |
451 | Lint/IdentityComparison:
452 | Enabled: true
453 |
454 | Lint/ImplicitStringConcatenation:
455 | Enabled: true
456 |
457 | Lint/IncompatibleIoSelectWithFiberScheduler:
458 | Enabled: true
459 |
460 | Lint/IneffectiveAccessModifier:
461 | Enabled: true
462 |
463 | Lint/InheritException:
464 | Enabled: true
465 |
466 | Lint/InterpolationCheck:
467 | Enabled: true
468 |
469 | Lint/ItWithoutArgumentsInBlock:
470 | Enabled: true
471 |
472 | Lint/LambdaWithoutLiteralBlock:
473 | Enabled: true
474 |
475 | Lint/LiteralAssignmentInCondition:
476 | Enabled: true
477 |
478 | Lint/LiteralInInterpolation:
479 | Enabled: true
480 |
481 | Lint/MissingCopEnableDirective:
482 | Enabled: true
483 |
484 | Lint/MultipleComparison:
485 | Enabled: true
486 |
487 | Lint/NestedPercentLiteral:
488 | Enabled: true
489 |
490 | Lint/NextWithoutAccumulator:
491 | Enabled: true
492 |
493 | Lint/NoReturnInBeginEndBlocks:
494 | Enabled: true
495 |
496 | Lint/NonAtomicFileOperation:
497 | Enabled: true
498 |
499 | Lint/NonDeterministicRequireOrder:
500 | Enabled: true
501 |
502 | Lint/NonLocalExitFromIterator:
503 | Enabled: true
504 |
505 | Lint/NumberedParameterAssignment:
506 | Enabled: true
507 |
508 | Lint/OrAssignmentToConstant:
509 | Enabled: true
510 |
511 | Lint/OrderedMagicComments:
512 | Enabled: true
513 |
514 | Lint/OutOfRangeRegexpRef:
515 | Enabled: true
516 |
517 | Lint/ParenthesesAsGroupedExpression:
518 | Enabled: true
519 |
520 | Lint/RaiseException:
521 | Enabled: true
522 |
523 | Lint/RandOne:
524 | Enabled: true
525 |
526 | Lint/RedundantCopDisableDirective:
527 | Enabled: true
528 |
529 | Lint/RedundantCopEnableDirective:
530 | Enabled: true
531 |
532 | Lint/RedundantDirGlobSort:
533 | Enabled: true
534 |
535 | Lint/RedundantRegexpQuantifiers:
536 | Enabled: true
537 |
538 | Lint/RedundantRequireStatement:
539 | Enabled: true
540 |
541 | Lint/RedundantSafeNavigation:
542 | Enabled: true
543 |
544 | Lint/RedundantSplatExpansion:
545 | Enabled: true
546 | AllowPercentLiteralArrayArgument: true
547 |
548 | Lint/RedundantStringCoercion:
549 | Enabled: true
550 |
551 | Lint/RedundantWithIndex:
552 | Enabled: true
553 |
554 | Lint/RedundantWithObject:
555 | Enabled: true
556 |
557 | Lint/RefinementImportMethods:
558 | Enabled: true
559 |
560 | Lint/RegexpAsCondition:
561 | Enabled: true
562 |
563 | Lint/RequireParentheses:
564 | Enabled: true
565 |
566 | Lint/RequireRangeParentheses:
567 | Enabled: true
568 |
569 | Lint/RequireRelativeSelfPath:
570 | Enabled: true
571 |
572 | Lint/RescueType:
573 | Enabled: true
574 |
575 | Lint/ReturnInVoidContext:
576 | Enabled: true
577 |
578 | Lint/SafeNavigationChain:
579 | Enabled: true
580 |
581 | Lint/SafeNavigationConsistency:
582 | Enabled: true
583 |
584 | Lint/SafeNavigationWithEmpty:
585 | Enabled: true
586 |
587 | Lint/ScriptPermission:
588 | Enabled: true
589 |
590 | Lint/SelfAssignment:
591 | Enabled: true
592 |
593 | Lint/SendWithMixinArgument:
594 | Enabled: true
595 |
596 | Lint/ShadowedException:
597 | Enabled: true
598 |
599 | Lint/StructNewOverride:
600 | Enabled: true
601 |
602 | Lint/SuppressedException:
603 | Enabled: true
604 | AllowNil: true
605 | AllowComments: true
606 |
607 | Lint/SymbolConversion:
608 | Enabled: true
609 | EnforcedStyle: strict
610 |
611 | Lint/Syntax:
612 | Enabled: true
613 |
614 | Lint/ToEnumArguments:
615 | Enabled: true
616 |
617 | Lint/ToJSON:
618 | Enabled: true
619 |
620 | Lint/TopLevelReturnWithArgument:
621 | Enabled: true
622 |
623 | Lint/TrailingCommaInAttributeDeclaration:
624 | Enabled: true
625 |
626 | Lint/TripleQuotes:
627 | Enabled: true
628 |
629 | Lint/UnderscorePrefixedVariableName:
630 | Enabled: true
631 |
632 | Lint/UnexpectedBlockArity:
633 | Enabled: true
634 |
635 | Lint/UnifiedInteger:
636 | Enabled: true
637 |
638 | Lint/UnmodifiedReduceAccumulator:
639 | Enabled: true
640 |
641 | Lint/UnreachableCode:
642 | Enabled: true
643 |
644 | Lint/UriEscapeUnescape:
645 | Enabled: true
646 |
647 | Lint/UriRegexp:
648 | Enabled: true
649 |
650 | Lint/UselessAccessModifier:
651 | Enabled: true
652 |
653 | Lint/UselessElseWithoutRescue:
654 | Enabled: true
655 |
656 | Lint/UselessMethodDefinition:
657 | Enabled: true
658 |
659 | Lint/UselessRescue:
660 | Enabled: true
661 |
662 | Lint/UselessRuby2Keywords:
663 | Enabled: true
664 |
665 | Lint/UselessSetterCall:
666 | Enabled: true
667 |
668 | Lint/UselessTimes:
669 | Enabled: true
670 |
671 | Migration/DepartmentName:
672 | Enabled: true
673 |
674 | Security/CompoundHash:
675 | Enabled: true
676 |
677 | Security/IoMethods:
678 | Enabled: true
679 |
680 | Security/JSONLoad:
681 | Enabled: true
682 |
683 | Security/Open:
684 | Enabled: true
685 |
686 | Security/YAMLLoad:
687 | Enabled: true
688 |
689 | Style/ArgumentsForwarding:
690 | Enabled: true
691 |
692 | Style/AccessModifierDeclarations:
693 | Enabled: true
694 | EnforcedStyle: inline
695 |
696 | Style/ComparableClamp:
697 | Enabled: true
698 |
699 | Style/DefWithParentheses:
700 | Enabled: true
701 |
702 | Style/Dir:
703 | Enabled: true
704 |
705 | Style/DirEmpty:
706 | Enabled: true
707 |
708 | Style/EachForSimpleLoop:
709 | Enabled: true
710 |
711 | Style/EachWithObject:
712 | Enabled: true
713 |
714 | Style/EmptyBlockParameter:
715 | Enabled: true
716 |
717 | Style/EmptyElse:
718 | Enabled: true
719 | EnforcedStyle: empty
720 |
721 | Style/EmptyHeredoc:
722 | Enabled: true
723 |
724 | Style/EmptyLambdaParameter:
725 | Enabled: true
726 |
727 | Style/EnvHome:
728 | Enabled: true
729 |
730 | Style/ExactRegexpMatch:
731 | Enabled: true
732 |
733 | Style/ExpandPathArguments:
734 | Enabled: true
735 |
736 | Style/FrozenStringLiteralComment:
737 | Enabled: true
738 | EnforcedStyle: always
739 | SafeAutoCorrect: true
740 |
741 | Style/HashExcept:
742 | Enabled: true
743 |
744 | Style/HashLikeCase:
745 | Enabled: true
746 |
747 | Style/HashSyntax:
748 | Enabled: true
749 | EnforcedStyle: no_mixed_keys
750 | EnforcedShorthandSyntax: always
751 |
752 | Style/HashTransformKeys:
753 | Enabled: true
754 |
755 | Style/HashTransformValues:
756 | Enabled: true
757 |
758 | Style/IfWithSemicolon:
759 | Enabled: true
760 |
761 | Style/InPatternThen:
762 | Enabled: true
763 |
764 | Style/MagicCommentFormat:
765 | Enabled: true
766 |
767 | Style/MapCompactWithConditionalBlock:
768 | Enabled: true
769 |
770 | Style/MapToHash:
771 | Enabled: true
772 |
773 | Style/MapToSet:
774 | Enabled: true
775 |
776 | Style/MethodCallWithoutArgsParentheses:
777 | Enabled: true
778 |
779 | Style/MethodDefParentheses:
780 | Enabled: true
781 | EnforcedStyle: require_parentheses
782 |
783 | Style/ModuleFunction:
784 | Enabled: true
785 | EnforcedStyle: extend_self
786 |
787 | Style/MultilineIfModifier:
788 | Enabled: true
789 |
790 | Style/NegatedUnless:
791 | Enabled: true
792 |
793 | Style/NegatedWhile:
794 | Enabled: true
795 |
796 | Style/NumberedParameters:
797 | Enabled: true
798 | EnforcedStyle: disallow
799 |
800 | Style/NumericLiteralPrefix:
801 | Enabled: true
802 | EnforcedOctalStyle: zero_with_o
803 |
804 | Style/ObjectThen:
805 | Enabled: true
806 | EnforcedStyle: then
807 |
808 | Style/OperatorMethodCall:
809 | Enabled: true
810 |
811 | Style/OrAssignment:
812 | Enabled: true
813 |
814 | Style/PreferredHashMethods:
815 | Enabled: true
816 | EnforcedStyle: short
817 |
818 | Style/Proc:
819 | Enabled: true
820 |
821 | Style/QuotedSymbols:
822 | Enabled: true
823 | EnforcedStyle: same_as_string_literals
824 |
825 | Style/RandomWithOffset:
826 | Enabled: true
827 |
828 | Style/RedundantArrayConstructor:
829 | Enabled: true
830 |
831 | Style/RedundantAssignment:
832 | Enabled: true
833 |
834 | Style/RedundantBegin:
835 | Enabled: true
836 |
837 | Style/RedundantCondition:
838 | Enabled: true
839 |
840 | Style/RedundantConditional:
841 | Enabled: true
842 |
843 | Style/RedundantCurrentDirectoryInPath:
844 | Enabled: true
845 |
846 | Style/RedundantDoubleSplatHashBraces:
847 | Enabled: true
848 |
849 | Style/RedundantEach:
850 | Enabled: true
851 |
852 | Style/RedundantException:
853 | Enabled: true
854 |
855 | Style/RedundantFileExtensionInRequire:
856 | Enabled: true
857 |
858 | Style/RedundantFilterChain:
859 | Enabled: true
860 |
861 | Style/RedundantFreeze:
862 | Enabled: true
863 |
864 | Style/RedundantHeredocDelimiterQuotes:
865 | Enabled: true
866 |
867 | Style/RedundantInitialize:
868 | Enabled: true
869 | AllowComments: true
870 |
871 | Style/RedundantInterpolation:
872 | Enabled: true
873 |
874 | Style/RedundantLineContinuation:
875 | Enabled: true
876 |
877 | Style/RedundantRegexpArgument:
878 | Enabled: true
879 |
880 | Style/RedundantRegexpCharacterClass:
881 | Enabled: true
882 |
883 | Style/RedundantRegexpConstructor:
884 | Enabled: true
885 |
886 | Style/RedundantRegexpEscape:
887 | Enabled: true
888 |
889 | Style/RedundantReturn:
890 | Enabled: true
891 | AllowMultipleReturnValues: true
892 |
893 | Style/RedundantSelf:
894 | Enabled: true
895 |
896 | Style/RedundantSelfAssignmentBranch:
897 | Enabled: true
898 |
899 | Style/RedundantSort:
900 | Enabled: true
901 |
902 | Style/RedundantSortBy:
903 | Enabled: true
904 |
905 | Style/RedundantStringEscape:
906 | Enabled: true
907 |
908 | Style/RegexpLiteral:
909 | Enabled: true
910 | EnforcedStyle: slashes
911 | AllowInnerSlashes: false
912 |
913 | Style/RescueModifier:
914 | Enabled: true
915 |
916 | Style/RescueStandardError:
917 | Enabled: true
918 | EnforcedStyle: implicit
919 |
920 | Style/SafeNavigation:
921 | Enabled: true
922 |
923 | Style/Sample:
924 | Enabled: true
925 |
926 | Style/SelfAssignment:
927 | Enabled: true
928 |
929 | Style/Semicolon:
930 | Enabled: true
931 | AllowAsExpressionSeparator: true
932 |
933 | Style/Send:
934 | Enabled: true
935 |
936 | Style/SendWithLiteralMethodName:
937 | Enabled: true
938 | AllowSend: true
939 |
940 | Style/SignalException:
941 | Enabled: true
942 | EnforcedStyle: only_raise
943 |
944 | Style/SingleArgumentDig:
945 | Enabled: true
946 |
947 | Style/SingleLineDoEndBlock:
948 | Enabled: true
949 |
950 | Style/SoleNestedConditional:
951 | Enabled: true
952 | AllowModifier: false
953 |
954 | Style/StabbyLambdaParentheses:
955 | Enabled: true
956 | EnforcedStyle: require_parentheses
957 |
958 | Style/StderrPuts:
959 | Enabled: true
960 |
961 | Style/StringChars:
962 | Enabled: true
963 |
964 | Style/StringConcatenation:
965 | Enabled: true
966 | Mode: aggressive
967 |
968 | Style/StringLiterals:
969 | Enabled: true
970 | EnforcedStyle: double_quotes
971 |
972 | Style/StringLiteralsInInterpolation:
973 | Enabled: true
974 | EnforcedStyle: single_quotes
975 |
976 | Style/Strip:
977 | Enabled: true
978 |
979 | Style/SuperArguments:
980 | Enabled: true
981 |
982 | Style/SuperWithArgsParentheses:
983 | Enabled: true
984 |
985 | Style/SwapValues:
986 | Enabled: true
987 |
988 | Style/SymbolLiteral:
989 | Enabled: true
990 |
991 | Style/SymbolProc:
992 | Enabled: true
993 | AllowMethodsWithArguments: false
994 | AllowComments: true
995 |
996 | Style/TernaryParentheses:
997 | Enabled: true
998 | EnforcedStyle: require_parentheses_when_complex
999 | AllowSafeAssignment: true
1000 |
1001 | Style/TrailingBodyOnClass:
1002 | Enabled: true
1003 |
1004 | Style/TrailingBodyOnMethodDefinition:
1005 | Enabled: true
1006 |
1007 | Style/TrailingBodyOnModule:
1008 | Enabled: true
1009 |
1010 | Style/TrailingCommaInArrayLiteral:
1011 | Enabled: true
1012 | EnforcedStyleForMultiline: comma
1013 |
1014 | Style/TrailingCommaInBlockArgs:
1015 | Enabled: true
1016 |
1017 | Style/TrailingCommaInHashLiteral:
1018 | Enabled: true
1019 | EnforcedStyleForMultiline: comma
1020 |
1021 | Style/TrailingMethodEndStatement:
1022 | Enabled: true
1023 |
1024 | Style/TrailingUnderscoreVariable:
1025 | Enabled: true
1026 | AllowNamedUnderscoreVariables: true
1027 |
1028 | Style/UnlessElse:
1029 | Enabled: true
1030 |
1031 | Style/UnlessLogicalOperators:
1032 | Enabled: true
1033 | EnforcedStyle: forbid_mixed_logical_operators
1034 |
1035 | Style/UnpackFirst:
1036 | Enabled: true
1037 |
1038 | Style/VariableInterpolation:
1039 | Enabled: true
1040 |
1041 | Style/WhenThen:
1042 | Enabled: true
1043 |
1044 | Style/WhileUntilDo:
1045 | Enabled: true
1046 |
1047 | Style/YAMLFileRead:
1048 | Enabled: true
1049 |
--------------------------------------------------------------------------------
/dist/honeybadger.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/honeybadger.json",
4 | "title": "Honeybadger configuration",
5 | "type": "object",
6 | "definitions": {
7 | "erb": {
8 | "type": "string",
9 | "pattern": "^<%=.*%>$"
10 | },
11 | "constant": {
12 | "type": "string",
13 | "pattern": "^(?:::)?[A-Z][a-zA-Z0-9_]*(?:::[A-Z][a-zA-Z0-9_]*)*$"
14 | },
15 | "environment": {
16 | "properties": {
17 | "api_key": {
18 | "type": "string",
19 | "markdownDescription": "The API key for your Honeybadger project."
20 | },
21 | "env": {
22 | "type": "string",
23 | "markdownDescription": "The environment the app is running in. In Rails this defaults to `Rails.env`."
24 | },
25 | "report_data": {
26 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
27 | "markdownDescription": "Enable/disable reporting of data. Defaults to false for `test`, `development`, and `cucumber` environments."
28 | },
29 | "root": {
30 | "type": "string",
31 | "markdownDescription": "The project's absolute root path."
32 | },
33 | "revision": {
34 | "type": "string",
35 | "markdownDescription": "The project's git revision."
36 | },
37 | "hostname": {
38 | "type": "string",
39 | "markdownDescription": "The hostname of the current box."
40 | },
41 | "backend": {
42 | "type": "string",
43 | "markdownDescription": "An alternate backend to use for reporting data."
44 | },
45 | "debug": {
46 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
47 | "markdownDescription": "Enables verbose debug logging."
48 | },
49 | "send_data_at_exit": {
50 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
51 | "markdownDescription": "Prevent the Ruby program from exiting until all queued notices have been delivered to Honeybadger. (This can take a while in some cases; see `max_queue_size`.)"
52 | },
53 | "max_queue_size": {
54 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
55 | "markdownDescription": "Maximum number of notices to queue for delivery at one time; new notices will be dropped if this number is exceeded."
56 | },
57 | "logging": {
58 | "type": "object",
59 | "properties": {
60 | "path": {
61 | "type": "string"
62 | },
63 | "level": {
64 | "anyOf": [
65 | { "$ref": "#/definitions/erb" },
66 | {
67 | "enum": ["DEBUG", "INFO", "WARN", "ERROR", "FATAL", "UNKNOWN"]
68 | }
69 | ],
70 | "markdownDescription": "The log level. Does nothing unless `logging.path` is also set."
71 | },
72 | "tty_level": {
73 | "anyOf": [
74 | {
75 | "enum": ["DEBUG", "INFO", "WARN", "ERROR", "FATAL", "UNKNOWN"]
76 | },
77 | { "$ref": "#/definitions/erb" }
78 | ],
79 | "markdownDescription": "Level to log when attached to a terminal (anything < `logging.level` will always be ignored)."
80 | }
81 | },
82 | "additionalProperties": false,
83 | "required": ["path"]
84 | },
85 | "connection": {
86 | "type": "object",
87 | "properties": {
88 | "secure": {
89 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
90 | "markdownDescription": "Use SSL when sending data.",
91 | "default": true
92 | },
93 | "host": {
94 | "type": "string",
95 | "markdownDescription": "The host to use when sending data.",
96 | "default": "api.honeybadger.io"
97 | },
98 | "port": {
99 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
100 | "markdownDescription": "The port to use when sending data.",
101 | "default": 443
102 | },
103 | "http_open_timeout": {
104 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
105 | "markdownDescription": "The HTTP open timeout (in seconds) when connecting to the server.",
106 | "default": 2
107 | },
108 | "http_read_timeout": {
109 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
110 | "markdownDescription": "The HTTP read timeout (in seconds) when connecting to the server.",
111 | "default": 5
112 | },
113 | "proxy_host": {
114 | "type": "string",
115 | "markdownDescription": "The proxy host to use when sending data."
116 | },
117 | "proxy_port": {
118 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
119 | "markdownDescription": "The proxy port to use when sending data."
120 | },
121 | "proxy_user": {
122 | "type": "string",
123 | "markdownDescription": "The proxy user to use when sending data."
124 | },
125 | "proxy_pass": {
126 | "type": "string",
127 | "markdownDescription": "The proxy password to use when sending data."
128 | }
129 | }
130 | },
131 | "request": {
132 | "type": "object",
133 | "properties": {
134 | "filter_keys": {
135 | "markdownDescription": " A list of keys to filter when sending request data. In Rails, this also includes existing params filters.",
136 | "type": "array",
137 | "uniqueItems": true,
138 | "items": {
139 | "type": "string"
140 | },
141 | "default": ["password", "password_confirmation"]
142 | },
143 | "disable_session": {
144 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
145 | "markdownDescription": "Prevent session from being sent with request data.",
146 | "default": false
147 | },
148 | "disable_params": {
149 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
150 | "markdownDescription": "Prevent params from being sent with request data.",
151 | "default": false
152 | },
153 | "disable_environment": {
154 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
155 | "markdownDescription": "Prevent Rack environment from being sent with request data.",
156 | "default": false
157 | },
158 | "disable_url": {
159 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
160 | "markdownDescription": "Prevent url from being sent with request data (Rack environment may still contain it in some cases).",
161 | "default": false
162 | }
163 | }
164 | },
165 | "user_informer": {
166 | "type": "object",
167 | "properties": {
168 | "enabled": {
169 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
170 | "markdownDescription": "Enable the UserInformer middleware. The user informer displays information about a Honeybadger error to your end-users when you display a 500 error page. This typically includes the error id which can be used to reference the error inside your Honeybadger account. [Learn more](https://docs.honeybadger.io/lib/ruby/getting-started/collecting-user-feedback/)",
171 | "default": true
172 | },
173 | "info": {
174 | "type": "string",
175 | "markdownDescription": "Replacement string for HTML comment in templates."
176 | }
177 | }
178 | },
179 | "feedback": {
180 | "type": "object",
181 | "properties": {
182 | "enabled": {
183 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
184 | "markdownDescription": "Enable the UserFeedback middleware. Feedback displays a comment form to your-end user when they encounter an error. When the user creates a comment, it is added to the error in Honeybadger, and a notification is sent. [Learn More](https://docs.honeybadger.io/lib/ruby/getting-started/collecting-user-feedback/)",
185 | "default": true
186 | }
187 | }
188 | },
189 | "exceptions": {
190 | "type": "object",
191 | "properties": {
192 | "enabled": {
193 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
194 | "markdownDescription": "Enable error reporting functionality.",
195 | "default": true
196 | },
197 | "ignore": {
198 | "markdownDescription": "A list of exception class names to ignore (appends to defaults).",
199 | "type": "array",
200 | "uniqueItems": true,
201 | "items": {
202 | "anyOf": [
203 | { "$ref": "#/definitions/constant" },
204 | { "$ref": "#/definitions/erb" }
205 | ]
206 | }
207 | },
208 | "ignore_only": {
209 | "markdownDescription": "A list of exception class names to ignore (overrides defaults).",
210 | "type": "array",
211 | "uniqueItems": true,
212 | "items": {
213 | "anyOf": [
214 | { "$ref": "#/definitions/constant" },
215 | { "$ref": "#/definitions/erb" }
216 | ]
217 | }
218 | },
219 | "ignored_user_agents": {
220 | "markdownDescription": "A list of user agents to ignore.",
221 | "type": "array",
222 | "uniqueItems": true,
223 | "items": {
224 | "type": "string"
225 | }
226 | },
227 | "rescue_rake": {
228 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
229 | "markdownDescription": "Enable rescuing exceptions in rake tasks. Default: `true` when run in background; `false` when run in terminal."
230 | },
231 | "notify_at_exit": {
232 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
233 | "markdownDescription": "Report unhandled exception when Ruby crashes (at_exit).",
234 | "default": true
235 | },
236 | "source_radius": {
237 | "anyOf": [{ "type": "integer" }, { "$ref": "#/definitions/erb" }],
238 | "markdownDescription": "The number of lines before and after the source when reporting snippets.",
239 | "default": 2
240 | },
241 | "local_variables": {
242 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
243 | "markdownDescription": "Enable sending local variables. Requires the [binding_of_caller](https://rubygems.org/gems/binding_of_caller) gem.",
244 | "default": false
245 | },
246 | "unwrap": {
247 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
248 | "markdownDescription": "Reports #original_exception or #cause one level up from rescued exception when available.",
249 | "default": false
250 | }
251 | }
252 | },
253 | "breadcrumbs": {
254 | "type": "object",
255 | "properties": {
256 | "enabled": {
257 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
258 | "markdownDescription": "Enable breadcrumb functionality.",
259 | "default": true
260 | },
261 | "active_support_notifications": {
262 | "markdownDescription": "Configuration for automatic Active Support Instrumentation events.",
263 | "type": "object"
264 | },
265 | "logging": {
266 | "type": "object",
267 | "properties": {
268 | "enabled": {
269 | "anyOf": [
270 | { "type": "boolean" },
271 | { "$ref": "#/definitions/erb" }
272 | ],
273 | "markdownDescription": "Enable/Disable automatic breadcrumbs from log messages.",
274 | "default": true
275 | }
276 | }
277 | }
278 | }
279 | },
280 | "active_job": {
281 | "type": "object",
282 | "properties": {
283 | "attempt_threshold": {
284 | "anyOf": [
285 | { "type": "integer", "minimum": 0 },
286 | { "$ref": "#/definitions/erb" }
287 | ],
288 | "markdownDescription": "The number of attempts before notifications will be sent."
289 | },
290 | "insights": {
291 | "type": "object",
292 | "properties": {
293 | "enabled": {
294 | "anyOf": [
295 | { "type": "boolean" },
296 | { "$ref": "#/definitions/erb" }
297 | ],
298 | "markdownDescription": "Enable automatic Insights instrumentation for this plugin.",
299 | "default": true
300 | }
301 | }
302 | }
303 | }
304 | },
305 | "sidekiq": {
306 | "type": "object",
307 | "properties": {
308 | "attempt_threshold": {
309 | "anyOf": [
310 | { "type": "integer", "minimum": 0 },
311 | { "$ref": "#/definitions/erb" }
312 | ],
313 | "markdownDescription": "The number of attempts before notifications will be sent.",
314 | "type": "integer"
315 | },
316 | "use_component": {
317 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
318 | "markdownDescription": "Automatically set the component to the class of the job. Helps with grouping.",
319 | "default": true
320 | },
321 | "insights": {
322 | "type": "object",
323 | "properties": {
324 | "enabled": {
325 | "anyOf": [
326 | { "type": "boolean" },
327 | { "$ref": "#/definitions/erb" }
328 | ],
329 | "markdownDescription": "Enable automatic Insights instrumentation for Sidekiq.",
330 | "default": true
331 | },
332 | "collection_interval": {
333 | "anyOf": [
334 | { "type": "integer", "minimum": 0 },
335 | { "$ref": "#/definitions/erb" }
336 | ],
337 | "markdownDescription": "The frequency, in seconds, in which Sidekiq metrics are sampled.",
338 | "default": 60
339 | },
340 | "cluster_collection": {
341 | "anyOf": [
342 | { "type": "boolean" },
343 | { "$ref": "#/definitions/erb" }
344 | ],
345 | "markdownDescription": "Enable cluster wide metric collection. If you are using Sidekiq Enterprise, this is configured automatically."
346 | },
347 | "events": {
348 | "anyOf": [
349 | { "type": "boolean" },
350 | { "$ref": "#/definitions/erb" }
351 | ],
352 | "markdownDescription": "Enable sending Sidekiq events to Insights."
353 | },
354 | "metrics": {
355 | "anyOf": [
356 | { "type": "boolean" },
357 | { "$ref": "#/definitions/erb" }
358 | ],
359 | "markdownDescription": "Enable sending Sidekiq metrics to Insights."
360 | }
361 | }
362 | }
363 | }
364 | },
365 | "solid_queue": {
366 | "type": "object",
367 | "properties": {
368 | "insights": {
369 | "type": "object",
370 | "properties": {
371 | "enabled": {
372 | "anyOf": [
373 | { "type": "boolean" },
374 | { "$ref": "#/definitions/erb" }
375 | ],
376 | "markdownDescription": "Enable automatic Insights instrumentation for SolidQueue.",
377 | "default": true
378 | },
379 | "collection_interval": {
380 | "anyOf": [
381 | { "type": "integer" },
382 | { "$ref": "#/definitions/erb" }
383 | ],
384 | "markdownDescription": "The frequency, in seconds, in which SolidQueue metrics are sampled.",
385 | "default": 60
386 | },
387 | "cluster_collection": {
388 | "anyOf": [
389 | { "type": "boolean" },
390 | { "$ref": "#/definitions/erb" }
391 | ],
392 | "markdownDescription": "Enable cluster wide metric collection.",
393 | "default": true
394 | }
395 | }
396 | }
397 | }
398 | },
399 | "delayed_job": {
400 | "type": "object",
401 | "properties": {
402 | "attempt_threshold": {
403 | "anyOf": [
404 | { "type": "integer", "minimum": 0 },
405 | { "$ref": "#/definitions/erb" }
406 | ],
407 | "markdownDescription": "The number of attempts before notifications will be sent.",
408 | "default": 0
409 | }
410 | }
411 | },
412 | "shoryuken": {
413 | "type": "object",
414 | "properties": {
415 | "attempt_threshold": {
416 | "anyOf": [
417 | { "type": "integer", "minimum": 0 },
418 | { "$ref": "#/definitions/erb" }
419 | ],
420 | "markdownDescription": "The number of attempts before notifications will be sent.",
421 | "default": 0
422 | }
423 | }
424 | },
425 | "sinatra": {
426 | "type": "object",
427 | "properties": {
428 | "enabled": {
429 | "anyOf": [{ "type": "boolean" }, { "$ref": "#/definitions/erb" }],
430 | "markdownDescription": "Enable Sinatra auto-initialization.",
431 | "default": true
432 | }
433 | }
434 | },
435 | "rails": {
436 | "type": "object",
437 | "properties": {
438 | "subscriber_ignore_sources": {
439 | "markdownDescription": "sources (strings or regexes) that should be ignored when using the Rails error reporter.",
440 | "type": "array",
441 | "uniqueItems": true,
442 | "items": {
443 | "type": "string"
444 | }
445 | },
446 | "insights": {
447 | "type": "object",
448 | "properties": {
449 | "enabled": {
450 | "anyOf": [
451 | { "type": "boolean" },
452 | { "$ref": "#/definitions/erb" }
453 | ],
454 | "markdownDescription": "Enable automatic Insights instrumentation for Rails.",
455 | "default": true
456 | },
457 | "events": {
458 | "anyOf": [
459 | { "type": "boolean" },
460 | { "$ref": "#/definitions/erb" }
461 | ],
462 | "markdownDescription": "Enable sending Rails events to Insights.",
463 | "default": true
464 | },
465 | "metrics": {
466 | "anyOf": [
467 | { "type": "boolean" },
468 | { "$ref": "#/definitions/erb" }
469 | ],
470 | "markdownDescription": "Enable sending Rails metrics to Insights.",
471 | "default": false
472 | }
473 | }
474 | }
475 | }
476 | },
477 | "autotuner": {
478 | "type": "object",
479 | "properties": {
480 | "insignts": {
481 | "type": "object",
482 | "properties": {
483 | "enabled": {
484 | "anyOf": [
485 | { "type": "boolean" },
486 | { "$ref": "#/definitions/erb" }
487 | ],
488 | "markdownDescription": "Enable automatic Insights data collection for Autotuner.",
489 | "default": true
490 | }
491 | }
492 | }
493 | }
494 | },
495 | "karafka": {
496 | "type": "object",
497 | "properties": {
498 | "insights": {
499 | "type": "object",
500 | "properties": {
501 | "enabled": {
502 | "anyOf": [
503 | { "type": "boolean" },
504 | { "$ref": "#/definitions/erb" }
505 | ],
506 | "markdownDescription": "Enable automatic Insights instrumentation for Karafka.",
507 | "default": true
508 | },
509 | "events": {
510 | "anyOf": [
511 | { "type": "boolean" },
512 | { "$ref": "#/definitions/erb" }
513 | ],
514 | "markdownDescription": "Enable sending Karafka events to Insights.",
515 | "default": true
516 | },
517 | "metrics": {
518 | "anyOf": [
519 | { "type": "boolean" },
520 | { "$ref": "#/definitions/erb" }
521 | ],
522 | "markdownDescription": "Enable sending Karafka metrics to Insights.",
523 | "default": false
524 | }
525 | }
526 | }
527 | }
528 | },
529 | "net_http": {
530 | "type": "object",
531 | "properties": {
532 | "insights": {
533 | "type": "object",
534 | "properties": {
535 | "enabled": {
536 | "anyOf": [
537 | { "type": "boolean" },
538 | { "$ref": "#/definitions/erb" }
539 | ],
540 | "markdownDescription": "Enable automatic Insights instrumentation for `Net::HTTP`.",
541 | "default": true
542 | },
543 | "full_url": {
544 | "anyOf": [
545 | { "type": "boolean" },
546 | { "$ref": "#/definitions/erb" }
547 | ],
548 | "markdownDescription": "Log the request URL instead of just the domain.",
549 | "default": false
550 | },
551 | "events": {
552 | "anyOf": [
553 | { "type": "boolean" },
554 | { "$ref": "#/definitions/erb" }
555 | ],
556 | "markdownDescription": "Enable sending `Net::HTTP` events to Insights.",
557 | "default": true
558 | },
559 | "metrics": {
560 | "anyOf": [
561 | { "type": "boolean" },
562 | { "$ref": "#/definitions/erb" }
563 | ],
564 | "markdownDescription": "Enable sending `Net::HTTP` metrics to Insights.",
565 | "default": false
566 | }
567 | }
568 | }
569 | }
570 | }
571 | }
572 | }
573 | },
574 | "properties": {
575 | "production": { "$ref": "#/definitions/environment" },
576 | "development": { "$ref": "#/definitions/environment" }
577 | },
578 | "$ref": "#/definitions/environment",
579 | "additionalProperties": {
580 | "$ref": "#/definitions/environment",
581 | "additionalProperties": false
582 | }
583 | }
584 |
--------------------------------------------------------------------------------
/dist/standard.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "$id": "https://www.rubyschema.org/standard.json",
4 | "title": "Standard configuration",
5 | "type": "object",
6 | "definitions": {
7 | "standardRailsPlugin": {
8 | "type": "object",
9 | "properties": {
10 | "standard-rails": {
11 | "properties": {
12 | "target_rails_version": {
13 | "type": "number"
14 | }
15 | }
16 | }
17 | },
18 | "additionalProperties": false
19 | },
20 | "otherPlugin": {
21 | "type": "object",
22 | "maxProperties": 1,
23 | "minProperties": 1,
24 | "additionalProperties": true,
25 | "propertyNames": { "type": "string" }
26 | }
27 | },
28 | "properties": {
29 | "fix": {
30 | "type": "boolean",
31 | "default": false
32 | },
33 | "parallel": {
34 | "type": "boolean",
35 | "default": false
36 | },
37 | "format": {
38 | "markdownDescription": "Rubocop formatter.\n\n[Rubocop Docs](https://docs.rubocop.org/rubocop/formatters.html)",
39 | "enum": [
40 | "simple",
41 | "progress",
42 | "autogenconf",
43 | "clang",
44 | "fuubar",
45 | "pacman",
46 | "emacs",
47 | "quiet",
48 | "files",
49 | "json",
50 | "junit",
51 | "offenses",
52 | "worst",
53 | "html",
54 | "markdown",
55 | "tap",
56 | "github"
57 | ]
58 | },
59 | "ruby_version": {
60 | "type": "number"
61 | },
62 | "default_ignores": {
63 | "type": "boolean",
64 | "default": true
65 | },
66 | "plugins": {
67 | "type": "array",
68 | "uniqueItems": true,
69 | "items": {
70 | "anyOf": [
71 | { "type": "string" },
72 | { "$ref": "#/definitions/standardRailsPlugin" },
73 | { "$ref": "#/definitions/otherPlugin" }
74 | ]
75 | }
76 | },
77 | "extend_config": {
78 | "type": "string"
79 | },
80 | "ignore": {
81 | "type": "array",
82 | "uniqueItems": true,
83 | "items": {
84 | "oneOf": [
85 | { "type": "string" },
86 | {
87 | "type": "object",
88 | "minProperties": 1,
89 | "maxProperties": 1,
90 | "additionalProperties": {
91 | "type": "array",
92 | "uniqueItems": true,
93 | "items": {
94 | "enum": [
95 | "Bundler/DuplicatedGem",
96 | "Bundler/DuplicatedGroup",
97 | "Bundler/GemComment",
98 | "Bundler/GemFilename",
99 | "Bundler/GemVersion",
100 | "Bundler/InsecureProtocolSource",
101 | "Bundler/OrderedGems",
102 | "Gemspec/AddRuntimeDependency",
103 | "Gemspec/AttributeAssignment",
104 | "Gemspec/DependencyVersion",
105 | "Gemspec/DeprecatedAttributeAssignment",
106 | "Gemspec/DevelopmentDependencies",
107 | "Gemspec/DuplicatedAssignment",
108 | "Gemspec/OrderedDependencies",
109 | "Gemspec/RequiredRubyVersion",
110 | "Gemspec/RequireMFA",
111 | "Gemspec/RubyVersionGlobalsUsage",
112 | "Layout/AccessModifierIndentation",
113 | "Layout/ArgumentAlignment",
114 | "Layout/ArrayAlignment",
115 | "Layout/AssignmentIndentation",
116 | "Layout/BeginEndAlignment",
117 | "Layout/BlockAlignment",
118 | "Layout/BlockEndNewline",
119 | "Layout/CaseIndentation",
120 | "Layout/ClassStructure",
121 | "Layout/ClosingHeredocIndentation",
122 | "Layout/ClosingParenthesisIndentation",
123 | "Layout/CommentIndentation",
124 | "Layout/ConditionPosition",
125 | "Layout/DefEndAlignment",
126 | "Layout/DotPosition",
127 | "Layout/ElseAlignment",
128 | "Layout/EmptyComment",
129 | "Layout/EmptyLineAfterGuardClause",
130 | "Layout/EmptyLineAfterMagicComment",
131 | "Layout/EmptyLineAfterMultilineCondition",
132 | "Layout/EmptyLineBetweenDefs",
133 | "Layout/EmptyLines",
134 | "Layout/EmptyLinesAroundAccessModifier",
135 | "Layout/EmptyLinesAroundArguments",
136 | "Layout/EmptyLinesAroundAttributeAccessor",
137 | "Layout/EmptyLinesAroundBeginBody",
138 | "Layout/EmptyLinesAroundBlockBody",
139 | "Layout/EmptyLinesAroundClassBody",
140 | "Layout/EmptyLinesAroundExceptionHandlingKeywords",
141 | "Layout/EmptyLinesAroundMethodBody",
142 | "Layout/EmptyLinesAroundModuleBody",
143 | "Layout/EndAlignment",
144 | "Layout/EndOfLine",
145 | "Layout/ExtraSpacing",
146 | "Layout/FirstArgumentIndentation",
147 | "Layout/FirstArrayElementIndentation",
148 | "Layout/FirstArrayElementLineBreak",
149 | "Layout/FirstHashElementIndentation",
150 | "Layout/FirstHashElementLineBreak",
151 | "Layout/FirstMethodArgumentLineBreak",
152 | "Layout/FirstMethodParameterLineBreak",
153 | "Layout/FirstParameterIndentation",
154 | "Layout/HashAlignment",
155 | "Layout/HeredocArgumentClosingParenthesis",
156 | "Layout/HeredocIndentation",
157 | "Layout/IndentationConsistency",
158 | "Layout/IndentationStyle",
159 | "Layout/IndentationWidth",
160 | "Layout/InitialIndentation",
161 | "Layout/LeadingCommentSpace",
162 | "Layout/LeadingEmptyLines",
163 | "Layout/LineContinuationLeadingSpace",
164 | "Layout/LineContinuationSpacing",
165 | "Layout/LineEndStringConcatenationIndentation",
166 | "Layout/LineLength",
167 | "Layout/MultilineArrayBraceLayout",
168 | "Layout/MultilineArrayLineBreaks",
169 | "Layout/MultilineAssignmentLayout",
170 | "Layout/MultilineBlockLayout",
171 | "Layout/MultilineHashBraceLayout",
172 | "Layout/MultilineHashKeyLineBreaks",
173 | "Layout/MultilineMethodArgumentLineBreaks",
174 | "Layout/MultilineMethodCallBraceLayout",
175 | "Layout/MultilineMethodCallIndentation",
176 | "Layout/MultilineMethodDefinitionBraceLayout",
177 | "Layout/MultilineMethodParameterLineBreaks",
178 | "Layout/MultilineOperationIndentation",
179 | "Layout/ParameterAlignment",
180 | "Layout/RedundantLineBreak",
181 | "Layout/RescueEnsureAlignment",
182 | "Layout/SingleLineBlockChain",
183 | "Layout/SpaceAfterColon",
184 | "Layout/SpaceAfterComma",
185 | "Layout/SpaceAfterMethodName",
186 | "Layout/SpaceAfterNot",
187 | "Layout/SpaceAfterSemicolon",
188 | "Layout/SpaceAroundBlockParameters",
189 | "Layout/SpaceAroundEqualsInParameterDefault",
190 | "Layout/SpaceAroundKeyword",
191 | "Layout/SpaceAroundMethodCallOperator",
192 | "Layout/SpaceAroundOperators",
193 | "Layout/SpaceBeforeBlockBraces",
194 | "Layout/SpaceBeforeBrackets",
195 | "Layout/SpaceBeforeComma",
196 | "Layout/SpaceBeforeComment",
197 | "Layout/SpaceBeforeFirstArg",
198 | "Layout/SpaceBeforeSemicolon",
199 | "Layout/SpaceInLambdaLiteral",
200 | "Layout/SpaceInsideArrayLiteralBrackets",
201 | "Layout/SpaceInsideArrayPercentLiteral",
202 | "Layout/SpaceInsideBlockBraces",
203 | "Layout/SpaceInsideHashLiteralBraces",
204 | "Layout/SpaceInsideParens",
205 | "Layout/SpaceInsidePercentLiteralDelimiters",
206 | "Layout/SpaceInsideRangeLiteral",
207 | "Layout/SpaceInsideReferenceBrackets",
208 | "Layout/SpaceInsideStringInterpolation",
209 | "Layout/TrailingEmptyLines",
210 | "Layout/TrailingWhitespace",
211 | "Lint/AmbiguousAssignment",
212 | "Lint/AmbiguousBlockAssociation",
213 | "Lint/AmbiguousOperator",
214 | "Lint/AmbiguousOperatorPrecedence",
215 | "Lint/AmbiguousRange",
216 | "Lint/AmbiguousRegexpLiteral",
217 | "Lint/ArrayLiteralInRegexp",
218 | "Lint/AssignmentInCondition",
219 | "Lint/BigDecimalNew",
220 | "Lint/BinaryOperatorWithIdenticalOperands",
221 | "Lint/BooleanSymbol",
222 | "Lint/CircularArgumentReference",
223 | "Lint/ConstantDefinitionInBlock",
224 | "Lint/ConstantOverwrittenInRescue",
225 | "Lint/ConstantReassignment",
226 | "Lint/ConstantResolution",
227 | "Lint/CopDirectiveSyntax",
228 | "Lint/Debugger",
229 | "Lint/DeprecatedClassMethods",
230 | "Lint/DeprecatedConstants",
231 | "Lint/DeprecatedOpenSSLConstant",
232 | "Lint/DisjunctiveAssignmentInConstructor",
233 | "Lint/DuplicateBranch",
234 | "Lint/DuplicateCaseCondition",
235 | "Lint/DuplicateElsifCondition",
236 | "Lint/DuplicateHashKey",
237 | "Lint/DuplicateMagicComment",
238 | "Lint/DuplicateMatchPattern",
239 | "Lint/DuplicateMethods",
240 | "Lint/DuplicateRegexpCharacterClassElement",
241 | "Lint/DuplicateRequire",
242 | "Lint/DuplicateRescueException",
243 | "Lint/DuplicateSetElement",
244 | "Lint/EachWithObjectArgument",
245 | "Lint/ElseLayout",
246 | "Lint/EmptyBlock",
247 | "Lint/EmptyClass",
248 | "Lint/EmptyConditionalBody",
249 | "Lint/EmptyEnsure",
250 | "Lint/EmptyExpression",
251 | "Lint/EmptyFile",
252 | "Lint/EmptyInPattern",
253 | "Lint/EmptyInterpolation",
254 | "Lint/EmptyWhen",
255 | "Lint/EnsureReturn",
256 | "Lint/ErbNewArguments",
257 | "Lint/FlipFlop",
258 | "Lint/FloatComparison",
259 | "Lint/FloatOutOfRange",
260 | "Lint/FormatParameterMismatch",
261 | "Lint/HashCompareByIdentity",
262 | "Lint/HashNewWithKeywordArgumentsAsDefault",
263 | "Lint/HeredocMethodCallPosition",
264 | "Lint/IdentityComparison",
265 | "Lint/ImplicitStringConcatenation",
266 | "Lint/IncompatibleIoSelectWithFiberScheduler",
267 | "Lint/IneffectiveAccessModifier",
268 | "Lint/InheritException",
269 | "Lint/InterpolationCheck",
270 | "Lint/ItWithoutArgumentsInBlock",
271 | "Lint/LambdaWithoutLiteralBlock",
272 | "Lint/LiteralAsCondition",
273 | "Lint/LiteralAssignmentInCondition",
274 | "Lint/LiteralInInterpolation",
275 | "Lint/Loop",
276 | "Lint/MissingCopEnableDirective",
277 | "Lint/MissingSuper",
278 | "Lint/MixedCaseRange",
279 | "Lint/MixedRegexpCaptureTypes",
280 | "Lint/MultipleComparison",
281 | "Lint/NestedMethodDefinition",
282 | "Lint/NestedPercentLiteral",
283 | "Lint/NextWithoutAccumulator",
284 | "Lint/NonAtomicFileOperation",
285 | "Lint/NonDeterministicRequireOrder",
286 | "Lint/NonLocalExitFromIterator",
287 | "Lint/NoReturnInBeginEndBlocks",
288 | "Lint/NumberConversion",
289 | "Lint/NumberedParameterAssignment",
290 | "Lint/NumericOperationWithConstantResult",
291 | "Lint/OrAssignmentToConstant",
292 | "Lint/OrderedMagicComments",
293 | "Lint/OutOfRangeRegexpRef",
294 | "Lint/ParenthesesAsGroupedExpression",
295 | "Lint/PercentStringArray",
296 | "Lint/PercentSymbolArray",
297 | "Lint/RaiseException",
298 | "Lint/RandOne",
299 | "Lint/RedundantCopDisableDirective",
300 | "Lint/RedundantCopEnableDirective",
301 | "Lint/RedundantDirGlobSort",
302 | "Lint/RedundantRegexpQuantifiers",
303 | "Lint/RedundantRequireStatement",
304 | "Lint/RedundantSafeNavigation",
305 | "Lint/RedundantSplatExpansion",
306 | "Lint/RedundantStringCoercion",
307 | "Lint/RedundantTypeConversion",
308 | "Lint/RedundantWithIndex",
309 | "Lint/RedundantWithObject",
310 | "Lint/RefinementImportMethods",
311 | "Lint/RegexpAsCondition",
312 | "Lint/RequireParentheses",
313 | "Lint/RequireRangeParentheses",
314 | "Lint/RequireRelativeSelfPath",
315 | "Lint/RescueException",
316 | "Lint/RescueType",
317 | "Lint/ReturnInVoidContext",
318 | "Lint/SafeNavigationChain",
319 | "Lint/SafeNavigationConsistency",
320 | "Lint/SafeNavigationWithEmpty",
321 | "Lint/ScriptPermission",
322 | "Lint/SelfAssignment",
323 | "Lint/SendWithMixinArgument",
324 | "Lint/ShadowedArgument",
325 | "Lint/ShadowedException",
326 | "Lint/ShadowingOuterLocalVariable",
327 | "Lint/SharedMutableDefault",
328 | "Lint/StructNewOverride",
329 | "Lint/SuppressedException",
330 | "Lint/SuppressedExceptionInNumberConversion",
331 | "Lint/SymbolConversion",
332 | "Lint/Syntax",
333 | "Lint/ToEnumArguments",
334 | "Lint/ToJSON",
335 | "Lint/TopLevelReturnWithArgument",
336 | "Lint/TrailingCommaInAttributeDeclaration",
337 | "Lint/TripleQuotes",
338 | "Lint/UnderscorePrefixedVariableName",
339 | "Lint/UnescapedBracketInRegexp",
340 | "Lint/UnexpectedBlockArity",
341 | "Lint/UnifiedInteger",
342 | "Lint/UnmodifiedReduceAccumulator",
343 | "Lint/UnreachableCode",
344 | "Lint/UnreachableLoop",
345 | "Lint/UnusedBlockArgument",
346 | "Lint/UnusedMethodArgument",
347 | "Lint/UriEscapeUnescape",
348 | "Lint/UriRegexp",
349 | "Lint/UselessAccessModifier",
350 | "Lint/UselessAssignment",
351 | "Lint/UselessConstantScoping",
352 | "Lint/UselessDefaultValueArgument",
353 | "Lint/UselessDefined",
354 | "Lint/UselessElseWithoutRescue",
355 | "Lint/UselessMethodDefinition",
356 | "Lint/UselessNumericOperation",
357 | "Lint/UselessOr",
358 | "Lint/UselessRescue",
359 | "Lint/UselessRuby2Keywords",
360 | "Lint/UselessSetterCall",
361 | "Lint/UselessTimes",
362 | "Lint/Void",
363 | "Metrics/AbcSize",
364 | "Metrics/BlockLength",
365 | "Metrics/BlockNesting",
366 | "Metrics/ClassLength",
367 | "Metrics/CollectionLiteralLength",
368 | "Metrics/CyclomaticComplexity",
369 | "Metrics/MethodLength",
370 | "Metrics/ModuleLength",
371 | "Metrics/ParameterLists",
372 | "Metrics/PerceivedComplexity",
373 | "Migration/DepartmentName",
374 | "Naming/AccessorMethodName",
375 | "Naming/AsciiIdentifiers",
376 | "Naming/BinaryOperatorParameterName",
377 | "Naming/BlockForwarding",
378 | "Naming/BlockParameterName",
379 | "Naming/ClassAndModuleCamelCase",
380 | "Naming/ConstantName",
381 | "Naming/FileName",
382 | "Naming/HeredocDelimiterCase",
383 | "Naming/HeredocDelimiterNaming",
384 | "Naming/InclusiveLanguage",
385 | "Naming/MemoizedInstanceVariableName",
386 | "Naming/MethodName",
387 | "Naming/MethodParameterName",
388 | "Naming/PredicateMethod",
389 | "Naming/PredicatePrefix",
390 | "Naming/RescuedExceptionsVariableName",
391 | "Naming/VariableName",
392 | "Naming/VariableNumber",
393 | "Security/CompoundHash",
394 | "Security/Eval",
395 | "Security/IoMethods",
396 | "Security/JSONLoad",
397 | "Security/MarshalLoad",
398 | "Security/Open",
399 | "Security/YAMLLoad",
400 | "Style/AccessModifierDeclarations",
401 | "Style/AccessorGrouping",
402 | "Style/Alias",
403 | "Style/AmbiguousEndlessMethodDefinition",
404 | "Style/AndOr",
405 | "Style/ArgumentsForwarding",
406 | "Style/ArrayCoercion",
407 | "Style/ArrayFirstLast",
408 | "Style/ArrayIntersect",
409 | "Style/ArrayJoin",
410 | "Style/AsciiComments",
411 | "Style/Attr",
412 | "Style/AutoResourceCleanup",
413 | "Style/BarePercentLiterals",
414 | "Style/BeginBlock",
415 | "Style/BisectedAttrAccessor",
416 | "Style/BitwisePredicate",
417 | "Style/BlockComments",
418 | "Style/BlockDelimiters",
419 | "Style/CaseEquality",
420 | "Style/CaseLikeIf",
421 | "Style/CharacterLiteral",
422 | "Style/ClassAndModuleChildren",
423 | "Style/ClassCheck",
424 | "Style/ClassEqualityComparison",
425 | "Style/ClassMethods",
426 | "Style/ClassMethodsDefinitions",
427 | "Style/ClassVars",
428 | "Style/CollectionCompact",
429 | "Style/CollectionMethods",
430 | "Style/CollectionQuerying",
431 | "Style/ColonMethodCall",
432 | "Style/ColonMethodDefinition",
433 | "Style/CombinableDefined",
434 | "Style/CombinableLoops",
435 | "Style/CommandLiteral",
436 | "Style/CommentAnnotation",
437 | "Style/CommentedKeyword",
438 | "Style/ComparableBetween",
439 | "Style/ComparableClamp",
440 | "Style/ConcatArrayLiterals",
441 | "Style/ConditionalAssignment",
442 | "Style/ConstantVisibility",
443 | "Style/Copyright",
444 | "Style/DataInheritance",
445 | "Style/DateTime",
446 | "Style/DefWithParentheses",
447 | "Style/DigChain",
448 | "Style/Dir",
449 | "Style/DirEmpty",
450 | "Style/DisableCopsWithinSourceCodeDirective",
451 | "Style/Documentation",
452 | "Style/DocumentationMethod",
453 | "Style/DocumentDynamicEvalDefinition",
454 | "Style/DoubleCopDisableDirective",
455 | "Style/DoubleNegation",
456 | "Style/EachForSimpleLoop",
457 | "Style/EachWithObject",
458 | "Style/EmptyBlockParameter",
459 | "Style/EmptyCaseCondition",
460 | "Style/EmptyElse",
461 | "Style/EmptyHeredoc",
462 | "Style/EmptyLambdaParameter",
463 | "Style/EmptyLiteral",
464 | "Style/EmptyMethod",
465 | "Style/EmptyStringInsideInterpolation",
466 | "Style/Encoding",
467 | "Style/EndBlock",
468 | "Style/EndlessMethod",
469 | "Style/EnvHome",
470 | "Style/EvalWithLocation",
471 | "Style/EvenOdd",
472 | "Style/ExactRegexpMatch",
473 | "Style/ExpandPathArguments",
474 | "Style/ExplicitBlockArgument",
475 | "Style/ExponentialNotation",
476 | "Style/FetchEnvVar",
477 | "Style/FileEmpty",
478 | "Style/FileNull",
479 | "Style/FileRead",
480 | "Style/FileTouch",
481 | "Style/FileWrite",
482 | "Style/FloatDivision",
483 | "Style/For",
484 | "Style/FormatString",
485 | "Style/FormatStringToken",
486 | "Style/FrozenStringLiteralComment",
487 | "Style/GlobalStdStream",
488 | "Style/GlobalVars",
489 | "Style/GuardClause",
490 | "Style/HashAsLastArrayItem",
491 | "Style/HashConversion",
492 | "Style/HashEachMethods",
493 | "Style/HashExcept",
494 | "Style/HashFetchChain",
495 | "Style/HashLikeCase",
496 | "Style/HashSlice",
497 | "Style/HashSyntax",
498 | "Style/HashTransformKeys",
499 | "Style/HashTransformValues",
500 | "Style/IdenticalConditionalBranches",
501 | "Style/IfInsideElse",
502 | "Style/IfUnlessModifier",
503 | "Style/IfUnlessModifierOfIfUnless",
504 | "Style/IfWithBooleanLiteralBranches",
505 | "Style/IfWithSemicolon",
506 | "Style/ImplicitRuntimeError",
507 | "Style/InfiniteLoop",
508 | "Style/InlineComment",
509 | "Style/InPatternThen",
510 | "Style/InverseMethods",
511 | "Style/InvertibleUnlessCondition",
512 | "Style/IpAddresses",
513 | "Style/ItAssignment",
514 | "Style/ItBlockParameter",
515 | "Style/KeywordArgumentsMerging",
516 | "Style/KeywordParametersOrder",
517 | "Style/Lambda",
518 | "Style/LambdaCall",
519 | "Style/LineEndConcatenation",
520 | "Style/MagicCommentFormat",
521 | "Style/MapCompactWithConditionalBlock",
522 | "Style/MapIntoArray",
523 | "Style/MapToHash",
524 | "Style/MapToSet",
525 | "Style/MethodCalledOnDoEndBlock",
526 | "Style/MethodCallWithArgsParentheses",
527 | "Style/MethodCallWithoutArgsParentheses",
528 | "Style/MethodDefParentheses",
529 | "Style/MinMax",
530 | "Style/MinMaxComparison",
531 | "Style/MissingElse",
532 | "Style/MissingRespondToMissing",
533 | "Style/MixinGrouping",
534 | "Style/MixinUsage",
535 | "Style/ModuleFunction",
536 | "Style/MultilineBlockChain",
537 | "Style/MultilineIfModifier",
538 | "Style/MultilineIfThen",
539 | "Style/MultilineInPatternThen",
540 | "Style/MultilineMemoization",
541 | "Style/MultilineMethodSignature",
542 | "Style/MultilineTernaryOperator",
543 | "Style/MultilineWhenThen",
544 | "Style/MultipleComparison",
545 | "Style/MutableConstant",
546 | "Style/NegatedIf",
547 | "Style/NegatedIfElseCondition",
548 | "Style/NegatedUnless",
549 | "Style/NegatedWhile",
550 | "Style/NestedFileDirname",
551 | "Style/NestedModifier",
552 | "Style/NestedParenthesizedCalls",
553 | "Style/NestedTernaryOperator",
554 | "Style/Next",
555 | "Style/NilComparison",
556 | "Style/NilLambda",
557 | "Style/NonNilCheck",
558 | "Style/Not",
559 | "Style/NumberedParameters",
560 | "Style/NumberedParametersLimit",
561 | "Style/NumericLiteralPrefix",
562 | "Style/NumericLiterals",
563 | "Style/NumericPredicate",
564 | "Style/ObjectThen",
565 | "Style/OneLineConditional",
566 | "Style/OpenStructUse",
567 | "Style/OperatorMethodCall",
568 | "Style/OptionalArguments",
569 | "Style/OptionalBooleanParameter",
570 | "Style/OptionHash",
571 | "Style/OrAssignment",
572 | "Style/ParallelAssignment",
573 | "Style/ParenthesesAroundCondition",
574 | "Style/PercentLiteralDelimiters",
575 | "Style/PercentQLiterals",
576 | "Style/PerlBackrefs",
577 | "Style/PreferredHashMethods",
578 | "Style/Proc",
579 | "Style/QuotedSymbols",
580 | "Style/RaiseArgs",
581 | "Style/RandomWithOffset",
582 | "Style/RedundantArgument",
583 | "Style/RedundantArrayConstructor",
584 | "Style/RedundantArrayFlatten",
585 | "Style/RedundantAssignment",
586 | "Style/RedundantBegin",
587 | "Style/RedundantCapitalW",
588 | "Style/RedundantCondition",
589 | "Style/RedundantConditional",
590 | "Style/RedundantConstantBase",
591 | "Style/RedundantCurrentDirectoryInPath",
592 | "Style/RedundantDoubleSplatHashBraces",
593 | "Style/RedundantEach",
594 | "Style/RedundantException",
595 | "Style/RedundantFetchBlock",
596 | "Style/RedundantFileExtensionInRequire",
597 | "Style/RedundantFilterChain",
598 | "Style/RedundantFormat",
599 | "Style/RedundantFreeze",
600 | "Style/RedundantHeredocDelimiterQuotes",
601 | "Style/RedundantInitialize",
602 | "Style/RedundantInterpolation",
603 | "Style/RedundantInterpolationUnfreeze",
604 | "Style/RedundantLineContinuation",
605 | "Style/RedundantParentheses",
606 | "Style/RedundantPercentQ",
607 | "Style/RedundantRegexpArgument",
608 | "Style/RedundantRegexpCharacterClass",
609 | "Style/RedundantRegexpConstructor",
610 | "Style/RedundantRegexpEscape",
611 | "Style/RedundantReturn",
612 | "Style/RedundantSelf",
613 | "Style/RedundantSelfAssignment",
614 | "Style/RedundantSelfAssignmentBranch",
615 | "Style/RedundantSort",
616 | "Style/RedundantSortBy",
617 | "Style/RedundantStringEscape",
618 | "Style/RegexpLiteral",
619 | "Style/RequireOrder",
620 | "Style/RescueModifier",
621 | "Style/RescueStandardError",
622 | "Style/ReturnNil",
623 | "Style/ReturnNilInPredicateMethodDefinition",
624 | "Style/SafeNavigation",
625 | "Style/SafeNavigationChainLength",
626 | "Style/Sample",
627 | "Style/SelectByRegexp",
628 | "Style/SelfAssignment",
629 | "Style/Semicolon",
630 | "Style/Send",
631 | "Style/SendWithLiteralMethodName",
632 | "Style/SignalException",
633 | "Style/SingleArgumentDig",
634 | "Style/SingleLineBlockParams",
635 | "Style/SingleLineDoEndBlock",
636 | "Style/SingleLineMethods",
637 | "Style/SlicingWithRange",
638 | "Style/SoleNestedConditional",
639 | "Style/SpecialGlobalVars",
640 | "Style/StabbyLambdaParentheses",
641 | "Style/StaticClass",
642 | "Style/StderrPuts",
643 | "Style/StringChars",
644 | "Style/StringConcatenation",
645 | "Style/StringHashKeys",
646 | "Style/StringLiterals",
647 | "Style/StringLiteralsInInterpolation",
648 | "Style/StringMethods",
649 | "Style/Strip",
650 | "Style/StructInheritance",
651 | "Style/SuperArguments",
652 | "Style/SuperWithArgsParentheses",
653 | "Style/SwapValues",
654 | "Style/SymbolArray",
655 | "Style/SymbolLiteral",
656 | "Style/SymbolProc",
657 | "Style/TernaryParentheses",
658 | "Style/TopLevelMethodDefinition",
659 | "Style/TrailingBodyOnClass",
660 | "Style/TrailingBodyOnMethodDefinition",
661 | "Style/TrailingBodyOnModule",
662 | "Style/TrailingCommaInArguments",
663 | "Style/TrailingCommaInArrayLiteral",
664 | "Style/TrailingCommaInBlockArgs",
665 | "Style/TrailingCommaInHashLiteral",
666 | "Style/TrailingMethodEndStatement",
667 | "Style/TrailingUnderscoreVariable",
668 | "Style/TrivialAccessors",
669 | "Style/UnlessElse",
670 | "Style/UnlessLogicalOperators",
671 | "Style/UnpackFirst",
672 | "Style/VariableInterpolation",
673 | "Style/WhenThen",
674 | "Style/WhileUntilDo",
675 | "Style/WhileUntilModifier",
676 | "Style/WordArray",
677 | "Style/YAMLFileRead",
678 | "Style/YodaCondition",
679 | "Style/YodaExpression",
680 | "Style/ZeroLengthPredicate"
681 | ]
682 | }
683 | }
684 | }
685 | ]
686 | }
687 | }
688 | }
689 | }
690 |
--------------------------------------------------------------------------------