rails_accessibility_testing 1.5.3 → 1.5.5

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/ARCHITECTURE.md +376 -1
  3. data/CHANGELOG.md +63 -1
  4. data/GUIDES/getting_started.md +40 -5
  5. data/GUIDES/system_specs_for_accessibility.md +12 -4
  6. data/README.md +52 -8
  7. data/docs_site/Gemfile.lock +89 -0
  8. data/docs_site/_config.yml +9 -0
  9. data/docs_site/_includes/header.html +1 -0
  10. data/docs_site/_layouts/default.html +754 -15
  11. data/docs_site/architecture.md +533 -0
  12. data/docs_site/index.md +2 -1
  13. data/exe/a11y_live_scanner +10 -39
  14. data/exe/a11y_static_scanner +333 -0
  15. data/lib/generators/rails_a11y/install/install_generator.rb +19 -30
  16. data/lib/generators/rails_a11y/install/templates/accessibility.yml.erb +39 -0
  17. data/lib/generators/rails_a11y/install/templates/all_pages_accessibility_spec.rb.erb +132 -45
  18. data/lib/rails_accessibility_testing/accessibility_helper.rb +131 -126
  19. data/lib/rails_accessibility_testing/checks/base_check.rb +14 -5
  20. data/lib/rails_accessibility_testing/checks/form_errors_check.rb +1 -1
  21. data/lib/rails_accessibility_testing/checks/form_labels_check.rb +6 -4
  22. data/lib/rails_accessibility_testing/checks/heading_check.rb +7 -15
  23. data/lib/rails_accessibility_testing/checks/image_alt_text_check.rb +1 -1
  24. data/lib/rails_accessibility_testing/checks/interactive_elements_check.rb +12 -8
  25. data/lib/rails_accessibility_testing/config/yaml_loader.rb +20 -0
  26. data/lib/rails_accessibility_testing/erb_extractor.rb +141 -0
  27. data/lib/rails_accessibility_testing/error_message_builder.rb +11 -6
  28. data/lib/rails_accessibility_testing/file_change_tracker.rb +95 -0
  29. data/lib/rails_accessibility_testing/line_number_finder.rb +61 -0
  30. data/lib/rails_accessibility_testing/rspec_integration.rb +74 -33
  31. data/lib/rails_accessibility_testing/shared_examples.rb +2 -0
  32. data/lib/rails_accessibility_testing/static_file_scanner.rb +80 -0
  33. data/lib/rails_accessibility_testing/static_page_adapter.rb +116 -0
  34. data/lib/rails_accessibility_testing/static_scanning.rb +61 -0
  35. data/lib/rails_accessibility_testing/version.rb +3 -1
  36. data/lib/rails_accessibility_testing/violation_converter.rb +80 -0
  37. data/lib/rails_accessibility_testing.rb +9 -1
  38. metadata +26 -2
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Static scanning module - provides file-based accessibility scanning
4
+ # This module aggregates all static scanning components for easy access
5
+ #
6
+ # @api public
7
+ module RailsAccessibilityTesting
8
+ # Static scanning components
9
+ # All components work together to scan view files without browser rendering
10
+ #
11
+ # Components:
12
+ # - StaticFileScanner: Main scanner that orchestrates the scanning process
13
+ # - ErbExtractor: Converts ERB templates to HTML for analysis
14
+ # - StaticPageAdapter: Makes Nokogiri documents look like Capybara pages
15
+ # - LineNumberFinder: Finds line numbers for reported issues
16
+ # - ViolationConverter: Converts violations to error/warning format
17
+ #
18
+ # All 11 accessibility checks are automatically used via RuleEngine:
19
+ # 1. FormLabelsCheck
20
+ # 2. ImageAltTextCheck
21
+ # 3. InteractiveElementsCheck
22
+ # 4. HeadingCheck
23
+ # 5. KeyboardAccessibilityCheck
24
+ # 6. AriaLandmarksCheck
25
+ # 7. FormErrorsCheck
26
+ # 8. TableStructureCheck
27
+ # 9. DuplicateIdsCheck
28
+ # 10. SkipLinksCheck
29
+ # 11. ColorContrastCheck
30
+ #
31
+ # @example Scanning a view file
32
+ # scanner = StaticFileScanner.new('app/views/pages/home.html.erb')
33
+ # result = scanner.scan
34
+ # # => { errors: [...], warnings: [...] }
35
+ #
36
+ module StaticScanning
37
+ # Convenience method to scan a single file
38
+ # @param file_path [String] Path to view file
39
+ # @return [Hash] Hash with :errors and :warnings arrays
40
+ def self.scan_file(file_path)
41
+ StaticFileScanner.new(file_path).scan
42
+ end
43
+
44
+ # Convenience method to scan multiple files
45
+ # @param file_paths [Array<String>] Array of file paths
46
+ # @return [Hash] Hash with :errors and :warnings arrays (aggregated)
47
+ def self.scan_files(file_paths)
48
+ all_errors = []
49
+ all_warnings = []
50
+
51
+ file_paths.each do |file_path|
52
+ result = scan_file(file_path)
53
+ all_errors.concat(result[:errors] || [])
54
+ all_warnings.concat(result[:warnings] || [])
55
+ end
56
+
57
+ { errors: all_errors, warnings: all_warnings }
58
+ end
59
+ end
60
+ end
61
+
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsAccessibilityTesting
2
- VERSION = "1.5.3"
4
+ VERSION = "1.5.5"
3
5
  end
4
6
 
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsAccessibilityTesting
4
+ # Converts Violation objects to error/warning hash format
5
+ # Used by static file scanner to format results
6
+ #
7
+ # @api private
8
+ class ViolationConverter
9
+ # Convert violations to errors/warnings format
10
+ # @param violations [Array<Engine::Violation>] Array of violations
11
+ # @param view_file [String] Path to the view file
12
+ # @param line_number_finder [LineNumberFinder] Finder for line numbers
13
+ # @param config [Hash] Optional configuration hash (for ignore_warnings flag)
14
+ # @return [Hash] Hash with :errors and :warnings arrays
15
+ def self.convert(violations, view_file:, line_number_finder:, config: {})
16
+ new(violations, view_file: view_file, line_number_finder: line_number_finder, config: config).convert
17
+ end
18
+
19
+ def initialize(violations, view_file:, line_number_finder:, config: {})
20
+ @violations = violations
21
+ @view_file = view_file
22
+ @line_number_finder = line_number_finder
23
+ @config = config
24
+ end
25
+
26
+ def convert
27
+ errors = []
28
+ warnings = []
29
+
30
+ @violations.each do |violation|
31
+ # Skip warnings if ignore_warnings is enabled
32
+ if warning?(violation) && ignore_warnings?
33
+ next
34
+ end
35
+
36
+ element_context = violation.element_context || {}
37
+ line_num = @line_number_finder.find_line_number(element_context)
38
+
39
+ error_data = {
40
+ type: violation.message,
41
+ element: element_context,
42
+ file: @view_file,
43
+ line: line_num,
44
+ wcag: violation.wcag_reference
45
+ }
46
+
47
+ if warning?(violation)
48
+ warnings << error_data
49
+ else
50
+ errors << error_data
51
+ end
52
+ end
53
+
54
+ { errors: errors, warnings: warnings }
55
+ end
56
+
57
+ private
58
+
59
+ # Check if warnings should be ignored
60
+ def ignore_warnings?
61
+ summary_config = @config['summary'] || {}
62
+ summary_config.fetch('ignore_warnings', false)
63
+ end
64
+
65
+ # Determine if a violation should be a warning instead of an error
66
+ def warning?(violation)
67
+ message = violation.message
68
+ rule_name = violation.rule_name
69
+
70
+ # Skip links are warnings (best practice, not required)
71
+ return true if message.include?('skip link') || message.include?('Skip link')
72
+
73
+ # ARIA landmarks are warnings (best practice, not always required)
74
+ return true if rule_name == 'aria_landmarks'
75
+
76
+ false
77
+ end
78
+ end
79
+ end
80
+
@@ -5,7 +5,7 @@
5
5
  # Automatically configures accessibility testing for Rails system specs with
6
6
  # comprehensive checks and detailed error messages.
7
7
  #
8
- # @version 1.5.0
8
+ # @version 1.5.5
9
9
  # @author Regan Maharjan
10
10
  #
11
11
  # @example Basic usage
@@ -45,8 +45,16 @@ end
45
45
  # Load core components
46
46
  require_relative 'rails_accessibility_testing/configuration'
47
47
  require_relative 'rails_accessibility_testing/change_detector'
48
+ require_relative 'rails_accessibility_testing/file_change_tracker'
48
49
  require_relative 'rails_accessibility_testing/error_message_builder'
49
50
  require_relative 'rails_accessibility_testing/accessibility_helper'
51
+ # Static scanning components (modular and reusable)
52
+ require_relative 'rails_accessibility_testing/static_page_adapter'
53
+ require_relative 'rails_accessibility_testing/erb_extractor'
54
+ require_relative 'rails_accessibility_testing/line_number_finder'
55
+ require_relative 'rails_accessibility_testing/violation_converter'
56
+ require_relative 'rails_accessibility_testing/static_file_scanner'
57
+ require_relative 'rails_accessibility_testing/static_scanning'
50
58
  # Only load RSpec-specific components when RSpec is available
51
59
  if defined?(RSpec)
52
60
  require_relative 'rails_accessibility_testing/shared_examples'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_accessibility_testing
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.3
4
+ version: 1.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Regan Maharjan
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '1.10'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '1.10'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -75,7 +89,7 @@ email:
75
89
  executables:
76
90
  - rails_a11y
77
91
  - rails_server_safe
78
- - a11y_live_scanner
92
+ - a11y_static_scanner
79
93
  extensions: []
80
94
  extra_rdoc_files: []
81
95
  files:
@@ -92,10 +106,12 @@ files:
92
106
  - README.md
93
107
  - docs_site/404.html
94
108
  - docs_site/Gemfile
109
+ - docs_site/Gemfile.lock
95
110
  - docs_site/Makefile
96
111
  - docs_site/_config.yml
97
112
  - docs_site/_includes/header.html
98
113
  - docs_site/_layouts/default.html
114
+ - docs_site/architecture.md
99
115
  - docs_site/assets/main.scss
100
116
  - docs_site/ci_integration.md
101
117
  - docs_site/configuration.md
@@ -103,6 +119,7 @@ files:
103
119
  - docs_site/getting_started.md
104
120
  - docs_site/index.md
105
121
  - exe/a11y_live_scanner
122
+ - exe/a11y_static_scanner
106
123
  - exe/rails_a11y
107
124
  - exe/rails_server_safe
108
125
  - lib/generators/rails_a11y/install/install_generator.rb
@@ -130,13 +147,20 @@ files:
130
147
  - lib/rails_accessibility_testing/engine/rule_engine.rb
131
148
  - lib/rails_accessibility_testing/engine/violation.rb
132
149
  - lib/rails_accessibility_testing/engine/violation_collector.rb
150
+ - lib/rails_accessibility_testing/erb_extractor.rb
133
151
  - lib/rails_accessibility_testing/error_message_builder.rb
152
+ - lib/rails_accessibility_testing/file_change_tracker.rb
134
153
  - lib/rails_accessibility_testing/integration/minitest_integration.rb
154
+ - lib/rails_accessibility_testing/line_number_finder.rb
135
155
  - lib/rails_accessibility_testing/middleware/page_visit_logger.rb
136
156
  - lib/rails_accessibility_testing/railtie.rb
137
157
  - lib/rails_accessibility_testing/rspec_integration.rb
138
158
  - lib/rails_accessibility_testing/shared_examples.rb
159
+ - lib/rails_accessibility_testing/static_file_scanner.rb
160
+ - lib/rails_accessibility_testing/static_page_adapter.rb
161
+ - lib/rails_accessibility_testing/static_scanning.rb
139
162
  - lib/rails_accessibility_testing/version.rb
163
+ - lib/rails_accessibility_testing/violation_converter.rb
140
164
  - lib/tasks/accessibility.rake
141
165
  homepage: https://rayraycodes.github.io/rails-accessibility-testing/
142
166
  licenses: