eppo-server-sdk 0.0.0 → 0.1.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/lib/client.rb +15 -8
- data/lib/config.rb +1 -1
- data/lib/configuration_requestor.rb +1 -2
- data/lib/constants.rb +6 -1
- data/lib/eppo_client.rb +6 -3
- data/lib/poller.rb +1 -2
- metadata +33 -9
- data/lib/sdk_logger.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d2f2b75ea023c388c50b7db7ad56e017b217c21811310116938f35409153520
|
4
|
+
data.tar.gz: 1fb5b4873b50f1197fcec8ea91ab071d8a5a75c7790e8cd956f011c621a88425
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: debd90881651fa4d3f85d6af2ce71673c59378b3238f7443a2b851f16a762f667198e61f8494d28957da2ecb28dc896c5a99564a54e6fb5ec14ddde0c1a4c06a
|
7
|
+
data.tar.gz: 2559d1d149a37e6dd8f6779511e72532a7a4046feda48e9657939de1db34ba30d2c5d52b5df6d413279f67ff4d9cfcd03a5b905bc723e0d13c236be5295e3a66
|
data/lib/client.rb
CHANGED
@@ -3,11 +3,11 @@
|
|
3
3
|
require 'singleton'
|
4
4
|
require 'time'
|
5
5
|
|
6
|
-
require '
|
6
|
+
require 'constants'
|
7
|
+
require 'custom_errors'
|
7
8
|
require 'rules'
|
8
9
|
require 'shard'
|
9
|
-
require '
|
10
|
-
require 'custom_errors'
|
10
|
+
require 'validation'
|
11
11
|
|
12
12
|
module EppoClient
|
13
13
|
# The main client singleton
|
@@ -20,7 +20,14 @@ module EppoClient
|
|
20
20
|
end
|
21
21
|
|
22
22
|
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
23
|
-
def get_assignment(
|
23
|
+
def get_assignment(
|
24
|
+
subject_key,
|
25
|
+
flag_or_experiment_key,
|
26
|
+
subject_attributes = {},
|
27
|
+
log_level = EppoClient::DEFAULT_LOGGER_LEVEL
|
28
|
+
)
|
29
|
+
logger = Logger.new($stdout)
|
30
|
+
logger.level = log_level
|
24
31
|
EppoClient.validate_not_blank('subject_key', subject_key)
|
25
32
|
EppoClient.validate_not_blank('flag_or_experiment_key', flag_or_experiment_key)
|
26
33
|
experiment_config = @config_requestor.get_configuration(flag_or_experiment_key)
|
@@ -28,7 +35,7 @@ module EppoClient
|
|
28
35
|
return override unless override.nil?
|
29
36
|
|
30
37
|
if experiment_config.nil? || experiment_config.enabled == false
|
31
|
-
|
38
|
+
logger.debug(
|
32
39
|
"[Eppo SDK] No assigned variation. No active experiment or flag for key: #{flag_or_experiment_key}"
|
33
40
|
)
|
34
41
|
return nil
|
@@ -36,7 +43,7 @@ module EppoClient
|
|
36
43
|
|
37
44
|
matched_rule = EppoClient.find_matching_rule(subject_attributes, experiment_config.rules)
|
38
45
|
if matched_rule.nil?
|
39
|
-
|
46
|
+
logger.debug(
|
40
47
|
"[Eppo SDK] No assigned variation. Subject attributes do not match targeting rules: #{subject_attributes}"
|
41
48
|
)
|
42
49
|
return nil
|
@@ -49,7 +56,7 @@ module EppoClient
|
|
49
56
|
experiment_config.subject_shards,
|
50
57
|
allocation.percent_exposure
|
51
58
|
)
|
52
|
-
|
59
|
+
logger.debug(
|
53
60
|
'[Eppo SDK] No assigned variation. Subject is not part of experiment sample population'
|
54
61
|
)
|
55
62
|
return nil
|
@@ -71,7 +78,7 @@ module EppoClient
|
|
71
78
|
rescue EppoClient::AssignmentLoggerError => e
|
72
79
|
# This error means that log_assignment was not set up. This is okay to ignore.
|
73
80
|
rescue StandardError => e
|
74
|
-
|
81
|
+
logger.error("[Eppo SDK] Error logging assignment event: #{e}")
|
75
82
|
end
|
76
83
|
|
77
84
|
assigned_variation
|
data/lib/config.rb
CHANGED
@@ -8,7 +8,7 @@ module EppoClient
|
|
8
8
|
class Config
|
9
9
|
attr_reader :api_key, :assignment_logger, :base_url
|
10
10
|
|
11
|
-
def initialize(api_key, assignment_logger: AssignmentLogger.new, base_url: 'https://eppo.cloud/api')
|
11
|
+
def initialize(api_key, assignment_logger: AssignmentLogger.new, base_url: 'https://fscdn.eppo.cloud/api')
|
12
12
|
@api_key = api_key
|
13
13
|
@assignment_logger = assignment_logger
|
14
14
|
@base_url = base_url
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'sdk_logger'
|
4
3
|
require 'custom_errors'
|
5
4
|
require 'constants'
|
6
5
|
|
@@ -89,7 +88,7 @@ module EppoClient
|
|
89
88
|
end
|
90
89
|
@config_store.assign_configurations(configs)
|
91
90
|
rescue EppoClient::HttpRequestError => e
|
92
|
-
|
91
|
+
Logger.new($stdout).error("Error retrieving assignment configurations: #{e}")
|
93
92
|
end
|
94
93
|
configs
|
95
94
|
end
|
data/lib/constants.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'logger'
|
4
|
+
|
3
5
|
module EppoClient
|
6
|
+
# default level for logging
|
7
|
+
DEFAULT_LOGGER_LEVEL = Logger::INFO
|
8
|
+
|
4
9
|
# configuration cache constants
|
5
10
|
MAX_CACHE_ENTRIES = 1000 # arbitrary; the caching library requires a max limit
|
6
11
|
|
@@ -11,5 +16,5 @@ module EppoClient
|
|
11
16
|
POLL_INTERVAL_MILLIS = 5 * MINUTE_MILLIS
|
12
17
|
|
13
18
|
# the configs endpoint
|
14
|
-
RAC_ENDPOINT = 'randomized_assignment/
|
19
|
+
RAC_ENDPOINT = 'randomized_assignment/v3/config'
|
15
20
|
end
|
data/lib/eppo_client.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'parse_gemspec'
|
4
|
+
|
3
5
|
require 'assignment_logger'
|
4
6
|
require 'http_client'
|
5
7
|
require 'poller'
|
@@ -11,8 +13,6 @@ require 'configuration_store'
|
|
11
13
|
|
12
14
|
# This module scopes all the client SDK's classes and functions
|
13
15
|
module EppoClient
|
14
|
-
@sdk_version = '1.1.1'
|
15
|
-
|
16
16
|
# rubocop:disable Metrics/MethodLength
|
17
17
|
def initialize_client(config_requestor, assignment_logger)
|
18
18
|
client = EppoClient::Client.instance
|
@@ -29,9 +29,11 @@ module EppoClient
|
|
29
29
|
end
|
30
30
|
# rubocop:enable Metrics/MethodLength
|
31
31
|
|
32
|
+
# rubocop:disable Metrics/MethodLength
|
32
33
|
def init(config)
|
33
34
|
config.validate
|
34
|
-
|
35
|
+
sdk_version = ParseGemspec::Specification.load('eppo-server-sdk.gemspec').to_hash_object[:version]
|
36
|
+
sdk_params = EppoClient::SdkParams.new(config.api_key, 'ruby', sdk_version)
|
35
37
|
http_client = EppoClient::HttpClient.new(config.base_url, sdk_params.formatted)
|
36
38
|
config_store = EppoClient::ConfigurationStore.new(EppoClient::MAX_CACHE_ENTRIES)
|
37
39
|
config_store.lock.with_write_lock do
|
@@ -41,6 +43,7 @@ module EppoClient
|
|
41
43
|
)
|
42
44
|
end
|
43
45
|
end
|
46
|
+
# rubocop:enable Metrics/MethodLength
|
44
47
|
|
45
48
|
module_function :init, :initialize_client
|
46
49
|
end
|
data/lib/poller.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'concurrent/atom'
|
4
|
-
require 'sdk_logger'
|
5
4
|
|
6
5
|
# The poller
|
7
6
|
module EppoClient
|
@@ -34,7 +33,7 @@ module EppoClient
|
|
34
33
|
begin
|
35
34
|
@callback.call
|
36
35
|
rescue StandardError => e
|
37
|
-
|
36
|
+
Logger.new($stdout).error("Unexpected error running poll task: #{e}")
|
38
37
|
break
|
39
38
|
end
|
40
39
|
_wait_for_interval
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eppo-server-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eppo
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -70,6 +70,26 @@ dependencies:
|
|
70
70
|
- - ">="
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: 2.0.0
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: parse_gemspec
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.0'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.0.0
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.0'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 1.0.0
|
73
93
|
- !ruby/object:Gem::Dependency
|
74
94
|
name: rake
|
75
95
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,7 +164,7 @@ dependencies:
|
|
144
164
|
- - ">="
|
145
165
|
- !ruby/object:Gem::Version
|
146
166
|
version: 3.18.1
|
147
|
-
description:
|
167
|
+
description:
|
148
168
|
email: eppo-team@geteppo.com
|
149
169
|
executables: []
|
150
170
|
extensions: []
|
@@ -162,14 +182,18 @@ files:
|
|
162
182
|
- lib/lru_cache.rb
|
163
183
|
- lib/poller.rb
|
164
184
|
- lib/rules.rb
|
165
|
-
- lib/sdk_logger.rb
|
166
185
|
- lib/shard.rb
|
167
186
|
- lib/validation.rb
|
168
187
|
homepage: https://github.com/Eppo-exp/ruby-sdk
|
169
188
|
licenses:
|
170
189
|
- MIT
|
171
|
-
metadata:
|
172
|
-
|
190
|
+
metadata:
|
191
|
+
bug_tracker_uri: https://github.com/Eppo-exp/ruby-sdk/issues
|
192
|
+
documentation_uri: https://docs.geteppo.com/feature-flags/sdks/server-sdks/ruby/
|
193
|
+
homepage_uri: https://geteppo.com/
|
194
|
+
source_code_uri: https://github.com/Eppo-exp/ruby-sdk
|
195
|
+
wiki_uri: https://github.com/Eppo-exp/ruby-sdk/wiki
|
196
|
+
post_install_message:
|
173
197
|
rdoc_options: []
|
174
198
|
require_paths:
|
175
199
|
- lib
|
@@ -184,8 +208,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
208
|
- !ruby/object:Gem::Version
|
185
209
|
version: '0'
|
186
210
|
requirements: []
|
187
|
-
rubygems_version: 3.3.
|
188
|
-
signing_key:
|
211
|
+
rubygems_version: 3.3.26
|
212
|
+
signing_key:
|
189
213
|
specification_version: 4
|
190
214
|
summary: Eppo SDK for Ruby
|
191
215
|
test_files: []
|
data/lib/sdk_logger.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'logger'
|
4
|
-
|
5
|
-
# The helper module for logging
|
6
|
-
module EppoClient
|
7
|
-
@stdout_logger = Logger.new($stdout)
|
8
|
-
@stderr_logger = Logger.new($stderr)
|
9
|
-
|
10
|
-
def self.logger(type)
|
11
|
-
case type
|
12
|
-
when 'out'
|
13
|
-
@stdout_logger
|
14
|
-
when 'err'
|
15
|
-
@stderr_logger
|
16
|
-
else
|
17
|
-
@stderr_logger.error("[Eppo SDK] Invalid logger type: #{type}")
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|