rails_accessibility_testing 1.1.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.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/ARCHITECTURE.md +307 -0
  3. data/CHANGELOG.md +81 -0
  4. data/CODE_OF_CONDUCT.md +125 -0
  5. data/CONTRIBUTING.md +225 -0
  6. data/GUIDES/continuous_integration.md +326 -0
  7. data/GUIDES/getting_started.md +205 -0
  8. data/GUIDES/working_with_designers_and_content_authors.md +398 -0
  9. data/GUIDES/writing_accessible_views_in_rails.md +412 -0
  10. data/LICENSE +22 -0
  11. data/README.md +350 -0
  12. data/docs_site/404.html +11 -0
  13. data/docs_site/Gemfile +11 -0
  14. data/docs_site/Makefile +14 -0
  15. data/docs_site/_config.yml +41 -0
  16. data/docs_site/_includes/header.html +13 -0
  17. data/docs_site/_layouts/default.html +130 -0
  18. data/docs_site/assets/main.scss +4 -0
  19. data/docs_site/ci_integration.md +76 -0
  20. data/docs_site/configuration.md +114 -0
  21. data/docs_site/contributing.md +69 -0
  22. data/docs_site/getting_started.md +57 -0
  23. data/docs_site/index.md +57 -0
  24. data/exe/rails_a11y +12 -0
  25. data/exe/rails_server_safe +41 -0
  26. data/lib/generators/rails_a11y/install/generator.rb +51 -0
  27. data/lib/rails_accessibility_testing/accessibility_helper.rb +701 -0
  28. data/lib/rails_accessibility_testing/change_detector.rb +114 -0
  29. data/lib/rails_accessibility_testing/checks/aria_landmarks_check.rb +33 -0
  30. data/lib/rails_accessibility_testing/checks/base_check.rb +156 -0
  31. data/lib/rails_accessibility_testing/checks/color_contrast_check.rb +56 -0
  32. data/lib/rails_accessibility_testing/checks/duplicate_ids_check.rb +49 -0
  33. data/lib/rails_accessibility_testing/checks/form_errors_check.rb +40 -0
  34. data/lib/rails_accessibility_testing/checks/form_labels_check.rb +62 -0
  35. data/lib/rails_accessibility_testing/checks/heading_hierarchy_check.rb +53 -0
  36. data/lib/rails_accessibility_testing/checks/image_alt_text_check.rb +52 -0
  37. data/lib/rails_accessibility_testing/checks/interactive_elements_check.rb +66 -0
  38. data/lib/rails_accessibility_testing/checks/keyboard_accessibility_check.rb +36 -0
  39. data/lib/rails_accessibility_testing/checks/skip_links_check.rb +24 -0
  40. data/lib/rails_accessibility_testing/checks/table_structure_check.rb +36 -0
  41. data/lib/rails_accessibility_testing/cli/command.rb +259 -0
  42. data/lib/rails_accessibility_testing/config/yaml_loader.rb +131 -0
  43. data/lib/rails_accessibility_testing/configuration.rb +30 -0
  44. data/lib/rails_accessibility_testing/engine/rule_engine.rb +97 -0
  45. data/lib/rails_accessibility_testing/engine/violation.rb +58 -0
  46. data/lib/rails_accessibility_testing/engine/violation_collector.rb +59 -0
  47. data/lib/rails_accessibility_testing/error_message_builder.rb +354 -0
  48. data/lib/rails_accessibility_testing/integration/minitest_integration.rb +74 -0
  49. data/lib/rails_accessibility_testing/rspec_integration.rb +58 -0
  50. data/lib/rails_accessibility_testing/shared_examples.rb +93 -0
  51. data/lib/rails_accessibility_testing/version.rb +4 -0
  52. data/lib/rails_accessibility_testing.rb +83 -0
  53. data/lib/tasks/accessibility.rake +28 -0
  54. metadata +218 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 44226ec4973a99bf8f1547ea8097b1692149aff661462c49e49f231fa922ee68
4
+ data.tar.gz: 6cbe080229e8ab7895b9a43c318e613b23c9f47630ee3d059f3c62a155d79840
5
+ SHA512:
6
+ metadata.gz: 6a9ebf9993e2e0c62ebfee115edd8af562ea7545ad9ea3324e76f08d2cc0ad7617d92c7703a8cac2eb703381b4e8737b57e6fb238fb90918aecfe84c383ef65d
7
+ data.tar.gz: 2c8063de81c13388d38f01b289a6cf5a806aac8e0e176496857a4c4fbc714a18f187c2fb90d846cefded37e5e2896454eaddbfa87a98262548a420633c95aec4
data/ARCHITECTURE.md ADDED
@@ -0,0 +1,307 @@
1
+ # Rails Accessibility Testing Gem - Architecture Overview
2
+
3
+ ## Project Identity
4
+
5
+ ### Gem Name Options
6
+
7
+ After careful consideration, we've selected:
8
+
9
+ **Final Name: `rails_accessibility_testing`**
10
+
11
+ **Note:** The gem uses `rails_a11y` as a short alias for the generator command and CLI tool, but the official gem name is `rails_accessibility_testing`.
12
+
13
+ **Alternative names considered:**
14
+ 1. `rails_accessibility_testing` - **SELECTED** - Clear and descriptive
15
+ 2. `rails_a11y` - Short alias used for CLI and generator
16
+ 3. `a11y_rails` - Alternative short form
17
+ 4. `accessible_rails` - Descriptive but longer
18
+
19
+ ### Tagline
20
+
21
+ **"The RSpec + RuboCop of accessibility for Rails. Catch WCAG violations before they reach production."**
22
+
23
+ ### Positioning Statement
24
+
25
+ Rails Accessibility Testing fills a critical gap in the Rails testing ecosystem. While RSpec ensures code works and RuboCop ensures code style, Rails Accessibility Testing ensures applications are accessible to everyone. Unlike manual accessibility audits that happen late in development, Rails Accessibility Testing integrates directly into your test suite, catching violations as you code. It's opinionated enough to guide teams new to accessibility, yet configurable enough for experienced teams. By making accessibility testing as natural as unit testing, Rails Accessibility Testing helps teams build accessible applications from day one, not as an afterthought.
26
+
27
+ ---
28
+
29
+ ## Architecture Overview
30
+
31
+ ### Core Principles
32
+
33
+ 1. **DevX First**: Every feature prioritizes developer experience
34
+ 2. **Accessibility at Core**: WCAG 2.1 AA compliance is the foundation
35
+ 3. **Rails Native**: Feels like a natural part of Rails, not a bolt-on
36
+ 4. **Progressive Enhancement**: Works with zero config, scales with configuration
37
+
38
+ ### Component Architecture
39
+
40
+ ```
41
+ rails_a11y/
42
+ ├── Core Engine
43
+ │ ├── Rule Engine # Evaluates accessibility rules
44
+ │ ├── Check Definitions # WCAG-aligned check implementations
45
+ │ └── Violation Collector # Aggregates and formats violations
46
+
47
+ ├── Rails Integration
48
+ │ ├── Railtie # Rails initialization hooks
49
+ │ ├── RSpec Integration # RSpec helpers and matchers
50
+ │ ├── Minitest Integration # Minitest helpers
51
+ │ └── System Test Helpers # Capybara integration
52
+
53
+ ├── Configuration
54
+ │ ├── YAML Config Loader # Loads config/accessibility.yml
55
+ │ ├── Profile Manager # Dev/test/CI profiles
56
+ │ └── Rule Overrides # Ignore rules with comments
57
+
58
+ ├── CLI
59
+ │ ├── Command Runner # Main CLI entry point
60
+ │ ├── URL Scanner # Scans URLs/routes
61
+ │ └── Report Generator # Human-readable + JSON reports
62
+
63
+ ├── Generators
64
+ │ └── Install Generator # Rails generator for setup
65
+
66
+ └── Documentation
67
+ ├── Guides/ # Practical guides
68
+ ├── API Docs (YARD) # Generated documentation
69
+ └── Doc Site # Static documentation site
70
+ ```
71
+
72
+ ### Data Flow
73
+
74
+ ```
75
+ Test Execution
76
+
77
+ System Test Helper (RSpec/Minitest)
78
+
79
+ Rule Engine
80
+
81
+ Check Definitions (11+ checks)
82
+
83
+ Violation Collector
84
+
85
+ Error Message Builder
86
+
87
+ Test Failure / CLI Report
88
+ ```
89
+
90
+ ### Rule Engine Design
91
+
92
+ The rule engine is the heart of the gem. It:
93
+
94
+ 1. **Loads Configuration**: Reads `config/accessibility.yml` with profile support**
95
+ 2. **Applies Rule Overrides**: Respects ignored rules with comments
96
+ 3. **Executes Checks**: Runs enabled checks in order
97
+ 4. **Collects Violations**: Aggregates all violations before reporting
98
+ 5. **Formats Output**: Creates actionable error messages
99
+
100
+ ### Check Definition Structure
101
+
102
+ Each check is a self-contained class that:
103
+
104
+ - Implements a standard interface
105
+ - Returns violations with context
106
+ - Includes WCAG references
107
+ - Provides remediation suggestions
108
+ - Can be enabled/disabled via config
109
+
110
+ ---
111
+
112
+ ## Key Design Decisions
113
+
114
+ ### 1. YAML Configuration
115
+
116
+ **Why YAML?**
117
+ - Human-readable and comment-friendly
118
+ - Easy to version control
119
+ - Familiar to Rails developers
120
+ - Supports profiles (dev/test/CI)
121
+
122
+ ### 2. Rule-Based Architecture
123
+
124
+ **Why separate rules?**
125
+ - Easy to enable/disable specific checks
126
+ - Allows teams to gradually adopt stricter rules
127
+ - Makes it easy to add custom rules later
128
+ - Clear separation of concerns
129
+
130
+ ### 3. Violation Collection vs Immediate Failure
131
+
132
+ **Why collect then fail?**
133
+ - Shows all issues at once (better DX)
134
+ - Allows prioritization
135
+ - More efficient than stopping at first error
136
+ - Better for CI/CD reports
137
+
138
+ ### 4. View File Detection
139
+
140
+ **Why detect view files?**
141
+ - Points developers to exact file to fix
142
+ - Works with partials and layouts
143
+ - Reduces debugging time
144
+ - Makes errors actionable
145
+
146
+ ### 5. Dual Test Framework Support
147
+
148
+ **Why both RSpec and Minitest?**
149
+ - Rails teams use both
150
+ - Reduces friction for adoption
151
+ - Shared core logic, different interfaces
152
+ - Better market fit
153
+
154
+ ---
155
+
156
+ ## File Structure
157
+
158
+ ```
159
+ lib/
160
+ ├── rails_a11y.rb # Main entry point
161
+ ├── rails_a11y/
162
+ │ ├── version.rb
163
+ │ ├── configuration.rb # Config management
164
+ │ ├── railtie.rb # Rails integration
165
+ │ │
166
+ │ ├── engine/
167
+ │ │ ├── rule_engine.rb # Core rule evaluator
168
+ │ │ ├── violation_collector.rb # Aggregates violations
169
+ │ │ └── check_context.rb # Context for checks
170
+ │ │
171
+ │ ├── checks/
172
+ │ │ ├── base_check.rb # Base class for all checks
173
+ │ │ ├── form_labels_check.rb
174
+ │ │ ├── image_alt_text_check.rb
175
+ │ │ ├── interactive_elements_check.rb
176
+ │ │ ├── heading_hierarchy_check.rb
177
+ │ │ ├── keyboard_accessibility_check.rb
178
+ │ │ ├── aria_landmarks_check.rb
179
+ │ │ ├── form_errors_check.rb
180
+ │ │ ├── table_structure_check.rb
181
+ │ │ ├── duplicate_ids_check.rb
182
+ │ │ ├── skip_links_check.rb
183
+ │ │ └── color_contrast_check.rb # New
184
+ │ │
185
+ │ ├── integration/
186
+ │ │ ├── rspec_integration.rb
187
+ │ │ ├── minitest_integration.rb
188
+ │ │ └── system_test_helper.rb # Shared Capybara helpers
189
+ │ │
190
+ │ ├── cli/
191
+ │ │ ├── command.rb # Main CLI command
192
+ │ │ ├── url_scanner.rb # Scans URLs/routes
193
+ │ │ └── report_generator.rb # Generates reports
194
+ │ │
195
+ │ ├── config/
196
+ │ │ ├── yaml_loader.rb # Loads YAML config
197
+ │ │ ├── profile_manager.rb # Manages profiles
198
+ │ │ └── rule_override.rb # Handles ignored rules
199
+ │ │
200
+ │ ├── errors/
201
+ │ │ ├── error_message_builder.rb # Formats error messages
202
+ │ │ └── violation_formatter.rb # Formats individual violations
203
+ │ │
204
+ │ └── utils/
205
+ │ ├── view_file_detector.rb # Detects view files
206
+ │ └── wcag_reference.rb # WCAG reference data
207
+
208
+ ├── generators/
209
+ │ └── rails_a11y/
210
+ │ └── install/
211
+ │ ├── generator.rb
212
+ │ └── templates/
213
+ │ ├── initializer.rb.erb
214
+ │ └── accessibility.yml.erb
215
+
216
+ └── tasks/
217
+ └── accessibility.rake # Rake tasks
218
+
219
+ exe/
220
+ └── rails_a11y # CLI executable
221
+
222
+ GUIDES/
223
+ ├── getting_started.md
224
+ ├── continuous_integration.md
225
+ ├── working_with_designers_and_content_authors.md
226
+ └── writing_accessible_views_in_rails.md
227
+
228
+ docs_site/
229
+ ├── index.html
230
+ ├── usage.html
231
+ ├── configuration.html
232
+ ├── ci_integration.html
233
+ └── contributing.html
234
+ ```
235
+
236
+ ---
237
+
238
+ ## Extension Points
239
+
240
+ ### Adding Custom Checks
241
+
242
+ ```ruby
243
+ module RailsA11y
244
+ module Checks
245
+ class CustomCheck < BaseCheck
246
+ def check
247
+ # Implementation
248
+ end
249
+ end
250
+ end
251
+ end
252
+ ```
253
+
254
+ ### Custom Error Formatters
255
+
256
+ ```ruby
257
+ module RailsA11y
258
+ module Errors
259
+ class CustomFormatter < ViolationFormatter
260
+ # Custom formatting logic
261
+ end
262
+ end
263
+ end
264
+ ```
265
+
266
+ ### Profile-Specific Configuration
267
+
268
+ ```yaml
269
+ # config/accessibility.yml
270
+ development:
271
+ checks:
272
+ color_contrast: false # Skip in dev for speed
273
+
274
+ ci:
275
+ checks:
276
+ color_contrast: true # Full checks in CI
277
+ ```
278
+
279
+ ---
280
+
281
+ ## Performance Considerations
282
+
283
+ 1. **Lazy Loading**: Checks loaded only when needed
284
+ 2. **Caching**: View file detection cached
285
+ 3. **Parallel Execution**: Checks can run in parallel (future)
286
+ 4. **Selective Execution**: Only run checks for changed files (existing feature)
287
+ 5. **Configurable Depth**: Expensive checks behind flags
288
+
289
+ ---
290
+
291
+ ## Testing Strategy
292
+
293
+ 1. **Unit Tests**: Each check tested in isolation
294
+ 2. **Integration Tests**: Full Rails app with RSpec/Minitest
295
+ 3. **CLI Tests**: Test CLI against real Rails routes
296
+ 4. **Documentation Tests**: Ensure examples work
297
+
298
+ ---
299
+
300
+ ## Future Enhancements
301
+
302
+ 1. **Custom Rules**: Allow teams to define custom checks
303
+ 2. **Visual Regression**: Screenshot comparison for visual issues
304
+ 3. **Performance Monitoring**: Track check performance
305
+ 4. **IDE Integration**: VS Code/IntelliJ plugins
306
+ 5. **CI/CD Templates**: Pre-built GitHub Actions, CircleCI configs
307
+
data/CHANGELOG.md ADDED
@@ -0,0 +1,81 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.1.0] - 2024-11-15
9
+
10
+ ### Added
11
+ - GitHub Pages documentation site with Jekyll
12
+ - Comprehensive GitHub Actions workflow for automatic documentation deployment
13
+ - Enhanced workflow diagnostics and verification steps
14
+ - Test step to verify index.html exists before deployment
15
+ - Improved error messages and troubleshooting guides
16
+ - Token support for GitHub Pages deployment (OIDC with PAT fallback)
17
+
18
+ ### Improved
19
+ - Better artifact structure verification in CI/CD
20
+ - Enhanced deployment diagnostics
21
+ - More detailed build output and verification steps
22
+ - Improved documentation structure and organization
23
+
24
+ ### Fixed
25
+ - Jekyll build configuration and dependencies
26
+ - GitHub Pages deployment path isolation
27
+ - Artifact structure for subdirectory deployment
28
+
29
+ ## [1.0.0] - 2024-11-14
30
+
31
+ ### Added
32
+ - Initial release of Rails Accessibility Testing gem
33
+ - Automatic accessibility checking for Rails system specs
34
+ - 11+ comprehensive accessibility checks:
35
+ - Form labels
36
+ - Image alt text
37
+ - Interactive element names
38
+ - Heading hierarchy
39
+ - Keyboard accessibility
40
+ - ARIA landmarks
41
+ - Form error associations
42
+ - Table structure
43
+ - Duplicate IDs
44
+ - Skip links
45
+ - Color contrast (optional)
46
+ - Rule engine architecture for extensible checks
47
+ - YAML configuration system with profile support (development, test, ci)
48
+ - CLI tool (`rails_a11y`) for checking URLs and routes
49
+ - Rails generator (`rails generate rails_a11y:install`) for easy setup
50
+ - RSpec integration with automatic hooks
51
+ - Minitest integration for system tests
52
+ - Automatic system spec detection by file location
53
+ - Smart change detection (only runs when code changes)
54
+ - Detailed error messages with file locations and remediation steps
55
+ - WCAG 2.1 AA compliance references
56
+ - Zero-configuration setup with sensible defaults
57
+ - Skip checks for specific tests via `skip_a11y: true` metadata
58
+ - Manual comprehensive check method `check_comprehensive_accessibility`
59
+ - Comprehensive documentation:
60
+ - Getting Started guide
61
+ - Continuous Integration guide
62
+ - Writing Accessible Views guide
63
+ - Working with Designers guide
64
+ - Architecture documentation
65
+ - Error message builder with semantic element names
66
+ - View file detection including partials and layouts
67
+ - Batch error collection (reports all errors, not just first)
68
+ - Human-readable and JSON report formats
69
+ - Profile-based configuration for different environments
70
+
71
+ ### Technical Details
72
+ - Built on axe-core-capybara for WCAG testing
73
+ - Integrates with RSpec Rails and Minitest
74
+ - Uses Capybara for browser automation
75
+ - Supports Rails 6.0+ and Ruby 3.0+
76
+ - Compatible with RSpec Rails 6.0+
77
+ - Modular architecture with rule engine and check definitions
78
+
79
+ [1.1.0]: https://github.com/rayraycodes/rails-accessibility-testing/releases/tag/v1.1.0
80
+ [1.0.0]: https://github.com/rayraycodes/rails-accessibility-testing/releases/tag/v1.0.0
81
+
@@ -0,0 +1,125 @@
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, religion, or sexual identity
10
+ 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
26
+ overall community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ * The use of sexualized language or imagery, and sexual attention or
31
+ advances of 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
35
+ address, 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, or to ban temporarily or permanently
49
+ any contributor for other behaviors that they deem inappropriate, threatening,
50
+ offensive, or harmful.
51
+
52
+ ## Scope
53
+
54
+ This Code of Conduct applies within all community spaces, and also applies when
55
+ an individual is officially representing the community in public spaces.
56
+ Examples of representing our community include using an official e-mail address,
57
+ posting via an official social media account, or acting as an appointed
58
+ representative at an online or offline event.
59
+
60
+ ## Enforcement
61
+
62
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
63
+ reported to the community leaders responsible for enforcement at
64
+ imregan@umich.edu. All complaints will be reviewed and investigated promptly and
65
+ fairly.
66
+
67
+ All community leaders are obligated to respect the privacy and security of the
68
+ reporter of any incident.
69
+
70
+ ## Enforcement Guidelines
71
+
72
+ Community leaders will follow these Community Impact Guidelines in determining
73
+ the consequences for any action they deem in violation of this Code of Conduct:
74
+
75
+ ### 1. Correction
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
+ **Community Impact**: A violation through a single incident or series
85
+ of actions.
86
+
87
+ **Consequence**: A warning with consequences for continued behavior. No
88
+ interaction with the people involved, including unsolicited interaction with
89
+ those enforcing the Code of Conduct, for a specified period of time. This
90
+ includes avoiding interactions in community spaces as well as external channels
91
+ like social media. Violating these terms may lead to a temporary or
92
+ permanent ban.
93
+
94
+ ### 3. Temporary Ban
95
+ **Community Impact**: A serious violation of community standards, including
96
+ sustained inappropriate behavior.
97
+
98
+ **Consequence**: A temporary ban from any sort of interaction or public
99
+ communication with the community for a specified period of time. No public or
100
+ private interaction with the people involved, including unsolicited interaction
101
+ with those enforcing the Code of Conduct, is allowed during this period.
102
+ Violating these terms may lead to a permanent ban.
103
+
104
+ ### 4. Permanent Ban
105
+ **Community Impact**: Demonstrating a pattern of violation of community
106
+ standards, including sustained inappropriate behavior, harassment of an
107
+ individual, or aggression toward or disparagement of classes of individuals.
108
+
109
+ **Consequence**: A permanent ban from any sort of public interaction within
110
+ the community.
111
+
112
+ ## Attribution
113
+
114
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
115
+ version 2.0, available at
116
+ https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
117
+
118
+ Community Impact Guidelines were inspired by [Mozilla's code of conduct
119
+ enforcement ladder](https://github.com/mozilla/diversity).
120
+
121
+ [homepage]: https://www.contributor-covenant.org
122
+
123
+ For answers to common questions about this code of conduct, see
124
+ https://www.contributor-covenant.org/faq
125
+