papers_please 0.1.4 → 0.1.5

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
- SHA1:
3
- metadata.gz: bd9618d4daa3097adfab01cf14a0acdd733fe3a9
4
- data.tar.gz: 9609532bc749992a740c9436ec681d4ab24327ec
2
+ SHA256:
3
+ metadata.gz: d8107fa501a7483009cafcfb51d09a5672fbc62b881b8752efdb65fcfa559383
4
+ data.tar.gz: 6059429b9c9b8465ca349762798b04a639d386a0a260c441706e69e36cf7d5e7
5
5
  SHA512:
6
- metadata.gz: 515d3a9671a27d6c3e8baa506a93cac76dc273410cfb97002d87939c73ff9aad8b3a4f655471b0ea90ad98ef0a2389b797341452be08977ecc1e93c528479ca1
7
- data.tar.gz: '0628095ce93b73d6541248886d9cd7a8d30f6e5587623be43c1c62855876b451a64fe643b634845e6fad489ab533f8b0dd2a3ad6107343fbd988dcbd3f1e587a'
6
+ metadata.gz: 8f52cdec93ad99933c4a940d64e10c9912ec2d9f9a3f25a39fa0a3d9b56ab770957204752dc68a1aed1938dc4b9968158968ac74bf35a7ccaf64e2b8e9664d0c
7
+ data.tar.gz: 7c116ec7dbb9a4193cccfa1649163c37020ea7a13a71414f15989a8ea71589739651bd08ee55c5a9f60b5b4341bf32666fc21a806b5aee9a28622db871ade35d
@@ -0,0 +1,27 @@
1
+ # .github/workflows/release.yml
2
+
3
+ name: Release
4
+
5
+ on:
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ release:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v2
13
+ - uses: ruby/setup-ruby@v1
14
+ with:
15
+ ruby-version: 3.0.0
16
+ - run: bundle install
17
+ - name: publish gem
18
+ run: |
19
+ mkdir -p $HOME/.gem
20
+ touch $HOME/.gem/credentials
21
+ chmod 0600 $HOME/.gem/credentials
22
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
23
+ gem build *.gemspec
24
+ gem push *.gem
25
+ env:
26
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
27
+
@@ -0,0 +1,28 @@
1
+ name: Test & Lint
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+
11
+ runs-on: ubuntu-latest
12
+
13
+ strategy:
14
+ matrix:
15
+ ruby-version: ['3.1', '3.0', '2.7']
16
+
17
+ steps:
18
+ - uses: actions/checkout@v3
19
+ - name: Set up Ruby
20
+ uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108
21
+ with:
22
+ ruby-version: ${{ matrix.ruby-version }}
23
+ - name: Install dependencies
24
+ run: bundle install
25
+ - name: Rubocop
26
+ run: rubocop
27
+ - name: Run tests
28
+ run: bundle exec rake
data/.rubocop.yml ADDED
@@ -0,0 +1,137 @@
1
+ require: rubocop-rspec
2
+
3
+ AllCops:
4
+ NewCops: enable
5
+ SuggestExtensions: false
6
+ TargetRubyVersion: 3.1
7
+ Include:
8
+ - 'lib/**/*.rb'
9
+ - 'spec/**/*.rb'
10
+ - '**/Gemfile'
11
+ - '**/Rakefile'
12
+ Exclude:
13
+ - 'bin/**/*'
14
+ - 'spec/fixtures/**/*.rb'
15
+
16
+ Style/HashSyntax:
17
+ EnforcedShorthandSyntax: never
18
+
19
+ Style/Documentation:
20
+ Enabled: false
21
+
22
+ Naming/BlockForwarding:
23
+ Enabled: false
24
+
25
+ Style/RedundantSelf:
26
+ Enabled: false
27
+
28
+ Style/RedundantReturn:
29
+ Enabled: false
30
+
31
+ Style/GuardClause:
32
+ Enabled: false
33
+
34
+ Style/ClassAndModuleChildren:
35
+ Enabled: false
36
+
37
+ Layout/EmptyLinesAroundClassBody:
38
+ Enabled: false
39
+
40
+ Style/FrozenStringLiteralComment:
41
+ Enabled: false
42
+
43
+ Layout/CommentIndentation:
44
+ Enabled: false
45
+
46
+ Layout/LineLength:
47
+ Max: 120
48
+
49
+ Metrics/ClassLength:
50
+ Max: 120
51
+
52
+ Metrics/CyclomaticComplexity:
53
+ Max: 10
54
+
55
+ Metrics/MethodLength:
56
+ Max: 15
57
+
58
+ Metrics/AbcSize:
59
+ Max: 25
60
+
61
+ Metrics/ParameterLists:
62
+ Max: 8
63
+
64
+ Layout/EmptyLineBetweenDefs:
65
+ AllowAdjacentOneLineDefs: true
66
+
67
+ Naming/MethodParameterName:
68
+ AllowedNames:
69
+ - _
70
+
71
+ RSpec/ExampleLength:
72
+ Enabled: false
73
+
74
+ RSpec/MultipleExpectations:
75
+ Enabled: false
76
+
77
+ RSpec/MultipleMemoizedHelpers:
78
+ Enabled: false
79
+
80
+ RSpec/NestedGroups:
81
+ Enabled: false
82
+
83
+ RSpec/MessageSpies:
84
+ Enabled: false
85
+
86
+ RSpec/InstanceVariable:
87
+ Enabled: false
88
+
89
+ RSpec/BeforeAfterAll:
90
+ Enabled: false
91
+
92
+ RSpec/AnyInstance:
93
+ Enabled: false
94
+
95
+ RSpec/ContextWording:
96
+ Enabled: false
97
+
98
+ RSpec/FilePath:
99
+ Enabled: false
100
+
101
+ RSpec/NamedSubject:
102
+ Enabled: false
103
+
104
+ RSpec/StubbedMock:
105
+ Enabled: false
106
+
107
+ RSpec/LetSetup:
108
+ Enabled: false
109
+
110
+ RSpec/MessageChain:
111
+ Enabled: false
112
+
113
+ RSpec/RepeatedDescription:
114
+ Enabled: false
115
+
116
+ RSpec/RepeatedExample:
117
+ Enabled: false
118
+
119
+ RSpec/ScatteredSetup:
120
+ Enabled: false
121
+
122
+ RSpec/UnspecifiedException:
123
+ Enabled: false
124
+
125
+ RSpec/VerifiedDoubles:
126
+ Enabled: false
127
+
128
+ RSpec/ExpectInHook:
129
+ Enabled: false
130
+
131
+ Style/ClassVars:
132
+ Exclude:
133
+ - 'lib/slayer/service.rb'
134
+
135
+ Style/MutableConstant:
136
+ Exclude:
137
+ - 'lib/slayer/version.rb'
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
data/Gemfile.lock CHANGED
@@ -1,38 +1,63 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- papers_please (0.1.4)
4
+ papers_please (0.1.5)
5
5
  terminal-table
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- byebug (10.0.2)
11
- diff-lcs (1.3)
12
- docile (1.3.1)
13
- json (2.1.0)
14
- rake (10.5.0)
15
- rspec (3.7.0)
16
- rspec-core (~> 3.7.0)
17
- rspec-expectations (~> 3.7.0)
18
- rspec-mocks (~> 3.7.0)
19
- rspec-core (3.7.1)
20
- rspec-support (~> 3.7.0)
21
- rspec-expectations (3.7.0)
10
+ ast (2.4.2)
11
+ byebug (11.1.3)
12
+ diff-lcs (1.5.0)
13
+ docile (1.4.0)
14
+ json (2.6.3)
15
+ parallel (1.23.0)
16
+ parser (3.2.2.3)
17
+ ast (~> 2.4.1)
18
+ racc
19
+ racc (1.7.1)
20
+ rainbow (3.1.1)
21
+ rake (13.0.6)
22
+ regexp_parser (2.8.1)
23
+ rexml (3.2.5)
24
+ rspec (3.12.0)
25
+ rspec-core (~> 3.12.0)
26
+ rspec-expectations (~> 3.12.0)
27
+ rspec-mocks (~> 3.12.0)
28
+ rspec-core (3.12.2)
29
+ rspec-support (~> 3.12.0)
30
+ rspec-expectations (3.12.3)
22
31
  diff-lcs (>= 1.2.0, < 2.0)
23
- rspec-support (~> 3.7.0)
24
- rspec-mocks (3.7.0)
32
+ rspec-support (~> 3.12.0)
33
+ rspec-mocks (3.12.5)
25
34
  diff-lcs (>= 1.2.0, < 2.0)
26
- rspec-support (~> 3.7.0)
27
- rspec-support (3.7.1)
28
- simplecov (0.16.1)
35
+ rspec-support (~> 3.12.0)
36
+ rspec-support (3.12.1)
37
+ rubocop (1.38.0)
38
+ json (~> 2.3)
39
+ parallel (~> 1.10)
40
+ parser (>= 3.1.2.1)
41
+ rainbow (>= 2.2.2, < 4.0)
42
+ regexp_parser (>= 1.8, < 3.0)
43
+ rexml (>= 3.2.5, < 4.0)
44
+ rubocop-ast (>= 1.23.0, < 2.0)
45
+ ruby-progressbar (~> 1.7)
46
+ unicode-display_width (>= 1.4.0, < 3.0)
47
+ rubocop-ast (1.29.0)
48
+ parser (>= 3.2.1.0)
49
+ rubocop-rspec (2.17.1)
50
+ rubocop (~> 1.33)
51
+ ruby-progressbar (1.13.0)
52
+ simplecov (0.22.0)
29
53
  docile (~> 1.1)
30
- json (>= 1.8, < 3)
31
- simplecov-html (~> 0.10.0)
32
- simplecov-html (0.10.2)
33
- terminal-table (1.8.0)
34
- unicode-display_width (~> 1.1, >= 1.1.1)
35
- unicode-display_width (1.4.0)
54
+ simplecov-html (~> 0.11)
55
+ simplecov_json_formatter (~> 0.1)
56
+ simplecov-html (0.12.3)
57
+ simplecov_json_formatter (0.1.4)
58
+ terminal-table (3.0.2)
59
+ unicode-display_width (>= 1.1.1, < 3)
60
+ unicode-display_width (2.4.2)
36
61
 
37
62
  PLATFORMS
38
63
  ruby
@@ -41,9 +66,11 @@ DEPENDENCIES
41
66
  bundler (~> 2.0)
42
67
  byebug
43
68
  papers_please!
44
- rake (~> 10.0)
45
- rspec (~> 3.0)
69
+ rake (~> 13.0)
70
+ rspec (~> 3.12)
71
+ rubocop (= 1.38.0)
72
+ rubocop-rspec
46
73
  simplecov
47
74
 
48
75
  BUNDLED WITH
49
- 2.0.1
76
+ 2.3.9
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'papers_please'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PapersPlease
2
4
  class Error < StandardError; end
3
5
 
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PapersPlease
2
4
  class Permission
3
- attr_accessor :key, :subject, :query, :predicate, :granted_by, :granting_class
5
+ attr_accessor :key, :subject
6
+ attr_reader :query, :predicate, :granted_by, :granting_class
4
7
 
5
8
  def initialize(key, subject, query: nil, predicate: nil, granted_by: nil, granting_class: nil)
6
9
  self.key = key
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PapersPlease
2
4
  class Policy
3
5
  attr_accessor :roles
4
- attr_reader :user
6
+
7
+ attr_reader :fallthrough, :user
5
8
 
6
9
  def initialize(user)
7
10
  @user = user
@@ -11,16 +14,20 @@ module PapersPlease
11
14
  configure
12
15
  end
13
16
 
17
+ def allow_fallthrough
18
+ @fallthrough = true
19
+ end
20
+
14
21
  def configure
15
22
  raise NotImplementedError, 'The #configure method of the access policy was not implemented'
16
23
  end
17
24
 
18
25
  # Add a role to the Policy
19
- def add_role(name, predicate = nil, &block)
26
+ def add_role(name, predicate = nil)
20
27
  name = name.to_sym
21
28
  raise DuplicateRole if roles.key?(name)
22
29
 
23
- role = Role.new(name, predicate: predicate, definition: block)
30
+ role = Role.new(name, predicate: predicate)
24
31
  roles[name] = role
25
32
 
26
33
  role
@@ -41,22 +48,19 @@ module PapersPlease
41
48
 
42
49
  # Look up a stored permission block and call with
43
50
  # the current user and subject
44
- def can?(action, subject = nil)
45
- applicable_roles.each do |_, role|
46
- permission = role.find_permission(action, subject)
51
+ def can?(action, subject = nil, roles: nil)
52
+ roles_to_check(roles: roles).each do |_, role|
53
+ permission = role&.find_permission(action, subject)
47
54
  next if permission.nil?
48
55
 
49
56
  # Proxy permission check if granted by other
50
- if permission.granted_by_other?
51
- # Get proxied subject
52
- subject = subject.is_a?(Class) ? permission.granting_class : permission.granted_by.call(user, subject)
53
-
54
- # Get proxied permission
55
- permission = role.find_permission(action, subject)
56
- end
57
+ subject, permission = get_proxied_permission(permission, action, subject, role) if permission.granted_by_other?
57
58
 
58
59
  # Check permission
59
- return permission.granted?(user, subject, action) unless permission.nil?
60
+ granted = permission_granted?(permission, action, subject)
61
+ next if granted.nil? || (granted == false && fallthrough)
62
+
63
+ return granted
60
64
  end
61
65
 
62
66
  false
@@ -72,12 +76,28 @@ module PapersPlease
72
76
  subject
73
77
  end
74
78
 
79
+ def get_applicable_roles_by_keys(keys)
80
+ applicable_roles.slice(*Array(keys))
81
+ end
82
+
83
+ def roles_that_can(action, subject)
84
+ applicable_roles.reject do |_, role|
85
+ role.find_permission(action, subject).nil?
86
+ end.keys
87
+ end
88
+
75
89
  # Look up a stored scope block and call with the
76
90
  # current user and class
77
- def scope_for(action, klass)
78
- applicable_roles.each do |_, role|
91
+ def scope_for(action, klass, roles: nil)
92
+ roles_to_check(roles: roles).each do |_, role|
93
+ next if role.nil?
94
+
79
95
  permission = role.find_permission(action, klass)
80
- return permission.fetch(user, klass, action) unless permission.nil?
96
+ scope = permission&.fetch(user, klass, action)
97
+
98
+ next if permission.nil? || (scope.nil? && fallthrough)
99
+
100
+ return scope
81
101
  end
82
102
 
83
103
  nil
@@ -90,5 +110,29 @@ module PapersPlease
90
110
  role.applies_to?(user)
91
111
  end
92
112
  end
113
+
114
+ private
115
+
116
+ def roles_to_check(roles: nil)
117
+ roles.nil? ? applicable_roles : get_applicable_roles_by_keys(roles)
118
+ end
119
+
120
+ def permission_granted?(permission, action, subject)
121
+ if fallthrough
122
+ permission.nil? ? false : permission.granted?(user, subject, action)
123
+ else
124
+ permission.nil? ? nil : permission.granted?(user, subject, action)
125
+ end
126
+ end
127
+
128
+ def get_proxied_permission(permission, action, subject, role)
129
+ # Get proxied subject
130
+ subject = subject.is_a?(Class) ? permission.granting_class : permission.granted_by.call(user, subject)
131
+
132
+ # Get proxied permission
133
+ permission = role.find_permission(action, subject)
134
+
135
+ [subject, permission]
136
+ end
93
137
  end
94
138
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PapersPlease
2
4
  module Rails
3
5
  module ControllerMethods
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/railtie'
2
4
 
3
5
  module PapersPlease
@@ -2,7 +2,7 @@ module PapersPlease
2
2
  class Role
3
3
  attr_reader :name, :predicate, :permissions
4
4
 
5
- def initialize(name, predicate: nil, definition: nil)
5
+ def initialize(name, predicate: nil)
6
6
  @name = name
7
7
  @predicate = predicate
8
8
  @permissions = []
@@ -17,48 +17,20 @@ module PapersPlease
17
17
  def add_permission(actions, klass, query: nil, predicate: nil, granted_by: nil)
18
18
  prepare_actions(actions).each do |action|
19
19
  raise DuplicatePermission if permission_exists?(action, klass)
20
- raise InvalidGrant, 'granted_by must be an array of [Class, Proc]' if !granted_by.nil? && !valid_grant?(granted_by)
21
20
 
22
- has_query = query.is_a?(Proc)
23
- has_predicate = predicate.is_a?(Proc)
24
- permission = Permission.new(action, klass)
25
-
26
- if granted_by
27
- permission.granting_class = granted_by[0]
28
- permission.granted_by = granted_by[1]
29
- end
30
-
31
- if has_query && has_predicate
32
- # Both query & predicate provided
33
-
34
- permission.query = query
35
- permission.predicate = predicate
36
- elsif has_query && !has_predicate
37
- # Only query provided
38
- permission.query = query
39
-
40
- if action == :create && actions == :manage
41
- # If the action is :create, expanded from :manage
42
- # then we set the default all predicate
43
- permission.predicate = (proc { true })
44
- else
45
- # Otherwise the default predicate is to check
46
- # for inclusion in the returned relationship
47
- permission.predicate = (proc { |user, obj|
48
- res = query.call(user, klass, action)
49
- res.respond_to?(:include?) && res.include?(obj)
50
- })
51
- end
52
- elsif !has_query && has_predicate
53
- # Only predicate provided
54
- permission.predicate = predicate
55
- else
56
- # Neither provided
57
- permission.query = (proc { klass.all })
58
- permission.predicate = (proc { true })
21
+ if !granted_by.nil? && !valid_grant?(granted_by)
22
+ raise InvalidGrant,
23
+ 'granted_by must be an array of [Class, Proc]'
59
24
  end
60
25
 
61
- permissions << permission
26
+ permissions << make_permission(
27
+ action,
28
+ actions,
29
+ klass,
30
+ query: query,
31
+ predicate: predicate,
32
+ granted_by: granted_by
33
+ )
62
34
  end
63
35
  end
64
36
  alias grant add_permission
@@ -90,5 +62,57 @@ module PapersPlease
90
62
  a == :manage ? %i[create read update destroy] : [a]
91
63
  end
92
64
  end
65
+
66
+ # rubocop:disable Metrics/MethodLength
67
+ def make_permission(action, actions, klass, query: nil, predicate: nil, granted_by: nil)
68
+ has_query = query.is_a?(Proc)
69
+ has_predicate = predicate.is_a?(Proc)
70
+ permission = make_base_permission(action, klass, granted_by: granted_by)
71
+
72
+ if has_query && has_predicate
73
+ # Both query & predicate provided
74
+ permission.query = query
75
+ permission.predicate = predicate
76
+ elsif has_query && !has_predicate
77
+ # Only query provided
78
+ permission.query = query
79
+ permission.predicate = build_predicate_from_query(action, actions, klass, query)
80
+ elsif !has_query && has_predicate
81
+ # Only predicate provided
82
+ permission.predicate = predicate
83
+ else
84
+ # Neither provided
85
+ permission.query = (proc { klass.all })
86
+ permission.predicate = (proc { true })
87
+ end
88
+
89
+ permission
90
+ end
91
+
92
+ # rubocop:enable Metrics/MethodLength
93
+
94
+ def make_base_permission(action, klass, granted_by: nil)
95
+ permission = Permission.new(action, klass)
96
+
97
+ if granted_by
98
+ permission.granting_class = granted_by[0]
99
+ permission.granted_by = granted_by[1]
100
+ end
101
+
102
+ permission
103
+ end
104
+
105
+ def build_predicate_from_query(action, actions, klass, query)
106
+ # If the action is :create, expanded from :manage
107
+ # then we set the default all predicate
108
+ return (proc { true }) if action == :create && actions == :manage
109
+
110
+ # Otherwise the default predicate is to check
111
+ # for inclusion in the returned relationship
112
+ proc do |user, obj|
113
+ res = query.call(user, klass, action)
114
+ res.respond_to?(:include?) && res.include?(obj)
115
+ end
116
+ end
93
117
  end
94
118
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  namespace :papers_please do
2
4
  desc 'Print out all defined roles and permissions in match order'
3
- task :roles, [:klass] => :environment do |_, args|
5
+ task :roles, [:klass] => :environment do |_, _args|
4
6
  klass = klass ? Object.const_get(klass) : AccessPolicy
5
7
 
6
8
  puts "Generating Role/Permission Table for #{klass}...\n\n"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PapersPlease
2
- VERSION = '0.1.4'.freeze
4
+ VERSION = '0.1.5'
3
5
  end
data/lib/papers_please.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'papers_please/version'
2
4
  require 'papers_please/errors'
3
5
  require 'papers_please/policy'
@@ -7,6 +9,7 @@ require 'papers_please/rails/controller_methods'
7
9
  require 'papers_please/railtie' if defined? Rails
8
10
 
9
11
  module PapersPlease
12
+ # rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength
10
13
  def self.permissions_table(policy_klass)
11
14
  require 'terminal-table'
12
15
 
@@ -34,7 +37,7 @@ module PapersPlease
34
37
  permission.key,
35
38
  permission.query ? 'yes' : 'no',
36
39
  permission.predicate ? 'yes' : 'no',
37
- permission.granted_by_other? ? 'yes' : 'no',
40
+ permission.granted_by_other? ? 'yes' : 'no'
38
41
  ]
39
42
 
40
43
  first_line_of_role = false
@@ -42,6 +45,10 @@ module PapersPlease
42
45
  end
43
46
  end
44
47
  end
45
- puts table
48
+
49
+ puts table.to_s
50
+
51
+ table.to_s
46
52
  end
53
+ # rubocop:enable Metrics/PerceivedComplexity, Metrics/MethodLength
47
54
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'papers_please/version'
@@ -24,7 +26,9 @@ Gem::Specification.new do |spec|
24
26
 
25
27
  spec.add_development_dependency 'bundler', '~> 2.0'
26
28
  spec.add_development_dependency 'byebug'
27
- spec.add_development_dependency 'rake', '~> 10.0'
28
- spec.add_development_dependency 'rspec', '~> 3.0'
29
+ spec.add_development_dependency 'rake', '~> 13.0'
30
+ spec.add_development_dependency 'rspec', '~> 3.12'
31
+ spec.add_development_dependency 'rubocop', '= 1.38.0'
32
+ spec.add_development_dependency 'rubocop-rspec'
29
33
  spec.add_development_dependency 'simplecov'
30
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: papers_please
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Apsis Labs
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-05-07 00:00:00.000000000 Z
11
+ date: 2023-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: terminal-table
@@ -58,28 +58,56 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: '13.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
68
+ version: '13.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.0'
75
+ version: '3.12'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '3.0'
82
+ version: '3.12'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 1.38.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.38.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: simplecov
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -101,8 +129,11 @@ executables: []
101
129
  extensions: []
102
130
  extra_rdoc_files: []
103
131
  files:
132
+ - ".github/workflows/release.yml"
133
+ - ".github/workflows/test.yml"
104
134
  - ".gitignore"
105
135
  - ".rspec"
136
+ - ".rubocop.yml"
106
137
  - ".travis.yml"
107
138
  - Gemfile
108
139
  - Gemfile.lock
@@ -140,8 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
171
  - !ruby/object:Gem::Version
141
172
  version: '0'
142
173
  requirements: []
143
- rubyforge_project:
144
- rubygems_version: 2.6.13
174
+ rubygems_version: 3.2.3
145
175
  signing_key:
146
176
  specification_version: 4
147
177
  summary: A roles & permissions gem for ruby applications.