redis_cloud_auto_upgrade 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +127 -0
- data/lib/redis_cloud_auto_upgrade/configuration.rb +51 -0
- data/lib/redis_cloud_auto_upgrade/exceptions.rb +3 -0
- data/lib/redis_cloud_auto_upgrade/heroku_api.rb +99 -0
- data/lib/redis_cloud_auto_upgrade/version.rb +3 -0
- data/lib/redis_cloud_auto_upgrade.rb +121 -0
- metadata +164 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b0af044eab29e571790dc677565d64bd0a19c134
|
4
|
+
data.tar.gz: c015cdc4d6a083ca6c2a1083952e54874ed22a91
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bd1f6049bda02b71a68c38e45ca462661673948a2fd9f49dc140dc71c97e177d0e4261851c2e88161c9c9b9808f05ebf031a8d501e5d1b802168db9aa8f98a08
|
7
|
+
data.tar.gz: 94ddb4fd1c011450ebc3ee8960a4d7090b90067cfc49a04930fa676b1c6f7c87c85209c4177edf7e487d326634a0fd798a19ede46c8f5dccfa8e77f82f9b5c36
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 Robert Dober, Guillaume Leseur
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
# redis_cloud_auto_upgrade
|
2
|
+
|
3
|
+
## Summary
|
4
|
+
|
5
|
+
A gem to allow to automatically upgrade your Redis Cloud Addon on Heroku (via Heroku's platform API)
|
6
|
+
in case a certain memory usage treshold is reached.
|
7
|
+
|
8
|
+
The following can be configured
|
9
|
+
|
10
|
+
- Heroku app and addon
|
11
|
+
- Heroku's API key
|
12
|
+
- Treshold
|
13
|
+
|
14
|
+
Typically it will be used in a background job.
|
15
|
+
|
16
|
+
## Gotchas
|
17
|
+
|
18
|
+
* RedisCloud plan data is hardcoded into the gem for now.
|
19
|
+
|
20
|
+
* Only the current Redis instance is used to determine the used memory.
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
### Official API
|
25
|
+
|
26
|
+
The following is the defined API as protected by semantic version and being **threadsafe**.
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
require 'redis_cloud_auto_upgrade'
|
30
|
+
|
31
|
+
# E.g. in a Sidekiq Worker
|
32
|
+
|
33
|
+
def perform
|
34
|
+
RedisCloudAutoUpgrade.potential_upgrade!(
|
35
|
+
# API key for the Heroku API required
|
36
|
+
heroku_api_key: "a88a8aa8-a8a8-4b57-a8aa-8888aa8888aa",
|
37
|
+
|
38
|
+
# Id of addon, which must be a rediscloud addon_service required
|
39
|
+
redis_cloud_id: = "4ceaf719-8a4b-4b8b-8dcf-7852fa79ec44"
|
40
|
+
|
41
|
+
# Upgrade as soon as 50% of the available memory is used defaults to 0.5
|
42
|
+
treshhold: 0.5
|
43
|
+
|
44
|
+
# Logging is provided if enabled as follows optional
|
45
|
+
logger: Rails.logger
|
46
|
+
) do | upgrade_info |
|
47
|
+
# Callback in case an upgrade is actually done optional
|
48
|
+
# upgrade_info is a Hash see below for more information
|
49
|
+
...
|
50
|
+
end
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
|
55
|
+
Its return value is false if no upgrade was applied, true otherwise.
|
56
|
+
|
57
|
+
However to get more information you can provide a block which will be called with an `OpenStruct` instance, containing the following values
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
{
|
61
|
+
updated_at: DateTime,
|
62
|
+
old_plan: "rediscloud:100",
|
63
|
+
new_plan: "rediscloud:200",
|
64
|
+
mem_usage: 12_345_678, # in bytes
|
65
|
+
mem_usage_in_percent: 65, # Mem usage that triggered the upgrade
|
66
|
+
treshhold_in_percent: 50 # Mem usage >= treshhold triggers upgrades
|
67
|
+
}
|
68
|
+
```
|
69
|
+
|
70
|
+
### Inofficial API
|
71
|
+
|
72
|
+
Not protected by semantic versioning and **not threadsafe** is the API of the underlying object.
|
73
|
+
|
74
|
+
It is however very useful for experimenting:
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
|
78
|
+
|
79
|
+
rcau = RedisCloudAutoUpgrade.new
|
80
|
+
rcau.configure(heroku_api_key: 'aaaaaaaa...', heroku_app_name: 'myapp').configure(treshhold: 0.2) # 20%
|
81
|
+
|
82
|
+
rcau.needs_to_upgrade? #-> true
|
83
|
+
rcau.configure(treshhold: 0.8)
|
84
|
+
rcau.needs_to_upgrade? #-> false
|
85
|
+
|
86
|
+
rcau.configure(logger: Logger.new($stdout))
|
87
|
+
|
88
|
+
rcau.current_redis_cloud_plan #-> rediscloud:100
|
89
|
+
# Memoized value create a new object if interested in changing values
|
90
|
+
|
91
|
+
rcau.current_redis_mem_usage #-> 200300400 bytes, Memoized too
|
92
|
+
```
|
93
|
+
|
94
|
+
## Developer's Guide
|
95
|
+
|
96
|
+
### Testing
|
97
|
+
|
98
|
+
We are testing with VCR and in order to setup the cassettes we upgrade a plan to `rediscloud:100` causing some cost.
|
99
|
+
|
100
|
+
If you want to test here is how to do it:
|
101
|
+
|
102
|
+
N.B. **Any time you test without the VCR cassettes you will spend some cents on the RedisCloud plan upgrade**
|
103
|
+
|
104
|
+
* Setup the two env variables `$HEROKU_APP_NAME` and `$HEROKU_API_KEY` correctly.
|
105
|
+
|
106
|
+
* Run the tests (this will fill `fixtures/vcr_cassettes` in your local copy, these files are not versioned as they contain your API KEY.)
|
107
|
+
|
108
|
+
* As you have just upgraded your Redis Cloud Plan to `rediscloud:100` do downgrade it to minimize the costs
|
109
|
+
|
110
|
+
## Dependencies
|
111
|
+
|
112
|
+
* [Redis](https://github.com/redis/redis-rb)
|
113
|
+
|
114
|
+
* [PlatformAPI](https://github.com/heroku/platform-api)
|
115
|
+
|
116
|
+
## References
|
117
|
+
|
118
|
+
* [Heroku Platform API / Addons](https://devcenter.heroku.com/articles/platform-api-reference#add-on)
|
119
|
+
|
120
|
+
## Copyright
|
121
|
+
|
122
|
+
MIT, c.f. [LICENSE](LICENSE)
|
123
|
+
|
124
|
+
## Authors
|
125
|
+
|
126
|
+
Guillaume Leseur
|
127
|
+
Robert Dober
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Configuration part
|
2
|
+
class RedisCloudAutoUpgrade
|
3
|
+
Configuration = Struct.new(
|
4
|
+
:heroku_api_key,
|
5
|
+
:heroku_app_name,
|
6
|
+
:logger,
|
7
|
+
:on_upgrade,
|
8
|
+
:redis_instance,
|
9
|
+
:treshhold
|
10
|
+
) do
|
11
|
+
attr_reader :errors
|
12
|
+
|
13
|
+
def configure(**values)
|
14
|
+
values.each do |key, val|
|
15
|
+
self[key] = val
|
16
|
+
end
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def only(*keys)
|
21
|
+
keys.inject({})do |h, k|
|
22
|
+
h.merge(k => send(k))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def errors_human_readable
|
27
|
+
return nil if @errors.empty?
|
28
|
+
missing_fields
|
29
|
+
end
|
30
|
+
|
31
|
+
def valid?
|
32
|
+
heroku_api_key.nil? && @errors.push([:missing, :heroku_api_key])
|
33
|
+
heroku_app_name.nil? && @errors.push([:missing, :heroku_app_name])
|
34
|
+
@errors.empty?
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def initialize
|
40
|
+
self[:treshhold] = 0.5
|
41
|
+
@errors = []
|
42
|
+
end
|
43
|
+
|
44
|
+
def missing_fields
|
45
|
+
mf = @errors
|
46
|
+
.select { |etype, _| etype == :missing }
|
47
|
+
.map { |_, message| message }
|
48
|
+
%(Missing required_fields: #{mf.inspect})
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'platform-api'
|
2
|
+
# A function wrapper accessing the Heroku Platform API in a functional way
|
3
|
+
class RedisCloudAutoUpgrade
|
4
|
+
module HerokuAPI
|
5
|
+
class << self
|
6
|
+
def available_memory(plan)
|
7
|
+
plan_memory
|
8
|
+
.fetch(plan) do
|
9
|
+
fail ArgumentError, "the plan #{plan.inspect} does not exist"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def current_redis_cloud_plan(heroku_api_key:, heroku_app_name:)
|
14
|
+
heroku(heroku_api_key)
|
15
|
+
.addon
|
16
|
+
.list_by_app(heroku_app_name)
|
17
|
+
.find(&select_redis_cloud_addon)['plan']['name']
|
18
|
+
end
|
19
|
+
|
20
|
+
def currently_available_memory(heroku_api_key:, heroku_app_name:)
|
21
|
+
available_memory(
|
22
|
+
current_redis_cloud_plan(
|
23
|
+
heroku_api_key: heroku_api_key, heroku_app_name: heroku_app_name))
|
24
|
+
end
|
25
|
+
|
26
|
+
def next_plan_to_upgrade_to(heroku_api_key:, heroku_app_name:)
|
27
|
+
next_plan(
|
28
|
+
current_redis_cloud_plan(
|
29
|
+
heroku_api_key: heroku_api_key, heroku_app_name: heroku_app_name))
|
30
|
+
end
|
31
|
+
|
32
|
+
def upgrade_plan!(heroku_api_key:, heroku_app_name:)
|
33
|
+
next_plan =
|
34
|
+
next_plan_to_upgrade_to(heroku_api_key: heroku_api_key, heroku_app_name: heroku_app_name)
|
35
|
+
heroku(heroku_api_key)
|
36
|
+
.addon
|
37
|
+
.update(heroku_app_name, 'rediscloud', plan: next_plan)
|
38
|
+
next_plan
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def heroku(api_key)
|
44
|
+
PlatformAPI.connect api_key
|
45
|
+
end
|
46
|
+
|
47
|
+
def next_plan(plan)
|
48
|
+
plan_transitions
|
49
|
+
.fetch(plan) do
|
50
|
+
fail ArgumentError, "the plan #{plan.inspect} does not exist or cannot be upgraded"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# rubocop:disable Metrics/MethodLength
|
55
|
+
def plan_transitions
|
56
|
+
{
|
57
|
+
'rediscloud:30' => 'rediscloud:100',
|
58
|
+
'rediscloud:100' => 'rediscloud:250',
|
59
|
+
'rediscloud:250' => 'rediscloud:500',
|
60
|
+
'rediscloud:500' => 'rediscloud:1_000',
|
61
|
+
'rediscloud:1_000' => 'rediscloud:2_500',
|
62
|
+
'rediscloud:2_500' => 'rediscloud:5_000',
|
63
|
+
'rediscloud:5_000' => 'rediscloud:10_000',
|
64
|
+
'rediscloud:10_000' => 'rediscloud:15_000',
|
65
|
+
'rediscloud:15_000' => 'rediscloud:20_000',
|
66
|
+
'rediscloud:20_000' => 'rediscloud:25_000',
|
67
|
+
'rediscloud:25_000' => 'rediscloud:50_000'
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
def plan_memory
|
72
|
+
{
|
73
|
+
'rediscloud:30' => 30_000_000,
|
74
|
+
'rediscloud:100' => 100_000_000,
|
75
|
+
'rediscloud:250' => 250_000_000,
|
76
|
+
'rediscloud:500' => 500_000_000,
|
77
|
+
'rediscloud:1000' => 1_000_000_000,
|
78
|
+
'rediscloud:2500' => 2_500_000_000,
|
79
|
+
'rediscloud:5000' => 5_000_000_000,
|
80
|
+
'rediscloud:10000' => 10_000_000_000,
|
81
|
+
'rediscloud:15000' => 15_000_000_000,
|
82
|
+
'rediscloud:20000' => 20_000_000_000,
|
83
|
+
'rediscloud:25000' => 25_000_000_000,
|
84
|
+
'rediscloud:50000' => 50_000_000_000
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
def select_redis_cloud_addon
|
89
|
+
lambda do |addon|
|
90
|
+
begin
|
91
|
+
addon['addon_service']['name'] == 'rediscloud'
|
92
|
+
rescue
|
93
|
+
nil
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end # class << self
|
98
|
+
end # module HerokuAPI
|
99
|
+
end # class RCAU
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require_relative './redis_cloud_auto_upgrade/version'
|
2
|
+
require_relative './redis_cloud_auto_upgrade/exceptions'
|
3
|
+
require_relative './redis_cloud_auto_upgrade/configuration'
|
4
|
+
|
5
|
+
require_relative './redis_cloud_auto_upgrade/heroku_api'
|
6
|
+
|
7
|
+
require 'redis'
|
8
|
+
|
9
|
+
# See README.md for details
|
10
|
+
class RedisCloudAutoUpgrade
|
11
|
+
class << self
|
12
|
+
def potential_upgrade!(conf, &blk)
|
13
|
+
updated_conf = conf.merge(on_upgrade: blk)
|
14
|
+
new
|
15
|
+
.configure(updated_conf)
|
16
|
+
.potential_upgrade!
|
17
|
+
end
|
18
|
+
end # class << self
|
19
|
+
|
20
|
+
def configure(config)
|
21
|
+
@config.configure config
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def current_redis_cloud_plan
|
26
|
+
@__current_redis_cloud_plan ||=
|
27
|
+
HerokuAPI.current_redis_cloud_plan(**heroku_params)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Memoize from lab42_core gem?
|
31
|
+
def current_redis_mem_usage
|
32
|
+
return @__current_redis_mem_usage__ if @__current_redis_mem_usage__
|
33
|
+
redis_instance = config.redis_instance || Redis.current
|
34
|
+
@__current_redis_mem_usage__ = redis_instance.info['used_memory'].to_i
|
35
|
+
end
|
36
|
+
|
37
|
+
def needs_to_upgrade?
|
38
|
+
!(current_redis_mem_usage < currently_available_memory * config.treshhold)
|
39
|
+
end
|
40
|
+
|
41
|
+
def potential_upgrade!
|
42
|
+
if config.valid?
|
43
|
+
do_potential_upgrade!
|
44
|
+
else
|
45
|
+
fail IllegalConfiguration, config.errors_human_readable
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def initialize
|
52
|
+
@config = Configuration.new
|
53
|
+
end
|
54
|
+
|
55
|
+
attr_reader :config
|
56
|
+
|
57
|
+
def currently_available_memory
|
58
|
+
@__currently_available_memory__ ||=
|
59
|
+
HerokuAPI.currently_available_memory(
|
60
|
+
**config.only(:heroku_api_key, :heroku_app_name))
|
61
|
+
end
|
62
|
+
|
63
|
+
def do_potential_upgrade!
|
64
|
+
if needs_to_upgrade?
|
65
|
+
do_upgrade!
|
66
|
+
true
|
67
|
+
else
|
68
|
+
info "no upgrade needed #{config.heroku_app_name} mem usage #{current_redis_mem_usage / 1_000_000}MB"
|
69
|
+
false
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def do_upgrade!
|
74
|
+
old_plan = current_redis_cloud_plan
|
75
|
+
new_plan = HerokuAPI.upgrade_plan!(
|
76
|
+
**config.only(:heroku_api_key, :heroku_app_name)
|
77
|
+
)
|
78
|
+
log_upgrade old_plan, new_plan
|
79
|
+
config.on_upgrade.call(update_data(old_plan, new_plan)) if config.on_upgrade
|
80
|
+
end
|
81
|
+
|
82
|
+
def log_upgrade(old_plan, new_plan)
|
83
|
+
info <<-EOS
|
84
|
+
upgraded RedisCloud plan for app: #{config.heroku_app_name}
|
85
|
+
mem usage was approximately #{current_redis_mem_usage / 1_000_000}MB
|
86
|
+
old_plan was #{old_plan}
|
87
|
+
new_plan is #{new_plan}
|
88
|
+
EOS
|
89
|
+
end
|
90
|
+
|
91
|
+
def heroku_params
|
92
|
+
@__heroku_params__ ||=
|
93
|
+
config.only(:heroku_api_key, :heroku_app_name)
|
94
|
+
end
|
95
|
+
|
96
|
+
def info(str)
|
97
|
+
return unless config.logger
|
98
|
+
config.logger.info str
|
99
|
+
end
|
100
|
+
|
101
|
+
def mem_usage_in_percent
|
102
|
+
@__mem_usage_in_percent__ ||=
|
103
|
+
current_redis_mem_usage * 100 / currently_available_memory
|
104
|
+
end
|
105
|
+
|
106
|
+
def update_data(old_plan, new_plan)
|
107
|
+
OpenStruct.new(
|
108
|
+
old_plan: old_plan,
|
109
|
+
new_plan: new_plan,
|
110
|
+
upgraded_at: Time.now,
|
111
|
+
mem_usage: current_redis_mem_usage,
|
112
|
+
mem_usage_in_percent: mem_usage_in_percent,
|
113
|
+
treshhold_in_percent: treshhold_in_percent
|
114
|
+
)
|
115
|
+
end
|
116
|
+
|
117
|
+
def treshhold_in_percent
|
118
|
+
@__treshhold_in_percent__ ||=
|
119
|
+
( config.treshhold * 100 ).round
|
120
|
+
end
|
121
|
+
end # class RedisCloudAutoUpgrade
|
metadata
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: redis_cloud_auto_upgrade
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Robert Dober
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: redis
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: platform-api
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.6'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry-byebug
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.4'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.4'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.29.1
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.29.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: timecop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.8'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.8'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: vcr
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: webmock
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.24'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.24'
|
125
|
+
description: Gem permits to auto upgrade your Redis Cloud plan when a certain memory
|
126
|
+
usage treshold is reached
|
127
|
+
email: robert.dober@gmail.com
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- LICENSE
|
133
|
+
- README.md
|
134
|
+
- lib/redis_cloud_auto_upgrade.rb
|
135
|
+
- lib/redis_cloud_auto_upgrade/configuration.rb
|
136
|
+
- lib/redis_cloud_auto_upgrade/exceptions.rb
|
137
|
+
- lib/redis_cloud_auto_upgrade/heroku_api.rb
|
138
|
+
- lib/redis_cloud_auto_upgrade/version.rb
|
139
|
+
homepage: https://github.com/RobertDober/lab42_core
|
140
|
+
licenses:
|
141
|
+
- MIT
|
142
|
+
metadata: {}
|
143
|
+
post_install_message:
|
144
|
+
rdoc_options: []
|
145
|
+
require_paths:
|
146
|
+
- lib
|
147
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: 2.2.0
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
157
|
+
requirements: []
|
158
|
+
rubyforge_project:
|
159
|
+
rubygems_version: 2.4.8
|
160
|
+
signing_key:
|
161
|
+
specification_version: 4
|
162
|
+
summary: Gem permits to auto upgrade your Redis Cloud plan when a certain memory usage
|
163
|
+
treshold is reached
|
164
|
+
test_files: []
|