ff-ruby-server-sdk 0.0.2 → 1.0.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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.run/build.sh.run.xml +17 -0
  3. data/.run/install.sh.run.xml +17 -0
  4. data/.run/openapi.sh.run.xml +17 -0
  5. data/.run/publish.sh.run.xml +17 -0
  6. data/.run/sdk_test.rb.run.xml +3 -3
  7. data/.run/unpublish.sh.run.xml +17 -0
  8. data/CHANGELOG.md +1 -1
  9. data/Gemfile +20 -3
  10. data/README.md +155 -7
  11. data/api.yaml +736 -0
  12. data/example/example.rb +99 -3
  13. data/lib/ff/ruby/server/sdk/api/auth_service.rb +91 -0
  14. data/lib/ff/ruby/server/sdk/api/cf_client.rb +93 -0
  15. data/lib/ff/ruby/server/sdk/api/client_callback.rb +45 -0
  16. data/lib/ff/ruby/server/sdk/api/config.rb +140 -0
  17. data/lib/ff/ruby/server/sdk/api/config_builder.rb +116 -0
  18. data/lib/ff/ruby/server/sdk/api/default_cache.rb +112 -0
  19. data/lib/ff/ruby/server/sdk/api/evaluation.rb +29 -0
  20. data/lib/ff/ruby/server/sdk/api/evaluator.rb +526 -0
  21. data/lib/ff/ruby/server/sdk/api/file_map_store.rb +60 -0
  22. data/lib/ff/ruby/server/sdk/api/flag_evaluate_callback.rb +13 -0
  23. data/lib/ff/ruby/server/sdk/api/inner_client.rb +311 -0
  24. data/lib/ff/ruby/server/sdk/api/inner_client_flag_evaluate_callback.rb +30 -0
  25. data/lib/ff/ruby/server/sdk/api/inner_client_metrics_callback.rb +33 -0
  26. data/lib/ff/ruby/server/sdk/api/inner_client_repository_callback.rb +44 -0
  27. data/lib/ff/ruby/server/sdk/api/inner_client_updater.rb +63 -0
  28. data/lib/ff/ruby/server/sdk/api/metrics_callback.rb +19 -0
  29. data/lib/ff/ruby/server/sdk/api/metrics_event.rb +16 -0
  30. data/lib/ff/ruby/server/sdk/api/metrics_processor.rb +297 -0
  31. data/lib/ff/ruby/server/sdk/api/operators.rb +20 -0
  32. data/lib/ff/ruby/server/sdk/api/polling_processor.rb +164 -0
  33. data/lib/ff/ruby/server/sdk/api/repository_callback.rb +28 -0
  34. data/lib/ff/ruby/server/sdk/api/storage_repository.rb +263 -0
  35. data/lib/ff/ruby/server/sdk/api/summary_metrics.rb +16 -0
  36. data/lib/ff/ruby/server/sdk/api/update_processor.rb +149 -0
  37. data/lib/ff/ruby/server/sdk/common/cache.rb +27 -0
  38. data/lib/ff/ruby/server/sdk/common/closeable.rb +7 -0
  39. data/lib/ff/ruby/server/sdk/common/destroyable.rb +12 -0
  40. data/lib/ff/ruby/server/sdk/common/repository.rb +45 -0
  41. data/lib/ff/ruby/server/sdk/common/storage.rb +29 -0
  42. data/lib/ff/ruby/server/sdk/connector/connector.rb +44 -0
  43. data/lib/ff/ruby/server/sdk/connector/events.rb +118 -0
  44. data/lib/ff/ruby/server/sdk/connector/harness_connector.rb +236 -0
  45. data/lib/ff/ruby/server/sdk/connector/service.rb +19 -0
  46. data/lib/ff/ruby/server/sdk/connector/updater.rb +32 -0
  47. data/lib/ff/ruby/server/sdk/dto/message.rb +13 -0
  48. data/lib/ff/ruby/server/sdk/dto/target.rb +24 -0
  49. data/lib/ff/ruby/server/sdk/version.rb +2 -1
  50. data/lib/ff/ruby/server/sdk.rb +39 -3
  51. data/openapitools.json +7 -0
  52. data/scripts/openapi.sh +35 -0
  53. data/scripts/sdk_specs.sh +1 -1
  54. metadata +46 -3
  55. 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.0"
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
+ }
@@ -0,0 +1,35 @@
1
+ #!/bin/bash
2
+
3
+ full_path=$(realpath "$0")
4
+ dir_path=$(dirname "$full_path")
5
+
6
+ . "$dir_path/sdk_specs.sh"
7
+
8
+ if which openapi-generator; then
9
+
10
+ generated_path="$dir_path/../generated"
11
+
12
+ if test -e "$generated_path"; then
13
+
14
+ if rm -rf "$generated_path"; then
15
+
16
+ echo "'$generated_path' was removed with success 🙂"
17
+ else
18
+
19
+ echo "ERROR: '$$generated_path' was not removed before the generation process 😬"
20
+ exit 1
21
+ fi
22
+ fi
23
+
24
+ cd "$dir_path/.." &&
25
+ openapi-generator generate -i api.yaml -g ruby -o generated &&
26
+ cd "$generated_path" && gem build openapi_client.gemspec && cd .. &&
27
+ echo "Please enter your 'sudo' password if asked" &&
28
+ sudo gem install "$generated_path/openapi_client-1.0.0.gem" &&
29
+ echo "Generated API has been installed with success 🤟"
30
+
31
+ else
32
+
33
+ echo "ERROR: 'openapi-generator' is not installed 😬"
34
+ exit 1
35
+ fi
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.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ff-ruby-server-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Milos Vasic
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-17 00:00:00.000000000 Z
11
+ date: 2022-02-02 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Harness is a feature management platform that helps teams to build better
14
14
  software and to test features quicker.
@@ -19,22 +19,65 @@ extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
21
  - ".idea/.gitignore"
22
+ - ".run/build.sh.run.xml"
22
23
  - ".run/example.run.xml"
24
+ - ".run/install.sh.run.xml"
25
+ - ".run/openapi.sh.run.xml"
26
+ - ".run/publish.sh.run.xml"
23
27
  - ".run/sdk_test.rb.run.xml"
28
+ - ".run/unpublish.sh.run.xml"
24
29
  - ".standard.yml"
25
30
  - CHANGELOG.md
26
31
  - Gemfile
27
32
  - LICENSE
28
33
  - README.md
29
34
  - Rakefile
35
+ - api.yaml
30
36
  - bin/console
31
37
  - bin/setup
32
38
  - example/example.rb
33
39
  - lib/ff/ruby/server/sdk.rb
34
- - lib/ff/ruby/server/sdk/cf_client.rb
40
+ - lib/ff/ruby/server/sdk/api/auth_service.rb
41
+ - lib/ff/ruby/server/sdk/api/cf_client.rb
42
+ - lib/ff/ruby/server/sdk/api/client_callback.rb
43
+ - lib/ff/ruby/server/sdk/api/config.rb
44
+ - lib/ff/ruby/server/sdk/api/config_builder.rb
45
+ - lib/ff/ruby/server/sdk/api/default_cache.rb
46
+ - lib/ff/ruby/server/sdk/api/evaluation.rb
47
+ - lib/ff/ruby/server/sdk/api/evaluator.rb
48
+ - lib/ff/ruby/server/sdk/api/file_map_store.rb
49
+ - lib/ff/ruby/server/sdk/api/flag_evaluate_callback.rb
50
+ - lib/ff/ruby/server/sdk/api/inner_client.rb
51
+ - lib/ff/ruby/server/sdk/api/inner_client_flag_evaluate_callback.rb
52
+ - lib/ff/ruby/server/sdk/api/inner_client_metrics_callback.rb
53
+ - lib/ff/ruby/server/sdk/api/inner_client_repository_callback.rb
54
+ - lib/ff/ruby/server/sdk/api/inner_client_updater.rb
55
+ - lib/ff/ruby/server/sdk/api/metrics_callback.rb
56
+ - lib/ff/ruby/server/sdk/api/metrics_event.rb
57
+ - lib/ff/ruby/server/sdk/api/metrics_processor.rb
58
+ - lib/ff/ruby/server/sdk/api/operators.rb
59
+ - lib/ff/ruby/server/sdk/api/polling_processor.rb
60
+ - lib/ff/ruby/server/sdk/api/repository_callback.rb
61
+ - lib/ff/ruby/server/sdk/api/storage_repository.rb
62
+ - lib/ff/ruby/server/sdk/api/summary_metrics.rb
63
+ - lib/ff/ruby/server/sdk/api/update_processor.rb
64
+ - lib/ff/ruby/server/sdk/common/cache.rb
65
+ - lib/ff/ruby/server/sdk/common/closeable.rb
66
+ - lib/ff/ruby/server/sdk/common/destroyable.rb
67
+ - lib/ff/ruby/server/sdk/common/repository.rb
68
+ - lib/ff/ruby/server/sdk/common/storage.rb
69
+ - lib/ff/ruby/server/sdk/connector/connector.rb
70
+ - lib/ff/ruby/server/sdk/connector/events.rb
71
+ - lib/ff/ruby/server/sdk/connector/harness_connector.rb
72
+ - lib/ff/ruby/server/sdk/connector/service.rb
73
+ - lib/ff/ruby/server/sdk/connector/updater.rb
74
+ - lib/ff/ruby/server/sdk/dto/message.rb
75
+ - lib/ff/ruby/server/sdk/dto/target.rb
35
76
  - lib/ff/ruby/server/sdk/version.rb
77
+ - openapitools.json
36
78
  - scripts/build.sh
37
79
  - scripts/install.sh
80
+ - scripts/openapi.sh
38
81
  - scripts/publish.sh
39
82
  - scripts/sdk_specs.sh
40
83
  - scripts/unpublish.sh
@@ -1,6 +0,0 @@
1
- class CfClient
2
-
3
- def hello
4
- puts "Hello from the client"
5
- end
6
- end