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,93 @@
1
+ require "openapi_client"
2
+
3
+ require_relative "../common/closeable"
4
+ require_relative "inner_client"
5
+
6
+ class CfClient < Closeable
7
+
8
+ # Static:
9
+ class << self
10
+
11
+ @@instance = CfClient.new
12
+
13
+ def instance
14
+
15
+ @@instance
16
+ end
17
+ end
18
+
19
+ # Static - End
20
+
21
+ def initialize(api_key = nil, config = nil, connector = nil)
22
+
23
+ if config == nil
24
+
25
+ @config = ConfigBuilder.new.build
26
+ else
27
+
28
+ @config = config
29
+ end
30
+
31
+ @client = InnerClient.new(api_key, config, connector)
32
+
33
+ @config.logger.debug "Client (1): " + @client.to_s
34
+ end
35
+
36
+ def init(api_key = nil, config = nil, connector = nil)
37
+
38
+ if @client == nil
39
+
40
+ @config = config
41
+
42
+ @client = InnerClient.new(
43
+
44
+ api_key = api_key,
45
+ config = config,
46
+ connector = connector
47
+ )
48
+
49
+ @config.logger.debug "Client (2): " + @client.to_s
50
+ end
51
+ end
52
+
53
+ def wait_for_initialization
54
+
55
+ if @client != nil
56
+
57
+ @client.wait_for_initialization
58
+ end
59
+ end
60
+
61
+ def bool_variation(identifier, target, default_value)
62
+
63
+ @client.bool_variation(identifier, target, default_value)
64
+ end
65
+
66
+ def string_variation(identifier, target, default_value)
67
+
68
+ @client.string_variation(identifier, target, default_value)
69
+ end
70
+
71
+ def number_variation(identifier, target, default_value)
72
+
73
+ @client.number_variation(identifier, target, default_value)
74
+ end
75
+
76
+ def json_variation(identifier, target, default_value)
77
+
78
+ @client.json_variation(identifier, target, default_value)
79
+ end
80
+
81
+ def destroy
82
+
83
+ close
84
+ end
85
+
86
+ def close
87
+
88
+ if @client != nil
89
+
90
+ @client.close
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,45 @@
1
+ require_relative "../common/closeable"
2
+
3
+ class ClientCallback < Closeable
4
+
5
+ def initialize
6
+ super
7
+
8
+ @tbi = "To be implemented"
9
+ end
10
+
11
+ def on_auth_success
12
+
13
+ raise @tbi
14
+ end
15
+
16
+ def on_authorized
17
+
18
+ raise @tbi
19
+ end
20
+
21
+ def is_closing
22
+
23
+ raise @tbi
24
+ end
25
+
26
+ def on_processor_ready(processor)
27
+
28
+ raise @tbi
29
+ end
30
+
31
+ def on_update_processor_ready
32
+
33
+ raise @tbi
34
+ end
35
+
36
+ def on_metrics_processor_ready
37
+
38
+ raise @tbi
39
+ end
40
+
41
+ def update(message, manual)
42
+
43
+ raise @tbi
44
+ end
45
+ end
@@ -0,0 +1,140 @@
1
+ require "logger"
2
+
3
+ require_relative "default_cache"
4
+
5
+ class Config
6
+
7
+ attr_accessor :config_url, :event_url, :stream_enabled, :poll_interval_in_seconds, :analytics_enabled,
8
+ :frequency, :buffer_size, :all_attributes_private, :private_attributes, :connection_timeout,
9
+ :read_timeout, :write_timeout, :debugging, :metrics_service_acceptable_duration, :cache, :store,
10
+ :logger
11
+
12
+ # Static:
13
+ class << self
14
+
15
+ @@min_frequency = 60
16
+
17
+ def min_frequency
18
+
19
+ @@min_frequency
20
+ end
21
+ end
22
+ # Static - End
23
+
24
+ def initialize
25
+ super
26
+
27
+ @config_url = "https://config.ff.harness.io/api/1.0"
28
+ @event_url = "https://events.ff.harness.io/api/1.0"
29
+
30
+ @stream_enabled = true
31
+
32
+ @poll_interval_in_seconds = @@min_frequency
33
+
34
+ @analytics_enabled = true
35
+
36
+ @frequency = @@min_frequency
37
+
38
+ @buffer_size = 1024
39
+
40
+ @all_attributes_private = false
41
+
42
+ @private_attributes = Set[]
43
+
44
+ @connection_timeout = 10 * 1000
45
+
46
+ @read_timeout = 30 * 1000
47
+
48
+ @write_timeout = 10 * 1000
49
+
50
+ @debugging = false
51
+
52
+ @logger = Logger.new(STDOUT)
53
+
54
+ @metrics_service_acceptable_duration = 10 * 1000
55
+
56
+ @cache = DefaultCache.new(@logger)
57
+
58
+ # TODO: Storage goes here
59
+
60
+ @store = nil
61
+ end
62
+
63
+ def get_frequency
64
+
65
+ [@frequency, @@min_frequency].max
66
+ end
67
+
68
+ def verify_ssl_host
69
+
70
+ true
71
+ end
72
+
73
+ def params_encoding
74
+
75
+ nil
76
+ end
77
+
78
+ def timeout
79
+
80
+ @connection_timeout
81
+ end
82
+
83
+ def verify_ssl
84
+
85
+ nil
86
+ end
87
+
88
+ def cert_file
89
+
90
+ nil
91
+ end
92
+
93
+ def key_file
94
+
95
+ nil
96
+ end
97
+
98
+ def ssl_ca_cert
99
+
100
+ nil
101
+ end
102
+
103
+ def client_side_validation
104
+
105
+ nil
106
+ end
107
+
108
+ def auth_settings
109
+
110
+ {}
111
+ end
112
+
113
+ def base_url(args)
114
+
115
+ @config_url
116
+ end
117
+
118
+ def describe
119
+
120
+ to_s + "\n" +
121
+ "\tmin_frequency = " + @@min_frequency.to_s + "\n" +
122
+ "\tconfig_url = " + @config_url + "\n" +
123
+ "\tevent_url = " + @event_url + "\n" +
124
+ "\tstream_enabled = " + @stream_enabled.to_s + "\n" +
125
+ "\tpoll_interval_in_seconds = " + @poll_interval_in_seconds.to_s + "\n" +
126
+ "\tanalytics_enabled = " + @analytics_enabled.to_s + "\n" +
127
+ "\tfrequency = " + @frequency.to_s + "\n" +
128
+ "\tget_frequency = " + get_frequency.to_s + "\n" +
129
+ "\tbuffer_size = " + @buffer_size.to_s + "\n" +
130
+ "\tall_attributes_private = " + @all_attributes_private.to_s + "\n" +
131
+ "\tprivate_attributes = " + @private_attributes.to_s + "\n" +
132
+ "\tconnection_timeout = " + @connection_timeout.to_s + "\n" +
133
+ "\tread_timeout = " + @read_timeout.to_s + "\n" +
134
+ "\twrite_timeout = " + @write_timeout.to_s + "\n" +
135
+ "\tdebug = " + @debugging.to_s + "\n" +
136
+ "\tmetrics_service_acceptable_duration = " + @metrics_service_acceptable_duration.to_s + "\n" +
137
+ "\tcache = " + @cache.to_s + "\n" +
138
+ "\tstore = " + @store.to_s
139
+ end
140
+ end
@@ -0,0 +1,116 @@
1
+ class ConfigBuilder
2
+
3
+ def build
4
+
5
+ @config
6
+ end
7
+
8
+ def initialize
9
+
10
+ @config = Config.new
11
+ @config.cache = DefaultCache.new(@config.logger)
12
+ end
13
+
14
+ def config_url(config_url)
15
+
16
+ @config.config_url = config_url
17
+ self
18
+ end
19
+
20
+ def event_url(event_url)
21
+
22
+ @config.event_url = event_url
23
+ self
24
+ end
25
+
26
+ def stream_enabled(stream_enabled)
27
+
28
+ @config.stream_enabled = stream_enabled
29
+ self
30
+ end
31
+
32
+ def poll_interval_in_seconds(poll_interval_in_seconds)
33
+
34
+ @config.poll_interval_in_seconds = poll_interval_in_seconds
35
+ self
36
+ end
37
+
38
+ def analytics_enabled(analytics_enabled)
39
+
40
+ @config.analytics_enabled = analytics_enabled
41
+ self
42
+ end
43
+
44
+ def frequency(frequency)
45
+
46
+ @config.frequency = frequency
47
+ self
48
+ end
49
+
50
+ def buffer_size(buffer_size)
51
+
52
+ @config.buffer_size = buffer_size
53
+ self
54
+ end
55
+
56
+ def all_attributes_private(all_attributes_private)
57
+
58
+ @config.all_attributes_private = all_attributes_private
59
+ self
60
+ end
61
+
62
+ def private_attributes(private_attributes)
63
+
64
+ @config.private_attributes = private_attributes
65
+ self
66
+ end
67
+
68
+ def connection_timeout(connection_timeout)
69
+
70
+ @config.connection_timeout = connection_timeout
71
+ self
72
+ end
73
+
74
+ def read_timeout(read_timeout)
75
+
76
+ @config.read_timeout = read_timeout
77
+ self
78
+ end
79
+
80
+ def write_timeout(write_timeout)
81
+
82
+ @config.write_timeout = write_timeout
83
+ self
84
+ end
85
+
86
+ def logger(logger)
87
+
88
+ @config.logger = logger
89
+ @config.cache.logger = logger
90
+ self
91
+ end
92
+
93
+ def debugging(debug)
94
+
95
+ @config.debugging = debug
96
+ self
97
+ end
98
+
99
+ def metrics_service_acceptable_duration(metrics_service_acceptable_duration)
100
+
101
+ @config.metrics_service_acceptable_duration = metrics_service_acceptable_duration
102
+ self
103
+ end
104
+
105
+ def cache(cache)
106
+
107
+ @config.cache = cache
108
+ self
109
+ end
110
+
111
+ def store(store)
112
+
113
+ @config.store = store
114
+ self
115
+ end
116
+ end
@@ -0,0 +1,112 @@
1
+ require "set"
2
+ require "fileutils"
3
+ require "libcache"
4
+
5
+ class DefaultCache < Cache
6
+
7
+ attr_accessor :logger
8
+
9
+ def initialize(logger = nil)
10
+
11
+ if logger != nil
12
+
13
+ @logger = logger
14
+ else
15
+
16
+ @logger = Logger.new(STDOUT)
17
+ end
18
+
19
+ @keys = Set[]
20
+ @capacity = 10 * 1000
21
+
22
+ lambda = lambda { |*key| @logger.debug "Retrieved #{key}" }
23
+
24
+ cache_dir = "./cache"
25
+ unless directory_exists?(cache_dir)
26
+
27
+ FileUtils.mkdir_p cache_dir
28
+ unless directory_exists?(cache_dir)
29
+
30
+ raise "Failed to initialize filesystem cache at: " + cache_dir
31
+ end
32
+ end
33
+
34
+ @filesystem = CacheBuilder.with(FileCache)
35
+ .set_store(cache_dir)
36
+ .set_max(@capacity)
37
+ .set_post_get(lambda)
38
+ .build
39
+
40
+ @in_memory = CacheBuilder.with(Cache)
41
+ .set_max(@capacity)
42
+ .set_post_get(lambda)
43
+ .build
44
+ end
45
+
46
+ def verify
47
+
48
+ @in_memory != nil && @filesystem != nil && @capacity > 0
49
+ end
50
+
51
+ def set(key, value)
52
+
53
+ begin
54
+ @in_memory.put(key, value)
55
+ @filesystem.put(key, value)
56
+ keys.add(key)
57
+
58
+ rescue ArgumentError => e
59
+
60
+ @logger.error "ERROR: " + e.to_s
61
+
62
+ raise "Invalid arguments passed to the 'set' method: key='" + key.to_s + "', value='" + value.to_s + "'"
63
+ end
64
+ end
65
+
66
+ def get(key)
67
+
68
+ value = @in_memory.get(key)
69
+
70
+ if value == nil
71
+
72
+ value = @filesystem.get(key)
73
+ if value != nil
74
+
75
+ @in_memory.put(key, value)
76
+ end
77
+ end
78
+ value
79
+ end
80
+
81
+ def delete(key)
82
+
83
+ if key == nil
84
+
85
+ raise "Key is nil"
86
+ end
87
+
88
+ if @in_memory.exists?(key)
89
+
90
+ @in_memory.invalidate(key)
91
+ end
92
+
93
+ if @filesystem.exists?(key)
94
+
95
+ @filesystem.invalidate(key)
96
+ end
97
+
98
+ @keys.delete(key)
99
+ end
100
+
101
+ def keys
102
+
103
+ @keys
104
+ end
105
+
106
+ private
107
+
108
+ def directory_exists?(directory)
109
+
110
+ File.directory?(directory)
111
+ end
112
+ end
@@ -0,0 +1,29 @@
1
+
2
+ class Evaluation
3
+
4
+ def initialize
5
+ super
6
+
7
+ @tbi = "To be implemented"
8
+ end
9
+
10
+ def bool_variation(identifier, target, default_value, callback)
11
+
12
+ raise @tbi
13
+ end
14
+
15
+ def string_variation(identifier, target, default_value, callback)
16
+
17
+ raise @tbi
18
+ end
19
+
20
+ def number_variation(identifier, target, default_value, callback)
21
+
22
+ raise @tbi
23
+ end
24
+
25
+ def json_variation(identifier, target, default_value, callback)
26
+
27
+ raise @tbi
28
+ end
29
+ end