alchemy-json_api 0.1.0 → 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 25ba34a50a58c59ff4aabb21089faee49c5ada8fbbf753a1515799845bea8213
4
- data.tar.gz: 247cf1d183feda62cec526e9a7ceec96716ff1ed97589a473ba86193cfd54065
3
+ metadata.gz: bb04c3210449c9689cc5d5f0a187492b6de5e53ad88928e878f564dfd10f6615
4
+ data.tar.gz: e856316ed3433935246e4fd1e33f37f5c9830bb6737fb37b02d55c441e66b91e
5
5
  SHA512:
6
- metadata.gz: 1facc4daccad62f6b80c8c7494c644621713ed048e8dcc8cfb55abdeb2b3fb115f519c835febd7ebb509b6dab3d9a0e43ea2837ed6aa71d863d7b6942de001ec
7
- data.tar.gz: 57c7d49f5214edbc140303a7be3a4286b6649eff07905f3eba4fa74531e27444ab24b8976a983855d1a70adaf961a639c246f12a0737e269872213f454e402cc
6
+ metadata.gz: dbb2638d53afbb1ccb330d65b0b7f2baec33b619c55992accdb58c457d10192a28459ad7520543cfc2fdbc921ca4dea09f992bf8fd532dd85f0fbedcc52504d7
7
+ data.tar.gz: a872add90f9bda24d3f0d3647ab01c0f2a5fd2707c3d83e596d21db66b9faf38bbfe587fe3179228fe9233ff921b22fe9e9c5c7954a2217c08354d5269e48668
data/Rakefile CHANGED
@@ -26,3 +26,11 @@ task :test_setup do
26
26
  exit($?.exitstatus) unless $?.success?
27
27
  end
28
28
  end
29
+
30
+ require "github_changelog_generator/task"
31
+ require "alchemy/json_api/version"
32
+ GitHubChangelogGenerator::RakeTask.new(:changelog) do |config|
33
+ config.user = "AlchemyCMS"
34
+ config.project = "alchemy-json_api"
35
+ config.future_release = "v#{Alchemy::JsonApi::VERSION}"
36
+ end
@@ -6,6 +6,7 @@ module Alchemy
6
6
  include JSONAPI::Fetching
7
7
  include JSONAPI::Errors
8
8
  include JSONAPI::Filtering
9
+ include JSONAPI::Pagination
9
10
  end
10
11
  end
11
12
  end
@@ -8,7 +8,9 @@ module Alchemy
8
8
  allowed = [:page_layout]
9
9
 
10
10
  jsonapi_filter(page_scope, allowed) do |filtered|
11
- render jsonapi: filtered.result
11
+ jsonapi_paginate(filtered.result) do |paginated|
12
+ render jsonapi: paginated
13
+ end
12
14
  end
13
15
  end
14
16
 
@@ -18,17 +20,25 @@ module Alchemy
18
20
 
19
21
  private
20
22
 
23
+ def jsonapi_meta(pages)
24
+ pagination = jsonapi_pagination_meta(pages)
25
+
26
+ {
27
+ pagination: pagination.presence,
28
+ total: page_scope.count
29
+ }.compact
30
+ end
31
+
21
32
  def load_page
22
33
  @page = load_page_by_id || load_page_by_urlname || raise(ActiveRecord::RecordNotFound)
23
34
  end
24
35
 
25
36
  def load_page_by_id
26
- page_scope.find_by(id: params[:id])
37
+ page_scope.find_by(id: params[:path])
27
38
  end
28
39
 
29
40
  def load_page_by_urlname
30
- # The route param is called :id although it might be a string
31
- page_scope.find_by(urlname: params[:id])
41
+ page_scope.find_by(urlname: params[:path])
32
42
  end
33
43
 
34
44
  def page_scope
@@ -1,25 +1,28 @@
1
1
  # frozen_string_literal: true
2
- module Alchemy::JsonApi
3
- class ElementSerializer
4
- include FastJsonapi::ObjectSerializer
5
- attributes(
6
- :position,
7
- :created_at,
8
- :updated_at,
9
- )
10
- attribute :element_type, &:name
11
- belongs_to :parent_element, record_type: :element
2
+ module Alchemy
3
+ module JsonApi
4
+ class ElementSerializer
5
+ include FastJsonapi::ObjectSerializer
6
+ attributes(
7
+ :name,
8
+ :fixed,
9
+ :position,
10
+ :created_at,
11
+ :updated_at,
12
+ )
13
+ belongs_to :parent_element, record_type: :element, serializer: self
12
14
 
13
- belongs_to :page
14
- has_many :essences, polymorphic: true do |element|
15
- element.contents.map(&:essence)
16
- end
15
+ belongs_to :page
16
+ has_many :essences, polymorphic: true do |element|
17
+ element.contents.map(&:essence)
18
+ end
17
19
 
18
- has_many :nested_elements, record_type: :element, serializer: self
20
+ has_many :nested_elements, record_type: :element, serializer: self
19
21
 
20
- with_options if: ->(_, params) { params[:admin] == true } do
21
- attribute :tag_list
22
- attribute :display_name, &:display_name_with_preview_text
22
+ with_options if: ->(_, params) { params[:admin] == true } do
23
+ attribute :tag_list
24
+ attribute :display_name, &:display_name_with_preview_text
25
+ end
23
26
  end
24
27
  end
25
28
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  require "alchemy/json_api/essence_serializer"
3
3
 
4
- module Alchemy::JsonApi
5
- class EssenceBooleanSerializer
6
- include EssenceSerializer
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssenceBooleanSerializer
7
+ include EssenceSerializer
8
+ end
7
9
  end
8
10
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  require "alchemy/json_api/essence_serializer"
3
3
 
4
- module Alchemy::JsonApi
5
- class EssenceDateSerializer
6
- include EssenceSerializer
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssenceDateSerializer
7
+ include EssenceSerializer
8
+ end
7
9
  end
8
10
  end
@@ -1,30 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
  require "alchemy/json_api/essence_serializer"
3
- require "alchemy/json_api/link_helper"
4
3
 
5
- module Alchemy::JsonApi
6
- class EssenceFileSerializer
7
- include EssenceSerializer
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssenceFileSerializer
7
+ include EssenceSerializer
8
8
 
9
- attribute :link_title, &:title
9
+ attribute :link_title, &:title
10
10
 
11
- attribute :ingredient, &:attachment_url
11
+ attribute :ingredient, &:attachment_url
12
12
 
13
- with_options if: proc { |essence| essence.attachment.present? } do
14
- attribute :attachment_name do |essence|
15
- essence.attachment.name
16
- end
13
+ with_options if: proc { |essence| essence.attachment.present? } do
14
+ attribute :attachment_name do |essence|
15
+ essence.attachment.name
16
+ end
17
17
 
18
- attribute :attachment_file_name do |essence|
19
- essence.attachment.file_name
20
- end
18
+ attribute :attachment_file_name do |essence|
19
+ essence.attachment.file_name
20
+ end
21
21
 
22
- attribute :attachment_mime_type do |essence|
23
- essence.attachment.file_mime_type
24
- end
22
+ attribute :attachment_mime_type do |essence|
23
+ essence.attachment.file_mime_type
24
+ end
25
25
 
26
- attribute :attachment_file_size do |essence|
27
- essence.attachment.file_size
26
+ attribute :attachment_file_size do |essence|
27
+ essence.attachment.file_size
28
+ end
28
29
  end
29
30
  end
30
31
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  require "alchemy/json_api/essence_serializer"
3
3
 
4
- module Alchemy::JsonApi
5
- class EssenceHtmlSerializer
6
- include EssenceSerializer
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssenceHtmlSerializer
7
+ include EssenceSerializer
8
+ end
7
9
  end
8
10
  end
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
  require "alchemy/json_api/essence_serializer"
3
3
 
4
- module Alchemy::JsonApi
5
- class EssenceLinkSerializer
6
- include EssenceSerializer
7
- attributes(
8
- :link_title,
9
- :link_target,
10
- )
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssenceLinkSerializer
7
+ include EssenceSerializer
8
+ attributes(
9
+ :link_title,
10
+ :link_target,
11
+ )
12
+ end
11
13
  end
12
14
  end
@@ -1,32 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
  require "alchemy/json_api/essence_serializer"
3
- require "alchemy/json_api/link_helper"
4
3
 
5
- module Alchemy::JsonApi
6
- class EssenceNodeSerializer
7
- include EssenceSerializer
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssenceNodeSerializer
7
+ include EssenceSerializer
8
8
 
9
- attribute :ingredient do |essence|
10
- essence&.node&.name
11
- end
9
+ attribute :ingredient do |essence|
10
+ essence&.node&.name
11
+ end
12
12
 
13
- belongs_to :node
13
+ belongs_to :node
14
14
 
15
- with_options if: proc { |essence| essence.node.present? } do
16
- attribute :name do |essence|
17
- essence.node.name
18
- end
15
+ with_options if: proc { |essence| essence.node.present? } do
16
+ attribute :name do |essence|
17
+ essence.node.name
18
+ end
19
19
 
20
- attribute :link_url do |essence|
21
- essence.node.url
22
- end
20
+ attribute :link_url do |essence|
21
+ essence.node.url
22
+ end
23
23
 
24
- attribute :link_title do |essence|
25
- essence.node.title
26
- end
24
+ attribute :link_title do |essence|
25
+ essence.node.title
26
+ end
27
27
 
28
- attribute :link_nofollow do |essence|
29
- essence.node.nofollow
28
+ attribute :link_nofollow do |essence|
29
+ essence.node.nofollow
30
+ end
30
31
  end
31
32
  end
32
33
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ require "alchemy/json_api/essence_serializer"
3
+
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssencePageSerializer
7
+ include EssenceSerializer
8
+
9
+ attribute :ingredient do |essence|
10
+ essence.page&.url_path
11
+ end
12
+
13
+ attribute :page_name do |essence|
14
+ essence.page&.name
15
+ end
16
+
17
+ attribute :page_url do |essence|
18
+ essence.page&.url_path
19
+ end
20
+
21
+ has_one :page, record_type: :page, serializer: PageSerializer
22
+ end
23
+ end
24
+ end
@@ -1,40 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
  require "alchemy/json_api/essence_serializer"
3
- require "alchemy/json_api/link_helper"
4
3
 
5
- module Alchemy::JsonApi
6
- class EssencePictureSerializer
7
- include EssenceSerializer
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssencePictureSerializer
7
+ include EssenceSerializer
8
8
 
9
- attributes(
10
- :title,
11
- :caption,
12
- :link_title,
13
- :link_target,
14
- )
15
- attribute :ingredient, &:picture_url
16
- attribute :alt_text, &:alt_tag
17
- attribute :link_url, &:link
9
+ attributes(
10
+ :title,
11
+ :caption,
12
+ :link_title,
13
+ :link_target,
14
+ )
15
+ attribute :ingredient, &:picture_url
16
+ attribute :alt_text, &:alt_tag
17
+ attribute :link_url, &:link
18
18
 
19
- with_options if: proc { |essence| essence.picture.present? } do
20
- attribute :image_dimensions do |essence|
21
- essence.sizes_from_string(essence.render_size)
22
- end
19
+ with_options if: proc { |essence| essence.picture.present? } do
20
+ attribute :image_dimensions do |essence|
21
+ essence.sizes_from_string(essence.render_size)
22
+ end
23
23
 
24
- attribute :image_name do |essence|
25
- essence.picture.name
26
- end
24
+ attribute :image_name do |essence|
25
+ essence.picture.name
26
+ end
27
27
 
28
- attribute :image_file_name do |essence|
29
- essence.picture.image_file_name
30
- end
28
+ attribute :image_file_name do |essence|
29
+ essence.picture.image_file_name
30
+ end
31
31
 
32
- attribute :image_mime_type do |essence|
33
- "image/#{essence.picture.image_file_format}"
34
- end
32
+ attribute :image_mime_type do |essence|
33
+ "image/#{essence.picture.image_file_format}"
34
+ end
35
35
 
36
- attribute :image_file_size do |essence|
37
- essence.picture.image_file_size
36
+ attribute :image_file_size do |essence|
37
+ essence.picture.image_file_size
38
+ end
38
39
  end
39
40
  end
40
41
  end
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
  require "alchemy/json_api/essence_serializer"
3
3
 
4
- module Alchemy::JsonApi
5
- class EssenceRichtextSerializer
6
- include EssenceSerializer
7
- attributes(
8
- :body,
9
- :stripped_body,
10
- )
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssenceRichtextSerializer
7
+ include EssenceSerializer
8
+ attributes(
9
+ :body,
10
+ :stripped_body,
11
+ )
12
+ end
11
13
  end
12
14
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  require "alchemy/json_api/essence_serializer"
3
3
 
4
- module Alchemy::JsonApi
5
- class EssenceSelectSerializer
6
- include EssenceSerializer
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssenceSelectSerializer
7
+ include EssenceSerializer
8
+ end
7
9
  end
8
10
  end
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
  require "alchemy/json_api/essence_serializer"
3
3
 
4
- module Alchemy::JsonApi
5
- class EssenceTextSerializer
6
- include EssenceSerializer
7
- attributes(
8
- :body,
9
- :link_title,
10
- :link_target,
11
- )
12
- attribute :link_url, &:link
4
+ module Alchemy
5
+ module JsonApi
6
+ class EssenceTextSerializer
7
+ include EssenceSerializer
8
+ attributes(
9
+ :body,
10
+ :link_title,
11
+ :link_target,
12
+ )
13
+ attribute :link_url, &:link
14
+ end
13
15
  end
14
16
  end
@@ -9,7 +9,7 @@ module Alchemy
9
9
  attribute :link_title, &:title
10
10
  attribute :link_nofollow, &:nofollow
11
11
 
12
- belongs_to :parent, record_type: :node
12
+ belongs_to :parent, record_type: :node, serializer: self
13
13
 
14
14
  has_many :children, record_type: :node, serializer: self
15
15
  end
@@ -18,6 +18,7 @@ module Alchemy
18
18
  belongs_to :language
19
19
 
20
20
  has_many :elements
21
+ has_many :fixed_elements, record_type: :element, serializer: ElementSerializer
21
22
 
22
23
  has_many :all_elements, record_type: :element, serializer: ElementSerializer do |page|
23
24
  page.all_elements.select { |e| e.public? && !e.trashed? }
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  Alchemy::JsonApi::Engine.routes.draw do
3
- resources :pages, only: [:show, :index]
4
- resources :layout_pages, only: [:show, :index]
3
+ resources :pages, only: [:index]
4
+ get "pages/*path" => "pages#show", as: :page
5
+ resources :layout_pages, only: [:index]
6
+ get "layout_pages/*path" => "layout_pages#show", as: :layout_page
5
7
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ RSpec.shared_examples "an essence serializer" do
3
+ describe "attributes" do
4
+ subject { serializer.serializable_hash[:data][:attributes] }
5
+
6
+ it "has the right keys and values" do
7
+ expect(subject).to have_key(:ingredient)
8
+ end
9
+ end
10
+
11
+ describe "relationships" do
12
+ subject { serializer.serializable_hash[:data][:relationships] }
13
+
14
+ it "has the right keys and values" do
15
+ expect(subject[:element]).to eq(data: { id: essence.element.id.to_s, type: :element })
16
+ end
17
+ end
18
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module Alchemy
3
3
  module JsonApi
4
- VERSION = "0.1.0"
4
+ VERSION = "0.6.0"
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alchemy-json_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Meyerhoff
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-15 00:00:00.000000000 Z
11
+ date: 2020-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: alchemy_cms
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '5.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '5.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: fast_jsonapi
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: github_changelog_generator
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: jsonapi-rspec
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -114,6 +128,7 @@ files:
114
128
  - app/serializers/alchemy/json_api/essence_html_serializer.rb
115
129
  - app/serializers/alchemy/json_api/essence_link_serializer.rb
116
130
  - app/serializers/alchemy/json_api/essence_node_serializer.rb
131
+ - app/serializers/alchemy/json_api/essence_page_serializer.rb
117
132
  - app/serializers/alchemy/json_api/essence_picture_serializer.rb
118
133
  - app/serializers/alchemy/json_api/essence_richtext_serializer.rb
119
134
  - app/serializers/alchemy/json_api/essence_select_serializer.rb
@@ -125,14 +140,14 @@ files:
125
140
  - lib/alchemy/json_api.rb
126
141
  - lib/alchemy/json_api/engine.rb
127
142
  - lib/alchemy/json_api/essence_serializer.rb
128
- - lib/alchemy/json_api/link_helper.rb
143
+ - lib/alchemy/json_api/test_support/essence_serializer_behaviour.rb
129
144
  - lib/alchemy/json_api/version.rb
130
145
  - lib/tasks/alchemy/json_api_tasks.rake
131
146
  homepage: https://github.com/AlchemyCMS/alchemy-json_api
132
147
  licenses:
133
148
  - MIT
134
149
  metadata: {}
135
- post_install_message:
150
+ post_install_message:
136
151
  rdoc_options: []
137
152
  require_paths:
138
153
  - lib
@@ -148,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
163
  version: '0'
149
164
  requirements: []
150
165
  rubygems_version: 3.0.3
151
- signing_key:
166
+ signing_key:
152
167
  specification_version: 4
153
168
  summary: A JSONAPI compliant API for AlchemyCMS
154
169
  test_files: []
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
- module Alchemy
3
- module JsonApi
4
- module LinkHelper
5
- def alchemy_link(path_base, object)
6
- return unless object
7
-
8
- if Rails.application.routes.default_url_options[:host]
9
- Alchemy::Engine.routes.url_helpers.public_send("#{path_base}_url", object)
10
- else
11
- Alchemy::Engine.routes.url_helpers.public_send("#{path_base}_path", object)
12
- end
13
- end
14
- end
15
- end
16
- end