unleash 0.1.2 → 0.1.3
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 +4 -4
- data/.rubocop.yml +11 -0
- data/README.md +1 -1
- data/lib/unleash.rb +1 -0
- data/lib/unleash/client.rb +13 -4
- data/lib/unleash/configuration.rb +11 -1
- data/lib/unleash/metrics_reporter.rb +5 -2
- data/lib/unleash/scheduled_executor.rb +3 -2
- data/lib/unleash/strategy/application_hostname.rb +1 -1
- data/lib/unleash/strategy/gradual_rollout_random.rb +2 -4
- data/lib/unleash/strategy/remote_address.rb +1 -1
- data/lib/unleash/toggle_fetcher.rb +14 -6
- data/lib/unleash/version.rb +1 -1
- data/unleash-client.gemspec +1 -0
- metadata +17 -3
- data/lib/unleash/strategy/unknown.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a27b367d8f33a853c46e239a81c0366c8d07d335b3faf58049a63412bec87e26
|
4
|
+
data.tar.gz: a1cfc2279f3a5d8859e482beaecb11b39f65dff4f903bb62329e48e3bb718df8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e34aca4b62e43363279be75caf42b61f545a0b459329ba919bf74bc3c38ed3f54392107e0a90ed55f6e0a5b49e4a80d336475ca383a2fc97a9c402af45eab39f
|
7
|
+
data.tar.gz: 25e28af7767bed78cc54f3dd0390b8e4ddc5f987f7ff432d8e740646524483f55f1ca994a3cf59d089322b71007cc8828c8ffbe131847821d88715e35faa9b8a
|
data/.rubocop.yml
ADDED
data/README.md
CHANGED
data/lib/unleash.rb
CHANGED
@@ -12,6 +12,7 @@ module Unleash
|
|
12
12
|
|
13
13
|
STRATEGIES = Unleash::Strategy.constants
|
14
14
|
.select { |c| Unleash::Strategy.const_get(c).is_a? Class }
|
15
|
+
.select { |c| !['NotImplemented', 'Base'].include?(c.to_s) }
|
15
16
|
.map { |c|
|
16
17
|
lowered_c = c.to_s
|
17
18
|
lowered_c[0] = lowered_c[0].downcase
|
data/lib/unleash/client.rb
CHANGED
@@ -16,6 +16,7 @@ module Unleash
|
|
16
16
|
Unleash.logger.level = Unleash.configuration.log_level
|
17
17
|
|
18
18
|
Unleash.toggle_fetcher = Unleash::ToggleFetcher.new
|
19
|
+
register
|
19
20
|
|
20
21
|
unless Unleash.configuration.disable_metrics
|
21
22
|
Unleash.toggle_metrics = Unleash::Metrics.new
|
@@ -25,7 +26,6 @@ module Unleash
|
|
25
26
|
Unleash.reporter.send
|
26
27
|
end
|
27
28
|
end
|
28
|
-
register
|
29
29
|
end
|
30
30
|
|
31
31
|
def is_enabled?(feature, context = nil, default_value = false)
|
@@ -61,14 +61,23 @@ module Unleash
|
|
61
61
|
|
62
62
|
uri = URI(Unleash.configuration.client_register_url)
|
63
63
|
http = Net::HTTP.new(uri.host, uri.port)
|
64
|
+
http.use_ssl = true if uri.scheme == 'https'
|
64
65
|
http.open_timeout = Unleash.configuration.timeout # in seconds
|
65
66
|
http.read_timeout = Unleash.configuration.timeout # in seconds
|
66
|
-
|
67
|
+
|
68
|
+
headers = (Unleash.configuration.custom_http_headers || {}).dup
|
69
|
+
headers['Content-Type'] = 'application/json'
|
70
|
+
|
67
71
|
request = Net::HTTP::Post.new(uri.request_uri, headers)
|
68
72
|
request.body = info.to_json
|
69
73
|
|
70
|
-
# Send the request
|
71
|
-
|
74
|
+
# Send the request, if possible
|
75
|
+
begin
|
76
|
+
response = http.request(request)
|
77
|
+
rescue Exception => e
|
78
|
+
Unleash.logger.error "unable to register client with unleash server due to exception #{e.class}:'#{e}'."
|
79
|
+
Unleash.logger.error "stacktrace: #{e.backtrace}"
|
80
|
+
end
|
72
81
|
end
|
73
82
|
end
|
74
83
|
end
|
@@ -4,6 +4,7 @@ require 'tmpdir'
|
|
4
4
|
module Unleash
|
5
5
|
class Configuration
|
6
6
|
attr_accessor :url, :app_name, :instance_id,
|
7
|
+
:custom_http_headers,
|
7
8
|
:disable_metrics, :timeout, :retry_limit,
|
8
9
|
:refresh_interval, :metrics_interval,
|
9
10
|
:backup_file, :logger, :log_level
|
@@ -13,6 +14,11 @@ module Unleash
|
|
13
14
|
self.url = opts[:url] || nil
|
14
15
|
self.instance_id = opts[:instance_id] || SecureRandom.uuid
|
15
16
|
|
17
|
+
if opts[:custom_http_headers].is_a?(Hash) || opts[:custom_http_headers].nil?
|
18
|
+
self.custom_http_headers = opts[:custom_http_headers] || {}
|
19
|
+
else
|
20
|
+
raise ArgumentError, "custom_http_headers must be a hash."
|
21
|
+
end
|
16
22
|
self.disable_metrics = opts[:disable_metrics] || false
|
17
23
|
self.refresh_interval = opts[:refresh_interval] || 15
|
18
24
|
self.metrics_interval = opts[:metrics_interval] || 10
|
@@ -42,7 +48,11 @@ module Unleash
|
|
42
48
|
|
43
49
|
def validate!
|
44
50
|
if self.app_name.nil? or self.url.nil?
|
45
|
-
raise ArgumentError, "URL and app_name are required"
|
51
|
+
raise ArgumentError, "URL and app_name are required parameters."
|
52
|
+
end
|
53
|
+
|
54
|
+
if ! self.custom_http_headers.is_a?(Hash)
|
55
|
+
raise ArgumentError, "custom_http_headers must be a hash."
|
46
56
|
end
|
47
57
|
end
|
48
58
|
|
@@ -40,9 +40,12 @@ module Unleash
|
|
40
40
|
|
41
41
|
uri = URI(Unleash.configuration.client_metrics_url)
|
42
42
|
http = Net::HTTP.new(uri.host, uri.port)
|
43
|
+
http.use_ssl = true if uri.scheme == 'https'
|
43
44
|
http.open_timeout = Unleash.configuration.timeout # in seconds
|
44
45
|
http.read_timeout = Unleash.configuration.timeout # in seconds
|
45
|
-
|
46
|
+
|
47
|
+
headers = (Unleash.configuration.custom_http_headers || {}).dup
|
48
|
+
headers['Content-Type'] = 'application/json'
|
46
49
|
request = Net::HTTP::Post.new(uri.request_uri, headers)
|
47
50
|
request.body = generated_report.to_json
|
48
51
|
|
@@ -58,4 +61,4 @@ module Unleash
|
|
58
61
|
|
59
62
|
end
|
60
63
|
end
|
61
|
-
end
|
64
|
+
end
|
@@ -24,7 +24,8 @@ module Unleash
|
|
24
24
|
self.retry_count = 0
|
25
25
|
rescue Exception => e
|
26
26
|
self.retry_count += 1
|
27
|
-
Unleash.logger.error "thread #{name}
|
27
|
+
Unleash.logger.error "thread #{name} threw exception #{e.class}:'#{e}' (#{self.retry_count}/#{self.max_exceptions})"
|
28
|
+
Unleash.logger.error "stacktrace: #{e.backtrace}"
|
28
29
|
end
|
29
30
|
|
30
31
|
break if self.retry_count > self.max_exceptions
|
@@ -32,4 +33,4 @@ module Unleash
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
end
|
35
|
-
end
|
36
|
+
end
|
@@ -14,7 +14,7 @@ module Unleash
|
|
14
14
|
end
|
15
15
|
|
16
16
|
# need: :params[:hostnames]
|
17
|
-
def is_enabled?(params = {},
|
17
|
+
def is_enabled?(params = {}, _context = nil)
|
18
18
|
return false unless params.is_a?(Hash) && params.has_key?('hostnames')
|
19
19
|
|
20
20
|
params['hostnames'].split(",").map(&:strip).map{|h| h.downcase }.include?(self.hostname)
|
@@ -8,7 +8,7 @@ module Unleash
|
|
8
8
|
end
|
9
9
|
|
10
10
|
# need: params['percentage']
|
11
|
-
def is_enabled?(params = {},
|
11
|
+
def is_enabled?(params = {}, _context = nil)
|
12
12
|
return false unless params.is_a?(Hash) && params.has_key?('percentage')
|
13
13
|
|
14
14
|
begin
|
@@ -17,9 +17,7 @@ module Unleash
|
|
17
17
|
return false
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
(percentage >= randomNumber)
|
20
|
+
(percentage >= Random.rand(1..100))
|
23
21
|
end
|
24
22
|
end
|
25
23
|
end
|
@@ -11,7 +11,7 @@ module Unleash
|
|
11
11
|
return false unless params.fetch('ips', nil).is_a? String
|
12
12
|
return false unless context.class.name == 'Unleash::Context'
|
13
13
|
|
14
|
-
params['ips'].split(',').map(&:strip).include?(
|
14
|
+
params['ips'].split(',').map(&:strip).include?(context.remote_address)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -22,7 +22,6 @@ module Unleash
|
|
22
22
|
rescue Exception => e
|
23
23
|
Unleash.logger.warn "ToggleFetcher was unable to fetch from the network, attempting to read from backup file."
|
24
24
|
read!
|
25
|
-
raise e
|
26
25
|
end
|
27
26
|
|
28
27
|
# once we have initialized, start the fetcher loop
|
@@ -39,16 +38,22 @@ module Unleash
|
|
39
38
|
end
|
40
39
|
|
41
40
|
# rename to refresh_from_server! ??
|
41
|
+
# TODO: should simplify by moving uri / http initialization to class initialization
|
42
42
|
def fetch
|
43
43
|
Unleash.logger.debug "fetch()"
|
44
44
|
Unleash.logger.debug "ETag: #{self.etag}" unless self.etag.nil?
|
45
45
|
|
46
46
|
uri = URI(Unleash.configuration.fetch_toggles_url)
|
47
47
|
http = Net::HTTP.new(uri.host, uri.port)
|
48
|
+
http.use_ssl = true if uri.scheme == 'https'
|
48
49
|
http.open_timeout = Unleash.configuration.timeout # in seconds
|
49
50
|
http.read_timeout = Unleash.configuration.timeout # in seconds
|
50
|
-
|
51
|
-
|
51
|
+
|
52
|
+
headers = (Unleash.configuration.custom_http_headers || {}).dup
|
53
|
+
headers['Content-Type'] = 'application/json'
|
54
|
+
headers['If-None-Match'] = self.etag unless self.etag.nil?
|
55
|
+
|
56
|
+
request = Net::HTTP::Get.new(uri.request_uri, headers)
|
52
57
|
|
53
58
|
response = http.request(request)
|
54
59
|
|
@@ -110,7 +115,8 @@ module Unleash
|
|
110
115
|
end
|
111
116
|
rescue Exception => e
|
112
117
|
# This is not really the end of the world. Swallowing the exception.
|
113
|
-
Unleash.logger.error "Unable to save backup file."
|
118
|
+
Unleash.logger.error "Unable to save backup file. Exception thrown #{e.class}:'#{e}'"
|
119
|
+
Unleash.logger.error "stacktrace: #{e.backtrace}"
|
114
120
|
ensure
|
115
121
|
file.close unless file.nil?
|
116
122
|
end
|
@@ -129,16 +135,18 @@ module Unleash
|
|
129
135
|
|
130
136
|
backup_as_hash = JSON.parse(line_cache)
|
131
137
|
synchronize_with_local_cache!(backup_as_hash)
|
138
|
+
update_client!
|
132
139
|
|
133
140
|
rescue IOError => e
|
134
141
|
Unleash.logger.error "Unable to read the backup_file."
|
135
142
|
rescue JSON::ParserError => e
|
136
143
|
Unleash.logger.error "Unable to parse JSON from existing backup_file."
|
137
144
|
rescue Exception => e
|
138
|
-
Unleash.logger.error "Unable to extract valid data from backup_file."
|
145
|
+
Unleash.logger.error "Unable to extract valid data from backup_file. Exception thrown #{e.class}:'#{e}'"
|
146
|
+
Unleash.logger.error "stacktrace: #{e.backtrace}"
|
139
147
|
ensure
|
140
148
|
file.close unless file.nil?
|
141
149
|
end
|
142
150
|
end
|
143
151
|
end
|
144
|
-
end
|
152
|
+
end
|
data/lib/unleash/version.rb
CHANGED
data/unleash-client.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_development_dependency "bundler", "~> 1.14"
|
29
29
|
spec.add_development_dependency "rake", "~> 10.0"
|
30
30
|
spec.add_development_dependency "rspec", "~> 3.0"
|
31
|
+
spec.add_development_dependency "webmock", "~> 3.0"
|
31
32
|
spec.add_development_dependency "coveralls"
|
32
33
|
|
33
34
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unleash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Renato Arruda
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: murmurhash3
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: coveralls
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -91,6 +105,7 @@ extra_rdoc_files: []
|
|
91
105
|
files:
|
92
106
|
- ".gitignore"
|
93
107
|
- ".rspec"
|
108
|
+
- ".rubocop.yml"
|
94
109
|
- ".travis.yml"
|
95
110
|
- Gemfile
|
96
111
|
- LICENSE
|
@@ -116,7 +131,6 @@ files:
|
|
116
131
|
- lib/unleash/strategy/gradual_rollout_sessionid.rb
|
117
132
|
- lib/unleash/strategy/gradual_rollout_userid.rb
|
118
133
|
- lib/unleash/strategy/remote_address.rb
|
119
|
-
- lib/unleash/strategy/unknown.rb
|
120
134
|
- lib/unleash/strategy/user_with_id.rb
|
121
135
|
- lib/unleash/strategy/util.rb
|
122
136
|
- lib/unleash/toggle_fetcher.rb
|