actionfacade 0.2.1 → 0.2.2

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: cbeefd227bc757cf74621b1d5526369fabc3a2fdb531f6b63f43e4c76f5a287f
4
- data.tar.gz: 8b0bf77381017a78f1dbe3f160662b055b82a9cf330e66509b6e51fbabf82fbd
3
+ metadata.gz: 64d3cea1d22a692b72218f19db02d5d39de09d53a3a5fc98da0803d9bbd217bb
4
+ data.tar.gz: 94ce319ac7540e225e535e89aef50e636359a00c02d1c8bc9ad21cb799767bd2
5
5
  SHA512:
6
- metadata.gz: eddd017a737576e62ef72c738ec994336dae0f751ec340919dfbf2fe39222acd06643e2e96b84c14b3e4e1247adf58ee9402bbc79da95468e9ebc3645ba11fa5
7
- data.tar.gz: 9c97a487c85b5cc65ac17cecc56c6848712f22e9b13cdb0e88c44a78cc98e56b4b4bd1fa45df286cd7124a9fd7ab811801821297a73bb217dbe8105982697c11
6
+ metadata.gz: 6ad6c5032c237f64311a7efd20e8fa26e3ae612a7ccc9e1e258aa8d325c8aa20825de3b1e42dc346ecd10b1c9b3d39ed89a6785e18e031806d9b12d051b37701
7
+ data.tar.gz: d141b6a9fccad09c49dc57eb6d20835be189c3064edfc016f75e1a851a37890ac13f90c14297933d685454b6ce1200d788383573ba888f879ff1ca8aa7c32366
@@ -24,6 +24,7 @@ Gem::Specification.new do |s|
24
24
  s.test_files = s.files.grep(/^test/)
25
25
 
26
26
  s.add_dependency "bundler", ">= 1.3"
27
+ s.add_dependency "activesupport", ">= 5.2"
27
28
  s.add_development_dependency "rake", ">= 12.3.3"
28
29
  s.add_development_dependency "test-unit", ">= 3.3"
29
30
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/core_ext/string/inflections"
4
+
3
5
  module ActionFacade
4
6
  # == Action \Facade \Retrieval
5
7
  #
@@ -19,5 +21,50 @@ module ActionFacade
19
21
  instance_variable_set("@#{name}", facade.send(name.to_sym))
20
22
  end
21
23
  end
24
+
25
+ # Retrieve data from given payload
26
+ #
27
+ # If the class which includes the module is Rails controller,
28
+ # guessed facade name will be "Controller" is replaced by the action name + "Facade".
29
+ # If the class is not Rails controller, the name will be suffixed by "Facade".
30
+ #
31
+ # `payload` is the initialization parameter for the facade.
32
+ #
33
+ # `variable_names` are symbols for the method names in the facade and
34
+ # they will be set as instance variables in the class that
35
+ # includes the module.
36
+ def retrieve_from(payload, *variable_names)
37
+ facade = guess_facade
38
+ if facade.nil?
39
+ raise FacadeNotFoundError.new("Could not find Facade class #{guess_facade_name}.")
40
+ end
41
+ retrieve(facade.new(payload), *variable_names)
42
+ end
43
+
44
+ class FacadeNotFoundError < StandardError; end
45
+
46
+ private
47
+
48
+ def guess_facade
49
+ facade_name = guess_facade_name
50
+ begin
51
+ facade_name.constantize
52
+ rescue NameError
53
+ nil
54
+ end
55
+ end
56
+
57
+ def guess_facade_name
58
+ klass_name = self.class.name
59
+ if klass_name.end_with?("Controller")
60
+ if defined?(params) && params[:action]
61
+ klass_name.delete_suffix("Controller") + "::#{params[:action].camelize}Facade"
62
+ else
63
+ klass_name.delete_suffix("Controller") + "Facade"
64
+ end
65
+ else
66
+ klass_name + "Facade"
67
+ end
68
+ end
22
69
  end
23
70
  end
@@ -2,14 +2,22 @@ require "test/unit"
2
2
  require_relative "../lib/action_facade/base.rb"
3
3
  require_relative "../lib/action_facade/retrieval.rb"
4
4
 
5
- USER_DATA = [{ id: 1, name: "john" }]
5
+ USER_DATA = [{ id: 1, name: "john" }, { id: 2, name: "bob" }]
6
6
 
7
- class UserFacade < ActionFacade::Base
7
+ class UsersFacade < ActionFacade::Base
8
8
  def john
9
9
  USER_DATA.find { |user| user[:name] == "john" }
10
10
  end
11
11
  end
12
12
 
13
+ module Admin
14
+ class ShowFacade < ActionFacade::Base
15
+ def bob
16
+ USER_DATA.find { |user| user[:name] == "bob" }
17
+ end
18
+ end
19
+ end
20
+
13
21
  class UsersController
14
22
  include ActionFacade::Retrieval
15
23
 
@@ -17,9 +25,31 @@ class UsersController
17
25
 
18
26
  def show
19
27
  payload = {}
20
- facade = UserFacade.new(payload)
28
+ facade = UsersFacade.new(payload)
21
29
  retrieve(facade, :john)
22
30
  end
31
+
32
+ def show_from
33
+ payload = {}
34
+ retrieve_from(payload, :john)
35
+ end
36
+ end
37
+
38
+ class AdminController
39
+ include ActionFacade::Retrieval
40
+
41
+ attr_reader :bob
42
+
43
+ def show
44
+ payload = {}
45
+ retrieve_from(payload, :bob)
46
+ end
47
+
48
+ private
49
+
50
+ def params
51
+ { action: 'show' }
52
+ end
23
53
  end
24
54
 
25
55
  class RetrievalTest < Test::Unit::TestCase
@@ -33,4 +63,18 @@ class RetrievalTest < Test::Unit::TestCase
33
63
  controller.show
34
64
  assert_equal(controller.john, { id: 1, name: "john" })
35
65
  end
66
+
67
+ test "@john is set after retrieve_from(payload, :john)" do
68
+ controller = UsersController.new
69
+ assert_nil(controller.john)
70
+ controller.show_from
71
+ assert_equal(controller.john, { id: 1, name: "john" })
72
+ end
73
+
74
+ test "@bob is set after retrieve_from(payload, :bob)" do
75
+ controller = AdminController.new
76
+ assert_nil(controller.bob)
77
+ controller.show
78
+ assert_equal(controller.bob, { id: 2, name: "bob" })
79
+ end
36
80
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: actionfacade
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Hashimoto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-06 00:00:00.000000000 Z
11
+ date: 2020-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '5.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '5.2'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement