console_kit 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,17 +3,13 @@
3
3
  require_relative 'tenant_selector'
4
4
  require_relative 'tenant_configurator'
5
5
  require_relative 'output'
6
+ require_relative 'setup_ui'
6
7
 
7
8
  # Core Logic for initial Setup
8
9
  module ConsoleKit
9
10
  # Does the initial setup
10
11
  module Setup
11
12
  class << self
12
- ENVIRONMENT_WARNINGS = {
13
- 'production' => -> { Output.print_error('WARNING: You are connected to a PRODUCTION environment!') },
14
- 'staging' => -> { Output.print_warning('You are connected to a staging environment.') }
15
- }.freeze
16
-
17
13
  def current_tenant = Thread.current[:console_kit_current_tenant]
18
14
 
19
15
  def current_tenant=(val)
@@ -32,6 +28,12 @@ module ConsoleKit
32
28
  def reset_current_tenant
33
29
  return warn_no_tenants unless tenants?
34
30
 
31
+ perform_tenant_reset
32
+ end
33
+
34
+ private
35
+
36
+ def perform_tenant_reset
35
37
  key = select_tenant_key
36
38
  return cancel_switch if key == :abort || key.blank?
37
39
 
@@ -41,12 +43,11 @@ module ConsoleKit
41
43
  configure(key)
42
44
  end
43
45
 
44
- private
45
-
46
46
  def run_setup
47
47
  return if tenant_setup_successful?
48
48
 
49
- ConsoleKit.configuration.validate!
49
+ config = ConsoleKit.configuration
50
+ config.validate!
50
51
  select_and_configure
51
52
  rescue StandardError => e
52
53
  handle_error(e)
@@ -62,12 +63,8 @@ module ConsoleKit
62
63
  def handle_selection_result(key)
63
64
  exit_on_key if %i[exit abort].include?(key)
64
65
 
65
- case key
66
- when :none
67
- Output.print_info('No tenant selected. Loading without tenant configuration.')
68
- when nil, ''
69
- Output.print_error('Tenant selection failed. Loading without tenant configuration.')
70
- end
66
+ skip_tenant_message if key == :none
67
+ Output.print_error('Tenant selection failed. Loading without tenant configuration.') if key.blank?
71
68
  end
72
69
 
73
70
  def exit_on_key
@@ -81,48 +78,20 @@ module ConsoleKit
81
78
 
82
79
  self.current_tenant = key
83
80
  Prompt.apply
84
- print_tenant_banner(key)
85
- end
86
-
87
- def print_tenant_banner(key)
88
- constants = ConsoleKit.configuration.tenants[key]&.[](:constants) || {}
89
- env = constants[:environment]&.to_s&.downcase
90
- Output.print_success("Tenant initialized: #{key}")
91
- print_environment_warning(env) if env
92
- print_active_connections
93
- end
94
-
95
- def print_environment_warning(env) = ENVIRONMENT_WARNINGS[env]&.call
96
-
97
- def print_active_connections
98
- names = active_connection_names
99
- Output.print_info("Active connections: #{names.join(', ')}") unless names.empty?
100
- end
101
-
102
- def active_connection_names
103
- ctx = context_class
104
- return [] unless ctx
105
-
106
- handlers = ConsoleKit::Connections::ConnectionManager.available_handlers(ctx)
107
- handlers.map { |h| h.class.name.demodulize.delete_suffix('ConnectionHandler') }
81
+ SetupUI.print_tenant_banner(key, ConsoleKit.configuration)
108
82
  end
109
83
 
110
84
  def tenants = ConsoleKit.configuration.tenants
111
- def context_class = ConsoleKit.configuration.context_class
112
85
  def tenants? = tenants&.any?
113
- def no_tenants? = !tenants?
114
86
  def select_tenant_key = auto_select? ? tenants.keys.first : TenantSelector.select
115
- def auto_select? = single_tenant? || non_interactive?
116
- def single_tenant? = tenants.size == 1
117
- def non_interactive? = !$stdin.tty?
87
+ def auto_select? = (tenants.size == 1) || !$stdin.tty?
118
88
  def warn_no_tenants = Output.print_warning('Cannot reset tenant: No tenants configured.')
119
- def warn_reset = Output.print_warning("Resetting tenant: #{current_tenant}")
120
89
  def cancel_switch = Output.print_warning('Tenant switch cancelled.')
121
90
  def skip_tenant_message = Output.print_info('No tenant selected. Loading without tenant configuration.')
122
91
 
123
92
  def clear_current_tenant
124
93
  if current_tenant
125
- warn_reset
94
+ Output.print_warning("Resetting tenant: #{current_tenant}")
126
95
  TenantConfigurator.clear
127
96
  end
128
97
  self.current_tenant = nil
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ConsoleKit
4
+ # UI helpers for Setup
5
+ module SetupUI
6
+ ENVIRONMENT_WARNINGS = {
7
+ 'production' => -> { Output.print_error('!!! CAUTION: YOU ARE IN PRODUCTION ENVIRONMENT !!!') },
8
+ 'staging' => -> { Output.print_warning('CAUTION: You are in staging environment.') }
9
+ }.freeze
10
+
11
+ class << self
12
+ def print_tenant_banner(key, config)
13
+ Output.print_success("Tenant initialized: #{key}")
14
+ print_env_warning(key, config)
15
+ print_active_connections
16
+ ConsoleKit::Connections::Dashboard.display if config.show_dashboard
17
+ end
18
+
19
+ private
20
+
21
+ def print_env_warning(key, config)
22
+ constants = config.tenants[key]&.[](:constants) || {}
23
+ env = constants[:environment]&.to_s&.downcase
24
+ ENVIRONMENT_WARNINGS[env]&.call if env
25
+ end
26
+
27
+ def print_active_connections
28
+ ctx = ConsoleKit.configuration.context_class
29
+ active = Connections::ConnectionManager.available_handlers(ctx).map do |handler|
30
+ handler.class.name.demodulize.delete_suffix('ConnectionHandler')
31
+ end
32
+
33
+ Output.print_info("Active connections: #{active.join(', ')}") if active.any?
34
+ end
35
+ end
36
+ end
37
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'output'
4
4
  require_relative 'connections/connection_manager'
5
+ require_relative 'connections/dashboard'
5
6
 
6
7
  module ConsoleKit
7
8
  # For tenant configuration
@@ -74,11 +75,14 @@ module ConsoleKit
74
75
  end
75
76
 
76
77
  def available_context_attributes(ctx)
77
- attributes = %i[partner_identifier]
78
- HANDLER_ATTRIBUTES.each do |handler, attr|
79
- attributes << attr if handler_available?(handler) && ctx.respond_to?("#{attr}=")
78
+ attributes = ctx.respond_to?(:partner_identifier=) ? [:partner_identifier] : []
79
+
80
+ HANDLER_ATTRIBUTES.each_with_object(attributes) do |(handler, attr), list|
81
+ next unless ctx.respond_to?("#{attr}=")
82
+ next unless handler_available?(handler)
83
+
84
+ list << attr
80
85
  end
81
- attributes.select { |attr| ctx.respond_to?("#{attr}=") }
82
86
  end
83
87
 
84
88
  def apply_context(constant)
@@ -21,9 +21,12 @@ module ConsoleKit
21
21
 
22
22
  def attempt_selection
23
23
  print_tenant_selection_menu
24
- selection = parse_user_selection
25
- return :abort if selection == :abort
24
+ process_selection(parse_user_selection)
25
+ end
26
+
27
+ def process_selection(selection)
26
28
  return :retry unless selection
29
+ return selection if selection == :abort
27
30
 
28
31
  selection.is_a?(Integer) ? resolve_selection(selection) : selection
29
32
  end
@@ -34,8 +37,9 @@ module ConsoleKit
34
37
  end
35
38
 
36
39
  def menu_items
40
+ tenants = ConsoleKit.tenants.keys
37
41
  items = ['0. Skip (load without tenant configuration)']
38
- ConsoleKit.tenants.keys.each_with_index do |key, index|
42
+ tenants.each_with_index.map do |key, index|
39
43
  items << "#{index + 1}. #{key} (partner: #{tenant_partner(key)})"
40
44
  end
41
45
  items
@@ -53,7 +57,7 @@ module ConsoleKit
53
57
  end
54
58
 
55
59
  def find_tenant_by_name(input)
56
- match = ConsoleKit.tenants.keys.find { |k| k.to_s.casecmp(input).zero? }
60
+ match = ConsoleKit.tenants.keys.find { |key| key.to_s.casecmp(input).zero? }
57
61
  return match if match
58
62
 
59
63
  handle_invalid_input("Invalid selection: '#{input}'. Please enter a number or tenant name.")
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ConsoleKit
4
- VERSION = '1.1.0'
4
+ VERSION = '1.2.0'
5
5
  end
data/lib/console_kit.rb CHANGED
@@ -44,6 +44,12 @@ module ConsoleKit
44
44
  configuration.context_class = val
45
45
  end
46
46
 
47
+ def show_dashboard = configuration.show_dashboard
48
+
49
+ def show_dashboard=(val)
50
+ configuration.show_dashboard = val
51
+ end
52
+
47
53
  def current_tenant = Setup.current_tenant
48
54
  def reset_current_tenant = Setup.reset_current_tenant
49
55
  def enable_pretty_output = configuration.pretty_output = true
@@ -37,6 +37,10 @@ Rails.application.config.after_initialize do
37
37
  # Toggle pretty output on/off (default: true)
38
38
  config.pretty_output = true
39
39
 
40
+ # Show connection dashboard on tenant switch (default: false)
41
+ # When false, use the `dashboard` command in the console to display on-demand
42
+ # config.show_dashboard = true
43
+
40
44
  if config.tenants.nil?
41
45
  warn '[ConsoleKit] Warning: `tenants` is not configured. ' \
42
46
  'Please set it in config/initializers/console_kit.rb'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: console_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soumyadeep Pal
@@ -10,19 +10,47 @@ cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: rails
13
+ name: activerecord
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 7.2.1
18
+ version: '6.1'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: 7.2.1
25
+ version: '6.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: activesupport
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '6.1'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '6.1'
40
+ - !ruby/object:Gem::Dependency
41
+ name: railties
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '6.1'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '6.1'
26
54
  description: Adds tenant selection to Rails consoles
27
55
  email:
28
56
  - soumyadeeppal2001@gmail.com
@@ -30,30 +58,30 @@ executables: []
30
58
  extensions: []
31
59
  extra_rdoc_files: []
32
60
  files:
33
- - CHANGELOG.md
34
- - CODE_OF_CONDUCT.md
35
61
  - LICENSE.txt
36
- - README.md
37
- - SECURITY.md
38
62
  - lib/console_kit.rb
39
63
  - lib/console_kit/configuration.rb
40
64
  - lib/console_kit/connections/base_connection_handler.rb
41
65
  - lib/console_kit/connections/connection_manager.rb
66
+ - lib/console_kit/connections/dashboard.rb
67
+ - lib/console_kit/connections/diagnostic_helpers.rb
42
68
  - lib/console_kit/connections/elasticsearch_connection_handler.rb
43
69
  - lib/console_kit/connections/mongo_connection_handler.rb
44
70
  - lib/console_kit/connections/redis_connection_handler.rb
45
71
  - lib/console_kit/connections/sql_connection_handler.rb
72
+ - lib/console_kit/connections/table_formatter.rb
73
+ - lib/console_kit/connections/table_renderer.rb
46
74
  - lib/console_kit/console_helpers.rb
47
75
  - lib/console_kit/output.rb
48
76
  - lib/console_kit/prompt.rb
49
77
  - lib/console_kit/railtie.rb
50
78
  - lib/console_kit/setup.rb
79
+ - lib/console_kit/setup_ui.rb
51
80
  - lib/console_kit/tenant_configurator.rb
52
81
  - lib/console_kit/tenant_selector.rb
53
82
  - lib/console_kit/version.rb
54
83
  - lib/generators/console_kit/install_generator.rb
55
84
  - lib/generators/console_kit/templates/console_kit.rb
56
- - sig/console_kit.rbs
57
85
  homepage: https://github.com/Soumyadeep-ai/console_kit
58
86
  licenses:
59
87
  - MIT
data/CHANGELOG.md DELETED
@@ -1,109 +0,0 @@
1
- # Changelog
2
-
3
- All notable changes to this project will be documented in this file.
4
-
5
- This project adheres to [Semantic Versioning](https://semver.org/).
6
-
7
- ---
8
-
9
- ## [1.1.0] - 2026-03-14
10
- ### Added
11
- - **Redis Connection Handler:** Automatic Redis DB selection per tenant via `Redis.current.select`, with graceful fallback for Redis v5+ where `Redis.current` is deprecated.
12
- - **Elasticsearch Connection Handler:** Sets a per-tenant Elasticsearch index name prefix via thread-local storage and `Elasticsearch::Model.index_name_prefix=` (when available).
13
- - **Console Helpers:** New `switch_tenant`, `tenant_info`, and `tenants` methods available in the Rails console for quick tenant management.
14
- - **Custom Console Prompt:** IRB and Pry prompts now display the active tenant name (e.g., `[acme] main:001>`).
15
- - **Tenant Banner:** On successful tenant initialization, a banner now shows the tenant name, environment safety warnings (production in red, staging in yellow), and a summary of active connections.
16
- - **Environment Safety Warnings:** Production and staging environments are flagged with color-coded warnings at tenant setup time.
17
- - New tenant configuration keys: `redis_db`, `elasticsearch_prefix`, and `environment`.
18
-
19
- ### Changed
20
- - `TenantConfigurator` now manages `tenant_redis_db` and `tenant_elasticsearch_prefix` context attributes alongside existing ones.
21
- - Generator template updated with examples for the new configuration keys.
22
-
23
- ---
24
-
25
- ## [1.0.0] - 2026-03-01
26
- ### Added
27
- - **Global Configuration Persistence:** ConsoleKit settings now persist across the entire session and across multiple threads.
28
- - **Isolated Tenant Selection:** Each thread maintains its own tenant selection for safety, while sharing the global configuration.
29
- - **Seamless Rails Reloading:** Full support for Rails `reload!`; your selected tenant and context are now automatically preserved after code reloads.
30
- - **Reliable Tenant Switching:** Switching or clearing tenants now correctly resets all database connections (SQL and MongoDB) to their default state.
31
- - **Flexible Tenant Selection:** Users can now select tenants by typing their names (case-insensitive) in addition to index numbers.
32
- - **Session Control:** Added support for `exit` or `quit` commands directly at the selection prompt to terminate the console session.
33
- - **Safe Mode:** Added a "Skip" option (0) to load the console without any tenant configuration.
34
- - **Improved Configuration Validation:** Enhanced startup checks to provide clearer feedback if the configuration or context class is incorrectly defined.
35
- - **Custom SQL Base Class:** New configuration option to specify a custom base class for SQL connections.
36
-
37
- ### Changed
38
- - **Modernized CLI Interface:** Redesigned the tenant selection menu and prompts for a cleaner, more intuitive user experience.
39
- - **Enhanced Error Feedback:** Improved messaging for invalid selections and missing configurations.
40
- - **Optimized Performance:** Refactored internal discovery and configuration logic for better reliability in large applications.
41
-
42
- ### Fixed
43
- - Fixed a bug where tenant context was lost after running `reload!` in the Rails console.
44
- - Fixed an issue where database connections could remain tied to a previous tenant after the context was cleared.
45
- - Resolved all stability and code quality warnings.
46
- - Fixed timestamp formatting in console output.
47
-
48
- ---
49
-
50
- ## [0.1.5] - 2025-10-12
51
- ### Added
52
- - Minor Bug Fixes
53
-
54
- ---
55
-
56
- ## [0.1.4] - 2025-09-30
57
- ### Added
58
- - Minor Fixes and Improvements
59
-
60
- ---
61
-
62
- ## [0.1.3] - 2025-08-12
63
- ### Added
64
- - `ConsoleKit.current_tenant` method to retrieve the current tenant at runtime.
65
- - `ConsoleKit.reset_current_tenant` to reset tenant selection.
66
- - `pretty_output` configuration added with ability to manually toggle CLI verbosity.
67
-
68
- ### Changed
69
- - Refactored internal logic for improved maintainability and future extensibility.
70
- - Enhanced test coverage for better reliability and edge case handling.
71
-
72
- ---
73
-
74
- ## [0.1.2] - 2025-07-23
75
- ### Added
76
- - Changelog added.
77
- - Readme and installation instructions added.
78
-
79
- ---
80
-
81
- ## [0.1.1] - 2025-07-21
82
- ### Added
83
- - Initial generator: `console_kit:install` to scaffold configuration.
84
- - RSpec test suite to support core features.
85
-
86
- ### Changed
87
- - Applied RuboCop fixes for code consistency and style.
88
-
89
- ---
90
-
91
- ## [0.1.0] - 2025-07-09
92
-
93
- - Initial release
94
-
95
- ### Added
96
- - Core setup logic for ConsoleKit:
97
- - `ConsoleKit.setup`
98
- - Tenant selection via CLI.
99
- - Tenant-specific database configuration.
100
- - Colorized console output for improved UX.
101
-
102
- [1.1.0]: https://github.com/Soumyadeep-ai/console_kit/releases/tag/v1.1.0
103
- [1.0.0]: https://github.com/Soumyadeep-ai/console_kit/releases/tag/v1.0.0
104
- [0.1.5]: https://github.com/Soumyadeep-ai/console_kit/releases/tag/v0.1.5
105
- [0.1.4]: https://github.com/Soumyadeep-ai/console_kit/releases/tag/v0.1.4
106
- [0.1.3]: https://github.com/Soumyadeep-ai/console_kit/releases/tag/v0.1.3
107
- [0.1.2]: https://github.com/Soumyadeep-ai/console_kit/releases/tag/v0.1.2
108
- [0.1.1]: https://github.com/Soumyadeep-ai/console_kit/releases/tag/v0.1.1
109
- [0.1.0]: https://github.com/Soumyadeep-ai/console_kit/releases/tag/v0.1.0
data/CODE_OF_CONDUCT.md DELETED
@@ -1,132 +0,0 @@
1
- # Contributor Covenant Code of Conduct
2
-
3
- ## Our Pledge
4
-
5
- We as members, contributors, and leaders pledge to make participation in our
6
- community a harassment-free experience for everyone, regardless of age, body
7
- size, visible or invisible disability, ethnicity, sex characteristics, gender
8
- identity and expression, level of experience, education, socio-economic status,
9
- nationality, personal appearance, race, caste, color, religion, or sexual
10
- identity and orientation.
11
-
12
- We pledge to act and interact in ways that contribute to an open, welcoming,
13
- diverse, inclusive, and healthy community.
14
-
15
- ## Our Standards
16
-
17
- Examples of behavior that contributes to a positive environment for our
18
- community include:
19
-
20
- * Demonstrating empathy and kindness toward other people
21
- * Being respectful of differing opinions, viewpoints, and experiences
22
- * Giving and gracefully accepting constructive feedback
23
- * Accepting responsibility and apologizing to those affected by our mistakes,
24
- and learning from the experience
25
- * Focusing on what is best not just for us as individuals, but for the overall
26
- community
27
-
28
- Examples of unacceptable behavior include:
29
-
30
- * The use of sexualized language or imagery, and sexual attention or advances of
31
- any kind
32
- * Trolling, insulting or derogatory comments, and personal or political attacks
33
- * Public or private harassment
34
- * Publishing others' private information, such as a physical or email address,
35
- without their explicit permission
36
- * Other conduct which could reasonably be considered inappropriate in a
37
- professional setting
38
-
39
- ## Enforcement Responsibilities
40
-
41
- Community leaders are responsible for clarifying and enforcing our standards of
42
- acceptable behavior and will take appropriate and fair corrective action in
43
- response to any behavior that they deem inappropriate, threatening, offensive,
44
- or harmful.
45
-
46
- Community leaders have the right and responsibility to remove, edit, or reject
47
- comments, commits, code, wiki edits, issues, and other contributions that are
48
- not aligned to this Code of Conduct, and will communicate reasons for moderation
49
- decisions when appropriate.
50
-
51
- ## Scope
52
-
53
- This Code of Conduct applies within all community spaces, and also applies when
54
- an individual is officially representing the community in public spaces.
55
- Examples of representing our community include using an official email address,
56
- posting via an official social media account, or acting as an appointed
57
- representative at an online or offline event.
58
-
59
- ## Enforcement
60
-
61
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
- reported to the community leaders responsible for enforcement at
63
- [report here](https://github.com/Soumyadeep-ai/console_kit/issues).
64
- All complaints will be reviewed and investigated promptly and fairly.
65
-
66
- All community leaders are obligated to respect the privacy and security of the
67
- reporter of any incident.
68
-
69
- ## Enforcement Guidelines
70
-
71
- Community leaders will follow these Community Impact Guidelines in determining
72
- the consequences for any action they deem in violation of this Code of Conduct:
73
-
74
- ### 1. Correction
75
-
76
- **Community Impact**: Use of inappropriate language or other behavior deemed
77
- unprofessional or unwelcome in the community.
78
-
79
- **Consequence**: A private, written warning from community leaders, providing
80
- clarity around the nature of the violation and an explanation of why the
81
- behavior was inappropriate. A public apology may be requested.
82
-
83
- ### 2. Warning
84
-
85
- **Community Impact**: A violation through a single incident or series of
86
- actions.
87
-
88
- **Consequence**: A warning with consequences for continued behavior. No
89
- interaction with the people involved, including unsolicited interaction with
90
- those enforcing the Code of Conduct, for a specified period of time. This
91
- includes avoiding interactions in community spaces as well as external channels
92
- like social media. Violating these terms may lead to a temporary or permanent
93
- ban.
94
-
95
- ### 3. Temporary Ban
96
-
97
- **Community Impact**: A serious violation of community standards, including
98
- sustained inappropriate behavior.
99
-
100
- **Consequence**: A temporary ban from any sort of interaction or public
101
- communication with the community for a specified period of time. No public or
102
- private interaction with the people involved, including unsolicited interaction
103
- with those enforcing the Code of Conduct, is allowed during this period.
104
- Violating these terms may lead to a permanent ban.
105
-
106
- ### 4. Permanent Ban
107
-
108
- **Community Impact**: Demonstrating a pattern of violation of community
109
- standards, including sustained inappropriate behavior, harassment of an
110
- individual, or aggression toward or disparagement of classes of individuals.
111
-
112
- **Consequence**: A permanent ban from any sort of public interaction within the
113
- community.
114
-
115
- ## Attribution
116
-
117
- This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
- version 2.1, available at
119
- [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
-
121
- Community Impact Guidelines were inspired by
122
- [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
-
124
- For answers to common questions about this code of conduct, see the FAQ at
125
- [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
- [https://www.contributor-covenant.org/translations][translations].
127
-
128
- [homepage]: https://www.contributor-covenant.org
129
- [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
- [Mozilla CoC]: https://github.com/mozilla/diversity
131
- [FAQ]: https://www.contributor-covenant.org/faq
132
- [translations]: https://www.contributor-covenant.org/translations