active_mappers 0.1.0

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/active_mappers.rb +74 -0
  3. metadata +58 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 551fd8305d3de3d381f77d717df03ac638caad18a4e47b77f10d2ffeadc043bf
4
+ data.tar.gz: a40faf14581ed332a47fc203d5d1337a3601911900370579d6e5738aada567a6
5
+ SHA512:
6
+ metadata.gz: 7b06feb9e8cb61b0ccd212e319604b9554f4d3523902b4d1203c2fbc64a4d00d69f3bf3057e176280d2e90adc38fc563feb83810791dcef76bb2f92bb3daf008
7
+ data.tar.gz: '09bd733c3850edb62cf5da5fd49c0c90b8c63a2e5ba3968fd4f90d00c0740b152d3357dc10e1ecc93dd0c2508253be91235ad45c408c6ee5067bd323c43006bf'
@@ -0,0 +1,74 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext/object/try'
3
+ require 'active_support/core_ext/string/inflections'
4
+ require_relative 'core_ext/hash'
5
+
6
+ module ActiveMappers
7
+ class Base
8
+ @@renderers = {}
9
+
10
+ def self.attributes(*params)
11
+ each do |resource|
12
+ h = {}
13
+ params.each do |param|
14
+ h[param] = resource.try(param)
15
+ end
16
+ h
17
+ end
18
+ end
19
+
20
+ def self.delegate(*params)
21
+ delegator = params.last[:to]
22
+ params.pop
23
+ each do |resource|
24
+ h = {}
25
+ params.each do |param|
26
+ h[param] = delegator.to_s.split('.').inject(resource, :try).try(param)
27
+ end
28
+ h
29
+ end
30
+ end
31
+
32
+ def self.relation(key, mapper = nil, optional_path = nil)
33
+ path = optional_path || key
34
+
35
+ each do |resource|
36
+ mapper ||= "::#{resource.send(key).class.name}Mapper".constantize
37
+ { key => mapper.with(path.to_s.split('.').inject(resource, :try)) }
38
+ end
39
+ end
40
+
41
+ def self.polymorphic(key)
42
+ each do |resource|
43
+ resource_mapper = "::#{resource.send("#{key}_type")}Mapper".constantize
44
+ { key => resource_mapper.with(resource.send(key)) }
45
+ end
46
+ end
47
+
48
+ def self.acts_as_polymorph
49
+ each do |resource|
50
+ mapper = "::#{resource.class}Mapper".constantize
51
+ mapper.with(resource)
52
+ rescue NameError
53
+ raise NotImplementedError, 'No mapper found for this type of resource'
54
+ end
55
+ end
56
+
57
+ def self.each(&block)
58
+ @@renderers[name] = (@@renderers[name] || []) << block
59
+ end
60
+
61
+ def self.with(args)
62
+ args.respond_to?(:each) ? all(args) : one(args)
63
+ end
64
+
65
+ def self.all(collection)
66
+ collection.map { |el| one(el) }
67
+ end
68
+
69
+ def self.one(resource)
70
+ renderers = @@renderers[name].map { |renderer| renderer.call(resource) }
71
+ renderers.reduce(&:merge).to_lower_camel_case
72
+ end
73
+ end
74
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_mappers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Michaël Villeneuve
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-10-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ description: Fast, simple, declarative way to design your API's view layer
28
+ email: contact@michaelvilleneuve.fr
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/active_mappers.rb
34
+ homepage: http://rubygems.org/gems/active_mappers
35
+ licenses:
36
+ - MIT
37
+ metadata: {}
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubyforge_project:
54
+ rubygems_version: 2.7.3
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: Slick, fast view layer for you Rails API.
58
+ test_files: []