flagger 2.0.9 → 3.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.
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: []