resourcerer 0.2.2 → 2.0.4

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.
@@ -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
@@ -0,0 +1,6 @@
1
+ require "simplecov"
2
+ SimpleCov.start { add_filter '/spec/' }
3
+
4
+ require "resourcerer"
5
+ require "rspec/given"
6
+ require "pry-byebug"
@@ -0,0 +1,60 @@
1
+ require "action_controller"
2
+ require "rails"
3
+
4
+ def request_params(params)
5
+ { 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,45 +1,114 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resourcerer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 2.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Máximo Mussini
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-25 00:00:00.000000000 Z
11
+ date: 2021-02-24 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
+ - - ">="
25
32
  - !ruby/object:Gem::Version
26
33
  version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "<"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.18'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "<"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.18'
27
55
  - !ruby/object:Gem::Dependency
28
- name: simple_memoizer
56
+ name: pry-byebug
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
- - - '>='
59
+ - - ">="
32
60
  - !ruby/object:Gem::Version
33
61
  version: '0'
34
- type: :runtime
62
+ type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
- - - '>='
66
+ - - ">="
39
67
  - !ruby/object:Gem::Version
40
68
  version: '0'
41
- description: Extracted from decent exposure, allows you to define resources to automate
42
- finding a record and assigning attributes.
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.
43
112
  email:
44
113
  - maximomussini@gmail.com
45
114
  executables: []
@@ -47,42 +116,44 @@ extensions: []
47
116
  extra_rdoc_files:
48
117
  - README.md
49
118
  files:
119
+ - CHANGELOG.md
50
120
  - README.md
51
121
  - lib/resourcerer.rb
52
- - lib/resourcerer/inflector.rb
122
+ - lib/resourcerer/configuration.rb
123
+ - lib/resourcerer/controller.rb
53
124
  - lib/resourcerer/resource.rb
54
- - lib/resourcerer/resource_configuration.rb
55
- - lib/resourcerer/resourceable.rb
56
- - lib/resourcerer/strategies/assign_attributes.rb
57
- - lib/resourcerer/strategies/assign_from_method.rb
58
- - lib/resourcerer/strategies/assign_from_params.rb
59
- - lib/resourcerer/strategies/default_strategy.rb
60
- - lib/resourcerer/strategies/eager_attributes_strategy.rb
61
- - lib/resourcerer/strategies/strong_parameters_strategy.rb
62
- - lib/resourcerer/strategy.rb
125
+ - lib/resourcerer/version.rb
126
+ - spec/features/guitars_controller_spec.rb
127
+ - spec/resourcerer/controller_spec.rb
128
+ - spec/resourcerer/param_key_spec.rb
129
+ - spec/spec_helper.rb
130
+ - spec/support/rails_app.rb
63
131
  homepage: https://github.com/ElMassimo/resourcerer
64
132
  licenses:
65
133
  - MIT
66
134
  metadata: {}
67
- post_install_message:
68
- rdoc_options:
69
- - --charset=UTF-8
135
+ post_install_message:
136
+ rdoc_options: []
70
137
  require_paths:
71
138
  - lib
72
139
  required_ruby_version: !ruby/object:Gem::Requirement
73
140
  requirements:
74
- - - '>='
141
+ - - ">="
75
142
  - !ruby/object:Gem::Version
76
- version: '2.0'
143
+ version: '2.2'
77
144
  required_rubygems_version: !ruby/object:Gem::Requirement
78
145
  requirements:
79
- - - '>='
146
+ - - ">="
80
147
  - !ruby/object:Gem::Version
81
148
  version: '0'
82
149
  requirements: []
83
- rubyforge_project:
84
- rubygems_version: 2.2.2
85
- signing_key:
150
+ rubygems_version: 3.2.3
151
+ signing_key:
86
152
  specification_version: 4
87
153
  summary: Dry up your controllers by defining resources
88
- 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,45 +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 attributes
12
- @attributes ||= options[:attributes].try(:call)
13
- end
14
-
15
- def method_missing(name, *args)
16
- super if args.size > 1
17
- define_option_method(name)
18
- send(name, args.first)
19
- end
20
-
21
- def define_option_method(name)
22
- # We chose not caching the value inside the method because it's more flexible
23
- self.class.class_eval <<-EVAL
24
- def #{name}(value=nil)
25
- options[:#{name}] = value if value
26
- options[:#{name}]
27
- end
28
- EVAL
29
- end
30
-
31
- # DSL
32
-
33
- def find(&block)
34
- options[:finder] = block
35
- end
36
-
37
- def build(&block)
38
- options[:builder] = block
39
- end
40
-
41
- def assign(&block)
42
- options[:attributes] = block
43
- end
44
- end
45
- end
@@ -1,39 +0,0 @@
1
- require 'resourcerer/resource'
2
- require 'simple_memoizer'
3
-
4
- module Resourcerer
5
- module Resourceable
6
- extend ActiveSupport::Concern
7
- include SimpleMemoizer
8
-
9
- module ClassMethods
10
-
11
- def _resources
12
- @_resources ||= {}
13
- end
14
-
15
- def resource(name, options={}, &block)
16
- check_method_available!(name)
17
- _resources[name] = resource = Resource.for(name, options, block)
18
- define_resource_method(name, resource)
19
- end
20
-
21
- private
22
-
23
- def define_resource_method(name, resource)
24
- define_method(name) { resource.call(self) }
25
- memoize name
26
- hide_action name, "#{name}="
27
- end
28
-
29
- def check_method_available!(name)
30
- if self.respond_to?(name.to_sym)
31
- Kernel.abort "[ERROR] You are adding a singular resource by the `#{name}` method, " \
32
- "which overrides an existing method of the same name. " \
33
- "Consider a different resource name\n" \
34
- "#{caller.first}"
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,34 +0,0 @@
1
- module Resourcerer
2
- module Strategies
3
- module AssignAttributes
4
-
5
- def resource
6
- super.tap do |r|
7
- assign_attributes(r) if r && assign_attributes?
8
- end
9
- end
10
-
11
- def attributes
12
- config.attributes
13
- end
14
-
15
- def assign_attributes?
16
- !get? && !delete? && attributes.present?
17
- end
18
-
19
- def assign_attributes(resource)
20
- resource.attributes = attributes
21
- end
22
-
23
- def resource_params
24
- params[param_key]
25
- end
26
-
27
- private
28
-
29
- def param_key
30
- config.param_key || inflector.param_key
31
- end
32
- end
33
- end
34
- end