Class: Flipper::Adapters::Http

Inherits:
Object
  • Object
show all
Includes:
Flipper::Adapter
Defined in:
lib/flipper/adapters/http.rb,
lib/flipper/adapters/http/error.rb,
lib/flipper/adapters/http/client.rb

Defined Under Namespace

Classes: Client, Error

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Flipper::Adapter

#default_config, #export, included, #name, #read_only?

Constructor Details

#initialize(options = {}) ⇒ Http

Returns a new instance of Http.



15
16
17
18
19
20
21
22
23
24
25
# File 'lib/flipper/adapters/http.rb', line 15

def initialize(options = {})
  @client = Client.new(url: options.fetch(:url),
                       headers: options[:headers],
                       basic_auth_username: options[:basic_auth_username],
                       basic_auth_password: options[:basic_auth_password],
                       read_timeout: options[:read_timeout],
                       open_timeout: options[:open_timeout],
                       write_timeout: options[:write_timeout],
                       max_retries: options[:max_retries],
                       debug_output: options[:debug_output])
end

Instance Attribute Details

#clientObject (readonly)

Returns the value of attribute client.



13
14
15
# File 'lib/flipper/adapters/http.rb', line 13

def client
  @client
end

Instance Method Details

#add(feature) ⇒ Object

Raises:



85
86
87
88
89
90
# File 'lib/flipper/adapters/http.rb', line 85

def add(feature)
  body = JSON.generate(name: feature.key)
  response = @client.post('/features', body)
  raise Error, response unless response.is_a?(Net::HTTPOK)
  true
end

#clear(feature) ⇒ Object

Raises:



119
120
121
122
123
# File 'lib/flipper/adapters/http.rb', line 119

def clear(feature)
  response = @client.delete("/features/#{feature.key}/clear")
  raise Error, response unless response.is_a?(Net::HTTPNoContent)
  true
end

#disable(feature, gate, thing) ⇒ Object

Raises:



106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/flipper/adapters/http.rb', line 106

def disable(feature, gate, thing)
  body = request_body_for_gate(gate, thing.value)
  query_string = gate.key == :groups ? "?allow_unregistered_groups=true" : ""
  response = case gate.key
  when :percentage_of_actors, :percentage_of_time
    @client.post("/features/#{feature.key}/#{gate.key}#{query_string}", body)
  else
    @client.delete("/features/#{feature.key}/#{gate.key}#{query_string}", body)
  end
  raise Error, response unless response.is_a?(Net::HTTPOK)
  true
end

#enable(feature, gate, thing) ⇒ Object

Raises:



98
99
100
101
102
103
104
# File 'lib/flipper/adapters/http.rb', line 98

def enable(feature, gate, thing)
  body = request_body_for_gate(gate, thing.value)
  query_string = gate.key == :groups ? "?allow_unregistered_groups=true" : ""
  response = @client.post("/features/#{feature.key}/#{gate.key}#{query_string}", body)
  raise Error, response unless response.is_a?(Net::HTTPOK)
  true
end

#featuresObject

Raises:



77
78
79
80
81
82
83
# File 'lib/flipper/adapters/http.rb', line 77

def features
  response = @client.get('/features?exclude_gate_names=true')
  raise Error, response unless response.is_a?(Net::HTTPOK)

  parsed_response = Typecast.from_json(response.body)
  parsed_response['features'].map { |feature| feature['key'] }.to_set
end

#get(feature) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
# File 'lib/flipper/adapters/http.rb', line 27

def get(feature)
  response = @client.get("/features/#{feature.key}")
  if response.is_a?(Net::HTTPOK)
    parsed_response = Typecast.from_json(response.body)
    result_for_feature(feature, parsed_response.fetch('gates'))
  elsif response.is_a?(Net::HTTPNotFound)
    default_config
  else
    raise Error, response
  end
end

#get_allObject

Raises:



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/flipper/adapters/http.rb', line 58

def get_all
  response = @client.get("/features?exclude_gate_names=true")
  raise Error, response unless response.is_a?(Net::HTTPOK)

  parsed_response = Typecast.from_json(response.body)
  parsed_features = parsed_response.fetch('features')
  gates_by_key = parsed_features.each_with_object({}) do |parsed_feature, hash|
    hash[parsed_feature['key']] = parsed_feature['gates']
    hash
  end

  result = {}
  gates_by_key.each_key do |key|
    feature = Feature.new(key, self)
    result[feature.key] = result_for_feature(feature, gates_by_key[feature.key])
  end
  result
end

#get_multi(features) ⇒ Object

Raises:



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/flipper/adapters/http.rb', line 39

def get_multi(features)
  csv_keys = features.map(&:key).join(',')
  response = @client.get("/features?keys=#{csv_keys}&exclude_gate_names=true")
  raise Error, response unless response.is_a?(Net::HTTPOK)

  parsed_response = Typecast.from_json(response.body)
  parsed_features = parsed_response.fetch('features')
  gates_by_key = parsed_features.each_with_object({}) do |parsed_feature, hash|
    hash[parsed_feature['key']] = parsed_feature['gates']
    hash
  end

  result = {}
  features.each do |feature|
    result[feature.key] = result_for_feature(feature, gates_by_key[feature.key])
  end
  result
end

#import(source) ⇒ Object

Raises:



125
126
127
128
129
130
131
# File 'lib/flipper/adapters/http.rb', line 125

def import(source)
  adapter = self.class.from(source)
  export = adapter.export(format: :json, version: 1)
  response = @client.post("/import", export.contents)
  raise Error, response unless response.is_a?(Net::HTTPNoContent)
  true
end

#remove(feature) ⇒ Object

Raises:



92
93
94
95
96
# File 'lib/flipper/adapters/http.rb', line 92

def remove(feature)
  response = @client.delete("/features/#{feature.key}")
  raise Error, response unless response.is_a?(Net::HTTPNoContent)
  true
end