active_mappers 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []