active_mappers 1.4.7 → 1.5.1

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: d9c952cdc3025177afc55d21f7967db40c7dad0fee5209701332433978d00c65
4
- data.tar.gz: dae057bb4874202b6534ca59d7c0e11ca3765863ed27c9ddd1b83e64baa4bb41
3
+ metadata.gz: 32a8f6aba4888e9ff50871fab7eb457de33f785d5a32758c77bbb01c1ef75d80
4
+ data.tar.gz: a1c03591088552e3bbdf29e291de4e9628c50b06af5a294358935812d2419271
5
5
  SHA512:
6
- metadata.gz: 4fae6b5c455eb0c8eb1798a94dfac64b3bcc8cc82df6761f8669e9f574fdc3efc8e51bcfd862abf9a9293601bf28e8ea2642b55e13ba4a17f4af05efde430085
7
- data.tar.gz: 339571d128963541e8ba5ee0bde89b688b17b409169e03cecdc0afc3787d9b3fe4203a91ec1de32f32a7b87dde75b3d9d3079965934c8383df27f5aaa3b77a13
6
+ metadata.gz: 0b44b4c1097e49c8c4520eff7bf8d64cc5c98709b87ae429f9d53e613ca914e5cf15f4526dddbf422d8f45beaa8c7280ed520cd39e51f0c79b396739fc8d3f3c
7
+ data.tar.gz: f281126bf5b01be6eb640fcde71fbda419d9eed32417af5afd30f4c6f7245ccbbef6bade670bfe176730ce904562088623dd76c9e93b5d199cf675af374e3018
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_mappers (1.4.4)
4
+ active_mappers (1.5.0)
5
5
  activesupport (>= 4.2)
6
6
  method_source (~> 0.9.2)
7
7
  mocha (>= 1.8.0)
@@ -11,31 +11,41 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- activesupport (6.0.1)
14
+ activesupport (7.1.3)
15
+ base64
16
+ bigdecimal
15
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
16
- i18n (>= 0.7, < 2)
17
- minitest (~> 5.1)
18
- tzinfo (~> 1.1)
19
- zeitwerk (~> 2.2)
20
- concurrent-ruby (1.1.5)
21
- i18n (1.7.0)
18
+ connection_pool (>= 2.2.5)
19
+ drb
20
+ i18n (>= 1.6, < 2)
21
+ minitest (>= 5.1)
22
+ mutex_m
23
+ tzinfo (~> 2.0)
24
+ base64 (0.2.0)
25
+ bigdecimal (3.1.6)
26
+ concurrent-ruby (1.2.3)
27
+ connection_pool (2.4.1)
28
+ drb (2.2.0)
29
+ ruby2_keywords
30
+ i18n (1.14.1)
22
31
  concurrent-ruby (~> 1.0)
23
- metaclass (0.0.4)
24
32
  method_source (0.9.2)
25
- minitest (5.13.0)
26
- mocha (1.9.0)
27
- metaclass (~> 0.0.1)
28
- rake (12.3.1)
29
- ruby2ruby (2.4.4)
33
+ minitest (5.21.2)
34
+ mocha (2.1.0)
35
+ ruby2_keywords (>= 0.0.5)
36
+ mutex_m (0.2.0)
37
+ racc (1.7.3)
38
+ rake (13.1.0)
39
+ ruby2_keywords (0.0.5)
40
+ ruby2ruby (2.5.0)
30
41
  ruby_parser (~> 3.1)
31
42
  sexp_processor (~> 4.6)
32
- ruby_parser (3.14.1)
33
- sexp_processor (~> 4.9)
34
- sexp_processor (4.13.0)
35
- thread_safe (0.3.6)
36
- tzinfo (1.2.5)
37
- thread_safe (~> 0.1)
38
- zeitwerk (2.2.1)
43
+ ruby_parser (3.21.0)
44
+ racc (~> 1.5)
45
+ sexp_processor (~> 4.16)
46
+ sexp_processor (4.17.1)
47
+ tzinfo (2.0.6)
48
+ concurrent-ruby (~> 1.0)
39
49
 
40
50
  PLATFORMS
41
51
  ruby
@@ -45,4 +55,4 @@ DEPENDENCIES
45
55
  rake
46
56
 
47
57
  BUNDLED WITH
48
- 1.17.2
58
+ 2.5.4
@@ -1,10 +1,10 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'active_mappers'
3
- s.version = '1.4.7'
4
- s.date = '2020-11-12'
3
+ s.version = '1.5.1'
4
+ s.date = '2024-01-26'
5
5
  s.summary = 'Slick, fast view layer for you Rails API.'
6
6
  s.description = 'Fast, simple, declarative way to design your API\'s view layer'
7
- s.authors = ['Michaël Villeneuve']
7
+ s.authors = ['Michaël Villeneuve', 'Loïc SENCE']
8
8
  s.homepage = 'https://github.com/fidme/active_mappers'
9
9
  s.email = 'contact@michaelvilleneuve.fr'
10
10
  s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
@@ -11,7 +11,6 @@ module ActiveMappers
11
11
 
12
12
  @klass.class_variables.each do |var_name|
13
13
  dsl_values = @subclass.class_variable_get(var_name)
14
-
15
14
  dsl_values[@subclass.name] = dsl_values[@klass.name].dup
16
15
  end
17
16
  end
@@ -23,4 +22,4 @@ module ActiveMappers
23
22
  end
24
23
  end
25
24
  end
26
- end
25
+ end
@@ -12,8 +12,8 @@ module ActiveMappers
12
12
  Setup.camelcase_keys ? hash.to_lower_camel_case : hash
13
13
  end
14
14
 
15
- def self.resource_to_mapper(resource, class_from)
16
- "#{base_namespace(class_from)}::#{resource.class.name}Mapper".constantize
15
+ def self.resource_to_mapper(resource, class_from, scope=nil)
16
+ "#{base_namespace(class_from)}::#{resource.class.name}Mapper#{scope ? "Scope#{scope.capitalize}" : nil}".constantize
17
17
  end
18
18
 
19
19
  def self.resource_class_to_mapper(resource_class_name, class_from)
@@ -14,11 +14,16 @@ require_relative 'active_mappers/key_transformer'
14
14
  module ActiveMappers
15
15
  class Base
16
16
  @@renderers = {}
17
+ @@inheritance_column = {}
17
18
 
18
19
  def self.inherited(subclass)
19
20
  Handlers::Inheritance.new(subclass, self).handle
20
21
  end
21
22
 
23
+ def self.inheritance_column(val)
24
+ @@inheritance_column[name] = val
25
+ end
26
+
22
27
  def self.attributes(*params)
23
28
  each do |resource|
24
29
  h = {}
@@ -80,14 +85,17 @@ module ActiveMappers
80
85
  end
81
86
 
82
87
  def self.each(&block)
88
+ # puts "[l. #{__LINE__}] [#{name}] each"
83
89
  @@renderers[name] = (@@renderers[name] || []) << block
84
90
  end
85
91
 
86
92
  def self.with(args, options = {})
87
- return evaluate_scopes(args, options) unless options[:scope].nil?
88
-
93
+ # puts "[l. #{__LINE__}] WITH - #{name} - #{options}"
94
+ if options[:scope].present? && !name.include?('Scope')
95
+ return evaluate_scopes(args, options)
96
+ end
89
97
  response = if options[:rootless]
90
- args.respond_to?(:each) ? all(args, options[:context]) : one(args, options[:context])
98
+ args.respond_to?(:each) ? all(args, options) : one(args, options)
91
99
  else
92
100
  render_with_root(args, options)
93
101
  end
@@ -95,13 +103,25 @@ module ActiveMappers
95
103
  end
96
104
 
97
105
  def self.evaluate_scopes(args, options)
98
- class_to_call = "::#{name}Scope#{options[:scope].capitalize}".constantize rescue (options[:fallback_on_missing_scope] ? self : raise("ActiveMappers [#{name}] No scope named #{options[:scope]} found"))
99
- return class_to_call.with(args, options.except(:scope))
106
+ # puts "[l. #{__LINE__}] [#{name}] evaluate_scopes #{options}"
107
+ class_to_call = begin
108
+ "::#{name}Scope#{options[:scope].capitalize}".constantize
109
+ rescue
110
+ if options[:fallback_class]
111
+ options[:fallback_class]
112
+ elsif options[:fallback_on_missing_scope]
113
+ self
114
+ else
115
+ raise("ActiveMappers [#{name}] No scope named #{options[:scope]} found")
116
+ end
117
+ end
118
+ # puts "[l.#{__LINE__}] evaluate_scopes class_to_call -> #{class_to_call}"
119
+ return class_to_call.with(args, options.merge(initial_mapper: self))
100
120
  end
101
121
 
102
122
  def self.scope(*params, &block)
123
+ # puts "[l.#{__LINE__}] [#{name}] CREATING SCOPE CLASSES (name: #{name} | params: #{params.inspect}) ===> ::#{name}Scope#{params.first.capitalize}"
103
124
  raise "ActiveMappers [#{name}] scope must be a block" if block.nil? || !block.respond_to?(:call)
104
-
105
125
  params.each do |param|
106
126
  block_content = Ruby2Ruby.new.process(RubyParser.new.process(block.source).to_a.last)
107
127
  eval("class ::#{name}Scope#{param.capitalize} < ::#{name} ; #{block_content}; end")
@@ -113,21 +133,43 @@ module ActiveMappers
113
133
  resource_name ||= KeyTransformer.apply_on(self.name)
114
134
 
115
135
  if args.respond_to?(:each)
116
- { resource_name.to_s.pluralize.to_sym => all(args, options[:context]) }
136
+ { resource_name.to_s.pluralize.to_sym => all(args, options) }
117
137
  else
118
- { resource_name.to_s.singularize.to_sym => one(args, options[:context]) }
138
+ { resource_name.to_s.singularize.to_sym => one(args, options) }
119
139
  end
120
140
  end
121
141
 
122
- def self.all(collection, context = nil)
123
- collection.map { |el| one(el, context) }.compact
142
+ def self.all(collection, options = {})
143
+ collection.map { |el| one(el, options) }.compact
124
144
  end
125
145
 
126
- def self.one(resource, context = nil)
146
+ def self.one(resource, options = {})
147
+ # puts "[l.#{__LINE__}] [#{name}] ONE - options: #{options.inspect} - inheritance_column: #{@@inheritance_column[name]}"
127
148
  return nil unless resource
149
+
150
+ if @@inheritance_column[name] && !options[:fallback_class]
151
+ main_mapper = KeyTransformer.resource_to_mapper(resource, self)
152
+ # puts "[l.#{__LINE__}] [#{name}] ONE - main_mapper #{main_mapper}"
153
+ mapper = options[:scope] ? (KeyTransformer.resource_to_mapper(resource, self, options[:scope]) rescue main_mapper) : main_mapper
154
+ # puts "[l.#{__LINE__}] [#{name}] ONE - mapper #{mapper}"
155
+ if name != mapper&.name
156
+ return mapper.with(resource, options.merge(rootless: true, fallback_class: options[:initial_mapper]))
157
+ end
158
+ end
159
+
128
160
  return {} if @@renderers[name].nil? # Mapper is empty
161
+
162
+ # base_mapper = name.rpartition('::').first
163
+
164
+ # renderers = ancestors.select { |it| it.name.start_with?(base_mapper) }.map do |ancestor|
165
+ # puts "---> #{ancestor.name}"
166
+ # @@renderers[ancestor.name].map do |renderer|
167
+ # renderer.call(resource, options[:context])
168
+ # end.reduce(&:merge)
169
+ # end.reduce(&:merge)
170
+
129
171
  renderers = @@renderers[name].map do |renderer|
130
- renderer.call(resource, context)
172
+ renderer.call(resource, options[:context])
131
173
  end.reduce(&:merge)
132
174
 
133
175
  KeyTransformer.format_keys(renderers)
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_mappers
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.7
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michaël Villeneuve
8
- autorequire:
8
+ - Loïc SENCE
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2020-11-12 00:00:00.000000000 Z
12
+ date: 2024-01-26 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: activesupport
@@ -101,7 +102,7 @@ homepage: https://github.com/fidme/active_mappers
101
102
  licenses:
102
103
  - MIT
103
104
  metadata: {}
104
- post_install_message:
105
+ post_install_message:
105
106
  rdoc_options: []
106
107
  require_paths:
107
108
  - lib
@@ -116,8 +117,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
117
  - !ruby/object:Gem::Version
117
118
  version: '0'
118
119
  requirements: []
119
- rubygems_version: 3.1.2
120
- signing_key:
120
+ rubygems_version: 3.5.4
121
+ signing_key:
121
122
  specification_version: 4
122
123
  summary: Slick, fast view layer for you Rails API.
123
124
  test_files: []