gearhead 0.1.0

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.
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: []