activerepresenter 0.0.11 → 0.0.12

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: b592059f12e5734bf96383fd5a7bd65c065bfa001e34d3d7d2a6bcaae6e0290b
4
- data.tar.gz: '095ee8b5512068f30acf67bf3d5bf899e344f16836293de858441a58e209c7b5'
3
+ metadata.gz: a2e128c54484aca4628ca948c70a1fa07c3a2d78903027635f3c026ea26f80ba
4
+ data.tar.gz: d1fdca6b47e8a057e1158e5b3868d869e17ae92a69f331cc955e9bc55b204b86
5
5
  SHA512:
6
- metadata.gz: a4f4c3645d5176965bb6220fb96405d4a31453673ba36f46e9dd1116bf8bcd1f476de843cf415cadc724c8cc0619da680feb44fc8868e6e4728b2d7a47192f5f
7
- data.tar.gz: 3da8b295cb4a9a2edbe427db6d8442c58a16d594af53c2d01dd9714eb6a8c53c3aa1440ab4ff845e8d974f081dfef888f701ec31fcbdda5637cae0ba94b69153
6
+ metadata.gz: c367b0d38d9d201939822614ecf57d4b7d3d050ff18dcf9108b6b4a1408226be886bd92ef2bb2a4ee394ea43f6cae6dc2caefc48212e9c5238483a630f10153f
7
+ data.tar.gz: 1dfa1d789f3ceb7ad3650bec72e946d74ce628682fd97f3e027b811ab1f28b43ee16dfe4342de52a11a119347f49841068264c168b11a28e3e87773d37b0ef5c
@@ -1,15 +1,57 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/core_ext/class/attribute"
3
4
  require "active_support/core_ext/module/delegation"
5
+ require "active_support/inflector"
4
6
 
5
7
  module ActiveRepresenter
6
8
  class Base
7
9
  attr_reader :wrapped
10
+ class_attribute :collections, default: {}
8
11
 
9
12
  delegate_missing_to :wrapped
10
13
 
11
14
  def initialize(wrapped)
12
15
  @wrapped = wrapped
16
+ self.class.collection_names.each do |collection_name|
17
+ next if wrapped[collection_name].nil?
18
+ representer = self.class.collections[collection_name]
19
+ collection_value = \
20
+ if representer
21
+ wrapped[collection_name].map { |item| representer.new(item) }
22
+ else
23
+ wrapped[collection_name]
24
+ end
25
+ instance_variable_set("@#{collection_name}", collection_value)
26
+ end
27
+ end
28
+
29
+ class << self
30
+ def attr_collection(name, **options)
31
+ unless name.is_a?(Symbol) || name.is_a?(String)
32
+ raise ArgumentError.new("collection's name must be a Symbol or a String")
33
+ end
34
+ representer_name = \
35
+ options[:representer_name] ? options[:representer_name] : guess_representrer_name(name.to_s)
36
+ raise ArgumentError.new("representer_name must be a String") unless representer_name.is_a?(String)
37
+ begin
38
+ representer = representer_name.constantize
39
+ collections[name.to_sym] = representer
40
+ rescue NameError => e
41
+ collections[name.to_sym] = nil
42
+ end
43
+ class_eval do
44
+ attr_reader name.to_sym
45
+ end
46
+ end
47
+
48
+ def collection_names
49
+ collections.keys
50
+ end
51
+
52
+ def guess_representrer_name(name)
53
+ "#{name.singularize.camelize}Representer"
54
+ end
13
55
  end
14
56
  end
15
57
  end
@@ -0,0 +1,74 @@
1
+ require "test/unit"
2
+ require_relative "../lib/active_representer/base.rb"
3
+ require "ostruct"
4
+ require "active_support/time"
5
+
6
+ class ActivityRepresenter < ActiveRepresenter::Base
7
+ def created_on
8
+ created_at.to_date
9
+ end
10
+ end
11
+
12
+ class UserRepresenter < ActiveRepresenter::Base
13
+ attr_collection :activities
14
+ attr_collection :notifications
15
+
16
+ def full_name
17
+ "#{first_name} #{last_name}"
18
+ end
19
+ end
20
+
21
+ class CollectionTest < Test::Unit::TestCase
22
+ test ".new does not raise error" do
23
+ user = OpenStruct.new(first_name: 'John', last_name: 'Appleseed')
24
+ assert_nothing_raised { UserRepresenter.new(user) }
25
+ end
26
+
27
+ test "#full_name returns John Appleseed" do
28
+ user = OpenStruct.new(first_name: 'John', last_name: 'Appleseed')
29
+ representer = UserRepresenter.new(user)
30
+ assert_equal(representer.full_name, 'John Appleseed')
31
+ end
32
+
33
+ test ".new does not raise error when activities are specified" do
34
+ user = OpenStruct.new(
35
+ first_name: 'John',
36
+ last_name: 'Appleseed',
37
+ activities: [OpenStruct.new(created_at: Time.now)]
38
+ )
39
+ assert_nothing_raised { UserRepresenter.new(user) }
40
+ end
41
+
42
+ test "activity is represented" do
43
+ user = OpenStruct.new(
44
+ first_name: 'John',
45
+ last_name: 'Appleseed',
46
+ activities: [OpenStruct.new(created_at: Time.now)]
47
+ )
48
+ representer = UserRepresenter.new(user)
49
+ activity = representer.activities.first
50
+ assert_instance_of(ActivityRepresenter, activity)
51
+ end
52
+
53
+ test "activity.created_on is Date.today" do
54
+ user = OpenStruct.new(
55
+ first_name: 'John',
56
+ last_name: 'Appleseed',
57
+ activities: [OpenStruct.new(created_at: Time.now)]
58
+ )
59
+ representer = UserRepresenter.new(user)
60
+ activity = representer.activities.first
61
+ assert_equal(activity.created_on, Date.today)
62
+ end
63
+
64
+ test "notification is not represented" do
65
+ user = OpenStruct.new(
66
+ first_name: 'John',
67
+ last_name: 'Appleseed',
68
+ notifications: [OpenStruct.new(created_at: Time.now)]
69
+ )
70
+ representer = UserRepresenter.new(user)
71
+ notification = representer.notifications.first
72
+ assert_instance_of(OpenStruct, notification)
73
+ end
74
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerepresenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Hashimoto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-12 00:00:00.000000000 Z
11
+ date: 2018-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,6 +70,7 @@ files:
70
70
  - lib/active_representer/base.rb
71
71
  - lib/activerepresenter.rb
72
72
  - test/base_test.rb
73
+ - test/collection_test.rb
73
74
  - test/inheritance_test.rb
74
75
  homepage: https://github.com/ryohashimoto/lightrails
75
76
  licenses:
@@ -98,4 +99,5 @@ summary: Active Representer provides model objects by decorating objects (part o
98
99
  Lightrails).
99
100
  test_files:
100
101
  - test/base_test.rb
102
+ - test/collection_test.rb
101
103
  - test/inheritance_test.rb