resource_allow_header 0.2.0 → 0.3.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 +4 -4
- data/.idea/.rakeTasks +7 -0
- data/.idea/resource_allow_header.iml +20 -2
- data/.idea/runConfigurations/test.xml +20 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +1 -1
- data/README.md +106 -72
- data/lib/resource_allow_header.rb +28 -18
- data/lib/resource_allow_header/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6042652fa336298bc96029b0df1bc7d05d56cec1bf1c8a0e089dc67b421e645
|
4
|
+
data.tar.gz: 91232dafecf7868df240c67d70605473bd7c0d2bb79e76a7999ee2eace780364
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f57b4640784af39c27a9472611a64a83ac8eb62c4079d853c19f918146f45212b9c76ce987dc6af9a44e08cb8d8a540836f8ba8fb0cb2121965633965660f91
|
7
|
+
data.tar.gz: 02efeae0231548af6312a12fe46e807e21f2fd556bcc253ef111ed450dc814c2ba90c8cb668f6d62ad9e79a5b70945fa9c046bc0d27850b07acf5ed3b8c2cd2d
|
data/.idea/.rakeTasks
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<Settings><!--This file was automatically generated by Ruby plugin.
|
3
|
+
You are allowed to:
|
4
|
+
1. Remove rake task
|
5
|
+
2. Add existing rake tasks
|
6
|
+
To add existing rake tasks automatically delete this file and reload the project.
|
7
|
+
--><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build resource_allow_header-0.2.0.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Build and install resource_allow_header-0.2.0.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install resource_allow_header-0.2.0.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeTask description="Create tag v0.2.0 and build and push resource_allow_header-0.2.0.gem to rubygems.org" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Run tests" fullCmd="test" taksId="test" /><RakeTask description="" fullCmd="default" taksId="default" /><RakeTask description="" fullCmd="release" taksId="release" /><RakeGroup description="" fullCmd="" taksId="release"><RakeTask description="" fullCmd="release:guard_clean" taksId="guard_clean" /><RakeTask description="" fullCmd="release:rubygem_push" taksId="rubygem_push" /><RakeTask description="" fullCmd="release:source_control_push" taksId="source_control_push" /></RakeGroup></RakeGroup></Settings>
|
@@ -1,7 +1,26 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<module type="RUBY_MODULE" version="4">
|
3
3
|
<component name="ModuleRunConfigurationManager">
|
4
|
-
<shared
|
4
|
+
<shared>
|
5
|
+
<configuration default="false" name="test" type="RakeRunConfigurationType" factoryName="Rake">
|
6
|
+
<module name="resource_allow_header" />
|
7
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="" />
|
8
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="$MODULE_DIR$" />
|
9
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
|
10
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
|
11
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
|
12
|
+
<EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="true" />
|
13
|
+
<EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
|
14
|
+
<EXTENSION ID="RubyCoverageRunConfigurationExtension" track_test_folders="true" runner="rcov" />
|
15
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_NAME" VALUE="test" />
|
16
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_ARGS" VALUE="" />
|
17
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_ATTACHED_TEST_FRAMEWORKS" VALUE=":test_unit " />
|
18
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_OPTION_TRACE" VALUE="false" />
|
19
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_OPTION_DRYRUN" VALUE="false" />
|
20
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_OPTION_PREREQS" VALUE="false" />
|
21
|
+
<method v="2" />
|
22
|
+
</configuration>
|
23
|
+
</shared>
|
5
24
|
</component>
|
6
25
|
<component name="NewModuleRootManager">
|
7
26
|
<content url="file://$MODULE_DIR$" />
|
@@ -15,7 +34,6 @@
|
|
15
34
|
<orderEntry type="library" scope="PROVIDED" name="concurrent-ruby (v1.1.4, ruby-2.5.3-p105) [gem]" level="application" />
|
16
35
|
<orderEntry type="library" scope="PROVIDED" name="i18n (v1.5.3, ruby-2.5.3-p105) [gem]" level="application" />
|
17
36
|
<orderEntry type="library" scope="PROVIDED" name="minitest (v5.11.3, ruby-2.5.3-p105) [gem]" level="application" />
|
18
|
-
<orderEntry type="library" scope="PROVIDED" name="rack (v2.0.6, ruby-2.5.3-p105) [gem]" level="application" />
|
19
37
|
<orderEntry type="library" scope="PROVIDED" name="rake (v10.5.0, ruby-2.5.3-p105) [gem]" level="application" />
|
20
38
|
<orderEntry type="library" scope="PROVIDED" name="thread_safe (v0.3.6, ruby-2.5.3-p105) [gem]" level="application" />
|
21
39
|
<orderEntry type="library" scope="PROVIDED" name="tzinfo (v1.2.5, ruby-2.5.3-p105) [gem]" level="application" />
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<component name="ProjectRunConfigurationManager">
|
2
|
+
<configuration default="false" name="test" type="RakeRunConfigurationType" factoryName="Rake">
|
3
|
+
<module name="resource_allow_header" />
|
4
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="" />
|
5
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="$MODULE_DIR$" />
|
6
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
|
7
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
|
8
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
|
9
|
+
<EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="true" />
|
10
|
+
<EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
|
11
|
+
<EXTENSION ID="RubyCoverageRunConfigurationExtension" track_test_folders="true" runner="rcov" />
|
12
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_NAME" VALUE="test" />
|
13
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_ARGS" VALUE="" />
|
14
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_ATTACHED_TEST_FRAMEWORKS" VALUE=":test_unit " />
|
15
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_OPTION_TRACE" VALUE="false" />
|
16
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_OPTION_DRYRUN" VALUE="false" />
|
17
|
+
<RAKE_RUN_CONFIG_SETTINGS_ID NAME="RAKE_TASK_OPTION_PREREQS" VALUE="false" />
|
18
|
+
<method v="2" />
|
19
|
+
</configuration>
|
20
|
+
</component>
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.3.0
|
4
|
+
|
5
|
+
- Add tests
|
6
|
+
- Change configuration to return self if not block was given
|
7
|
+
- Change configuration to execute in context of self
|
8
|
+
- Change `*_proc` to execute in context of self
|
9
|
+
|
3
10
|
## 0.2.0
|
4
11
|
|
5
12
|
- Add configuration via `ResourceAllowHeader.configure`
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,72 +1,106 @@
|
|
1
|
-
# Resource Allow Header
|
2
|
-
|
3
|
-
[](https://travis-ci.com/XPBytes/resource_allow_header)
|
4
|
-
[](https://badge.fury.io/rb/resource_allow_header)
|
5
|
-
[](http://opensource.org/licenses/MIT)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
## Installation
|
10
|
-
|
11
|
-
Add this line to your application's Gemfile:
|
12
|
-
|
13
|
-
```ruby
|
14
|
-
gem 'resource_allow_header'
|
15
|
-
```
|
16
|
-
|
17
|
-
And then execute:
|
18
|
-
|
19
|
-
$ bundle
|
20
|
-
|
21
|
-
Or install it yourself as:
|
22
|
-
|
23
|
-
$ gem install resource_allow_header
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
1
|
+
# Resource Allow Header
|
2
|
+
|
3
|
+
[](https://travis-ci.com/XPBytes/resource_allow_header)
|
4
|
+
[](https://badge.fury.io/rb/resource_allow_header)
|
5
|
+
[](http://opensource.org/licenses/MIT)
|
6
|
+
|
7
|
+
Allow Header for Rack responses using CanCan(Can) or any other authorization framework
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'resource_allow_header'
|
15
|
+
```
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install resource_allow_header
|
24
|
+
|
25
|
+
This relies on `before_action` and `after_action` to exist, which is normally the case for any controller using
|
26
|
+
`AbstractController` in their chain. `Metal` controllers might need to include `Metal::Callbacks`.
|
27
|
+
|
28
|
+
## Usage
|
29
|
+
|
30
|
+
In your controller use the `allow` class method to determine the value of the `Allow` header:
|
31
|
+
```ruby
|
32
|
+
require 'resource_allow_header'
|
33
|
+
|
34
|
+
class ApiController < ActionController::API
|
35
|
+
include ResourceAllowHeader
|
36
|
+
end
|
37
|
+
|
38
|
+
class BookController < ApiController
|
39
|
+
allow('HEAD', only: %i[show]) { @book }
|
40
|
+
allow('GET', only: %i[show]) { @book }
|
41
|
+
allow('POST', only: %i[create]) { Current.author.books.build }
|
42
|
+
end
|
43
|
+
```
|
44
|
+
|
45
|
+
The allow method expects:
|
46
|
+
- `http_method`: One of `HEAD`, `GET`, `POST`, `PUT`, `PATCH`, `DELETE`.
|
47
|
+
- `ability_action` (optional): Automatically mapped from HTTP method and passed to `can?`
|
48
|
+
- `**options`: passed to `before_action` (so only set these values on show: `only: :show`)
|
49
|
+
- `&block`: the block that resolved the resource
|
50
|
+
|
51
|
+
If no block has been given, the `@allow_resource` instance variable is used, or the `@resource` variable.
|
52
|
+
|
53
|
+
The allow header is set as `after_action` callback, which allows your entire request to determine or set the
|
54
|
+
values you'll be returning in the `&block` passed to `allow`. In other words: these blocks are lazy and
|
55
|
+
executed in the context of your controller _instance_.
|
56
|
+
|
57
|
+
### Sane defaults
|
58
|
+
|
59
|
+
If your API is conforming to REST, you'll usually have the following:
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
allow('HEAD') { @your_resource }
|
63
|
+
allow('GET') { @your_resource }
|
64
|
+
allow('POST', only: %i[create index]) { YourResource.new(authorized_context) }
|
65
|
+
allow('PUT', only: %i[show update]) { @your_resource }
|
66
|
+
allow('DESTROY', only: %i[show update]) { @your_resource }
|
67
|
+
```
|
68
|
+
|
69
|
+
This is the case because:
|
70
|
+
- Your `index` path (collection) is the same as your `create` path
|
71
|
+
- Your `show` path (resource) is the same as your `update` and `delete` path
|
72
|
+
- You can call `HEAD` both on the collection (`index`) and resource (`show`)
|
73
|
+
- You can call `GET` on both the collection (`index`) and resource (`show`)
|
74
|
+
- You can call `POST` only on the collection (`index`) path
|
75
|
+
- You can call `PUT` and `DESTROY` only on the resource (`show`) path
|
76
|
+
|
77
|
+
If
|
78
|
+
|
79
|
+
### Configuration
|
80
|
+
|
81
|
+
In an initializer you can set procs in order to change the default behaviour:
|
82
|
+
|
83
|
+
```ruby
|
84
|
+
ResourceAllowHeader.configure do
|
85
|
+
self.implicit_resource_proc = proc { |controller| controller.resource }
|
86
|
+
self.can_proc = proc { |action, resource, controller| action == :whatever || controller.can?(action, resource) }
|
87
|
+
end
|
88
|
+
```
|
89
|
+
|
90
|
+
## Related
|
91
|
+
|
92
|
+
- [`AuthorizedTransaction`](https://github.com/XPBytes/authorized_transaction): :closed_lock_with_key: Authorize an
|
93
|
+
activerecord transaction (or any other transaction) with cancan(can) or any other authorization framework
|
94
|
+
|
95
|
+
## Development
|
96
|
+
|
97
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can
|
98
|
+
also run `bin/console` for an interactive prompt that will allow you to experiment.
|
99
|
+
|
100
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the
|
101
|
+
version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version,
|
102
|
+
push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
103
|
+
|
104
|
+
## Contributing
|
105
|
+
|
106
|
+
Bug reports and pull requests are welcome on GitHub at [XPBytes/resource_allow_header](https://github.com/XPBytes/resource_allow_header).
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "resource_allow_header/version"
|
2
|
+
|
2
3
|
require 'active_support/concern'
|
3
4
|
require 'active_support/core_ext/module/attribute_accessors'
|
4
5
|
|
@@ -12,12 +13,12 @@ module ResourceAllowHeader
|
|
12
13
|
|
13
14
|
mattr_accessor :implicit_resource_proc, :can_proc
|
14
15
|
|
15
|
-
def self.configure
|
16
|
-
|
16
|
+
def self.configure(&block)
|
17
|
+
block_given? ? instance_exec(self, &block) : self
|
17
18
|
end
|
18
19
|
|
19
20
|
included do
|
20
|
-
attr_accessor :
|
21
|
+
attr_accessor :current_action_lazy_allows
|
21
22
|
after_action :set_allow_header
|
22
23
|
|
23
24
|
def set_allow_header
|
@@ -25,7 +26,7 @@ module ResourceAllowHeader
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def compute_allow_header(resource: implicit_resource)
|
28
|
-
Hash(
|
29
|
+
Hash(current_action_lazy_allows).each_with_object([]) do |(method, allow), result|
|
29
30
|
allowable_resource = allow[:resource]&.call || resource
|
30
31
|
next unless allow?(allow[:action], allowable_resource)
|
31
32
|
result << method
|
@@ -36,18 +37,21 @@ module ResourceAllowHeader
|
|
36
37
|
class_methods do
|
37
38
|
# noinspection RubyStringKeysInHashInspection
|
38
39
|
HTTP_ABILITY_METHOD_MAP = {
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
40
|
+
'HEAD' => :show,
|
41
|
+
'GET' => :show,
|
42
|
+
'POST' => :create,
|
43
|
+
'PUT' => :update,
|
44
|
+
'PATCH' => :update,
|
45
|
+
'DELETE' => :destroy
|
45
46
|
}.freeze
|
46
47
|
|
47
48
|
def allow(http_method, ability_action = map_http_method_to_ability_action(http_method), **options, &block)
|
48
49
|
before_action(**options) do
|
49
50
|
allow_resource = block_given? && proc { instance_exec(&block) } || nil
|
50
|
-
|
51
|
+
|
52
|
+
self.current_action_lazy_allows = Hash(current_action_lazy_allows).merge(
|
53
|
+
http_method => { resource: allow_resource, action: ability_action }
|
54
|
+
)
|
51
55
|
end
|
52
56
|
end
|
53
57
|
|
@@ -56,17 +60,23 @@ module ResourceAllowHeader
|
|
56
60
|
end
|
57
61
|
end
|
58
62
|
|
59
|
-
|
60
|
-
|
61
|
-
def implicit_resource
|
62
|
-
implicit_resource_proc&.call(self) || @allow_resource || @resource
|
63
|
-
end
|
63
|
+
protected
|
64
64
|
|
65
65
|
def allow?(action, resource)
|
66
66
|
if can_proc.respond_to?(:call)
|
67
|
-
return
|
67
|
+
return instance_exec(action, resource, self, &can_proc)
|
68
|
+
end
|
69
|
+
|
70
|
+
can?(action, resource)
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def implicit_resource
|
76
|
+
if implicit_resource_proc.respond_to?(:call)
|
77
|
+
return instance_exec(self, &implicit_resource_proc)
|
68
78
|
end
|
69
79
|
|
70
|
-
|
80
|
+
@allow_resource || @resource
|
71
81
|
end
|
72
82
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resource_allow_header
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Derk-Jan Karrenbeld
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -88,10 +88,12 @@ extensions: []
|
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
90
|
- ".gitignore"
|
91
|
+
- ".idea/.rakeTasks"
|
91
92
|
- ".idea/inspectionProfiles/Project_Default.xml"
|
92
93
|
- ".idea/misc.xml"
|
93
94
|
- ".idea/modules.xml"
|
94
95
|
- ".idea/resource_allow_header.iml"
|
96
|
+
- ".idea/runConfigurations/test.xml"
|
95
97
|
- ".idea/vcs.xml"
|
96
98
|
- ".travis.yml"
|
97
99
|
- CHANGELOG.md
|