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.
- checksums.yaml +7 -0
- data/docs/moneta/README.md +79 -0
- data/flipper-moneta.gemspec +24 -0
- data/lib/flipper/adapters/moneta.rb +104 -0
- data/lib/flipper/version.rb +3 -0
- data/spec/flipper/adapters/moneta_spec.rb +10 -0
- metadata +84 -0
    
        checksums.yaml
    ADDED
    
    | @@ -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,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
         |