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 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)