sheriff 0.0.1 → 0.0.2

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/.pairs ADDED
@@ -0,0 +1,9 @@
1
+ # .pairs - configuration for 'git pair'
2
+ # place in project or home directory
3
+ pairs:
4
+ an: Anthony Navarre
5
+ jt: Jesse Trimble
6
+ email:
7
+ prefix: pair
8
+ domain: anthonynavarre.com
9
+
data/Gemfile CHANGED
@@ -1,13 +1,12 @@
1
1
  source "http://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- # gem "activesupport", ">= 2.3.5"
5
2
 
6
- # Add dependencies to develop your gem here.
7
- # Include everything needed to run rake, tests, features, etc.
3
+ gem 'cancan', '1.5.1'
4
+
8
5
  group :development do
9
6
  gem "shoulda", ">= 0"
10
7
  gem "bundler", "~> 1.0.0"
11
8
  gem "jeweler", "~> 1.5.2"
12
9
  gem "rcov", ">= 0"
10
+ gem 'redgreen', '1.2.2'
11
+ gem 'test-unit', '2.1.2'
13
12
  end
data/Gemfile.lock CHANGED
@@ -1,6 +1,7 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ cancan (1.5.1)
4
5
  git (1.2.5)
5
6
  jeweler (1.5.2)
6
7
  bundler (~> 1.0.0)
@@ -8,13 +9,18 @@ GEM
8
9
  rake
9
10
  rake (0.8.7)
10
11
  rcov (0.9.9)
12
+ redgreen (1.2.2)
11
13
  shoulda (2.11.3)
14
+ test-unit (2.1.2)
12
15
 
13
16
  PLATFORMS
14
17
  ruby
15
18
 
16
19
  DEPENDENCIES
17
20
  bundler (~> 1.0.0)
21
+ cancan (= 1.5.1)
18
22
  jeweler (~> 1.5.2)
19
23
  rcov
24
+ redgreen (= 1.2.2)
20
25
  shoulda
26
+ test-unit (= 2.1.2)
data/ROADMAP.md ADDED
@@ -0,0 +1,60 @@
1
+ TODOS:
2
+ =============================
3
+
4
+ * Make callstack inspection less brittle by checking ancestry, etc.
5
+ * MOAR CanCan!!1!
6
+ * Support for different frameworks (refactor as Rack app?):
7
+ * Rails
8
+ * Sinatra
9
+
10
+ Ideal End-user API:
11
+ =============================
12
+
13
+ # app/controllers/users_controller.rb
14
+
15
+ class UsersController < ApplicationController
16
+
17
+ def show
18
+ if FeatureSet(:feature_name).visible?
19
+ # do something
20
+ end
21
+ end
22
+
23
+ end
24
+
25
+ # app/views/users/show.html.haml
26
+
27
+ %h2= User #{username}
28
+ - if FeatureSet(:user_profile_pic).visible?
29
+ = render :partial => '_profile_pic'
30
+
31
+ # config/initializers/features.rb
32
+
33
+ FeatureSet.define :user_profile_pic do |f|
34
+ f.show do
35
+ current_user? || (%w{test development}.include? Rails.env)
36
+ end
37
+
38
+ f.show 'users#show'
39
+ f.show 'users#destroy'
40
+ f.show 'users#create' do
41
+ current_user?
42
+ end
43
+
44
+ f.hide 'users#index'
45
+ f.hide 'users#update'
46
+ f.hide 'users#create' do
47
+ if current_user?
48
+ end
49
+ end
50
+
51
+ Jurisdiction Object:
52
+ =============================
53
+
54
+ Sheriff::Jurisdiction.new *args # <= accept any arguments that CanCan will understand
55
+ Sheriff::Jurisdiction.new UsersController # <= ability to execute any public method on UsersController
56
+ Sheriff::Jurisdiction.new 'UsersController#show' # <= ability to execute show on the UsersController
57
+ Sheriff::Jurisdiction.new 'users/show' # <= ability to view route 'users/show'
58
+ Sheriff::Jurisdiction.new users_path # <= ability to view users_path
59
+ Sheriff::Jurisdiction.new user_path(1) # <= ability to view path for user with id=1
60
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
data/lib/sheriff.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'sheriff/api'
2
2
  require 'sheriff/context'
3
3
  require 'sheriff/feature_set'
4
+ require 'sheriff/jurisdiction'
4
5
  require 'sheriff/errors'
5
6
 
data/lib/sheriff/api.rb CHANGED
@@ -20,29 +20,17 @@ module Sheriff
20
20
  base.extend ClassMethods
21
21
  end
22
22
 
23
- def self.define(feature_set_name)
24
- raise Sheriff::FeatureSet::AlreadyDefinedError.new("Feature Set #{feature_set_name} already defined") if Sheriff.defined_feature_sets.map(&:name).include?(feature_set_name)
25
- Sheriff.defined_feature_sets << Sheriff::FeatureSet.new(feature_set_name)
23
+ def FeatureSet(feature_set_name)
24
+ FeatureSet.find feature_set_name
26
25
  end
27
26
 
28
- def self.find(name)
29
- Sheriff.defined_feature_sets.select {|fs| fs.name == name}.first
30
- end
31
-
32
- attr_accessor :visible
33
- alias :visible? :visible
34
-
35
- def feature_set
36
- Sheriff.defined_feature_sets
37
- end
27
+ def feature_set(feature_set_name)
28
+ context = self
38
29
 
39
- def initialize
40
- @visible = true
30
+ fs = FeatureSet.find(feature_set_name).dup
31
+ fs.context = context
32
+ fs
41
33
  end
42
34
  end
43
35
 
44
- if Module.const_defined? 'ActionController'
45
- class ActionController::Base
46
- include Sheriff
47
- end
48
- end
36
+ include Sheriff
@@ -3,10 +3,48 @@ module Sheriff
3
3
  class FeatureSet
4
4
 
5
5
  attr_reader :name
6
+ attr_accessor :context
7
+
6
8
  def initialize(name)
7
9
  @name = name
10
+ @jurisdiction = Sheriff::Jurisdiction.new()
11
+ end
12
+
13
+ def hide(*args)
14
+ @jurisdiction.hide *args
15
+ end
16
+
17
+ def show(*args)
18
+ @jurisdiction.show *args
19
+ end
20
+
21
+ def visible?
22
+ caller.first.match /`(.+)'$/
23
+ context_method = $1
24
+ @jurisdiction.can? context_method.to_sym, @context
8
25
  end
9
26
 
27
+ def self.define(feature_set_name)
28
+ if self.defined? feature_set_name
29
+ raise Sheriff::FeatureSet::AlreadyDefinedError.new("Feature Set #{feature_set_name} already defined")
30
+ end
31
+
32
+ new_feature_set = Sheriff::FeatureSet.new(feature_set_name)
33
+ Sheriff.defined_feature_sets << new_feature_set
34
+ yield(new_feature_set) if block_given?
35
+ end
36
+
37
+ def self.defined?(feature_set_name)
38
+ Sheriff.defined_feature_sets.map(&:name).include?(feature_set_name)
39
+ end
40
+
41
+ def self.find(name)
42
+ Sheriff.defined_feature_sets.select {|fs| fs.name == name}.first
43
+ end
44
+
45
+ def self.all
46
+ Sheriff.defined_feature_sets
47
+ end
10
48
  end
11
49
 
12
50
  end
@@ -0,0 +1,16 @@
1
+ require 'cancan'
2
+
3
+ module Sheriff
4
+ class Jurisdiction
5
+ include CanCan::Ability
6
+
7
+ def show(method_name, const)
8
+ can method_name, const
9
+ end
10
+
11
+ def hide(method_name, const)
12
+ cannot method_name, const
13
+ end
14
+
15
+ end
16
+ end
data/sheriff.gemspec ADDED
@@ -0,0 +1,82 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{sheriff}
8
+ s.version = "0.0.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Anthony Navarre", "Jesse Trimble"]
12
+ s.date = %q{2011-02-13}
13
+ s.description = %q{Sheriff allows you to define "FeatureSets" and designate
14
+ under which contexts the FeatureSet should be visible (eg: a specific view or controller)}
15
+ s.email = %q{me@anthonynavarre.com}
16
+ s.extra_rdoc_files = [
17
+ "LICENSE.txt",
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ ".document",
22
+ ".pairs",
23
+ "CHANGELOG.txt",
24
+ "Gemfile",
25
+ "Gemfile.lock",
26
+ "LICENSE.txt",
27
+ "README.rdoc",
28
+ "ROADMAP.md",
29
+ "Rakefile",
30
+ "VERSION",
31
+ "lib/sheriff.rb",
32
+ "lib/sheriff/api.rb",
33
+ "lib/sheriff/context.rb",
34
+ "lib/sheriff/errors.rb",
35
+ "lib/sheriff/feature_set.rb",
36
+ "lib/sheriff/jurisdiction.rb",
37
+ "sheriff.gemspec",
38
+ "test/helper.rb",
39
+ "test/sheriff/test_feature_set.rb"
40
+ ]
41
+ s.homepage = %q{http://github.com/anthonynavarre/sheriff}
42
+ s.licenses = ["MIT"]
43
+ s.require_paths = ["lib"]
44
+ s.rubygems_version = %q{1.3.7}
45
+ s.summary = %q{Utility for hiding and showing features based on context}
46
+ s.test_files = [
47
+ "test/helper.rb",
48
+ "test/sheriff/test_feature_set.rb"
49
+ ]
50
+
51
+ if s.respond_to? :specification_version then
52
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
53
+ s.specification_version = 3
54
+
55
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
56
+ s.add_runtime_dependency(%q<cancan>, ["= 1.5.1"])
57
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
58
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
59
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
60
+ s.add_development_dependency(%q<rcov>, [">= 0"])
61
+ s.add_development_dependency(%q<redgreen>, ["= 1.2.2"])
62
+ s.add_development_dependency(%q<test-unit>, ["= 2.1.2"])
63
+ else
64
+ s.add_dependency(%q<cancan>, ["= 1.5.1"])
65
+ s.add_dependency(%q<shoulda>, [">= 0"])
66
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
67
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
68
+ s.add_dependency(%q<rcov>, [">= 0"])
69
+ s.add_dependency(%q<redgreen>, ["= 1.2.2"])
70
+ s.add_dependency(%q<test-unit>, ["= 2.1.2"])
71
+ end
72
+ else
73
+ s.add_dependency(%q<cancan>, ["= 1.5.1"])
74
+ s.add_dependency(%q<shoulda>, [">= 0"])
75
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
76
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
77
+ s.add_dependency(%q<rcov>, [">= 0"])
78
+ s.add_dependency(%q<redgreen>, ["= 1.2.2"])
79
+ s.add_dependency(%q<test-unit>, ["= 2.1.2"])
80
+ end
81
+ end
82
+
@@ -0,0 +1,75 @@
1
+ require 'helper'
2
+
3
+ class Sheriff::FeatureSetTest < Test::Unit::TestCase
4
+
5
+ context 'delicious bacon-wrapped context of chocolatey goodness' do
6
+
7
+ setup do
8
+ Sheriff.defined_feature_sets.clear
9
+ end
10
+
11
+ should 'have no defined features' do
12
+ deny FeatureSet.all.any?
13
+ end
14
+
15
+ should 'be able to define a feature' do
16
+ FeatureSet.define :share
17
+ assert FeatureSet.all.map(&:name).include? :share
18
+ end
19
+
20
+ context 'with a defined feature' do
21
+ setup do
22
+ FeatureSet.define :share
23
+ end
24
+
25
+ should 'know if a feature is already defined' do
26
+ assert FeatureSet.defined? :share
27
+ end
28
+
29
+ should 'know if a feature is *not* already defined' do
30
+ deny FeatureSet.defined? :undefined_feature
31
+ end
32
+
33
+ should 'raise when redefining the same feature' do
34
+ assert_raise Sheriff::FeatureSet::AlreadyDefinedError do
35
+ FeatureSet.define :share
36
+ end
37
+ end
38
+
39
+ should 'be able to find a feature' do
40
+ feature = FeatureSet(:share)
41
+ assert_equal :share, feature.name
42
+ end
43
+
44
+ end
45
+
46
+ context 'when executing within a context' do
47
+
48
+ setup do
49
+ class FakeContext
50
+ # include Sheriff::ContextInitializer
51
+
52
+ def show_method
53
+ feature_set(:fake_feature).visible?
54
+ end
55
+ def hide_method
56
+ feature_set(:fake_feature).visible?
57
+ end
58
+ end
59
+ FeatureSet.define :fake_feature do |f|
60
+ f.show :show_method, FakeContext
61
+ f.hide :hide_method, FakeContext
62
+ end
63
+ end
64
+
65
+ should 'be visible for FakeContext#show' do
66
+ assert FakeContext.new.show_method
67
+ end
68
+
69
+ should 'be hidden for FakeContext#hide' do
70
+ deny FakeContext.new.hide_method
71
+ end
72
+ end
73
+
74
+ end
75
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 2
9
+ version: 0.0.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Anthony Navarre
@@ -15,12 +15,27 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-11 00:00:00 -07:00
18
+ date: 2011-02-13 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: shoulda
22
+ name: cancan
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - "="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 1
30
+ - 5
31
+ - 1
32
+ version: 1.5.1
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: shoulda
38
+ requirement: &id002 !ruby/object:Gem::Requirement
24
39
  none: false
25
40
  requirements:
26
41
  - - ">="
@@ -30,10 +45,10 @@ dependencies:
30
45
  version: "0"
31
46
  type: :development
32
47
  prerelease: false
33
- version_requirements: *id001
48
+ version_requirements: *id002
34
49
  - !ruby/object:Gem::Dependency
35
50
  name: bundler
36
- requirement: &id002 !ruby/object:Gem::Requirement
51
+ requirement: &id003 !ruby/object:Gem::Requirement
37
52
  none: false
38
53
  requirements:
39
54
  - - ~>
@@ -45,10 +60,10 @@ dependencies:
45
60
  version: 1.0.0
46
61
  type: :development
47
62
  prerelease: false
48
- version_requirements: *id002
63
+ version_requirements: *id003
49
64
  - !ruby/object:Gem::Dependency
50
65
  name: jeweler
51
- requirement: &id003 !ruby/object:Gem::Requirement
66
+ requirement: &id004 !ruby/object:Gem::Requirement
52
67
  none: false
53
68
  requirements:
54
69
  - - ~>
@@ -60,10 +75,10 @@ dependencies:
60
75
  version: 1.5.2
61
76
  type: :development
62
77
  prerelease: false
63
- version_requirements: *id003
78
+ version_requirements: *id004
64
79
  - !ruby/object:Gem::Dependency
65
80
  name: rcov
66
- requirement: &id004 !ruby/object:Gem::Requirement
81
+ requirement: &id005 !ruby/object:Gem::Requirement
67
82
  none: false
68
83
  requirements:
69
84
  - - ">="
@@ -73,7 +88,37 @@ dependencies:
73
88
  version: "0"
74
89
  type: :development
75
90
  prerelease: false
76
- version_requirements: *id004
91
+ version_requirements: *id005
92
+ - !ruby/object:Gem::Dependency
93
+ name: redgreen
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - "="
98
+ - !ruby/object:Gem::Version
99
+ segments:
100
+ - 1
101
+ - 2
102
+ - 2
103
+ version: 1.2.2
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: *id006
107
+ - !ruby/object:Gem::Dependency
108
+ name: test-unit
109
+ requirement: &id007 !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - "="
113
+ - !ruby/object:Gem::Version
114
+ segments:
115
+ - 2
116
+ - 1
117
+ - 2
118
+ version: 2.1.2
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: *id007
77
122
  description: |-
78
123
  Sheriff allows you to define "FeatureSets" and designate
79
124
  under which contexts the FeatureSet should be visible (eg: a specific view or controller)
@@ -87,12 +132,13 @@ extra_rdoc_files:
87
132
  - README.rdoc
88
133
  files:
89
134
  - .document
135
+ - .pairs
90
136
  - CHANGELOG.txt
91
137
  - Gemfile
92
138
  - Gemfile.lock
93
139
  - LICENSE.txt
94
140
  - README.rdoc
95
- - ROADMAP.txt
141
+ - ROADMAP.md
96
142
  - Rakefile
97
143
  - VERSION
98
144
  - lib/sheriff.rb
@@ -100,8 +146,10 @@ files:
100
146
  - lib/sheriff/context.rb
101
147
  - lib/sheriff/errors.rb
102
148
  - lib/sheriff/feature_set.rb
149
+ - lib/sheriff/jurisdiction.rb
150
+ - sheriff.gemspec
103
151
  - test/helper.rb
104
- - test/test_sheriff.rb
152
+ - test/sheriff/test_feature_set.rb
105
153
  has_rdoc: true
106
154
  homepage: http://github.com/anthonynavarre/sheriff
107
155
  licenses:
@@ -116,7 +164,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
164
  requirements:
117
165
  - - ">="
118
166
  - !ruby/object:Gem::Version
119
- hash: 3703422532125167574
167
+ hash: 2942043483335471323
120
168
  segments:
121
169
  - 0
122
170
  version: "0"
@@ -137,4 +185,4 @@ specification_version: 3
137
185
  summary: Utility for hiding and showing features based on context
138
186
  test_files:
139
187
  - test/helper.rb
140
- - test/test_sheriff.rb
188
+ - test/sheriff/test_feature_set.rb
data/ROADMAP.txt DELETED
File without changes
data/test/test_sheriff.rb DELETED
@@ -1,38 +0,0 @@
1
- require 'helper'
2
-
3
- class SheriffTest < Test::Unit::TestCase
4
-
5
- context 'delicious bacon-wrapped context of chocolatey goodness' do
6
-
7
- setup do
8
- Sheriff.defined_feature_sets.clear
9
- end
10
-
11
- should 'have no defined features' do
12
- deny Sheriff.defined_feature_sets.any?
13
- end
14
-
15
- should 'be able to define a feature' do
16
- Sheriff.define :share
17
- assert Sheriff.defined_feature_sets.map(&:name).include? :share
18
- end
19
-
20
- context 'with a defined feature' do
21
- setup do
22
- Sheriff.define :share
23
- end
24
-
25
- should 'raise when redefining the same feature' do
26
- assert_raise Sheriff::FeatureSet::AlreadyDefinedError do
27
- Sheriff.define :share
28
- end
29
- end
30
-
31
- should 'be able to find a feature set' do
32
- assert Sheriff.find(:share),
33
- end
34
- end
35
- end
36
-
37
- end
38
-