Skip to content

Commit a4bd278

Browse files
authored
Merge pull request #6 from richmolj/jsonapirb
Jsonapirb
2 parents 7faee00 + 30ada00 commit a4bd278

19 files changed

+170
-84
lines changed

Gemfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ source "https://rubygems.org"
22

33
# Specify your gem's dependencies in jsonapi_compliable.gemspec
44
gemspec
5-
gem 'active_model_serializers', git: 'https://github.com/richmolj/active_model_serializers.git'
65

76
group :test do
87
gem 'appraisal'

jsonapi_compliable.gemspec

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ Gem::Specification.new do |spec|
1818
spec.require_paths = ["lib"]
1919

2020
spec.add_dependency "rails", ['>= 4.1', '< 6']
21-
spec.add_dependency "jsonapi", '~> 0.1.1.beta2'
22-
spec.add_dependency "active_model_serializers", "~> 0.10"
23-
spec.add_dependency "jsonapi_ams_extensions", "~> 0.1"
21+
22+
spec.add_dependency 'jsonapi-rails', '~> 0.1'
2423

2524
spec.add_development_dependency "kaminari"
2625
spec.add_development_dependency "active_model_serializers"

lib/jsonapi_compliable.rb

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
require 'active_model_serializers'
2-
require 'jsonapi'
3-
require 'jsonapi_ams_extensions'
1+
require 'jsonapi/rails'
42

53
require "jsonapi_compliable/version"
64
require "jsonapi_compliable/errors"
@@ -19,8 +17,8 @@
1917
require "jsonapi_compliable/util/field_params"
2018
require "jsonapi_compliable/util/scoping"
2119
require "jsonapi_compliable/util/pagination"
22-
23-
require 'jsonapi_compliable/railtie' if defined?(::Rails)
20+
require "jsonapi_compliable/extensions/extra_attribute"
21+
require "jsonapi_compliable/extensions/boolean_attribute"
2422

2523
module JsonapiCompliable
2624
autoload :Base, 'jsonapi_compliable/base'

lib/jsonapi_compliable/base.rb

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,25 +51,26 @@ def parse_fieldsets!
5151
Util::FieldParams.parse!(params, :extra_fields)
5252
end
5353

54-
def render_ams(scope, opts = {})
54+
def render_jsonapi(scope, opts = {})
5555
scoped = Util::Scoping.apply?(self, scope, opts.delete(:scope)) ? jsonapi_scope(scope) : scope
56-
options = default_ams_options
56+
options = default_jsonapi_render_options
5757
options[:include] = forced_includes || Util::IncludeParams.scrub(self)
5858
options[:jsonapi] = JsonapiCompliable::Util::Pagination.zero?(params) ? [] : scoped
5959
options[:fields] = Util::FieldParams.fieldset(params, :fields) if params[:fields]
60-
options[:extra_fields] = Util::FieldParams.fieldset(params, :extra_fields) if params[:extra_fields]
6160
options[:meta] ||= {}
6261
options.merge!(opts)
6362
options[:meta][:stats] = Stats::Payload.new(self, scoped).generate if params[:stats]
63+
options[:expose] ||= {}
64+
options[:expose][:context] = self
65+
options[:expose][:extra_fields] = Util::FieldParams.fieldset(params, :extra_fields) if params[:extra_fields]
6466

6567
render(options)
6668
end
6769

68-
# render_ams(foo) equivalent to
69-
# render json: foo, ams_default_options
70-
def default_ams_options
70+
# render_jsonapi(foo) equivalent to
71+
# render jsonapi: foo, default_jsonapi_render_options
72+
def default_jsonapi_render_options
7173
{}.tap do |options|
72-
options[:adapter] = :json_api
7374
end
7475
end
7576

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module JsonapiCompliable
2+
module Extensions
3+
module BooleanAttribute
4+
def self.included(klass)
5+
klass.extend ClassMethods
6+
end
7+
8+
module ClassMethods
9+
def boolean_attribute(name, options = {}, &blk)
10+
blk ||= proc { @object.public_send(name) }
11+
field_name = :"is_#{name.to_s.gsub('?', '')}"
12+
attribute field_name, options, &blk
13+
end
14+
end
15+
end
16+
end
17+
end
18+
19+
JSONAPI::Serializable::Resource.class_eval do
20+
include JsonapiCompliable::Extensions::BooleanAttribute
21+
end
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
require 'jsonapi/serializable/resource/conditional_fields'
2+
3+
module JsonapiCompliable
4+
module Extensions
5+
module ExtraAttribute
6+
def self.included(klass)
7+
klass.extend ClassMethods
8+
end
9+
10+
module ClassMethods
11+
def extra_attribute(name, options = {}, &blk)
12+
allow_field = proc {
13+
if options[:if]
14+
next false unless instance_eval(&options[:if])
15+
end
16+
17+
if @extra_fields && @extra_fields[jsonapi_type]
18+
@extra_fields[jsonapi_type].include?(name)
19+
else
20+
false
21+
end
22+
}
23+
24+
attribute name, if: allow_field, &blk
25+
end
26+
end
27+
end
28+
end
29+
end
30+
31+
JSONAPI::Serializable::Resource.class_eval do
32+
prepend JSONAPI::Serializable::Resource::ConditionalFields
33+
include JsonapiCompliable::Extensions::ExtraAttribute
34+
end

lib/jsonapi_compliable/railtie.rb

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

lib/jsonapi_compliable/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module JsonapiCompliable
2-
VERSION = "0.3.10"
2+
VERSION = "0.4.0"
33
end

spec/boolean_attribute_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe '.boolean_attribute' do
4+
let(:klass) do
5+
Class.new(JSONAPI::Serializable::Resource) do
6+
type 'authors'
7+
8+
boolean_attribute :celebrity?
9+
end
10+
end
11+
12+
let(:author) { double(id: 1) }
13+
let(:resource) { klass.new(object: author) }
14+
15+
subject { resource.as_jsonapi[:attributes] }
16+
17+
before do
18+
allow(author).to receive(:celebrity?) { true }
19+
end
20+
21+
it { is_expected.to eq(is_celebrity: true) }
22+
23+
context 'when supplied a block' do
24+
before do
25+
klass.class_eval do
26+
boolean_attribute :alive? do
27+
'yesss'
28+
end
29+
end
30+
end
31+
32+
it { is_expected.to include(is_alive: 'yesss') }
33+
end
34+
end

spec/create_update_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def create
1010
author = Author.new(author_params.except(:state_attributes))
1111
author.state = State.find_or_initialize_by(author_params[:state_attributes])
1212
author.save!(validate: false)
13-
render_ams(author, scope: false)
13+
render_jsonapi(author, scope: false)
1414
end
1515

1616
def update
@@ -21,7 +21,7 @@ def update
2121
end
2222
author.association(:books).loaded!
2323
author.save!
24-
render_ams(author, scope: false)
24+
render_jsonapi(author, scope: false)
2525
end
2626

2727
private

0 commit comments

Comments
 (0)