trax_controller 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f7d9526c744bfe5c3fa8be7f2106155174db9c8e
4
- data.tar.gz: bb1732ba4d04abd00ffc47a71f7f558c8970ca5a
2
+ SHA256:
3
+ metadata.gz: ed00dea1fdfcffa650fe001af13c9903a9e8cea3f8bcfaa1c944440c2ef8d293
4
+ data.tar.gz: f34a3dcd374fb0adddb5b126cc5e1f9a5ab69520ac1902e8b5399a2bf1e475cc
5
5
  SHA512:
6
- metadata.gz: 70a24b9ba1ec688b01f5b9e66f0e90866c34b7000531ca8112bea2fab69965086e0c48a31d367ce1d48e360745ef2c3cbfbe7a3f22064eb6cd22e95dc4da027a
7
- data.tar.gz: 2b601a8431f1e63349d59ee9dbf2bd8008f7d4562641a15a5ac1d1f6293d6a4beb1843a1c0b5e4d17dc30b8a703d8ec945870bfb5d327e09b25e812d8de72aca
6
+ metadata.gz: 9ff8023e73a5c5d27b0f337fccdc0f337fb5f4f91ec3e3ebbd5a4bce75c9fefa4c3373159848e86867ee3686e662e0eda6cec8814ac2f8cb830a5632731f34eb
7
+ data.tar.gz: 658915adb99f4b46f3fdb160abe4b217dccad146584df53949ddc47708ac3f9761bd7eb1baaae46e30d2b3d5619d4e998aa45a1380b38d31814bad7be55ba5b2
data/.gitignore CHANGED
@@ -7,8 +7,10 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /vendor/
10
11
  *.bundle
11
12
  *.so
12
13
  *.o
13
14
  *.a
15
+ *.sqlite
14
16
  mkmf.log
data/Gemfile CHANGED
@@ -2,8 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in trax_controller.gemspec
4
4
  gemspec
5
- # gem 'active_model_serializers', :github => 'rails-api/active_model_serializers', :branch => "0-10-stable"
6
- gem 'active_model_serializers', :github => 'rails-api/active_model_serializers', :branch => "0-10-stable", :ref => "6aba26049154712d65176708ffad55fcfe512ca0"
7
5
 
8
6
  group :test do
9
7
  gem 'activerecord'
@@ -2,7 +2,7 @@ module Trax
2
2
  module Controller
3
3
  class Engine < ::Rails::Engine
4
4
  initializer 'trax_controller.active_model_serializers' do |app|
5
- ::ActiveModel::Serializer.config.adapter = Trax::Controller::Serialization::Adapters::Json
5
+ ::ActiveModel::Serializer.config.adapter = ::Trax::Controller::Serialization::Adapters::Json
6
6
  end
7
7
  end
8
8
  end
@@ -0,0 +1,54 @@
1
+ module Trax
2
+ module Controller
3
+ module PermitParamsFor
4
+ extend ::ActiveSupport::Concern
5
+
6
+ # Allows you to permit params by creating a Trax::Core::Types::Struct
7
+ # https://github.com/jasonayre/trax_core/blob/master/lib/trax/core/types/struct.rb
8
+ # permitted_params_for_action :create do
9
+ # string :title
10
+ # end
11
+
12
+ included do
13
+ class_attribute :trax_params_permitters
14
+ self.trax_params_permitters = {}
15
+ end
16
+
17
+ def params_permitter_for_action
18
+ action = params[:action]
19
+ return self.trax_params_permitters[action.to_sym] if self.trax_params_permitters.key?(action.to_sym)
20
+ return self.trax_params_permitters[:save] if self.trax_params_permitters.key?(:save) && (action == 'create' || action == 'update' || action == 'first_or_create')
21
+ raise StandardError.new("No param permitter defined for action #{action}")
22
+ end
23
+
24
+ def build_resource_params
25
+ _params = request.parameters[resource_request_name]
26
+ self.class.trax_params_permitters[action_name.to_sym].new(_params).to_serializable_hash
27
+ end
28
+
29
+ def build_resource
30
+ get_resource_ivar || set_resource_ivar(end_of_association_chain.send(method_for_build, resource_params))
31
+ end
32
+
33
+ def update_resource(object, attributes)
34
+ object.update(attributes)
35
+ end
36
+
37
+ module ClassMethods
38
+ def permitted_params_for_action(action_name, &block)
39
+ _klass = ::Trax::Core::NamedClass.new("#{self.name}::PermittedParamsForAction#{action_name.to_s.classify}", Trax::Core::Types::Struct, &block)
40
+ self.trax_params_permitters[action_name] = _klass
41
+ end
42
+
43
+ def permitted_params_for_save(&block)
44
+ _update_klass = ::Trax::Core::NamedClass.new("#{self.name}::PermittedParamsForActionUpdate", Trax::Core::Types::Struct, &block)
45
+ _create_klass = ::Trax::Core::NamedClass.new("#{self.name}::PermittedParamsForActionCreate", Trax::Core::Types::Struct, &block)
46
+ _first_or_create_klass = ::Trax::Core::NamedClass.new("#{self.name}::PermittedParamsForActionFirstOrCreate", Trax::Core::Types::Struct, &block)
47
+ self.trax_params_permitters[:update] = _update_klass
48
+ self.trax_params_permitters[:create] = _create_klass
49
+ self.trax_params_permitters[:first_or_create] = _first_or_create_klass
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,60 +1,11 @@
1
- # This adapter is a workaround for
2
- # https://github.com/rails-api/active_model_serializers/issues/835 until
3
- # https://github.com/rails-api/active_model_serializers/pull/952 is merged
4
-
5
1
  module Trax
6
2
  module Controller
7
3
  module Serialization
8
4
  module Adapters
9
- class Json < ActiveModel::Serializer::Adapter::Json
10
- def serializable_hash(options={})
11
- result = is_collection? ? collection_serializable_hash(options) : resource_serializable_hash(options)
12
- @options[:nested] ? result : { root => result }
13
- end
14
-
15
- private
16
-
17
- def get_hash(serializer, options={})
18
- self.class.new(serializer, :nested => true).serializable_hash(options)
19
- end
20
-
21
- def collection_serializable_hash(options={})
22
- serializer.map { |s| get_hash(s, options) }
23
- end
24
-
25
- def is_collection?
26
- serializer.respond_to?(:each)
27
- end
28
-
29
- def resource_serializable_hash(options={})
30
- cached = cache_check(serializer){ serializer.attributes(options) }
31
- resource_result = serialize_resource_associations
32
- cached.merge(resource_result)
33
- end
34
-
35
- def serialize_resource_associations
36
- resource_result = {}
37
-
38
- serializer.associations.each do |association|
39
- association_serializer = association.serializer
40
- association_options = association.options
41
-
42
- if association_serializer.respond_to?(:each)
43
- array_serializer = association_serializer
44
-
45
- resource_result[association.key] = array_serializer.map do |item|
46
- cache_check(item) { get_hash(item) }
47
- end
48
- else
49
- resource_result[association.key] = if association_serializer && association_serializer.object
50
- cache_check(association_serializer) { get_hash(association_serializer) }
51
- elsif association_options[:virtual_value]
52
- association_options[:virtual_value]
53
- end
54
- end
55
- end
56
-
57
- resource_result
5
+ class Json < ::ActiveModelSerializers::Adapter::Json
6
+ def initialize(serializer, options = {})
7
+ super
8
+ options[:include] = "**"
58
9
  end
59
10
  end
60
11
  end
@@ -24,6 +24,7 @@ module Trax
24
24
  autoload :Resource
25
25
  autoload :InheritResources
26
26
  autoload :ActionTypes
27
+ autoload :PermitParamsFor
27
28
  autoload :Serialization
28
29
 
29
30
  @configuration ||= ::Trax::Controller::Config.new
@@ -1,3 +1,3 @@
1
1
  module TraxController
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -33,6 +33,10 @@ class CategoriesController < ::ApplicationController
33
33
  show(serializer: ::CategoriesSerializer, root: 'show_by_calling_original_action')
34
34
  end
35
35
 
36
+ def product_with_category
37
+ render_resource(serializer: ::ProductWithCategorySerializer, root: 'product', resource: Product.find(params[:id]))
38
+ end
39
+
36
40
  private
37
41
 
38
42
  def category_params
@@ -2,7 +2,7 @@ class CategorySerializer < ::ActiveModel::Serializer
2
2
  attributes :name, :slug
3
3
 
4
4
  def slug
5
- name.parameterize('-')
5
+ object.name.parameterize('-')
6
6
  end
7
7
 
8
8
  has_many :products, :serializer => ::ProductSerializer
@@ -0,0 +1,4 @@
1
+ class CategoryWithSubcategorySerializer < ::ActiveModel::Serializer
2
+ attributes :name
3
+ has_many :subcategories, :serializer => CategoryWithSubcategorySerializer
4
+ end
@@ -0,0 +1,6 @@
1
+ require "category_with_subcategories_serializer"
2
+
3
+ class ProductWithCategorySerializer < ::ActiveModel::Serializer
4
+ attributes :name
5
+ has_one :category, :serializer => CategoryWithSubcategorySerializer
6
+ end
@@ -13,6 +13,7 @@ Rails.application.routes.draw do
13
13
  get 'show_by_calling_original_action'
14
14
  get 'widget'
15
15
  get 'widget_with_renamed_root'
16
+ get 'product_with_category'
16
17
  end
17
18
  end
18
19
  end
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+
2
3
  describe ::Trax::Controller do
3
4
 
4
5
  end
@@ -2,11 +2,14 @@ require 'spec_helper'
2
2
 
3
3
  ::RSpec.describe CategoriesController, :type => :controller do
4
4
  before(:all) do
5
- @shoes_category = ::Category.create(:name => 'mens shoes')
6
- @watches_category = ::Category.create(:name => 'mens watches')
7
-
8
- @product1 = ::Product.create(:name => "DC Villan", :quantity => 0, :in_stock => false, :category => @shoes_category)
9
- @product2 = ::Product.create(:name => "Nixon Rotolog", :quantity => 2, :in_stock => true, :category => @watches_category)
5
+ @shoes_category = ::Category.create!(:name => 'mens shoes')
6
+ @watches_category = ::Category.create!(:name => 'mens watches')
7
+ @apparels_category = ::Category.create!(:name => 'mens apparels')
8
+ @shirts_category = @apparels_category.subcategories.create(:name => 'mens shirts')
9
+
10
+ @product1 = ::Product.create!(:name => "DC Villan", :quantity => 0, :in_stock => false, :category => @shoes_category)
11
+ @product2 = ::Product.create!(:name => "Nixon Rotolog", :quantity => 2, :in_stock => true, :category => @watches_category)
12
+ @product3 = ::Product.create!(:name => "T-Shirt", :quantity => 3, :in_stock => true, :category => @apparels_category)
10
13
  end
11
14
 
12
15
  context '#index' do
@@ -69,6 +72,24 @@ require 'spec_helper'
69
72
  expect(json["show_by_calling_original_action"]["name"]).to eq @shoes_category.name
70
73
  end
71
74
  end
75
+
76
+ describe "#product_with_category" do
77
+ it "deeply serializes" do
78
+ get :product_with_category, :id => @product3.id
79
+ json = ::JSON.parse(response.body)
80
+ expect(json["product"]).to eq(
81
+ "name" => @product3.name,
82
+ "category" => {
83
+ "name" => @apparels_category.name,
84
+ "subcategories" => [
85
+ { "name" => @shirts_category.name,
86
+ "subcategories" => []
87
+ }
88
+ ]
89
+ }
90
+ )
91
+ end
92
+ end
72
93
  end
73
94
 
74
95
  context '#create_with_modified_resource' do
@@ -1,15 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
- class NameCategorySerializer < ::ActiveModel::Serializer
4
- attributes :name
5
- has_many :subcategories, :serializer => NameCategorySerializer
6
- end
7
-
8
- class NameProductSerializer < ::ActiveModel::Serializer
9
- attributes :name
10
- has_one :category, :serializer => NameCategorySerializer
11
- end
12
-
13
3
  describe Trax::Controller::Serialization::Adapters::Json do
14
4
  let(:category_flat_heads){ ::Category.new(:name => "flat heads") }
15
5
  let(:category_screwdrivers){ ::Category.new(:name => "screwdrivers", :subcategories => [category_flat_heads]) }
@@ -17,7 +7,7 @@ describe Trax::Controller::Serialization::Adapters::Json do
17
7
  let(:category_tools){ ::Category.new(:name => "tools", :subcategories => [category_screwdrivers, category_knives]) }
18
8
  let(:product_tool){ ::Product.new(:name => "Generics Multi-Purpose Tool", :category => category_tools) }
19
9
  let(:root_key){ 'root_key' }
20
- let(:serializer){ ::NameProductSerializer.new(product_tool, :root => root_key) }
10
+ let(:serializer){ ::ProductWithCategorySerializer.new(product_tool, :root => root_key) }
21
11
  let!(:expected_root_key){ root_key.to_sym }
22
12
  let!(:expected_tool_hash){ {
23
13
  :name => product_tool.name,
@@ -40,7 +30,7 @@ describe Trax::Controller::Serialization::Adapters::Json do
40
30
  let(:category_cookware){ ::Category.new(:name => "cookware") }
41
31
  let(:product_pot){ ::Product.new(:name => "Pot", :category => category_cookware) }
42
32
  let(:collection){ [product_tool, product_pot] }
43
- let!(:expected_root_key){ root_key.pluralize.to_sym }
33
+ let(:root_key){ 'root_keys' }
44
34
  let!(:expected_pot_hash){ {
45
35
  :name => product_pot.name,
46
36
  :category => {
@@ -48,7 +38,7 @@ describe Trax::Controller::Serialization::Adapters::Json do
48
38
  :subcategories => []
49
39
  }
50
40
  }}
51
- let(:serializer){ ::ActiveModel::Serializer::ArraySerializer.new(collection, :root => root_key, :serializer => ::NameProductSerializer) }
41
+ let(:serializer){ ::ActiveModel::Serializer::CollectionSerializer.new(collection, :root => root_key, :serializer => ::ProductWithCategorySerializer) }
52
42
 
53
43
  it { expect(serialized).to eq(expected_root_key => [expected_tool_hash, expected_pot_hash]) }
54
44
  end
@@ -12,12 +12,14 @@ Gem::Specification.new do |spec|
12
12
  spec.description = %q{Resourceful, standardized controllers}
13
13
  spec.homepage = "http://www.github.com/jasonayre"
14
14
  spec.license = "MIT"
15
+ spec.required_ruby_version = '<= 3.0'
15
16
 
16
17
  spec.files = `git ls-files -z`.split("\x0")
17
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
20
  spec.require_paths = ["lib"]
20
21
 
22
+ spec.add_dependency "active_model_serializers", "~> 0.10"
21
23
  spec.add_dependency "trax_core"
22
24
  spec.add_dependency "will_paginate"
23
25
  spec.add_dependency "has_scope"
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trax_controller
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Ayre
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-03 00:00:00.000000000 Z
11
+ date: 2024-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: active_model_serializers
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.10'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.10'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: trax_core
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -349,6 +363,7 @@ files:
349
363
  - lib/trax/controller/config.rb
350
364
  - lib/trax/controller/engine.rb
351
365
  - lib/trax/controller/inherit_resources.rb
366
+ - lib/trax/controller/permit_params_for.rb
352
367
  - lib/trax/controller/resource.rb
353
368
  - lib/trax/controller/resource/base.rb
354
369
  - lib/trax/controller/resource/response_meta.rb
@@ -368,7 +383,9 @@ files:
368
383
  - spec/internal/app/policies/widget_policy.rb
369
384
  - spec/internal/app/serializers/categories_serializer.rb
370
385
  - spec/internal/app/serializers/category_serializer.rb
386
+ - spec/internal/app/serializers/category_with_subcategories_serializer.rb
371
387
  - spec/internal/app/serializers/product_serializer.rb
388
+ - spec/internal/app/serializers/product_with_category_serializer.rb
372
389
  - spec/internal/app/serializers/widget_serializer.rb
373
390
  - spec/internal/config/database.yml
374
391
  - spec/internal/config/routes.rb
@@ -387,24 +404,23 @@ homepage: http://www.github.com/jasonayre
387
404
  licenses:
388
405
  - MIT
389
406
  metadata: {}
390
- post_install_message:
407
+ post_install_message:
391
408
  rdoc_options: []
392
409
  require_paths:
393
410
  - lib
394
411
  required_ruby_version: !ruby/object:Gem::Requirement
395
412
  requirements:
396
- - - ">="
413
+ - - "<="
397
414
  - !ruby/object:Gem::Version
398
- version: '0'
415
+ version: '3.0'
399
416
  required_rubygems_version: !ruby/object:Gem::Requirement
400
417
  requirements:
401
418
  - - ">="
402
419
  - !ruby/object:Gem::Version
403
420
  version: '0'
404
421
  requirements: []
405
- rubyforge_project:
406
- rubygems_version: 2.5.1
407
- signing_key:
422
+ rubygems_version: 3.5.9
423
+ signing_key:
408
424
  specification_version: 4
409
425
  summary: Resourceful, standardized controllers
410
426
  test_files:
@@ -419,7 +435,9 @@ test_files:
419
435
  - spec/internal/app/policies/widget_policy.rb
420
436
  - spec/internal/app/serializers/categories_serializer.rb
421
437
  - spec/internal/app/serializers/category_serializer.rb
438
+ - spec/internal/app/serializers/category_with_subcategories_serializer.rb
422
439
  - spec/internal/app/serializers/product_serializer.rb
440
+ - spec/internal/app/serializers/product_with_category_serializer.rb
423
441
  - spec/internal/app/serializers/widget_serializer.rb
424
442
  - spec/internal/config/database.yml
425
443
  - spec/internal/config/routes.rb