miniswitch 0.0.1
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/miniswitch/group.rb +87 -0
- data/lib/miniswitch/switcher.rb +26 -0
- data/lib/miniswitch/version.rb +5 -0
- data/lib/miniswitch.rb +17 -0
- metadata +108 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5a7fb86d3cb014328cb4da5a8d7467de5e125ca3d281f34d0cd83d6f128c3251
|
4
|
+
data.tar.gz: b2115d7ed46ac5acf35e9abb549fce2f15908a835c6495c55bd01e4f67b8bf7d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bf5a9980a44f8ba8efc9aead91d1615ade8e92015d211f9849f72c97f7c66a015c05a0764684e19865aaa319b839020885618812af9aa67baa4e327dbcf0395a
|
7
|
+
data.tar.gz: d5bc226f73bde162608eb20774e3be2e0db67d1ae30ddc2a02f933235197b95965c0a118857170082a0dc8e02788786e1977b0e5228e8391d5dcf23cc7d2e640
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Miniswitch::Group
|
4
|
+
attr_reader :parent
|
5
|
+
attr_reader :switcher
|
6
|
+
attr_reader :group_name
|
7
|
+
|
8
|
+
def initialize(switcher, group_name, parent)
|
9
|
+
@switcher = switcher
|
10
|
+
@group_name = group_name
|
11
|
+
@parent = parent
|
12
|
+
end
|
13
|
+
|
14
|
+
def group(name)
|
15
|
+
Miniswitch::Group.new(@switcher, name, self)
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_bool(name, value)
|
19
|
+
set_value(name, value ? 't' : 'f', :bool)
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_int(name, value)
|
23
|
+
set_value(name, Integer(value), :int)
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_int(name, default=nil)
|
27
|
+
@switcher.with_redis do |r|
|
28
|
+
v = r.get(key_for(name))
|
29
|
+
v ? Integer(v) : default
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_bool!(name)
|
34
|
+
v = get_bool(name, nil)
|
35
|
+
return v unless v == nil
|
36
|
+
|
37
|
+
raise UndefinedValueError
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_bool(name, default=nil)
|
41
|
+
@switcher.with_redis do |r|
|
42
|
+
v = r.get(key_for(name))
|
43
|
+
case v
|
44
|
+
when 't'
|
45
|
+
true
|
46
|
+
when 'f'
|
47
|
+
false
|
48
|
+
when nil
|
49
|
+
default
|
50
|
+
else
|
51
|
+
raise "Invalid value for bool: '#{v}'"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# :nodoc:
|
57
|
+
def full_slug
|
58
|
+
@full_slug ||= begin
|
59
|
+
s = @parent ? @parent.full_slug : @switcher.prefix_slug
|
60
|
+
s << @group_name if @group_name
|
61
|
+
|
62
|
+
s
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def set_value(name, value, type)
|
69
|
+
@switcher.with_redis do |r|
|
70
|
+
r.pipelined do |x|
|
71
|
+
x.hset(meta_key_for(name), {
|
72
|
+
't' => type.to_s,
|
73
|
+
'u' => Time.now.to_i
|
74
|
+
})
|
75
|
+
x.set(key_for(name), value)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def key_for(name)
|
81
|
+
(full_slug + ['v', name]).join(':')
|
82
|
+
end
|
83
|
+
|
84
|
+
def meta_key_for(name)
|
85
|
+
(full_slug + ['m', name]).join(':')
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Miniswitch::Switcher
|
4
|
+
def initialize(redis_url, prefix, pool_size: 4)
|
5
|
+
@prefix = prefix
|
6
|
+
@redis = ConnectionPool.new(size: pool_size, timeout: 5) do
|
7
|
+
Redis.new(url: redis_url)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def with_redis(&b)
|
12
|
+
@redis.with(&b)
|
13
|
+
end
|
14
|
+
|
15
|
+
def group(name)
|
16
|
+
Miniswitch::Group.new(self, name, nil)
|
17
|
+
end
|
18
|
+
|
19
|
+
def root
|
20
|
+
group(nil)
|
21
|
+
end
|
22
|
+
|
23
|
+
def prefix_slug
|
24
|
+
@prefix ? [@prefix] : []
|
25
|
+
end
|
26
|
+
end
|
data/lib/miniswitch.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Miniswitch
|
4
|
+
UndefinedValueError = Class.new(StandardError)
|
5
|
+
|
6
|
+
def self.create(redis_url, prefix:)
|
7
|
+
Switcher.new(redis_url, prefix)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'time'
|
12
|
+
require 'date'
|
13
|
+
require 'redis'
|
14
|
+
require 'connection_pool'
|
15
|
+
|
16
|
+
require 'miniswitch/switcher'
|
17
|
+
require 'miniswitch/group'
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: miniswitch
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- André D. Piske
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-09-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: oj
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "<"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "<"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: multi_json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "<"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "<"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: redis
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.0.5
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.0.5
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: connection_pool
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.2.2
|
62
|
+
- - "<"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '3'
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 2.2.2
|
72
|
+
- - "<"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '3'
|
75
|
+
description: Set switches for your app
|
76
|
+
email: andrepiske@gmail.com
|
77
|
+
executables: []
|
78
|
+
extensions: []
|
79
|
+
extra_rdoc_files: []
|
80
|
+
files:
|
81
|
+
- lib/miniswitch.rb
|
82
|
+
- lib/miniswitch/group.rb
|
83
|
+
- lib/miniswitch/switcher.rb
|
84
|
+
- lib/miniswitch/version.rb
|
85
|
+
homepage: https://github.com/andrepiske/miniswitch
|
86
|
+
licenses:
|
87
|
+
- Apache-2.0
|
88
|
+
metadata: {}
|
89
|
+
post_install_message:
|
90
|
+
rdoc_options: []
|
91
|
+
require_paths:
|
92
|
+
- lib
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
requirements: []
|
104
|
+
rubygems_version: 3.3.11
|
105
|
+
signing_key:
|
106
|
+
specification_version: 4
|
107
|
+
summary: Set switches for your app
|
108
|
+
test_files: []
|