aws-dev-utils 1.4.2
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 +7 -0
- data/lib/aws-dev-utils.rb +14 -0
- data/lib/aws-dev-utils/backends/memory.rb +28 -0
- data/lib/aws-dev-utils/backends/redis.rb +20 -0
- data/lib/aws-dev-utils/cache.rb +43 -0
- data/lib/aws-dev-utils/cache_wrapper.rb +25 -0
- data/lib/aws-dev-utils/client_wrapper.rb +45 -0
- data/lib/aws-dev-utils/next_token_wrapper.rb +42 -0
- data/lib/aws-dev-utils/refinements.rb +15 -0
- data/lib/aws-dev-utils/retry_wrapper.rb +33 -0
- data/lib/aws-dev-utils/utils.rb +42 -0
- data/lib/aws-dev-utils/version.rb +3 -0
- metadata +83 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4253a280398d65c04410f7d15180c33de1c632a8b9b4aa394d4703d9f54ab5cc
|
4
|
+
data.tar.gz: d18c4b0b5ce15d900e34fb2233f9c62ef2a33ffc21a5c6abcbb2f8fb9e5a1fbe
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 546edb0c812adbdb2fc2cba3c78894df536f2a74f61da97331659feeb428a3cf6f4dd98b04c43f801277a78a134535f1693ed5647986516d2c395c5b4d2e6aa0
|
7
|
+
data.tar.gz: 3a3855a3f34204e57369aa0912c1c54c00c8d9e5f35260ea04f0b03c81ad3e0aafa125e4c606b4d7435310a3de28644688b2dc17704c416c1f69f991df202674
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module AwsDevUtils
|
2
|
+
autoload :Refinements, "aws-dev-utils/refinements"
|
3
|
+
autoload :NextTokenWrapper, "aws-dev-utils/next_token_wrapper"
|
4
|
+
autoload :ClientWrapper, "aws-dev-utils/client_wrapper"
|
5
|
+
autoload :RetryWrapper, "aws-dev-utils/retry_wrapper"
|
6
|
+
autoload :CacheWrapper, "aws-dev-utils/cache_wrapper"
|
7
|
+
autoload :MachineData, "aws-dev-utils/machine_data"
|
8
|
+
autoload :Cache, "aws-dev-utils/cache"
|
9
|
+
autoload :Utils, "aws-dev-utils/utils"
|
10
|
+
module Backend
|
11
|
+
autoload :Memory, 'aws-dev-utils/backends/memory'
|
12
|
+
autoload :Redis, 'aws-dev-utils/backends/redis'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module AwsDevUtils
|
2
|
+
module Backend
|
3
|
+
class Memory
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@hash = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def get key
|
10
|
+
clean_cache!
|
11
|
+
@hash[key][1]
|
12
|
+
end
|
13
|
+
|
14
|
+
def set key, value, exp
|
15
|
+
clean_cache!
|
16
|
+
@hash[key] = [Time.now + exp, value]
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def clean_cache!
|
22
|
+
@hash = @hash.each_with_object({}) do |(k, (exp, v)), acc|
|
23
|
+
acc[k] = [exp, v] if Time.now < exp
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'redis'
|
2
|
+
|
3
|
+
module AwsDevUtils
|
4
|
+
module Backend
|
5
|
+
class Redis
|
6
|
+
# :nocov:
|
7
|
+
def initialize url='redis://localhost:6379'
|
8
|
+
@redis = ::Redis.new(url: url)
|
9
|
+
end
|
10
|
+
|
11
|
+
def get key
|
12
|
+
@redis.get key
|
13
|
+
end
|
14
|
+
|
15
|
+
def set key, value, exp
|
16
|
+
@redis.setex key, exp, value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'forwardable'
|
3
|
+
|
4
|
+
module AwsDevUtils
|
5
|
+
class Cache
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
#for testing
|
9
|
+
attr_writer :backend
|
10
|
+
|
11
|
+
class << self
|
12
|
+
extend Forwardable
|
13
|
+
def_delegators :fetch
|
14
|
+
end
|
15
|
+
|
16
|
+
def fetch key, exp=60, &block
|
17
|
+
get(key) or block.().tap {|x| set(key, x, exp)}
|
18
|
+
end
|
19
|
+
|
20
|
+
def get key
|
21
|
+
deserialize backend.get key.to_s rescue nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def set key, value, expiration
|
25
|
+
backend.set key.to_s, serialize(value), expiration rescue nil
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def backend
|
31
|
+
@backend ||= AwsDevUtils::Backend::Memory.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def serialize obj
|
35
|
+
Marshal.dump obj
|
36
|
+
end
|
37
|
+
|
38
|
+
def deserialize obj
|
39
|
+
Marshal.load obj
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'deepsort'
|
2
|
+
|
3
|
+
module AwsDevUtils
|
4
|
+
class CacheWrapper
|
5
|
+
include AwsDevUtils::Utils
|
6
|
+
|
7
|
+
def initialize client, exp=60
|
8
|
+
@client = client
|
9
|
+
@exp = exp
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing m, *args, &block
|
13
|
+
do_call(m, args.first || {})
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def do_call m, args
|
19
|
+
Cache.instance.fetch([m, args.deep_sort, @exp], @exp) {
|
20
|
+
nested_hash(@client.send(m, args))
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module AwsDevUtils
|
2
|
+
class ClientWrapper
|
3
|
+
include AwsDevUtils::Utils
|
4
|
+
|
5
|
+
def initialize client, options={}
|
6
|
+
@client = client
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def with_next_token max=100
|
11
|
+
self.class.new(@client, @options.merge(next_token: max))
|
12
|
+
end
|
13
|
+
|
14
|
+
def with_retry max=5
|
15
|
+
self.class.new(@client, @options.merge(retry: max))
|
16
|
+
end
|
17
|
+
|
18
|
+
def with_cache exp=60
|
19
|
+
self.class.new(@client, @options.merge(cache: exp))
|
20
|
+
end
|
21
|
+
|
22
|
+
def method_missing m, *args, &block
|
23
|
+
@client = RetryWrapper.new(@client, @options[:retry]) if retry?
|
24
|
+
@client = NextTokenWrapper.new(@client, @options[:next_token]) if next_token?
|
25
|
+
@client = CacheWrapper.new(@client, @options[:cache]) if cache?
|
26
|
+
|
27
|
+
nested_struct(@client.send(m, *args, &block))
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def cache?
|
33
|
+
@options[:cache]
|
34
|
+
end
|
35
|
+
|
36
|
+
def retry?
|
37
|
+
@options[:retry]
|
38
|
+
end
|
39
|
+
|
40
|
+
def next_token?
|
41
|
+
@options[:next_token]
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module AwsDevUtils
|
2
|
+
class NextTokenWrapper
|
3
|
+
|
4
|
+
def initialize client, max=100
|
5
|
+
@client = client
|
6
|
+
@max = max
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing m, *args, &block
|
10
|
+
do_call(m,*args,&block)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def do_call m, *args, &block
|
16
|
+
@client.send(m , *args, &block).to_h.tap do |r|
|
17
|
+
i = 1
|
18
|
+
key, key2 = extract_keys r
|
19
|
+
while(key && r[key] && i < @max) do
|
20
|
+
i += 1
|
21
|
+
res = @client.send(m, (args[0]||{}).merge(key2 => r[key])).to_h
|
22
|
+
res.each { |k,v| r[k] = v.is_a?(Array) ? r[k].concat(v) : v }
|
23
|
+
r.delete_if {|k,v| !res.keys.include?(k) }
|
24
|
+
end
|
25
|
+
r.delete key
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def extract_keys x
|
30
|
+
case
|
31
|
+
when x[:next_token]
|
32
|
+
[:next_token, :next_token]
|
33
|
+
when x[:next_marker]
|
34
|
+
[:next_marker, :marker]
|
35
|
+
when x[:next_continuation_token]
|
36
|
+
[:next_continuation_token, :continuation_token]
|
37
|
+
else nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'aws-sdk-core'
|
2
|
+
|
3
|
+
module AwsDevUtils
|
4
|
+
module Refinements
|
5
|
+
|
6
|
+
refine Seahorse::Client::Base do
|
7
|
+
def with_next_token *args
|
8
|
+
AwsDevUtils::ClientWrapper.new(self).yield_self { |c| c.send(__callee__, *args) }
|
9
|
+
end
|
10
|
+
alias_method :with_retry, :with_next_token
|
11
|
+
alias_method :with_cache, :with_next_token
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module AwsDevUtils
|
2
|
+
class RetryWrapper
|
3
|
+
|
4
|
+
def initialize client, max_tries=5
|
5
|
+
@client = client
|
6
|
+
@max_tries = max_tries
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing m, *args, &block
|
10
|
+
do_call(m,*args,&block)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def do_call m, *args, &block
|
16
|
+
r = e = nil
|
17
|
+
tries = 0
|
18
|
+
while (r.nil? && tries < @max_tries) do
|
19
|
+
begin
|
20
|
+
r = @client.send(m, *args, &block)
|
21
|
+
rescue Exception => e
|
22
|
+
tries += 1
|
23
|
+
sleep 2**tries + rand
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
raise e unless e.nil? || r
|
28
|
+
|
29
|
+
return r
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module AwsDevUtils
|
2
|
+
module Utils
|
3
|
+
|
4
|
+
module_function
|
5
|
+
|
6
|
+
def nested_struct obj
|
7
|
+
case obj
|
8
|
+
when Hash
|
9
|
+
obj.each_with_object(OpenStruct.new) do |(k,v), acc|
|
10
|
+
acc[k]= case v
|
11
|
+
when Hash then send(__method__,v)
|
12
|
+
when Array then v.map(&method(__method__))
|
13
|
+
else v
|
14
|
+
end
|
15
|
+
end.
|
16
|
+
tap{|x| x.define_singleton_method(:keys){ obj.to_h.keys }}.
|
17
|
+
tap{|x| x.define_singleton_method(:values){ AwsDevUtils::Utils.nested_struct obj.to_h.values }}
|
18
|
+
when Array
|
19
|
+
obj.map(&method(__method__))
|
20
|
+
else
|
21
|
+
obj
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def nested_hash obj
|
26
|
+
if obj.kind_of? Array
|
27
|
+
obj.map(&method(__method__))
|
28
|
+
elsif obj.respond_to?(:to_h)
|
29
|
+
obj.to_h.each_with_object({}) do |(k,v), acc|
|
30
|
+
acc[k] = case v
|
31
|
+
when Hash,OpenStruct then send(__method__,v)
|
32
|
+
when Array then v.map(&method(__method__))
|
33
|
+
else v
|
34
|
+
end
|
35
|
+
end
|
36
|
+
else
|
37
|
+
obj
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: aws-dev-utils
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.4.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Infastructure
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-07-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aws-sdk-core
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: deepsort
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.4.2
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.4.2
|
41
|
+
description: ''
|
42
|
+
email:
|
43
|
+
- infra@amobee.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- lib/aws-dev-utils.rb
|
49
|
+
- lib/aws-dev-utils/backends/memory.rb
|
50
|
+
- lib/aws-dev-utils/backends/redis.rb
|
51
|
+
- lib/aws-dev-utils/cache.rb
|
52
|
+
- lib/aws-dev-utils/cache_wrapper.rb
|
53
|
+
- lib/aws-dev-utils/client_wrapper.rb
|
54
|
+
- lib/aws-dev-utils/next_token_wrapper.rb
|
55
|
+
- lib/aws-dev-utils/refinements.rb
|
56
|
+
- lib/aws-dev-utils/retry_wrapper.rb
|
57
|
+
- lib/aws-dev-utils/utils.rb
|
58
|
+
- lib/aws-dev-utils/version.rb
|
59
|
+
homepage: https://github.com/kontera-technologies/aws-dev-utils
|
60
|
+
licenses:
|
61
|
+
- MIT
|
62
|
+
metadata: {}
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 2.5.0
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 2.7.8
|
80
|
+
signing_key:
|
81
|
+
specification_version: 4
|
82
|
+
summary: Ruby library gem that provides common AWS utilities
|
83
|
+
test_files: []
|