bbc-a11y 0.0.15 → 0.0.16

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17ede39ffd3b5ba558b9981710dd720808ffc5b6
4
- data.tar.gz: dc7906e1b703f766942c30cefcbe35c87a30cc10
3
+ metadata.gz: 8dd9e7e73e7a90b1f1a0151176196f940e149c8e
4
+ data.tar.gz: f793efc23dc248e5c1261368ea5f5ec0c2ec3e16
5
5
  SHA512:
6
- metadata.gz: 1a73e2a295bbb009a9d8e1626cee41321903010a3cdb95c52030375bc7b1db665c2cb0cee1e07c52af9ac00cd5c7eff90b2dbf1d35555ea5278a28ddb5410556
7
- data.tar.gz: f623f9903f1f290bc2830e802116ece5c323682433f255012f7ce4a93b7156441cddcf99534e0db1730737811150c725d06ca8d3afb742d1eac010700e656884
6
+ metadata.gz: db950a702d499d56739b17087ee83b69ffd62c0548ee91e9b91d3dfa1e4d8dcfd740505dfcd708803be56690f2913e4994b008c516fefbd79dde54b80720a012
7
+ data.tar.gz: 9c2706280a6e6767469c2af7c1fea8c6abb1d88288034b02dd4c34742e518eaa22aa3cef34255c2a9505a0349f0d39179d838de090a28e8ff458c8d4f5757535
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  This project is still at an experimental / proof-of-concept stage. Please set your expectations appropriately, but *do* [give us as much feedback](https://github.com/cucumber-ltd/bbc-a11y/issues) as you can.
6
6
 
7
- #BBC Accessiblity Standards
7
+ #BBC Accessibility Standards
8
8
 
9
9
  This tool runs a set of tests against a set of URLs to verify whether each one meets the [BBC accessibility standards](http://www.bbc.co.uk/guidelines/futuremedia/accessibility/).
10
10
 
@@ -26,7 +26,7 @@ Feature: Headings
26
26
  When I validate the heading standards
27
27
  Then it fails with the message:
28
28
  """
29
- A document must have exactly one heading. Found 0 h1 elements.
29
+ A document must have exactly one main heading. Found 0 h1 elements.
30
30
  """
31
31
 
32
32
  Scenario: More than one main heading
@@ -39,7 +39,7 @@ Feature: Headings
39
39
  When I validate the heading standards
40
40
  Then it fails with the message:
41
41
  """
42
- A document must have exactly one heading. Found 2 h1 elements.
42
+ A document must have exactly one main heading. Found 2 h1 elements.
43
43
  """
44
44
 
45
45
  Scenario: Headings in ascending order
@@ -0,0 +1,40 @@
1
+ Feature: Correctly use `title` attributes
2
+
3
+ `title` attributes **must not** be used for critical information and **must not** repeat content that is already visible and associated with the same control or content.
4
+
5
+ Rationale
6
+ =========
7
+
8
+ `title` attributes are inaccessible to keyboard users without additional Assistive Technology. They are dependent on user settings in Screen Readers and similar Assistive Technology.
9
+
10
+ Additionally they suffer from discoverability problems: pointing device users are required to hover over page elements and pause before the title tooltip displays, usually with no indication that there is additional content to be displayed.
11
+
12
+ Repeating content in visible text and `title` attributes can lead to content clutter and repeated phrases.
13
+
14
+ Key recommendations are:
15
+
16
+ - Do not use the `title` attribute unless on a form input as title text is not well supported on links on mobile
17
+ - Do not use `title` attributes and explicit labels together on form fields
18
+
19
+ Scenario: Form field with title attribute
20
+ Given a page with the HTML:
21
+ """
22
+ <button type="button" title="Close Button">
23
+ <img src="close.png" />
24
+ </button>
25
+ """
26
+ When I validate the title attribute standards
27
+ Then it passes
28
+
29
+ Scenario: Anchor tag with title attribute
30
+ Given a page with the HTML:
31
+ """
32
+ <a href="close" title="Close Button">
33
+ <img src="close.png" />
34
+ </a>
35
+ """
36
+ When I validate the title attribute standards
37
+ Then it fails with the message:
38
+ """
39
+ Element (not a form input) has a title attribute: /html/body/a
40
+ """
@@ -3,8 +3,8 @@ Feature: Display failing result
3
3
  Scenario: One standard fails
4
4
  Given a website running at http://localhost:54321
5
5
  When I run `a11y http://localhost:54321/missing_header.html`
6
- Then it should fail with exactly:
6
+ Then it should fail with:
7
7
  """
8
8
  ✗ http://localhost:54321/missing_header.html
9
- - A document must have exactly one heading. Found 0 h1 elements.
9
+ - A document must have exactly one main heading. Found 0 h1 elements.
10
10
  """
@@ -0,0 +1,17 @@
1
+ Feature: Display result summary
2
+
3
+ Scenario: Summarises pages checked and standard results
4
+ Given a website running at http://localhost:54321
5
+ And a file named "a11y.rb" with:
6
+ """
7
+ page "http://localhost:54321/perfect.html"
8
+ page "http://localhost:54321/missing_header.html"
9
+ page "http://localhost:54321/missing_header.html?again!" do
10
+ skip_standard /ExactlyOneMainHeading/
11
+ end
12
+ """
13
+ When I run `a11y`
14
+ Then it should fail with:
15
+ """
16
+ Tested 3 pages, errors: 1, skipped: 1
17
+ """
@@ -3,7 +3,7 @@ Feature: Specify URL
3
3
  Scenario: No config, just pass page URL on command-line
4
4
  Given a website running at http://localhost:54321
5
5
  When I run `a11y http://localhost:54321/perfect.html`
6
- Then it should pass with exactly:
6
+ Then it should pass with:
7
7
  """
8
8
  ✓ http://localhost:54321/perfect.html
9
9
  """
@@ -19,7 +19,7 @@ Feature: Mute errors
19
19
  When I validate the exactly one main heading standard
20
20
  Then it fails with the message:
21
21
  """
22
- A document must have exactly one heading. Found 0 h1 elements.
22
+ A document must have exactly one main heading. Found 0 h1 elements.
23
23
  """
24
24
  When I add a configuration with:
25
25
  """
@@ -1,6 +1,7 @@
1
1
  # coding: UTF-8
2
2
  require 'bbc/a11y/configuration'
3
3
  require 'bbc/a11y/linter'
4
+ require 'bbc/a11y/runner'
4
5
  require 'open-uri'
5
6
  require 'capybara'
6
7
  require 'colorize'
@@ -14,32 +15,29 @@ module BBC
14
15
  end
15
16
 
16
17
  def call
17
- all_errors = []
18
- settings.pages.each do |page_settings|
19
- errors = check_standards_for(page_settings)
20
- if errors.empty?
21
- stdout.puts "✓ #{page_settings.url}".colorize(:green)
22
- else
23
- stdout.puts "✗ #{page_settings.url}".colorize(:red)
24
- stdout.puts errors.map { |error|
25
- " - #{error}"
26
- }.join("\n")
27
- end
28
- all_errors += errors
29
- end
30
- exit 1 unless all_errors.empty?
18
+ Runner.new(settings, self).run
19
+ exit 1 if @any_errors
31
20
  rescue Configuration::ParseError => error
32
21
  exit_with_message error.message
33
22
  end
34
23
 
35
- private
24
+ def page_tested(page_settings, errors)
25
+ if errors.empty?
26
+ stdout.puts "✓ #{page_settings.url}".colorize(:green)
27
+ else
28
+ stdout.puts "✗ #{page_settings.url}".colorize(:red)
29
+ stdout.puts errors.map { |error| " - #{error}" }.join("\n")
30
+ end
31
+ stdout.puts ""
32
+ end
36
33
 
37
- def check_standards_for(page_settings)
38
- standards = Standards.for(page_settings)
39
- html = open(page_settings.url).read
40
- Linter.new(Capybara.string(html), standards).run.errors.to_a
34
+ def all_pages_tested(summary)
35
+ stdout.puts "Tested #{summary.pages} pages, errors: #{summary.errors}, skipped: #{summary.skips}"
36
+ @any_errors = summary.fail?
41
37
  end
42
38
 
39
+ private
40
+
43
41
  def settings
44
42
  return Configuration.for_urls(@args) if @args.any?
45
43
  configuration_file = File.expand_path("a11y.rb")
@@ -0,0 +1,48 @@
1
+ require 'bbc/a11y/standards'
2
+
3
+ module BBC
4
+ module A11y
5
+ class Runner
6
+ def initialize(settings, listener)
7
+ @settings = settings
8
+ @listener = listener
9
+ end
10
+
11
+ def run
12
+ @summary = RunSummary.new
13
+ @summary.pages = @settings.pages.size
14
+ @settings.pages.each do |page_settings|
15
+ errors = check_standards_for(page_settings)
16
+ @summary.errors += errors.size
17
+ @listener.page_tested(page_settings, errors)
18
+ end
19
+ @listener.all_pages_tested(@summary)
20
+ end
21
+
22
+ private
23
+
24
+ def check_standards_for(page_settings)
25
+ standards = Standards.for(page_settings)
26
+ @summary.skips += Standards.all.size - standards.size
27
+ html = open(page_settings.url).read
28
+ Linter.new(Capybara.string(html), standards).run.errors.to_a
29
+ end
30
+
31
+ class RunSummary
32
+ def initialize
33
+ @pages = 0
34
+ @errors = 0
35
+ @skips = 0
36
+ end
37
+
38
+ attr_accessor :pages
39
+ attr_accessor :errors
40
+ attr_accessor :skips
41
+
42
+ def fail?
43
+ @errors > 0
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -8,6 +8,7 @@ require 'bbc/a11y/standards/heading_hierarchy'
8
8
  require 'bbc/a11y/standards/image_alt'
9
9
  require 'bbc/a11y/standards/language_attribute'
10
10
  require 'bbc/a11y/standards/tab_index'
11
+ require 'bbc/a11y/standards/title_attribute'
11
12
 
12
13
  module BBC
13
14
  module A11y
@@ -35,7 +36,8 @@ module BBC
35
36
  ExactlyOneMainHeading,
36
37
  ExactlyOneMainLandmark,
37
38
  LanguageAttribute,
38
- TabIndex
39
+ TabIndex,
40
+ TitleAttribute
39
41
  ]
40
42
  end
41
43
  end
@@ -9,7 +9,7 @@ module BBC
9
9
  def call(errors)
10
10
  count = @page.all('h1').size
11
11
  if count != 1
12
- errors << "A document must have exactly one heading." +
12
+ errors << "A document must have exactly one main heading." +
13
13
  " Found #{count} h1 elements."
14
14
  end
15
15
  end
@@ -0,0 +1,31 @@
1
+ module BBC
2
+ module A11y
3
+ module Standards
4
+ class TitleAttribute
5
+ def initialize(page)
6
+ @page = page
7
+ end
8
+
9
+ def call(errors)
10
+ @page.all("[title]").each do |element|
11
+ unless form_input? element
12
+ errors << "Element (not a form input) has a title " +
13
+ "attribute: #{element.path}"
14
+ end
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def form_input?(element)
21
+ form_input_tags.include? element.tag_name.downcase
22
+ end
23
+
24
+ def form_input_tags
25
+ ['input', 'button', 'select', 'textarea']
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1 +1 @@
1
- 0.0.15
1
+ 0.0.16
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bbc-a11y
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Wynne
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-12-09 00:00:00.000000000 Z
12
+ date: 2015-12-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: capybara
@@ -146,7 +146,9 @@ files:
146
146
  - features/check_standards/language.feature
147
147
  - features/check_standards/main_landmark.feature
148
148
  - features/check_standards/tab_index.feature
149
+ - features/check_standards/title_attribute.feature
149
150
  - features/cli/display_failing_result.feature
151
+ - features/cli/display_result_summary.feature
150
152
  - features/cli/exit_status.feature
151
153
  - features/cli/provide_muting_tips.feature
152
154
  - features/cli/report_configuration_errors.feature
@@ -162,6 +164,7 @@ files:
162
164
  - lib/bbc/a11y/cli.rb
163
165
  - lib/bbc/a11y/configuration.rb
164
166
  - lib/bbc/a11y/linter.rb
167
+ - lib/bbc/a11y/runner.rb
165
168
  - lib/bbc/a11y/standards.rb
166
169
  - lib/bbc/a11y/standards/anchor_hrefs.rb
167
170
  - lib/bbc/a11y/standards/content_follows_headings.rb
@@ -173,6 +176,7 @@ files:
173
176
  - lib/bbc/a11y/standards/image_alt.rb
174
177
  - lib/bbc/a11y/standards/language_attribute.rb
175
178
  - lib/bbc/a11y/standards/tab_index.rb
179
+ - lib/bbc/a11y/standards/title_attribute.rb
176
180
  - lib/bbc/a11y/version
177
181
  - spec/bbc/a11y/cli_spec.rb
178
182
  - spec/bbc/a11y/configuration_spec.rb
@@ -230,7 +234,7 @@ rubyforge_project:
230
234
  rubygems_version: 2.4.5.1
231
235
  signing_key:
232
236
  specification_version: 4
233
- summary: bbc-a11y-0.0.15
237
+ summary: bbc-a11y-0.0.16
234
238
  test_files:
235
239
  - features/README.md
236
240
  - features/check_standards/focusable_controls.feature
@@ -241,7 +245,9 @@ test_files:
241
245
  - features/check_standards/language.feature
242
246
  - features/check_standards/main_landmark.feature
243
247
  - features/check_standards/tab_index.feature
248
+ - features/check_standards/title_attribute.feature
244
249
  - features/cli/display_failing_result.feature
250
+ - features/cli/display_result_summary.feature
245
251
  - features/cli/exit_status.feature
246
252
  - features/cli/provide_muting_tips.feature
247
253
  - features/cli/report_configuration_errors.feature