consent 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 83520d7812046af394c1c5828f8456e9759a1984
4
+ data.tar.gz: 9d1998404b43857b3b8b4660ad88601fa96c5b01
5
+ SHA512:
6
+ metadata.gz: 57045196699fca95ab86ce0a5d293201d43a4287dbe621d46456afa6933ba71a55275a0dfd44aae090744536a48c03de0e6fd256b09c4e0e09a93ce106ed243b
7
+ data.tar.gz: 1fab9a82df666af3127df1c9cb892f9e06fa0f842581841c82840150f46ff0753bff8fa587e4285d7fc7024e7912a69f946dc88e5af63dc82952a593b40cefda
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.2.2
5
+ before_install: gem install bundler -v 1.12.1
6
+ deploy:
7
+ provider: rubygems
8
+ api_key:
9
+ secure: aCipdg6IqKaxQmWQXFlqI2JqGOrCAxzYlutOn6nCSk9VCzmlRjDoEp1M99ASvmF5CP3KQgfRq8bxfLql8jss8tymK0u2ExvKaUglK0zb2KoLQDGDGuHw3RxCTnaxPBuO4/2PuS+nso6IcdqUaGOzh8FA7ePKPBmxl3kyNtArEDV88Eyx6tQYs1/1w153bAeBk57nTiu8CPS+dIWg+guQADTLPZ61fH4xKjPWXnr65pFF7YtU5YdPBHFkqL60X384OZj1c7ZTGvFj70+36oo617HigSg8HCE+E0R1N4JQ8/5xo2yHBdrtgsAqYyYWRgm1C6qu+T6yKMuokdoSd0Ji3Rigz6VRrOJfjmQQkwMnno9fCY3vND62zOb9Ow+MCNuQYSgNHc+YPURKmT05wadG0FpZdmo6hstPusleuG89NxnB/s2YjR0QWQK05MW1uhFdru1S2gBd1fMH1GLoThhdfGG1UJSkKOipUJyRupFaB9zimJO3HwaTP0Q+wP8MGZDAqbyzQ3bJSZaQmJC6loC2EtxxnOQxUIxaySLtNEU2LOr9IijExj1ldXkz8X1fIWwRr6BPnIeChFnuST+L9UDYtqk1WgQTUs+tOAxUjepAWhtIUL5h3Jg2NZd9RxPXq8IngDWZJwT8yA3E9wloQx5JzTIMas5wHwCQJuwjjk5ibss=
10
+ gem: consent
11
+ on:
12
+ tags: true
13
+ repo: powerhome/consent
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in consent.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,245 @@
1
+ # Consent [![Build Status](https://travis-ci.org/powerhome/consent.svg?branch=master)](https://travis-ci.org/powerhome/consent)
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ ```ruby
8
+ gem 'consent'
9
+ ```
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install consent
18
+
19
+ ## What is Consent
20
+
21
+ Consent makes defining permissions easier by providing a clean, concise DSL for authorization so that all abilities do not have to be in your `Ability`
22
+ class.
23
+
24
+ Consent takes application permissions and models them so that permissions are organized and can be defined granularly. It does so using the
25
+ following models:
26
+
27
+ * View: A collection of objects limited by a given condition.
28
+ * Action: An action performed on top of the objects limited by the view. For example, one user could only `:view` something, while another could `:manage` it.
29
+ * Subject: Holds the scope of the actions.
30
+ * Permission: What is given to the user. Combines a subject, an action and
31
+ a view.
32
+
33
+ ## What Consent Is Not
34
+
35
+ Consent isn't a tool to enforce permissions -- it is intended to be used with CanCanCan and is only to make permissions more easily readable and definable.
36
+
37
+ ## Subject
38
+
39
+ The subject is the central point of a group of actions and views. It will typically
40
+ be an `ActiveRecord` class, a `:symbol`, or any Plain Old Ruby Object.
41
+
42
+ You define a subject with the following DSL:
43
+
44
+ ```ruby
45
+ Consent.define Project, 'Our Projects' do
46
+ #in this case, Project is the subject
47
+ # and `Our Projects` is the description that makes it clear to users
48
+ # what the subject is acting upon.
49
+
50
+ end
51
+ ```
52
+
53
+ The scope is the action that's being performed on the subject. It can be anything, but will typically be an ActiveRecord class, a `:symbol`, or a PORO.
54
+
55
+ For instance:
56
+
57
+ ```ruby
58
+ Consent.define :features, 'Beta Features' do
59
+ # whatever you put inside this method defines the scope
60
+ end
61
+ ```
62
+
63
+ ## Views
64
+
65
+ Views are the rules that limit the access to actions. For instance,
66
+ a user may see a `Project` from his department, but not from others. That rule
67
+ could be enforced with a `:department` view, defined like this:
68
+
69
+ ### Hash Conditions
70
+
71
+ This is probably the most commonly used and is useful, for example,
72
+ when the view can be defined using a where condition in an ActiveRecord context.
73
+ It follows a match condition and will return all objects that meet the criteria
74
+ and is based off a boolean:
75
+
76
+ ```ruby
77
+ Consent.define Project, 'Projects' do
78
+ view :department, "User's department only" do |user|
79
+ { department_id: user.id }
80
+ end
81
+ end
82
+ ```
83
+
84
+ Although hash conditions (matching object's attributes) are recommended,
85
+ the constraints can be anything you want. Since Consent does not enforce the
86
+ rules, those rules are directly given to CanCan. Following [CanCan rules](https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities%3A-Best-Practice)
87
+ for defining abilities is recommended.
88
+
89
+ ### Object Conditions
90
+
91
+ If you're not matching for equal values, then you would need to use an object
92
+ condition, which matches data based off a range.
93
+
94
+ If you already have an object and want to check to see whether the user has
95
+ permission to view that specific object, you would use object conditions.
96
+
97
+ If your needs can't be satisfied by hash conditions, it is recommended that a
98
+ second condition is given for constraining object instances. For example, if you
99
+ want to restrict a view for smaller volume projects:
100
+
101
+ ```ruby
102
+ Consent.define Project, 'Projects' do
103
+ view :small_volumes, "User's department only",
104
+ -> (user) {
105
+ ['amount < ?', user.volume_limit]
106
+ end,
107
+ -> (user, project) {
108
+ project.amount < user.volume_limit
109
+ }
110
+ end
111
+ ```
112
+
113
+ For object conditions, the latter argument will be the referred object, while the
114
+ former will be the context given to the [Permission](#permission) (also check
115
+ [CanCan integration](#cancan-integration)).
116
+
117
+ ## Action
118
+
119
+ An action is anything you can perform on a given subject. In the example of
120
+ Features this would look like the following using Consent's DSL:
121
+
122
+ ```ruby
123
+ Consent.define :features, 'Beta Features' do
124
+ action :beta_chat, 'Beta Chat App'
125
+ end
126
+ ```
127
+
128
+ To associate different views to the same action:
129
+
130
+ ```ruby
131
+ Consent.define Project, 'Projects' do
132
+ # returns conditions that can be used as a matcher for objects so the matcher
133
+ # can return true or false (hash version)
134
+ view :department, "User's department only" do |user|
135
+ { department_id: user.id }
136
+ end
137
+ view :future_projects, "User's department only",
138
+ # returns a condition to be applied to a collection of objects
139
+ -> (_) {
140
+ ['starts_at > ?', Date.today]
141
+ end,
142
+ # returns true/false based on a condition -- to use this, you must pass in
143
+ # an instance of an object in order to check the permission
144
+ -> (user, project) {
145
+ project.starts_at > Date.today
146
+ }
147
+
148
+ action :read, 'Read projects', views: [:department, :future_projects]
149
+ end
150
+ ```
151
+
152
+ If you have a set of actions with the same set of views, you can use a
153
+ `with_defaults` block to simplify the writing:
154
+
155
+ ```ruby
156
+ with_defaults views: [:department, :small_volumes] do
157
+ action :read, 'Read projects'
158
+ action :approve, 'Approve projects'
159
+ end
160
+ ```
161
+
162
+ ## Permission
163
+
164
+ A permission is what is consented to the user. It is the *permission* to perform
165
+ an *action* on a limited *view* of the *subject*. It marries the three concepts
166
+ to consent an access to the user.
167
+
168
+ A permission is not specified by the user, it is calculated from a permissions
169
+ hash owned by a `User`, or a `Role` on an application.
170
+
171
+ The permissions hash looks like the following:
172
+
173
+ ```ruby
174
+ {
175
+ project: {
176
+ read: 'department',
177
+ approve: 'small_volumes'
178
+ }
179
+ }
180
+ ```
181
+
182
+ In other words:
183
+
184
+ ```ruby
185
+ {
186
+ <subject>: {
187
+ <action>: <view>
188
+ }
189
+ }
190
+ ```
191
+
192
+ ### Full Access
193
+
194
+ Full (unrestricted by views) access is granted when view is `'1'`, `true` or
195
+ `'true'`. For instance:
196
+
197
+ In other words:
198
+
199
+ ```ruby
200
+ {
201
+ projects: {
202
+ approve: true
203
+ }
204
+ }
205
+ ```
206
+
207
+ ## CanCan Integration
208
+
209
+ Consent provides a CanCan ability (Consent::Ability) to integrate your
210
+ permissions with frameworks like Rails. To use it with Rails check out the
211
+ example at [Ability for Other Users](https://github.com/CanCanCommunity/cancancan/wiki/Ability-for-Other-Users)
212
+ on CanCanCan's wiki.
213
+
214
+ In the ability you define the scope of the permissions. This is typically an
215
+ user:
216
+
217
+ ```ruby
218
+ Consent::Ability.new(user.permissions, user)
219
+ ```
220
+
221
+ The first parameter given to the ability is the permissions hash, seen at
222
+ [Permission](#permission). The following parameters are the permission context.
223
+ These parameters are given directly to the condition blocks defined by the views
224
+ in the exact same order, so it's up to you to define what your context is.
225
+
226
+ ## Rails Integration
227
+
228
+ Consent is integrated into Rails with `Consent::Railtie`. To define where
229
+ your permission files will be, use `config.consent.path`. This defaults to
230
+ `app/permissions/` to conform to Rails' standards.
231
+
232
+ ## Development
233
+
234
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run
235
+ `rake spec` to run the tests. You can also run `bin/console` for an interactive
236
+ prompt that will allow you to experiment.
237
+
238
+ To install this gem onto your local machine, run `bundle exec rake install`. To
239
+ release a new version, update the version number in `version.rb`, and then run
240
+ `bundle exec rake release`, which will create a git tag for the version, push
241
+ git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
242
+
243
+ ## Contributing
244
+
245
+ Bug reports and pull requests are welcome on GitHub at https://github.com/powerhome/consent.
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/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "consent"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/consent.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'consent/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'consent'
8
+ spec.version = Consent::VERSION
9
+ spec.authors = ['Carlos Palhares']
10
+ spec.email = ['chjunior@gmail.com']
11
+
12
+ spec.summary = 'Consent'
13
+ spec.description = 'Consent'
14
+
15
+ spec.files = `git ls-files`.split.reject do |file|
16
+ file =~ /^(test|spec|features)/
17
+ end
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_development_dependency 'activesupport', '~> 3.2.22'
21
+ spec.add_development_dependency 'cancancan', '~> 1.15.0'
22
+ spec.add_development_dependency 'bundler', '~> 1.12'
23
+ spec.add_development_dependency 'rake', '~> 10.0'
24
+ spec.add_development_dependency 'rspec', '~> 3.0'
25
+ end
@@ -0,0 +1,13 @@
1
+ module Consent
2
+ class Ability
3
+ include CanCan::Ability
4
+
5
+ def initialize(permissions, *args)
6
+ Consent.permissions(permissions).each do |permission|
7
+ conditions = permission.conditions(*args)
8
+ object_conditions = permission.object_conditions(*args)
9
+ can permission.action_key, permission.subject_key, conditions, &object_conditions
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ module Consent
2
+ class Action
3
+ attr_reader :key, :label, :options
4
+
5
+ def initialize(key, label, options = {})
6
+ @key = key
7
+ @label = label
8
+ @options = options
9
+ end
10
+
11
+ def view_keys
12
+ @options.fetch(:views, [])
13
+ end
14
+
15
+ def default_view
16
+ @options[:default_view]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,35 @@
1
+ module Consent
2
+ class DSL
3
+ attr_reader :subject
4
+
5
+ def initialize(subject, defaults)
6
+ @subject = subject
7
+ @defaults = defaults
8
+ end
9
+
10
+ def with_defaults(new_defaults, &block)
11
+ DSL.build(@subject, @defaults.merge(new_defaults), &block)
12
+ end
13
+
14
+ # rubocop:disable Link/UnusedBlockArgument, Link/Eval
15
+ def eval_view(key, label, collection_conditions)
16
+ view key, label do |user|
17
+ eval(collection_conditions)
18
+ end
19
+ end
20
+ # rubocop:enable Link/UnusedBlockArgument, Link/Eval
21
+
22
+ def view(key, label, instance = nil, collection = nil, &block)
23
+ collection ||= block
24
+ @subject.views[key] = View.new(key, label, instance, collection)
25
+ end
26
+
27
+ def action(key, label, options = {})
28
+ @subject.actions << Action.new(key, label, @defaults.merge(options))
29
+ end
30
+
31
+ def self.build(subject, defaults = {}, &block)
32
+ DSL.new(subject, defaults).instance_eval(&block)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ module Consent
2
+ class Permission
3
+ def initialize(subject, action, view = nil)
4
+ @subject = subject
5
+ @action = action
6
+ @view = view
7
+ end
8
+
9
+ def subject_key
10
+ @subject.key
11
+ end
12
+
13
+ def action_key
14
+ @action.key
15
+ end
16
+
17
+ def view_key
18
+ @view && @view.key
19
+ end
20
+
21
+ def conditions(*args)
22
+ @view && @view.conditions(*args)
23
+ end
24
+
25
+ def object_conditions(*args)
26
+ @view && @view.object_conditions(*args)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ module Consent
2
+ class Permissions
3
+ include Enumerable
4
+
5
+ def initialize(permissions)
6
+ @permissions = permissions
7
+ end
8
+
9
+ def each(&block)
10
+ Consent.subjects.values.each do |subject|
11
+ subject.actions.map do |action|
12
+ map_permission subject, action
13
+ end.compact.each(&block)
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def map_permission(subject, action)
20
+ subject_key = subject.permission_key
21
+ actions = @permissions[subject_key] || @permissions[subject_key.to_s]
22
+ view = actions && (actions[action.key] || actions[action.key.to_s])
23
+ full(subject, action, view) || partial(subject, action, view)
24
+ end
25
+
26
+ def full(subject, action, view_key)
27
+ return unless Consent::FULL_ACCESS.include?(view_key.to_s.strip)
28
+ Permission.new(subject, action)
29
+ end
30
+
31
+ def partial(subject, action, view_key)
32
+ view = subject.view_for(action, view_key.to_s.to_sym)
33
+ return if view.nil?
34
+ Permission.new(subject, action, view)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,19 @@
1
+ module Consent
2
+ # Plugs consent permission load to the Rails class loading cycle
3
+ class Railtie < Rails::Railtie
4
+ config.before_configuration do
5
+ default_path = Rails.root.join('app', 'permissions')
6
+ config.consent = Struct.new(:paths).new([default_path])
7
+ end
8
+
9
+ config.to_prepare do
10
+ Consent.subjects.clear
11
+ Consent.load_subjects! Rails.application.config.consent.paths
12
+ end
13
+
14
+ config.after_initialize do
15
+ permissions_paths = config.consent.paths.map(&:to_s)
16
+ ActiveSupport::Dependencies.autoload_paths -= permissions_paths
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,71 @@
1
+ require 'consent'
2
+
3
+ module Consent
4
+ module Rspec
5
+ extend RSpec::Matchers::DSL
6
+
7
+ def get_view(subject_key, view_key)
8
+ Consent.subjects[subject_key].try(:views).try(:[], view_key)
9
+ end
10
+
11
+ def get_action(subject_key, action_key)
12
+ (Consent.subjects[subject_key].try(:actions) || []).find do |action|
13
+ action.key.eql?(action_key)
14
+ end
15
+ end
16
+
17
+ def get_action_view_keys(subject_key, action_key)
18
+ (get_action(subject_key, action_key).try(:options).try(:[], :views) || []).map(&:key)
19
+ end
20
+
21
+ matcher :consent_action do |action_key|
22
+ chain :with_views do |*views|
23
+ @views = views
24
+ end
25
+
26
+ match do |subject_key|
27
+ action = get_action(subject_key, action_key)
28
+ action && @views ? action.view_keys.sort.eql?(@views.sort) : !action.nil?
29
+ end
30
+
31
+ failure_message do |subject_key|
32
+ action = get_action(subject_key, action_key)
33
+ message = "expected %s (%s) to provide action %s" % [
34
+ subject_key.to_s, subject.class, action_key
35
+ ]
36
+
37
+ if action && @views
38
+ '%s with views %s, but actual views are %p' % [message, @views, action.view_keys]
39
+ else
40
+ message
41
+ end
42
+ end
43
+ end
44
+
45
+ matcher :consent_view do |view_key, conditions|
46
+ chain :to do |*context|
47
+ @context = context
48
+ end
49
+
50
+ match do |subject_key|
51
+ view = get_view(subject_key, view_key)
52
+ conditions ? view.try(:conditions, *@context).eql?(conditions) : !view.nil?
53
+ end
54
+
55
+ failure_message do |subject_key|
56
+ view = get_view(subject_key, view_key)
57
+ message = "expected %s (%s) to provide view %s with %p, but" % [
58
+ subject_key.to_s, subject.class, view_key, conditions
59
+ ]
60
+
61
+ if view && conditions
62
+ actual_conditions = view.conditions(*@context)
63
+ '%s conditions are %p' % [message, actual_conditions]
64
+ else
65
+ actual_views = Consent.subjects[subject_key].try(:views).try(:keys)
66
+ '%s available views are %p' % [message, actual_views]
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,21 @@
1
+ module Consent
2
+ class Subject
3
+ attr_reader :key, :label, :actions, :views
4
+
5
+ def initialize(key, label)
6
+ @key = key
7
+ @label = label
8
+ @actions = []
9
+ @views = Consent.default_views.clone
10
+ end
11
+
12
+ def permission_key
13
+ ActiveSupport::Inflector.underscore(@key.to_s).to_sym
14
+ end
15
+
16
+ def view_for(action, key)
17
+ view = @views.keys & action.view_keys & [key]
18
+ @views[view.first] || @views[action.default_view]
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module Consent
2
+ VERSION = '0.3.1'.freeze
3
+ end
@@ -0,0 +1,22 @@
1
+ module Consent
2
+ class View
3
+ attr_reader :key, :label
4
+
5
+ def initialize(key, label, instance = nil, collection = nil)
6
+ @key = key
7
+ @label = label
8
+ @instance = instance
9
+ @collection = collection
10
+ end
11
+
12
+ def conditions(*args)
13
+ return @collection unless @collection.respond_to?(:call)
14
+ @collection.call(*args)
15
+ end
16
+
17
+ def object_conditions(*args)
18
+ return @instance unless @instance.respond_to?(:curry)
19
+ @instance.curry[*args]
20
+ end
21
+ end
22
+ end
data/lib/consent.rb ADDED
@@ -0,0 +1,37 @@
1
+ require 'consent/version'
2
+ require 'consent/subject'
3
+ require 'consent/view'
4
+ require 'consent/action'
5
+ require 'consent/dsl'
6
+ require 'consent/permission'
7
+ require 'consent/permissions'
8
+ require 'consent/ability' if defined?(CanCan)
9
+ require 'consent/railtie' if defined?(Rails)
10
+
11
+ module Consent
12
+ FULL_ACCESS = %w(1 true).freeze
13
+
14
+ def self.default_views
15
+ @default_views ||= {}
16
+ end
17
+
18
+ def self.subjects
19
+ @subjects ||= {}
20
+ end
21
+
22
+ def self.load_subjects!(paths)
23
+ permission_files = paths.map { |dir| dir.join('*.rb') }
24
+ Dir[*permission_files].each(&Kernel.method(:load))
25
+ end
26
+
27
+ def self.define(key, label, options = {}, &block)
28
+ defaults = options.fetch(:defaults, {})
29
+ subjects[key] = Subject.new(key, label).tap do |subject|
30
+ DSL.build(subject, defaults, &block)
31
+ end
32
+ end
33
+
34
+ def self.permissions(permissions)
35
+ Permissions.new(permissions)
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ module Consent
2
+ class PermissionsGenerator < Rails::Generators::NamedBase
3
+ source_root File.expand_path('../templates', __FILE__)
4
+ argument :description, type: :string, required: false
5
+
6
+ def create_permissions
7
+ template "permissions.rb.erb", "app/permissions/#{file_path}.rb", assigns: {
8
+ description: description
9
+ }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ Consent.define <%= @name %>, "<%= @description %>" do
2
+ # Define your views
3
+ # i.e.:
4
+ # view :department, 'Same department only' do |user|
5
+ # { department_id: user.department_id }
6
+ # end
7
+
8
+ # Define your actions
9
+ # i.e.:
10
+ # action :read, "Can view <%= @subject %>"
11
+
12
+ # Define actions with different views
13
+ # i.e.:
14
+ # action :update, "Can edit existing <%= @subject %>", views: :department
15
+
16
+ # Find more examples at:
17
+ # https://github.com/powerhome/consent
18
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: consent
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Carlos Palhares
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.22
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.2.22
27
+ - !ruby/object:Gem::Dependency
28
+ name: cancancan
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.15.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.15.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.12'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.12'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ description: Consent
84
+ email:
85
+ - chjunior@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - Gemfile
94
+ - README.md
95
+ - Rakefile
96
+ - bin/console
97
+ - bin/setup
98
+ - consent.gemspec
99
+ - lib/consent.rb
100
+ - lib/consent/ability.rb
101
+ - lib/consent/action.rb
102
+ - lib/consent/dsl.rb
103
+ - lib/consent/permission.rb
104
+ - lib/consent/permissions.rb
105
+ - lib/consent/railtie.rb
106
+ - lib/consent/rspec.rb
107
+ - lib/consent/subject.rb
108
+ - lib/consent/version.rb
109
+ - lib/consent/view.rb
110
+ - lib/generators/consent/permissions_generator.rb
111
+ - lib/generators/consent/templates/permissions.rb.erb
112
+ homepage:
113
+ licenses: []
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 2.4.8
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: Consent
135
+ test_files: []