mida-sdk 1.0.1

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/mida-sdk.rb +117 -0
  3. metadata +58 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '06739f295b8b5a37b55385c9bcd402bb36d816ff2cd459dd083f5ce5913b96d4'
4
+ data.tar.gz: a96a7123919b2cb8d7e802f1968bd729941bdeada014ab078194e2a8908f3fcd
5
+ SHA512:
6
+ metadata.gz: 85c33dee2cab584e22b9533a1f34acbeb235f400f8e95438b2e163a179b223cc419b8315a9934e82504b4c1790c7eb8fa57efbec2d475a21cea714665bfc5874
7
+ data.tar.gz: cb1304b07b1ba7e6bb4e34cb9dce6e978202cd1ba7ea3e844d0865144de8ce72f15c53273931ba022a305926845a5e8ac6a701b84e40573595923d7b05120fee
data/lib/mida-sdk.rb ADDED
@@ -0,0 +1,117 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'uri'
4
+
5
+ class Mida
6
+ VERSION = '1.0.0'
7
+
8
+ attr_reader :public_key, :host, :user_id, :enabled_features, :max_cache_size, :feature_flag_cache
9
+
10
+ def initialize(public_key, options = {})
11
+ raise ArgumentError, "You must pass your Mida project key" unless public_key
12
+
13
+ @public_key = public_key
14
+ @host = 'https://api.mida.so'
15
+ @user_id = nil
16
+ @enabled_features = []
17
+ @max_cache_size = options[:max_cache_size] || 50000
18
+ @feature_flag_cache = {}
19
+ end
20
+
21
+ def get_experiment(experiment_key, distinct_id = nil)
22
+ raise ArgumentError, "You must pass your Mida experiment key" unless experiment_key
23
+ raise ArgumentError, "You must pass your user distinct ID" unless distinct_id || @user_id
24
+
25
+ data = {
26
+ key: @public_key,
27
+ experiment_key: experiment_key,
28
+ distinct_id: distinct_id || @user_id
29
+ }
30
+
31
+ response = post_request("#{@host}/experiment/query", data)
32
+ json = JSON.parse(response.body)
33
+ json['version']
34
+ rescue StandardError => e
35
+ raise e
36
+ end
37
+
38
+ def set_event(event_name, distinct_id = nil, properties = {})
39
+ raise ArgumentError, "You need to set an event name" unless event_name
40
+ raise ArgumentError, "You must pass your user distinct ID" unless distinct_id || @user_id
41
+
42
+ data = {
43
+ key: @public_key,
44
+ name: event_name,
45
+ distinct_id: distinct_id || @user_id,
46
+ properties: properties.to_json
47
+ }
48
+
49
+ post_request("#{@host}/experiment/event", data)
50
+ rescue StandardError => e
51
+ raise e
52
+ end
53
+
54
+ def set_attribute(distinct_id = nil, properties = {})
55
+ raise ArgumentError, "You must pass your user distinct ID" unless distinct_id || @user_id
56
+ raise ArgumentError, "You must pass your user properties" if properties.empty?
57
+
58
+ data = properties.merge(id: distinct_id || @user_id)
59
+ post_request("#{@host}/track/#{@public_key}", data)
60
+ rescue StandardError => e
61
+ raise e
62
+ end
63
+
64
+ def cached_feature_flag
65
+ cache_key = "#{@public_key}:#{@user_id}"
66
+ @feature_flag_cache[cache_key] || []
67
+ end
68
+
69
+ def feature_enabled?(key)
70
+ @enabled_features = cached_feature_flag
71
+ @enabled_features.include?(key)
72
+ end
73
+
74
+ def on_feature_flags(distinct_id = nil)
75
+ cached_items = cached_feature_flag.length
76
+ reload_feature_flags(distinct_id)
77
+ true
78
+ rescue StandardError => e
79
+ raise e
80
+ end
81
+
82
+ def reload_feature_flags(distinct_id = nil)
83
+ data = {
84
+ key: @public_key,
85
+ user_id: distinct_id
86
+ }
87
+
88
+ response = post_request("#{@host}/feature-flag", data)
89
+ @enabled_features = JSON.parse(response.body)
90
+ cache_key = "#{@public_key}:#{@user_id}"
91
+ @feature_flag_cache[cache_key] = @enabled_features
92
+
93
+ if @feature_flag_cache.size > @max_cache_size
94
+ @feature_flag_cache.shift
95
+ end
96
+
97
+ true
98
+ rescue StandardError => e
99
+ raise e
100
+ end
101
+
102
+ private
103
+
104
+ def post_request(url, data)
105
+ uri = URI(url)
106
+ http = Net::HTTP.new(uri.host, uri.port)
107
+ http.use_ssl = true
108
+ request = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json')
109
+ request['User-Agent'] = "mida-ruby/#{Mida::VERSION}"
110
+ request.body = data.to_json
111
+
112
+ response = http.request(request)
113
+ raise StandardError, response.message unless response.is_a?(Net::HTTPSuccess)
114
+
115
+ response
116
+ end
117
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mida-sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Donald Ng
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-07-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Mida.so server-side A/B Testing and Feature Flagging for Python. Start
28
+ for free up to 50,000 MTU.
29
+ email: donald@mida.so
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/mida-sdk.rb
35
+ homepage: https://www.mida.so
36
+ licenses:
37
+ - MIT
38
+ metadata: {}
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubygems_version: 3.1.6
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: Mida.so A/B Testing and Feature Flags
58
+ test_files: []