offline_consul-client 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a224f7ff4d5849b3da62357983eff37d340dd34
4
- data.tar.gz: e81df1790630c58fbe9351895be6e3e01f66c2b9
3
+ metadata.gz: e581d353ceef2e170fae3f52957cc6a04a017ae4
4
+ data.tar.gz: e3091c3965da1981d52b672555814ca53b5cdcf0
5
5
  SHA512:
6
- metadata.gz: 76b3156624259716fd1f1716fbc519b3470f4ea62a66b45c18ae77dededac9af5a7ce10374d0145882db441ed70de977e4ce4883551cfe18ce118265f1198a9a
7
- data.tar.gz: b06c3496e34238d6aa3ddd024285c9fc4ef454396638e94880627129943862318ef995ae0268eb412e7f2d474d2187c6889979e829b61c68038f948cac8a1592
6
+ metadata.gz: 55e1354375b9dd7c8bee244d97d2b4345180261c13cba7d769f2a51dca98b2341a2cb59f4834317a967a7a880e24a9ed947ed60e2a9f2c39cb44e1ee08c01d1e
7
+ data.tar.gz: b70b527b7248849c3212e8b3ce86d97ef47fe9e9c4ed6c559100dcd7f09cc0062311609f770073fad3ae7f43188ec5bee0d63683212e634a8f10786f587def51
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
4
3
  /_yardoc/
5
4
  /pkg/
6
5
  /coverage/
data/Gemfile.lock ADDED
@@ -0,0 +1,57 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ offline_consul-client (0.2.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ addressable (2.4.0)
10
+ coderay (1.1.0)
11
+ crack (0.4.3)
12
+ safe_yaml (~> 1.0.0)
13
+ diff-lcs (1.2.5)
14
+ hashdiff (0.2.3)
15
+ method_source (0.8.2)
16
+ pry (0.10.3)
17
+ coderay (~> 1.1.0)
18
+ method_source (~> 0.8.1)
19
+ slop (~> 3.4)
20
+ psych (2.0.8)
21
+ rake (10.5.0)
22
+ rspec (3.5.0)
23
+ rspec-core (~> 3.4.2)
24
+ rspec-expectations (~> 3.5.0)
25
+ rspec-mocks (~> 3.5.0)
26
+ rspec-core (3.4.2)
27
+ rspec-support (~> 3.5.0)
28
+ rspec-expectations (3.5.0)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.5.0)
31
+ rspec-mocks (3.5.0)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.5.0)
34
+ rspec-support (3.5.0)
35
+ safe_yaml (1.0.4)
36
+ slop (3.6.0)
37
+ vcr (2.9.3)
38
+ webmock (1.22.3)
39
+ addressable (>= 2.3.6)
40
+ crack (>= 0.3.2)
41
+ hashdiff
42
+
43
+ PLATFORMS
44
+ ruby
45
+
46
+ DEPENDENCIES
47
+ bundler (~> 1.9)
48
+ offline_consul-client!
49
+ pry (~> 0.10)
50
+ psych (~> 2.0)
51
+ rake (~> 10.0)
52
+ rspec (~> 3.3)
53
+ vcr (~> 2.9)
54
+ webmock (~> 1.9)
55
+
56
+ BUNDLED WITH
57
+ 1.13.1
data/README.md CHANGED
@@ -23,11 +23,9 @@ The main methods to use are `Consul::Client.read` and `Consul::Client.write`, th
23
23
  ```ruby
24
24
  >> Consul::Client.config.namespace = "/bags"
25
25
  >> mydata = {foo:1, bar:[1,2,:three], baz:false, bat:{one:1, two:2, three:3}}
26
- => {:foo=>1, :bar=>[1, 2, :three], :baz=>false, :bat=>{:one=>1, :two=>2, :three=>3}}
27
- >> consul::Client.write('/some/key', mydata)
28
- => #<Consul::Response:0x007fec1c893180
29
- >> Consul::Client.read('/some/key')
30
- => {:foo=>1, :bar=>[1, 2, :three], :baz=>false, :bat=>{:one=>1, :two=>2, :three=>3}}
26
+ >> consul::Client.write('/some/key', mydata)
27
+ >> puts Consul::Client.read('/some/key')
28
+ {:foo=>1, :bar=>[1, 2, :three], :baz=>false, :bat=>{:one=>1, :two=>2, :three=>3}}
31
29
 
32
30
  ```
33
31
 
@@ -46,6 +44,22 @@ curl "http://consul:8500/v1/kv/bags/some/key?raw"
46
44
  :three: 3
47
45
  ```
48
46
 
47
+ `Consul::Client` can also be instantiated so that you can have multiple different configs that don't stomp on eachother
48
+ ```ruby
49
+ >> c = Consul::Client
50
+ >> f = Consul::Client.new
51
+ >> b = Consul::Client.new
52
+ >> f.config.namespace = "/foo"
53
+ >> b.config.namespace = "/bar"
54
+ >> puts c.read("key")
55
+ I am /bags/key
56
+ >> puts f.read("key)
57
+ I am /foo/key
58
+ >> puts b.read("key")
59
+ I am /bar/key
60
+
61
+ ```
62
+
49
63
  ###Tweakables
50
64
 
51
65
  ```ruby
@@ -0,0 +1,167 @@
1
+ require "psych"
2
+ require "fileutils"
3
+
4
+ module Consul::Client
5
+ class Connection
6
+
7
+ def config
8
+ @config ||= Config.new
9
+ end
10
+
11
+ def online_read(keypath, opts={})
12
+ response = http.get("/kv" + path(keypath) + (opts[:recursive] ? '?recurse' : ''))
13
+ end
14
+
15
+ def offline_read(keypath, opts={})
16
+ files = if opts[:recursive]
17
+ Dir.glob(File.join(local_path, path(keypath) + '*'))
18
+ else
19
+ [File.join(local_path, path(keypath) + ".yaml")]
20
+ end
21
+
22
+ key_data = files.map do |filename|
23
+ {}.tap do |data|
24
+ data['LockIndex'] = 0
25
+ data['Key'] = File.basename(filename).sub(/\.yaml$/, '')
26
+ data['Flags'] = 0
27
+ data['Value'] = Base64.encode64(File.read(filename))
28
+ data['CreateIndex'] = 0
29
+ data['ModifyIndex'] = 0
30
+ end
31
+ end
32
+
33
+ response = Consul::Response.new(Consul::Client::FakeNetHttpResponse.new(Psych.dump(key_data)))
34
+ end
35
+
36
+ def read_obj(keypath, opts={})
37
+ keyname = File.basename(keypath)
38
+ response = if is_online?
39
+ online_read(keypath, opts)
40
+ else
41
+ offline_read(keypath, opts)
42
+ end
43
+
44
+ if response.length == 1 && response.keys.first == keyname
45
+ response[keyname]
46
+ else
47
+ Hash[response.map{ |k,v| [k, v.value] }]
48
+ end
49
+ end
50
+
51
+ def read(keypath, opts={})
52
+ obj = read_obj(keypath, opts)
53
+ if obj.respond_to?(:value)
54
+ obj.value
55
+ else
56
+ obj
57
+ end
58
+ end
59
+
60
+ def online_delete(keypath, opts={})
61
+ response = http.delete("/kv" + path(keypath) + (opts[:recursive] ? '?recurse' : '')).value
62
+ end
63
+
64
+ def offline_delete(keypath, opts={})
65
+ #do nothing, lets not delete our local files
66
+ true
67
+ end
68
+
69
+ def delete(keypath, opts={})
70
+ if is_online?
71
+ online_delete(keypath, opts={})
72
+ else
73
+ offline_delete(keypath, opts={})
74
+ end
75
+ end
76
+
77
+ def online_write(keypath,data=nil,path_mimic=false)
78
+ data = encode(data)
79
+ http.put("/kv" + path(keypath), data)
80
+ end
81
+
82
+ def offline_write(keypath,data=nil)
83
+ data = encode(data)
84
+ filename = File.join(local_path, path(keypath) + ".yaml")
85
+ dirname = File.dirname(filename)
86
+
87
+ unless File.directory?(dirname)
88
+ FileUtils.mkdir_p(dirname)
89
+ end
90
+ File.open(filename, 'w') { |f| f.write(data) }
91
+ Consul::Response.new(Consul::Client::FakeNetHttpResponse.new)
92
+ end
93
+
94
+ def write(keypath,data=nil)
95
+ if is_online?
96
+ online_write(keypath,data)
97
+ else
98
+ offline_write(keypath,data)
99
+ end
100
+ end
101
+
102
+
103
+ #def lock(keypath, data=nil)
104
+ # write(keypath + "?acquire=#{session_id}", data)
105
+ #end
106
+
107
+ #def unlock(keypath, data=nil)
108
+ # write(keypath + "?release=#{session_id}", data)
109
+ #end
110
+
111
+ #def session_id
112
+ # @@session_id ||= http.put("/session/create")
113
+ #end
114
+
115
+ #def has_lock?(keypath)
116
+ # read("/kv/" + keypath).session == session_id
117
+ #end
118
+
119
+ def http
120
+ @http ||= Consul::Http.new
121
+ end
122
+
123
+ def local_path
124
+ ENV['CONSUL_CLIENT_YAML_PATH'] || "/tmp/consul_client"
125
+ end
126
+
127
+ def path(keypath)
128
+ File.join("/" + config.namespace, keypath).gsub(%r{//}, '/')
129
+ end
130
+
131
+ def is_online?
132
+ if defined?(Chef)
133
+ !::Chef::Config[:solo]
134
+ else
135
+ false
136
+ end
137
+ end
138
+
139
+ def decode_r(data)
140
+ if data.respond_to?(:keys)
141
+ Hash[ data.map{ |k,v| [k,decode_r(v)] } ]
142
+ else
143
+ decode(data.value)
144
+ end
145
+ end
146
+
147
+ def decode(value)
148
+ Psych.safe_load(value, [Symbol])
149
+ end
150
+
151
+ def encode(value)
152
+ encoded = Psych.dump(value)
153
+ if decode(encoded) != value
154
+ raise TypeError, "Unable to relaibly decode #{value.class}"
155
+ end
156
+ encoded
157
+ end
158
+
159
+ def encode_r(data)
160
+ if data.respond_to?(:keys)
161
+ Hash[ data.map{ |k,v| [k, encode_r(v)] } ]
162
+ else
163
+ encode(data)
164
+ end
165
+ end
166
+ end
167
+ end
@@ -1,5 +1,5 @@
1
1
  module Consul
2
2
  module Client
3
- VERSION = "0.2.0"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
data/lib/consul/client.rb CHANGED
@@ -1,155 +1,29 @@
1
1
  require "consul/client/version"
2
2
  require "consul/client/config"
3
+ require "consul/client/connection"
3
4
  require "consul/client/fake_http_response"
4
5
  require "consul/http"
5
6
  require "consul/response"
6
7
  require "consul/data"
7
8
 
8
- require "psych"
9
- require "fileutils"
9
+ require "forwardable"
10
10
 
11
11
  module Consul
12
12
  module Client
13
- def self.config
14
- @@config ||= Config.new
15
- end
16
13
 
17
- def self.online_read(keypath, opts={})
18
- response = http.get("/kv" + path(keypath) + (opts[:recursive] ? '?recurse' : ''))
19
- end
14
+ class << self
15
+ extend Forwardable
20
16
 
21
- def self.offline_read(keypath, opts={})
22
- files = if opts[:recursive]
23
- Dir.glob(File.join(local_path, path(keypath) + '*'))
24
- else
25
- [File.join(local_path, path(keypath) + ".yaml")]
26
- end
17
+ def_delegators :connection, *(Connection.instance_methods - Object.instance_methods)
27
18
 
28
- key_data = files.map do |filename|
29
- {}.tap do |data|
30
- data['LockIndex'] = 0
31
- data['Key'] = File.basename(filename).sub(/\.yaml$/, '')
32
- data['Flags'] = 0
33
- data['Value'] = Base64.encode64(File.read(filename))
34
- data['CreateIndex'] = 0
35
- data['ModifyIndex'] = 0
36
- end
19
+ def new
20
+ Connection.new
37
21
  end
38
22
 
39
- response = Response.new(FakeNetHttpResponse.new(Psych.dump(key_data)))
40
- end
41
-
42
- def self.read(keypath, opts={})
43
- obj = read_obj(keypath, opts)
44
- if obj.respond_to?(:value)
45
- obj.value
46
- else
47
- Hash[obj.map{|k,v| [k, v.value] }]
23
+ def connection
24
+ @connection ||= Connection.new
48
25
  end
49
26
  end
50
27
 
51
- def self.read_obj(keypath, opts={})
52
- response = if is_online?
53
- online_read(keypath, opts)
54
- else
55
- offline_read(keypath, opts)
56
- end
57
-
58
- keyname = File.basename(keypath)
59
- if response.length == 1 && response.keys.first == keyname
60
- response = response[keyname]
61
- end
62
- response
63
- end
64
-
65
- def self.online_write(keypath,data=nil,path_mimic=false)
66
- data = encode(data)
67
- http.put("/kv" + path(keypath), data)
68
- end
69
-
70
- def self.offline_write(keypath,data=nil)
71
- data = encode(data)
72
- filename = File.join(local_path, path(keypath) + ".yaml")
73
- dirname = File.dirname(filename)
74
-
75
- unless File.directory?(dirname)
76
- FileUtils.mkdir_p(dirname)
77
- end
78
- File.open(filename, 'w') { |f| f.write(data) }
79
- Response.new(FakeNetHttpResponse.new)
80
- end
81
-
82
- def self.write(keypath,data=nil)
83
- if is_online?
84
- online_write(keypath,data)
85
- else
86
- offline_write(keypath,data)
87
- end
88
- end
89
-
90
-
91
- #def self.lock(keypath, data=nil)
92
- # write(keypath + "?acquire=#{session_id}", data)
93
- #end
94
-
95
- #def self.unlock(keypath, data=nil)
96
- # write(keypath + "?release=#{session_id}", data)
97
- #end
98
-
99
- #def self.session_id
100
- # @@session_id ||= http.put("/session/create")
101
- #end
102
-
103
- #def self.has_lock?(keypath)
104
- # read("/kv/" + keypath).session == session_id
105
- #end
106
-
107
- def self.http
108
- @http ||= Http.new
109
- end
110
-
111
- def self.local_path
112
- ENV['CONSUL_CLIENT_YAML_PATH'] || "/tmp/consul_client"
113
- end
114
-
115
- def self.path(keypath)
116
- File.join("/" + config.namespace, keypath).gsub(%r{//}, '/')
117
- end
118
-
119
- def self.is_online?
120
- if defined?(Chef)
121
- !::Chef::Config[:solo]
122
- else
123
- false
124
- end
125
- end
126
-
127
- def self.decode_r(data)
128
- if data.respond_to?(:keys)
129
- Hash[ data.map{ |k,v| [k,decode_r(v)] } ]
130
- else
131
- decode(data.value)
132
- end
133
- end
134
-
135
- def self.decode(value)
136
- Psych.safe_load(value, [Symbol])
137
- end
138
-
139
- def self.encode(value)
140
- encoded = Psych.dump(value)
141
- if decode(encoded) != value
142
- raise TypeError, "Unable to relaibly decode #{value.class}"
143
- end
144
- encoded
145
- end
146
-
147
- def self.encode_r(data)
148
- if data.respond_to?(:keys)
149
- Hash[ data.map{ |k,v| [k, encode_r(v)] } ]
150
- else
151
- encode(data)
152
- end
153
- end
154
28
  end
155
29
  end
data/lib/consul/data.rb CHANGED
@@ -13,11 +13,7 @@ module Consul
13
13
 
14
14
  def value
15
15
  text = Base64.decode64(hash_map('Value'))
16
- begin
17
- decoded = Consul::Client.decode(text)
18
- rescue Psych::DisallowedClass, Psych::SyntaxError
19
- end
20
- decoded || text
16
+ try_decode(text)
21
17
  end
22
18
 
23
19
  def flags
@@ -30,5 +26,13 @@ module Consul
30
26
  @response[key.to_s.split('_').map{ |w| w.capitalize }.join]
31
27
  end
32
28
 
29
+ def try_decode(text)
30
+ begin
31
+ decoded = Consul::Client.decode(text)
32
+ rescue Psych::DisallowedClass, Psych::SyntaxError
33
+ end
34
+ decoded || text
35
+ end
36
+
33
37
  end
34
38
  end
data/lib/consul/http.rb CHANGED
@@ -21,6 +21,10 @@ module Consul
21
21
  request('GET', path)
22
22
  end
23
23
 
24
+ def delete(path)
25
+ request('DELETE', path)
26
+ end
27
+
24
28
  def load_config
25
29
  self.http_client = Net::HTTP.new(Consul::Client.config.host, Consul::Client.config.port, nil, nil)
26
30
  end
@@ -9,8 +9,7 @@ module Consul
9
9
 
10
10
  attr_reader :response, :data
11
11
  def_delegators :response, :body, :code, :code_type
12
- def_delegators :data, :keys, :values, :each, :to_a, :length, :map, :[]
13
- def_delegators :to_ruby, :to_h, :to_a
12
+ def_delegators :data, :keys, :values, :each, :to_a, :to_h, :length, :map, :[]
14
13
 
15
14
  class KeyError < RuntimeError; end
16
15
 
@@ -23,10 +22,18 @@ module Consul
23
22
  @data ||= init_data
24
23
  end
25
24
 
25
+ def value
26
+ @value ||= to_ruby
27
+ end
28
+
26
29
  #def locked?
27
30
  # to_h.has_key?("Session")
28
31
  #end
29
32
 
33
+ def success?
34
+ response.code_type == Net::HTTPOK
35
+ end
36
+
30
37
  private
31
38
 
32
39
  def init_data
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: offline_consul-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Scholl
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-07 00:00:00.000000000 Z
11
+ date: 2016-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -120,6 +120,7 @@ files:
120
120
  - ".rspec"
121
121
  - ".travis.yml"
122
122
  - Gemfile
123
+ - Gemfile.lock
123
124
  - LICENSE.txt
124
125
  - README.md
125
126
  - Rakefile
@@ -129,6 +130,7 @@ files:
129
130
  - consul-client.gemspec
130
131
  - lib/consul/client.rb
131
132
  - lib/consul/client/config.rb
133
+ - lib/consul/client/connection.rb
132
134
  - lib/consul/client/fake_http_response.rb
133
135
  - lib/consul/client/version.rb
134
136
  - lib/consul/data.rb