activerepresenter 0.0.11 → 0.0.12

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