active_report 3.0.0 → 4.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 +4 -4
- data/.DS_Store +0 -0
- data/.fasterer.yml +19 -0
- data/.reek +42 -0
- data/.rubocop.yml +48 -0
- data/Gemfile +2 -2
- data/README.md +21 -24
- data/Rakefile +1 -1
- data/active_report.gemspec +25 -20
- data/bin/console +4 -4
- data/bin/rake +6 -7
- data/lib/active_report/array.rb +3 -3
- data/lib/active_report/base.rb +26 -21
- data/lib/active_report/hash.rb +12 -6
- data/lib/active_report/record.rb +20 -8
- data/lib/active_report/settings.rb +9 -0
- data/lib/active_report/version.rb +1 -1
- data/lib/active_report.rb +4 -27
- data/lib/generators/active_report/install_generator.rb +6 -8
- data/lib/generators/active_report/templates/install.rb +2 -2
- metadata +50 -4
- data/lib/active_report/configuration.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a7721137489f45557408d7a01b7a8ec390844cb
|
4
|
+
data.tar.gz: 10b0150bb46e4657b5805ea23e710d66061c9df4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5df1dae98cae8119165870506c10f525408545cac9f66aed8566caac3ca2dbe199105fc065d1091578950824370d2057eff596f25bcd921caf4ec53b552a6ec
|
7
|
+
data.tar.gz: 03fb99c2bf92603f85297b21f3174bc41aec58b7a75994927f0eec0d5c276b6bfd662b707cf64861403346984ac33b850511b230c9539852cb0644c645db8539
|
data/.DS_Store
ADDED
Binary file
|
data/.fasterer.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
speedups:
|
2
|
+
rescue_vs_respond_to: true
|
3
|
+
module_eval: true
|
4
|
+
shuffle_first_vs_sample: true
|
5
|
+
for_loop_vs_each: true
|
6
|
+
each_with_index_vs_while: false
|
7
|
+
map_flatten_vs_flat_map: true
|
8
|
+
reverse_each_vs_reverse_each: true
|
9
|
+
select_first_vs_detect: true
|
10
|
+
sort_vs_sort_by: true
|
11
|
+
fetch_with_argument_vs_block: true
|
12
|
+
keys_each_vs_each_key: true
|
13
|
+
hash_merge_bang_vs_hash_brackets: true
|
14
|
+
block_vs_symbol_to_proc: true
|
15
|
+
proc_call_vs_yield: true
|
16
|
+
gsub_vs_tr: true
|
17
|
+
select_last_vs_reverse_detect: true
|
18
|
+
getter_vs_attr_reader: true
|
19
|
+
setter_vs_attr_writer: true
|
data/.reek
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
---
|
2
|
+
Attribute:
|
3
|
+
enabled: false
|
4
|
+
BooleanParameter:
|
5
|
+
enabled: false
|
6
|
+
ClassVariable:
|
7
|
+
enabled: false
|
8
|
+
ControlParameter:
|
9
|
+
enabled: false
|
10
|
+
DuplicateMethodCall:
|
11
|
+
enabled: false
|
12
|
+
FeatureEnvy:
|
13
|
+
enabled: false
|
14
|
+
IrresponsibleModule:
|
15
|
+
enabled: false
|
16
|
+
InstanceVariableAssumption:
|
17
|
+
enabled: false
|
18
|
+
LongParameterList:
|
19
|
+
enabled: false
|
20
|
+
ManualDispatch:
|
21
|
+
enabled: false
|
22
|
+
NestedIterators:
|
23
|
+
max_allowed_nesting: 2
|
24
|
+
NilCheck:
|
25
|
+
enabled: false
|
26
|
+
PrimaDonnaMethod:
|
27
|
+
enabled: false
|
28
|
+
RepeatedConditional:
|
29
|
+
enabled: false
|
30
|
+
TooManyInstanceVariables:
|
31
|
+
enabled: false
|
32
|
+
TooManyStatements:
|
33
|
+
max_statements: 10
|
34
|
+
exclude:
|
35
|
+
- 'ActiveReport::Base#metamorph'
|
36
|
+
- 'ActiveReport::Hash#import'
|
37
|
+
- 'ActiveReport::Record#import'
|
38
|
+
UncommunicativeMethodName:
|
39
|
+
exclude:
|
40
|
+
- 'ActiveReport::Base#encode_to_utf8'
|
41
|
+
UtilityFunction:
|
42
|
+
enabled: false
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
AllCops:
|
2
|
+
DisplayCopNames: true
|
3
|
+
DisplayStyleGuide: true
|
4
|
+
TargetRubyVersion: 2.3
|
5
|
+
Exclude:
|
6
|
+
- 'spec/**/**/*'
|
7
|
+
LineLength:
|
8
|
+
Max: 100
|
9
|
+
Metrics/AbcSize:
|
10
|
+
Enabled: false
|
11
|
+
Metrics/ClassLength:
|
12
|
+
Enabled: false
|
13
|
+
Metrics/MethodLength:
|
14
|
+
Enabled: false
|
15
|
+
Metrics/ModuleLength:
|
16
|
+
Enabled: false
|
17
|
+
Metrics/ParameterLists:
|
18
|
+
Enabled: false
|
19
|
+
Style/Alias:
|
20
|
+
EnforcedStyle: prefer_alias_method
|
21
|
+
Style/BracesAroundHashParameters:
|
22
|
+
Enabled: false
|
23
|
+
Style/ClassAndModuleChildren:
|
24
|
+
EnforcedStyle: compact
|
25
|
+
Style/ClassVars:
|
26
|
+
Enabled: false
|
27
|
+
Style/ClosingParenthesisIndentation:
|
28
|
+
Enabled: false
|
29
|
+
Style/Documentation:
|
30
|
+
Enabled: false
|
31
|
+
Style/EmptyLinesAroundBlockBody:
|
32
|
+
Enabled: false
|
33
|
+
Style/EmptyLinesAroundClassBody:
|
34
|
+
Enabled: false
|
35
|
+
Style/EmptyLinesAroundModuleBody:
|
36
|
+
Enabled: false
|
37
|
+
Style/HashSyntax:
|
38
|
+
Enabled: false
|
39
|
+
Style/FirstParameterIndentation:
|
40
|
+
Enabled: false
|
41
|
+
Style/FrozenStringLiteralComment:
|
42
|
+
Enabled: false
|
43
|
+
Style/MultilineMethodCallIndentation:
|
44
|
+
EnforcedStyle: aligned
|
45
|
+
Style/NumericLiterals:
|
46
|
+
Enabled: false
|
47
|
+
Style/RescueModifier:
|
48
|
+
Enabled: false
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -11,7 +11,7 @@ ActiveReport is a library to export CSV's out of arrays, hashes, and records and
|
|
11
11
|
Add this line to your application's Gemfile:
|
12
12
|
|
13
13
|
```ruby
|
14
|
-
gem
|
14
|
+
gem 'active_report'
|
15
15
|
```
|
16
16
|
|
17
17
|
And then execute:
|
@@ -32,16 +32,13 @@ Or install it yourself as:
|
|
32
32
|
|
33
33
|
## Configuration
|
34
34
|
|
35
|
-
`rails g active_report:install` will generate the following
|
35
|
+
`rails g active_report:install` will generate the following file:
|
36
|
+
`../config/initalizers/active_report.rb`
|
36
37
|
|
37
38
|
```ruby
|
38
|
-
|
39
|
-
|
40
|
-
ActiveReport.configure do |config|
|
41
|
-
# option = default
|
42
|
-
|
39
|
+
ActiveReport::Settings.configure do |config|
|
43
40
|
config.force_encoding = true
|
44
|
-
config.options = { encoding:
|
41
|
+
config.options = { encoding: 'UTF-8' }
|
45
42
|
end
|
46
43
|
```
|
47
44
|
|
@@ -55,13 +52,13 @@ end
|
|
55
52
|
|
56
53
|
```ruby
|
57
54
|
@list = [
|
58
|
-
[1,
|
59
|
-
[2,
|
60
|
-
[3,
|
55
|
+
[1, 'Lorem lipsum etc...', true],
|
56
|
+
[2, 'Xorem lipsum etc...', false],
|
57
|
+
[3, 'Porem lipsum etc...', true]
|
61
58
|
]
|
62
59
|
|
63
60
|
ActiveReport::Array.export(@list)
|
64
|
-
ActiveReport::Array.export(@list, headers: [
|
61
|
+
ActiveReport::Array.export(@list, headers: ['ID', 'Task', 'Completed'], options: { col_sep: ';' })
|
65
62
|
```
|
66
63
|
|
67
64
|
**Import:** Convert a CSV into an array or array of arrays.
|
@@ -71,8 +68,8 @@ ActiveReport::Array.export(@list, headers: ["ID", "Task", "Completed"], options:
|
|
71
68
|
* options: CSV options to be use on parsing
|
72
69
|
|
73
70
|
```ruby
|
74
|
-
ActiveReport::Array.import(
|
75
|
-
ActiveReport::Array.import(
|
71
|
+
ActiveReport::Array.import('sample.csv')
|
72
|
+
ActiveReport::Array.import('sample.csv', headers: ['ID', 'Task', 'Completed'], options: { col_sep: ';' })
|
76
73
|
```
|
77
74
|
|
78
75
|
## Hash
|
@@ -87,13 +84,13 @@ ActiveReport::Array.import("sample.csv", headers: ["ID", "Task", "Completed"], o
|
|
87
84
|
|
88
85
|
```ruby
|
89
86
|
@list = [
|
90
|
-
{ id: 1, item:
|
91
|
-
{ id: 2, item:
|
92
|
-
{ id: 3, item:
|
87
|
+
{ id: 1, item: 'Lorem lipsum etc...', completed: true},
|
88
|
+
{ id: 2, item: 'Xorem lipsum etc...', completed: false},
|
89
|
+
{ id: 3, item: 'Porem lipsum etc...', completed: true}
|
93
90
|
]
|
94
91
|
|
95
92
|
ActiveReport::Hash.export(@list)
|
96
|
-
ActiveReport::Hash.export(@list, only: [:id, :item], headers: [
|
93
|
+
ActiveReport::Hash.export(@list, only: [:id, :item], headers: ['ID', 'Task'], options: { col_sep: ';' })
|
97
94
|
```
|
98
95
|
|
99
96
|
**Import:** Convert a CSV into an array of hashes.
|
@@ -105,8 +102,8 @@ ActiveReport::Hash.export(@list, only: [:id, :item], headers: ["ID", "Task"], op
|
|
105
102
|
* options: CSV options to be use on parsing
|
106
103
|
|
107
104
|
```ruby
|
108
|
-
ActiveReport::Hash.import(
|
109
|
-
ActiveReport::Hash.import(
|
105
|
+
ActiveReport::Hash.import('sample.csv')
|
106
|
+
ActiveReport::Hash.import('sample.csv', except: :completed, headers: ['ID', 'Task'], options: { col_sep: ';' })
|
110
107
|
```
|
111
108
|
|
112
109
|
## Record
|
@@ -127,7 +124,7 @@ ActiveReport::Hash.import("sample.csv", except: :completed, headers: ["ID", "Tas
|
|
127
124
|
]
|
128
125
|
|
129
126
|
ActiveReport::Record.export(@list)
|
130
|
-
ActiveReport::Record.export(@list, only: [:id, :item], headers: [
|
127
|
+
ActiveReport::Record.export(@list, only: [:id, :item], headers: ['ID', 'Task'], options: { col_sep: ';' })
|
131
128
|
```
|
132
129
|
|
133
130
|
**Import:** Create new database records from a CSV.
|
@@ -140,8 +137,8 @@ ActiveReport::Record.export(@list, only: [:id, :item], headers: ["ID", "Task"],
|
|
140
137
|
* options: CSV options to be use on parsing
|
141
138
|
|
142
139
|
```ruby
|
143
|
-
ActiveReport::Record.import(
|
144
|
-
ActiveReport::Record.import(
|
140
|
+
ActiveReport::Record.import('sample.csv', model: User)
|
141
|
+
ActiveReport::Record.import('sample.csv', model: User, except: :completed, headers: ['ID', 'Task'], options: { col_sep: ';' })
|
145
142
|
```
|
146
143
|
|
147
144
|
## Evaluate
|
@@ -149,7 +146,7 @@ ActiveReport::Record.import("sample.csv", model: User, except: :completed, heade
|
|
149
146
|
**Array/Hash:** Convert the import of a array or hash to proper ruby objects.
|
150
147
|
|
151
148
|
```ruby
|
152
|
-
ActiveReport::Hash.evaluate.import(
|
149
|
+
ActiveReport::Hash.evaluate.import('sample.csv')
|
153
150
|
```
|
154
151
|
|
155
152
|
## Contributing
|
data/Rakefile
CHANGED
data/active_report.gemspec
CHANGED
@@ -1,32 +1,37 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require 'active_report/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'active_report'
|
8
8
|
spec.version = ActiveReport::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Juan Gomez']
|
10
|
+
spec.email = ['j.gomez@drexed.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
|
14
|
-
spec.
|
15
|
-
|
12
|
+
spec.summary = 'Gem for exporting/importing ruby objects to flat files vice versa.'
|
13
|
+
# rubocop:disable Metrics/LineLength
|
14
|
+
spec.description = 'Export or import data from multiple input formats such as arrays, hashes, and active record or vice versa.'
|
15
|
+
# rubocop:enable Metrics/LineLength
|
16
|
+
spec.homepage = 'http://drexed.github.io/active_report'
|
17
|
+
spec.license = 'MIT'
|
16
18
|
|
17
19
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.bindir =
|
20
|
+
spec.bindir = 'exe'
|
19
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
22
|
+
spec.require_paths = ['lib']
|
21
23
|
|
22
|
-
spec.add_runtime_dependency
|
23
|
-
spec.add_runtime_dependency
|
24
|
+
spec.add_runtime_dependency 'activerecord'
|
25
|
+
spec.add_runtime_dependency 'dry-configurable'
|
24
26
|
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
27
|
+
spec.add_development_dependency 'bundler'
|
28
|
+
spec.add_development_dependency 'coveralls'
|
29
|
+
spec.add_development_dependency 'rake'
|
30
|
+
spec.add_development_dependency 'rspec'
|
31
|
+
spec.add_development_dependency 'sqlite3'
|
32
|
+
spec.add_development_dependency 'database_cleaner'
|
33
|
+
spec.add_development_dependency 'generator_spec'
|
34
|
+
spec.add_development_dependency 'fasterer'
|
35
|
+
spec.add_development_dependency 'reek'
|
36
|
+
spec.add_development_dependency 'rubocop'
|
32
37
|
end
|
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'active_report'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
9
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require
|
10
|
+
# require 'pry'
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/bin/rake
CHANGED
@@ -2,15 +2,14 @@
|
|
2
2
|
#
|
3
3
|
# This file was generated by Bundler.
|
4
4
|
#
|
5
|
-
# The application
|
5
|
+
# The application 'rake' is installed as part of a gem, and
|
6
6
|
# this file is here to facilitate running it.
|
7
7
|
#
|
8
8
|
|
9
|
-
require
|
10
|
-
ENV[
|
11
|
-
Pathname.new(__FILE__).realpath)
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', Pathname.new(__FILE__).realpath)
|
12
11
|
|
13
|
-
require
|
14
|
-
require
|
12
|
+
require 'rubygems'
|
13
|
+
require 'bundler/setup'
|
15
14
|
|
16
|
-
load Gem.bin_path(
|
15
|
+
load Gem.bin_path('rake', 'rake')
|
data/lib/active_report/array.rb
CHANGED
@@ -3,7 +3,8 @@ class ActiveReport::Array < ActiveReport::Base
|
|
3
3
|
attr_accessor :datum, :headers, :options
|
4
4
|
|
5
5
|
def initialize(datum, headers: nil, options: {})
|
6
|
-
@datum
|
6
|
+
@datum = datum
|
7
|
+
@headers = headers
|
7
8
|
@options = duplicate_options.merge!(options)
|
8
9
|
end
|
9
10
|
|
@@ -33,8 +34,7 @@ class ActiveReport::Array < ActiveReport::Base
|
|
33
34
|
end
|
34
35
|
|
35
36
|
datum = datum.flatten if datum.size < 2
|
36
|
-
|
37
|
-
datum
|
37
|
+
metatransform(datum)
|
38
38
|
end
|
39
39
|
|
40
40
|
end
|
data/lib/active_report/base.rb
CHANGED
@@ -2,7 +2,7 @@ class ActiveReport::Base
|
|
2
2
|
|
3
3
|
@@evaluate = false
|
4
4
|
|
5
|
-
def self.evaluate(value=true)
|
5
|
+
def self.evaluate(value = true)
|
6
6
|
@@evaluate = value
|
7
7
|
self
|
8
8
|
end
|
@@ -10,16 +10,18 @@ class ActiveReport::Base
|
|
10
10
|
private
|
11
11
|
|
12
12
|
def duplicate_options
|
13
|
-
ActiveReport.
|
13
|
+
ActiveReport::Settings.config.options.dup
|
14
14
|
end
|
15
15
|
|
16
|
+
# rubocop:disable Performance/StringReplacement
|
16
17
|
def encode_to_utf8(line)
|
17
|
-
line.map do |
|
18
|
-
next if
|
19
|
-
|
20
|
-
|
18
|
+
line.map do |chr|
|
19
|
+
next if chr.nil?
|
20
|
+
chr.gsub!(/"/, '')
|
21
|
+
chr.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
|
21
22
|
end
|
22
23
|
end
|
24
|
+
# rubocop:enable Performance/StringReplacement
|
23
25
|
|
24
26
|
def evaluate?
|
25
27
|
value = @@evaluate
|
@@ -29,57 +31,60 @@ class ActiveReport::Base
|
|
29
31
|
|
30
32
|
def filter(object)
|
31
33
|
if @only.empty?
|
32
|
-
object.delete_if { |key,
|
34
|
+
object.delete_if { |key, _| @except.include?(key) } unless @except.empty?
|
33
35
|
else
|
34
|
-
object.keep_if { |key,
|
36
|
+
object.keep_if { |key, _| @only.include?(key) }
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
38
40
|
def filter_first(object)
|
39
41
|
if @only.empty?
|
40
|
-
object.first.delete_if { |key,
|
42
|
+
object.first.delete_if { |key, _| @except.include?(key) } unless @except.empty?
|
41
43
|
else
|
42
|
-
object.first.keep_if { |key,
|
44
|
+
object.first.keep_if { |key, _| @only.include?(key) }
|
43
45
|
end
|
44
46
|
end
|
45
47
|
|
46
48
|
def force_encoding?
|
47
|
-
ActiveReport.
|
49
|
+
ActiveReport::Settings.config.force_encoding
|
48
50
|
end
|
49
51
|
|
50
52
|
def humanize(object)
|
51
|
-
object.to_s.
|
53
|
+
object.to_s.tr('_', ' ').capitalize
|
52
54
|
end
|
53
55
|
|
54
56
|
def merge(object)
|
55
57
|
[].push(object).compact
|
56
58
|
end
|
57
59
|
|
60
|
+
# rubocop:disable Lint/Eval, Lint/RescueException
|
58
61
|
def metaform(value)
|
59
62
|
value.nil? ? value : eval(value)
|
60
|
-
rescue Exception
|
63
|
+
rescue Exception
|
61
64
|
value
|
62
65
|
end
|
66
|
+
# rubocop:enable Lint/Eval, Lint/RescueException
|
63
67
|
|
64
68
|
def metamorph(datum)
|
65
|
-
|
66
|
-
when
|
69
|
+
case datum.class.name
|
70
|
+
when 'Array'
|
67
71
|
if datum.first.is_a?(Array)
|
68
|
-
datum.map { |
|
72
|
+
datum.map { |arr| arr.map { |val| metaform(val) } }
|
69
73
|
elsif datum.first.is_a?(Hash)
|
70
|
-
datum.map { |
|
74
|
+
datum.map { |hsh| hsh.each { |key, val| hsh.store(key, metaform(val)) } }
|
71
75
|
else
|
72
|
-
datum.map { |
|
76
|
+
datum.map { |val| metaform(val) }
|
73
77
|
end
|
74
|
-
when
|
75
|
-
datum.each { |key,
|
78
|
+
when 'Hash'
|
79
|
+
datum.each { |key, val| datum.store(key, metaform(val)) }
|
76
80
|
else
|
77
81
|
metaform(datum)
|
78
82
|
end
|
79
83
|
end
|
80
84
|
|
81
85
|
def metatransform(datum)
|
82
|
-
|
86
|
+
return(nil) if datum.empty?
|
87
|
+
evaluate? ? metamorph(datum) : datum
|
83
88
|
end
|
84
89
|
|
85
90
|
def munge(object)
|
data/lib/active_report/hash.rb
CHANGED
@@ -3,7 +3,10 @@ class ActiveReport::Hash < ActiveReport::Base
|
|
3
3
|
attr_accessor :datum, :only, :except, :headers, :options
|
4
4
|
|
5
5
|
def initialize(datum, only: nil, except: nil, headers: nil, options: {})
|
6
|
-
@datum
|
6
|
+
@datum = datum
|
7
|
+
@except = except
|
8
|
+
@headers = headers
|
9
|
+
@only = only
|
7
10
|
@options = duplicate_options.merge!(options)
|
8
11
|
end
|
9
12
|
|
@@ -16,16 +19,19 @@ class ActiveReport::Hash < ActiveReport::Base
|
|
16
19
|
end
|
17
20
|
|
18
21
|
def export
|
19
|
-
@datum
|
22
|
+
@datum = munge(@datum)
|
23
|
+
@only = munge(@only)
|
24
|
+
@except = munge(@except)
|
20
25
|
|
21
26
|
CSV.generate(@options) do |csv|
|
22
|
-
csv << (@headers || (filter_first(@datum) || @datum.first).keys.map { |
|
27
|
+
csv << (@headers || (filter_first(@datum) || @datum.first).keys.map { |hdr| humanize(hdr) })
|
23
28
|
@datum.lazy.each { |data| csv << (filter(data) || data).values }
|
24
29
|
end
|
25
30
|
end
|
26
31
|
|
27
32
|
def import
|
28
|
-
@only
|
33
|
+
@only = munge(@only)
|
34
|
+
@except = munge(@except)
|
29
35
|
|
30
36
|
datum = []
|
31
37
|
CSV.foreach(@datum, @options).with_index do |data, line|
|
@@ -35,8 +41,8 @@ class ActiveReport::Hash < ActiveReport::Base
|
|
35
41
|
@headers = data
|
36
42
|
else
|
37
43
|
subdata = {}
|
38
|
-
@headers.lazy.each_with_index do |header,
|
39
|
-
subdata.store(header.to_s, data
|
44
|
+
@headers.lazy.each_with_index do |header, idx|
|
45
|
+
subdata.store(header.to_s, data[idx])
|
40
46
|
end
|
41
47
|
filter(subdata)
|
42
48
|
datum.push(subdata)
|
data/lib/active_report/record.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require 'json'
|
2
2
|
class ActiveReport::Record < ActiveReport::Base
|
3
3
|
|
4
4
|
attr_accessor :datum, :model, :only, :except, :headers, :options
|
5
5
|
|
6
6
|
def initialize(datum, model: nil, only: nil, except: nil, headers: nil, options: {})
|
7
|
-
@datum
|
7
|
+
@datum = datum
|
8
|
+
@except = except
|
9
|
+
@headers = headers
|
10
|
+
@model = model
|
11
|
+
@only = only
|
8
12
|
@options = duplicate_options.merge!(options)
|
9
13
|
end
|
10
14
|
|
@@ -17,27 +21,35 @@ class ActiveReport::Record < ActiveReport::Base
|
|
17
21
|
end
|
18
22
|
|
19
23
|
def export
|
20
|
-
@datum = @datum.is_a?(ActiveRecord::Relation)
|
21
|
-
|
24
|
+
@datum = if @datum.is_a?(ActiveRecord::Relation)
|
25
|
+
JSON.parse(@datum.to_json).flatten
|
26
|
+
else
|
27
|
+
merge(@datum.attributes)
|
28
|
+
end
|
29
|
+
|
30
|
+
@only = munge(@only).map(&:to_s)
|
31
|
+
@except = munge(@except).map(&:to_s)
|
22
32
|
|
23
33
|
CSV.generate(@options) do |csv|
|
24
|
-
csv << (@headers || (filter_first(@datum) || @datum.first).keys.map { |
|
34
|
+
csv << (@headers || (filter_first(@datum) || @datum.first).keys.map { |hdr| humanize(hdr) })
|
25
35
|
@datum.lazy.each { |data| csv << (filter(data) || data).values }
|
26
36
|
end
|
27
37
|
end
|
28
38
|
|
29
39
|
def import
|
30
40
|
if @model.nil? || (@model.superclass != ActiveRecord::Base)
|
31
|
-
raise ArgumentError,
|
41
|
+
raise ArgumentError, 'Model must be an ActiveRecord::Base object.'
|
32
42
|
end
|
33
43
|
|
34
44
|
@datum = ActiveReport::Hash.import(@datum, headers: @headers, options: @options)
|
35
|
-
@datum
|
45
|
+
@datum = munge(@datum)
|
46
|
+
@only = munge(@only)
|
47
|
+
@except = munge(@except)
|
36
48
|
|
37
49
|
@datum.lazy.each do |data|
|
38
50
|
params = {}
|
39
51
|
data.each do |key, value|
|
40
|
-
key = key.to_s.downcase.
|
52
|
+
key = key.to_s.downcase.tr(' ', '_').tr('-', '_').to_sym
|
41
53
|
params.store(key, value)
|
42
54
|
end
|
43
55
|
|
data/lib/active_report.rb
CHANGED
@@ -1,30 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require "active_report/version"
|
3
|
-
require "active_report/configuration"
|
4
|
-
|
5
|
-
module ActiveReport
|
6
|
-
|
7
|
-
class << self
|
8
|
-
attr_accessor :configuration
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.configuration
|
12
|
-
@configuration ||= Configuration.new
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.configuration=(config)
|
16
|
-
@configuration = config
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.configure
|
20
|
-
yield(configuration)
|
21
|
-
end
|
1
|
+
require 'csv'
|
22
2
|
|
3
|
+
%w(version settings base array hash record).each do |file_name|
|
4
|
+
require "active_report/#{file_name}"
|
23
5
|
end
|
24
6
|
|
25
|
-
require
|
26
|
-
require "active_report/array"
|
27
|
-
require "active_report/hash"
|
28
|
-
require "active_report/record"
|
29
|
-
|
30
|
-
require "generators/active_report/install_generator"
|
7
|
+
require 'generators/active_report/install_generator'
|
@@ -1,12 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require 'rails/generators'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
source_root File.expand_path("../templates", __FILE__)
|
6
|
-
|
7
|
-
def copy_initializer_file
|
8
|
-
copy_file("install.rb", "config/initializers/active_report.rb")
|
9
|
-
end
|
3
|
+
class ActiveReport::InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
10
5
|
|
6
|
+
def copy_initializer_file
|
7
|
+
copy_file('install.rb', 'config/initializers/active_report.rb')
|
11
8
|
end
|
9
|
+
|
12
10
|
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
|
+
version: 4.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: 2016-
|
11
|
+
date: 2016-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: dry-configurable
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -136,6 +136,48 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: fasterer
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: reek
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: rubocop
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
139
181
|
description: Export or import data from multiple input formats such as arrays, hashes,
|
140
182
|
and active record or vice versa.
|
141
183
|
email:
|
@@ -144,9 +186,13 @@ executables: []
|
|
144
186
|
extensions: []
|
145
187
|
extra_rdoc_files: []
|
146
188
|
files:
|
189
|
+
- ".DS_Store"
|
147
190
|
- ".coveralls.yml"
|
191
|
+
- ".fasterer.yml"
|
148
192
|
- ".gitignore"
|
193
|
+
- ".reek"
|
149
194
|
- ".rspec"
|
195
|
+
- ".rubocop.yml"
|
150
196
|
- ".travis.yml"
|
151
197
|
- Gemfile
|
152
198
|
- LICENSE.txt
|
@@ -159,9 +205,9 @@ files:
|
|
159
205
|
- lib/active_report.rb
|
160
206
|
- lib/active_report/array.rb
|
161
207
|
- lib/active_report/base.rb
|
162
|
-
- lib/active_report/configuration.rb
|
163
208
|
- lib/active_report/hash.rb
|
164
209
|
- lib/active_report/record.rb
|
210
|
+
- lib/active_report/settings.rb
|
165
211
|
- lib/active_report/version.rb
|
166
212
|
- lib/generators/active_report/install_generator.rb
|
167
213
|
- lib/generators/active_report/templates/install.rb
|