imperium 0.1.3 → 0.2.0

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
  SHA1:
3
- metadata.gz: 2ccb3188557a0e0648bc10cbab9b28578dd74c48
4
- data.tar.gz: 3867b7fe25029fbd90b050794a4b088de1f78af3
3
+ metadata.gz: 70b5342210c6ee5d4e7876d0899b224b36092bbb
4
+ data.tar.gz: 660c0bba85f85516ead3f5c8b00fe3ad7bb437fd
5
5
  SHA512:
6
- metadata.gz: cd4236a9e242ec0a1e94eb3593c4b7a7e76aa8bc12dc68d17da06874d8e8d366c0f4e2cceb53da838d4f82e8c65fd623209e3da4a3885f6eacedb67f0504a9c8
7
- data.tar.gz: e888b8ba124a1fbf6e67965143a084882c67f11ff823778603c1e469d464903f8e36fa34448f1d7f3ee6fb8076c0efd969491e88c45a836522ef7105dc285c68
6
+ metadata.gz: 699233998e7e26e9036f2362b4a5ca6eff394e258935966609dde0215b6283dada530510c4ca537ca1a3d474c3739234e69133b7117095b3eb5722edbb8eef7a
7
+ data.tar.gz: f52e244277ad058e270ab111ebd287a6959ff9c2a65168d4bf399ebfee05c0ef0d93df5f26950400ac85acd985431b544a845d8a8b5cbd4af076097e3c2e0178
data/.travis.yml CHANGED
@@ -2,7 +2,6 @@ sudo: false
2
2
  language: ruby
3
3
  before_install: gem install bundler -v 1.13.6
4
4
  rvm:
5
- - "2.1"
6
5
  - "2.2"
7
6
  - "2.3"
8
- - "2.4.0"
7
+ - "2.4"
data/Dockerfile.ci CHANGED
@@ -16,4 +16,4 @@ USER root
16
16
  RUN chown -R docker:docker /app
17
17
  USER docker
18
18
 
19
- CMD /bin/bash -l -c "bundle exec wwtd --parallel"
19
+ CMD /bin/bash -l -c "bundle exec wwtd"
data/lib/imperium.rb CHANGED
@@ -6,6 +6,7 @@ require 'imperium/http_client'
6
6
  require 'imperium/kv'
7
7
  require 'imperium/kv_pair'
8
8
  require 'imperium/kv_get_response'
9
+ require 'imperium/kv_put_response'
9
10
  require 'imperium/response'
10
11
  require 'imperium/version'
11
12
 
@@ -3,6 +3,9 @@ require 'json'
3
3
 
4
4
  module Imperium
5
5
  class Client
6
+ # Options that are allowed for all API endpoints
7
+ UNIVERSAL_API_OPTIONS = %i{dc}.freeze
8
+
6
9
  class << self
7
10
  attr_reader :subclasses
8
11
  attr_accessor :path_prefix
@@ -42,7 +45,11 @@ module Imperium
42
45
  if full_options.key?(:consistent) && full_options.key?(:stale)
43
46
  raise InvalidConsistencySpecification, 'Both consistency modes (consistent, stale) supplied, this is not allowed by the HTTP API'
44
47
  end
45
- allowed_params == :all ? full_options : full_options.select { |k, _| allowed_params.include?(k.to_sym) }
48
+ allowed_params == :all ?
49
+ full_options :
50
+ full_options.select { |k, _|
51
+ allowed_params.include?(k.to_sym) || UNIVERSAL_API_OPTIONS.include?(k.to_sym)
52
+ }
46
53
  end
47
54
 
48
55
  def hashify_options(options_array)
@@ -1,3 +1,4 @@
1
+ require 'socket'
1
2
 
2
3
  module Imperium
3
4
  class Error < StandardError; end
@@ -27,9 +27,10 @@ module Imperium
27
27
  end
28
28
  end
29
29
 
30
- def put(path, value)
30
+ def put(path, value, query: {})
31
31
  wrapping_exceptions do
32
32
  url = config.url.join(path)
33
+ url.query_values = query
33
34
  @driver.put(url, body: value)
34
35
  end
35
36
  end
data/lib/imperium/kv.rb CHANGED
@@ -9,6 +9,12 @@ module Imperium
9
9
  default_client.get(key, *options)
10
10
  end
11
11
 
12
+ # {#put Create or update} a key using the {.default_client}
13
+ # @see #put
14
+ def self.put(key, value, *options)
15
+ default_client.put(key, value, *options)
16
+ end
17
+
12
18
  # Delete the specified key
13
19
  # @note This is really a stub of this method, it will delete the key but
14
20
  # you'll get back a raw
@@ -27,6 +33,10 @@ module Imperium
27
33
 
28
34
  GET_ALLOWED_OPTIONS = %i{consistent stale recurse keys separator raw}.freeze
29
35
  private_constant :GET_ALLOWED_OPTIONS
36
+
37
+ PUT_ALLOWED_OPTIONS = %i{flags cas acquire release}.freeze
38
+ private_constant :PUT_ALLOWED_OPTIONS
39
+
30
40
  # Get the specified key/prefix using the supplied options.
31
41
  #
32
42
  # @example Fetching a key that is allowed to be stale.
@@ -40,6 +50,7 @@ module Imperium
40
50
  # @param [String] key The key/prefix to be fetched from Consul.
41
51
  # @param [Array<Symbol,String,Hash>] options The options for constructing
42
52
  # the request
53
+ # @option options [String] :dc Specify the datacenter to use for the request
43
54
  # @option options [Symbol] :consistent Specify the consistent option to the
44
55
  # API resulting in the most up to date value possible at the expense of a
45
56
  # bit of latency and the requirement of a validly elected leader. See
@@ -62,20 +73,42 @@ module Imperium
62
73
  end
63
74
 
64
75
  # Update or create the specified key
65
- # @note This is really a stub of this method, it will put the key but
66
- # you'll get back a raw
67
- # {http://www.rubydoc.info/gems/httpclient/HTTP/Message HTTP::Message}
68
- # object. If you're really serious about using this we'll probably want
69
- # to build a wrapper around the response with some logic to simplify
70
- # interpreting the response.
71
76
  #
72
77
  # @param key [String] The key to be created or updated.
73
78
  # @param value [String] The value to be set on the key.
74
- # @param options [Array] Un-used, only here to prevent changing the method
75
- # signature when we actually implement more advanced functionality.
76
- # @return [HTTP::Message]
79
+ # @param [Array<Symbol,String,Hash>] options The options for constructing
80
+ # the request
81
+ # @option options [String] :dc Specify the datacenter to use for the request
82
+ # @option options [Integer] :flags Specifies an unsigned value
83
+ # between 0 and (2^64)-1. Clients can choose to use this however makes
84
+ # sense for their application.
85
+ # @option options [Integer] :cas Specifies to use a Check-And-Set operation.
86
+ # This is very useful as a building block for more complex synchronization
87
+ # primitives. If the index is 0, Consul will only put the key if it does
88
+ # not already exist. If the index is non-zero, the key is only set if the
89
+ # index matches the ModifyIndex of that key.
90
+ # @option options [String] :acquire Supply a session key for use in
91
+ # acquiring lock on the key. From the Consul docs: Specifies to use a lock
92
+ # acquisition operation. This is useful as it allows leader election to be
93
+ # built on top of Consul. If the lock is not held and the session is
94
+ # valid, this increments the LockIndex and sets the Session value of the
95
+ # key in addition to updating the key contents. A key does not need to
96
+ # exist to be acquired. If the lock is already held by the given session,
97
+ # then the LockIndex is not incremented but the key contents are updated.
98
+ # This lets the current lock holder update the key contents without having
99
+ # to give up the lock and reacquire it.
100
+ # @option options [String] :release Supply a session key for releasing a
101
+ # lock. From the Consul docs: Specifies to use a lock release operation.
102
+ # This is useful when paired with ?acquire= as it allows clients to yield
103
+ # a lock. This will leave the LockIndex unmodified but will clear the
104
+ # associated Session of the key. The key must be held by this session to
105
+ # be unlocked.
106
+ # @return [KVPUTResponse]
77
107
  def put(key, value, *options)
78
- @http_client.put(prefix_path(key), value)
108
+ expanded_options = hashify_options(options)
109
+ query_params = extract_query_params(expanded_options, allowed_params: PUT_ALLOWED_OPTIONS)
110
+ response = @http_client.put(prefix_path(key), value, query: query_params)
111
+ KVPUTResponse.new(response, options: expanded_options)
79
112
  end
80
113
 
81
114
  private
@@ -0,0 +1,37 @@
1
+ require_relative 'response'
2
+
3
+ module Imperium
4
+ # KVPUTResponse is a wrapper for the raw HTTP::Message response from the API
5
+ #
6
+ # @note This class doesn't really make sense to be instantiated outside of
7
+ # {KV#put}
8
+ #
9
+ # @!attribute [rw] options
10
+ # @return [Hash<Symbol, Object>] The options for the get request after being
11
+ # coerced from an array to hash.
12
+ # @attribute [rw] prefix
13
+ # @return [String] The key prefix requested from the api, used to coerce the
14
+ # returned values from the API into their various shapes.
15
+ class KVPUTResponse < Response
16
+ attr_accessor :options
17
+
18
+ def initialize(message, options: {})
19
+ super message
20
+ @options = options
21
+ end
22
+
23
+ if RUBY_VERSION < "2.4"
24
+ def success?
25
+ return @success if defined? @success
26
+ @success = (body.chomp == "true")
27
+ end
28
+ else
29
+ def success?
30
+ return @success if defined? @success
31
+ @success = JSON.parse(body)
32
+ rescue JSON::ParserError
33
+ body.empty? ? @success = false : raise
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,3 +1,3 @@
1
1
  module Imperium
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imperium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Pickett
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-05 00:00:00.000000000 Z
11
+ date: 2017-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -164,6 +164,7 @@ files:
164
164
  - lib/imperium/kv.rb
165
165
  - lib/imperium/kv_get_response.rb
166
166
  - lib/imperium/kv_pair.rb
167
+ - lib/imperium/kv_put_response.rb
167
168
  - lib/imperium/response.rb
168
169
  - lib/imperium/testing.rb
169
170
  - lib/imperium/version.rb
@@ -187,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
187
188
  version: '0'
188
189
  requirements: []
189
190
  rubyforge_project:
190
- rubygems_version: 2.5.2
191
+ rubygems_version: 2.6.13
191
192
  signing_key:
192
193
  specification_version: 4
193
194
  summary: A powerful, easy to use, Consul client