snowplow_ruby_duid 1.0.1 → 1.1.0.prerelease.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c2818143e193e501a987cbaca0dfcb084010d012
4
- data.tar.gz: 4b6295b77691331a88608578c46a95e749a6e241
2
+ SHA256:
3
+ metadata.gz: 972f7e668aa1cb73bf11332da5c932206133bc59af99c4a4cdfc1d4598ab1d6b
4
+ data.tar.gz: de197f60ee4fd72f040b4fbc6539ff3d58c9e734cd7f16f69de02239b483553e
5
5
  SHA512:
6
- metadata.gz: 63df7f00beb0850f36f54505a5f239339432c8306e9e9a424402da2a0727cb4567c4867d77a6766a75160f8c12b082d3f0c906a5b2e7fa922a0f0fdf9836da97
7
- data.tar.gz: 0a791495bf59396b38481f9efb025ede2907ca12413a6c1b2f21e026b4cf277d57e3a558a0248bebaeca2b1ebdb7157f77fbaef5496d93a8fa5e35e5b0385274
6
+ metadata.gz: dc84fb92fa343c0f5d264429b4e2f9e1d2ddb42fdd5fbc46e9f73c3cde26b12c041fa0215198b5515e87f8f033b09924f303fe1e50df0378a57c8f9b05904bd4
7
+ data.tar.gz: 2fbed46e0c38efba11bf3665e17846cc27c6960d17edb7308c6f5e94f4d5c2bde2c49bd080eeab4b2c0bbc32bad201dd2f2478dbc00b72ba8143c8e150c9f69d
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  *.gem
2
+ .ruby-version
2
3
  Gemfile.lock
@@ -4,3 +4,11 @@ Metrics/LineLength:
4
4
  Style/BlockDelimiters:
5
5
  Exclude:
6
6
  - 'spec/lib/snowplow_ruby_duid/cookie_spec.rb'
7
+
8
+ Metrics/BlockLength:
9
+ Exclude:
10
+ - 'spec/**/*.rb'
11
+
12
+ Style/DateTime:
13
+ Exclude:
14
+ - 'lib/snowplow_ruby_duid/cookie.rb'
data/Gemfile CHANGED
@@ -1,4 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
5
+ gem 'pry'
6
+
3
7
  # Specify your gem's dependencies in snowplow_ruby_duid.gemspec
4
8
  gemspec
data/README.md CHANGED
@@ -14,6 +14,17 @@ gem 'snowplow_ruby_duid'
14
14
 
15
15
  The helper will be included in `ActionController::Base` when the gem is loaded.
16
16
 
17
+ #### Configuration
18
+
19
+ Since 2020 some browsers require extra settings on cookies, like SameSite and secure settings.
20
+
21
+ The library provides default values for these two settings(:none, true), that you can change:
22
+
23
+ ```ruby
24
+ SnowplowRubyDuid::Configuration.same_site = :lax
25
+ SnowplowRubyDuid::Configuration.secure = false
26
+ ```
27
+
17
28
  ### Sinatra
18
29
 
19
30
  Add the following to `Sinatra::Base`
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
@@ -1,10 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'digest/sha1'
4
+ require 'snowplow_ruby_duid/configuration'
2
5
  require 'snowplow_ruby_duid/cookie'
3
6
  require 'snowplow_ruby_duid/domain_userid'
4
7
  require 'snowplow_ruby_duid/helper'
5
8
 
6
9
  module SnowplowRubyDuid
7
- KEY_PREFIX = '_sp_id'.freeze
10
+ KEY_PREFIX = '_sp_id'
8
11
  end
9
12
 
10
- ActionController::Base.send :include, SnowplowRubyDuid::Helper if defined?(ActionController)
13
+ ActionController::Base.include SnowplowRubyDuid::Helper if defined?(ActionController)
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnowplowRubyDuid
4
+ # This is the configuration object that is used for two additional cookie settings
5
+ # that can't be deferred from the request/response objects
6
+ module Configuration
7
+ @allowed = %i[none lax strict]
8
+
9
+ @same_site = :none
10
+ @secure = true
11
+
12
+ def self.same_site=(value)
13
+ raise "Not allowed value #{value}, use one of these: #{@allowed}" unless @allowed.include?(value)
14
+
15
+ @same_site = value
16
+ end
17
+
18
+ def self.secure=(value)
19
+ @secure = value
20
+ end
21
+
22
+ def self.same_site
23
+ @same_site
24
+ end
25
+
26
+ def self.secure
27
+ @secure
28
+ end
29
+ end
30
+ end
@@ -1,18 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SnowplowRubyDuid
2
4
  # Responsible for generating a cookie that emulates the Snowplow cookie as closely as possible
3
5
  # Leverages the method used by ActionDispatch::Cookies::CookieJar to determine the top-level domain
4
6
  class Cookie
5
7
  # See: https://github.com/snowplow/snowplow-javascript-tracker/blob/d3d10067127eb5c95d0054c8ae60f3bdccba619d/src/js/tracker.js#L142
6
- COOKIE_PATH = '/'.freeze
8
+ COOKIE_PATH = '/'
7
9
  # See: https://github.com/snowplow/snowplow-javascript-tracker/blob/d3d10067127eb5c95d0054c8ae60f3bdccba619d/src/js/tracker.js#L156
8
10
  COOKIE_DURATION_MONTHS = 24
9
11
  # See: https://github.com/rails/rails/blob/b1124a2ac88778c0feb0157ac09367cbd204bf01/actionpack/lib/action_dispatch/middleware/cookies.rb#L214
10
- DOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/
12
+ DOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/.freeze
11
13
 
12
- def initialize(host, domain_userid, request_created_at)
14
+ def initialize(host, domain_userid, request_created_at, options = {})
13
15
  @host = host
14
16
  @domain_userid = domain_userid
15
17
  @request_created_at = request_created_at
18
+ @secure = options.fetch(:secure)
19
+ @same_site = options.fetch(:same_site)
16
20
  end
17
21
 
18
22
  # See: https://github.com/snowplow/snowplow-javascript-tracker/blob/d3d10067127eb5c95d0054c8ae60f3bdccba619d/src/js/tracker.js#L358-L360
@@ -24,12 +28,18 @@ module SnowplowRubyDuid
24
28
 
25
29
  def value
26
30
  cookie_domain = ".#{top_level_domain}" unless top_level_domain.nil?
27
- {
28
- value: cookie_value,
31
+
32
+ base = {
33
+ value: cookie_value,
29
34
  expires: cookie_expiration,
30
- domain: cookie_domain,
31
- path: COOKIE_PATH
35
+ domain: cookie_domain,
36
+ path: COOKIE_PATH,
37
+ same_site: @same_site
32
38
  }
39
+
40
+ base.merge!(secure: true) if @secure
41
+
42
+ base
33
43
  end
34
44
 
35
45
  private
@@ -40,6 +50,7 @@ module SnowplowRubyDuid
40
50
  end
41
51
 
42
52
  # See: https://github.com/snowplow/snowplow-javascript-tracker/blob/d3d10067127eb5c95d0054c8ae60f3bdccba619d/src/js/tracker.js#L476-L487
53
+ # https://github.com/snowplow/snowplow-javascript-tracker/blob/2.14.0/src/js/tracker.js#L641-L650
43
54
  def cookie_value
44
55
  visit_count = '0'
45
56
  last_visit_ts = ''
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
1
5
  module SnowplowRubyDuid
2
6
  # Generates a pseudo-unique ID to fingerprint the user
3
- # Deviates from this Snowplow Javascript: https://github.com/snowplow/snowplow-javascript-tracker/blob/d3d10067127eb5c95d0054c8ae60f3bdccba619d/src/js/tracker.js#L468-L472
4
- # in order to provide a more unique identifier
7
+ # It follows Snowplow Javascript: https://github.com/snowplow/snowplow-javascript-tracker/blob/2.14.0/src/js/tracker.js#L670-L672
5
8
  class DomainUserid
6
- LENGTH_OF_DUID_IN_BYTES = 8
7
-
8
9
  def initialize
9
10
  @domain_user_id = domain_user_id
10
11
  end
@@ -16,7 +17,7 @@ module SnowplowRubyDuid
16
17
  private
17
18
 
18
19
  def domain_user_id
19
- SecureRandom.hex LENGTH_OF_DUID_IN_BYTES
20
+ SecureRandom.uuid
20
21
  end
21
22
  end
22
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SnowplowRubyDuid
2
4
  # Exposes a snowplow_domain_userid method in the context
3
5
  # that will find or create a domain_userid, which will be
@@ -7,20 +9,24 @@ module SnowplowRubyDuid
7
9
  @snowplow_domain_userid ||= find_or_create_snowplow_domain_userid
8
10
  end
9
11
 
12
+ private
13
+
10
14
  def find_or_create_snowplow_domain_userid
11
15
  find_snowplow_domain_userid || create_snowplow_domain_userid
12
16
  end
13
- private :find_or_create_snowplow_domain_userid
14
17
 
15
18
  def create_snowplow_domain_userid
16
19
  request_created_at = Time.now
17
20
  domain_userid = DomainUserid.new.to_s
18
- snowplow_cookie = Cookie.new request.host, domain_userid, request_created_at
21
+ options = {
22
+ secure: Configuration.secure,
23
+ same_site: Configuration.same_site
24
+ }
25
+ snowplow_cookie = Cookie.new request.host, domain_userid, request_created_at, options
19
26
 
20
27
  response.set_cookie snowplow_cookie.key, snowplow_cookie.value
21
28
  domain_userid
22
29
  end
23
- private :create_snowplow_domain_userid
24
30
 
25
31
  # See: https://github.com/snowplow/snowplow/wiki/Ruby-Tracker#310-setting-the-domain-user-id-with-set_domain_user_id
26
32
  def find_snowplow_domain_userid
@@ -28,11 +34,9 @@ module SnowplowRubyDuid
28
34
  # The cookie value is in this format: domainUserId.createTs.visitCount.nowTs.lastVisitTs
29
35
  snowplow_cookie.last.split('.').first unless snowplow_cookie.nil?
30
36
  end
31
- private :find_snowplow_domain_userid
32
37
 
33
38
  def find_snowplow_cookie
34
39
  request.cookies.find { |(key, _value)| key =~ /^#{KEY_PREFIX}/ } # result will be an array containing: [key, value]
35
40
  end
36
- private :find_snowplow_cookie
37
41
  end
38
42
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SnowplowRubyDuid
2
- VERSION = '1.0.1'.freeze
4
+ VERSION = '1.1.0.prerelease.1'
3
5
  end
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'snowplow_ruby_duid/version'
5
6
 
@@ -18,10 +19,11 @@ Gem::Specification.new do |spec|
18
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
20
  spec.require_paths = ['lib']
20
21
 
21
- spec.add_development_dependency 'rack', '~> 2.0'
22
- spec.add_development_dependency 'rack-test', '~> 0.6'
23
- spec.add_development_dependency 'rspec', '~> 3.5'
24
- spec.add_development_dependency 'rubocop', '~> 0.46'
25
- spec.add_development_dependency 'rutabaga', '~> 2.1'
26
- spec.add_development_dependency 'timecop', '~> 0.8'
22
+ spec.add_development_dependency 'rack'
23
+ spec.add_development_dependency 'rack-test'
24
+ spec.add_development_dependency 'rake', '~> 10.0'
25
+ spec.add_development_dependency 'rspec'
26
+ spec.add_development_dependency 'rubocop'
27
+ spec.add_development_dependency 'rutabaga'
28
+ spec.add_development_dependency 'timecop'
27
29
  end
@@ -9,6 +9,27 @@ Feature: Creating a Snowplow cookie
9
9
  When I create a Snowplow cookie
10
10
  Then the cookie has the path '/'
11
11
 
12
+ Scenario Outline: The cookie should have same_site configuration
13
+ Given I configure the library and set same_site to equal '<setting>'
14
+ When I create a Snowplow cookie
15
+ Then the cookie has the SameSite attribute equal to '<expected>'
16
+ Examples:
17
+ | setting | expected |
18
+ | | none |
19
+ | none | none |
20
+ | lax | lax |
21
+ | strict | strict |
22
+
23
+ Scenario Outline: The cookie is secure if the configuration is properly passed
24
+ Given I configure library and set secure cookie to <true_false>
25
+ When I create a Snowplow cookie
26
+ Then the cookie's secure setting is '<expected>'
27
+ Examples:
28
+ | true_false | expected |
29
+ | - | set |
30
+ | true | set |
31
+ | false | not_set |
32
+
12
33
  Scenario Outline: The cookie should apply for all domains under the top-level domain (no domain for localhost or IP addresses, however)
13
34
  Given the host is '<host>'
14
35
  When I create a Snowplow cookie
@@ -1,12 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SnowplowRubyDuid
2
4
  describe Cookie do
3
5
  before do
4
6
  @host = 'www.simplybusiness.co.uk'
5
7
  @domain_userid = 'domain_user_id'
6
- @request_created_at = (DateTime.parse '2015-01-22 15:26:31 +0000').to_time
8
+ @request_created_at = (Time.parse '2015-01-22 15:26:31 +0000').to_time
9
+ @same_site = SnowplowRubyDuid::Configuration.same_site
10
+ @secure = SnowplowRubyDuid::Configuration.secure
7
11
  end
8
12
 
9
- subject { described_class.new @host, @domain_userid, @request_created_at }
13
+ subject {
14
+ described_class.new @host, @domain_userid, @request_created_at, { secure: @secure, same_site: @same_site }
15
+ }
10
16
 
11
17
  describe '#key' do
12
18
  it 'generates the key' do
@@ -17,10 +23,12 @@ module SnowplowRubyDuid
17
23
  describe '#value' do
18
24
  it 'generates a cookie' do
19
25
  expect(subject.value).to eq(
20
- domain: '.simplybusiness.co.uk',
21
- expires: (DateTime.parse '2017-01-22 15:26:31 +0000').to_time,
22
- path: '/',
23
- value: 'domain_user_id.1421940391.0.1421940391.'
26
+ domain: '.simplybusiness.co.uk',
27
+ expires: (Time.parse '2017-01-22 15:26:31 +0000').to_time,
28
+ path: '/',
29
+ same_site: :none,
30
+ secure: true,
31
+ value: 'domain_user_id.1421940391.0.1421940391.'
24
32
  )
25
33
  end
26
34
  end
@@ -35,7 +43,19 @@ module SnowplowRubyDuid
35
43
  end
36
44
 
37
45
  step 'the time is :time' do |time|
38
- @request_created_at = (DateTime.parse time).to_time
46
+ @request_created_at = (Time.parse time).to_time
47
+ end
48
+
49
+ step 'I configure library and set secure cookie to :val' do |setting|
50
+ @secure = (setting == 'true') if %w[true false].include?(setting)
51
+ end
52
+
53
+ step 'the cookie\'s secure setting is :set_not_set' do |value|
54
+ if value == 'set'
55
+ expect(subject.value[:secure]).to eq(true)
56
+ else
57
+ expect(subject.value[:secure]).to eq(nil)
58
+ end
39
59
  end
40
60
 
41
61
  step 'I create a Snowplow cookie' do; end
@@ -64,21 +84,24 @@ module SnowplowRubyDuid
64
84
  expect(subject.value[:value]).to eq(value)
65
85
  end
66
86
 
87
+ step 'I configure the library and set same_site to equal :setting' do |setting|
88
+ @same_site = setting.to_sym unless setting.empty?
89
+ end
90
+
91
+ step 'the cookie has the SameSite attribute equal to :value' do |value|
92
+ expect(subject.value[:same_site]).to eq(value.to_sym)
93
+ end
94
+
67
95
  step 'the cookie value for :field is :value' do |field, value|
68
- value_index = case field
69
- when 'domain_userid'
70
- then 0
71
- when 'createTs'
72
- then 1
73
- when 'visitCount'
74
- then 2
75
- when 'nowTs'
76
- then 3
77
- when 'lastVisitTs'
78
- then 4
79
- else
80
- raise "unknown field name: #{field}"
81
- end
96
+ value_indices = {
97
+ 'domain_userid' => 0,
98
+ 'createTs' => 1,
99
+ 'visitCount' => 2,
100
+ 'nowTs' => 3,
101
+ 'lastVisitTs' => 4
102
+ }
103
+
104
+ value_index = value_indices.fetch(field)
82
105
 
83
106
  value = nil if value == ''
84
107
 
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SnowplowRubyDuid
2
4
  describe DomainUserid do
3
5
  subject { described_class.new.to_s }
4
6
 
5
7
  describe '#to_s' do
6
8
  it 'generates the domain userid' do
7
- expect(subject.length).to eq(16)
9
+ expect(subject.length).to eq(36)
8
10
  end
9
11
  end
10
12
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rack'
2
4
  require 'rack/test'
3
5
  require 'timecop'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'time'
2
4
  require 'snowplow_ruby_duid'
3
5
 
metadata CHANGED
@@ -1,99 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snowplow_ruby_duid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0.prerelease.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simply Business
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-02 00:00:00.000000000 Z
11
+ date: 2020-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rack-test
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '0.6'
47
+ version: '10.0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '0.6'
54
+ version: '10.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - "~>"
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
- version: '3.5'
61
+ version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - "~>"
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
- version: '3.5'
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rubocop
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - "~>"
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
- version: '0.46'
75
+ version: '0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - "~>"
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
- version: '0.46'
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rutabaga
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: '2.1'
89
+ version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - "~>"
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: '2.1'
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: timecop
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - "~>"
101
+ - - ">="
88
102
  - !ruby/object:Gem::Version
89
- version: '0.8'
103
+ version: '0'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - "~>"
108
+ - - ">="
95
109
  - !ruby/object:Gem::Version
96
- version: '0.8'
110
+ version: '0'
97
111
  description: A gem that exposes the Snowplow domain userid in Rack applications. Also
98
112
  allows you to set your own domain userid that will be shared with the Snowplow Javascript
99
113
  tracker.
@@ -109,7 +123,9 @@ files:
109
123
  - Gemfile
110
124
  - LICENSE.txt
111
125
  - README.md
126
+ - Rakefile
112
127
  - lib/snowplow_ruby_duid.rb
128
+ - lib/snowplow_ruby_duid/configuration.rb
113
129
  - lib/snowplow_ruby_duid/cookie.rb
114
130
  - lib/snowplow_ruby_duid/domain_userid.rb
115
131
  - lib/snowplow_ruby_duid/helper.rb
@@ -136,12 +152,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
152
  version: '0'
137
153
  required_rubygems_version: !ruby/object:Gem::Requirement
138
154
  requirements:
139
- - - ">="
155
+ - - ">"
140
156
  - !ruby/object:Gem::Version
141
- version: '0'
157
+ version: 1.3.1
142
158
  requirements: []
143
- rubyforge_project:
144
- rubygems_version: 2.4.5.1
159
+ rubygems_version: 3.0.3
145
160
  signing_key:
146
161
  specification_version: 4
147
162
  summary: A gem that exposes the Snowplow domain userid in Rack applications. Also
@@ -154,4 +169,3 @@ test_files:
154
169
  - spec/lib/snowplow_ruby_duid/helper.feature
155
170
  - spec/lib/snowplow_ruby_duid/helper_spec.rb
156
171
  - spec/spec_helper.rb
157
- has_rdoc: