bullet-train-client 1.0.0 → 1.1.0

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: 1ff1a949e769f61e808e8a814ee7d543329f4fc9a52ae897ca7a53c6c207bd26
4
- data.tar.gz: bfe93bbfc25b22daa972d142290803753bd5550cb07b18020b1836b573afff33
3
+ metadata.gz: a5c47e0b0313009db4ae84b4721fa39b87bc38f4660414a8ae8902520a204354
4
+ data.tar.gz: acc7b67eb95509fe392efea7f258bd19fdf4a84c10c4fe3f7e50bd89363dc10a
5
5
  SHA512:
6
- metadata.gz: 618706b32e1535e913e0438075940c8ef0b89b7aaecbdb6ffd94b8e68afe1ffad09a67ac04e0b8c8f96e81b671fb89a7ec6223e47b095aa588aa97e28e8200d5
7
- data.tar.gz: 16afdddb0b80d25a2e97a5ef8edf8a72aba7d1b5998db69d53eaca9c8fb6f64bf61c15fddfe5323aff183bee230bc92703adf6250a80ec55e84b675382db9109
6
+ metadata.gz: 5df011ddd786de343625b5a21b9e4b2067b6aa2e3c253c0f83dacc7d13211a8f47961eaef24014d91a440add3c693033fe57f211b4354b11ddd159ce1d8233b6
7
+ data.tar.gz: f0134af7e9ce7a6b469b2978521336b30b08d08aff1bbffbadd7d33cfd1b30d17a5bb6f65b5d56aadf7834a5bb278cab0c81a956588f40bd4e464143ab35f6a5
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "bullet-train-client"
3
- spec.version = "1.0.0"
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
@@ -1,69 +1,3 @@
1
- # require "bullet/train/ruby/version"
2
- require "open-uri"
3
- require "json"
1
+ # frozen_string_literal: true
4
2
 
5
- class BulletTrainClient
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'
@@ -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.0.0
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: 2019-08-15 00:00:00.000000000 Z
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
- - test.rb
84
+ - lib/bullet_train.rb
29
85
  homepage: https://bullet-train.io
30
86
  licenses: []
31
87
  metadata: {}
@@ -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)