Skip to content

Commit d4ca615

Browse files
author
Lee Richmond
committed
Move to subclassable resources
* rename dsl to resource * clarify resource class vs instance methods
1 parent ee5c56a commit d4ca615

29 files changed

+445
-367
lines changed

lib/jsonapi_compliable.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
require "jsonapi_compliable/version"
44
require "jsonapi_compliable/errors"
5-
require "jsonapi_compliable/dsl"
5+
require "jsonapi_compliable/resource"
66
require "jsonapi_compliable/query"
77
require "jsonapi_compliable/scope"
88
require "jsonapi_compliable/scoping/base"
@@ -13,6 +13,7 @@
1313
require "jsonapi_compliable/scoping/filterable"
1414
require "jsonapi_compliable/scoping/default_filter"
1515
require "jsonapi_compliable/scoping/filter"
16+
require "jsonapi_compliable/adapters/abstract"
1617
require "jsonapi_compliable/stats/dsl"
1718
require "jsonapi_compliable/stats/payload"
1819
require "jsonapi_compliable/util/include_params"
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module JsonapiCompliable
2+
module Adapters
3+
class Abstract
4+
def filter(scope, attribute, value)
5+
raise 'you must override #filter in an adapter subclass'
6+
end
7+
8+
def order(scope, attribute, direction)
9+
raise 'you must override #order in an adapter subclass'
10+
end
11+
12+
def paginate(scope, number, size)
13+
raise 'you must override #paginate in an adapter subclass'
14+
end
15+
16+
def sideload(scope, includes)
17+
raise 'you must override #sideload in an adapter subclass'
18+
end
19+
end
20+
end
21+
end
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
module JsonapiCompliable
2+
module Adapters
3+
class ActiveRecord < Abstract
4+
def filter(scope, attribute, value)
5+
scope.where(attribute => value)
6+
end
7+
8+
def order(scope, attribute, direction)
9+
scope.order(attribute => direction)
10+
end
11+
12+
def paginate(scope, current_page, per_page)
13+
scope.page(current_page).per(per_page)
14+
end
15+
16+
def sideload(scope, includes)
17+
scope.includes(includes)
18+
end
19+
20+
def count(scope, attr)
21+
scope.count
22+
end
23+
24+
def average(scope, attr)
25+
scope.average(attr).to_f
26+
end
27+
28+
def sum(scope, attr)
29+
scope.sum(attr)
30+
end
31+
32+
def maximum(scope, attr)
33+
scope.maximum(attr)
34+
end
35+
36+
def minimum(scope, attr)
37+
scope.minimum(attr)
38+
end
39+
end
40+
end
41+
end

lib/jsonapi_compliable/base.rb

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,49 @@ module Base
66
MAX_PAGE_SIZE = 1_000
77

88
included do
9-
class_attribute :_jsonapi_compliable
10-
attr_reader :_jsonapi_scope
9+
class << self
10+
attr_accessor :_jsonapi_compliable
11+
end
1112

1213
around_action :wrap_context
14+
15+
def self.inherited(klass)
16+
super
17+
klass._jsonapi_compliable = Class.new(_jsonapi_compliable)
18+
end
19+
end
20+
21+
def resource
22+
@resource ||= self.class._jsonapi_compliable.new
23+
end
24+
25+
def resource!
26+
@resource = self.class._jsonapi_compliable.new
1327
end
1428

1529
# TODO pass controller and action name here to guard
1630
def wrap_context
17-
_jsonapi_compliable.with_context(self, action_name.to_sym) do
31+
resource.with_context(self, action_name.to_sym) do
1832
yield
1933
end
2034
end
2135

2236
def jsonapi_scope(scope, opts = {})
23-
query = Query.new(_jsonapi_compliable, params)
24-
_jsonapi_compliable.build_scope(scope, query, opts)
37+
query = Query.new(resource, params)
38+
resource.build_scope(scope, query, opts)
2539
end
2640

2741
# TODO: refactor
2842
def render_jsonapi(scope, opts = {})
29-
query = Query.new(_jsonapi_compliable, params)
30-
query_hash = query.to_hash[_jsonapi_compliable.type]
43+
query = Query.new(resource, params)
44+
query_hash = query.to_hash[resource.type]
3145

3246
scoped = scope
3347
scoped = jsonapi_scope(scoped) unless opts[:scope] == false || scoped.is_a?(JsonapiCompliable::Scope)
3448
resolved = scoped.respond_to?(:resolve) ? scoped.resolve : scoped
3549

3650
options = default_jsonapi_render_options
37-
options[:include] = forced_includes || Util::IncludeParams.scrub(query_hash[:include], _jsonapi_compliable.allowed_sideloads)
51+
options[:include] = forced_includes || Util::IncludeParams.scrub(query_hash[:include], resource.allowed_sideloads)
3852
options[:jsonapi] = resolved
3953
options[:fields] = query.fieldsets
4054
options[:meta] ||= {}
@@ -88,15 +102,16 @@ def force_includes?
88102
end
89103

90104
module ClassMethods
91-
def jsonapi(&blk)
92-
if !self._jsonapi_compliable
93-
dsl = JsonapiCompliable::DSL.new
94-
self._jsonapi_compliable = dsl
105+
def jsonapi(resource: nil, &blk)
106+
if resource
107+
self._jsonapi_compliable = resource
95108
else
96-
self._jsonapi_compliable = self._jsonapi_compliable.copy
109+
if !self._jsonapi_compliable
110+
self._jsonapi_compliable = JsonapiCompliable::Resource
111+
end
97112
end
98113

99-
self._jsonapi_compliable.instance_eval(&blk)
114+
self._jsonapi_compliable.class_eval(&blk) if blk
100115
end
101116
end
102117
end

lib/jsonapi_compliable/dsl.rb

Lines changed: 0 additions & 155 deletions
This file was deleted.

0 commit comments

Comments
 (0)