Skip to content
This repository has been archived by the owner on Aug 6, 2023. It is now read-only.

Commit

Permalink
feat(Primary ID): Different primary attribute.
Browse files Browse the repository at this point in the history
Allow a different primary attribute on a per-version render.
  • Loading branch information
maddiesch committed Feb 24, 2019
1 parent baa54ec commit 861d943
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 11 deletions.
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
# Version 1.2.0

## Released February 23, 2019

###

- Feat: Allow setting a different primary id attribute.

---

# Version 1.1.0

## Released February 23, 2019
Expand All @@ -8,6 +18,8 @@

- Feat: Allow Params to parse included relationships

---

# Version 1.0.1

## Released November 21, 2018
Expand All @@ -16,6 +28,8 @@

- Fix for nested complex attributes.

---

# Version 1.0.0

## Released November 15, 2018
Expand Down
15 changes: 10 additions & 5 deletions lib/onsi/model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ module ClassMethods
#
# @param block [Block] The block. Called on an instance
# of {Onsi::Model::ModelRenderer}
def api_render(version, &block)
api_renderer(version).instance_exec(&block)
def api_render(version, id: :id, &block)
api_renderer(version, id).instance_exec(&block)
end

##
Expand All @@ -63,12 +63,12 @@ def api_render(version, &block)
#
# @raise [Onsi::Errors::UnknownVersionError] If the version isn't defined
# and the for_render param is true.
def api_renderer(version, for_render: false)
def api_renderer(version, id, for_render: false)
@api_renderer ||= {}
if for_render
raise Errors::UnknownVersionError.new(self, version) if @api_renderer[version].nil?
else
@api_renderer[version] ||= ModelRenderer.new
@api_renderer[version] ||= ModelRenderer.new(id)
end
@api_renderer[version]
end
Expand All @@ -91,11 +91,16 @@ class ModelRenderer
# The default date-time format for a rendered Date and Time. (ISO-8601)
DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%SZ'.freeze

##
# The name of the id attribute on the model
attr_reader :id_attr

##
# Create a new ModelRenderer
#
# @private
def initialize
def initialize(id_attr)
@id_attr = id_attr
@attributes = {}
@relationships = {}
@metadata = {}
Expand Down
15 changes: 10 additions & 5 deletions lib/onsi/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ def initialize(object, version = nil, includes: nil)
def as_json(_opts = {})
{}.tap do |root|
root[TYPE_KEY] = type
root[ID_KEY] = object.id.to_s
root[ID_KEY] = object_id
root[ATTRIBUTES_KEY] = generate_attributes
append_relationships(root)
append_meta(root)
Expand Down Expand Up @@ -189,8 +189,13 @@ def validate!
end
end

def object_id
attr = object.class.api_renderer(version, nil, for_render: true).id_attr
object.send(attr).to_s
end

def type
object.class.api_renderer(version, for_render: true).type || object.class.name.underscore
object.class.api_renderer(version, nil, for_render: true).type || object.class.name.underscore
end

def append_relationships(root)
Expand All @@ -216,15 +221,15 @@ def append_includes(root)
end

def generate_attributes
object.class.api_renderer(version, for_render: true).render_attributes(object)
object.class.api_renderer(version, nil, for_render: true).render_attributes(object)
end

def generate_relationships
object.class.api_renderer(version, for_render: true).render_relationships(object)
object.class.api_renderer(version, nil, for_render: true).render_relationships(object)
end

def generate_metadata
object.class.api_renderer(version, for_render: true).render_metadata(object)
object.class.api_renderer(version, nil, for_render: true).render_metadata(object)
end

def generate_includes
Expand Down
2 changes: 1 addition & 1 deletion lib/onsi/version.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module Onsi
##
# The current version of Onsi
VERSION = '1.1.0'.freeze
VERSION = '1.2.0'.freeze
end

0 comments on commit 861d943

Please sign in to comment.