snowplow_ruby_duid 1.0.1 → 1.1.0.prerelease.1
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 +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:
|