generic_controller 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,6 @@
1
+ require 'bundler/setup'
2
+
3
+ Bundler.setup
4
+ Bundle.require :default, :test
5
+
6
+ require 'generic_controller'
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: