pluck_map 1.0.0 → 2.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|