resourcerer 1.0.0 → 2.0.3
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/README.md +191 -180
- data/lib/resourcerer.rb +12 -3
- data/lib/resourcerer/configuration.rb +166 -0
- data/lib/resourcerer/controller.rb +49 -0
- data/lib/resourcerer/resource.rb +195 -10
- data/lib/resourcerer/version.rb +5 -0
- data/spec/features/guitars_controller_spec.rb +51 -0
- data/spec/resourcerer/controller_spec.rb +394 -0
- data/spec/resourcerer/param_key_spec.rb +48 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/support/rails_app.rb +60 -0
- metadata +99 -29
- data/lib/resourcerer/configuration/strong_parameters.rb +0 -12
- data/lib/resourcerer/inflector.rb +0 -33
- data/lib/resourcerer/resource_configuration.rb +0 -49
- data/lib/resourcerer/resourceable.rb +0 -44
- data/lib/resourcerer/strategies/assign_attributes.rb +0 -34
- data/lib/resourcerer/strategies/assign_from_method.rb +0 -23
- data/lib/resourcerer/strategies/assign_from_params.rb +0 -13
- data/lib/resourcerer/strategies/default_strategy.rb +0 -40
- data/lib/resourcerer/strategies/eager_attributes_strategy.rb +0 -10
- data/lib/resourcerer/strategies/optional_strategy.rb +0 -24
- data/lib/resourcerer/strategies/strong_parameters_strategy.rb +0 -31
- data/lib/resourcerer/strategy.rb +0 -61
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Resourcerer::Controller do
|
4
|
+
module Awesome
|
5
|
+
class Thing; end
|
6
|
+
end
|
7
|
+
|
8
|
+
Given(:controller_klass) { Class.new { include Resourcerer::Controller } }
|
9
|
+
Given(:params) { double('Params', :[] => nil) }
|
10
|
+
Given(:request) { double('Request', get?: false) }
|
11
|
+
Given(:controller) { controller_klass.new }
|
12
|
+
Given(:thing) { double('Awesome::Thing') }
|
13
|
+
|
14
|
+
def controller_thing
|
15
|
+
controller.send(:thing)
|
16
|
+
end
|
17
|
+
|
18
|
+
Given {
|
19
|
+
allow(controller).to receive(:action_name).and_return('edit')
|
20
|
+
allow(controller).to receive(:params).and_return(params)
|
21
|
+
allow(controller).to receive(:request).and_return(request)
|
22
|
+
}
|
23
|
+
|
24
|
+
delegate :resource, :resourcerer_config, to: :controller_klass
|
25
|
+
|
26
|
+
context 'permit' do
|
27
|
+
Given(:attrs) {{ name: 'Max', email: 'max@email.com' }}
|
28
|
+
Given(:fields) { [:name, :email] }
|
29
|
+
|
30
|
+
context 'allows to specify permitted attributes' do
|
31
|
+
Given {
|
32
|
+
require 'active_model'
|
33
|
+
expect(params).to receive(:require).with(:awesome_thing).and_return(params)
|
34
|
+
expect(params).to receive(:permit).with(*fields).and_return(attrs)
|
35
|
+
expect(Awesome::Thing).to receive(:new).with(attrs).and_return(thing)
|
36
|
+
}
|
37
|
+
|
38
|
+
after {
|
39
|
+
ActiveModel.send(:remove_const, 'Name')
|
40
|
+
}
|
41
|
+
|
42
|
+
context 'permit using a proc' do
|
43
|
+
When { resource :thing, model: Awesome::Thing, permit: fields }
|
44
|
+
Then { controller_thing == thing }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require "action_controller"
|
2
|
+
require "rails"
|
3
|
+
|
4
|
+
def request_params(params)
|
5
|
+
{ params: params, **params }
|
6
|
+
end
|
7
|
+
|
8
|
+
module Rails
|
9
|
+
class App
|
10
|
+
def env_config; {} end
|
11
|
+
|
12
|
+
def routes
|
13
|
+
@routes ||= ActionDispatch::Routing::RouteSet.new.tap do |routes|
|
14
|
+
routes.draw do
|
15
|
+
resources :guitars
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.root
|
22
|
+
''
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.application
|
26
|
+
@app ||= App.new
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Guitar
|
31
|
+
attr_accessor :name
|
32
|
+
def initialize(options = {})
|
33
|
+
options.each { |k, v| self.public_send("#{k}=", v) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class ApplicationController < ActionController::Base
|
38
|
+
include Rails.application.routes.url_helpers
|
39
|
+
end
|
40
|
+
|
41
|
+
class GuitarsController < ApplicationController
|
42
|
+
resource :guitar
|
43
|
+
resource(:guitar?, model: Guitar, find: -> (id, model) { !!model.find(id) })
|
44
|
+
resource(:guitars) do
|
45
|
+
build { Guitar.all }
|
46
|
+
end
|
47
|
+
|
48
|
+
# To simplify testing.
|
49
|
+
public :guitars, :guitar, :guitar?
|
50
|
+
|
51
|
+
%i(index show edit new create update).each do |action|
|
52
|
+
define_method action do
|
53
|
+
head :ok
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def guitar_params
|
58
|
+
params.require(:guitar).permit(:name)
|
59
|
+
end
|
60
|
+
end
|
metadata
CHANGED
@@ -1,44 +1,114 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resourcerer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Máximo Mussini
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '4.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activemodel
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
42
|
+
name: coveralls
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- -
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: '0'
|
34
|
-
type: :
|
48
|
+
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- -
|
52
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
|
-
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry-byebug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: railties
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '4.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '4.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec-given
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec-rails
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.0'
|
111
|
+
description: Define resources to automatically find a record and assign its attributes.
|
42
112
|
email:
|
43
113
|
- maximomussini@gmail.com
|
44
114
|
executables: []
|
@@ -48,42 +118,42 @@ extra_rdoc_files:
|
|
48
118
|
files:
|
49
119
|
- README.md
|
50
120
|
- lib/resourcerer.rb
|
51
|
-
- lib/resourcerer/configuration
|
52
|
-
- lib/resourcerer/
|
121
|
+
- lib/resourcerer/configuration.rb
|
122
|
+
- lib/resourcerer/controller.rb
|
53
123
|
- lib/resourcerer/resource.rb
|
54
|
-
- lib/resourcerer/
|
55
|
-
-
|
56
|
-
-
|
57
|
-
-
|
58
|
-
-
|
59
|
-
-
|
60
|
-
- lib/resourcerer/strategies/eager_attributes_strategy.rb
|
61
|
-
- lib/resourcerer/strategies/optional_strategy.rb
|
62
|
-
- lib/resourcerer/strategies/strong_parameters_strategy.rb
|
63
|
-
- lib/resourcerer/strategy.rb
|
124
|
+
- lib/resourcerer/version.rb
|
125
|
+
- spec/features/guitars_controller_spec.rb
|
126
|
+
- spec/resourcerer/controller_spec.rb
|
127
|
+
- spec/resourcerer/param_key_spec.rb
|
128
|
+
- spec/spec_helper.rb
|
129
|
+
- spec/support/rails_app.rb
|
64
130
|
homepage: https://github.com/ElMassimo/resourcerer
|
65
131
|
licenses:
|
66
132
|
- MIT
|
67
133
|
metadata: {}
|
68
134
|
post_install_message:
|
69
|
-
rdoc_options:
|
70
|
-
- --charset=UTF-8
|
135
|
+
rdoc_options: []
|
71
136
|
require_paths:
|
72
137
|
- lib
|
73
138
|
required_ruby_version: !ruby/object:Gem::Requirement
|
74
139
|
requirements:
|
75
|
-
- -
|
140
|
+
- - "~>"
|
76
141
|
- !ruby/object:Gem::Version
|
77
|
-
version: '2.
|
142
|
+
version: '2.2'
|
78
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
144
|
requirements:
|
80
|
-
- -
|
145
|
+
- - ">="
|
81
146
|
- !ruby/object:Gem::Version
|
82
147
|
version: '0'
|
83
148
|
requirements: []
|
84
149
|
rubyforge_project:
|
85
|
-
rubygems_version: 2.
|
150
|
+
rubygems_version: 2.5.1
|
86
151
|
signing_key:
|
87
152
|
specification_version: 4
|
88
153
|
summary: Dry up your controllers by defining resources
|
89
|
-
test_files:
|
154
|
+
test_files:
|
155
|
+
- spec/features/guitars_controller_spec.rb
|
156
|
+
- spec/resourcerer/controller_spec.rb
|
157
|
+
- spec/resourcerer/param_key_spec.rb
|
158
|
+
- spec/spec_helper.rb
|
159
|
+
- spec/support/rails_app.rb
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'active_support/inflector'
|
2
|
-
require 'active_support/core_ext/string'
|
3
|
-
require 'active_model/naming'
|
4
|
-
|
5
|
-
module Resourcerer
|
6
|
-
class Inflector
|
7
|
-
attr_reader :original, :model, :finder_attribute
|
8
|
-
|
9
|
-
def initialize(name, model, finder_attribute=:id)
|
10
|
-
@original, @model, @finder_attribute = name.to_s, model, finder_attribute
|
11
|
-
end
|
12
|
-
|
13
|
-
alias name original
|
14
|
-
|
15
|
-
def model_name
|
16
|
-
@model_name ||= model.model_name
|
17
|
-
rescue
|
18
|
-
@model_name = ActiveModel::Name.new(model)
|
19
|
-
end
|
20
|
-
|
21
|
-
def param_key
|
22
|
-
model_name.param_key
|
23
|
-
end
|
24
|
-
|
25
|
-
def finder_param
|
26
|
-
"#{model_name.singular}_#{finder_attribute}"
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.class_for(name)
|
30
|
-
name.to_s.split('::').map(&:classify).join('::').constantize
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# This is the base class that is intended to build the DSL for Resourcer
|
2
|
-
module Resourcerer
|
3
|
-
class ResourceConfiguration
|
4
|
-
|
5
|
-
attr_reader :options
|
6
|
-
|
7
|
-
def initialize(options={})
|
8
|
-
@options = options || {}
|
9
|
-
end
|
10
|
-
|
11
|
-
def method_missing(name, *args)
|
12
|
-
super if args.size > 1
|
13
|
-
define_option_method(name)
|
14
|
-
send(name, args.first)
|
15
|
-
end
|
16
|
-
|
17
|
-
def define_option_method(name)
|
18
|
-
# We chose not caching the value inside the method because it's more flexible
|
19
|
-
self.class.class_eval <<-EVAL
|
20
|
-
def #{name}(value=nil)
|
21
|
-
options[:#{name}] = value if value
|
22
|
-
options[:#{name}]
|
23
|
-
end
|
24
|
-
EVAL
|
25
|
-
end
|
26
|
-
|
27
|
-
# DSL
|
28
|
-
|
29
|
-
def find(&block)
|
30
|
-
options[:finder] = block
|
31
|
-
end
|
32
|
-
|
33
|
-
def build(&block)
|
34
|
-
options[:builder] = block
|
35
|
-
end
|
36
|
-
|
37
|
-
def assign(&block)
|
38
|
-
options[:attributes] = block
|
39
|
-
end
|
40
|
-
|
41
|
-
def collection(proc=nil, &block)
|
42
|
-
if proc = (proc || block)
|
43
|
-
options[:collection] = proc
|
44
|
-
else
|
45
|
-
options[:collection]
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'resourcerer/resource'
|
2
|
-
require 'resourcerer/strategies/optional_strategy'
|
3
|
-
require 'pakiderm'
|
4
|
-
|
5
|
-
module Resourcerer
|
6
|
-
module Resourceable
|
7
|
-
extend ActiveSupport::Concern
|
8
|
-
|
9
|
-
included do
|
10
|
-
extend Pakiderm
|
11
|
-
end
|
12
|
-
|
13
|
-
def resource(name, options={}, &block)
|
14
|
-
Resource.for(name, options.merge(strategy: Strategies::OptionalStrategy), block).call(self)
|
15
|
-
end
|
16
|
-
|
17
|
-
module ClassMethods
|
18
|
-
|
19
|
-
def _resources
|
20
|
-
@_resources ||= {}
|
21
|
-
end
|
22
|
-
|
23
|
-
def resource(name, options={}, &block)
|
24
|
-
check_method_available(name)
|
25
|
-
_resources[name] = resource = Resource.for(name, options, block)
|
26
|
-
define_resource_method(name, resource)
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def define_resource_method(name, resource)
|
32
|
-
define_method(name) { resource.call(self) }
|
33
|
-
memoize name, assignable: true
|
34
|
-
hide_action name, "#{name}="
|
35
|
-
end
|
36
|
-
|
37
|
-
def check_method_available(name)
|
38
|
-
if self.respond_to?(name.to_sym)
|
39
|
-
Kernel.warn "[Resourcerer] Overriding #{name} method."
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|