govuk_ab_testing 2.4.3 → 3.0.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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +12 -3
- data/.ruby-version +1 -1
- data/CHANGELOG.md +7 -0
- data/README.md +5 -8
- data/govuk_ab_testing.gemspec +2 -2
- data/lib/govuk_ab_testing/ab_test.rb +3 -6
- data/lib/govuk_ab_testing/abstract_helpers.rb +7 -25
- data/lib/govuk_ab_testing/acceptance_tests/active_support.rb +0 -1
- data/lib/govuk_ab_testing/acceptance_tests/capybara.rb +0 -1
- data/lib/govuk_ab_testing/acceptance_tests/meta_tag.rb +2 -3
- data/lib/govuk_ab_testing/minitest_assertions.rb +1 -1
- data/lib/govuk_ab_testing/requested_variant.rb +1 -5
- data/lib/govuk_ab_testing/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d473c839937d932bfad0e7dc33673c907f47dedffdf15d1b5bc4bd2d9c61df1
|
4
|
+
data.tar.gz: 4ba58b2b6b499b8b670fff033740d3efb8ce421a0d5f561a58bb4b028968fd36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e5f893dcd4b96da54646fa5f951f7949f1d3e499cc51fe84b22b3869f281857ca74259ee927a4337a50a34dc50b6ef24460f578ed3af38c26b0c8dde0cad366
|
7
|
+
data.tar.gz: b438372d3a2a309acbe83dde157cd09a5a9f857ddf03ad28009e10cd212cb4034716b831fa87f41c301ee892329f9c5e3f47d8d23eb49dd34e2f3a9135f6b752
|
data/.github/workflows/ci.yml
CHANGED
@@ -1,16 +1,25 @@
|
|
1
1
|
on: [push, pull_request]
|
2
2
|
|
3
3
|
jobs:
|
4
|
+
codeql-sast:
|
5
|
+
name: CodeQL SAST scan
|
6
|
+
uses: alphagov/govuk-infrastructure/.github/workflows/codeql-analysis.yml@main
|
7
|
+
permissions:
|
8
|
+
security-events: write
|
9
|
+
|
10
|
+
dependency-review:
|
11
|
+
name: Dependency Review scan
|
12
|
+
uses: alphagov/govuk-infrastructure/.github/workflows/dependency-review.yml@main
|
13
|
+
|
4
14
|
# This matrix job runs the test suite against multiple Ruby versions
|
5
15
|
test_matrix:
|
6
16
|
strategy:
|
7
17
|
fail-fast: false
|
8
18
|
matrix:
|
9
|
-
|
10
|
-
ruby: ['3.0', 3.1, 3.2]
|
19
|
+
ruby: [3.1, 3.2, 3.3]
|
11
20
|
runs-on: ubuntu-latest
|
12
21
|
steps:
|
13
|
-
- uses: actions/checkout@
|
22
|
+
- uses: actions/checkout@v4
|
14
23
|
- uses: ruby/setup-ruby@v1
|
15
24
|
with:
|
16
25
|
ruby-version: ${{ matrix.ruby }}
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.1.4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## 3.0.0
|
2
|
+
|
3
|
+
* Drop support for Ruby 3.0. The minimum required Ruby version is now 3.1
|
4
|
+
* **BREAKING CHANGE** No longer allow a GA custom dimension to be passed
|
5
|
+
when creating a GovukAbTesting::AbTest object. The dimension parameter
|
6
|
+
needs to be removed.
|
7
|
+
|
1
8
|
## 2.4.3
|
2
9
|
|
3
10
|
* Updated gem dependencies and development ruby version to 3.0.5
|
data/README.md
CHANGED
@@ -18,19 +18,18 @@ And then execute:
|
|
18
18
|
|
19
19
|
Before starting this, you'll need to:
|
20
20
|
|
21
|
-
- [Read the documentation](https://docs.publishing.service.gov.uk/manual/ab-testing.html) for an overview on how a/b testing works on GOV.UK.
|
21
|
+
- [Read the documentation](https://docs.publishing.service.gov.uk/manual/ab-testing.html) for an overview on how a/b testing works on GOV.UK.
|
22
22
|
- The cookie and header name in [govuk-cdn-config](https://github.com/alphagov/govuk-cdn-config/blob/master/ab_tests/ab_tests.yaml) must match the test name parameter that you pass to the Gem. The cookie name is case-sensitive.
|
23
23
|
|
24
24
|
## Usage
|
25
25
|
|
26
|
-
### Outline
|
26
|
+
### Outline
|
27
27
|
|
28
28
|
To enable testing in the app, your Rails app needs:
|
29
29
|
|
30
30
|
1. [Some piece of logic to be A/B tested](#1-example-ab-test-logic)
|
31
31
|
2. [A response HTTP header that tells Fastly you're doing an A/B test](#2-http-response-header-to-fastly)
|
32
|
-
3. [A HTML meta tag that will be used to measure the results
|
33
|
-
the dimension to use in Google Analytics](#3-add-html-metatag-tags-to-your-layouts)
|
32
|
+
3. [A HTML meta tag that will be used to measure the results in Google Analytics](#3-add-html-metatag-tags-to-your-layouts)
|
34
33
|
|
35
34
|
### 1. Example A/B test logic
|
36
35
|
|
@@ -42,7 +41,6 @@ class PartyController < ApplicationController
|
|
42
41
|
def show
|
43
42
|
ab_test = GovukAbTesting::AbTest.new(
|
44
43
|
"your_ab_test_name",
|
45
|
-
dimension: 300,
|
46
44
|
allowed_variants: ['NoChange', 'LongTitle', 'ShortTitle'],
|
47
45
|
control_variant: 'NoChange'
|
48
46
|
)
|
@@ -63,7 +61,7 @@ end
|
|
63
61
|
|
64
62
|
In this example, we are running a multivariate test with 3 options being
|
65
63
|
tested: the existing version (control), and two title changes. The minimum
|
66
|
-
number of variants in any test should be two.
|
64
|
+
number of variants in any test should be two.
|
67
65
|
|
68
66
|
### 2. HTTP response header to Fastly
|
69
67
|
|
@@ -148,7 +146,6 @@ As with the `minitest` version, you can also pass in the following options to
|
|
148
146
|
`with_variant`:
|
149
147
|
|
150
148
|
- `assert_meta_tag: false`
|
151
|
-
- `dimension: <number>`
|
152
149
|
|
153
150
|
#### Minitest
|
154
151
|
|
@@ -200,7 +197,7 @@ class PartyControllerTest < ActionController::TestCase
|
|
200
197
|
include GovukAbTesting::MinitestHelpers
|
201
198
|
|
202
199
|
should "show the original" do
|
203
|
-
setup_ab_variant("your_ab_test_name", "B")
|
200
|
+
setup_ab_variant("your_ab_test_name", "B")
|
204
201
|
|
205
202
|
get :show
|
206
203
|
|
data/govuk_ab_testing.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.description = "Gem to help with A/B testing on the GOV.UK platform"
|
13
13
|
spec.homepage = "https://github.com/alphagov/govuk_ab_testing"
|
14
14
|
spec.license = "MIT"
|
15
|
-
spec.required_ruby_version = ">= 3.
|
15
|
+
spec.required_ruby_version = ">= 3.1"
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
18
|
f.match(%r{^(test|spec|features)/})
|
@@ -23,6 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
|
24
24
|
spec.add_development_dependency "rake"
|
25
25
|
spec.add_development_dependency "rspec"
|
26
|
-
spec.add_development_dependency "rubocop-govuk", "
|
26
|
+
spec.add_development_dependency "rubocop-govuk", "5.0.2"
|
27
27
|
spec.add_development_dependency "yard"
|
28
28
|
end
|
@@ -1,18 +1,15 @@
|
|
1
1
|
module GovukAbTesting
|
2
2
|
class AbTest
|
3
|
-
attr_reader :ab_test_name, :
|
3
|
+
attr_reader :ab_test_name, :allowed_variants, :control_variant
|
4
4
|
|
5
5
|
alias_method :name, :ab_test_name
|
6
6
|
|
7
7
|
# @param request [String] the name of the A/B test
|
8
|
-
# @param dimension [Integer] the dimension registered with Google Analytics
|
9
|
-
# for this specific A/B test
|
10
8
|
# @param allowed_variants [Array] an array of Strings representing the
|
11
9
|
# possible variants
|
12
10
|
# @param control_variant [String] the control variant (typically 'A')
|
13
|
-
def initialize(ab_test_name,
|
11
|
+
def initialize(ab_test_name, allowed_variants: %w[A B], control_variant: "A")
|
14
12
|
@ab_test_name = ab_test_name
|
15
|
-
@dimension = dimension
|
16
13
|
@allowed_variants = allowed_variants
|
17
14
|
@control_variant = control_variant
|
18
15
|
end
|
@@ -20,7 +17,7 @@ module GovukAbTesting
|
|
20
17
|
# @param request [ActionDispatch::Http::Headers] the `request.headers` in
|
21
18
|
# the controller.
|
22
19
|
def requested_variant(request_headers)
|
23
|
-
RequestedVariant.new(self, request_headers
|
20
|
+
RequestedVariant.new(self, request_headers)
|
24
21
|
end
|
25
22
|
|
26
23
|
# Internal name of the header
|
@@ -6,26 +6,25 @@ module GovukAbTesting
|
|
6
6
|
|
7
7
|
def with_variant(args)
|
8
8
|
ab_test_name, variant = args.first
|
9
|
-
dimension = args[:dimension]
|
10
9
|
|
11
|
-
setup_ab_variant(ab_test_name, variant
|
10
|
+
setup_ab_variant(ab_test_name, variant)
|
12
11
|
|
13
12
|
yield
|
14
13
|
|
15
14
|
assert_response_is_cached_by_variant(ab_test_name)
|
16
15
|
|
17
16
|
unless args[:assert_meta_tag] == false
|
18
|
-
assert_page_tracked_in_ab_test(ab_test_name, variant
|
17
|
+
assert_page_tracked_in_ab_test(ab_test_name, variant)
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
22
|
-
def setup_ab_variant(ab_test_name, variant
|
23
|
-
ab_test = AbTest.new(ab_test_name
|
21
|
+
def setup_ab_variant(ab_test_name, variant)
|
22
|
+
ab_test = AbTest.new(ab_test_name)
|
24
23
|
acceptance_test_framework.set_header(ab_test.request_header, variant)
|
25
24
|
end
|
26
25
|
|
27
26
|
def assert_response_is_cached_by_variant(ab_test_name)
|
28
|
-
ab_test = AbTest.new(ab_test_name
|
27
|
+
ab_test = AbTest.new(ab_test_name)
|
29
28
|
vary_header_value = acceptance_test_framework.vary_header
|
30
29
|
|
31
30
|
assert_contains_substring(
|
@@ -72,8 +71,8 @@ module GovukAbTesting
|
|
72
71
|
)
|
73
72
|
end
|
74
73
|
|
75
|
-
def assert_page_tracked_in_ab_test(ab_test_name, variant
|
76
|
-
ab_test = AbTest.new(ab_test_name
|
74
|
+
def assert_page_tracked_in_ab_test(ab_test_name, variant)
|
75
|
+
ab_test = AbTest.new(ab_test_name)
|
77
76
|
|
78
77
|
ab_test_meta_tags =
|
79
78
|
acceptance_test_framework.analytics_meta_tags_for_test(ab_test.name)
|
@@ -104,23 +103,6 @@ module GovukAbTesting
|
|
104
103
|
|
105
104
|
ERROR
|
106
105
|
)
|
107
|
-
|
108
|
-
assert_not_blank(
|
109
|
-
string: meta_tag.dimension,
|
110
|
-
error_message: <<-ERROR,
|
111
|
-
The meta tag dimension for the '#{ab_test_name}' A/B test is blank.
|
112
|
-
ERROR
|
113
|
-
)
|
114
|
-
|
115
|
-
unless ab_test.dimension.nil?
|
116
|
-
assert_is_equal(
|
117
|
-
expected: ab_test.dimension.to_s,
|
118
|
-
actual: meta_tag.dimension.to_s,
|
119
|
-
error_message: <<-ERROR,
|
120
|
-
The analytics meta tag for the '#{ab_test.name}' A/B test does not match the expected value.
|
121
|
-
ERROR
|
122
|
-
)
|
123
|
-
end
|
124
106
|
end
|
125
107
|
end
|
126
108
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module GovukAbTesting
|
2
2
|
module AcceptanceTests
|
3
3
|
class MetaTag
|
4
|
-
attr_reader :content
|
4
|
+
attr_reader :content
|
5
5
|
|
6
|
-
def initialize(content
|
6
|
+
def initialize(content:)
|
7
7
|
@content = content
|
8
|
-
@dimension = dimension
|
9
8
|
end
|
10
9
|
|
11
10
|
def for_ab_test?(ab_test_name)
|
@@ -17,7 +17,7 @@ module GovukAbTesting
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def assert_is_empty(enumerable:, error_message:)
|
20
|
-
assert_has_size(enumerable
|
20
|
+
assert_has_size(enumerable:, size: 0, error_message:)
|
21
21
|
end
|
22
22
|
|
23
23
|
def assert_not_blank(string:, error_message:)
|
@@ -5,12 +5,9 @@ module GovukAbTesting
|
|
5
5
|
# @param ab_test [AbTest] the A/B test being performed
|
6
6
|
# @param request_headers [ActionDispatch::Http::Headers] the
|
7
7
|
# `request.headers` in the controller.
|
8
|
-
|
9
|
-
# for this specific A/B test
|
10
|
-
def initialize(ab_test, request_headers, dimension)
|
8
|
+
def initialize(ab_test, request_headers)
|
11
9
|
@ab_test = ab_test
|
12
10
|
@request_headers = request_headers
|
13
|
-
@dimension = dimension
|
14
11
|
end
|
15
12
|
|
16
13
|
# Get the bucket this user is in
|
@@ -66,7 +63,6 @@ module GovukAbTesting
|
|
66
63
|
tag = <<~HTML
|
67
64
|
<meta name="govuk:ab-test"
|
68
65
|
content="#{ab_test.meta_tag_name}:#{variant_name}"
|
69
|
-
data-analytics-dimension="#{@dimension}"
|
70
66
|
data-allowed-variants="#{ab_test.allowed_variants.join(',')}">
|
71
67
|
HTML
|
72
68
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: govuk_ab_testing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GOV.UK Dev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 5.0.2
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 5.0.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: yard
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,14 +112,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
112
112
|
requirements:
|
113
113
|
- - ">="
|
114
114
|
- !ruby/object:Gem::Version
|
115
|
-
version: '3.
|
115
|
+
version: '3.1'
|
116
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
117
|
requirements:
|
118
118
|
- - ">="
|
119
119
|
- !ruby/object:Gem::Version
|
120
120
|
version: '0'
|
121
121
|
requirements: []
|
122
|
-
rubygems_version: 3.
|
122
|
+
rubygems_version: 3.5.17
|
123
123
|
signing_key:
|
124
124
|
specification_version: 4
|
125
125
|
summary: Gem to help with A/B testing on the GOV.UK platform
|