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

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.
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"