consent 0.4.3 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79adf851fbc13c53c81e784d654c34e6da171a57c78767148b7da5ee9241181b
4
- data.tar.gz: a9d032376facd18c89f8d0cfa4b8b2cd60661447649a51717c5a0923576fd531
3
+ metadata.gz: d3254860bde068adbf1c32b4896bb40f39fb1bc44bfa41c78b776829f749911f
4
+ data.tar.gz: 9124b3b1e01bdc677666a0934062000a1760e36773ac698abc82e0f37bd24039
5
5
  SHA512:
6
- metadata.gz: 229130ac93dc5d6f7705d67ac85e147d3f36013eb121cc92e5e6b43c7cd33b220c79c00df50ae873bee92b56be6fa7b73ecf7fa0ddae9375c87db5cf73b58e84
7
- data.tar.gz: f68312f4f3bf1f3ce60911793a0149d5681adb99f02b3c44e86639d1a91aff86000debb0476c119fea123a89d76a7f296a48d9a8aaee237838f0522932b9302f
6
+ metadata.gz: 93db20c8fdbeadf56bb9e49db970410cb2e527c720955eb60d5df2e05764e08942323ea1328a6ef07bb9f27bac4393a9a57e002762c0a30afe066699dd8ce12c
7
+ data.tar.gz: 0e6ed845b8785fbb570eff561f49de1d2c9b5d1a2a7c06ef9eeb248f4b087f20d5066f4b891aa40b5b7fec23360b45ec17717086ea30cb6713d5e2645bb7afba
@@ -0,0 +1 @@
1
+ inherit_from: .rubocop_todo.yml
@@ -0,0 +1,21 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2019-11-20 02:06:29 -0300 using RuboCop version 0.65.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 5
10
+ # Configuration parameters: CountComments, ExcludedMethods.
11
+ # ExcludedMethods: refine
12
+ Metrics/BlockLength:
13
+ Exclude:
14
+ - 'spec/**/*'
15
+ - 'lib/consent/rspec.rb'
16
+
17
+ # Offense count: 9
18
+ Style/Documentation:
19
+ Exclude:
20
+ - 'spec/**/*'
21
+ - 'test/**/*'
@@ -4,6 +4,9 @@ rvm:
4
4
  - 2.2.2
5
5
  - 2.5.0
6
6
  before_install: gem install bundler -v 1.17.3
7
+ script:
8
+ - bundle exec rubocop
9
+ - bundle exec rspec
7
10
  deploy:
8
11
  provider: rubygems
9
12
  api_key:
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in consent.gemspec
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "consent"
4
+ require 'bundler/setup'
5
+ require 'consent'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +11,5 @@ require "consent"
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- require "irb"
14
+ require 'irb'
14
15
  IRB.start
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'consent/version'
5
6
 
@@ -18,8 +19,9 @@ Gem::Specification.new do |spec|
18
19
  spec.require_paths = ['lib']
19
20
 
20
21
  spec.add_development_dependency 'activesupport', '>= 4.1.11'
22
+ spec.add_development_dependency 'bundler', '>= 1.17.3'
21
23
  spec.add_development_dependency 'cancancan', '~> 1.15.0'
22
- spec.add_development_dependency 'bundler', '~> 1.17.3'
23
24
  spec.add_development_dependency 'rake', '~> 10.0'
24
25
  spec.add_development_dependency 'rspec', '~> 3.0'
26
+ spec.add_development_dependency 'rubocop', '~> 0.65.0'
25
27
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'consent/version'
2
4
  require 'consent/subject'
3
5
  require 'consent/view'
@@ -8,23 +10,42 @@ require 'consent/permissions'
8
10
  require 'consent/ability' if defined?(CanCan)
9
11
  require 'consent/railtie' if defined?(Rails)
10
12
 
13
+ # Consent makes defining permissions easier by providing a clean,
14
+ # concise DSL for authorization so that all abilities do not have
15
+ # to be in your `Ability` class.
11
16
  module Consent
12
- FULL_ACCESS = %w(1 true).freeze
17
+ FULL_ACCESS = %w[1 true].freeze
13
18
 
19
+ # Default views available to every permission
20
+ #
21
+ # i.e.:
22
+ # Defining a view with no conditions:
23
+ # Consent.default_views[:all] = Consent::View.new(:all, "All")
24
+ #
25
+ # @return [Hash<Symbol,Consent::View>]
14
26
  def self.default_views
15
27
  @default_views ||= {}
16
28
  end
17
29
 
30
+ # Subjects defined in Consent
31
+ #
32
+ # @return [Array<Consent::Subject>]
18
33
  def self.subjects
19
34
  @subjects ||= []
20
35
  end
21
36
 
37
+ # Finds all subjects defined with the given key
38
+ #
39
+ # @return [Array<Consent::Subject>]
22
40
  def self.find_subjects(subject_key)
23
41
  @subjects.find_all do |subject|
24
42
  subject.key.eql?(subject_key)
25
43
  end
26
44
  end
27
45
 
46
+ # Finds an action within a subject context
47
+ #
48
+ # @return [Consent::Action,nil]
28
49
  def self.find_action(subject_key, action_key)
29
50
  Consent.find_subjects(subject_key)
30
51
  .map(&:actions).flatten
@@ -33,18 +54,36 @@ module Consent
33
54
  end
34
55
  end
35
56
 
57
+ # Finds a view within a subject context
58
+ #
59
+ # @return [Consent::View,nil]
36
60
  def self.find_view(subject_key, view_key)
37
61
  views = Consent.find_subjects(subject_key)
38
- .map{|subject| subject.views}
62
+ .map(&:views)
39
63
  .reduce({}, &:merge)
40
64
  views[view_key]
41
65
  end
42
66
 
43
- def self.load_subjects!(paths)
67
+ # Loads all permission (ruby) files from the given directory
68
+ # and using the given mechanism (default: :require)
69
+ #
70
+ # @param paths [Array<String,#to_s>] paths where the ruby files are located
71
+ # @param mechanism [:require,:load] mechanism to load the files
72
+ def self.load_subjects!(paths, mechanism = :require)
44
73
  permission_files = paths.map { |dir| File.join(dir, '*.rb') }
45
- Dir[*permission_files].each(&Kernel.method(:require))
74
+ Dir[*permission_files].each(&Kernel.method(mechanism))
46
75
  end
47
76
 
77
+ # Defines a subject with the given key, label and options
78
+ #
79
+ # i.e:
80
+ # Consent.define :users, "User management" do
81
+ # view :department, "Same department only" do |user|
82
+ # { department_id: user.department_id }
83
+ # end
84
+ # action :read, "Can view users"
85
+ # action :update, "Can edit existing user", views: :department
86
+ # end
48
87
  def self.define(key, label, options = {}, &block)
49
88
  defaults = options.fetch(:defaults, {})
50
89
  subjects << Subject.new(key, label).tap do |subject|
@@ -52,6 +91,9 @@ module Consent
52
91
  end
53
92
  end
54
93
 
94
+ # Maps a permissions hash to a Consent::Permissions
95
+ #
96
+ # @return [Consent::Permissions]
55
97
  def self.permissions(permissions)
56
98
  Permissions.new(permissions)
57
99
  end
@@ -1,12 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Consent
4
+ # Defines a CanCan(Can)::Ability class based on a permissions hash
2
5
  class Ability
3
6
  include CanCan::Ability
4
7
 
5
8
  def initialize(permissions, *args)
6
9
  Consent.permissions(permissions).each do |permission|
7
10
  conditions = permission.conditions(*args)
8
- object_conditions = permission.object_conditions(*args)
9
- can permission.action_key, permission.subject_key, conditions, &object_conditions
11
+ ocond = permission.object_conditions(*args)
12
+ can permission.action_key, permission.subject_key, conditions, &ocond
10
13
  end
11
14
  end
12
15
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Consent
2
- class Action
4
+ class Action # :nodoc:
3
5
  attr_reader :key, :label, :options
4
6
 
5
7
  def initialize(key, label, options = {})
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Consent
2
- class DSL
4
+ class DSL # :nodoc:
3
5
  attr_reader :subject
4
6
 
5
7
  def initialize(subject, defaults)
@@ -11,13 +13,13 @@ module Consent
11
13
  DSL.build(@subject, @defaults.merge(new_defaults), &block)
12
14
  end
13
15
 
14
- # rubocop:disable Link/UnusedBlockArgument, Link/Eval
16
+ # rubocop:disable Lint/UnusedBlockArgument, Security/Eval
15
17
  def eval_view(key, label, collection_conditions)
16
18
  view key, label do |user|
17
19
  eval(collection_conditions)
18
20
  end
19
21
  end
20
- # rubocop:enable Link/UnusedBlockArgument, Link/Eval
22
+ # rubocop:enable Lint/UnusedBlockArgument, Security/Eval
21
23
 
22
24
  def view(key, label, instance = nil, collection = nil, &block)
23
25
  collection ||= block
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Consent
2
- class Permission
4
+ class Permission # :nodoc:
3
5
  def initialize(subject, action, view = nil)
4
6
  @subject = subject
5
7
  @action = action
@@ -14,6 +16,9 @@ module Consent
14
16
  @action.key
15
17
  end
16
18
 
19
+ # Disables Sytle/SafeNavigation to keep this code
20
+ # compatible with ruby < 2.3
21
+ # rubocop:disable Style/SafeNavigation
17
22
  def view_key
18
23
  @view && @view.key
19
24
  end
@@ -25,5 +30,6 @@ module Consent
25
30
  def object_conditions(*args)
26
31
  @view && @view.object_conditions(*args)
27
32
  end
33
+ # rubocop:enable Style/SafeNavigation
28
34
  end
29
35
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Consent
2
- class Permissions
4
+ class Permissions # :nodoc:
3
5
  include Enumerable
4
6
 
5
7
  def initialize(permissions)
@@ -25,12 +27,14 @@ module Consent
25
27
 
26
28
  def full(subject, action, view_key)
27
29
  return unless Consent::FULL_ACCESS.include?(view_key.to_s.strip)
30
+
28
31
  Permission.new(subject, action)
29
32
  end
30
33
 
31
34
  def partial(subject, action, view_key)
32
35
  view = subject.view_for(action, view_key.to_s.to_sym)
33
36
  return if view.nil?
37
+
34
38
  Permission.new(subject, action, view)
35
39
  end
36
40
  end
@@ -1,19 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'consent/reloader'
4
+
1
5
  module Consent
2
6
  # Plugs consent permission load to the Rails class loading cycle
3
7
  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])
8
+ config.before_configuration do |app|
9
+ default_path = app.root.join('app', 'permissions')
10
+ config.consent = Consent::Reloader.new(
11
+ default_path,
12
+ ActiveSupport::Dependencies.mechanism
13
+ )
7
14
  end
8
15
 
9
- config.to_prepare do
10
- Consent.subjects.clear
11
- Consent.load_subjects! Rails.application.config.consent.paths
16
+ config.after_initialize do |app|
17
+ app.config.consent.execute
12
18
  end
13
19
 
14
- config.after_initialize do
15
- permissions_paths = config.consent.paths.map(&:to_s)
16
- ActiveSupport::Dependencies.autoload_paths -= permissions_paths
20
+ initializer 'initialize consent permissions reloading' do |app|
21
+ app.reloaders << config.consent
22
+ ActiveSupport::Dependencies.autoload_paths -= config.consent.paths
23
+ config.to_prepare { app.config.consent.execute_if_updated }
17
24
  end
18
25
  end
19
26
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Consent
4
+ # Rails file reloader to detect permission changes and apply them to consent
5
+ class Reloader
6
+ attr_reader :paths
7
+ delegate :updated?, :execute, :execute_if_updated, to: :updater
8
+
9
+ def initialize(default_path, mechanism)
10
+ @paths = [default_path]
11
+ @mechanism = mechanism
12
+ end
13
+
14
+ private
15
+
16
+ def reload!
17
+ Consent.subjects.clear
18
+ Consent.load_subjects! paths, @mechanism
19
+ end
20
+
21
+ def updater
22
+ @updater ||= ActiveSupport::FileUpdateChecker.new([], globs) { reload! }
23
+ end
24
+
25
+ def globs
26
+ pairs = paths.map { |path| [path.to_s, %w[rb]] }
27
+ Hash[pairs]
28
+ end
29
+ end
30
+ end
@@ -1,6 +1,33 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'consent'
2
4
 
3
5
  module Consent
6
+ # RSpec helpers for consent. Given permissions are loaded,
7
+ # gives you the ability of defining permission specs like
8
+ #
9
+ # Given "users" permissions
10
+ # Consent.define :users, "User management" do
11
+ # view :department, "Same department only" do |user|
12
+ # { department_id: user.department_id }
13
+ # end
14
+ # action :read, "Can view users"
15
+ # action :update, "Can edit existing user", views: :department
16
+ # end
17
+ #
18
+ # RSpec.describe "User permissions" do
19
+ # include Consent::Rspec
20
+ # let(:user) { double(department_id: 15) }
21
+ #
22
+ # it do
23
+ # is_expected.to consent_view(:department, department_id: 15).to(user)
24
+ # end
25
+ # it { is_expected.to consent_action(:read) }
26
+ # it { is_expected.to consent_action(:update).with_views(:department) }
27
+ # end
28
+ #
29
+ # Find more examples at:
30
+ # https://github.com/powerhome/consent
4
31
  module Rspec
5
32
  extend RSpec::Matchers::DSL
6
33
 
@@ -11,17 +38,25 @@ module Consent
11
38
 
12
39
  match do |subject_key|
13
40
  action = Consent.find_action(subject_key, action_key)
14
- action && @views ? action.view_keys.sort.eql?(@views.sort) : !action.nil?
41
+ if action && @views
42
+ values_match?(action.view_keys.sort, @views.sort)
43
+ else
44
+ !action.nil?
45
+ end
15
46
  end
16
47
 
17
48
  failure_message do |subject_key|
18
49
  action = Consent.find_action(subject_key, action_key)
19
- message = "expected %s (%s) to provide action %s" % [
20
- subject_key.to_s, subject.class, action_key
21
- ]
50
+ message = format(
51
+ 'expected %<skey>s (%<sclass>s) to provide action %<action>s',
52
+ skey: subject_key.to_s, sclass: subject.class, action: action_key
53
+ )
22
54
 
23
55
  if action && @views
24
- '%s with views %s, but actual views are %p' % [message, @views, action.view_keys]
56
+ format(
57
+ '%<message>s with views %<views>s, but actual views are %<keys>p',
58
+ message: message, views: @views, keys: action.view_keys
59
+ )
25
60
  else
26
61
  message
27
62
  end
@@ -35,21 +70,36 @@ module Consent
35
70
 
36
71
  match do |subject_key|
37
72
  view = Consent.find_view(subject_key, view_key)
38
- conditions ? view.try(:conditions, *@context).eql?(conditions) : !view.nil?
73
+ if conditions
74
+ view&.conditions(*@context).eql?(conditions)
75
+ else
76
+ !view.nil?
77
+ end
39
78
  end
40
79
 
41
80
  failure_message do |subject_key|
42
81
  view = Consent.find_view(subject_key, view_key)
43
- message = "expected %s (%s) to provide view %s with %p, but" % [
44
- subject_key.to_s, subject.class, view_key, conditions
45
- ]
82
+ message = format(
83
+ 'expected %<skey>s (%<sclass>s) to provide view %<view>s with` \
84
+ `%<conditions>p, but',
85
+ skey: subject_key.to_s, sclass: subject.class,
86
+ view: view_key, conditions: conditions
87
+ )
46
88
 
47
89
  if view && conditions
48
90
  actual_conditions = view.conditions(*@context)
49
- '%s conditions are %p' % [message, actual_conditions]
91
+ format(
92
+ '%<message>s conditions are %<conditions>p',
93
+ message: message, conditions: actual_conditions
94
+ )
50
95
  else
51
- actual_views = Consent.find_subjects(subject_key).map(&:views).map(&:keys).flatten
52
- '%s available views are %p' % [message, actual_views]
96
+ actual_views = Consent.find_subjects(subject_key)
97
+ .map(&:views)
98
+ .map(&:keys).flatten
99
+ format(
100
+ '%<message>s available views are %<views>p',
101
+ message: message, views: actual_views
102
+ )
53
103
  end
54
104
  end
55
105
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Consent
2
- class Subject
4
+ class Subject # :nodoc:
3
5
  attr_reader :key, :label, :actions, :views
4
6
 
5
7
  def initialize(key, label)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Consent
2
- VERSION = '0.4.3'.freeze
4
+ VERSION = '0.5.0'
3
5
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Consent
2
- class View
4
+ class View # :nodoc:
3
5
  attr_reader :key, :label
4
6
 
5
7
  def initialize(key, label, instance = nil, collection = nil)
@@ -11,11 +13,13 @@ module Consent
11
13
 
12
14
  def conditions(*args)
13
15
  return @collection unless @collection.respond_to?(:call)
16
+
14
17
  @collection.call(*args)
15
18
  end
16
19
 
17
20
  def object_conditions(*args)
18
21
  return @instance unless @instance.respond_to?(:curry)
22
+
19
23
  @instance.curry[*args]
20
24
  end
21
25
  end
@@ -1,14 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Consent
2
- class PermissionsGenerator < Rails::Generators::NamedBase
3
- source_root File.expand_path('../templates', __FILE__)
4
+ class PermissionsGenerator < Rails::Generators::NamedBase # :nodoc:
5
+ source_root File.expand_path('templates', __dir__)
4
6
  argument :description, type: :string, required: false
5
7
 
6
8
  def create_permissions
7
- template "permissions.rb.erb", "app/permissions/#{file_path}.rb", assigns: {
8
- description: description
9
- }
9
+ template(
10
+ 'permissions.rb.erb',
11
+ "app/permissions/#{file_path}.rb",
12
+ assigns: { description: description }
13
+ )
10
14
 
11
- template "permissions_spec.rb.erb", "spec/permissions/#{file_path}_spec.rb"
15
+ template(
16
+ 'permissions_spec.rb.erb',
17
+ "spec/permissions/#{file_path}_spec.rb"
18
+ )
12
19
  end
13
20
  end
14
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: consent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carlos Palhares
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-02 00:00:00.000000000 Z
11
+ date: 2019-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -25,33 +25,33 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 4.1.11
27
27
  - !ruby/object:Gem::Dependency
28
- name: cancancan
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.15.0
33
+ version: 1.17.3
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.15.0
40
+ version: 1.17.3
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: cancancan
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.17.3
47
+ version: 1.15.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.17.3
54
+ version: 1.15.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.65.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.65.0
83
97
  description: Consent
84
98
  email:
85
99
  - chjunior@gmail.com
@@ -89,6 +103,8 @@ extra_rdoc_files: []
89
103
  files:
90
104
  - ".gitignore"
91
105
  - ".rspec"
106
+ - ".rubocop.yml"
107
+ - ".rubocop_todo.yml"
92
108
  - ".ruby-version"
93
109
  - ".travis.yml"
94
110
  - Gemfile
@@ -105,6 +121,7 @@ files:
105
121
  - lib/consent/permission.rb
106
122
  - lib/consent/permissions.rb
107
123
  - lib/consent/railtie.rb
124
+ - lib/consent/reloader.rb
108
125
  - lib/consent/rspec.rb
109
126
  - lib/consent/subject.rb
110
127
  - lib/consent/version.rb
@@ -131,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
148
  version: '0'
132
149
  requirements: []
133
150
  rubyforge_project:
134
- rubygems_version: 2.7.3
151
+ rubygems_version: 2.7.7
135
152
  signing_key:
136
153
  specification_version: 4
137
154
  summary: Consent