ff-ruby-server-sdk 0.0.2 → 1.0.2.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.run/sdk_test.rb.run.xml +3 -3
  3. data/CHANGELOG.md +12 -2
  4. data/Gemfile +17 -3
  5. data/README.md +155 -7
  6. data/api.yaml +736 -0
  7. data/example/example.rb +100 -3
  8. data/lib/ff/ruby/server/generated/lib/openapi_client/api/client_api.rb +545 -0
  9. data/lib/ff/ruby/server/generated/lib/openapi_client/api/metrics_api.rb +89 -0
  10. data/lib/ff/ruby/server/generated/lib/openapi_client/api_client.rb +390 -0
  11. data/lib/ff/ruby/server/generated/lib/openapi_client/api_error.rb +57 -0
  12. data/lib/ff/ruby/server/generated/lib/openapi_client/configuration.rb +282 -0
  13. data/lib/ff/ruby/server/generated/lib/openapi_client/models/authentication_request.rb +232 -0
  14. data/lib/ff/ruby/server/generated/lib/openapi_client/models/authentication_request_target.rb +250 -0
  15. data/lib/ff/ruby/server/generated/lib/openapi_client/models/authentication_response.rb +223 -0
  16. data/lib/ff/ruby/server/generated/lib/openapi_client/models/clause.rb +281 -0
  17. data/lib/ff/ruby/server/generated/lib/openapi_client/models/distribution.rb +239 -0
  18. data/lib/ff/ruby/server/generated/lib/openapi_client/models/error.rb +237 -0
  19. data/lib/ff/ruby/server/generated/lib/openapi_client/models/evaluation.rb +260 -0
  20. data/lib/ff/ruby/server/generated/lib/openapi_client/models/feature_config.rb +418 -0
  21. data/lib/ff/ruby/server/generated/lib/openapi_client/models/feature_state.rb +37 -0
  22. data/lib/ff/ruby/server/generated/lib/openapi_client/models/key_value.rb +237 -0
  23. data/lib/ff/ruby/server/generated/lib/openapi_client/models/metrics.rb +231 -0
  24. data/lib/ff/ruby/server/generated/lib/openapi_client/models/metrics_data.rb +303 -0
  25. data/lib/ff/ruby/server/generated/lib/openapi_client/models/pagination.rb +274 -0
  26. data/lib/ff/ruby/server/generated/lib/openapi_client/models/prerequisite.rb +239 -0
  27. data/lib/ff/ruby/server/generated/lib/openapi_client/models/segment.rb +320 -0
  28. data/lib/ff/ruby/server/generated/lib/openapi_client/models/serve.rb +227 -0
  29. data/lib/ff/ruby/server/generated/lib/openapi_client/models/serving_rule.rb +267 -0
  30. data/lib/ff/ruby/server/generated/lib/openapi_client/models/tag.rb +233 -0
  31. data/lib/ff/ruby/server/generated/lib/openapi_client/models/target.rb +331 -0
  32. data/lib/ff/ruby/server/generated/lib/openapi_client/models/target_data.rb +253 -0
  33. data/lib/ff/ruby/server/generated/lib/openapi_client/models/target_map.rb +232 -0
  34. data/lib/ff/ruby/server/generated/lib/openapi_client/models/variation.rb +255 -0
  35. data/lib/ff/ruby/server/generated/lib/openapi_client/models/variation_map.rb +245 -0
  36. data/lib/ff/ruby/server/generated/lib/openapi_client/models/weighted_variation.rb +237 -0
  37. data/lib/ff/ruby/server/generated/lib/openapi_client/version.rb +15 -0
  38. data/lib/ff/ruby/server/generated/lib/openapi_client.rb +65 -0
  39. data/lib/ff/ruby/server/sdk/api/auth_service.rb +91 -0
  40. data/lib/ff/ruby/server/sdk/api/cf_client.rb +93 -0
  41. data/lib/ff/ruby/server/sdk/api/client_callback.rb +45 -0
  42. data/lib/ff/ruby/server/sdk/api/config.rb +140 -0
  43. data/lib/ff/ruby/server/sdk/api/config_builder.rb +116 -0
  44. data/lib/ff/ruby/server/sdk/api/default_cache.rb +112 -0
  45. data/lib/ff/ruby/server/sdk/api/evaluation.rb +29 -0
  46. data/lib/ff/ruby/server/sdk/api/evaluator.rb +526 -0
  47. data/lib/ff/ruby/server/sdk/api/file_map_store.rb +60 -0
  48. data/lib/ff/ruby/server/sdk/api/flag_evaluate_callback.rb +13 -0
  49. data/lib/ff/ruby/server/sdk/api/inner_client.rb +311 -0
  50. data/lib/ff/ruby/server/sdk/api/inner_client_flag_evaluate_callback.rb +30 -0
  51. data/lib/ff/ruby/server/sdk/api/inner_client_metrics_callback.rb +33 -0
  52. data/lib/ff/ruby/server/sdk/api/inner_client_repository_callback.rb +44 -0
  53. data/lib/ff/ruby/server/sdk/api/inner_client_updater.rb +63 -0
  54. data/lib/ff/ruby/server/sdk/api/metrics_callback.rb +19 -0
  55. data/lib/ff/ruby/server/sdk/api/metrics_event.rb +16 -0
  56. data/lib/ff/ruby/server/sdk/api/metrics_processor.rb +297 -0
  57. data/lib/ff/ruby/server/sdk/api/operators.rb +20 -0
  58. data/lib/ff/ruby/server/sdk/api/polling_processor.rb +164 -0
  59. data/lib/ff/ruby/server/sdk/api/repository_callback.rb +28 -0
  60. data/lib/ff/ruby/server/sdk/api/storage_repository.rb +263 -0
  61. data/lib/ff/ruby/server/sdk/api/summary_metrics.rb +16 -0
  62. data/lib/ff/ruby/server/sdk/api/update_processor.rb +149 -0
  63. data/lib/ff/ruby/server/sdk/common/cache.rb +27 -0
  64. data/lib/ff/ruby/server/sdk/common/closeable.rb +7 -0
  65. data/lib/ff/ruby/server/sdk/common/destroyable.rb +12 -0
  66. data/lib/ff/ruby/server/sdk/common/repository.rb +45 -0
  67. data/lib/ff/ruby/server/sdk/common/storage.rb +29 -0
  68. data/lib/ff/ruby/server/sdk/connector/connector.rb +44 -0
  69. data/lib/ff/ruby/server/sdk/connector/events.rb +118 -0
  70. data/lib/ff/ruby/server/sdk/connector/harness_connector.rb +236 -0
  71. data/lib/ff/ruby/server/sdk/connector/service.rb +19 -0
  72. data/lib/ff/ruby/server/sdk/connector/updater.rb +32 -0
  73. data/lib/ff/ruby/server/sdk/dto/message.rb +13 -0
  74. data/lib/ff/ruby/server/sdk/dto/target.rb +24 -0
  75. data/lib/ff/ruby/server/sdk/version.rb +2 -1
  76. data/lib/ff/ruby/server/sdk.rb +39 -3
  77. data/openapitools.json +7 -0
  78. data/scripts/install.sh +8 -2
  79. data/scripts/openapi.sh +76 -0
  80. data/scripts/publish.sh +1 -1
  81. data/scripts/sdk_specs.sh +1 -1
  82. metadata +263 -11
  83. data/lib/ff/ruby/server/sdk/cf_client.rb +0 -6
@@ -0,0 +1,236 @@
1
+ require "jwt"
2
+
3
+ require_relative "events"
4
+ require_relative "connector"
5
+
6
+ require_relative "../version"
7
+
8
+ class HarnessConnector < Connector
9
+
10
+ def initialize(api_key, config, on_unauthorized)
11
+
12
+ @api_key = api_key
13
+ @config = config
14
+ @on_unauthorized = on_unauthorized
15
+ @user_agent = "RubySDK " + Ff::Ruby::Server::Sdk::VERSION
16
+
17
+ @api = OpenapiClient::ClientApi.new(make_api_client)
18
+ @metrics_api = OpenapiClient::MetricsApi.new(make_metrics_api_client)
19
+
20
+ @config.logger.debug "Api: " + @api.to_s
21
+ @config.logger.debug "Metrics api: " + @metrics_api.to_s
22
+ end
23
+
24
+ def authenticate
25
+
26
+ begin
27
+
28
+ options = {
29
+ :'authentication_request' => {
30
+ :'apiKey' => @api_key
31
+ }
32
+ }
33
+
34
+ response = @api.authenticate(opts = options)
35
+ @token = response.auth_token
36
+
37
+ @config.logger.info "Token has been obtained"
38
+ process_token
39
+ return true
40
+
41
+ rescue OpenapiClient::ApiError => e
42
+
43
+ log_error(e)
44
+ end
45
+
46
+ false
47
+ end
48
+
49
+ def get_flags
50
+
51
+ begin
52
+
53
+ return @api.get_feature_config(
54
+
55
+ environment_uuid = @environment,
56
+ opts = get_query_params
57
+ )
58
+
59
+ rescue OpenapiClient::ApiError => e
60
+
61
+ log_error(e)
62
+ end
63
+ end
64
+
65
+ def get_segments
66
+
67
+ begin
68
+
69
+ return @api.get_all_segments(
70
+
71
+ environment_uuid = @environment,
72
+ opts = get_query_params
73
+ )
74
+
75
+ rescue OpenapiClient::ApiError => e
76
+
77
+ log_error(e)
78
+ end
79
+ end
80
+
81
+ def get_flag(identifier)
82
+
83
+ @api.get_feature_config_by_identifier(
84
+
85
+ identifier = identifier,
86
+ environment_uuid = @environment,
87
+ opts = get_query_params
88
+ )
89
+ end
90
+
91
+ def get_segment(identifier)
92
+
93
+ @api.get_segment_by_identifier(
94
+
95
+ identifier = identifier,
96
+ environment_uuid = @environment,
97
+ opts = get_query_params
98
+ )
99
+ end
100
+
101
+ def post_metrics(metrics)
102
+
103
+ begin
104
+
105
+ options = {
106
+
107
+ :'metrics' => metrics,
108
+ :'query_params' => {
109
+
110
+ :'cluster' => @cluster
111
+ }
112
+ }
113
+
114
+ @metrics_api.post_metrics(
115
+
116
+ environment = @environment,
117
+ opts = options
118
+ )
119
+
120
+ @config.logger.info "Successfully sent analytics data to the server"
121
+
122
+ rescue OpenapiClient::ApiError => e
123
+
124
+ log_error(e)
125
+ @config.logger.error "Exception while posting metrics to the event server"
126
+ end
127
+ end
128
+
129
+ def stream(updater)
130
+
131
+ if @event_source != nil
132
+
133
+ @event_source.close
134
+ @event_source = nil
135
+ end
136
+
137
+ url = @config.config_url + "/stream?cluster=" + @cluster.to_s
138
+
139
+ headers = {
140
+
141
+ "Authorization" => "Bearer " + @token,
142
+ "API-Key" => @api_key
143
+ }
144
+
145
+ @event_source = Events.new(
146
+
147
+ url,
148
+ headers,
149
+ updater,
150
+ @config.logger
151
+ )
152
+
153
+ @event_source
154
+ end
155
+
156
+ def close
157
+
158
+ if @event_source != nil
159
+
160
+ @event_source.close
161
+ @event_source = nil
162
+ end
163
+ end
164
+
165
+ protected
166
+
167
+ def make_api_client
168
+
169
+ api_client = OpenapiClient::ApiClient.new
170
+
171
+ api_client.config = @config
172
+ api_client.user_agent = @user_agent
173
+
174
+ api_client
175
+ end
176
+
177
+ def make_metrics_api_client
178
+
179
+ max_timeout = 30 * 60 * 1000
180
+
181
+ api_client = OpenapiClient::ApiClient.new
182
+
183
+ config = @config.clone
184
+
185
+ config.read_timeout = max_timeout
186
+ config.write_timeout = max_timeout
187
+ config.connection_timeout = max_timeout
188
+ config.config_url = config.event_url
189
+
190
+ api_client.config = config
191
+ api_client.user_agent = @user_agent
192
+
193
+ api_client
194
+ end
195
+
196
+ def process_token
197
+
198
+ headers = {
199
+
200
+ "Authorization" => "Bearer " + @token
201
+ }
202
+
203
+ @api.api_client.default_headers = @api.api_client.default_headers.merge(headers)
204
+ @metrics_api.api_client.default_headers = @metrics_api.api_client.default_headers.merge(headers)
205
+
206
+ decoded_token = JWT.decode @token, nil, false
207
+
208
+ if decoded_token != nil && !decoded_token.empty?
209
+
210
+ @environment = decoded_token[0]["environment"]
211
+ @cluster = decoded_token[0]["clusterIdentifier"]
212
+
213
+ @config.logger.debug "Token has been processed: environment='" + @environment.to_s + "', cluster='" + @cluster.to_s + "'"
214
+ else
215
+
216
+ @config.logger.error "ERROR: Could not obtain the environment and cluster data from the token"
217
+ end
218
+ end
219
+
220
+ private
221
+
222
+ def get_query_params
223
+
224
+ {
225
+ :'query_params' => {
226
+
227
+ :'cluster' => @cluster
228
+ }
229
+ }
230
+ end
231
+
232
+ def log_error(e)
233
+
234
+ @config.logger.error "ERROR - Start\n\n" + e.to_s + "\nERROR - End"
235
+ end
236
+ end
@@ -0,0 +1,19 @@
1
+ require_relative "../common/closeable"
2
+
3
+ class Service < Closeable
4
+
5
+ def initialize
6
+
7
+ @tbi = "To be implemented"
8
+ end
9
+
10
+ def start
11
+
12
+ raise @tbi
13
+ end
14
+
15
+ def stop
16
+
17
+ raise @tbi
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ class Updater
2
+
3
+ def initialize
4
+
5
+ @tbi = "To be implemented"
6
+ end
7
+
8
+ def on_connected
9
+
10
+ raise @tbi
11
+ end
12
+
13
+ def on_disconnected
14
+
15
+ raise @tbi
16
+ end
17
+
18
+ def on_ready
19
+
20
+ raise @tbi
21
+ end
22
+
23
+ def on_error
24
+
25
+ raise @tbi
26
+ end
27
+
28
+ def update(message)
29
+
30
+ raise @tbi
31
+ end
32
+ end
@@ -0,0 +1,13 @@
1
+ class Message
2
+
3
+ attr_accessor :event, :domain, :identifier, :version
4
+
5
+ def initialize
6
+ super
7
+
8
+ @event = ""
9
+ @domain = ""
10
+ @identifier = ""
11
+ @version = 0
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ class Target
2
+
3
+ attr_accessor :name, :identifier, :attributes, :is_private, :private_attributes
4
+
5
+ def initialize(
6
+
7
+ name,
8
+ identifier = name,
9
+ attributes = [],
10
+ is_private = false
11
+ )
12
+
13
+ @name = name
14
+ @identifier = identifier
15
+ @attributes = attributes
16
+ @is_private = is_private
17
+ @private_attributes = Set[]
18
+ end
19
+
20
+ def is_valid
21
+
22
+ @identifier != nil && !@identifier.strip.empty?
23
+ end
24
+ end
@@ -4,7 +4,8 @@ module Ff
4
4
  module Ruby
5
5
  module Server
6
6
  module Sdk
7
- VERSION = "0.0.2"
7
+
8
+ VERSION = "1.0.2.rc1"
8
9
  end
9
10
  end
10
11
  end
@@ -1,14 +1,50 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "sdk/version"
4
- require_relative "sdk/cf_client"
4
+
5
+ require_relative "sdk/common/cache"
6
+ require_relative "sdk/common/storage"
7
+ require_relative "sdk/common/closeable"
8
+ require_relative "sdk/common/repository"
9
+ require_relative "sdk/common/destroyable"
10
+
11
+ require_relative "sdk/dto/target"
12
+ require_relative "sdk/dto/message"
13
+
14
+ require_relative "sdk/api/config"
15
+ require_relative "sdk/api/operators"
16
+ require_relative "sdk/api/cf_client"
17
+ require_relative "sdk/api/evaluation"
18
+ require_relative "sdk/api/inner_client"
19
+ require_relative "sdk/api/auth_service"
20
+ require_relative "sdk/api/metrics_event"
21
+ require_relative "sdk/api/default_cache"
22
+ require_relative "sdk/api/config_builder"
23
+ require_relative "sdk/api/file_map_store"
24
+ require_relative "sdk/api/summary_metrics"
25
+ require_relative "sdk/api/client_callback"
26
+ require_relative "sdk/api/update_processor"
27
+ require_relative "sdk/api/metrics_callback"
28
+ require_relative "sdk/api/metrics_processor"
29
+ require_relative "sdk/api/polling_processor"
30
+ require_relative "sdk/api/storage_repository"
31
+ require_relative "sdk/api/repository_callback"
32
+ require_relative "sdk/api/inner_client_updater"
33
+ require_relative "sdk/api/flag_evaluate_callback"
34
+ require_relative "sdk/api/inner_client_repository_callback"
35
+ require_relative "sdk/api/inner_client_flag_evaluate_callback"
36
+
37
+ require_relative "sdk/connector/updater"
38
+ require_relative "sdk/connector/service"
39
+ require_relative "sdk/connector/connector"
40
+ require_relative "sdk/connector/events"
41
+ require_relative "sdk/connector/harness_connector"
5
42
 
6
43
  module Ff
7
44
  module Ruby
8
45
  module Server
9
46
  module Sdk
10
- class Error < StandardError; end
11
- # Your code goes here...
47
+
12
48
  end
13
49
  end
14
50
  end
data/openapitools.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "node_modules/@openapitools/openapi-generator-cli/config.schema.json",
3
+ "spaces": 2,
4
+ "generator-cli": {
5
+ "version": "5.2.1"
6
+ }
7
+ }
data/scripts/install.sh CHANGED
@@ -6,5 +6,11 @@ dir_path=$(dirname "$full_path")
6
6
  . "$dir_path/sdk_specs.sh"
7
7
 
8
8
  # shellcheck disable=SC2154
9
- cd "$dir_path/.." && gem build "$ff_ruby_sdk.gemspec" && \
10
- echo "Please enter your 'sudo' password if asked" && sudo gem install "$ff_ruby_sdk"
9
+ if cd "$dir_path/.." && gem build "$ff_ruby_sdk.gemspec" && gem install "$ff_ruby_sdk"; then
10
+
11
+ echo "The '$ff_ruby_sdk' is installed with success"
12
+ else
13
+
14
+ echo "ERROR: the '$ff_ruby_sdk' is NOT installed with success"
15
+ exit 1
16
+ fi
@@ -0,0 +1,76 @@
1
+ #!/bin/bash
2
+
3
+ full_path=$(realpath "$0")
4
+ dir_path=$(dirname "$full_path")
5
+
6
+ if [ -z "$1" ]
7
+ then
8
+
9
+ installation_path="$dir_path/../lib/ff/ruby/server/generated"
10
+ echo "No installation has been provided, using the default path: $installation_path"
11
+ else
12
+
13
+ installation_path="$1"
14
+ echo "Installation path provided: $installation_path"
15
+ fi
16
+
17
+
18
+ . "$dir_path/sdk_specs.sh"
19
+
20
+ if which openapi-generator-cli; then
21
+
22
+ generated_path="$installation_path"
23
+
24
+ if test -e "$generated_path"; then
25
+
26
+ if rm -rf "$generated_path"; then
27
+
28
+ echo "'$generated_path' was removed with success 🙂"
29
+ else
30
+
31
+ echo "ERROR: '$generated_path' was not removed before the generation process 😬"
32
+ exit 1
33
+ fi
34
+ else
35
+
36
+ if mkdir -p "$generated_path" && test -e "$generated_path"; then
37
+
38
+ echo "'$generated_path' has been created with success 🙂"
39
+ else
40
+
41
+ echo "ERROR: '$generated_path' was not created with success 😬"
42
+ exit 1
43
+ fi
44
+ fi
45
+
46
+ if gem install rspec-expectations -v 3.11.0 && \
47
+ gem install rspec-mocks -v 3.11.0 && \
48
+ gem install rake -v 13.0 && \
49
+ gem install minitest -v 5.15.0 && \
50
+ gem install standard -v 1.11.0 && \
51
+ gem install pp -v 0.3.0 && \
52
+ gem install libcache -v 0.4.2 && \
53
+ gem install rufus-scheduler -v 3.8.1 && \
54
+ gem install jwt -v 2.3.0 && \
55
+ gem install moneta -v 1.4.2 && \
56
+ gem install rest-client -v 2.1.0 && \
57
+ gem install sse-client -v 1.1.0 && \
58
+ gem install concurrent-ruby -v 1.1.10 && \
59
+ gem install murmurhash3 -v 0.1.6 && \
60
+ cd "$dir_path/.." && \
61
+ openapi-generator-cli generate -i api.yaml -g ruby -o "$generated_path" && \
62
+ cd "$generated_path" && gem build openapi_client.gemspec && \
63
+ test -e "openapi_client-1.0.0.gem" && \
64
+ gem install --dev "openapi_client-1.0.0.gem"; then
65
+
66
+ echo "Generated API has been installed with success: $generated_path"
67
+ else
68
+
69
+ echo "ERROR: 'openapi-generator-cli' is not installed [1] 😬"
70
+ exit 1
71
+ fi
72
+ else
73
+
74
+ echo "ERROR: 'openapi-generator-cli' is not installed [2] 😬"
75
+ exit 1
76
+ fi
data/scripts/publish.sh CHANGED
@@ -8,7 +8,7 @@ dir_path=$(dirname "$full_path")
8
8
  # shellcheck disable=SC2154
9
9
  if cd "$dir_path/.." && gem build "$ff_ruby_sdk.gemspec"; then
10
10
 
11
- if echo "Please enter your 'sudo' password if asked" && sudo gem install "$ff_ruby_sdk"; then
11
+ if gem install "$ff_ruby_sdk"; then
12
12
 
13
13
  gem push "$ff_ruby_sdk-$ff_ruby_sdk_version.gem"
14
14
  else
data/scripts/sdk_specs.sh CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/bin/bash
2
2
 
3
3
  export ff_ruby_sdk="ff-ruby-server-sdk"
4
- export ff_ruby_sdk_version="0.0.2"
4
+ export ff_ruby_sdk_version="1.0.2.rc1"