active_report 4.0.2 → 5.0.0

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
  SHA1:
3
- metadata.gz: 484ee735d28a5b089d3004b7fdce895a0bff0f2c
4
- data.tar.gz: 64537c78344b4ba6c23c21d1a29959c1109552ad
3
+ metadata.gz: 455d82fc5a50a79fdc57477851140306cb49b0ab
4
+ data.tar.gz: 7a9d01cb237fde5d1426f67e1afdff84da99820c
5
5
  SHA512:
6
- metadata.gz: d50551e1afe24fd6b8e1e91edf641917c539f9ae986bd1cd4cc831db952b1a125e4e9807580f6ccb1943192b2258be23f38b351292c4980f9cf113bf9a3ebde8
7
- data.tar.gz: d376110537ce7144f45727530789b3da301c1177fb95fda000ba2a97ceba87f53d5244946aa01dc05cf37efedb23443d5a1e202256804fc9cadac5e93409dbd7
6
+ metadata.gz: 0260ae9c52fbbc1a87bbbdd574d5e5ac3f6ebf6af08c49efa56a38db2a284ff131fdd33456c9f46b8b8396303dd97ec5271a99e165a19cef29e820e10344c10c
7
+ data.tar.gz: c9ce8bfe558375696e48b2e05d24c1c47fe111b2f27adbd08de8814fa25b6e32caa1bd2d8e99d0c0caaf0f471e281dd17537c6f50730c2b01cdddb5bd83b34fe
data/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/active_report.svg)](http://badge.fury.io/rb/active_report)
4
4
  [![Build Status](https://travis-ci.org/drexed/active_report.svg?branch=master)](https://travis-ci.org/drexed/active_report)
5
- [![Coverage Status](https://coveralls.io/repos/github/drexed/active_report/badge.svg?branch=master)](https://coveralls.io/github/drexed/active_report?branch=master)
6
5
 
7
6
  ActiveReport is a library to export CSV's out of arrays, hashes, and records and vice versa.
8
7
 
@@ -36,9 +35,9 @@ Or install it yourself as:
36
35
  `../config/initalizers/active_report.rb`
37
36
 
38
37
  ```ruby
39
- ActiveReport::Settings.configure do |config|
40
- config.force_encoding = true
41
- config.options = { encoding: 'UTF-8' }
38
+ ActiveReport.configure do |config|
39
+ config.csv_force_encoding = true
40
+ config.csv_options = { encoding: 'UTF-8' }
42
41
  end
43
42
  ```
44
43
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # coding: utf-8
2
4
 
3
5
  lib = File.expand_path('../lib', __FILE__)
@@ -23,10 +25,8 @@ Gem::Specification.new do |spec|
23
25
  spec.require_paths = %w[lib support]
24
26
 
25
27
  spec.add_runtime_dependency 'activerecord'
26
- spec.add_runtime_dependency 'dry-configurable'
27
28
 
28
29
  spec.add_development_dependency 'bundler'
29
- spec.add_development_dependency 'coveralls'
30
30
  spec.add_development_dependency 'rake'
31
31
  spec.add_development_dependency 'rspec'
32
32
  spec.add_development_dependency 'sqlite3'
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'active_report'
data/bin/rake CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
- #
2
+ # frozen_string_literal: true
3
+
3
4
  # This file was generated by Bundler.
4
5
  #
5
6
  # The application 'rake' is installed as part of a gem, and
6
7
  # this file is here to facilitate running it.
7
- #
8
8
 
9
9
  require 'pathname'
10
10
  ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', Pathname.new(__FILE__).realpath)
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'csv'
2
4
 
3
- %w[version settings base array hash record].each do |file_name|
5
+ %w[version configuration base array hash record].each do |file_name|
4
6
  require "active_report/#{file_name}"
5
7
  end
6
8
 
@@ -1,40 +1,44 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ActiveReport::Array < ActiveReport::Base
2
4
 
3
- attr_accessor :datum, :headers, :options
5
+ attr_accessor :data, :headers, :options
4
6
 
5
- def initialize(datum, headers: nil, options: {})
6
- @datum = datum
7
+ def initialize(data, headers: nil, options: {})
8
+ @data = data
7
9
  @headers = headers
8
- @options = duplicate_options.merge!(options)
10
+ @options = csv_options.merge(options)
9
11
  end
10
12
 
11
- def self.export(datum, headers: nil, options: {})
12
- new(datum, headers: headers, options: options).export
13
+ def self.export(data, headers: nil, options: {})
14
+ klass = new(data, headers: headers, options: options)
15
+ klass.export
13
16
  end
14
17
 
15
- def self.import(datum, headers: nil, options: {})
16
- new(datum, headers: headers, options: options).import
18
+ def self.import(data, headers: nil, options: {})
19
+ klass = new(data, headers: headers, options: options)
20
+ klass.import
17
21
  end
18
22
 
19
23
  def export
20
- @datum = munge_first(@datum)
24
+ @data = munge_first(@data)
21
25
 
22
26
  CSV.generate(@options) do |csv|
23
27
  csv << @headers unless @headers.nil?
24
- @datum.lazy.each { |cell| csv << cell }
28
+ @data.lazy.each { |cell| csv << cell }
25
29
  end
26
30
  end
27
31
 
28
32
  def import
29
- datum = merge(@headers)
33
+ array = merge(@headers)
30
34
 
31
- CSV.foreach(@datum, @options) do |data|
32
- data = encode_to_utf8(data) if force_encoding?
33
- datum.push(data)
35
+ CSV.foreach(@data, @options) do |row|
36
+ row = encode_to_utf8(row) if csv_force_encoding?
37
+ array.push(row)
34
38
  end
35
39
 
36
- datum = datum.flatten if datum.size < 2
37
- metatransform(datum)
40
+ array = array.flatten if array.size < 2
41
+ metatransform(array)
38
42
  end
39
43
 
40
44
  end
@@ -1,7 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ActiveReport::Base
2
4
 
3
5
  @@evaluate = false
4
6
 
7
+ def csv_options
8
+ ActiveReport.configuration.csv_options
9
+ end
10
+
11
+ def csv_force_encoding?
12
+ ActiveReport.configuration.csv_force_encoding
13
+ end
14
+
5
15
  def self.evaluate(value = true)
6
16
  @@evaluate = value
7
17
  self
@@ -9,15 +19,12 @@ class ActiveReport::Base
9
19
 
10
20
  private
11
21
 
12
- def duplicate_options
13
- ActiveReport::Settings.config.options.dup
14
- end
15
-
16
22
  # rubocop:disable Performance/StringReplacement
17
23
  def encode_to_utf8(line)
18
24
  line.map do |chr|
19
25
  next if chr.nil?
20
- chr.gsub!(/"/, '')
26
+
27
+ chr = chr.tr('"', '')
21
28
  chr.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
22
29
  end
23
30
  end
@@ -31,30 +38,19 @@ class ActiveReport::Base
31
38
 
32
39
  def filter(object)
33
40
  if @only.empty?
34
- object.delete_if { |key, _| @except.include?(key) } unless @except.empty?
41
+ return if @except.empty?
42
+ object.delete_if { |key, _| @except.include?(key) }
35
43
  else
36
44
  object.keep_if { |key, _| @only.include?(key) }
37
45
  end
38
46
  end
39
47
 
40
- def filter_first(object)
41
- if @only.empty?
42
- object.first.delete_if { |key, _| @except.include?(key) } unless @except.empty?
43
- else
44
- object.first.keep_if { |key, _| @only.include?(key) }
45
- end
46
- end
47
-
48
- def force_encoding?
49
- ActiveReport::Settings.config.force_encoding
50
- end
51
-
52
48
  def humanize(object)
53
49
  object.to_s.tr('_', ' ').capitalize
54
50
  end
55
51
 
56
52
  def merge(object)
57
- [].push(object).compact
53
+ [object].compact
58
54
  end
59
55
 
60
56
  # rubocop:disable Security/Eval, Lint/RescueException
@@ -65,34 +61,53 @@ class ActiveReport::Base
65
61
  end
66
62
  # rubocop:enable Security/Eval, Lint/RescueException
67
63
 
64
+ def metaform_array(datum)
65
+ datum.map { |val| metaform(val) }
66
+ end
67
+
68
+ def metaform_hash(datum)
69
+ datum.lazy.each { |key, val| datum[key] = metaform(val) }
70
+ end
71
+
72
+ def metamorph_array(datum)
73
+ case datum.first.class.name
74
+ when 'Array' then datum.map { |arr| metaform_array(arr) }
75
+ when 'Hash' then datum.map { |hsh| metaform_hash(hsh) }
76
+ else metaform_array(datum)
77
+ end
78
+ end
79
+
68
80
  def metamorph(datum)
69
81
  case datum.class.name
70
- when 'Array'
71
- if datum.first.is_a?(Array)
72
- datum.map { |arr| arr.map { |val| metaform(val) } }
73
- elsif datum.first.is_a?(Hash)
74
- datum.map { |hsh| hsh.each { |key, val| hsh.store(key, metaform(val)) } }
75
- else
76
- datum.map { |val| metaform(val) }
77
- end
78
- when 'Hash'
79
- datum.each { |key, val| datum.store(key, metaform(val)) }
80
- else
81
- metaform(datum)
82
+ when 'Array' then metamorph_array(datum)
83
+ when 'Hash' then metaform_hash(datum)
84
+ else metaform(datum)
82
85
  end
83
86
  end
84
87
 
85
88
  def metatransform(datum)
86
- return(nil) if datum.empty?
89
+ return if datum.empty?
87
90
  evaluate? ? metamorph(datum) : datum
88
91
  end
89
92
 
90
- def munge(object)
91
- object.is_a?(Array) ? object : merge(object)
93
+ def munge(datum)
94
+ datum.is_a?(Array) ? datum : merge(datum)
95
+ end
96
+
97
+ def munge_first(datum)
98
+ datum.first.is_a?(Array) ? datum : merge(datum)
99
+ end
100
+
101
+ def filter_values(datum)
102
+ array = []
103
+ (filter(datum) || datum).each_value { |val| array << val }
104
+ array
92
105
  end
93
106
 
94
- def munge_first(object)
95
- object.first.is_a?(Array) ? object : merge(object)
107
+ def filter_humanize_keys(datum)
108
+ array = []
109
+ (filter(datum.first) || datum.first).each_key { |key| array << humanize(key) }
110
+ array
96
111
  end
97
112
 
98
113
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveReport
4
+ class Configuration
5
+
6
+ attr_accessor :csv_force_encoding, :csv_options
7
+
8
+ def initialize
9
+ @csv_force_encoding = true
10
+ @csv_options = { encoding: 'UTF-8' }
11
+ end
12
+
13
+ end
14
+
15
+ def self.configuration
16
+ @configuration ||= Configuration.new
17
+ end
18
+
19
+ def self.configuration=(config)
20
+ @configuration = config
21
+ end
22
+
23
+ def self.configure
24
+ yield(configuration)
25
+ end
26
+
27
+ end
@@ -1,57 +1,57 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ActiveReport::Hash < ActiveReport::Base
2
4
 
3
5
  attr_accessor :datum, :only, :except, :headers, :options
4
6
 
5
7
  def initialize(datum, only: nil, except: nil, headers: nil, options: {})
6
8
  @datum = datum
7
- @except = except
9
+ @only = munge(only)
10
+ @except = munge(except)
8
11
  @headers = headers
9
- @only = only
10
- @options = duplicate_options.merge!(options)
12
+ @options = csv_options.merge(options)
11
13
  end
12
14
 
13
15
  def self.export(datum, only: nil, except: nil, headers: nil, options: {})
14
- new(datum, only: only, except: except, headers: headers, options: options).export
16
+ klass = new(datum, only: only, except: except, headers: headers, options: options)
17
+ klass.export
15
18
  end
16
19
 
17
20
  def self.import(datum, only: nil, except: nil, headers: nil, options: {})
18
- new(datum, only: only, except: except, headers: headers, options: options).import
21
+ klass = new(datum, only: only, except: except, headers: headers, options: options)
22
+ klass.import
19
23
  end
20
24
 
21
25
  def export
22
26
  @datum = munge(@datum)
23
- @only = munge(@only)
24
- @except = munge(@except)
25
27
 
26
28
  CSV.generate(@options) do |csv|
27
- csv << (@headers || (filter_first(@datum) || @datum.first).keys.map { |hdr| humanize(hdr) })
28
- @datum.lazy.each { |data| csv << (filter(data) || data).values }
29
+ csv << (@headers || filter_humanize_keys(@datum))
30
+ @datum.lazy.each { |data| csv << filter_values(data) }
29
31
  end
30
32
  end
31
33
 
32
34
  def import
33
- @only = munge(@only)
34
- @except = munge(@except)
35
+ array = []
36
+ line = 0
35
37
 
36
- datum = []
37
- CSV.foreach(@datum, @options).with_index do |data, line|
38
- data = encode_to_utf8(data) if force_encoding?
38
+ CSV.foreach(@datum, @options) do |data|
39
+ data = encode_to_utf8(data) if csv_force_encoding?
39
40
 
40
41
  if @headers.nil? && line.zero?
41
42
  @headers = data
42
43
  else
43
44
  subdata = {}
44
- @headers.lazy.each_with_index do |header, idx|
45
- subdata.store(header.to_s, data[idx])
46
- end
45
+ @headers.lazy.each_with_index { |header, idx| subdata[header.to_s] = data[idx] }
47
46
  filter(subdata)
48
- datum.push(subdata)
47
+ array.push(subdata)
49
48
  end
49
+
50
+ line += 1
50
51
  end
51
52
 
52
- datum = datum.first if datum.size == 1
53
- datum = metatransform(datum)
54
- datum
53
+ array = array.first if array.size == 1
54
+ metatransform(array)
55
55
  end
56
56
 
57
57
  end
@@ -1,23 +1,28 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
4
+
2
5
  class ActiveReport::Record < ActiveReport::Base
3
6
 
4
7
  attr_accessor :datum, :model, :only, :except, :headers, :options
5
8
 
6
9
  def initialize(datum, model: nil, only: nil, except: nil, headers: nil, options: {})
7
10
  @datum = datum
8
- @except = except
9
- @headers = headers
10
11
  @model = model
11
- @only = only
12
- @options = duplicate_options.merge!(options)
12
+ @only = munge(only)
13
+ @except = munge(except)
14
+ @headers = headers
15
+ @options = csv_options.merge(options)
13
16
  end
14
17
 
15
18
  def self.export(datum, only: nil, except: nil, headers: nil, options: {})
16
- new(datum, only: only, except: except, headers: headers, options: options).export
19
+ klass = new(datum, only: only, except: except, headers: headers, options: options)
20
+ klass.export
17
21
  end
18
22
 
19
23
  def self.import(datum, only: nil, except: nil, headers: nil, options: {}, model: nil)
20
- new(datum, only: only, except: except, headers: headers, options: options, model: model).import
24
+ klass = new(datum, only: only, except: except, headers: headers, options: options, model: model)
25
+ klass.import
21
26
  end
22
27
 
23
28
  def export
@@ -27,30 +32,30 @@ class ActiveReport::Record < ActiveReport::Base
27
32
  merge(@datum.attributes)
28
33
  end
29
34
 
30
- @only = munge(@only).map(&:to_s)
31
- @except = munge(@except).map(&:to_s)
35
+ @only.map!(&:to_s)
36
+ @except.map!(&:to_s)
32
37
 
33
38
  CSV.generate(@options) do |csv|
34
- csv << (@headers || (filter_first(@datum) || @datum.first).keys.map { |hdr| humanize(hdr) })
35
- @datum.lazy.each { |data| csv << (filter(data) || data).values }
39
+ csv << (@headers || filter_humanize_keys(@datum))
40
+ @datum.lazy.each { |data| csv << filter_values(data) }
36
41
  end
37
42
  end
38
43
 
39
44
  def import
40
45
  if @model.nil? || (@model.superclass != ActiveRecord::Base)
41
- raise ArgumentError, 'Model must be an ActiveRecord::Base object.'
46
+ raise ArgumentError,
47
+ 'Model must be an ActiveRecord::Base object.'
42
48
  end
43
49
 
44
50
  @datum = ActiveReport::Hash.import(@datum, headers: @headers, options: @options)
45
51
  @datum = munge(@datum)
46
- @only = munge(@only)
47
- @except = munge(@except)
48
52
 
49
53
  @datum.lazy.each do |data|
50
54
  params = {}
51
- data.each do |key, value|
52
- key = key.to_s.downcase.tr(' ', '_').tr('-', '_').to_sym
53
- params.store(key, value)
55
+
56
+ data.lazy.each do |key, value|
57
+ key = key.to_s.downcase.gsub(/ |-/, '_').to_sym
58
+ params[key] = value
54
59
  end
55
60
 
56
61
  filter(params)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveReport
2
- VERSION = '4.0.2'.freeze
4
+ VERSION ||= '5.0.0'
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/generators'
2
4
 
3
5
  class ActiveReport::InstallGenerator < Rails::Generators::Base
@@ -1,4 +1,6 @@
1
- ActiveReport::Settings.configure do |config|
2
- config.force_encoding = true
3
- config.options = { encoding: 'UTF-8' }
1
+ # frozen_string_literal: true
2
+
3
+ ActiveReport.configure do |config|
4
+ config.csv_force_encoding = true
5
+ config.csv_options = { encoding: 'UTF-8' }
4
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_report
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.2
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juan Gomez
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-26 00:00:00.000000000 Z
11
+ date: 2017-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: dry-configurable
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: bundler
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,20 +38,6 @@ dependencies:
52
38
  - - ">="
53
39
  - !ruby/object:Gem::Version
54
40
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: coveralls
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
41
  - !ruby/object:Gem::Dependency
70
42
  name: rake
71
43
  requirement: !ruby/object:Gem::Requirement
@@ -205,9 +177,9 @@ files:
205
177
  - lib/active_report.rb
206
178
  - lib/active_report/array.rb
207
179
  - lib/active_report/base.rb
180
+ - lib/active_report/configuration.rb
208
181
  - lib/active_report/hash.rb
209
182
  - lib/active_report/record.rb
210
- - lib/active_report/settings.rb
211
183
  - lib/active_report/version.rb
212
184
  - lib/generators/active_report/install_generator.rb
213
185
  - lib/generators/active_report/templates/install.rb
@@ -232,7 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
232
204
  version: '0'
233
205
  requirements: []
234
206
  rubyforge_project:
235
- rubygems_version: 2.6.12
207
+ rubygems_version: 2.6.13
236
208
  signing_key:
237
209
  specification_version: 4
238
210
  summary: Gem for exporting/importing ruby objects to flat files vice versa.
@@ -1,9 +0,0 @@
1
- require 'dry-configurable'
2
-
3
- class ActiveReport::Settings
4
- extend Dry::Configurable
5
-
6
- setting :force_encoding, true
7
- setting :options, { encoding: 'UTF-8' }
8
-
9
- end