userlist 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0daab0d50220fa6b5c0d48e80d7f111a8210bf056e0bc3d6a6cdfaf83eaaa3ee
4
- data.tar.gz: d0affd71246a055a7d9df690e46b367d51843374fa997c8d8966b5305e0f2699
3
+ metadata.gz: c8436f1e9a2b5dff59fcceedbe0ce2d334c8288ce231eb0db7da388881efb099
4
+ data.tar.gz: 882e26f3f57562b399c43ad9e47aa16f008e1593042d490ea2b1f0611239347d
5
5
  SHA512:
6
- metadata.gz: 38384feae2887a004965247299dd904e98c00171a124e6c0dd3dbdba8cf35dde5bf1bc585a00191d625232ea84b18a0efac9ac850bbde988d949b5e00d1478a0
7
- data.tar.gz: 4048869ac0a9b1c5f267df46bb33bda34fb6aeb3eac7c0de2af8b88512b9fc16ed60ff2b32193a790696c71cb7285cbd3fd8794c8ceed3cb6f4a3488e6537407
6
+ metadata.gz: 3224339ad8347c83f530907f0a968b0e245d1082c4337becc9be5395437cf39ef6370195e9fcf7a0361d60c34f6acf112a28ca43a3ed202af157bcd192ed0e68
7
+ data.tar.gz: 433c0b6ee940f418f2d4de5ed6dd5cf161f1cc4f10c68a938106591e5518e8e653697cc8b625f3cee591082b528b914d937c01d331ad053cfc6ddfed90d808f5
data/.gitignore CHANGED
@@ -10,3 +10,4 @@
10
10
 
11
11
  # rspec failure tracking
12
12
  .rspec_status
13
+ /.env
data/.rubocop.yml CHANGED
@@ -1,10 +1,10 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.2
2
+ TargetRubyVersion: 2.3
3
3
  Exclude:
4
4
  - 'bin/*'
5
5
  - 'Guardfile'
6
6
 
7
- Metrics/LineLength:
7
+ Layout/LineLength:
8
8
  Enabled: false
9
9
 
10
10
  Metrics/ModuleLength:
@@ -32,13 +32,13 @@ Layout/ElseAlignment:
32
32
  Lint/AssignmentInCondition:
33
33
  Enabled: false
34
34
 
35
- Lint/EndAlignment:
35
+ Layout/EndAlignment:
36
36
  EnforcedStyleAlignWith: start_of_line
37
37
 
38
38
  Layout/AccessModifierIndentation:
39
39
  EnforcedStyle: outdent
40
40
 
41
- Layout/AlignParameters:
41
+ Layout/ParameterAlignment:
42
42
  EnforcedStyle: with_fixed_indentation
43
43
 
44
44
  Style/FrozenStringLiteralComment:
data/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2
4
3
  - 2.3
5
4
  - 2.4
6
5
  - 2.5
7
6
  - 2.6
7
+ - 2.7
data/Gemfile CHANGED
@@ -6,4 +6,4 @@ gemspec
6
6
 
7
7
  gem 'guard-rspec', '~> 4.7'
8
8
  gem 'guard-rubocop', '~> 1.3'
9
- gem 'rubocop', '= 0.68'
9
+ gem 'rubocop', '~> 0.68'
@@ -2,9 +2,11 @@ module Userlist
2
2
  class Config
3
3
  DEFAULT_CONFIGURATION = {
4
4
  push_key: nil,
5
+ push_id: nil,
5
6
  push_endpoint: 'https://push.userlist.io/',
6
7
  push_strategy: :threaded,
7
- log_level: :warn
8
+ log_level: :warn,
9
+ token_lifetime: 3600
8
10
  }.freeze
9
11
 
10
12
  def initialize(config_from_initialize = {})
@@ -36,6 +38,10 @@ module Userlist
36
38
  config == other.config && parent == other.parent
37
39
  end
38
40
 
41
+ def token_lifetime
42
+ self[:token_lifetime]&.to_i
43
+ end
44
+
39
45
  protected
40
46
 
41
47
  attr_reader :config, :parent
@@ -52,7 +58,7 @@ module Userlist
52
58
  end
53
59
 
54
60
  def key?(key)
55
- config.key?(key) || parent && parent.key?(key)
61
+ config.key?(key) || parent&.key?(key)
56
62
  end
57
63
 
58
64
  def [](key)
@@ -10,6 +10,9 @@ module Userlist
10
10
 
11
11
  def initialize(config = {})
12
12
  @config = Userlist.config.merge(config)
13
+
14
+ raise Userlist::ConfigurationError, :push_key unless config.push_key
15
+ raise Userlist::ConfigurationError, :push_endpoint unless config.push_endpoint
13
16
  end
14
17
 
15
18
  def get(endpoint)
@@ -6,8 +6,8 @@ module Userlist
6
6
  end
7
7
 
8
8
  def initialize(attributes = {})
9
- raise ArgumentError, 'Missing required attributes hash' unless attributes
10
- raise ArgumentError, 'Missing required parameter :identifier' unless attributes[:identifier]
9
+ raise Userlist::ArgumentError, 'Missing required attributes hash' unless attributes
10
+ raise Userlist::ArgumentError, 'Missing required parameter :identifier' unless attributes[:identifier]
11
11
 
12
12
  super
13
13
  end
@@ -2,9 +2,9 @@ module Userlist
2
2
  class Push
3
3
  class Event < Resource
4
4
  def initialize(attributes = {})
5
- raise ArgumentError, 'Missing required attributes hash' unless attributes
6
- raise ArgumentError, 'Missing required parameter :name' unless attributes[:name]
7
- raise ArgumentError, 'Missing required parameter :user' unless attributes[:user]
5
+ raise Userlist::ArgumentError, 'Missing required attributes hash' unless attributes
6
+ raise Userlist::ArgumentError, 'Missing required parameter :name' unless attributes[:name]
7
+ raise Userlist::ArgumentError, 'Missing required parameter :user' unless attributes[:user]
8
8
 
9
9
  attributes[:occured_at] ||= Time.now
10
10
 
@@ -20,7 +20,7 @@ module Userlist
20
20
  attr_reader :queue, :worker
21
21
 
22
22
  def stop_worker
23
- worker && worker.stop
23
+ worker&.stop
24
24
  end
25
25
  end
26
26
  end
@@ -2,8 +2,8 @@ module Userlist
2
2
  class Push
3
3
  class User < Resource
4
4
  def initialize(attributes = {})
5
- raise ArgumentError, 'Missing required attributes hash' unless attributes
6
- raise ArgumentError, 'Missing required parameter :identifier' unless attributes[:identifier]
5
+ raise Userlist::ArgumentError, 'Missing required attributes hash' unless attributes
6
+ raise Userlist::ArgumentError, 'Missing required parameter :identifier' unless attributes[:identifier]
7
7
 
8
8
  super
9
9
  end
@@ -0,0 +1,66 @@
1
+ module Userlist
2
+ class Token
3
+ def self.generate(identifier, configuration = {})
4
+ config = Userlist.config.merge(configuration)
5
+
6
+ raise Userlist::ConfigurationError, :push_key unless config.push_key
7
+ raise Userlist::ConfigurationError, :push_id unless config.push_id
8
+ raise Userlist::ArgumentError, 'Missing required identifier' unless identifier
9
+
10
+ now = Time.now.utc.to_i
11
+
12
+ header = {
13
+ kid: config.push_id,
14
+ alg: 'HS256'
15
+ }
16
+
17
+ payload = {
18
+ sub: identifier,
19
+ exp: now + config.token_lifetime,
20
+ iat: now
21
+ }
22
+
23
+ new(payload: payload, header: header, key: config.push_key).to_s
24
+ end
25
+
26
+ def initialize(payload:, header:, key:, algorithm: 'HS256')
27
+ @payload = payload
28
+ @header = header
29
+ @algorithm = algorithm
30
+ @key = key
31
+ end
32
+
33
+ def encoded_header
34
+ encode(header)
35
+ end
36
+
37
+ def encoded_payload
38
+ encode(payload)
39
+ end
40
+
41
+ def encoded_header_and_payload
42
+ "#{encoded_header}.#{encoded_payload}"
43
+ end
44
+
45
+ def signature
46
+ digest = OpenSSL::Digest.new(algorithm.sub('HS', 'SHA'))
47
+ signature = OpenSSL::HMAC.digest(digest, key, encoded_header_and_payload)
48
+
49
+ encode(signature)
50
+ end
51
+
52
+ def to_s
53
+ "#{encoded_header_and_payload}.#{signature}"
54
+ end
55
+
56
+ private
57
+
58
+ attr_reader :payload, :header, :algorithm, :key
59
+
60
+ def encode(payload)
61
+ payload = JSON.generate(payload) unless payload.is_a?(String)
62
+
63
+ Base64.urlsafe_encode64(payload).tr('=', '')
64
+ end
65
+ end
66
+ end
@@ -1,3 +1,3 @@
1
1
  module Userlist
2
- VERSION = '0.3.0'.freeze
2
+ VERSION = '0.4.0'.freeze
3
3
  end
data/lib/userlist.rb CHANGED
@@ -4,8 +4,35 @@ require 'userlist/version'
4
4
  require 'userlist/config'
5
5
  require 'userlist/logging'
6
6
  require 'userlist/push'
7
+ require 'userlist/token'
7
8
 
8
9
  module Userlist
10
+ class Error < StandardError; end
11
+ class ArgumentError < Error; end
12
+ class ConfigurationError < Error
13
+ attr_reader :key
14
+
15
+ def initialize(key)
16
+ @key = key.to_sym
17
+ end
18
+
19
+ def message
20
+ <<~MESSAGE
21
+ Missing required configuration value for `#{key}`
22
+
23
+ Please set a value for `#{key}` using an environment variable:
24
+
25
+ USERLIST_#{key.to_s.upcase}=some-value-here
26
+
27
+ or via the `Userlist.configure` method:
28
+
29
+ Userlist.configure do |config|
30
+ config.#{key} = 'some-value-here'
31
+ end
32
+ MESSAGE
33
+ end
34
+ end
35
+
9
36
  class << self
10
37
  def config
11
38
  @config ||= Userlist::Config.new
data/userlist.gemspec CHANGED
@@ -19,10 +19,11 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.required_ruby_version = '>= 2.2'
22
+ spec.required_ruby_version = '>= 2.3'
23
23
 
24
24
  spec.add_development_dependency 'bundler', '>= 1.15'
25
- spec.add_development_dependency 'rake', '~> 10.0'
25
+ spec.add_development_dependency 'jwt', '~> 2.2'
26
+ spec.add_development_dependency 'rake', '~> 12.3', '>= 12.3.3'
26
27
  spec.add_development_dependency 'rspec', '~> 3.0'
27
28
  spec.add_development_dependency 'webmock', '~> 1.22'
28
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: userlist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benedikt Deicke
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-27 00:00:00.000000000 Z
11
+ date: 2020-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,20 +24,40 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: jwt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.2'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.2'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '10.0'
47
+ version: '12.3'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 12.3.3
34
51
  type: :development
35
52
  prerelease: false
36
53
  version_requirements: !ruby/object:Gem::Requirement
37
54
  requirements:
38
55
  - - "~>"
39
56
  - !ruby/object:Gem::Version
40
- version: '10.0'
57
+ version: '12.3'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 12.3.3
41
61
  - !ruby/object:Gem::Dependency
42
62
  name: rspec
43
63
  requirement: !ruby/object:Gem::Requirement
@@ -102,6 +122,7 @@ files:
102
122
  - lib/userlist/push/strategies/threaded.rb
103
123
  - lib/userlist/push/strategies/threaded/worker.rb
104
124
  - lib/userlist/push/user.rb
125
+ - lib/userlist/token.rb
105
126
  - lib/userlist/version.rb
106
127
  - userlist.gemspec
107
128
  homepage: http://github.com/userlistio/userlist-ruby
@@ -116,14 +137,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
137
  requirements:
117
138
  - - ">="
118
139
  - !ruby/object:Gem::Version
119
- version: '2.2'
140
+ version: '2.3'
120
141
  required_rubygems_version: !ruby/object:Gem::Requirement
121
142
  requirements:
122
143
  - - ">="
123
144
  - !ruby/object:Gem::Version
124
145
  version: '0'
125
146
  requirements: []
126
- rubygems_version: 3.0.3
147
+ rubygems_version: 3.0.4
127
148
  signing_key:
128
149
  specification_version: 4
129
150
  summary: Ruby wrapper for the Userlist.io API