flagger 2.0.9 → 3.0.1

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: 880f82d15f0805d0107c12d883025c4c555e01df667aa39ad07b646f68ec94a0
4
- data.tar.gz: 061e3aa2d425d15d0a1372f421d404890bc5b099f478c13713fa0d8c36c3a3f5
3
+ metadata.gz: abec4e3ed555319d9e974c87174352957d54097395fb9435a9fc6ce4c2511ebb
4
+ data.tar.gz: fb42dad6b7af63308d2a65021c35f7aeb9c94d408b1dab60b8e4d8aca51cb6fe
5
5
  SHA512:
6
- metadata.gz: 120ccdb7b2af506918fed5f56ac936a230c60ec2a1eb214ad0bdde334cb7a8e581d8d2f06346e1c816fb2d6e43ad97f30ffb4a22ad3333c93a60349ba15b6243
7
- data.tar.gz: 0df9032a5087506744c5601c1b454c4af89b9c9124786cb87080c3073921fad9241ea013bc08a9d085db032ebc1772b817485b06c165a35f3204b4ddc3e74a7b
6
+ metadata.gz: 6b32614e2a9eeaa51e2bbf3fd4a789ce6f3c7f3edb89a78856594a56623552bcf3508d2859798de7274abaf445284158e7e93ad13852fba98f6ff9f0c3b99b19
7
+ data.tar.gz: 86bdaa5297356ebb695c859feef6370a41aeab8acd66b5fb5ca671640d96d5b0453ef896b118d5b4995afe9baa3ccf986dd0e23dc8d5aa728da862815434ac59
@@ -1,96 +1,82 @@
1
- require 'flagger/cloud'
2
- require 'flagger/microservice'
3
-
4
- class Flagger
5
- class Flag
6
- attr_accessor :flag_name
7
- attr_accessor :delegate
8
-
9
- def initialize(flag_name, delegate)
10
- @flag_name = flag_name
11
- @delegate = delegate
12
- end
13
-
14
- def treatment(entity)
15
- @delegate&.treatment(self, entity) || 'off'
16
- end
17
-
18
- def payload(entity)
19
- @delegate&.payload(self, entity) || nil
20
- end
21
-
22
- def eligible?(entity)
23
- @delegate&.eligible?(self, entity) || false
24
- end
25
-
26
- def enabled?(entity)
27
- @delegate&.enabled?(self, entity) || false
28
- end
1
+ require 'ffi'
2
+ require 'flagger/entity'
3
+ require 'flagger/response'
4
+ require 'flagger/native'
5
+ require 'flagger/version'
6
+
7
+ module Flagger
8
+ include FlaggerNative, ResponseParser
9
+
10
+ # init method gets FlaggerConfiguration, establishes and maintains SSE connections and initializes Ingester
11
+ # init must be called only once, at the start of your application.
12
+ # Your program must wait for init to finish before using any other Flagger methods
13
+ def Flagger.init(api_key, **args)
14
+ request = {
15
+ apiKey: api_key,
16
+ sdkName: "ruby",
17
+ sdkVersion: Flagger::VERSION,
18
+ sourceURL: args[:source_url],
19
+ backupSourceURL: args[:backup_source_url],
20
+ sseURL: args[:sse_url],
21
+ ingestionURL: args[:ingestion_url],
22
+ logLevel: args[:log_level],
23
+ }.compact.to_json
24
+ ResponseParser::parse_error(FlaggerNative::Init(request))
29
25
  end
30
26
 
31
- @@instance = Flagger.new
32
-
33
- attr_accessor :env_key
34
- attr_accessor :edge_url
35
- attr_accessor :request_timeout
36
- attr_accessor :delegate
37
-
38
- def self.configure(options)
39
- @@instance.configure(options)
40
- @@instance
27
+ # Explicitly notify Airship about an Entity
28
+ def Flagger.publish(entity)
29
+ request = "{\"entity\": #{entity.to_json} }"
30
+ ResponseParser::parse_error(FlaggerNative::Publish(request))
41
31
  end
42
32
 
43
- def configure(options)
44
- @env_key = options[:env_key]
45
- @edge_url = options[:edge_url]
46
- @request_timeout = options[:request_timeout] || 10
47
-
48
- applied_options = {
49
- env_key: @env_key,
50
- edge_url: @edge_url,
51
- request_timeout: @request_timeout
52
- }
53
- if not @prev_options == applied_options
54
- @prev_options = applied_options
55
-
56
- @delegate&.cleanup
57
- if @edge_url.nil? then
58
- @delegate = FlaggerEnvironments::CloudDelegate.new(@env_key, @request_timeout)
59
- else
60
- @delegate = FlaggerEnvironments::MicroserviceDelegate.new(@env_key, @edge_url, @request_timeout)
61
- end
62
- end
33
+ # Simple event tracking API. Entity is an optional parameter if it was set before.
34
+ def Flagger.track(name, event_properties, *entity)
35
+ request = entity.empty? ? "{\"event\":{\"name\":\"#{name}\", \"eventProperties\": #{event_properties.to_json}}"
36
+ : "{\"event\":{\"name\":\"#{name}\", \"eventProperties\": #{event_properties.to_json}, \"entity\":#{entity[0].to_json}}}"
37
+ ResponseParser::parse_error(FlaggerNative::Track(request))
63
38
  end
64
39
 
65
- def self.flag(flag_name)
66
- Flag.new(flag_name, @@instance.delegate)
40
+ # set_entity stores an entity in Flagger, which allows omission of entity in other API methods.
41
+ #
42
+ # If you don't provide any entity to Flagger:
43
+ # - flag functions always resolve with the default variation
44
+ # - track method doesn't record an event
45
+ def Flagger.set_entity(entity)
46
+ ResponseParser::parse_error(FlaggerNative::SetEntity("{\"entity\":#{entity.to_json}}"))
67
47
  end
68
48
 
69
- def self.publish(entities)
70
- @@instance.delegate&.publish(entities)
49
+ # Determines if flag is enabled for entity.
50
+ def Flagger.is_enabled(codename, *entity)
51
+ request = entity.empty? ? "{\"codename\": \"#{codename}\"}" : "{\"codename\": \"#{codename}\", \"entity\":#{entity[0].to_json}}"
52
+ ResponseParser::parse_error FlaggerNative::FlagIsEnabled(request)
71
53
  end
72
- end
73
54
 
74
- class Airship
75
- def initialize(options)
76
- STDERR.puts 'The Airship class is deprecated.'
77
-
78
- @env_key = options[:env_key]
55
+ # Determines if entity is within the targeted subpopulations
56
+ def Flagger.is_sampled(codename, *entity)
57
+ request = entity.empty? ? "{\"codename\": \"#{codename}\"}" : "{\"codename\": \"#{codename}\", \"entity\":#{entity[0].to_json}}"
58
+ ResponseParser::parse_error FlaggerNative::FlagIsSampled(request)
79
59
  end
80
60
 
81
- def init()
82
- Flagger.configure(env_key: @env_key)
61
+ # Returns the variation assigned to the entity in a multivariate flag
62
+ def Flagger.get_variation(codename, *entity)
63
+ request = entity.empty? ? "{\"codename\": \"#{codename}\"}" : "{\"codename\": \"#{codename}\", \"entity\":#{entity[0].to_json}}"
64
+ ResponseParser::parse_error FlaggerNative::FlagGetVariation(request)
83
65
  end
84
66
 
85
- def variation(flag, entity)
86
- Flagger.flag(flag).treatment(entity)
67
+ # Returns the payload associated with the treatment assigned to the entity
68
+ def Flagger.get_payload(codename, *entity)
69
+ request = entity.empty? ? "{\"codename\": \"#{codename}\"}" : "{\"codename\": \"#{codename}\", \"entity\":#{entity[0].to_json}}"
70
+ ResponseParser::parse_error FlaggerNative::FlagGetPayload(request)
87
71
  end
88
72
 
89
- def eligible?(flag, entity)
90
- Flagger.flag(flag).eligible?(entity)
73
+ # shutdown ingests data(if any), stop ingester and closes SSE connection. shutdown waits to finish current ingestion
74
+ # request, but no longer than a timeoutMillis.
75
+ # returns true if closed by timeout
76
+ def Flagger.shutdown(timeout)
77
+ request = "{\"timeout\": #{timeout}}"
78
+ ResponseParser::parse_error FlaggerNative::Shutdown(request)
91
79
  end
92
80
 
93
- def enabled?(flag, entity)
94
- Flagger.flag(flag).enabled?(entity)
95
- end
96
81
  end
82
+
@@ -0,0 +1,49 @@
1
+ require 'json'
2
+
3
+ module Flagger
4
+
5
+ class Group
6
+
7
+ def initialize(id, **args)
8
+ @id = id.to_s
9
+ unless args.empty?
10
+ @type = args.has_key?(:type) ? args[:type].to_s : nil
11
+ @name = args.has_key?(:name) ? args[:name].to_s : nil
12
+ @attributes = args.has_key?(:attributes) ? args[:attributes].to_s : nil
13
+ end
14
+
15
+ end
16
+
17
+ def to_json
18
+ {
19
+ id: @id,
20
+ name: @name,
21
+ attributes: @attributes
22
+ }.compact.to_json
23
+ end
24
+ end
25
+
26
+
27
+ class Entity
28
+
29
+ def initialize(id, **args)
30
+ @id = id.to_s
31
+ unless args.empty?
32
+ @type = args.has_key?(:type) ? args[:type].to_s : nil
33
+ @name = args.has_key?(:name) ? args[:name].to_s : nil
34
+ @attributes = args.has_key?(:attributes)? args[:attributes] : nil
35
+ @group = args.has_key?(:group) ? args[:group] : nil
36
+ end
37
+ end
38
+
39
+ def to_json
40
+ {
41
+ id: @id,
42
+ name: @name,
43
+ type: @type,
44
+ attributes: @attributes,
45
+ group: @group
46
+ }.compact.to_json
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,31 @@
1
+ require 'os'
2
+
3
+ def __load_lib(name)
4
+ arch = OS.bits === 32 ? '386' : 'amd64'
5
+ if OS.windows?
6
+ name = name + '-' + arch + '.dll'
7
+ elsif OS.mac?
8
+ name = 'lib' + name + '.dylib'
9
+ elsif OS.linux?
10
+ name = 'lib' + name + '-' + arch + '.so'
11
+ else
12
+ raise 'unsupported platform'
13
+ end
14
+ File.join File.dirname(__FILE__), name
15
+ end
16
+
17
+ # Module that represents shared lib
18
+ module FlaggerNative
19
+ extend FFI::Library
20
+ ffi_lib __load_lib('flagger')
21
+ # foreign function definitions
22
+ attach_function :Init, [:string], :string
23
+ attach_function :Publish, [:string], :string
24
+ attach_function :Track, [:string], :string
25
+ attach_function :SetEntity, [:string], :string
26
+ attach_function :FlagIsEnabled, [:string], :string
27
+ attach_function :FlagIsSampled, [:string], :string
28
+ attach_function :FlagGetVariation, [:string], :string
29
+ attach_function :FlagGetPayload, [:string], :string
30
+ attach_function :Shutdown, [:string], :string
31
+ end
@@ -0,0 +1,7 @@
1
+ module ResponseParser
2
+ def self.parse_error(obj)
3
+ hash = JSON.parse(obj)
4
+ raise RuntimeError, hash['error'] if hash['error'] != '' && hash['error'] != nil
5
+ hash['data']
6
+ end
7
+ end
@@ -1,4 +1,3 @@
1
- module FlaggerUtils
2
- VERSION = '2.0.9'
3
- end
4
-
1
+ module Flagger
2
+ VERSION = '3.0.1'
3
+ end
metadata CHANGED
@@ -1,117 +1,149 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flagger
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.9
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
- - Airship Dev Team
8
- autorequire:
7
+ - Airdeploy Dev Team
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-07 00:00:00.000000000 Z
11
+ date: 2020-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: faraday
14
+ name: os
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.9'
19
+ version: 0.9.6
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.9'
26
+ version: 0.9.6
27
27
  - !ruby/object:Gem::Dependency
28
- name: json
28
+ name: ffi
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.8'
33
+ version: '1.13'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.13.1
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
41
  - - "~>"
39
42
  - !ruby/object:Gem::Version
40
- version: '1.8'
43
+ version: '1.13'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.13.1
41
47
  - !ruby/object:Gem::Dependency
42
- name: eventmachine
48
+ name: json
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '1.2'
53
+ version: '2.3'
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '1.2'
60
+ version: '2.3'
55
61
  - !ruby/object:Gem::Dependency
56
- name: faye-websocket
62
+ name: faraday
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
65
  - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: 0.10.7
62
- type: :runtime
67
+ version: '1.0'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 1.0.1
71
+ type: :development
63
72
  prerelease: false
64
73
  version_requirements: !ruby/object:Gem::Requirement
65
74
  requirements:
66
75
  - - "~>"
67
76
  - !ruby/object:Gem::Version
68
- version: 0.10.7
77
+ version: '1.0'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 1.0.1
69
81
  - !ruby/object:Gem::Dependency
70
- name: lru_redux
82
+ name: rake
71
83
  requirement: !ruby/object:Gem::Requirement
72
84
  requirements:
73
85
  - - "~>"
74
86
  - !ruby/object:Gem::Version
75
- version: '1.1'
76
- type: :runtime
87
+ version: '13.0'
88
+ type: :development
77
89
  prerelease: false
78
90
  version_requirements: !ruby/object:Gem::Requirement
79
91
  requirements:
80
92
  - - "~>"
81
93
  - !ruby/object:Gem::Version
82
- version: '1.1'
94
+ version: '13.0'
83
95
  - !ruby/object:Gem::Dependency
84
- name: dry-validation
96
+ name: rspec
85
97
  requirement: !ruby/object:Gem::Requirement
86
98
  requirements:
87
99
  - - "~>"
88
100
  - !ruby/object:Gem::Version
89
- version: 0.12.2
90
- type: :runtime
101
+ version: '3.0'
102
+ type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
93
105
  requirements:
94
106
  - - "~>"
95
107
  - !ruby/object:Gem::Version
96
- version: 0.12.2
97
- description: Ruby SDK
98
- email: support@airshiphq.com
108
+ version: '3.0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: rspec_junit_formatter
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: 0.4.1
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: 0.4.1
123
+ description: An open source Ruby SDK for feature flagging (feature gating, feature
124
+ toggles)
125
+ email: engineering@airdeploy.io
99
126
  executables: []
100
127
  extensions: []
101
128
  extra_rdoc_files: []
102
129
  files:
103
130
  - lib/flagger.rb
104
- - lib/flagger/cloud.rb
105
- - lib/flagger/microservice.rb
106
- - lib/flagger/models.rb
107
- - lib/flagger/stat.rb
131
+ - lib/flagger/entity.rb
132
+ - lib/flagger/flagger-386.dll
133
+ - lib/flagger/flagger-amd64.dll
134
+ - lib/flagger/libflagger-386.so
135
+ - lib/flagger/libflagger-amd64.so
136
+ - lib/flagger/libflagger.dylib
137
+ - lib/flagger/native.rb
138
+ - lib/flagger/response.rb
108
139
  - lib/flagger/version.rb
109
- homepage: https://airshiphq.com
140
+ homepage: https://airdeploy.io
110
141
  licenses:
111
142
  - MIT
112
143
  metadata:
113
- source_code_uri: https://github.com/airshiphq/flagger-ruby
114
- post_install_message:
144
+ documentation_uri: https://docs.airdeploy.io
145
+ homepage_uri: https://airdeploy.io
146
+ post_install_message:
115
147
  rdoc_options: []
116
148
  require_paths:
117
149
  - lib
@@ -119,16 +151,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
151
  requirements:
120
152
  - - ">="
121
153
  - !ruby/object:Gem::Version
122
- version: '0'
154
+ version: 2.4.0
123
155
  required_rubygems_version: !ruby/object:Gem::Requirement
124
156
  requirements:
125
157
  - - ">="
126
158
  - !ruby/object:Gem::Version
127
159
  version: '0'
128
160
  requirements: []
129
- rubyforge_project:
130
- rubygems_version: 2.7.6
131
- signing_key:
161
+ rubygems_version: 3.1.2
162
+ signing_key:
132
163
  specification_version: 4
133
- summary: Flagger Ruby SDK
164
+ summary: An open source Flagger Ruby SDK
134
165
  test_files: []