rcurtain 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 65e63f659922d0050a7db72ff68f0103ada30e84
4
- data.tar.gz: 251c4ac93f27fcdd230404898c3c53ce0969bc15
3
+ metadata.gz: b3c5aae4847c4ef5864c98f8e18c07f69a686513
4
+ data.tar.gz: ba76810da71297453711dd3c01ca9c162d950e56
5
5
  SHA512:
6
- metadata.gz: 85cac5248779c6372cb08828ccdaa91984be5caca803df4aa7b1872fc3817807cf12064109074559e74ce1908e4d918bed3244c3b57b508b41d532960277b5d4
7
- data.tar.gz: 03ebfed07264c8cb52c9689efda64488568ed492a9e483e2d931d01feda4c6d8a6e29d484a8d56e5dd4af04d4aecf916dbef344a53e4b0fb59cf33bdbdb98b82
6
+ metadata.gz: bd8ed380aa872dfc64ce3c30a5d560edf64f792bebd9e1070a759bde0ce4082ab0ebc52d187924298f24a85178cdb76c182f170aec424f5792b5d69f1167d95e
7
+ data.tar.gz: 904aa233851ae90259dd0acebc59a5f1776b172d1a9c49e8dfdf8ce339daf3d5e7b24a90fae8f88b32ba35be962a98fa269f80efbf46dd26bfbf817dbbac06cd
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,33 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rcurtain (0.0.3)
5
+ hiredis
6
+ redis (~> 3.2)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ diff-lcs (1.2.5)
12
+ hiredis (0.6.1)
13
+ redis (3.3.0)
14
+ rspec (3.4.0)
15
+ rspec-core (~> 3.4.0)
16
+ rspec-expectations (~> 3.4.0)
17
+ rspec-mocks (~> 3.4.0)
18
+ rspec-core (3.4.4)
19
+ rspec-support (~> 3.4.0)
20
+ rspec-expectations (3.4.0)
21
+ diff-lcs (>= 1.2.0, < 2.0)
22
+ rspec-support (~> 3.4.0)
23
+ rspec-mocks (3.4.1)
24
+ diff-lcs (>= 1.2.0, < 2.0)
25
+ rspec-support (~> 3.4.0)
26
+ rspec-support (3.4.1)
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ rcurtain!
33
+ rspec
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # RCurtain
2
+
3
+ Easy way to control your features using [redis](http://redis.io/).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'rcurtain'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle install
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install rcurtain
20
+
21
+ ## Usage
22
+
23
+ * Rcurtain uses redis to control features, which can be checked by a **percentage** or a **set of users**.
24
+ ```
25
+ feature:[name-of-feature]:percentage
26
+ ```
27
+ ```
28
+ feature:[name-of-feature]:users
29
+ ```
30
+
31
+ * To use Rcurtain, create a new object Rcurtain using your redis URL. (password@ip:port/database)
32
+ ```ruby
33
+ rcurtain = Rcurtain.new("redis://:p4ssw0rd@10.0.1.1:6380/15")
34
+ ```
35
+
36
+ * Consult if a feature is opened using the method "opened?", passing the name of the feature you want to check.
37
+ ```ruby
38
+ rcurtain.opened? "feature"
39
+ ```
40
+
41
+ * You can also pass a set of users to be checked.
42
+ ```ruby
43
+ rcurtain.opened? ("feature", ['user-1','user-2'])
44
+ ```
45
+
46
+ ## Contributing
47
+
48
+ Bug reports and pull requests are welcome on GitHub at https://github.com/moip/rcurtain. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
49
+
50
+ 1. Fork it ( https://github.com/moip/rcurtain/fork )
51
+ 2. Create your feature branch (git checkout -b my-new-feature)
52
+ 3. Commit your changes (git commit -am 'Add some feature')
53
+ 4. Push to the branch (git push origin my-new-feature)
54
+ 5. Create a new Pull Request
55
+
56
+ ## License
57
+
58
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,37 @@
1
+ module Rcurtain
2
+ class Curtain
3
+
4
+ attr_reader :redis
5
+
6
+ def initialize (url)
7
+ @redis = Redis.new(:url => url)
8
+ end
9
+
10
+ def opened? (feature, users = [])
11
+ feat = get_feature(feature)
12
+
13
+ return (compare_percentage?(feat.percentage)) || (users.any? { |user| feat.users.include?(user)}) unless users.empty?
14
+
15
+ compare_percentage?(feat.percentage)
16
+ rescue Redis::CannotConnectError
17
+ return false
18
+ end
19
+
20
+ private
21
+ def get_feature (name)
22
+ percentage = redis.get("feature:#{name}:percentage")
23
+ percentage ||= 0
24
+
25
+ users = redis.smembers("feature:#{name}:users")
26
+ users ||= []
27
+
28
+ return Feature.new(name, percentage, users)
29
+ end
30
+
31
+ def compare_percentage? (percentage)
32
+ rnd = Random.new
33
+ rnd.rand(1..100) <= percentage.to_f
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ module Rcurtain
2
+ class Feature
3
+
4
+ attr_accessor :name, :percentage, :users
5
+
6
+ def initialize (name, percentage, users)
7
+ @name = name
8
+ @percentage = percentage
9
+ @users = users
10
+ end
11
+
12
+ end
13
+ end
data/rcurtain.gemspec ADDED
@@ -0,0 +1,19 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'rcurtain'
3
+ s.version = '0.0.3'
4
+ s.date = '2016-05-26'
5
+ s.summary = "RCurtain"
6
+ s.description = "Open the curtain and see if your feature is enabled"
7
+ s.authors = ["Danillo Souza", "Gabriel Queiroz"]
8
+ s.email = ["danillo.souza@moip.com.br", "gabriel.queiroz@moip.com.br"]
9
+ s.homepage =
10
+ 'http://github.com/moip/curtain'
11
+ s.license = 'MIT'
12
+
13
+ s.files = Dir['**/*'].keep_if { |file| File.file?(file) }
14
+ s.require_paths = ['lib']
15
+
16
+ s.add_runtime_dependency "hiredis"
17
+ s.add_runtime_dependency "redis", "~>3.2"
18
+ s.add_development_dependency "rspec"
19
+ end
@@ -0,0 +1,65 @@
1
+ require "spec_helper"
2
+
3
+ describe Rcurtain do
4
+
5
+ subject(:rcurtain) { Rcurtain.new("redis://:p4ssw0rd@10.0.1.1:6380/15") }
6
+
7
+ context "is opened" do
8
+
9
+ context "when 100%" do
10
+ before do
11
+ allow_any_instance_of(Redis).to receive(:get).and_return(100)
12
+ allow_any_instance_of(Redis).to receive(:smembers).and_return(nil)
13
+ end
14
+
15
+ it { expect(rcurtain.opened? "feature").to be true }
16
+ end
17
+
18
+ context "when user exists" do
19
+ before do
20
+ allow_any_instance_of(Redis).to receive(:get).and_return(0)
21
+ allow_any_instance_of(Redis).to receive(:smembers).and_return(['MPA-123'])
22
+ end
23
+
24
+ it { expect(rcurtain.opened?("feature", ['MPA-123'])).to be true }
25
+ end
26
+ end
27
+
28
+ context "is closed" do
29
+ context "when 0%" do
30
+ before do
31
+ allow_any_instance_of(Redis).to receive(:get).and_return(0)
32
+ allow_any_instance_of(Redis).to receive(:smembers).and_return(nil)
33
+ end
34
+
35
+ it { expect(rcurtain.opened? "feature").to be false }
36
+ end
37
+
38
+ context "when user does not exists" do
39
+ before do
40
+ allow_any_instance_of(Redis).to receive(:get).and_return(0)
41
+ allow_any_instance_of(Redis).to receive(:smembers).and_return(["MPA-321"])
42
+ end
43
+
44
+ it { expect(rcurtain.opened?("feature", ['MPA-123'])).to be false }
45
+ end
46
+
47
+ context "when nothing was found on redis" do
48
+ before do
49
+ allow_any_instance_of(Redis).to receive(:get).and_return(nil)
50
+ allow_any_instance_of(Redis).to receive(:smembers).and_return(nil)
51
+ end
52
+
53
+ it { expect(rcurtain.opened? "feature_not_found").to be false }
54
+ end
55
+
56
+ context "when failed connection" do
57
+ before do
58
+ allow_any_instance_of(Redis).to receive(:get).and_raise(Redis::CannotConnectError)
59
+ allow_any_instance_of(Redis).to receive(:smembers).and_raise(Redis::CannotConnectError)
60
+ end
61
+
62
+ it { expect(rcurtain.opened? "feature").to be false }
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,13 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'bundler/setup'
5
+ Bundler.setup
6
+
7
+ require 'rspec'
8
+
9
+ require "rcurtain"
10
+
11
+ RSpec.configure do |config|
12
+ config.raise_errors_for_deprecations!
13
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rcurtain
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danillo Souza
@@ -61,7 +61,15 @@ executables: []
61
61
  extensions: []
62
62
  extra_rdoc_files: []
63
63
  files:
64
+ - Gemfile
65
+ - Gemfile.lock
66
+ - README.md
64
67
  - lib/rcurtain.rb
68
+ - lib/rcurtain/curtain.rb
69
+ - lib/rcurtain/feature.rb
70
+ - rcurtain.gemspec
71
+ - spec/lib/curtain_spec.rb
72
+ - spec/spec_helper.rb
65
73
  homepage: http://github.com/moip/curtain
66
74
  licenses:
67
75
  - MIT
@@ -82,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
90
  version: '0'
83
91
  requirements: []
84
92
  rubyforge_project:
85
- rubygems_version: 2.5.1
93
+ rubygems_version: 2.4.3
86
94
  signing_key:
87
95
  specification_version: 4
88
96
  summary: RCurtain