monq 0.1.1 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bdf67f2d8ba19bd24e12b8d7a5397ca27a800a37925eebb1c584f40f05b9af1f
4
- data.tar.gz: aa19a699c514ede037e1663f326a74cd6dd9ab77096255125eaa5a77c5583629
3
+ metadata.gz: 549e91e0850eef71c43ad692ffb4ad92c6c5bbb4b43a7d834bf2ee690a3384f4
4
+ data.tar.gz: 5e2c84dacf04271206add867dd75df819d2bc5ccfc37d429e991ad271e3f3487
5
5
  SHA512:
6
- metadata.gz: 446339b7b3cd119046fce6473ff03ae6ca294bfe642d0ea1e637306b9bbe4eb1674bf5b9d369bcc00ea4c0cb8a276efbe96e571bb146b5258765fe34e8e3851d
7
- data.tar.gz: 73da4e7fb09de97340e482641198ee3a5635413a385cb45813250ce807ccd8d6483eb8a9bbfd74ecd149fbabfc7062b0b4457ba9daa89dbee4bc93f8bbeaed94
6
+ metadata.gz: d762f5a51e8a52f47c2deb2ef4ef1d5f6b09d41f492f1c483aa8b73574fcf436603fa694ff68b791717c491a9a19689dd14cb288ca2f966aed714e23ea742464
7
+ data.tar.gz: f0dcabaa63dcdc853594b30312ae091e35a84af2c980a47840f2801882f266f04462b79b9c4fe31e22a47d813f9d2275b8d2e5404e7f37f12afd88f506583a11
@@ -22,7 +22,7 @@ class Array
22
22
  csv = CSV.new(file)
23
23
  return if docs.empty?
24
24
 
25
- keys = docs.first.keys
25
+ keys = Monq::Presenter.column_names(docs)
26
26
  csv << keys.map(&:to_s)
27
27
  docs.each { |row| csv << keys.map { |k| row[k].to_s } }
28
28
  end
@@ -35,7 +35,7 @@ class Array
35
35
  package.workbook.add_worksheet(name: sheet_name) do |sheet|
36
36
  next if docs.empty?
37
37
 
38
- keys = docs.first.keys
38
+ keys = Monq::Presenter.column_names(docs)
39
39
  sheet.add_row(keys.map(&:to_s))
40
40
  docs.each { |row| sheet.add_row(keys.map { |k| row[k].to_s }) }
41
41
  end
data/lib/monq/ext.rb CHANGED
@@ -34,12 +34,14 @@ module Monq
34
34
  end
35
35
 
36
36
  def self.filter_docs(docs, attrs = [], options = {})
37
- unless docs.empty? || docs.first.is_a?(Hash) || !docs.first.respond_to?(:attributes)
37
+ return docs if docs.empty?
38
+
39
+ column_names = Presenter.column_names(docs)
40
+ unless docs.first.is_a?(Hash) || !docs.first.respond_to?(:attributes)
38
41
  docs = docs.map(&:attributes)
39
42
  end
40
- return docs if docs.empty? || (attrs.empty? && !options[:except])
43
+ return docs if attrs.empty? && !options[:except]
41
44
 
42
- column_names = docs.first.keys
43
45
  selected = attrs.flat_map { |e| e.is_a?(Regexp) ? column_names.grep(e) : e }.uniq
44
46
 
45
47
  if options[:except]
@@ -29,11 +29,18 @@ module Monq
29
29
  return [] if docs.nil? || docs.empty?
30
30
 
31
31
  docs = docs.map { |doc| doc.is_a?(Hash) || !doc.respond_to?(:attributes) ? doc : doc.attributes }
32
- keys = docs.first.keys
32
+ keys = column_names(docs)
33
33
  body = docs.map { |doc| keys.map { |key| scalar(doc[key]) } }
34
34
  [keys, *body]
35
35
  end
36
36
 
37
+ # Union of keys across all docs: Mongoid documents only carry the fields
38
+ # actually stored on each one, so any single doc (e.g. the oldest row in a
39
+ # natural-order cursor) can miss fields present in the rest.
40
+ def column_names(docs)
41
+ docs.flat_map { |doc| doc.is_a?(Hash) || !doc.respond_to?(:attributes) ? doc.keys : doc.attributes.keys }.uniq
42
+ end
43
+
37
44
  def as_json_tree(value)
38
45
  case value
39
46
  when BSON::ObjectId, BSON::Decimal128
data/lib/monq/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Monq
4
- VERSION = "0.1.1"
4
+ VERSION = "0.1.2"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: monq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Liu Xiang