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 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: []