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 +5 -5
- data/.gitignore +1 -0
- data/.rubocop.yml +8 -0
- data/Gemfile +4 -0
- data/README.md +11 -0
- data/Rakefile +3 -0
- data/lib/snowplow_ruby_duid.rb +5 -2
- data/lib/snowplow_ruby_duid/configuration.rb +30 -0
- data/lib/snowplow_ruby_duid/cookie.rb +18 -7
- data/lib/snowplow_ruby_duid/domain_userid.rb +6 -5
- data/lib/snowplow_ruby_duid/helper.rb +9 -5
- data/lib/snowplow_ruby_duid/version.rb +3 -1
- data/snowplow_ruby_duid.gemspec +10 -8
- data/spec/lib/snowplow_ruby_duid/cookie.feature +21 -0
- data/spec/lib/snowplow_ruby_duid/cookie_spec.rb +44 -21
- data/spec/lib/snowplow_ruby_duid/domain_userid_spec.rb +3 -1
- data/spec/lib/snowplow_ruby_duid/helper_spec.rb +2 -0
- data/spec/spec_helper.rb +2 -0
- metadata +43 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 972f7e668aa1cb73bf11332da5c932206133bc59af99c4a4cdfc1d4598ab1d6b
|
4
|
+
data.tar.gz: de197f60ee4fd72f040b4fbc6539ff3d58c9e734cd7f16f69de02239b483553e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc84fb92fa343c0f5d264429b4e2f9e1d2ddb42fdd5fbc46e9f73c3cde26b12c041fa0215198b5515e87f8f033b09924f303fe1e50df0378a57c8f9b05904bd4
|
7
|
+
data.tar.gz: 2fbed46e0c38efba11bf3665e17846cc27c6960d17edb7308c6f5e94f4d5c2bde2c49bd080eeab4b2c0bbc32bad201dd2f2478dbc00b72ba8143c8e150c9f69d
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
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`
|
data/Rakefile
ADDED
data/lib/snowplow_ruby_duid.rb
CHANGED
@@ -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'
|
10
|
+
KEY_PREFIX = '_sp_id'
|
8
11
|
end
|
9
12
|
|
10
|
-
ActionController::Base.
|
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 = '/'
|
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
|
-
|
31
|
+
|
32
|
+
base = {
|
33
|
+
value: cookie_value,
|
29
34
|
expires: cookie_expiration,
|
30
|
-
domain:
|
31
|
-
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
|
-
#
|
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.
|
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
|
-
|
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
|
data/snowplow_ruby_duid.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
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'
|
22
|
-
spec.add_development_dependency 'rack-test'
|
23
|
-
spec.add_development_dependency '
|
24
|
-
spec.add_development_dependency '
|
25
|
-
spec.add_development_dependency '
|
26
|
-
spec.add_development_dependency '
|
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 = (
|
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 {
|
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:
|
21
|
-
expires: (
|
22
|
-
path:
|
23
|
-
|
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 = (
|
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
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
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(
|
9
|
+
expect(subject.length).to eq(36)
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
data/spec/spec_helper.rb
CHANGED
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:
|
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: '
|
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: '
|
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
|
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
|
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: '
|
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: '
|
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
|
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
|
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: '
|
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: '
|
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
|
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
|
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:
|
157
|
+
version: 1.3.1
|
142
158
|
requirements: []
|
143
|
-
|
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:
|