consent 0.4.3 → 0.5.0

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
  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