gearhead 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +220 -0
- data/Rakefile +32 -0
- data/app/controllers/gearhead/application_controller.rb +5 -0
- data/app/controllers/gearhead/gears_controller.rb +98 -0
- data/config/routes.rb +9 -0
- data/lib/gearhead.rb +44 -0
- data/lib/gearhead/actions/create.rb +30 -0
- data/lib/gearhead/actions/index.rb +88 -0
- data/lib/gearhead/actions/show.rb +22 -0
- data/lib/gearhead/actions/update.rb +25 -0
- data/lib/gearhead/configuration.rb +68 -0
- data/lib/gearhead/engine.rb +10 -0
- data/lib/gearhead/extensions/actions.rb +29 -0
- data/lib/gearhead/extensions/associations.rb +13 -0
- data/lib/gearhead/extensions/attributes.rb +20 -0
- data/lib/gearhead/extensions/custom_actions.rb +36 -0
- data/lib/gearhead/extensions/enabled_actions.rb +9 -0
- data/lib/gearhead/extensions/finder.rb +14 -0
- data/lib/gearhead/extensions/pagination.rb +26 -0
- data/lib/gearhead/extensions/permitted_params.rb +36 -0
- data/lib/gearhead/extensions/querying.rb +13 -0
- data/lib/gearhead/extensions/scoping.rb +18 -0
- data/lib/gearhead/extensions/serialization.rb +21 -0
- data/lib/gearhead/gear.rb +56 -0
- data/lib/gearhead/gear_lookup.rb +35 -0
- data/lib/gearhead/gearbox.rb +83 -0
- data/lib/gearhead/paginators/lookup.rb +27 -0
- data/lib/gearhead/paginators/paginator.rb +48 -0
- data/lib/gearhead/paginators/pagy_paginator.rb +17 -0
- data/lib/gearhead/paginators/will_paginate_paginator.rb +13 -0
- data/lib/gearhead/params_builder.rb +14 -0
- data/lib/gearhead/registry.rb +26 -0
- data/lib/gearhead/resource_finder.rb +20 -0
- data/lib/gearhead/router.rb +51 -0
- data/lib/gearhead/serializers/active_model_serializers/invalid_request_serializer.rb +7 -0
- data/lib/gearhead/serializers/active_model_serializers/invalid_resource_serializer.rb +7 -0
- data/lib/gearhead/serializers/active_model_serializers/resource_serializer.rb +16 -0
- data/lib/gearhead/serializers/fast_jsonapi/invalid_request_serializer.rb +7 -0
- data/lib/gearhead/serializers/fast_jsonapi/invalid_resource_serializer.rb +7 -0
- data/lib/gearhead/serializers/fast_jsonapi/resource_serializer.rb +16 -0
- data/lib/gearhead/serializers/invalid_request_serializer.rb +24 -0
- data/lib/gearhead/serializers/invalid_resource_serializer.rb +59 -0
- data/lib/gearhead/serializers/lookup.rb +27 -0
- data/lib/gearhead/version.rb +3 -0
- data/lib/generators/gearhead/gear/gear_generator.rb +14 -0
- data/lib/generators/gearhead/gear/templates/gear.rb.erb +3 -0
- data/lib/generators/gearhead/install/install_generator.rb +17 -0
- data/lib/generators/gearhead/install/templates/gearhead.rb.erb +61 -0
- metadata +266 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
module Gearhead
|
2
|
+
module Actions
|
3
|
+
class Index
|
4
|
+
delegate_missing_to :@request
|
5
|
+
|
6
|
+
def self.build(gear, request)
|
7
|
+
new(gear, request).build
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :scope, :gear, :request
|
11
|
+
def initialize(gear, request)
|
12
|
+
@gear = gear
|
13
|
+
@request = request
|
14
|
+
@collection = find_collection
|
15
|
+
@serializer_options = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def build
|
19
|
+
@collection = apply_includes
|
20
|
+
@collection = apply_scope
|
21
|
+
@collection = apply_query
|
22
|
+
@collection = apply_pagination
|
23
|
+
@collection = apply_serializer
|
24
|
+
@collection
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def find_collection
|
30
|
+
@gear.resource.all
|
31
|
+
end
|
32
|
+
|
33
|
+
def apply_includes
|
34
|
+
return @collection if @gear._gear_includes.nil?
|
35
|
+
@collection.includes(@gear._gear_includes)
|
36
|
+
end
|
37
|
+
|
38
|
+
def apply_scope
|
39
|
+
return @collection unless valid_scope?(scope)
|
40
|
+
if query = @gear._gear_defined_scopes[scope.to_sym].presence
|
41
|
+
query.call(@collection)
|
42
|
+
else
|
43
|
+
@collection.send(scope)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def scope
|
48
|
+
params[:scope].presence || @gear._gear_default_scope
|
49
|
+
end
|
50
|
+
|
51
|
+
def valid_scope?(scope)
|
52
|
+
return false if scope.nil?
|
53
|
+
@gear._gear_defined_scopes.key?(scope.to_sym)
|
54
|
+
end
|
55
|
+
|
56
|
+
def apply_query
|
57
|
+
return @collection unless params[:q].present?
|
58
|
+
|
59
|
+
@collection.ransack(params[:q]).result
|
60
|
+
end
|
61
|
+
|
62
|
+
def apply_pagination
|
63
|
+
return @collection unless @gear.paginate?
|
64
|
+
|
65
|
+
paginator = ::Gearhead::Paginators::Paginator.paginate(@collection, self).call
|
66
|
+
@collection = paginator.collection
|
67
|
+
@serialization_options = paginator.serialization_options
|
68
|
+
|
69
|
+
@collection
|
70
|
+
end
|
71
|
+
|
72
|
+
def apply_serializer
|
73
|
+
@gear.serializer_class.new(@collection, serialization_options)
|
74
|
+
end
|
75
|
+
|
76
|
+
def serialization_options
|
77
|
+
{
|
78
|
+
links: {
|
79
|
+
first: @serialization_options[:first_url],
|
80
|
+
last: @serialization_options[:last_url],
|
81
|
+
prev: @serialization_options[:prev_url],
|
82
|
+
next: @serialization_options[:next_url]
|
83
|
+
}
|
84
|
+
}
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Gearhead
|
2
|
+
module Actions
|
3
|
+
class Show
|
4
|
+
delegate_missing_to :@request
|
5
|
+
|
6
|
+
def self.build(gear, request, resource:)
|
7
|
+
new(gear, request, resource: resource).build
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :resource, :gear, :request
|
11
|
+
def initialize(gear, request, resource:)
|
12
|
+
@gear = gear
|
13
|
+
@request = request
|
14
|
+
@resource = resource
|
15
|
+
end
|
16
|
+
|
17
|
+
def build
|
18
|
+
@resource
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Gearhead
|
2
|
+
module Actions
|
3
|
+
class Update
|
4
|
+
delegate_missing_to :@request
|
5
|
+
|
6
|
+
def self.build(gear, request, resource:)
|
7
|
+
new(gear, request, resource: resource).build
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :resource, :gear, :request
|
11
|
+
def initialize(gear, request, resource:)
|
12
|
+
@gear = gear
|
13
|
+
@request = request
|
14
|
+
@resource = resource
|
15
|
+
end
|
16
|
+
|
17
|
+
# todo
|
18
|
+
def build
|
19
|
+
params = ActionController::Parameters.new(@request.params).require(:post).permit(:person_id, :private)
|
20
|
+
@resource.assign_attributes(params)
|
21
|
+
@resource
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Gearhead
|
2
|
+
# not implemented
|
3
|
+
class RansackConfiguration
|
4
|
+
attr_accessor :enabled, :predicates, :associations, :attributes, :scopes
|
5
|
+
def initialize
|
6
|
+
@enabled = true
|
7
|
+
@predicates = true
|
8
|
+
@associations = true
|
9
|
+
@attributes = true
|
10
|
+
@scopes = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def enabled?
|
14
|
+
@enabled
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class SerializationConfiguration
|
19
|
+
attr_accessor :adapter
|
20
|
+
def initialize
|
21
|
+
@adapter = :fast_jsonapi
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class PaginationConfiguration
|
26
|
+
attr_accessor :adapter, :include_total, :per_page
|
27
|
+
def initialize
|
28
|
+
@adapter = :pagy
|
29
|
+
@enabled = true
|
30
|
+
@per_page = 30
|
31
|
+
end
|
32
|
+
|
33
|
+
def enabled?
|
34
|
+
@enabled
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class AutomountConfiguration
|
39
|
+
attr_accessor :enabled, :excludes, :includes
|
40
|
+
|
41
|
+
def initialize
|
42
|
+
@enabled = false
|
43
|
+
@excludes = []
|
44
|
+
@includes = []
|
45
|
+
end
|
46
|
+
|
47
|
+
def enabled?
|
48
|
+
@enabled
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class Configuration
|
53
|
+
attr_accessor :actions, :current_user, :endpoint, :serializer, :scope, :ignored_params,
|
54
|
+
:automount, :pagination, :serialization, :base_controller
|
55
|
+
|
56
|
+
def initialize
|
57
|
+
@actions = [:index, :create, :show, :update, :destroy]
|
58
|
+
@current_user = nil
|
59
|
+
@scope = nil
|
60
|
+
@endpoint = "/gearhead"
|
61
|
+
@ignored_params = [:id, :created_at, :updated_at]
|
62
|
+
@automount = AutomountConfiguration.new
|
63
|
+
@pagination = PaginationConfiguration.new
|
64
|
+
@serialization = SerializationConfiguration.new
|
65
|
+
@base_controller = 'ApplicationController'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Gearhead
|
2
|
+
module Extensions
|
3
|
+
module Actions
|
4
|
+
def self.included(klass)
|
5
|
+
klass.define_gear_setting :enabled_actions, Gearhead.config.actions.map(&:to_sym)
|
6
|
+
end
|
7
|
+
|
8
|
+
def disable_actions(*actions)
|
9
|
+
@_gear_enabled_actions -= actions.map(&:to_sym)
|
10
|
+
end
|
11
|
+
|
12
|
+
def actions(*args)
|
13
|
+
options = args.extract_options!
|
14
|
+
@_gear_enabled_actions = if options[:except]
|
15
|
+
@_gear_enabled_actions - options[:except].map(&:to_sym)
|
16
|
+
elsif options[:only]
|
17
|
+
options[:only].map(&:to_sym)
|
18
|
+
else
|
19
|
+
args.map(&:to_sym)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def action_enabled?(action)
|
24
|
+
@_gear_enabled_actions.include?(action)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Gearhead
|
2
|
+
module Extensions
|
3
|
+
module Associations
|
4
|
+
def self.included(klass)
|
5
|
+
klass.define_gear_setting :associations, { belongs_to: [], has_many: [], has_one: [] }
|
6
|
+
end
|
7
|
+
|
8
|
+
def belongs_to(klass)
|
9
|
+
@_gear_associations[:belongs_to] << klass
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Gearhead
|
2
|
+
module Extensions
|
3
|
+
module Attributes
|
4
|
+
def self.included(klass)
|
5
|
+
end
|
6
|
+
|
7
|
+
def _gear_attributes
|
8
|
+
@_gear_attributes
|
9
|
+
end
|
10
|
+
|
11
|
+
def attributes(*attrs)
|
12
|
+
@_gear_attributes = *attrs
|
13
|
+
end
|
14
|
+
|
15
|
+
def default_attributes
|
16
|
+
@resource.columns_hash.keys.map(&:to_sym)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Gearhead
|
2
|
+
module Extensions
|
3
|
+
module CustomActions
|
4
|
+
def self.included(klass)
|
5
|
+
klass.define_gear_setting :collection_actions, {}
|
6
|
+
klass.define_gear_setting :member_actions, {}
|
7
|
+
end
|
8
|
+
|
9
|
+
class CustomAction
|
10
|
+
attr_reader :name, :verbs, :block
|
11
|
+
def initialize(name, verbs, &block)
|
12
|
+
@name = name
|
13
|
+
@verbs = verbs
|
14
|
+
@block = block
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def custom_action(type, name, options = {}, &block)
|
19
|
+
vias = (Array(options[:via]).presence || [:get]).map { |via| via.downcase.to_sym }
|
20
|
+
if type == :member
|
21
|
+
@_gear_member_actions[name] = CustomAction.new(name, vias, &block)
|
22
|
+
else
|
23
|
+
@_gear_collection_actions[name] = CustomAction.new(name, vias, &block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def member_action(name, options = {}, &block)
|
28
|
+
custom_action(:member, name, options, &block)
|
29
|
+
end
|
30
|
+
|
31
|
+
def collection_action(name, options = {}, &block)
|
32
|
+
custom_action(:collection, name, options, &block)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Gearhead
|
2
|
+
module Extensions
|
3
|
+
module Pagination
|
4
|
+
def self.included(klass)
|
5
|
+
klass.define_gear_setting :paginate, Gearhead.config.pagination.enabled?
|
6
|
+
klass.define_gear_setting :per_page, Gearhead.config.pagination.per_page
|
7
|
+
end
|
8
|
+
|
9
|
+
def paginate?
|
10
|
+
@_gear_paginate === true
|
11
|
+
end
|
12
|
+
|
13
|
+
def paginate(val)
|
14
|
+
@_gear_paginate = val === true
|
15
|
+
end
|
16
|
+
|
17
|
+
def per_page(int)
|
18
|
+
@_gear_per_page = int
|
19
|
+
end
|
20
|
+
|
21
|
+
def pagination_total(boolean)
|
22
|
+
@_gear_pagination_total = boolean
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Gearhead
|
2
|
+
module Extensions
|
3
|
+
module PermittedParams
|
4
|
+
def self.included(klass)
|
5
|
+
klass.define_gear_setting :permitted_params, {}
|
6
|
+
klass.define_gear_setting :action_params, {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def permit_params(*args)
|
10
|
+
options = args.extract_options!
|
11
|
+
if options[:only]
|
12
|
+
keys = Array(args[:only]).map(&:to_sym)
|
13
|
+
keys.each do |key|
|
14
|
+
@_gear_action_params[key] = args
|
15
|
+
end
|
16
|
+
else
|
17
|
+
@_gear_permitted_params = args
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def permitted_attributes(action)
|
22
|
+
if attrs = @_gear_action_params[action.to_sym].presence
|
23
|
+
attrs
|
24
|
+
elsif attrs = @_gear_permitted_params.presence
|
25
|
+
attrs
|
26
|
+
else
|
27
|
+
@resource.columns_hash.keys.map(&:to_sym)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def permitted_params(action)
|
32
|
+
permitted_attributes(action)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Gearhead
|
2
|
+
module Extensions
|
3
|
+
module Scoping
|
4
|
+
def self.included(klass)
|
5
|
+
klass.define_gear_setting :default_scope, nil
|
6
|
+
klass.define_gear_setting :defined_scopes, {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def register_scope(name, query = nil)
|
10
|
+
@_gear_defined_scopes[name] = query
|
11
|
+
end
|
12
|
+
|
13
|
+
def default_scope(scope = nil)
|
14
|
+
@_gear_default_scope = scope
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|