splitclient-rb 7.0.1.pre.rc1 → 7.0.1.pre.rc3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f134a9d9e88674dafbdcf9f57b77c73942664cbf14e9df1a7f55066f1fc62742
4
- data.tar.gz: ee65206af2cae21099c0a1f3ab5facff024384c5698df3556ad40191d26600a7
3
+ metadata.gz: d22f596ae2c858d642bbd57bf6fdfbfbf11be01ef39a54e2e9e9c69142d2f745
4
+ data.tar.gz: 221e861adf092444cc790537c7469185f8bfc2c306e5f5d681d2876f23816d9e
5
5
  SHA512:
6
- metadata.gz: 698f220a7d5402b844997fddbfd64275f9141bcd5a196b18477df5490d741d150cf17c2cca205626c213e68fcb57efcbea1f037c2e0f3ef39c8a476796062470
7
- data.tar.gz: 8bbdf861ad7e4a58cc7a8d5a5942a1882a218f6f36d6ce49019c84f02cf5f97aa0daa64c5ddd65135aa1efe5b4c8c85c97a54b3d0821434dd0cca21581a1fd5a
6
+ metadata.gz: fc2b364e35389b85447a12adc3bfb0f947cf61057531777093fe69bf5400104ed5eb56e92a74666626f7f410151c4e6faded6cc574fa5d7dd8bc249607577bbd
7
+ data.tar.gz: 14348f14b7df6b3f07ef6c7392d1774a2cf67294dbc0c76dc13c76927cb9f4c4ef8ddb3a23cfe9584ef26379df7e91fb5db7fa9dfca00ff8c21df384ecefb7d2
@@ -0,0 +1,10 @@
1
+ # Ruby SDK
2
+
3
+ ## What did you accomplish?
4
+
5
+
6
+ ## How to test new changes?
7
+
8
+
9
+ ## Extra Notes
10
+
data/CHANGES.txt CHANGED
@@ -182,34 +182,27 @@
182
182
  - Detach implementation for local factory and regular one.
183
183
 
184
184
  3.0.3
185
-
186
185
  - Fix nil ref in manager
187
186
 
188
187
  3.0.2
189
-
190
188
  - add ability to provide different bucketing/matching keys
191
189
 
192
190
  3.0.1
193
-
194
191
  - fix segments not deleting from the cache
195
192
 
196
193
  3.0.0
197
-
198
194
  - add new caching interface
199
195
  - add replaceable adapters to store cache in
200
196
  - add first cache adapter: MemoryAdapter
201
197
  - refactoring
202
198
 
203
199
  2.0.1
204
-
205
200
  - Supress warnings cause by Net::HTTP when it already exists.
206
201
 
207
202
  2.0.0
208
-
209
203
  - Add Factory for creation of Client and Manager interface.
210
204
 
211
205
  1.0.4
212
-
213
206
  - added support for AND combiner on conditions
214
207
  - added events_uri as config param which defines the metrics post url
215
208
  - updated metrics post default endpoint to be https://events.split.io/api/
@@ -225,10 +218,8 @@
225
218
  - added condition to return CONTROL on the deleted features
226
219
 
227
220
  1.0.1
228
-
229
221
  - .splits to .split for local env
230
222
  - isTreatment was removed from the API.
231
223
 
232
224
  1.0.0
233
-
234
225
  - Support multivariate treatment
@@ -0,0 +1,49 @@
1
+ # Contributing to the Split Ruby SDK
2
+
3
+ Split SDK is an open source project and we welcome feedback and contribution. The information below describes how to build the project with your changes, run the tests, and send the Pull Request(PR).
4
+
5
+ ## Development
6
+
7
+ ### Development process
8
+
9
+ 1. Fork the repository and create a topic branch from `development` branch. Please use a descriptive name for your branch.
10
+ 2. While developing, use descriptive messages in your commits. Avoid short or meaningless sentences like "fix bug".
11
+ 3. Make sure to add tests for both positive and negative cases.
12
+ 4. Run the linter script of the project and fix any issues you find.
13
+ 5. Run the build script and make sure it runs with no errors.
14
+ 6. Run all tests and make sure there are no failures.
15
+ 7. `git push` your changes to GitHub within your topic branch.
16
+ 8. Open a Pull Request(PR) from your forked repo and into the `development` branch of the original repository.
17
+ 9. When creating your PR, please fill out all the fields of the PR template, as applicable, for the project.
18
+ 10. Check for conflicts once the pull request is created to make sure your PR can be merged cleanly into `development`.
19
+ 11. Keep an eye out for any feedback or comments from Split's SDK team.
20
+
21
+ ### Building the SDK
22
+ To install this gem dependencies onto your local machine, run `bundle exec rake install`.
23
+
24
+ Then you can build the gem using `gem build splitclient-rb.gemspec` and install on your Ruby version with `gem install splitclient-rb-X.X.X.gem` (_the version number should match what you just built_).
25
+
26
+ ### Running tests
27
+ The gem uses `rspec` for unit testing. You can find the files for the unit tests and the specs helper file (`spec_helper.rb`) under the default `/spec` folder.
28
+
29
+ To run all the specs in the `spec` folder, use the provided rake task (_make sure Redis is running in localhost_):
30
+
31
+ ```bash
32
+ bundle exec rspec
33
+ ```
34
+
35
+ `Simplecov` is used for coverage reporting. Upon executing the rake task it will store the reports in the `/coverage` folder.
36
+
37
+ ### Linting and other useful checks
38
+ To run the static code analysis using Rubocop run:
39
+ ```bash
40
+ bundle exec rubocop
41
+ ```
42
+
43
+ If you want to benchmark the hashing algorithm (MurmurHash) run:
44
+ ```bash
45
+ bundle exec rake compile:murmurhash
46
+ ```
47
+
48
+ # Contact
49
+ If you have any other questions or need to contact us directly in a private manner send us a note at developers@split.io
data/README.md CHANGED
@@ -1,44 +1,78 @@
1
+ # Split SDK for Ruby
1
2
  [![Build Status](https://travis-ci.com/splitio/ruby-client.svg?branch=master)](https://travis-ci.com/splitio/ruby-client)
2
3
 
3
- # Split Ruby SDK
4
-
5
- This SDK is designed to work with [Split](https://www.split.io), the platform for controlled rollouts, serving features to your users via the Split feature flag to manage your complete customer experience.
6
-
7
- ### Quick setup
8
-
9
- For specific instructions on how to set up the Split SDK refer to our [Detailed-README](Detailed-README.md) or our [official SDK documentation](http://docs.split.io/docs/sdk-overview).
10
-
11
- ### Commitment to Quality:
12
-
13
- Split’s SDKs are in active development and are constantly tested for quality. Unit tests are developed for each SDK based on the unique needs of that language, and integration tests, load and performance tests, and behavior consistency tests are running 24/7 via automated bots. In addition, monitoring instrumentation ensures that these SDKs behave under the expected parameters of memory, CPU, and I/O.
14
-
15
- ### About Split:
16
-
17
- Split is the leading platform for feature experimentation, empowering businesses of all sizes to make smarter product decisions. Companies like Vevo, Twilio, and LendingTree rely on Split to securely release new features, target them to customers, and measure the impact of features on their customer experience metrics. Founded in 2015, Split's team comes from some of the most innovative enterprises in Silicon Valley, including Google, LinkedIn, Salesforce and Databricks. Split is based in Redwood City, California and backed by Accel Partners and Lightspeed Venture Partners.
18
-
19
- Our platform is a unified solution for continuous delivery and full-stack experimentation. Split unifies DevOps and product management, helping agile engineering and product teams accelerate the pace of product delivery and make data-driven decisions, through our robust feature flagging and extensive experimentation capabilities. With Split, organizations can now accelerate time to value, mitigate risk, and drive better outcomes, all in a unified platform.
20
-
21
- To learn more about Split, contact hello@split.io, or start a 14-day trial at https://www.split.io/signup/.
22
-
23
- Split has built and maintains a SDKs for:
24
-
25
- * Java [Github](https://github.com/splitio/java-client) [Docs](http://docs.split.io/docs/java-sdk-guide)
26
- * Javascript [Github](https://github.com/splitio/javascript-client) [Docs](http://docs.split.io/docs/javascript-sdk-overview)
27
- * Node [Github](https://github.com/splitio/javascript-client) [Docs](http://docs.split.io/docs/nodejs-sdk-overview)
28
- * .NET [Github](https://github.com/splitio/.net-client) [Docs](http://docs.split.io/docs/net-sdk-overview)
29
- * Ruby [Github](https://github.com/splitio/ruby-client) [Docs](http://docs.split.io/docs/ruby-sdk-overview)
30
- * PHP [Github](https://github.com/splitio/php-client) [Docs](http://docs.split.io/docs/php-sdk-overview)
31
- * Python [Github](https://github.com/splitio/python-client) [Docs](http://docs.split.io/docs/python-sdk-overview)
32
- * GO [Github](https://github.com/splitio/go-client) [Docs](http://docs.split.io/docs/go-sdk-overview)
33
- * Android [Github](https://github.com/splitio/android-client) [Docs](https://docs.split.io/docs/android-sdk-overview)
34
- * IOS [Github](https://github.com/splitio/ios-client) [Docs](https://docs.split.io/docs/ios-sdk-overview)
35
-
36
- For a comprehensive list of opensource projects visit our [Github page](https://github.com/splitio?utf8=%E2%9C%93&query=%20only%3Apublic%20).
37
-
4
+ ## Overview
5
+ This SDK is designed to work with Split, the platform for controlled rollouts, which serves features to your users via a Split feature flag to manage your complete customer experience.
6
+
7
+ [![Twitter Follow](https://img.shields.io/twitter/follow/splitsoftware.svg?style=social&label=Follow&maxAge=1529000)](https://twitter.com/intent/follow?screen_name=splitsoftware)
8
+
9
+ ## Compatibility
10
+ The Ruby SDK support Ruby version 2.3.0 or later and JRuby or 9.1.17 o later.
11
+
12
+ Also the Ruby SDK has been tested as a standalone app as well as using the following web servers:
13
+ - Puma
14
+ - Passenger
15
+ - Unicorn
16
+
17
+ For other setups, please reach out to [support@split.io](mailto:support@split.io).
18
+
19
+ ## Getting started
20
+ Below is a simple example that describes the instantiation and most basic usage of our SDK:
21
+ ```ruby
22
+ require 'splitclient-rb'
23
+
24
+ split_factory = SplitIoClient::SplitFactory.new('SDK_API_KEY')
25
+ split_client = split_factory.client
26
+
27
+ begin
28
+ split_client.block_until_ready
29
+ rescue SplitIoClient::SDKBlockerTimeoutExpiredException
30
+ puts 'SDK is not ready. Decide whether to continue or abort execution'
31
+ end
32
+
33
+ treatment = split_client.get_treatment('CUSTOMER_ID', 'SPLIT_NAME');
34
+
35
+ if treatment == 'on'
36
+ # insert code here to show on treatment
37
+ elsif treatment == 'off'
38
+ # insert code here to show off treatment
39
+ else
40
+ # insert your control treatment code here
41
+ end
42
+ ```
43
+ For multi-process environments you also need to setup Split Synchronizer. See [Sharing state: Redis integration](https://help.split.io/hc/en-us/articles/360020673251-Ruby-SDK#sharing-state-redis-integration)
44
+
45
+ Please refer to [our official docs](https://help.split.io/hc/en-us/articles/360020673251-Ruby-SDK) to learn about all the functionality provided by our SDK and the configuration options available for tailoring it to your current application setup.
46
+
47
+ ## Submitting issues
48
+ The Split team monitors all issues submitted to this [issue tracker](https://github.com/splitio/ruby-client/issues). We encourage you to use this issue tracker to submit any bug reports, feedback, and feature enhancements. We'll do our best to respond in a timely manner.
49
+
50
+ ## Contributing
51
+ Please see [Contributors Guide](CONTRIBUTORS-GUIDE.md) to find all you need to submit a Pull Request (PR).
52
+
53
+ ## License
54
+ Licensed under the Apache License, Version 2.0. See: [Apache License](http://www.apache.org/licenses/).
55
+
56
+ ## About Split
57
+ Split is the leading Feature Delivery Platform for engineering teams that want to confidently deploy features as fast as they can develop them. Split’s fine-grained management, real-time monitoring, and data-driven experimentation ensure that new features will improve the customer experience without breaking or degrading performance. Companies like Twilio, Salesforce, GoDaddy and WePay trust Split to power their feature delivery.
58
+
59
+ To learn more about Split, contact hello@split.io, or get started with feature flags for free at https://www.split.io/signup.
60
+
61
+ Split has built and maintains SDKs for:
62
+
63
+ * Java [Github](https://github.com/splitio/java-client) [Docs](https://help.split.io/hc/en-us/articles/360020405151-Java-SDK)
64
+ * Javascript [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020448791-JavaScript-SDK)
65
+ * Node [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020564931-Node-js-SDK)
66
+ * .NET [Github](https://github.com/splitio/.net-core-client) [Docs](https://help.split.io/hc/en-us/articles/360020240172--NET-SDK)
67
+ * Ruby [Github](https://github.com/splitio/ruby-client) [Docs](https://help.split.io/hc/en-us/articles/360020673251-Ruby-SDK)
68
+ * PHP [Github](https://github.com/splitio/php-client) [Docs](https://help.split.io/hc/en-us/articles/360020350372-PHP-SDK)
69
+ * Python [Github](https://github.com/splitio/python-client) [Docs](https://help.split.io/hc/en-us/articles/360020359652-Python-SDK)
70
+ * GO [Github](https://github.com/splitio/go-client) [Docs](https://help.split.io/hc/en-us/articles/360020093652-Go-SDK)
71
+ * Android [Github](https://github.com/splitio/android-client) [Docs](https://help.split.io/hc/en-us/articles/360020343291-Android-SDK)
72
+ * iOS [Github](https://github.com/splitio/ios-client) [Docs](https://help.split.io/hc/en-us/articles/360020401491-iOS-SDK)
73
+
74
+ For a comprehensive list of open source projects visit our [Github page](https://github.com/splitio?utf8=%E2%9C%93&query=%20only%3Apublic%20).
75
+
38
76
  **Learn more about Split:**
39
-
40
- Visit [split.io/product](https://www.split.io/product) for an overview of Split, or visit our documentation at [docs.split.io](http://docs.split.io) for more detailed information.
41
-
42
- **System Status:**
43
-
44
- We use a status page to monitor the availability of Split’s various services. You can check the current status at [status.split.io](http://status.split.io).
77
+
78
+ Visit [split.io/product](https://www.split.io/product) for an overview of Split, or visit our documentation at [help.split.io](http://help.split.io) for more detailed information.
@@ -11,11 +11,6 @@ module SplitIoClient
11
11
  end
12
12
 
13
13
  def call
14
- if @config.disable_impressions
15
- @config.logger.info('Disabling impressions service by config')
16
- return
17
- end
18
-
19
14
  if ENV['SPLITCLIENT_ENV'] == 'test'
20
15
  post_impressions
21
16
  else
@@ -74,11 +74,9 @@ module SplitIoClient
74
74
  @destroyed = true
75
75
  end
76
76
 
77
- def store_impression(split_name, matching_key, bucketing_key, treatment, store_impressions, attributes)
77
+ def store_impression(split_name, matching_key, bucketing_key, treatment, attributes)
78
78
  time = (Time.now.to_f * 1000.0).to_i
79
79
 
80
- return if @config.disable_impressions || !store_impressions
81
-
82
80
  @impressions_repository.add(
83
81
  matching_key,
84
82
  bucketing_key,
@@ -249,14 +247,12 @@ module SplitIoClient
249
247
  # Measure
250
248
  @adapter.metrics.time('sdk.' + calling_method, latency)
251
249
 
252
- unless @config.disable_impressions
253
- time = (Time.now.to_f * 1000.0).to_i
254
- @impressions_repository.add_bulk(
255
- matching_key, bucketing_key, treatments_labels_change_numbers, time
256
- )
250
+ time = (Time.now.to_f * 1000.0).to_i
251
+ @impressions_repository.add_bulk(
252
+ matching_key, bucketing_key, treatments_labels_change_numbers, time
253
+ )
257
254
 
258
- route_impressions(sanitized_split_names, matching_key, bucketing_key, time, treatments_labels_change_numbers, attributes)
259
- end
255
+ route_impressions(sanitized_split_names, matching_key, bucketing_key, time, treatments_labels_change_numbers, attributes)
260
256
 
261
257
  split_names_keys = treatments_labels_change_numbers.keys
262
258
  treatments = treatments_labels_change_numbers.values.map do |v|
@@ -328,14 +324,15 @@ module SplitIoClient
328
324
  end
329
325
 
330
326
  latency = (Time.now - start) * 1000.0
331
- store_impression(split_name, matching_key, bucketing_key, treatment_data, store_impressions, attributes)
327
+
328
+ store_impression(split_name, matching_key, bucketing_key, treatment_data, attributes) if store_impressions
332
329
 
333
330
  # Measure
334
331
  @adapter.metrics.time('sdk.' + calling_method, latency) unless multiple
335
332
  rescue StandardError => error
336
333
  @config.log_found_exception(__method__.to_s, error)
337
334
 
338
- store_impression(split_name, matching_key, bucketing_key, control_treatment, store_impressions, attributes)
335
+ store_impression(split_name, matching_key, bucketing_key, control_treatment, attributes) if store_impressions
339
336
 
340
337
  return parsed_control_exception
341
338
  end
@@ -42,7 +42,8 @@ module SplitIoClient
42
42
  trafficTypeName: event[:trafficTypeName],
43
43
  eventTypeId: event[:eventTypeId],
44
44
  value: event[:value].to_f,
45
- timestamp: event[:timestamp].to_i
45
+ timestamp: event[:timestamp].to_i,
46
+ properties: event[:properties]
46
47
  }
47
48
  end
48
49
  end
@@ -59,8 +59,6 @@ module SplitIoClient
59
59
  opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @impressions_queue_size, @redis_url
60
60
  )
61
61
  #Safeguard for users of older SDK versions.
62
- @disable_impressions = @impressions_queue_size == -1
63
- #Safeguard for users of older SDK versions.
64
62
  @impressions_bulk_size = opts[:impressions_bulk_size] || @impressions_queue_size > 0 ? @impressions_queue_size : 0
65
63
 
66
64
  @metrics_adapter = SplitConfig.init_cache_adapter(
@@ -224,12 +222,11 @@ module SplitIoClient
224
222
  attr_accessor :impression_listener_refresh_rate
225
223
 
226
224
  #
227
- # How big the impressions queue is before dropping impressions. -1 to disable it.
225
+ # How big the impressions queue is before dropping impressions
228
226
  #
229
227
  # @return [Integer]
230
228
  attr_accessor :impressions_queue_size
231
229
  attr_accessor :impressions_bulk_size
232
- attr_accessor :disable_impressions
233
230
 
234
231
  attr_accessor :redis_url
235
232
  attr_accessor :redis_namespace
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '7.0.1.pre.rc1'
2
+ VERSION = '7.0.1.pre.rc3'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: splitclient-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.1.pre.rc1
4
+ version: 7.0.1.pre.rc3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-17 00:00:00.000000000 Z
11
+ date: 2019-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: allocation_stats
@@ -284,16 +284,16 @@ extensions:
284
284
  - ext/murmurhash/extconf.rb
285
285
  extra_rdoc_files: []
286
286
  files:
287
+ - ".github/pull_request_template.md"
287
288
  - ".gitignore"
288
289
  - ".rubocop.yml"
289
290
  - ".simplecov"
290
291
  - ".travis.yml"
291
292
  - Appraisals
292
293
  - CHANGES.txt
293
- - Detailed-README.md
294
+ - CONTRIBUTORS-GUIDE.md
294
295
  - Gemfile
295
296
  - LICENSE
296
- - NEWS
297
297
  - README.md
298
298
  - Rakefile
299
299
  - ext/murmurhash/3_x86_32.c
data/Detailed-README.md DELETED
@@ -1,576 +0,0 @@
1
- # Split Ruby SDK
2
-
3
- Ruby [Split](https://www.split.io/) SDK client.
4
-
5
- ## Installation
6
-
7
- Install by running:
8
-
9
- $ gem install splitclient-rb
10
-
11
- If using [Bundler](https://bundler.io/), add this line to your `Gemfile`:
12
-
13
- ```ruby
14
- gem 'splitclient-rb'
15
- ```
16
-
17
- And then run:
18
-
19
- $ bundle install
20
-
21
- Or use any specific branch by adding the following to your `Gemfile` instead:
22
-
23
- ```ruby
24
- gem 'splitclient-rb', git: 'https://github.com/splitio/ruby-client.git', branch: 'branch_name'
25
- ```
26
-
27
- ## Usage
28
-
29
- ### Quick Setup
30
- ---
31
-
32
- Within your application, include the Split client using Ruby's `require`:
33
- ```ruby
34
- require 'splitclient-rb'
35
- ```
36
-
37
- Then, create a new split client instance with your API key, which can be found in your Organization Settings page, in the APIs tab.
38
-
39
- ```ruby
40
- factory = SplitIoClient::SplitFactoryBuilder.build('YOUR_API_KEY')
41
- split_client = factory.client
42
- ```
43
-
44
- ### Ruby on Rails
45
- ---
46
-
47
- Create an initializer (typically `config/initializers/split_client.rb`) with the following code:
48
-
49
- ```ruby
50
- Rails.configuration.split_client = SplitIoClient::SplitFactoryBuilder.build('YOUR_API_KEY').client
51
- ```
52
- And use the snippet below to access the client in your controllers:
53
-
54
- ```ruby
55
- Rails.application.config.split_client
56
- ```
57
-
58
- ### Using the SDK
59
- ---
60
-
61
- In its simplest form, using the SDK is reduced to calling the `get_treatment` method of the SDK client to decide what version of your features your customers should be served for a specific feature and user. You can then use an if-else-if block for the different treatments that you defined in the Split UI:
62
-
63
- ```ruby
64
- treatment = split_client.get_treatment('user_id', 'feature_name');
65
-
66
- if treatment == 'on'
67
- # insert code here to show on treatment
68
- elsif treatment == 'off'
69
- # insert code here to show off treatment
70
- else
71
- # handle the client returning the control treatment
72
- end
73
- ```
74
-
75
- **Note**: You can ensure the SDK resources are loaded before querying for treatments by using `block_until_ready`.
76
-
77
- ``` ruby
78
- factory = SplitIoClient::SplitFactoryBuilder.build('YOUR_API_KEY')
79
- split_client = factory.client
80
- split_client.block_until_ready # Wait for a specified time (default 15 seconds). SDK raises an SDKBlockerTimeoutExpiredException if not ready by then
81
- ```
82
-
83
- For features that use targeting rules based on user attributes, you can call the `get_treatment` method the following way:
84
-
85
- ```ruby
86
- split_client.get_treatment('user_id','feature_name', attr: 'val')
87
- ```
88
-
89
- e.g.
90
- ```ruby
91
- if split_client.get_treatment('employee_user_01','view_main_list', age: 35)
92
- my_app.display_main_list
93
- end
94
- ```
95
-
96
- Also, you can you can provide two different keys - one for matching and the other for bucketing:
97
- ```ruby
98
- split_client.get_treatment(
99
- { matching_key: 'subscriber_id', bucketing_key: 'user_id' },
100
- 'feature_name',
101
- attr: 'val'
102
- )
103
- ```
104
- An scenario that requires the usage of both keys is a visitor user that browses the site and at some point gets logged into the system: as an anonymous visitor, the user browses the home page and is given the `new_homepage` treatment based on her visitor id. If the visitor signs up and turns into a subscriber, then upon being given her `subscriber_id`, Split may decide to give her the old_homepage treatment. This is of course, the opposite of the desired outcome, as the visitor's entire homepage experience would change as soon as she signs up.
105
-
106
- Split solves this situation by introducing the concept of a matching_key and a bucketing key. By providing the `subscriber_id` as the `matching_key` and the `visitor_id` as the `bucketing_key`, Split will give the same treatment back to the user that it used to give to the visitor.
107
-
108
- The `bucketing_key` may be `nil`. In that case the `matching_key` would be used instead, so calling:
109
- ```ruby
110
- split_client.get_treatment(
111
- { matching_key: 'subscriber_id' },
112
- 'feature_name',
113
- attr: 'val'
114
- )
115
- ```
116
- It's exactly the same as calling:
117
- ```ruby
118
- split_client.get_treatment('subscriber_id' ,'feature_name', attr: 'val')
119
- ```
120
- **Important:** `matching_key` cannot be nil.
121
-
122
- #### Split Manager
123
-
124
- For some advanced use cases you can use the Split Manager. To get a `manager` instance, do:
125
-
126
- ```ruby
127
- split_manager = SplitIoClient::SplitFactoryBuilder.build('your_api_key', options).manager
128
- ```
129
- _Or simply call `#manager` in your factory instance if you built it previously._
130
-
131
- As an example, using the manager you could get a list of your splits by doing:
132
-
133
- ```ruby
134
- split_manager.splits
135
- ```
136
-
137
- Which would produce an output similar to:
138
-
139
- ```ruby
140
- [
141
- {
142
- name: 'some_feature',
143
- traffic_type_name: nil,
144
- killed: false,
145
- treatments: nil,
146
- change_number: 1469134003507
147
- },
148
- {
149
- name: 'another_feature',
150
- traffic_type_name: nil,
151
- killed: false,
152
- treatments: nil,
153
- change_number: 1469134003414
154
- },
155
- {
156
- name: 'even_more_features',
157
- traffic_type_name: nil,
158
- killed: false,
159
- treatments: nil,
160
- change_number: 1469133991063
161
- },
162
- {
163
- name: 'yet_another_feature',
164
- traffic_type_name: nil,
165
- killed: false,
166
- treatments: nil,
167
- change_number: 1469133757521
168
- }
169
- ]
170
- ```
171
-
172
- **Note**: `block_until_ready` is also available as a Split manager method
173
-
174
- #### Localhost Mode
175
-
176
- You can run the SDK in _localhost_ mode. In this mode, the SDK won't actually communicate with the Split API, but it'll rather return treatments based on a `.split` file on your local environment. This file must be a list of `split_name treatment_name_to_be_returned` entries. e.g.:
177
-
178
- ```
179
- reporting_v2 on
180
- double_writes_to_cassandra off
181
- new-navigation v3
182
- ```
183
-
184
- Using the file above, when calling:
185
- ```ruby
186
- split_client.get_treatment('foo', 'reporting_v2')
187
- ```
188
-
189
- The split client will return `on`. Note that this will be true for any bucketing or matching key.
190
-
191
- To configure the SDK to work in localhost mode, use `localhost` as the API key:
192
-
193
- ```ruby
194
- factory = SplitIoClient::SplitFactoryBuilder.build('localhost', path: '/where/to-look-for/<file_name>')
195
- split_client = factory.client
196
- ```
197
-
198
- By default, the SDK will look in your home directory (i.e. `~`) for the `.split` file. You can change this location by specifying an absolute path instead.
199
-
200
- When in localhost mode, you can make use of the SDK ability to automatically refresh the splits from the `.split` file. To do that, just specify a reload rate in seconds when building the split factory instance, like this:
201
-
202
- ```ruby
203
- factory = SplitIoClient::SplitFactoryBuilder.build('localhost', path: '/where/to-look-for/<file_name>', reload_rate: 3)
204
- ```
205
-
206
- ### SDK Input Validations
207
-
208
- In order to provide consistency among the SDKs for the different programming languages, provide better output to users in case of errors, and prevent unexpected errors to raise exceptions in your application, most of the parameters in the SDK methods are validated against a set of rules. Similarly, some of the configuration parameters must follow these rules, too. Check your application against the list below to prevent issues when using the SDK.
209
-
210
- #### get_treatment (split_client)
211
-
212
- - `key` (when not using matching_key and bucketing_key): must be a non-empty `String` or a `Symbol`, shorter than 250 characters. If a non-NaN `Numeric` value is used, it'll be converted to its `String` representation.
213
-
214
- - `matching_key`, `bucketing_key`: the containing `Hash` must have both keys, and the same rules above apply for each.
215
-
216
- - `split_name`: must be a non-empty `String` or a `Symbol`. Whitespaces will be trimmed from both ends of it. The trimmed version of the `split_name` will be used for both evaluation and to store the resulting impression. In addition, split must exist in the environment.
217
-
218
- - `attributes`: must be of type `Hash`.
219
-
220
- #### get_treatments (split_client)
221
-
222
- - `key`, `matching_key`, `bucketing_key`: same rules as those for `get_treatment` apply.
223
-
224
- - `split_names`: must be an non-empty Array. Split names will be filtered removing those not matching the corresponding rules for `split_name` in `get_treatment`. In addition, duplicates will be removed.
225
-
226
- #### track (split_client)
227
-
228
- - `key`: must be a non-empty `String` or a `Symbol`, shorter than 250 characters. If a non-NaN `Numeric` value is used, it'll be converted to its `String` representation.
229
-
230
- - `traffic_type_name`: must be a non-empty `String` or a `Symbol`. If `traffic_type_name` contains uppercase letters, it will be lowercased.
231
-
232
- - `event_type`: must be a non-empty `String` or `Symbol` that conforms with the regular expression `^[a-zA-Z0-9][-_.:a-zA-Z0-9]{0,79}$` (i.e. event name must be alphanumeric, cannot be more than 80 characters long, and can only include a dash, underscore, period, or colon as separators of alphanumeric characters).
233
-
234
- - `value`: must be either a non-NaN `Numeric` value, or nil.
235
-
236
- #### split (split_manager)
237
-
238
- - `split_name`: must be a non-empty `String` or a `Symbol`. In addition, split must exist in the environment.
239
-
240
- #### Configuration Parameters
241
-
242
- - `api_key`: must be a non-empty `String` or a `Symbol` of type `sdk` (`browser` type API keys will break this rule).
243
-
244
- #### Client Destroyed Rules
245
- Calls to the SDK methods are still possible after `destroy` is called. All will log an error message stating _client has been destroyed_.
246
-
247
- - `get_treatment` will return `control` for all calls (`get_treatments`, will return an Array of `control` values, correspondingly).
248
-
249
- - Calls to `track` will return `false`.
250
-
251
- - All calls to `split_manager` methods will return an empty Array, except `split`, which will return `nil`.
252
-
253
-
254
- ## Advanced Configuration
255
-
256
- Split client's default configuration should cover most scenarios. However, you can also provide custom configuration settings when initializing the factory using a hash of options. e.g.:
257
-
258
- ```ruby
259
- options = {
260
- impressions_refresh_rate: 10,
261
- debug_enabled: true,
262
- transport_debug_enabled: false
263
- }
264
-
265
- factory = SplitIoClient::SplitFactoryBuilder.build('your_api_key'], options)
266
- ```
267
-
268
- The following values can be customized:
269
-
270
- **base_uri** : URI for the api endpoints.
271
-
272
- *default value* = `https://sdk.split.io/api/`
273
-
274
- **connection_timeout** : Http client connection timeout (in seconds).
275
-
276
- *default value* = `5`
277
-
278
- **read_timeout** : Http socket read timeout (in seconds).
279
-
280
- *default value* = `5`
281
-
282
- **features_refresh_rate** : The SDK polls Split servers for changes to feature Splits every X seconds, where X is this property's value.
283
-
284
- *default value* = `5`
285
-
286
- **segments_refresh_rate** : The SDK polls Split servers for changes to segments every X seconds, where X is this property's value.
287
-
288
- *default value* = `60`
289
-
290
- **metrics_refresh_rate** : The SDK sends and flushes diagnostic metrics to Split servers every X seconds where X is this property's value.
291
-
292
- *default value* = `60`
293
-
294
- **impressions_refresh_rate** : The treatment log captures which customer saw what treatment ("on", "off", etc) at what time. This parameter controls how often this log is flushed back to Split servers to power analytics (in seconds).
295
-
296
- *default value* = `60`
297
-
298
- **impressions_queue_size** : The size of the impressions queue in case of `cache_adapter == :memory`. When the queue is full, existing impressions will be dropped.
299
-
300
- *default value* = 5000
301
-
302
- **impressions_bulk_size** : Maximum number of impressions to be sent to Split servers on each post.
303
-
304
- *default value* = defaults to `impressions_queue_size`
305
-
306
- **events_queue_size** : The size of the events queue in case of `cache_adapter == :memory`. When the queue is full, existing events will be dropped.
307
-
308
- *default value* = 500
309
-
310
- **debug_enabled** : Enables extra logging (verbose mode).
311
-
312
- *default value* = `false`
313
-
314
- **transport_debug_enabled** : Super verbose mode that prints network payloads among others.
315
-
316
- *default value* = `false`
317
-
318
- **logger** : Default logger for messages and errors.
319
-
320
- *default value* = `Logger.new($stdout)`
321
-
322
- **impression_listener** : Route impressions' information to a location of your choice (in addition to the SDK servers). _See [Impression Listener](#impression-listener) section for specifics._
323
-
324
- *default value* = (no impression listener)
325
-
326
- **labels_enabled** : Allows preventing labels from being sent to the Split servers, as they may contain sensitive information.
327
-
328
- *default value* = `true`
329
-
330
- **mode** : See [SDK Modes](#sdk-modes).
331
-
332
- *default value* = `:standalone`
333
-
334
- **cache_adapter** : Where to store data (splits, segments, and impressions) in between calls to the the Split servers. Supported options are `:memory` (default) and `:redis`.
335
-
336
- _To use Redis, include `redis-rb` in your app's Gemfile._
337
-
338
- *default value* = `:memory`
339
-
340
- **redis_namespace** : Prefix to add to elements in Redis cache when having to share redis with other applications.
341
-
342
- *default value* = `SPLITIO`
343
-
344
- **language** : SDK language (used in the Redis namespace for metrics and impressions, also included in requests' headers).
345
-
346
- *default value* = `'ruby'`
347
-
348
- **version** : SDK version (used in the Redis namespace for metrics and impressions, also included in requests' headers).
349
-
350
- *default value* = (current version of the SDK)
351
-
352
- **machine_ip** : SDK machine ip (used in the Redis namespace for metrics and impressions, also included in requests' headers).
353
-
354
- *default value* = (your current host's ip)
355
-
356
- **machine_name** : SDK machine name (used in the Redis namespace for metrics and impressions, also included in requests' headers).
357
-
358
- *default value* = (your current hostname)
359
-
360
- **cache_ttl** : Time to live in seconds for the memory cache values when using Redis.
361
-
362
- *default value* = `5`
363
-
364
- **max_cache_size** : Maximum number of items held in the memory cache values when using Redis. When cache is full an LRU strategy for pruning shall be used.
365
-
366
- *default value* = `500`
367
-
368
- **redis_url** : Redis URL or hash with configuration for the SDK to connect to. See [Redis#initialize](https://www.rubydoc.info/github/redis/redis-rb/Redis%3Ainitialize) for detailed information.
369
-
370
- *default value* = `'redis://127.0.0.1:6379/0'`
371
-
372
- _You can also use [Redis Sentinel](https://redis.io/topics/sentinel) by providing an array of sentinels in the Redis configuration:_
373
-
374
- ```ruby
375
- SENTINELS = [{host: '127.0.0.1', port: 26380},
376
- {host: '127.0.0.1', port: 26381}]
377
-
378
- options = {
379
- # Other options here
380
- redis_url: { url: 'redis://mymaster', sentinels: SENTINELS, role: :master }
381
- }
382
- ```
383
- ### Sample Configuration Using Redis
384
- ---
385
-
386
- ```ruby
387
- options = {
388
- # other options
389
- cache_adapter: :redis,
390
- mode: :consumer,
391
- redis_url: 'redis://127.0.0.1:6379/0'
392
- }
393
-
394
- split_client = SplitIoClient::SplitFactoryBuilder.build('YOUR_API_KEY', options).client
395
- ```
396
-
397
- ### Logging
398
- ---
399
-
400
- By default, the SDK makes use of Ruby stdlib's `Logger` class to log errors and events. You can change the following options when configuring the SDK in your application:
401
-
402
- ```ruby
403
- logger: Logger.new('logfile.log'), # Logger class instance.
404
- debug_enabled: true, # Verbose logging.
405
- transport_debug_enabled: true # Super verbose logging, including http request data.
406
- ```
407
-
408
- _Refer to [Advanced Configuration](#advanced-configuration) for more information._
409
-
410
- #### Impression Listener
411
-
412
- The SDK provides an optional featured called Impression Listener, that captures every single impression in your app.
413
-
414
- To set up an Impression Listener, define a class that implements a `log` instance method, which must receive the `impression` argument. e.g.:
415
-
416
- ```ruby
417
- class MyImpressionListener
418
- def log(impression)
419
- Logger.new($stdout).info(impression)
420
- end
421
- end
422
- ```
423
-
424
- In the example above, the listener simply takes an impression and logs it to the stdout. By providing a specific listener, you could send this information to a location of your choice. To use this feature, you need to specify the class name in the corresponding option of your configuration (i.e. initializer) like this:
425
-
426
- ```ruby
427
- {
428
- # other options
429
- impression_listener: MyImpressionListener.new # remember to initialize your class here
430
- }
431
- ```
432
-
433
- ### SDK Modes
434
- ---
435
-
436
- The SDK is capable of running in two different modes to fit in different infrastructure configurations:
437
-
438
- - `:standalone` - (default) : The SDK will retrieve information (e.g. split definitions) periodically from the Split servers, and store it in the memory cache. It'll also store the application execution information (e.g. impressions) in the cache and send it periodically to the Split servers. As it name implies, in this mode, the SDK neither relies nor synchronizes with any other component. _This mode is only available when using the `memory` cache adapter._
439
- - `:consumer` - If using a load balancer or more than one SDK in your application, guaranteeing that all changes in split definitions are picked up by all SDK instances at the same time is highly recommended in order to ensure consistent results across your infrastructure (i.e. getting the same treatment for a specific split and user pair). To achieve this, use the [Split Synchronizer](https://docs.split.io/docs/split-synchronizer)) and setup your SDKs to work in the `consumer` mode. Setting the components this way, all communication with the Split server is orchestrated by the Synchronizer, while the SDKs pick up definitions and store the execution information from / into a shared Redis data store. _This mode is only available when using the `redis` cache adapter. In addition, note that `block_until_ready` has no effect in this mode_
440
-
441
- _You can choose between these 2 modes setting the `mode` option in the config. An invalid combination of `cache_adaper` and `mode` will result in an Invalid Mode exception being raised._
442
-
443
- ## SDK Server Compatibility
444
-
445
- The Split Ruby SDK has been tested as a standalone app as well as using the following web servers:
446
- - Thin
447
- - Puma
448
- - Passenger
449
- - Unicorn
450
-
451
- For other setups, please reach out to [support@split.io](mailto:support@split.io).
452
-
453
- ### Server Compatibility Notes
454
- ---
455
-
456
- #### Unicorn and Puma in cluster mode (only for "memory mode")
457
-
458
- During the start of your application, the SDK spawns multiple threads. Each thread has an infinite loop inside,
459
- which is used to fetch splits/segments or send impressions/metrics to the Split service continuously.
460
- When using Unicorn or Puma in cluster mode (i.e. with `workers` > 0) the application
461
- server will spawn multiple child processes, but they won't recreate the threads that existed in the parent process.
462
- So, if your application is running in Unicorn or Puma in cluster mode you need to make two small extra steps.
463
-
464
- For both servers you will need to have the following line in your `config/initializers/splitclient.rb`:
465
-
466
- ```ruby
467
- Rails.configuration.split_factory = factory
468
- ```
469
-
470
- #### Unicorn
471
-
472
- If you’re using Unicorn you’ll need to include these lines in your Unicorn config (likely `config/unicorn.rb`):
473
-
474
- ```ruby
475
- before_fork do |server, worker|
476
- # keep your existing before_fork code if any
477
- Rails.configuration.split_factory.stop!
478
- end
479
-
480
- after_fork do |server, worker|
481
- # keep your existing after_fork code if any
482
- Rails.configuration.split_factory.resume!
483
- end
484
- ```
485
-
486
- #### Puma
487
-
488
- If using Puma in cluster mode, add these lines to your Puma config (likely `config/puma.rb`):
489
-
490
- ```ruby
491
- before_fork do
492
- # keep your existing before_fork code if any
493
- Rails.configuration.split_factory.stop!
494
- end
495
-
496
- on_worker_boot do
497
- # keep your existing on_worker_boot code if any
498
- Rails.configuration.split_factory.resume!
499
- end
500
- ```
501
-
502
- By doing the above, the SDK will recreate the threads for each new worker and prevent the master process (that doesn't handle requests) from needlessly querying the Split service.
503
-
504
- ## Proxy Support
505
-
506
- SDK uses the `http_proxy` environment variable. Assign your proxy address to the variable value in the following format, and the SDK will make use of it:
507
-
508
- ```
509
- http_proxy=http://username:password@hostname:port
510
- ```
511
-
512
- ## Development Notes
513
-
514
- Check out the repository and run `bin/setup` to install dependencies. You can also run `bin/console` to get an interactive prompt.
515
-
516
- To install this gem onto your local machine, run `bundle exec rake install`.
517
-
518
- ### Tests & Coverage
519
- ---
520
-
521
- The gem uses `rspec` for unit testing. You can find the files for the unit tests and the specs helper file (`spec_helper.rb`) under the default `/spec` folder.
522
-
523
- To run all the specs in the `spec` folder, use the provided rake task (_make sure Redis is running in localhost_):
524
-
525
- ```bash
526
- bundle exec rspec
527
- ```
528
-
529
- `Simplecov` is used for coverage reporting. Upon executing the rake task it will store the reports in the `/coverage` folder.
530
-
531
- ### Benchmarks
532
- ---
533
-
534
- To benchmark the hashing algorithms (MurmurHash) run:
535
-
536
- ```bash
537
- bundle exec rake benchmark_hashing_algorithm
538
- ```
539
-
540
- ### Contribute
541
- ---
542
-
543
- Bug reports and pull requests are welcome on GitHub at https://github.com/splitio/ruby-client.
544
-
545
- ### Release
546
- ---
547
-
548
- To build and release a new version of the gem, document any changes into the `CHANGES.txt` and the `NEWS` files. Then, increase the version number in `version.rb`.
549
- **Note**: This step assumes that all new features and fixes have been merged into the `development` branch, tested, validated, and finally merged into the `master` branch of the `ruby-client` repository.
550
-
551
- To build a new version of the gem after making the changes specified above, run:
552
-
553
- ```bash
554
- gem build splitclient-rb.gemspec
555
- ```
556
-
557
- That will generate a `splitclient-rb-x.x.x.gem` file, with the corresponding version information on it.
558
- To release the new version of the gem at [rubygems.org](rubygems.org) run the following command:
559
-
560
- ```bash
561
- gem push splitclient-rb-x.x.x.gem
562
- ```
563
-
564
- _A valid rubygems username and password is required._
565
-
566
- Once released, `splitclient-rb-x.x.x` version will be available for use in any ruby application.
567
-
568
- To get a specific gem version in a Rails application that uses Bundler, add this line to your gemfile:
569
-
570
- ```ruby
571
- gem 'splitclient-rb', '~> x.x.x'
572
- ```
573
-
574
- ## License
575
-
576
- The gem is available as open source under the terms of the [Apache License](http://www.apache.org/licenses/).
data/NEWS DELETED
@@ -1,144 +0,0 @@
1
- 6.4.0 (Jul 05, 2019)
2
- - Added properties to track method.
3
-
4
- 6.3.0 (Apr 30, 2019)
5
-
6
- - Added Dynamic Configurations support through two new methods that mimick the regular ones, changing the type of what is returned.
7
- - get_treatment_with_config: Same as get_treatment but returning the treatment with it's config.
8
- - get_treatments_with_config: Same as get_treatments, but instead of a map of string it returns a map of treatments with config.
9
- - Added configs to SplitViews returned by the manager module.
10
- - Updated localhost mode. Now besides supporting the old text files with `.split` extension (to be deprecated soon), we support YAML (.yaml/.yml) files where you can
11
- define configurations for your treatments and also whitelisted keys. Read more in our docs!
12
-
13
- 6.2.0
14
- Ensure SDK flushes information to Split servers on client destroy
15
- Fix for compatibility issue between Faraday < 0.13 and net-http-persistent 3
16
- Change default features refresh rate interval to 5 seconds
17
-
18
- 6.1.0
19
-
20
- Review input validation for client API methods: get_treatment, get_treatments, track, manager. Add input validation to block_until_ready, client startup, and destroy
21
- Add additional logging to the SDK Client in order to help debug matcher related issues
22
- Fix for issue causing redis_url parameter to be ignored
23
-
24
- 6.0.1
25
-
26
- Fix an issue in events and impressions API calls log messages introduced in 6.0.0
27
-
28
- 6.0.0
29
-
30
- BREAKING CHANGE: Remove producer mode, make memory adapter mandatory in standalone mode, and Redis adapter mandatory in consumer mode.
31
- BREAKING CHANGE: Reduce the total number of Redis operations of the SDK by changing the impressions storage format and adding a memory cache for splits and segments. It requires to have Split Synchronizer > v2.0.0 running if you are using Redis.
32
- SDK is now compatible with net-http-persistent 3.0.
33
-
34
- 5.1.2
35
-
36
- Add input validation for client API methods: get_treatment, get_treatments, track, manager
37
-
38
- 5.1.1
39
-
40
- Reduces the number of calls to Redis when calling #client.get_treatments using such cache adapter.
41
-
42
- 5.1.0
43
-
44
- Prevent unhandled exceptions from raising when API get calls fail on Segments and Treatments.
45
-
46
- 5.0.3
47
-
48
- Creates a new configuration parameter (impressions_bulk_size) to manage the max number of impressions sent to the Split backend on each post.
49
- Changes impressions_queue_size so that it manages only the queue size in the memory adapter.
50
- A backwards compatibility fail safe is included for users of previous SDK versions.
51
-
52
- 5.0.2
53
-
54
- Turn Impression Listener into an optional SDK feature.
55
- Prevents the impression thread from being started if a listener is not in place
56
-
57
- 5.0.1
58
-
59
- Adding stop! method to the factory.
60
- With this method the user will be able to stop the threads that queries the Split Service. This will be used in the before_fork configuration in Puma and Unicorn to stop the threads in the master process.
61
-
62
- 5.0.0
63
-
64
- This is a breaking change in how users buckets are allocated.
65
- Ruby SDK was wrongly picking up the right buckets and defauled to
66
- use a "legacy hashing" instead of our moder murmur3 algo which is
67
- what other SDKs use. Please reach out to support@split.io for help
68
- on how to upgrade to this release.
69
-
70
- 4.5.0
71
-
72
- Add JRuby support
73
-
74
- 4.4.0
75
-
76
- Add the ability to send event data to split service (.track() api)
77
-
78
- 4.3.0
79
-
80
- Add support for impression listener, there is an ability to use user-defined class to capture all impressions
81
- Now you can apply attribute matcher to the traffic type
82
-
83
- 4.2.0
84
-
85
- Introduce new matchers: boolean and regexp (string).
86
- Remove unneeded dependencies
87
- Introduce dependency matcher, which allows treatment of one split to depend on the evaluation of another.
88
-
89
- 4.1.0
90
-
91
- Introduce set matchers: part of set, contains all and contains any, starts with, ends with and contains.
92
-
93
- 4.0.0
94
-
95
- Add support for murmur3 hashing algorithm
96
- Optimize gem memory usage
97
-
98
- 3.3.0
99
-
100
- Add support for traffic allocation
101
-
102
- 3.1.0
103
-
104
- Now supporting Redis as a cache adapter
105
- Factory is build now as SplitIoClient::SplitFactoryBuilder.build('<API_KEY>')
106
-
107
- 3.0.2
108
-
109
- now support also client.get_treatment( { :matching_key = 'bb' , "bucketing_key = ''}, ....)
110
-
111
- 2.0.1
112
-
113
- No news for this release
114
-
115
- 2.0.0
116
-
117
- Instantiation of the split client is now through a factory:
118
-
119
- factory = SplitIoClient::SplitFactory.new("rbk5je8be5qflpa047m17fe4ra", options)
120
- client = factory.client
121
- manager = factory.manager
122
-
123
- 1.0.4
124
-
125
- Added AND combiner for conditions support. Added events_uri config param which is the url where the metrics post are send to.
126
-
127
- 1.0.3
128
-
129
- This version of the gem fixes two minor bugs related to the config option for the refresh rates, as well as an inconsistency for the split definitions that are not created from the web app, but directly from the api instead.
130
-
131
- 1.0.2
132
-
133
- Support for all the new matchers including: number comparison with >=, <=, =, between; date comparison with is on or before, is on or after, is on, between; attribute value in a defined set of values.
134
- No other major updates for this release.
135
-
136
- 1.0.1
137
-
138
- isTreatment was removed from the API
139
- local environment file was removed to match the rest of the SDKs. "split".
140
- No other major updates for this release.
141
-
142
- 1.0.0
143
-
144
- No news for this release.