gearhead 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +220 -0
  4. data/Rakefile +32 -0
  5. data/app/controllers/gearhead/application_controller.rb +5 -0
  6. data/app/controllers/gearhead/gears_controller.rb +98 -0
  7. data/config/routes.rb +9 -0
  8. data/lib/gearhead.rb +44 -0
  9. data/lib/gearhead/actions/create.rb +30 -0
  10. data/lib/gearhead/actions/index.rb +88 -0
  11. data/lib/gearhead/actions/show.rb +22 -0
  12. data/lib/gearhead/actions/update.rb +25 -0
  13. data/lib/gearhead/configuration.rb +68 -0
  14. data/lib/gearhead/engine.rb +10 -0
  15. data/lib/gearhead/extensions/actions.rb +29 -0
  16. data/lib/gearhead/extensions/associations.rb +13 -0
  17. data/lib/gearhead/extensions/attributes.rb +20 -0
  18. data/lib/gearhead/extensions/custom_actions.rb +36 -0
  19. data/lib/gearhead/extensions/enabled_actions.rb +9 -0
  20. data/lib/gearhead/extensions/finder.rb +14 -0
  21. data/lib/gearhead/extensions/pagination.rb +26 -0
  22. data/lib/gearhead/extensions/permitted_params.rb +36 -0
  23. data/lib/gearhead/extensions/querying.rb +13 -0
  24. data/lib/gearhead/extensions/scoping.rb +18 -0
  25. data/lib/gearhead/extensions/serialization.rb +21 -0
  26. data/lib/gearhead/gear.rb +56 -0
  27. data/lib/gearhead/gear_lookup.rb +35 -0
  28. data/lib/gearhead/gearbox.rb +83 -0
  29. data/lib/gearhead/paginators/lookup.rb +27 -0
  30. data/lib/gearhead/paginators/paginator.rb +48 -0
  31. data/lib/gearhead/paginators/pagy_paginator.rb +17 -0
  32. data/lib/gearhead/paginators/will_paginate_paginator.rb +13 -0
  33. data/lib/gearhead/params_builder.rb +14 -0
  34. data/lib/gearhead/registry.rb +26 -0
  35. data/lib/gearhead/resource_finder.rb +20 -0
  36. data/lib/gearhead/router.rb +51 -0
  37. data/lib/gearhead/serializers/active_model_serializers/invalid_request_serializer.rb +7 -0
  38. data/lib/gearhead/serializers/active_model_serializers/invalid_resource_serializer.rb +7 -0
  39. data/lib/gearhead/serializers/active_model_serializers/resource_serializer.rb +16 -0
  40. data/lib/gearhead/serializers/fast_jsonapi/invalid_request_serializer.rb +7 -0
  41. data/lib/gearhead/serializers/fast_jsonapi/invalid_resource_serializer.rb +7 -0
  42. data/lib/gearhead/serializers/fast_jsonapi/resource_serializer.rb +16 -0
  43. data/lib/gearhead/serializers/invalid_request_serializer.rb +24 -0
  44. data/lib/gearhead/serializers/invalid_resource_serializer.rb +59 -0
  45. data/lib/gearhead/serializers/lookup.rb +27 -0
  46. data/lib/gearhead/version.rb +3 -0
  47. data/lib/generators/gearhead/gear/gear_generator.rb +14 -0
  48. data/lib/generators/gearhead/gear/templates/gear.rb.erb +3 -0
  49. data/lib/generators/gearhead/install/install_generator.rb +17 -0
  50. data/lib/generators/gearhead/install/templates/gearhead.rb.erb +61 -0
  51. metadata +266 -0
@@ -0,0 +1,7 @@
1
+ module Gearhead
2
+ module Serializers
3
+ module FastJsonapi
4
+ class InvalidRequestSerializer < ::Gearhead::Serializers::InvalidRequestSerializer; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Gearhead
2
+ module Serializers
3
+ module FastJsonapi
4
+ class InvalidResourceSerializer < ::Gearhead::Serializers::InvalidResourceSerializer; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ module Gearhead
2
+ module Serializers
3
+ module FastJsonapi
4
+ class ResourceSerializer
5
+ def self.for(page)
6
+ klass = Class.new
7
+ klass.include JSONAPI::Serializer
8
+ klass.set_type page.resource.model_name.singular_route_key.to_param
9
+ klass.attributes *(page._gear_attributes.presence || page.default_attributes)
10
+
11
+ klass
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ module Gearhead
2
+ module Serializers
3
+ class InvalidRequestSerializer
4
+
5
+ def initialize(request, message, status)
6
+ @request = request
7
+ @message = message
8
+ @status = status
9
+ end
10
+
11
+ def as_json(options = nil)
12
+ {}.tap do |hash|
13
+ hash[:status] = @status
14
+ hash[:url] = @request.url
15
+ hash[:message] = @message
16
+ end
17
+ end
18
+
19
+ def to_json(options = nil)
20
+ as_json.to_json(options)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,59 @@
1
+ module Gearhead
2
+ module Serializers
3
+ class InvalidResourceSerializer
4
+ attr_reader :resource, :errors
5
+ alias_method :serializable_hash, :as_json
6
+ alias_method :serialized_json, :to_json
7
+
8
+ def initialize(resource, options = {})
9
+ @resource = resource
10
+ @errors = errors_for(resource).flatten
11
+ end
12
+
13
+ def id
14
+ resource.id.to_s
15
+ end
16
+
17
+ def type
18
+ resource.class.name.downcase
19
+ end
20
+
21
+ def serializable_hash(options = nil)
22
+ {}.tap do |hash|
23
+ hash[:id] = id if has_id?
24
+ hash[:type] = type if has_id?
25
+ hash[:errors] = errors
26
+ end
27
+ end
28
+
29
+ def serialized_json(options = nil)
30
+ serializable_hash.to_json(options)
31
+ end
32
+
33
+ private
34
+
35
+ def has_id?
36
+ @resource.respond_to?(:id)
37
+ end
38
+
39
+ def errors_for(resource)
40
+ resource.errors.messages.map do |field, errors|
41
+ build_hashes_for(field, errors)
42
+ end
43
+ end
44
+
45
+ def build_hashes_for(field, errors)
46
+ errors.map do |error_message|
47
+ build_hash_for(field, error_message)
48
+ end
49
+ end
50
+
51
+ def build_hash_for(field, error_message)
52
+ {}.tap do |hash|
53
+ hash[:source] = {pointer: "/data/attributes/#{field}"}
54
+ hash[:detail] = error_message
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,27 @@
1
+ module Gearhead
2
+ module Serializers
3
+ class Lookup
4
+ def self.for(action)
5
+ new(action).serializer
6
+ end
7
+
8
+ def initialize(action)
9
+ @action = action.to_s
10
+ end
11
+
12
+ def serializer
13
+ "::Gearhead::Serializers::#{adapter}::#{@action.classify}Serializer".constantize
14
+ end
15
+
16
+ private
17
+
18
+ def adapter_name
19
+ ::Gearhead.config.serialization.adapter
20
+ end
21
+
22
+ def adapter
23
+ adapter_name.to_s.classify
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module Gearhead
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,14 @@
1
+ module Gearhead
2
+ module Generators
3
+ class GearGenerator < Rails::Generators::NamedBase
4
+ desc "Registers resources with Gearhead"
5
+
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ def generate_config_file
9
+ template "gear.rb.erb", "app/gears/#{file_path.tr('/', '_').pluralize}_gear.rb"
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ Gearhead.register <%= class_name %> do
2
+
3
+ end
@@ -0,0 +1,17 @@
1
+ module Gearhead
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ desc "Installs Gearhead"
5
+
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ def generate_config_file
9
+ template "gearhead.rb.erb", "config/initializers/gearhead.rb"
10
+ end
11
+
12
+ def install_routes
13
+ inject_into_file "config/routes.rb", "\n Gearbox.routes(self)", after: /Rails.application.routes.draw do/
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,61 @@
1
+ Gearhead.configure do |config|
2
+ # == Routing
3
+ #
4
+ # The endpoint in which to mount gearhead on.
5
+ # Default is "/gearhead" — must start with a slash, and have no trailing slash
6
+ # config.endpoint = "/api/v314"
7
+ #
8
+ # The default actions a Gear can respond to
9
+ # Default is [:index, :create, :show, :update, :destroy]
10
+ # config.actions = [:index, :show]
11
+ #
12
+
13
+ # == Querying
14
+ #
15
+ # The default scope of a Gear will be the default scope of the resource.
16
+ # Default is nil
17
+ # config.scope = :visible
18
+ #
19
+
20
+ # == Params
21
+ #
22
+ # Ignored params for creating/updating records
23
+ # Default is [:id, :created_at, :updated_at]
24
+ # config.ignored_params = [:id, :created_at, :updated_at]
25
+ #
26
+
27
+ # == Automount
28
+ #
29
+ # Change this to true if you want to automatically mount all your resources.
30
+ # config.automount.enabled = false
31
+ #
32
+ # Automatically mount most of your resources
33
+ # config.automount.resources = ['User', 'Post', 'Comment']
34
+ #
35
+ # Don't automatically mount these resources
36
+ # config.automount.excluded = ['User', 'Post']
37
+ #
38
+
39
+ # == Serialization
40
+ #
41
+ # Change the default serializer
42
+ # Currently supports FastJSONAPI (:fast_jsonapi) and ActiveModelSerializers (:active_model_serializers)
43
+ # Default is :fast_jsonapi
44
+ # config.serialization.adapter = :fast_jsonapi
45
+ #
46
+
47
+ # == Pagination
48
+ #
49
+ # Change the default paginator
50
+ # Currently supports :pagy and :will_paginate
51
+ # Default is :pagy
52
+ # config.pagination.adapter = :pagy
53
+ #
54
+
55
+ # == Controller
56
+ #
57
+ # Base class for the Gearhead controller
58
+ # Default is 'ApplicationController'
59
+ # config.base_controller = 'ApplicationController'
60
+ #
61
+ end
metadata ADDED
@@ -0,0 +1,266 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gearhead
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Josh
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-09-14 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: 6.0.3
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 6.0.3.2
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 6.0.3
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 6.0.3.2
33
+ - !ruby/object:Gem::Dependency
34
+ name: pg
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: ffaker
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: will_paginate
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: active_model_serializers
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: better_errors
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: binding_of_caller
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: pry
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: ransack
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '2.3'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '2.3'
145
+ - !ruby/object:Gem::Dependency
146
+ name: jsonapi-serializer
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '1.17'
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '1.17'
159
+ - !ruby/object:Gem::Dependency
160
+ name: pagy
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '0.19'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.19'
173
+ - !ruby/object:Gem::Dependency
174
+ name: zeitwerk
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '2.2'
180
+ type: :runtime
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '2.2'
187
+ description: Description of Gearhead.
188
+ email:
189
+ - josh@josh.mn
190
+ executables: []
191
+ extensions: []
192
+ extra_rdoc_files: []
193
+ files:
194
+ - MIT-LICENSE
195
+ - README.md
196
+ - Rakefile
197
+ - app/controllers/gearhead/application_controller.rb
198
+ - app/controllers/gearhead/gears_controller.rb
199
+ - config/routes.rb
200
+ - lib/gearhead.rb
201
+ - lib/gearhead/actions/create.rb
202
+ - lib/gearhead/actions/index.rb
203
+ - lib/gearhead/actions/show.rb
204
+ - lib/gearhead/actions/update.rb
205
+ - lib/gearhead/configuration.rb
206
+ - lib/gearhead/engine.rb
207
+ - lib/gearhead/extensions/actions.rb
208
+ - lib/gearhead/extensions/associations.rb
209
+ - lib/gearhead/extensions/attributes.rb
210
+ - lib/gearhead/extensions/custom_actions.rb
211
+ - lib/gearhead/extensions/enabled_actions.rb
212
+ - lib/gearhead/extensions/finder.rb
213
+ - lib/gearhead/extensions/pagination.rb
214
+ - lib/gearhead/extensions/permitted_params.rb
215
+ - lib/gearhead/extensions/querying.rb
216
+ - lib/gearhead/extensions/scoping.rb
217
+ - lib/gearhead/extensions/serialization.rb
218
+ - lib/gearhead/gear.rb
219
+ - lib/gearhead/gear_lookup.rb
220
+ - lib/gearhead/gearbox.rb
221
+ - lib/gearhead/paginators/lookup.rb
222
+ - lib/gearhead/paginators/paginator.rb
223
+ - lib/gearhead/paginators/pagy_paginator.rb
224
+ - lib/gearhead/paginators/will_paginate_paginator.rb
225
+ - lib/gearhead/params_builder.rb
226
+ - lib/gearhead/registry.rb
227
+ - lib/gearhead/resource_finder.rb
228
+ - lib/gearhead/router.rb
229
+ - lib/gearhead/serializers/active_model_serializers/invalid_request_serializer.rb
230
+ - lib/gearhead/serializers/active_model_serializers/invalid_resource_serializer.rb
231
+ - lib/gearhead/serializers/active_model_serializers/resource_serializer.rb
232
+ - lib/gearhead/serializers/fast_jsonapi/invalid_request_serializer.rb
233
+ - lib/gearhead/serializers/fast_jsonapi/invalid_resource_serializer.rb
234
+ - lib/gearhead/serializers/fast_jsonapi/resource_serializer.rb
235
+ - lib/gearhead/serializers/invalid_request_serializer.rb
236
+ - lib/gearhead/serializers/invalid_resource_serializer.rb
237
+ - lib/gearhead/serializers/lookup.rb
238
+ - lib/gearhead/version.rb
239
+ - lib/generators/gearhead/gear/gear_generator.rb
240
+ - lib/generators/gearhead/gear/templates/gear.rb.erb
241
+ - lib/generators/gearhead/install/install_generator.rb
242
+ - lib/generators/gearhead/install/templates/gearhead.rb.erb
243
+ homepage: https://github.com/joshmn/gearhead
244
+ licenses:
245
+ - MIT
246
+ metadata: {}
247
+ post_install_message:
248
+ rdoc_options: []
249
+ require_paths:
250
+ - lib
251
+ required_ruby_version: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - ">="
254
+ - !ruby/object:Gem::Version
255
+ version: '0'
256
+ required_rubygems_version: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - ">="
259
+ - !ruby/object:Gem::Version
260
+ version: '0'
261
+ requirements: []
262
+ rubygems_version: 3.1.2
263
+ signing_key:
264
+ specification_version: 4
265
+ summary: Summary of Gearhead.
266
+ test_files: []