├── 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 |
86 | 90 | View on GitHub 91 | 92 |
93 | 94 | 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 | ![Example of auto-complete](https://github.com/user-attachments/assets/c8038624-4df5-4dd7-9fcf-787d5c8a5f71) 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 | --------------------------------------------------------------------------------