pluck_map 1.0.0.rc1 → 1.0.0.rc2

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: e5a889fad3cf9ac653fb2140beb4b9e11c3a74686564dbdac7cee79d0c0cb0f6
4
- data.tar.gz: 7d544995a42e94eae52ad59ecb6357abedcac9396a26fb801ed4998abdc48445
3
+ metadata.gz: 83dba25350831a0d7be00ac7b2682113c512eccc6197265aa32033b7a5df70ff
4
+ data.tar.gz: faaf95d3df9d484497fed6e260fcef0bccac91d13f92a29cb9616771becb5ee6
5
5
  SHA512:
6
- metadata.gz: 83c0063cd6bbac89d8fa4b9d4efab07c43f20dc6a5d0a7216e04b4c127d9e93175e737a0ea37b929f318641255935992ac7160e650fa7675d4a9d9780a150003
7
- data.tar.gz: 6a9a3780212e568dd7b5ab56dadb79914e3bebc956fb6d591a054040f9c1819997d6c2a706d1ea7936d62a6a48eefb5b8d85b9335d20f15deeab1940b56784cc
6
+ metadata.gz: de5ad2aed4440bd810880f6200db09b2e97550c73c39716bf18d3afb060f44e4b95bd7da8b3a1fdc74ac6e022be1ea59518bc79f51113351952a7e9cedf9f979
7
+ data.tar.gz: 0ee7091b52d833d4da0bf3588549857ec371f81731a269ae51d52879c2f74a163b07cd89cec866dd22f5acec0c05b30fbeebebc5dab558cabc2da65b53975026
data/CHANGELOG.md CHANGED
@@ -1,9 +1,17 @@
1
+ ## v1.0.0.rc2 (2019 Jun 17)
2
+
3
+ * FEATURE: Add structured attributes to allow nesting attributes as a hash (@kobsy)
4
+
1
5
  ## v1.0.0.rc1 (2019 May 12)
2
6
 
3
7
  * BREAKING: Remove deprecated features/methods (@boblail)
4
8
  * FEATURE: Optimize `to_json` when a presenter doesn't need to process values in Ruby (@boblail)
5
9
  * FEATURE: Add `has_many` and `has_one` DSL for presenting nested resources (@boblail)
6
10
 
11
+ ## v0.6.2 (2019 Jun 13)
12
+
13
+ * FIX: Allow presenting a subclass of the presenter's model (@kobsy)
14
+
7
15
  ## v0.6.1 (2019 May 12)
8
16
 
9
17
  * FIX: Aliased SQL expressions to work-around a bug with Rails Postgres adapter (@kobsy)
data/README.md CHANGED
@@ -208,6 +208,19 @@ presenter = PluckMap[Person].define do
208
208
  end
209
209
  ```
210
210
 
211
+ ### Structured attributes
212
+
213
+ You can also nest attributes by passing a block to the attribute method:
214
+
215
+ ```ruby
216
+ presenter = PluckMap[Person].define do
217
+ parent do
218
+ id select: :parent_id
219
+ type "Parent"
220
+ end
221
+ end
222
+ ```
223
+
211
224
  ### Relationships
212
225
 
213
226
  PluckMap can also describe nested data. There are two special methods in the `define` block that introduce child resources:
@@ -1,4 +1,5 @@
1
1
  require "pluck_map/attribute"
2
+ require "pluck_map/structured_attribute"
2
3
  require "pluck_map/attributes"
3
4
  require "pluck_map/relationships"
4
5
 
@@ -21,10 +22,11 @@ module PluckMap
21
22
  @model = model
22
23
  end
23
24
 
24
- def method_missing(attribute_name, *args)
25
+ def method_missing(attribute_name, *args, &block)
25
26
  options = args.extract_options!
26
27
  options[:value] = args.first unless args.empty?
27
- @attributes.push Attribute.new(attribute_name, @model, options)
28
+ @attributes.push block.nil? ? Attribute.new(attribute_name, @model, options) :
29
+ StructuredAttribute.new(attribute_name, @model, block, options)
28
30
  :attribute_added
29
31
  end
30
32
 
@@ -19,7 +19,7 @@ module PluckMap
19
19
  protected
20
20
 
21
21
  def pluck(query)
22
- if query.model != model
22
+ unless query.model <= model
23
23
  raise ArgumentError, "Query for #{query.model} but #{model} expected"
24
24
  end
25
25
 
@@ -51,6 +51,10 @@ module PluckMap
51
51
  arg
52
52
  end
53
53
 
54
+ def prepare_PluckMap_StructuredAttribute(attribute)
55
+ to_json_object(attribute.attributes)
56
+ end
57
+
54
58
  def prepare_PluckMap_Relationships_Many(attribute)
55
59
  PluckMap::JsonSubqueryAggregate.new(attribute.scope, to_json_object(attribute.attributes))
56
60
  end
@@ -1,27 +1,14 @@
1
- require "pluck_map/attribute"
1
+ require "pluck_map/structured_attribute"
2
2
 
3
3
  module PluckMap
4
4
  module Relationships
5
- class Base < Attribute
6
- attr_reader :attributes, :scope
5
+ class Base < StructuredAttribute
6
+ attr_reader :scope
7
7
 
8
8
  def initialize(attribute_name, scope, block, options)
9
9
  @scope = scope
10
- @attributes = AttributeBuilder.build(model: scope.klass, &block)
11
10
  @scope = @scope.instance_exec(&options[:scope_block]) if options[:scope_block]
12
- options = options.slice(:as).merge(
13
- select: build_select,
14
- map: build_map)
15
-
16
- super(attribute_name, scope.klass, options)
17
- end
18
-
19
- def will_map?
20
- attributes.any?(&:will_map?)
21
- end
22
-
23
- def nested?
24
- true
11
+ super(attribute_name, scope.klass, block, options)
25
12
  end
26
13
 
27
14
  protected
@@ -0,0 +1,37 @@
1
+ require "pluck_map/attribute"
2
+
3
+ module PluckMap
4
+ class StructuredAttribute < Attribute
5
+ attr_reader :attributes
6
+
7
+ def initialize(attribute_name, model, block, options={})
8
+ @attributes = AttributeBuilder.build(model: model, &block)
9
+ options = options.slice(:as).merge(select: build_select, map: build_map)
10
+ super(attribute_name, model, options)
11
+ end
12
+
13
+ def will_map?
14
+ attributes.any?(&:will_map?)
15
+ end
16
+
17
+ def nested?
18
+ true
19
+ end
20
+
21
+ protected
22
+
23
+ def build_select
24
+ attributes.selects
25
+ end
26
+
27
+ def build_map
28
+ lambda do |*values|
29
+ return nil if values.none?
30
+ attributes.each_with_object({}) do |attribute, hash|
31
+ hash[attribute.name] = attribute.exec(values)
32
+ end
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -1,3 +1,3 @@
1
1
  module PluckMapPresenter
2
- VERSION = "1.0.0.rc1"
2
+ VERSION = "1.0.0.rc2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pluck_map
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc1
4
+ version: 1.0.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Lail
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-05-13 00:00:00.000000000 Z
11
+ date: 2019-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -275,6 +275,7 @@ files:
275
275
  - lib/pluck_map/relationships/many.rb
276
276
  - lib/pluck_map/relationships/one.rb
277
277
  - lib/pluck_map/relationships/polymorphic_one.rb
278
+ - lib/pluck_map/structured_attribute.rb
278
279
  - lib/pluck_map/version.rb
279
280
  - lib/pluck_map/visitors.rb
280
281
  - lib/pluck_map/visitors/mysql.rb