bullet-train-client 1.0.0 → 1.1.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.
- checksums.yaml +4 -4
- data/Rakefile +6 -0
- data/bullet-train-ruby.gemspec +6 -1
- data/lib/bullet-train.rb +2 -68
- data/lib/bullet_train.rb +109 -0
- metadata +61 -5
- data/.vscode/launch.json +0 -15
- data/test.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5c47e0b0313009db4ae84b4721fa39b87bc38f4660414a8ae8902520a204354
|
4
|
+
data.tar.gz: acc7b67eb95509fe392efea7f258bd19fdf4a84c10c4fe3f7e50bd89363dc10a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5df011ddd786de343625b5a21b9e4b2067b6aa2e3c253c0f83dacc7d13211a8f47961eaef24014d91a440add3c693033fe57f211b4354b11ddd159ce1d8233b6
|
7
|
+
data.tar.gz: f0134af7e9ce7a6b469b2978521336b30b08d08aff1bbffbadd7d33cfd1b30d17a5bb6f65b5d56aadf7834a5bb278cab0c81a956588f40bd4e464143ab35f6a5
|
data/Rakefile
ADDED
data/bullet-train-ruby.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "bullet-train-client"
|
3
|
-
spec.version = "1.
|
3
|
+
spec.version = "1.1.0"
|
4
4
|
spec.authors = ["Tom Stuart"]
|
5
5
|
spec.email = ["tom@solidstategroup.com"]
|
6
6
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
@@ -8,4 +8,9 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.summary = "Bullet Train - Ship features with confidence"
|
9
9
|
spec.description = "Ruby Client for Bullet-Train. Ship features with confidence using feature flags and remote config. Host yourself or use our hosted version at https://bullet-train.io"
|
10
10
|
spec.homepage = "https://bullet-train.io"
|
11
|
+
|
12
|
+
spec.add_development_dependency 'bundler'
|
13
|
+
spec.add_development_dependency 'rake'
|
14
|
+
spec.add_development_dependency 'rspec'
|
15
|
+
spec.add_dependency 'faraday'
|
11
16
|
end
|
data/lib/bullet-train.rb
CHANGED
@@ -1,69 +1,3 @@
|
|
1
|
-
#
|
2
|
-
require "open-uri"
|
3
|
-
require "json"
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
|
6
|
-
@@apiUrl = ""
|
7
|
-
@@environmentKey = ""
|
8
|
-
|
9
|
-
def initialize(apiKey = nil, apiUrl = "https://api.bullet-train.io/api/v1/")
|
10
|
-
@@environmentKey = apiKey
|
11
|
-
@@apiUrl = apiUrl
|
12
|
-
end
|
13
|
-
|
14
|
-
def getJSON(method = nil)
|
15
|
-
response = open(@@apiUrl + "" + method.concat("?format=json"),
|
16
|
-
"x-environment-key" => @@environmentKey).read
|
17
|
-
return JSON.parse(response)
|
18
|
-
end
|
19
|
-
|
20
|
-
def processFlags(inputFlags)
|
21
|
-
flags = {}
|
22
|
-
|
23
|
-
for feature in inputFlags
|
24
|
-
featureName = feature["feature"]["name"].downcase.gsub(/\s+/, "_")
|
25
|
-
enabled = feature["enabled"]
|
26
|
-
state = feature["feature_state_value"]
|
27
|
-
flags[featureName] = {"enabled" => enabled, "value" => state}
|
28
|
-
end
|
29
|
-
|
30
|
-
return flags
|
31
|
-
end
|
32
|
-
|
33
|
-
def getFlagsForUser(identity = nil)
|
34
|
-
processFlags(getJSON("flags/#{identity}"))
|
35
|
-
end
|
36
|
-
|
37
|
-
def getFlags()
|
38
|
-
processFlags(getJSON("flags/"))
|
39
|
-
end
|
40
|
-
|
41
|
-
def getValue(key, userId = nil)
|
42
|
-
flags = nil
|
43
|
-
# Get the features
|
44
|
-
if userId != nil
|
45
|
-
flags = getFlagsForUser(userId)
|
46
|
-
else
|
47
|
-
flags = getFlags()
|
48
|
-
end
|
49
|
-
# Return the value
|
50
|
-
return flags[key]["value"]
|
51
|
-
end
|
52
|
-
|
53
|
-
def hasFeature(key, userId = nil)
|
54
|
-
# Get the features
|
55
|
-
flags = nil
|
56
|
-
if userId != nil
|
57
|
-
flags = getFlagsForUser(userId)
|
58
|
-
else
|
59
|
-
flags = getFlags()
|
60
|
-
end
|
61
|
-
|
62
|
-
# Work out if this feature exists
|
63
|
-
if flags[key] == nil
|
64
|
-
return false
|
65
|
-
else
|
66
|
-
return flags[key]["enabled"]
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
3
|
+
require 'bullet_train'
|
data/lib/bullet_train.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'faraday'
|
3
|
+
|
4
|
+
class BulletTrain
|
5
|
+
attr_reader :bt_api
|
6
|
+
|
7
|
+
def initialize(opts = {})
|
8
|
+
@opts = {
|
9
|
+
api_key: opts[:api_key] || self.class.api_key,
|
10
|
+
url: opts[:url] || self.class.api_url
|
11
|
+
}
|
12
|
+
|
13
|
+
@bt_api = Faraday.new(url: @opts[:url]) do |faraday|
|
14
|
+
faraday.headers['Accept'] = 'application/json'
|
15
|
+
faraday.headers['Content-Type'] = 'application/json'
|
16
|
+
faraday.headers['x-environment-key'] = @opts[:api_key]
|
17
|
+
faraday.response :json
|
18
|
+
# TODO: add timeout adjustment here
|
19
|
+
faraday.adapter Faraday.default_adapter
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_flags(user_id = nil)
|
24
|
+
if user_id.nil?
|
25
|
+
res = @bt_api.get('flags/')
|
26
|
+
flags = transform_flags(res.body).select { |flag| flag[:segment].nil? }
|
27
|
+
flags_to_hash(flags)
|
28
|
+
else
|
29
|
+
res = @bt_api.get("identities/?identifier=#{user_id}")
|
30
|
+
flags_to_hash(transform_flags(res.body['flags']))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def feature_enabled?(feature, user_id = nil, default = false)
|
35
|
+
flag = get_flags(user_id)[normalize_key(feature)]
|
36
|
+
return default if flag.nil?
|
37
|
+
|
38
|
+
flag[:enabled]
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_value(key, user_id = nil, default = nil)
|
42
|
+
flag = get_flags(user_id)[normalize_key(key)]
|
43
|
+
return default if flag.nil?
|
44
|
+
|
45
|
+
flag[:value]
|
46
|
+
end
|
47
|
+
|
48
|
+
def set_trait(user_id, trait, value)
|
49
|
+
raise StandardError, 'user_id cannot be nil' if user_id.nil?
|
50
|
+
|
51
|
+
res = @bt_api.post('traits/', { identity: { identifier: user_id }, trait_key: normalize_key(trait), trait_value: value }.to_json)
|
52
|
+
res.body
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_traits(user_id)
|
56
|
+
return {} if user_id.nil?
|
57
|
+
|
58
|
+
res = @bt_api.get("identities/?identifier=#{user_id}")
|
59
|
+
traits_to_hash(res.body)
|
60
|
+
end
|
61
|
+
|
62
|
+
# def remove_trait(user_id, trait_id)
|
63
|
+
# # Request URL: https://api.bullet-train.io/api/v1/environments/API_KEY/identities/12345/traits/54321/
|
64
|
+
# # Request Method: DELETE
|
65
|
+
# end
|
66
|
+
|
67
|
+
def transform_flags(flags)
|
68
|
+
flags.map do |flag|
|
69
|
+
{
|
70
|
+
name: flag['feature']['name'],
|
71
|
+
enabled: flag['enabled'],
|
72
|
+
value: flag['feature_state_value'],
|
73
|
+
segment: flag['feature_segment']
|
74
|
+
}
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def flags_to_hash(flags)
|
79
|
+
result = {}
|
80
|
+
flags.each do |flag|
|
81
|
+
key = normalize_key(flag.delete(:name))
|
82
|
+
result[key] = flag
|
83
|
+
end
|
84
|
+
result
|
85
|
+
end
|
86
|
+
|
87
|
+
def traits_to_hash(user_flags)
|
88
|
+
result = {}
|
89
|
+
user_flags['traits']&.each { |t| result[normalize_key(t['trait_key'])] = t['trait_value'] }
|
90
|
+
result
|
91
|
+
end
|
92
|
+
|
93
|
+
def normalize_key(key)
|
94
|
+
key.to_s.downcase
|
95
|
+
end
|
96
|
+
|
97
|
+
alias :hasFeature :feature_enabled?
|
98
|
+
alias :getValue :get_value
|
99
|
+
alias :getFlags :get_flags
|
100
|
+
alias :getFlagsForUser :get_flags
|
101
|
+
|
102
|
+
def self.api_key
|
103
|
+
ENV['BULLETTRAIN_API_KEY']
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.api_url
|
107
|
+
ENV.fetch('BULLETTRAIN_URL') { 'https://api.bullet-train.io/api/v1/' }
|
108
|
+
end
|
109
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bullet-train-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Stuart
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2020-01-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: faraday
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
13
69
|
description: Ruby Client for Bullet-Train. Ship features with confidence using feature
|
14
70
|
flags and remote config. Host yourself or use our hosted version at https://bullet-train.io
|
15
71
|
email:
|
@@ -19,13 +75,13 @@ extensions: []
|
|
19
75
|
extra_rdoc_files: []
|
20
76
|
files:
|
21
77
|
- ".gitignore"
|
22
|
-
- ".vscode/launch.json"
|
23
78
|
- Gemfile
|
24
79
|
- LICENCE
|
25
80
|
- README.md
|
81
|
+
- Rakefile
|
26
82
|
- bullet-train-ruby.gemspec
|
27
83
|
- lib/bullet-train.rb
|
28
|
-
-
|
84
|
+
- lib/bullet_train.rb
|
29
85
|
homepage: https://bullet-train.io
|
30
86
|
licenses: []
|
31
87
|
metadata: {}
|
data/.vscode/launch.json
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
{
|
2
|
-
// Use IntelliSense to learn about possible attributes.
|
3
|
-
// Hover to view descriptions of existing attributes.
|
4
|
-
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
5
|
-
"version": "0.2.0",
|
6
|
-
"configurations": [
|
7
|
-
{
|
8
|
-
"name": "Debug Local File",
|
9
|
-
"type": "Ruby",
|
10
|
-
"request": "launch",
|
11
|
-
"cwd": "${workspaceRoot}",
|
12
|
-
"program": "${workspaceRoot}/lib/bullet-train.rb"
|
13
|
-
}
|
14
|
-
]
|
15
|
-
}
|
data/test.rb
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
require "./lib/bullet-train.rb"
|
2
|
-
|
3
|
-
|
4
|
-
bt = BulletTrainClient.new("TijpMX6ajA7REC4bf5suYg")
|
5
|
-
puts("freeze_delinquent_accounts:" + bt.hasFeature("freeze_delinquent_accounts").to_s)
|
6
|
-
puts("twilio_import_days_to_process:" + bt.getValue("twilio_import_days_to_process").to_s)
|
7
|
-
puts("freeze_delinquent_accounts for user bullet_train_sample_user:" + bt.hasFeature("freeze_delinquent_accounts", "bullet_train_sample_user").to_s)
|