actionfacade 0.2.1 → 0.2.2

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
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