miniswitch 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Miniswitch
4
+ VERSION = '0.0.1'
5
+ 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: []