bastet 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.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ coverage/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm --create use "ruby-1.9.3-p0@bastet"
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ rvm:
2
+ - 1.9.2
3
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in bastet.gemspec
4
+ gemspec
data/README.markdown ADDED
@@ -0,0 +1,33 @@
1
+ # Bastet - The unstable beast
2
+
3
+ Goddess associated with war, protection of Lower Egypt and the pharaoh, the sun, perfumes, ointments and embalming
4
+
5
+ ## Configuration
6
+
7
+ redis = Redis.new
8
+ $bastet = Bastet.setup(redis)
9
+
10
+ ## Usage
11
+
12
+ $bastet.activate(:crazy_feature, current_user)
13
+ $bastet.active?(:crazy_feature, current_user) #=> true
14
+
15
+ $bastet.active?(:scary_feature, :admins) #=> false
16
+ $bastet.activate(:scary_feature, :admins)
17
+ $bastet.active?(:scary_feature, :admins) #=> true
18
+
19
+ ## To do
20
+
21
+ 1. Support activating/deactivating all features for groups/users
22
+ 2. Support activating/deactivating for multiple users/groups at once
23
+ 3. Percentage support
24
+ 4. Logging
25
+
26
+ ## Contibuting
27
+
28
+ [![Build Status](https://secure.travis-ci.org/itsmeduncan/bastet.png)](http://travis-ci.org/itsmeduncan/bastet)
29
+
30
+ 1. Fork Basteet
31
+ 2. Create a topic branch - `git checkout -b my_branch`
32
+ 3. Push to your branch - `git push origin my_branch`
33
+ 4. Create a pull request from your branch
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ task :default => :spec
data/bastet.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "bastet/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "bastet"
7
+ s.version = Bastet::VERSION
8
+ s.authors = ["Duncan Grazier"]
9
+ s.email = ["itsmeduncan@gmail.com"]
10
+ s.homepage = "https://github.com/itsmeduncan/bastet"
11
+ s.summary = %q{Simple feature rollout for users, and groups}
12
+ s.description = %q{Simple feature rollout for users, and groups}
13
+
14
+ s.rubyforge_project = "bastet"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_development_dependency "rake", "~> 0.9.2.2"
22
+ s.add_development_dependency "rspec", "~> 2.7.0"
23
+ s.add_development_dependency "mocha", "~> 0.10.0"
24
+ s.add_development_dependency "redis", "~> 2.2.2"
25
+ s.add_development_dependency "simplecov"
26
+ end
@@ -0,0 +1,49 @@
1
+ class Bastet::Base
2
+ attr_accessor :redis
3
+
4
+ def initialize redis
5
+ @redis = redis
6
+ end
7
+
8
+ def activate feature, target
9
+ act :sadd, feature, target
10
+ end
11
+
12
+ def deactivate feature, target
13
+ act :srem, feature, target
14
+ end
15
+
16
+ def active? feature, target
17
+ act :sismember, feature, target
18
+ end
19
+
20
+ def inactive? feature, target
21
+ !active? feature, target
22
+ end
23
+
24
+ private
25
+
26
+ def act method, feature, target
27
+ @redis.send(method, key(feature, target), val(target))
28
+ end
29
+
30
+ def key feature, target
31
+ [].tap do |key|
32
+ key << "feature"
33
+ key << feature.to_s
34
+ key << namespace(target)
35
+ end.join(":")
36
+ end
37
+
38
+ def val target
39
+ instance?(target) ? target.id : target.to_s
40
+ end
41
+
42
+ def namespace target
43
+ instance?(target) ? "users" : "groups"
44
+ end
45
+
46
+ def instance? target
47
+ target.respond_to?(:id)
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ module Bastet
2
+ VERSION = "0.0.1"
3
+ end
data/lib/bastet.rb ADDED
@@ -0,0 +1,9 @@
1
+ require "bastet/version"
2
+
3
+ module Bastet
4
+ autoload "Base", "bastet/base"
5
+
6
+ def self.setup redis
7
+ Bastet::Base.new(redis)
8
+ end
9
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bastet::Base do
4
+ before do
5
+ @redis = Redis.new
6
+ @bastet = Bastet::Base.new(@redis)
7
+ end
8
+
9
+ describe "initialization" do
10
+ it "should configure the Redis instance" do
11
+ Bastet::Base.new(@redis).redis.should == @redis
12
+ end
13
+ end
14
+
15
+ describe "activate" do
16
+ it "should activate the :banana for the user" do
17
+ user = mock('user')
18
+ user.expects(:id).at_least(2).returns(100)
19
+
20
+ @bastet.activate(:banana, user)
21
+ @bastet.active?(:banana, user).should be_true
22
+ end
23
+
24
+ it "should activate the :banana for the group" do
25
+ @bastet.activate(:banana, :admins)
26
+ @bastet.active?(:banana, :admins).should be_true
27
+ end
28
+ end
29
+
30
+ describe "deactivate" do
31
+ it "should deactivate the :banana for the user" do
32
+ user = mock('user')
33
+ user.expects(:id).at_least(2).returns(100)
34
+
35
+ @bastet.activate(:banana, user)
36
+ @bastet.active?(:banana, user).should be_true
37
+
38
+ @bastet.deactivate(:banana, user)
39
+ @bastet.inactive?(:banana, user).should be_true
40
+ end
41
+
42
+ it "should deactivate the :banana for the group" do
43
+ @bastet.activate(:banana, :admins)
44
+ @bastet.active?(:banana, :admins).should be_true
45
+
46
+ @bastet.deactivate(:banana, :admins)
47
+ @bastet.inactive?(:banana, :admins).should be_true
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bastet do
4
+ before do
5
+ @redis = Redis.new
6
+ end
7
+
8
+ describe "::setup" do
9
+ it "should return a new Bastet::Base object" do
10
+ Bastet.setup(@redis).should be_a(Bastet::Base)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ require 'bundler'
5
+ require 'redis'
6
+ require 'bastet'
7
+
8
+ Bundler.setup
9
+
10
+ RSpec.configure do |config|
11
+ config.mock_with :mocha
12
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bastet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Duncan Grazier
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &70179606468520 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.2.2
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70179606468520
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &70179606468000 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 2.7.0
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70179606468000
36
+ - !ruby/object:Gem::Dependency
37
+ name: mocha
38
+ requirement: &70179606467440 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 0.10.0
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70179606467440
47
+ - !ruby/object:Gem::Dependency
48
+ name: redis
49
+ requirement: &70179606466900 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.2.2
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70179606466900
58
+ - !ruby/object:Gem::Dependency
59
+ name: simplecov
60
+ requirement: &70179606466340 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70179606466340
69
+ description: Simple feature rollout for users, and groups
70
+ email:
71
+ - itsmeduncan@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .rspec
78
+ - .rvmrc
79
+ - .travis.yml
80
+ - Gemfile
81
+ - README.markdown
82
+ - Rakefile
83
+ - bastet.gemspec
84
+ - lib/bastet.rb
85
+ - lib/bastet/base.rb
86
+ - lib/bastet/version.rb
87
+ - spec/bastet/base_spec.rb
88
+ - spec/bastet_spec.rb
89
+ - spec/spec_helper.rb
90
+ homepage: https://github.com/itsmeduncan/bastet
91
+ licenses: []
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project: bastet
110
+ rubygems_version: 1.8.10
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: Simple feature rollout for users, and groups
114
+ test_files:
115
+ - spec/bastet/base_spec.rb
116
+ - spec/bastet_spec.rb
117
+ - spec/spec_helper.rb