flipper-moneta 0.16.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 60ddcdab338dfec08b158bdce0edc0212ec555ea
4
+ data.tar.gz: e9292cb6ab46824f1223a7eee7ee62178c6a6f75
5
+ SHA512:
6
+ metadata.gz: b7cc144518020adca2a26a466a06561dd6fb32d210386600b625bb7a1efd0d472b9bce00c55f0aa8aff93b81777fa038e8efa443246e98cec6546433e2c54b2f
7
+ data.tar.gz: 6b52df892008bb4c8c1575d93d34d2e5bc2f23d9b0c3eec3549f010f8ee9a598993e09eac574b5dbd67e3d3f037f21224b4db581f346abbd4ab22d5111929872
@@ -0,0 +1,79 @@
1
+ # Flipper Moneta
2
+
3
+ A [Moneta](https://github.com/minad/moneta) adapter for [Flipper](https://github.com/jnunemaker/flipper).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'flipper-moneta'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself with:
16
+
17
+ $ gem install flipper-moneta
18
+
19
+ ## Usage
20
+
21
+ ```ruby
22
+ require 'flipper/adapters/moneta'
23
+ moneta = Moneta.new(:Memory)
24
+ adapter = Flipper::Adapters::Moneta.new(moneta)
25
+
26
+ Flipper.configure do |config|
27
+ config.default do
28
+ Flipper.new(adapter)
29
+ end
30
+ end
31
+ ```
32
+
33
+ ## Internals
34
+
35
+ Each feature is stored as a key namespaced by `flipper_features`.
36
+
37
+ ```ruby
38
+ require 'flipper/adapters/moneta'
39
+ moneta = Moneta.new(:Memory)
40
+ adapter = Flipper::Adapters::Moneta.new(moneta)
41
+
42
+ Flipper.configure do |config|
43
+ config.default do
44
+ Flipper.new(adapter)
45
+ end
46
+ end
47
+
48
+ # Register a few groups.
49
+ Flipper.register(:admins) { |thing| thing.admin? }
50
+ Flipper.register(:early_access) { |thing| thing.early_access? }
51
+
52
+ # Create a user class that has flipper_id instance method.
53
+ User = Struct.new(:flipper_id)
54
+
55
+ Flipper[:stats].enable
56
+ Flipper[:stats].enable_group :admins
57
+ Flipper[:stats].enable_group :early_access
58
+ Flipper[:stats].enable_actor User.new('25')
59
+ Flipper[:stats].enable_actor User.new('90')
60
+ Flipper[:stats].enable_actor User.new('180')
61
+ Flipper[:stats].enable_percentage_of_time 15
62
+ Flipper[:stats].enable_percentage_of_actors 45
63
+
64
+ pp moneta["flipper_features/stats"]
65
+
66
+ {:boolean=>"true",
67
+ :groups=>#<Set: {"admins", "early_access"}>,
68
+ :actors=>#<Set: {"25", "90", "180"}>,
69
+ :percentage_of_actors=>"45",
70
+ :percentage_of_time=>"15"}
71
+ ```
72
+
73
+ ## Contributing
74
+
75
+ 1. Fork it
76
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
77
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
78
+ 4. Push to the branch (`git push origin my-new-feature`)
79
+ 5. Create new Pull Request
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/flipper/version', __FILE__)
3
+
4
+ flipper_moneta_files = lambda do |file|
5
+ file =~ /moneta/
6
+ end
7
+
8
+ Gem::Specification.new do |gem|
9
+ gem.authors = ['John Nunemaker']
10
+ gem.email = ['nunemaker@gmail.com']
11
+ gem.summary = 'Moneta adapter for Flipper'
12
+ gem.description = 'Moneta adapter for Flipper'
13
+ gem.license = 'MIT'
14
+ gem.homepage = 'https://github.com/jnunemaker/flipper'
15
+
16
+ gem.files = `git ls-files`.split("\n").select(&flipper_moneta_files) + ['lib/flipper/version.rb']
17
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n").select(&flipper_moneta_files)
18
+ gem.name = 'flipper-moneta'
19
+ gem.require_paths = ['lib']
20
+ gem.version = Flipper::VERSION
21
+
22
+ gem.add_dependency 'flipper', "~> #{Flipper::VERSION}"
23
+ gem.add_dependency 'moneta', '>= 0.7.0', '<= 1.0.0'
24
+ end
@@ -0,0 +1,104 @@
1
+ require 'moneta'
2
+
3
+ module Flipper
4
+ module Adapters
5
+ class Moneta
6
+ include ::Flipper::Adapter
7
+
8
+ FEATURES_KEY = :flipper_features
9
+
10
+ # Public: The name of the adapter.
11
+ attr_reader :name
12
+
13
+ # Public
14
+ def initialize(moneta)
15
+ @moneta = moneta
16
+ @name = :moneta
17
+ end
18
+
19
+ # Public: The set of known features
20
+ def features
21
+ moneta[FEATURES_KEY] || Set.new
22
+ end
23
+
24
+ # Public: Adds a feature to the set of known features.
25
+ def add(feature)
26
+ moneta[FEATURES_KEY] = features << feature.key.to_s
27
+ true
28
+ end
29
+
30
+ # Public: Removes a feature from the set of known features and clears
31
+ # all the values for the feature.
32
+ def remove(feature)
33
+ moneta[FEATURES_KEY] = features.delete(feature.key.to_s)
34
+ moneta.delete(key(feature.key))
35
+ true
36
+ end
37
+
38
+ # Public: Clears all the gate values for a feature.
39
+ def clear(feature)
40
+ moneta[key(feature.key)] = default_config
41
+ true
42
+ end
43
+
44
+ # Public: Gets the values for all gates for a given feature.
45
+ #
46
+ # Returns a Hash of Flipper::Gate#key => value.
47
+ def get(feature)
48
+ default_config.merge(moneta[key(feature.key)].to_h)
49
+ end
50
+
51
+ # Public: Enables a gate for a given thing.
52
+ #
53
+ # feature - The Flipper::Feature for the gate.
54
+ # gate - The Flipper::Gate to disable.
55
+ # thing - The Flipper::Type being enabled for the gate.
56
+ #
57
+ # Returns true.
58
+ def enable(feature, gate, thing)
59
+ case gate.data_type
60
+ when :boolean, :integer
61
+ result = get(feature)
62
+ result[gate.key] = thing.value.to_s
63
+ moneta[key(feature.key)] = result
64
+ when :set
65
+ result = get(feature)
66
+ result[gate.key] << thing.value.to_s
67
+ moneta[key(feature.key)] = result
68
+ end
69
+ true
70
+ end
71
+
72
+ # Public: Disables a gate for a given thing.
73
+ #
74
+ # feature - The Flipper::Feature for the gate.
75
+ # gate - The Flipper::Gate to disable.
76
+ # thing - The Flipper::Type being disabled for the gate.
77
+ #
78
+ # Returns true.
79
+ def disable(feature, gate, thing)
80
+ case gate.data_type
81
+ when :boolean
82
+ clear(feature)
83
+ when :integer
84
+ result = get(feature)
85
+ result[gate.key] = thing.value.to_s
86
+ moneta[key(feature.key)] = result
87
+ when :set
88
+ result = get(feature)
89
+ result[gate.key] = result[gate.key].delete(thing.value.to_s)
90
+ moneta[key(feature.key)] = result
91
+ end
92
+ true
93
+ end
94
+
95
+ private
96
+
97
+ def key(feature_key)
98
+ "#{FEATURES_KEY}/#{feature_key}"
99
+ end
100
+
101
+ attr_reader :moneta
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,3 @@
1
+ module Flipper
2
+ VERSION = '0.16.0'.freeze
3
+ end
@@ -0,0 +1,10 @@
1
+ require 'helper'
2
+ require 'flipper/adapters/moneta'
3
+ require 'flipper/spec/shared_adapter_specs'
4
+
5
+ RSpec.describe Flipper::Adapters::Moneta do
6
+ let(:moneta) { Moneta.new(:Memory) }
7
+ subject { described_class.new(moneta) }
8
+
9
+ it_should_behave_like 'a flipper adapter'
10
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flipper-moneta
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.16.0
5
+ platform: ruby
6
+ authors:
7
+ - John Nunemaker
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-08-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: flipper
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.16.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.16.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: moneta
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.0
34
+ - - "<="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.0.0
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.7.0
44
+ - - "<="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.0
47
+ description: Moneta adapter for Flipper
48
+ email:
49
+ - nunemaker@gmail.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - docs/moneta/README.md
55
+ - flipper-moneta.gemspec
56
+ - lib/flipper/adapters/moneta.rb
57
+ - lib/flipper/version.rb
58
+ - spec/flipper/adapters/moneta_spec.rb
59
+ homepage: https://github.com/jnunemaker/flipper
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: '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.4.5.4
80
+ signing_key:
81
+ specification_version: 4
82
+ summary: Moneta adapter for Flipper
83
+ test_files:
84
+ - spec/flipper/adapters/moneta_spec.rb