generic_controller 0.0.1
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 +7 -0
- data/lib/generic_controller.rb +130 -0
- data/spec/lib/generic_controller_spec.rb +26 -0
- data/spec/spec_helper.rb +6 -0
- metadata +103 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: ae2943e8da1b0ecfc4f14dd322fe1e30e6ef4f47
|
|
4
|
+
data.tar.gz: 2fabdff692eb2e2fcd5dc3253df6379e0c0e07c7
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 1e15d536349a170dcb8374a1d7c2ff877e51a89ea729da478597e6abf69e9f10d958afed1f124d4b3aa2ba9fde76fe402bac40f0202cd196044d9f7682e8162f
|
|
7
|
+
data.tar.gz: 11aed9c46035d6c6a5852349d248411519ed3aa95e82f4d46810d5c00ddfd185f10bf0217e9a236e3763c88ffd633b9c39c93af21efabb7e789aafa61135eb8b
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# GenericController: Generic, scope-oriented resource controller functions
|
|
2
|
+
require 'action_controller'
|
|
3
|
+
class GenericController < ActionController::Base
|
|
4
|
+
VERSION = "0.0.1"
|
|
5
|
+
VALID_SORT = %w(asc desc).freeze
|
|
6
|
+
|
|
7
|
+
def create
|
|
8
|
+
@resource = cscope.new(model_params)
|
|
9
|
+
@resource.save!
|
|
10
|
+
respond_to do |f|
|
|
11
|
+
f.any do
|
|
12
|
+
response.headers['location'] = send("v#{api_version}_#{model_name.underscore}_url", @resource)
|
|
13
|
+
render({ json: @resource,
|
|
14
|
+
serializer: each_sez,
|
|
15
|
+
status: :created }.merge!(render_options))
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def destroy
|
|
21
|
+
model.destroy(params[:id])
|
|
22
|
+
respond_to do |f|
|
|
23
|
+
f.any do
|
|
24
|
+
head :no_content
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def show
|
|
30
|
+
respond_to do |f|
|
|
31
|
+
f.any do
|
|
32
|
+
render({
|
|
33
|
+
json: @resource,
|
|
34
|
+
serializer: each_sez,
|
|
35
|
+
status: :ok
|
|
36
|
+
}.merge!(render_options))
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def update
|
|
42
|
+
@resource.attributes = model_params
|
|
43
|
+
@resource.save!
|
|
44
|
+
respond_to do |f|
|
|
45
|
+
f.any do
|
|
46
|
+
render({
|
|
47
|
+
json: @resource,
|
|
48
|
+
serializer: each_sez,
|
|
49
|
+
status: :ok
|
|
50
|
+
}.merge!(render_options))
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def index
|
|
56
|
+
query = cscope
|
|
57
|
+
l = limit.to_i
|
|
58
|
+
p = page.to_i
|
|
59
|
+
o = order_by.to_sym
|
|
60
|
+
s = sort.to_sym
|
|
61
|
+
respond_to do |f|
|
|
62
|
+
f.any do
|
|
63
|
+
render({
|
|
64
|
+
json: query.order(o => s).page(p).per(l),
|
|
65
|
+
meta: {
|
|
66
|
+
total: query.count(:all),
|
|
67
|
+
page: p,
|
|
68
|
+
limit: l,
|
|
69
|
+
order_by: o,
|
|
70
|
+
sort: s
|
|
71
|
+
},
|
|
72
|
+
each_serializer: each_sez,
|
|
73
|
+
status: :ok
|
|
74
|
+
}.merge!(render_options))
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def render_options
|
|
82
|
+
{}
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def each_sez
|
|
86
|
+
"#{norm_controller_name}Serializer".constantize
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def page
|
|
90
|
+
params[:page] ||= 1
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def limit
|
|
94
|
+
params[:limit] ||= 20
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def order_by
|
|
98
|
+
return params[:order_by] if model.column_names.include?(params[:order_by])
|
|
99
|
+
|
|
100
|
+
'id'
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def sort
|
|
104
|
+
params[:sort].in?(VALID_SORT) ? params[:sort] : VALID_SORT[0]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def norm_controller_name
|
|
108
|
+
controller_path.classify
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def model_name
|
|
112
|
+
controller_name.classify
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def model
|
|
116
|
+
model_name.constantize
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def cscope
|
|
120
|
+
model
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def attach_resource
|
|
124
|
+
@resource ||= cscope.find(params[:id])
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def api_version
|
|
128
|
+
self.class.to_s.split('::').first.delete!('V')
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'generic_controller'
|
|
2
|
+
RSpec.describe GenericController do
|
|
3
|
+
controller = nil
|
|
4
|
+
before(:all) do
|
|
5
|
+
module Bongo; end
|
|
6
|
+
class FooBarBaz; end
|
|
7
|
+
module Bongo
|
|
8
|
+
class FooBarBazController < GenericController; end
|
|
9
|
+
end
|
|
10
|
+
controller = Bongo::FooBarBazController.new
|
|
11
|
+
end
|
|
12
|
+
describe '#model' do
|
|
13
|
+
it 'classifies the correct model' do
|
|
14
|
+
expect(controller.send(:model)).to eq(FooBarBaz)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
describe '#page' do
|
|
18
|
+
let(:params) { instance_double('params') }
|
|
19
|
+
let(:page_count) { 2 }
|
|
20
|
+
specify do
|
|
21
|
+
allow(params).to receive(:[]).with(:page).and_return(page_count)
|
|
22
|
+
allow(controller).to receive(:params).and_return(params)
|
|
23
|
+
expect(controller.send(:page)).to eq(page_count)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: generic_controller
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- James Meldrum
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2016-08-29 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rails
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '4.0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '4.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: actionpack
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :runtime
|
|
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: rspec
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rspec-rails
|
|
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
|
+
description: An opinionated generic resource-oriented controller for rails.
|
|
70
|
+
email:
|
|
71
|
+
- htmldrum@tutanota.com
|
|
72
|
+
executables: []
|
|
73
|
+
extensions: []
|
|
74
|
+
extra_rdoc_files: []
|
|
75
|
+
files:
|
|
76
|
+
- lib/generic_controller.rb
|
|
77
|
+
- spec/lib/generic_controller_spec.rb
|
|
78
|
+
- spec/spec_helper.rb
|
|
79
|
+
homepage: https://github.com/htmldrum/generic_controller
|
|
80
|
+
licenses: []
|
|
81
|
+
metadata: {}
|
|
82
|
+
post_install_message:
|
|
83
|
+
rdoc_options: []
|
|
84
|
+
require_paths:
|
|
85
|
+
- lib
|
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - ">="
|
|
89
|
+
- !ruby/object:Gem::Version
|
|
90
|
+
version: '0'
|
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - ">="
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '0'
|
|
96
|
+
requirements: []
|
|
97
|
+
rubyforge_project: generic_controller
|
|
98
|
+
rubygems_version: 2.5.1
|
|
99
|
+
signing_key:
|
|
100
|
+
specification_version: 4
|
|
101
|
+
summary: ActionController subclass with conveience
|
|
102
|
+
test_files: []
|
|
103
|
+
has_rdoc:
|