flipt_client 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +90 -0
- data/flipt-client-ruby.gemspec +25 -0
- data/lib/ext/darwin_arm64/libfliptengine.d +1 -0
- data/lib/ext/darwin_arm64/libfliptengine.dylib +0 -0
- data/lib/ext/darwin_arm64/libfliptengine.rlib +0 -0
- data/lib/ext/flipt_engine.h +32 -0
- data/lib/ext/linux_arm64/libfliptengine.d +1 -0
- data/lib/ext/linux_arm64/libfliptengine.rlib +0 -0
- data/lib/ext/linux_arm64/libfliptengine.so +0 -0
- data/lib/ext/linux_x86_64/flipt_engine.h +32 -0
- data/lib/ext/linux_x86_64/libfliptengine.d +1 -0
- data/lib/ext/linux_x86_64/libfliptengine.rlib +0 -0
- data/lib/ext/linux_x86_64/libfliptengine.so +0 -0
- data/lib/flipt_client/version.rb +5 -0
- data/lib/flipt_client.rb +80 -0
- metadata +60 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3fba410b0fcad63979b3cb5f1e0128afccf64054e3b4ad0712c3040c946beaff
|
4
|
+
data.tar.gz: 56b652a202967aae88db7c4915a259f4490f5f9be043e008215728acf018dcd4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f64f29f65b557a948ee83e20dea471b21c7c7c55561145c223c94e7dd35090dc61265ae0017ce8975bf271552fe8ed09a1140b5f549edc483d9e73e8be1a9514
|
7
|
+
data.tar.gz: ed2f3b489f6931b4bcd057d4f60a75c04d26d6b1b618bd69c8583631f74b1405f47f86859ebab42d898b766c62b1b9b535c7e8eb68d59e93d5cc1c6114aada14
|
data/README.md
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# Flipt Client Ruby
|
2
|
+
|
3
|
+
The `flipt-client-ruby` directory contains the Ruby source code for the Flipt client-side evaluation client.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Currently, to use this client, you'll need to build the dynamic library and the gem locally and install it. This is a temporary solution until we can figure out a better way to package and distribute the libraries.
|
8
|
+
|
9
|
+
The dynamic library will contain the functionality necessary for the client to make calls to the Flipt engine via FFI. See [flipt-engine](../flipt-engine) for more information on the Flipt engine and FFI.
|
10
|
+
|
11
|
+
### Prerequisites
|
12
|
+
|
13
|
+
- [Rust](https://www.rust-lang.org/tools/install)
|
14
|
+
- [Ruby](https://www.ruby-lang.org/en/documentation/installation/)
|
15
|
+
- [Make](https://www.gnu.org/software/make/)
|
16
|
+
|
17
|
+
### Automated Build
|
18
|
+
|
19
|
+
1. Build and copy the dynamic library to the `flipt-client-ruby/lib/ext` directory for your platform. This will also build and install the `flipt_client` gem on your local machine. You can do this by running the following command from the root of the repository:
|
20
|
+
|
21
|
+
```bash
|
22
|
+
make ruby
|
23
|
+
```
|
24
|
+
|
25
|
+
### Manual Build
|
26
|
+
|
27
|
+
1. Build the Rust dynamic library
|
28
|
+
|
29
|
+
```bash
|
30
|
+
cargo build --release
|
31
|
+
```
|
32
|
+
|
33
|
+
This should generate a `target/` directory in the root of this repository, which contains the dynamically linked library built for your platform.
|
34
|
+
|
35
|
+
2. You'll need to copy the dynamic library to the `flipt-client-ruby/lib/ext/$OS_$ARCH/` directory. This is a temporary solution until we can figure out a better way to package the libraries with the gem.
|
36
|
+
|
37
|
+
The `path/to/lib` will be the path to the dynamic library which will have the following paths depending on your platform.
|
38
|
+
|
39
|
+
- **Linux**: `{REPO_ROOT}/target/release/libfliptengine.so`
|
40
|
+
- **Windows**: `{REPO_ROOT}/target/release/libfliptengine.dll`
|
41
|
+
- **MacOS**: `{REPO_ROOT}/target/release/libfliptengine.dylib`
|
42
|
+
|
43
|
+
3. You can then build the gem and install it locally. You can do this by running the following command from the `flipt-client-ruby` directory:
|
44
|
+
|
45
|
+
```bash
|
46
|
+
rake build
|
47
|
+
gem install pkg/flipt_client-{version}.gem
|
48
|
+
```
|
49
|
+
|
50
|
+
## Usage
|
51
|
+
|
52
|
+
In your Ruby code you can import this client and use it as so:
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
require 'flipt_client'
|
56
|
+
|
57
|
+
# namespace is the first positional argument and is optional here and will have a value of "default" if not specified.
|
58
|
+
# opts is the second positional argument and is also optional, the structure is:
|
59
|
+
# {
|
60
|
+
# "url": "http://localhost:8080",
|
61
|
+
# "update_interval": 120,
|
62
|
+
# "auth_token": "secret"
|
63
|
+
# }
|
64
|
+
#
|
65
|
+
# You can replace the url with where your upstream Flipt instance points to, the update interval for how long you are willing
|
66
|
+
# to wait for updated flag state, and the auth token if your Flipt instance requires it.
|
67
|
+
client = Flipt::EvaluationClient.new()
|
68
|
+
resp = client.evaluate_variant({ flag_key: 'buzz', entity_id: 'someentity', context: { fizz: 'buzz' } })
|
69
|
+
|
70
|
+
puts resp
|
71
|
+
```
|
72
|
+
|
73
|
+
## Load Test
|
74
|
+
|
75
|
+
1. To run the load test, you'll need to have Flipt running locally. You can do this by running the following command from the root of the repository:
|
76
|
+
|
77
|
+
```bash
|
78
|
+
docker run -d \
|
79
|
+
-p 8080:8080 \
|
80
|
+
-p 9000:9000 \
|
81
|
+
docker.flipt.io/flipt/flipt:latest
|
82
|
+
```
|
83
|
+
|
84
|
+
2. You'll also need to have the `flipt_client` gem installed locally. See [Installation](#installation) above.
|
85
|
+
3. In the Flipt UI (<http://localhost:8080>) you'll also need to create a new boolean flag with the key `my-feature` in the default namespace.
|
86
|
+
4. You can then run the load test by running the following command from this folder:
|
87
|
+
|
88
|
+
```bash
|
89
|
+
bundle exec ruby load_test.rb
|
90
|
+
```
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/flipt_client/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'flipt_client'
|
7
|
+
spec.version = Flipt::VERSION
|
8
|
+
spec.authors = ['Flipt Devs']
|
9
|
+
spec.email = ['dev@flipt.io']
|
10
|
+
spec.summary = 'Flipt Client Evaluation SDK'
|
11
|
+
spec.description = 'Flipt Client Evaluation SDK'
|
12
|
+
spec.homepage = 'https://www.flipt.io'
|
13
|
+
spec.license = 'MIT'
|
14
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
15
|
+
|
16
|
+
# spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
17
|
+
|
18
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
19
|
+
spec.metadata["source_code_uri"] = "https://github.com/flipt-io/flipt-client-sdks"
|
20
|
+
|
21
|
+
spec.files = Dir.glob('{lib}/**/*') + ['README.md', 'flipt-client-ruby.gemspec']
|
22
|
+
spec.bindir = 'exe'
|
23
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
|
+
spec.require_paths = ['lib']
|
25
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
/Users/runner/work/flipt-client-sdks/flipt-client-sdks/target/aarch64-apple-darwin/release/libfliptengine.rlib: /Users/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/build.rs /Users/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/error/mod.rs /Users/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/evaluator/mod.rs /Users/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/lib.rs /Users/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/models/common.rs /Users/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/models/flipt.rs /Users/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/models/mod.rs /Users/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/models/source.rs /Users/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/parser/mod.rs /Users/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/store/mod.rs
|
Binary file
|
Binary file
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#include <stdarg.h>
|
2
|
+
#include <stdbool.h>
|
3
|
+
#include <stdint.h>
|
4
|
+
#include <stdlib.h>
|
5
|
+
|
6
|
+
/**
|
7
|
+
* # Safety
|
8
|
+
*
|
9
|
+
* This function will initialize an Engine and return a pointer back to the caller.
|
10
|
+
*/
|
11
|
+
void *initialize_engine(const char *const *namespaces, const char *opts);
|
12
|
+
|
13
|
+
/**
|
14
|
+
* # Safety
|
15
|
+
*
|
16
|
+
* This function will take in a pointer to the engine and return a variant evaluation response.
|
17
|
+
*/
|
18
|
+
const char *evaluate_variant(void *engine_ptr, const char *evaluation_request);
|
19
|
+
|
20
|
+
/**
|
21
|
+
* # Safety
|
22
|
+
*
|
23
|
+
* This function will take in a pointer to the engine and return a boolean evaluation response.
|
24
|
+
*/
|
25
|
+
const char *evaluate_boolean(void *engine_ptr, const char *evaluation_request);
|
26
|
+
|
27
|
+
/**
|
28
|
+
* # Safety
|
29
|
+
*
|
30
|
+
* This function will free the memory occupied by the engine.
|
31
|
+
*/
|
32
|
+
void destroy_engine(void *engine_ptr);
|
@@ -0,0 +1 @@
|
|
1
|
+
/target/aarch64-unknown-linux-gnu/release/libfliptengine.rlib: /project/flipt-engine/build.rs /project/flipt-engine/src/error/mod.rs /project/flipt-engine/src/evaluator/mod.rs /project/flipt-engine/src/lib.rs /project/flipt-engine/src/models/common.rs /project/flipt-engine/src/models/flipt.rs /project/flipt-engine/src/models/mod.rs /project/flipt-engine/src/models/source.rs /project/flipt-engine/src/parser/mod.rs /project/flipt-engine/src/store/mod.rs
|
Binary file
|
Binary file
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#include <stdarg.h>
|
2
|
+
#include <stdbool.h>
|
3
|
+
#include <stdint.h>
|
4
|
+
#include <stdlib.h>
|
5
|
+
|
6
|
+
/**
|
7
|
+
* # Safety
|
8
|
+
*
|
9
|
+
* This function will initialize an Engine and return a pointer back to the caller.
|
10
|
+
*/
|
11
|
+
void *initialize_engine(const char *const *namespaces, const char *opts);
|
12
|
+
|
13
|
+
/**
|
14
|
+
* # Safety
|
15
|
+
*
|
16
|
+
* This function will take in a pointer to the engine and return a variant evaluation response.
|
17
|
+
*/
|
18
|
+
const char *evaluate_variant(void *engine_ptr, const char *evaluation_request);
|
19
|
+
|
20
|
+
/**
|
21
|
+
* # Safety
|
22
|
+
*
|
23
|
+
* This function will take in a pointer to the engine and return a boolean evaluation response.
|
24
|
+
*/
|
25
|
+
const char *evaluate_boolean(void *engine_ptr, const char *evaluation_request);
|
26
|
+
|
27
|
+
/**
|
28
|
+
* # Safety
|
29
|
+
*
|
30
|
+
* This function will free the memory occupied by the engine.
|
31
|
+
*/
|
32
|
+
void destroy_engine(void *engine_ptr);
|
@@ -0,0 +1 @@
|
|
1
|
+
/home/runner/work/flipt-client-sdks/flipt-client-sdks/target/x86_64-unknown-linux-gnu/release/libfliptengine.rlib: /home/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/build.rs /home/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/error/mod.rs /home/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/evaluator/mod.rs /home/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/lib.rs /home/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/models/common.rs /home/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/models/flipt.rs /home/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/models/mod.rs /home/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/models/source.rs /home/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/parser/mod.rs /home/runner/work/flipt-client-sdks/flipt-client-sdks/flipt-engine/src/store/mod.rs
|
Binary file
|
Binary file
|
data/lib/flipt_client.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'flipt_client/version'
|
4
|
+
require 'ffi'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
module Flipt
|
8
|
+
class Error < StandardError; end
|
9
|
+
|
10
|
+
class EvaluationClient
|
11
|
+
extend FFI::Library
|
12
|
+
|
13
|
+
FLIPTENGINE = 'libfliptengine'
|
14
|
+
|
15
|
+
def self.libfile
|
16
|
+
case RbConfig::CONFIG['arch']
|
17
|
+
when /arm64-darwin/
|
18
|
+
"ext/darwin_arm64/#{FLIPTENGINE}.dylib"
|
19
|
+
when /arm64-linux|aarch64-linux/
|
20
|
+
"ext/linux_arm64/#{FLIPTENGINE}.so"
|
21
|
+
when /x86_64-linux/
|
22
|
+
"ext/linux_x86_64/#{FLIPTENGINE}.so"
|
23
|
+
else
|
24
|
+
raise "unsupported platform #{RbConfig::CONFIG['arch']}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
ffi_lib File.expand_path(libfile, __dir__)
|
29
|
+
|
30
|
+
# void *initialize_engine(const char *const *namespaces, const char *opts);
|
31
|
+
attach_function :initialize_engine, %i[pointer string], :pointer
|
32
|
+
# void destroy_engine(void *engine_ptr);
|
33
|
+
attach_function :destroy_engine, [:pointer], :void
|
34
|
+
# const char *evaluate_variant(void *engine_ptr, const char *evaluation_request);
|
35
|
+
attach_function :evaluate_variant, %i[pointer string], :string
|
36
|
+
# const char *evaluate_boolean(void *engine_ptr, const char *evaluation_request);
|
37
|
+
attach_function :evaluate_boolean, %i[pointer string], :string
|
38
|
+
|
39
|
+
def initialize(namespace = 'default', opts = {})
|
40
|
+
@namespace = namespace
|
41
|
+
namespace_list = [namespace]
|
42
|
+
ns = FFI::MemoryPointer.new(:pointer, namespace_list.size)
|
43
|
+
namespace_list.each_with_index do |namespace, i|
|
44
|
+
ns[i].put_pointer(0, FFI::MemoryPointer.from_string(namespace))
|
45
|
+
end
|
46
|
+
|
47
|
+
@engine = self.class.initialize_engine(ns, opts.to_json)
|
48
|
+
ObjectSpace.define_finalizer(self, self.class.finalize(@engine))
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.finalize(engine)
|
52
|
+
proc { destroy_engine(engine) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def evaluate_variant(evaluation_request = {})
|
56
|
+
evaluation_request[:namespace_key] = @namespace
|
57
|
+
validate_evaluation_request(evaluation_request)
|
58
|
+
resp = self.class.evaluate_variant(@engine, evaluation_request.to_json)
|
59
|
+
JSON.parse(resp)
|
60
|
+
end
|
61
|
+
|
62
|
+
def evaluate_boolean(evaluation_request = {})
|
63
|
+
evaluation_request[:namespace_key] = @namespace
|
64
|
+
validate_evaluation_request(evaluation_request)
|
65
|
+
resp = self.class.evaluate_boolean(@engine, evaluation_request.to_json)
|
66
|
+
JSON.parse(resp)
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
def validate_evaluation_request(evaluation_request)
|
71
|
+
if evaluation_request[:entity_id].nil? || evaluation_request[:entity_id].empty?
|
72
|
+
raise ArgumentError, 'entity_id is required'
|
73
|
+
elsif evaluation_request[:namespace_key].nil? || evaluation_request[:namespace_key].empty?
|
74
|
+
raise ArgumentError, 'namespace_key is required'
|
75
|
+
elsif evaluation_request[:flag_key].nil? || evaluation_request[:flag_key].empty?
|
76
|
+
raise ArgumentError, 'flag_key is required'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: flipt_client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Flipt Devs
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-12-25 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Flipt Client Evaluation SDK
|
14
|
+
email:
|
15
|
+
- dev@flipt.io
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- README.md
|
21
|
+
- flipt-client-ruby.gemspec
|
22
|
+
- lib/ext/darwin_arm64/libfliptengine.d
|
23
|
+
- lib/ext/darwin_arm64/libfliptengine.dylib
|
24
|
+
- lib/ext/darwin_arm64/libfliptengine.rlib
|
25
|
+
- lib/ext/flipt_engine.h
|
26
|
+
- lib/ext/linux_arm64/libfliptengine.d
|
27
|
+
- lib/ext/linux_arm64/libfliptengine.rlib
|
28
|
+
- lib/ext/linux_arm64/libfliptengine.so
|
29
|
+
- lib/ext/linux_x86_64/flipt_engine.h
|
30
|
+
- lib/ext/linux_x86_64/libfliptengine.d
|
31
|
+
- lib/ext/linux_x86_64/libfliptengine.rlib
|
32
|
+
- lib/ext/linux_x86_64/libfliptengine.so
|
33
|
+
- lib/flipt_client.rb
|
34
|
+
- lib/flipt_client/version.rb
|
35
|
+
homepage: https://www.flipt.io
|
36
|
+
licenses:
|
37
|
+
- MIT
|
38
|
+
metadata:
|
39
|
+
homepage_uri: https://www.flipt.io
|
40
|
+
source_code_uri: https://github.com/flipt-io/flipt-client-sdks
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 2.3.0
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubygems_version: 3.3.26
|
57
|
+
signing_key:
|
58
|
+
specification_version: 4
|
59
|
+
summary: Flipt Client Evaluation SDK
|
60
|
+
test_files: []
|