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, #import, included

Constructor Details

#initialize(options = {}) ⇒ Http

Returns a new instance of Http.



15
16
17
18
19
20
21
22
23
24
# 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],
                       debug_output: options[:debug_output])
  @name = :http
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



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

def name
  @name
end

Instance Method Details

#add(feature) ⇒ Object



38
39
40
41
42
# File 'lib/flipper/adapters/http.rb', line 38

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

#clear(feature) ⇒ Object



115
116
117
118
# File 'lib/flipper/adapters/http.rb', line 115

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

#disable(feature, gate, thing) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/flipper/adapters/http.rb', line 102

def disable(feature, gate, thing)
  body = request_body_for_gate(gate, thing.value.to_s)
  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
  response.is_a?(Net::HTTPOK)
end

#enable(feature, gate, thing) ⇒ Object



95
96
97
98
99
100
# File 'lib/flipper/adapters/http.rb', line 95

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

#featuresObject

Raises:



82
83
84
85
86
87
88
# File 'lib/flipper/adapters/http.rb', line 82

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

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

#get(feature) ⇒ Object



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

def get(feature)
  response = @client.get("/features/#{feature.key}")
  if response.is_a?(Net::HTTPOK)
    parsed_response = JSON.parse(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:



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/flipper/adapters/http.rb', line 63

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

  parsed_response = JSON.parse(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.keys.each 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:



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/flipper/adapters/http.rb', line 44

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

  parsed_response = JSON.parse(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

#remove(feature) ⇒ Object



90
91
92
93
# File 'lib/flipper/adapters/http.rb', line 90

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