pluck_map 1.0.0 → 2.0.0.rc1
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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/CHANGELOG.md +5 -0
- data/lib/pluck_map/attributes.rb +4 -0
- data/lib/pluck_map/model_context.rb +22 -1
- data/lib/pluck_map/presenter.rb +9 -7
- data/lib/pluck_map/presenters/to_csv.rb +10 -4
- data/lib/pluck_map/presenters/to_h.rb +10 -4
- data/lib/pluck_map/presenters/to_json.rb +14 -8
- data/lib/pluck_map/struct.rb +13 -0
- data/lib/pluck_map/version.rb +1 -1
- data/pluck_map.gemspec +3 -0
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b67d33088429e33e5b52da0c68a9355dd0131d5404c9af3238cfc692b497dbad
|
4
|
+
data.tar.gz: 4af18c89e5e9fe10796cb8ee5cd3782e89e767f2104af016fc06a34edf0c5df9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7208cdebddc1813ead385a83fa08205868de2ba2b0b78c7470c7d9cd437b48867817c3c997ef24af117eb18e49a406f7a886221384dcaf8d5745ce7909ed97ec
|
7
|
+
data.tar.gz: 2f715ab9f2d5c687a42010d9176913201f9eaea23a795caf88fbc4b9e5448239ceacafc78632f197a632dfb376bff1b6afde0bad1326cc7bfefe384eea8df7ed
|
data/.travis.yml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
language: ruby
|
2
|
-
rvm: 2.
|
2
|
+
rvm: 2.6.3
|
3
3
|
|
4
4
|
# we need MySQL 5.7+ to support JSON aggregation
|
5
5
|
dist: xenial
|
@@ -21,6 +21,7 @@ matrix:
|
|
21
21
|
- gemfile: gemfiles/rails_5.0.gemfile
|
22
22
|
- gemfile: gemfiles/rails_5.1.gemfile
|
23
23
|
- gemfile: gemfiles/rails_5.2.gemfile
|
24
|
+
- gemfile: gemfiles/rails_6.0.gemfile
|
24
25
|
- gemfile: gemfiles/rails_edge.gemfile
|
25
26
|
allow_failures:
|
26
27
|
- gemfile: gemfiles/rails_edge.gemfile
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## Unreleased
|
2
|
+
|
3
|
+
* BREAKING: `define` returns a subclass of `PluckMap::Presenter` instead of an instance (@boblail)
|
4
|
+
* FEATURE: `define` also creates structs to correspond to each presenter (@boblail)
|
5
|
+
|
1
6
|
## v1.0.0 (2019 Jul 17)
|
2
7
|
|
3
8
|
* FIX: Respect default_scopes for relationships (@boblail)
|
data/lib/pluck_map/attributes.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "pluck_map/presenter"
|
2
|
+
require "pluck_map/struct"
|
2
3
|
|
3
4
|
module PluckMap
|
4
5
|
class ModelContext
|
@@ -8,7 +9,27 @@ module PluckMap
|
|
8
9
|
|
9
10
|
def define(&block)
|
10
11
|
attributes = PluckMap::AttributeBuilder.build(model: @model, &block)
|
11
|
-
|
12
|
+
define_class!(@model, attributes)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def define_class!(model, attributes)
|
18
|
+
# Create a new subclass of PluckMap::Presenter
|
19
|
+
klass = Class.new(PluckMap::Presenter)
|
20
|
+
|
21
|
+
# Partially apply initialize with the parameters passed to this method
|
22
|
+
klass.define_method(:initialize) do |query|
|
23
|
+
super(model, attributes, query)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Generate a Struct constant in the namespace of the new subclass
|
27
|
+
struct = ::Struct.new(*attributes.ids, keyword_init: true)
|
28
|
+
struct.extend PluckMap::Struct::ClassMethods
|
29
|
+
struct.instance_variable_set :@presenter, klass
|
30
|
+
klass.const_set :Struct, struct
|
31
|
+
|
32
|
+
klass
|
12
33
|
end
|
13
34
|
end
|
14
35
|
end
|
data/lib/pluck_map/presenter.rb
CHANGED
@@ -9,20 +9,21 @@ module PluckMap
|
|
9
9
|
class Presenter
|
10
10
|
include CsvPresenter, HashPresenter, JsonPresenter
|
11
11
|
|
12
|
-
attr_reader :model, :attributes
|
12
|
+
attr_reader :model, :attributes, :query
|
13
|
+
|
14
|
+
def initialize(model, attributes, query)
|
15
|
+
unless query.model <= model
|
16
|
+
raise ArgumentError, "Query for #{query.model} but #{model} expected"
|
17
|
+
end
|
13
18
|
|
14
|
-
def initialize(model, attributes)
|
15
19
|
@model = model
|
16
20
|
@attributes = attributes
|
21
|
+
@query = query
|
17
22
|
end
|
18
23
|
|
19
24
|
protected
|
20
25
|
|
21
|
-
def pluck
|
22
|
-
unless query.model <= model
|
23
|
-
raise ArgumentError, "Query for #{query.model} but #{model} expected"
|
24
|
-
end
|
25
|
-
|
26
|
+
def pluck
|
26
27
|
# puts "\e[95m#{query.select(*selects).to_sql}\e[0m"
|
27
28
|
results = benchmark("pluck(#{query.table_name})") { query.pluck(*selects) }
|
28
29
|
return results unless block_given?
|
@@ -70,6 +71,7 @@ module PluckMap
|
|
70
71
|
|
71
72
|
# On Rails 4.2, `pluck` can't accept Arel nodes
|
72
73
|
select = Arel.sql(select.to_sql) if ActiveRecord.version.segments.take(2) == [4,2] && select.respond_to?(:to_sql)
|
74
|
+
|
73
75
|
select
|
74
76
|
}
|
75
77
|
end
|
@@ -3,13 +3,19 @@ require "pluck_map/errors"
|
|
3
3
|
module PluckMap
|
4
4
|
module CsvPresenter
|
5
5
|
|
6
|
-
def
|
6
|
+
def self.included(base)
|
7
|
+
def base.to_csv(query, **kargs)
|
8
|
+
new(query).to_csv(**kargs)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_csv
|
7
13
|
if attributes.nested?
|
8
14
|
raise PluckMap::UnsupportedAttributeError, "to_csv can not be used to present nested attributes"
|
9
15
|
end
|
10
16
|
|
11
17
|
define_to_csv!
|
12
|
-
to_csv
|
18
|
+
to_csv
|
13
19
|
end
|
14
20
|
|
15
21
|
private def define_to_csv!
|
@@ -17,8 +23,8 @@ module PluckMap
|
|
17
23
|
|
18
24
|
headers = CSV.generate_line(attributes.map(&:name))
|
19
25
|
ruby = <<-RUBY
|
20
|
-
def to_csv
|
21
|
-
pluck
|
26
|
+
def to_csv
|
27
|
+
pluck do |results|
|
22
28
|
rows = [#{headers.inspect}]
|
23
29
|
results.each_with_object(rows) do |values, rows|
|
24
30
|
values = Array(values)
|
@@ -1,15 +1,21 @@
|
|
1
1
|
module PluckMap
|
2
2
|
module HashPresenter
|
3
3
|
|
4
|
-
def
|
4
|
+
def self.included(base)
|
5
|
+
def base.to_h(query, **kargs)
|
6
|
+
new(query).to_h(**kargs)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_h
|
5
11
|
define_to_h!
|
6
|
-
to_h
|
12
|
+
to_h
|
7
13
|
end
|
8
14
|
|
9
15
|
private def define_to_h!
|
10
16
|
ruby = <<-RUBY
|
11
|
-
def to_h
|
12
|
-
pluck
|
17
|
+
def to_h
|
18
|
+
pluck do |results|
|
13
19
|
results.map { |values| values = Array(values); { #{attributes.map { |attribute| "#{attribute.name.inspect} => #{attribute.to_ruby}" }.join(", ")} } }
|
14
20
|
end
|
15
21
|
end
|
@@ -3,30 +3,36 @@ require "json"
|
|
3
3
|
module PluckMap
|
4
4
|
module JsonPresenter
|
5
5
|
|
6
|
-
def
|
6
|
+
def self.included(base)
|
7
|
+
def base.to_json(query, **kargs)
|
8
|
+
new(query).to_json(**kargs)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_json(json: default_json, **)
|
7
13
|
if attributes.will_map?
|
8
|
-
to_json__default(
|
14
|
+
to_json__default(json: json)
|
9
15
|
else
|
10
|
-
to_json__optimized
|
16
|
+
to_json__optimized
|
11
17
|
end
|
12
18
|
end
|
13
19
|
|
14
20
|
private
|
15
21
|
|
16
|
-
def to_json__default(
|
17
|
-
json.dump(to_h
|
22
|
+
def to_json__default(json: default_json, **)
|
23
|
+
json.dump(to_h)
|
18
24
|
end
|
19
25
|
|
20
|
-
def to_json__optimized(
|
26
|
+
def to_json__optimized(**)
|
21
27
|
define_to_json__optimized!
|
22
|
-
to_json__optimized
|
28
|
+
to_json__optimized
|
23
29
|
end
|
24
30
|
|
25
31
|
def define_to_json__optimized!
|
26
32
|
sql = compile(to_json_object(attributes).as("object"))
|
27
33
|
|
28
34
|
ruby = <<-RUBY
|
29
|
-
private def to_json__optimized(
|
35
|
+
private def to_json__optimized(**)
|
30
36
|
sql = wrap_aggregate(query.select(Arel.sql(#{sql.inspect})))
|
31
37
|
query.connection.select_value(sql)
|
32
38
|
end
|
data/lib/pluck_map/version.rb
CHANGED
data/pluck_map.gemspec
CHANGED
@@ -17,6 +17,9 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
+
# uses `keyword_init` argument of `Struct.new`
|
21
|
+
spec.required_ruby_version = '>= 2.5.0'
|
22
|
+
|
20
23
|
spec.add_dependency "activerecord", ">= 4.2"
|
21
24
|
|
22
25
|
spec.add_development_dependency "appraisal"
|
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:
|
4
|
+
version: 2.0.0.rc1
|
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-
|
11
|
+
date: 2019-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -276,6 +276,7 @@ files:
|
|
276
276
|
- lib/pluck_map/relationships/many.rb
|
277
277
|
- lib/pluck_map/relationships/one.rb
|
278
278
|
- lib/pluck_map/relationships/polymorphic_one.rb
|
279
|
+
- lib/pluck_map/struct.rb
|
279
280
|
- lib/pluck_map/structured_attribute.rb
|
280
281
|
- lib/pluck_map/version.rb
|
281
282
|
- lib/pluck_map/visitors.rb
|
@@ -294,12 +295,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
294
295
|
requirements:
|
295
296
|
- - ">="
|
296
297
|
- !ruby/object:Gem::Version
|
297
|
-
version:
|
298
|
+
version: 2.5.0
|
298
299
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
299
300
|
requirements:
|
300
|
-
- - "
|
301
|
+
- - ">"
|
301
302
|
- !ruby/object:Gem::Version
|
302
|
-
version:
|
303
|
+
version: 1.3.1
|
303
304
|
requirements: []
|
304
305
|
rubyforge_project:
|
305
306
|
rubygems_version: 2.7.6
|