exporter 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rvmrc +3 -3
- data/Gemfile +5 -2
- data/README.md +12 -7
- data/exporter.gemspec +7 -2
- data/lib/exporter.rb +10 -2
- data/lib/exporter/configuration.rb +21 -6
- data/lib/exporter/document.rb +1 -1
- data/lib/exporter/documents/excel_document.rb +7 -0
- data/lib/exporter/exporter.rb +10 -2
- data/lib/exporter/exporters/csv_exporter.rb +6 -10
- data/lib/exporter/exporters/excel_exporter.rb +24 -0
- data/lib/exporter/version.rb +1 -1
- data/spec/factories/user.rb +6 -0
- data/spec/features/exporter_spec.rb +69 -0
- data/spec/models/user.rb +2 -4
- data/spec/spec_helper.rb +4 -3
- metadata +69 -9
- data/spec/lib/exporter_spec.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 884edf14fca8bc1375766805f2503837f25bed70
|
4
|
+
data.tar.gz: 5f16d07e1ea1aa2353f4d2ac087fd16645f3877d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0399f99d7aa32a2e83150961a3749923650fe6505ab3413c5e1de8d37625ae7f066dd36fc8c87d72f59752a39e270a22b543a8bd25b1bd0d494570673d10700c
|
7
|
+
data.tar.gz: 4368ff13565282a1122d4e3923a87b4e4e677ad108f1bdb0cb78a954ee24c00f191070138df9136eebd53143939b8eca762171314c216c8dd8e04207cead6b65
|
data/.rvmrc
CHANGED
@@ -6,10 +6,10 @@
|
|
6
6
|
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
|
7
7
|
# Only full ruby name is supported here, for short names use:
|
8
8
|
# echo "rvm use 2.0.0" > .rvmrc
|
9
|
-
environment_id="ruby-2.0.0-p247@
|
9
|
+
environment_id="ruby-2.0.0-p247@exporter"
|
10
10
|
|
11
11
|
# Uncomment the following lines if you want to verify rvm version per project
|
12
|
-
# rvmrc_rvm_version="1.22.
|
12
|
+
# rvmrc_rvm_version="1.22.10 (stable)" # 1.10.1 seems like a safe start
|
13
13
|
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | __rvm_awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
|
14
14
|
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
|
15
15
|
# return 1
|
@@ -33,7 +33,7 @@ then
|
|
33
33
|
if (( ${rvm_use_flag:=1} >= 2 )) # display only when forced
|
34
34
|
then
|
35
35
|
if [[ $- == *i* ]] # check for interactive shells
|
36
|
-
then printf "%b" "Using:
|
36
|
+
then printf "%b" "Using: $(tput setaf 2 2>/dev/null)$GEM_HOME$(tput sgr0 2>/dev/null)
|
37
37
|
" # show the user the ruby and gemset they are using in green
|
38
38
|
else printf "%b" "Using: $GEM_HOME
|
39
39
|
" # don't use colors in non-interactive shells
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,9 +4,7 @@
|
|
4
4
|
[![Code Climate](https://codeclimate.com/github/voanhduy1512/exporter.png)](https://codeclimate.com/github/voanhduy1512/exporter)
|
5
5
|
[![Coverage Status](https://coveralls.io/repos/voanhduy1512/exporter/badge.png)](https://coveralls.io/r/voanhduy1512/exporter)
|
6
6
|
[![Dependency Status](https://gemnasium.com/voanhduy1512/exporter.png)](https://gemnasium.com/voanhduy1512/exporter)
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/voanhduy1512/exporter/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
|
10
8
|
|
11
9
|
## Installation
|
12
10
|
|
@@ -18,10 +16,17 @@ And then execute:
|
|
18
16
|
|
19
17
|
$ bundle
|
20
18
|
|
21
|
-
|
19
|
+
## Usage
|
20
|
+
``` ruby
|
21
|
+
# Here is the data which you want to export
|
22
|
+
users = User.all
|
23
|
+
|
24
|
+
# export it
|
25
|
+
Exporter.export(users, :csv).to_file(path_to_file)
|
26
|
+
```
|
27
|
+
|
28
|
+
Only support export to csv now (more types are coming)
|
29
|
+
|
22
30
|
|
23
|
-
$ gem install exporter
|
24
31
|
|
25
|
-
## Usage
|
26
32
|
|
27
|
-
TODO: Write usage instructions here
|
data/exporter.gemspec
CHANGED
@@ -18,7 +18,12 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
21
|
+
spec.add_development_dependency 'bundler'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
23
|
spec.add_development_dependency 'sqlite3'
|
24
|
+
spec.add_development_dependency 'rspec'
|
25
|
+
spec.add_development_dependency 'factory_girl'
|
26
|
+
|
27
|
+
spec.add_dependency 'activerecord'
|
28
|
+
spec.add_dependency 'spreadsheet'
|
24
29
|
end
|
data/lib/exporter.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require "csv"
|
1
3
|
require "exporter/version"
|
2
4
|
require "exporter/configuration"
|
3
5
|
require "exporter/document"
|
4
6
|
require "exporter/exporter"
|
5
7
|
require "exporter/documents/csv_document"
|
8
|
+
require 'exporter/documents/excel_document'
|
6
9
|
require "exporter/exporters/csv_exporter"
|
10
|
+
require "exporter/exporters/excel_exporter"
|
7
11
|
|
8
12
|
module Exporter
|
9
13
|
def self.configuration
|
@@ -11,7 +15,7 @@ module Exporter
|
|
11
15
|
end
|
12
16
|
|
13
17
|
def self.export(data, export_type, options={})
|
14
|
-
exporter = @configuration.exporter(data
|
18
|
+
exporter = @configuration.exporter(data, export_type)
|
15
19
|
if exporter
|
16
20
|
exporter.export(data, options)
|
17
21
|
else
|
@@ -20,4 +24,8 @@ module Exporter
|
|
20
24
|
end
|
21
25
|
end
|
22
26
|
|
23
|
-
Exporter.configuration.register(Array, :csv, Exporter::CsvExporter)
|
27
|
+
Exporter.configuration.register(Array, :csv, Exporter::CsvExporter)
|
28
|
+
Exporter.configuration.register(ActiveRecord::Relation, :csv, Exporter::CsvExporter)
|
29
|
+
|
30
|
+
Exporter.configuration.register(Array, :excel, Exporter::ExcelExporter)
|
31
|
+
Exporter.configuration.register(ActiveRecord::Relation, :excel, Exporter::ExcelExporter)
|
@@ -1,19 +1,34 @@
|
|
1
1
|
module Exporter
|
2
2
|
class Configuration
|
3
|
+
|
3
4
|
def initialize
|
4
5
|
@exporters = Hash.new
|
5
6
|
end
|
6
7
|
|
7
8
|
def register(data_type, export_type, exporter)
|
8
|
-
@exporters[data_type]
|
9
|
+
if @exporters[data_type].nil?
|
10
|
+
@exporters[data_type] = {export_type => exporter}
|
11
|
+
else
|
12
|
+
@exporters[data_type][export_type] = exporter
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def index(data, default_value, method)
|
17
|
+
@exporters.keys.each do |key|
|
18
|
+
return method.call(key) if data.kind_of?(key)
|
19
|
+
end
|
20
|
+
default_value
|
9
21
|
end
|
10
22
|
|
11
|
-
def can_export?(
|
12
|
-
|
23
|
+
def can_export?(data, export_type)
|
24
|
+
can_export_proc = Proc.new{|key| @exporters[key][export_type].present?}
|
25
|
+
index(data, false, can_export_proc)
|
13
26
|
end
|
14
27
|
|
15
|
-
def exporter(
|
16
|
-
|
28
|
+
def exporter(data, export_type)
|
29
|
+
exporter_proc = Proc.new {|key| @exporters[key][export_type]}
|
30
|
+
index(data, nil, exporter_proc)
|
17
31
|
end
|
32
|
+
|
18
33
|
end
|
19
|
-
end
|
34
|
+
end
|
data/lib/exporter/document.rb
CHANGED
data/lib/exporter/exporter.rb
CHANGED
@@ -1,14 +1,22 @@
|
|
1
1
|
module Exporter
|
2
2
|
class Exporter
|
3
3
|
def self.export(data, options)
|
4
|
-
document = process(data, options)
|
4
|
+
document = exporter.process(data, options)
|
5
5
|
raise TypeError.new('process method must return an Document object') unless document.kind_of? Document
|
6
6
|
document
|
7
7
|
end
|
8
8
|
|
9
|
+
def self.exporter
|
10
|
+
@exporter ||= self.new
|
11
|
+
end
|
12
|
+
|
9
13
|
protected
|
10
|
-
def
|
14
|
+
def process(data, options)
|
11
15
|
raise NotImplementedError.new("You must implement this process method.")
|
12
16
|
end
|
17
|
+
|
18
|
+
def is_active_record?(data, options)
|
19
|
+
(data.kind_of? ActiveRecord::Relation) || (data.kind_of?(Array) && data[0].kind_of?(ActiveRecord::Base))
|
20
|
+
end
|
13
21
|
end
|
14
22
|
end
|
@@ -1,16 +1,11 @@
|
|
1
|
-
require 'CSV'
|
2
1
|
module Exporter
|
3
2
|
class CsvExporter < Exporter
|
4
|
-
def self.process(data, options)
|
5
3
|
|
6
|
-
|
7
|
-
raise TypeError.new('Data must be an ActiveRecord') unless data[0].kind_of? ActiveRecord::Base
|
4
|
+
def process(data, options)
|
8
5
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
columns = data[0].class.attribute_names
|
13
|
-
end
|
6
|
+
raise TypeError.new unless is_active_record?(data, options)
|
7
|
+
|
8
|
+
columns = options[:columns] || data[0].class.attribute_names
|
14
9
|
|
15
10
|
data = CSV.generate do |csv|
|
16
11
|
csv << columns
|
@@ -21,5 +16,6 @@ module Exporter
|
|
21
16
|
|
22
17
|
CsvDocument.new(data)
|
23
18
|
end
|
19
|
+
|
24
20
|
end
|
25
|
-
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spreadsheet'
|
2
|
+
|
3
|
+
module Exporter
|
4
|
+
class ExcelExporter < Exporter
|
5
|
+
|
6
|
+
def process(data, options)
|
7
|
+
|
8
|
+
raise TypeError.new unless is_active_record?(data, options)
|
9
|
+
|
10
|
+
columns = options[:columns] || data[0].class.attribute_names
|
11
|
+
|
12
|
+
book = Spreadsheet::Workbook.new
|
13
|
+
sheet = book.create_worksheet
|
14
|
+
sheet.name = options[:sheet_name] || 'sheet1'
|
15
|
+
sheet.row(0).concat columns
|
16
|
+
data.each_with_index do |row, index|
|
17
|
+
sheet.row(index+1).concat row.attributes.values_at(*columns)
|
18
|
+
end
|
19
|
+
|
20
|
+
ExcelDocument.new(book)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/lib/exporter/version.rb
CHANGED
@@ -0,0 +1,69 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Exporter do
|
4
|
+
|
5
|
+
before(:all) {FactoryGirl.create(:user)}
|
6
|
+
|
7
|
+
let(:data){ User.all }
|
8
|
+
|
9
|
+
describe '.export' do
|
10
|
+
context 'ActiveRecord::Relation' do
|
11
|
+
it 'can export to csv' do
|
12
|
+
expect(Exporter.configuration.can_export?(data, :csv)).to eql(true)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'can export to excel' do
|
16
|
+
expect(Exporter.configuration.can_export?(data, :excel)).to eql(true)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "can't export not register type" do
|
20
|
+
expect(Exporter.configuration.can_export?(data, :some_weird_type)).to eql(false)
|
21
|
+
end
|
22
|
+
|
23
|
+
context ':csv' do
|
24
|
+
it 'return an Exporter::Document subclass' do
|
25
|
+
document = Exporter.export(data, :csv)
|
26
|
+
expect(document).to be_kind_of(Exporter::Document)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'write to file correct' do
|
30
|
+
document = Exporter.export(data, :csv)
|
31
|
+
document.to_file('dummy.csv')
|
32
|
+
content = File.read('dummy.csv')
|
33
|
+
expect(content.length).to eql(document.data.length)
|
34
|
+
File.delete('dummy.csv')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context ':excel' do
|
39
|
+
it 'return an Exporter::Document subclass' do
|
40
|
+
document = Exporter.export(data, :excel)
|
41
|
+
expect(document).to be_kind_of(Exporter::Document)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'write to file correct' do
|
45
|
+
document = Exporter.export(data, :excel)
|
46
|
+
document.to_file('dummy.xls')
|
47
|
+
content = Spreadsheet.open('dummy.xls')
|
48
|
+
expect(content.worksheet(0).last_row_index).to eql(document.data.worksheet(0).last_row_index)
|
49
|
+
expect(content.worksheet(0).row(1)).to eql(document.data.worksheet(0).row(1))
|
50
|
+
File.delete('dummy.xls')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'Array of ActiveRecord::Base' do
|
56
|
+
it 'can export to csv' do
|
57
|
+
expect(Exporter.configuration.can_export?(data, :csv)).to eql(true)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'can export to excel' do
|
61
|
+
expect(Exporter.configuration.can_export?(data, :excel)).to eql(true)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "can't export not register type" do
|
65
|
+
expect(Exporter.configuration.can_export?(data, :some_weird_type)).to eql(false)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/spec/models/user.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -11,9 +11,9 @@ if ENV['TRAVIS']
|
|
11
11
|
end
|
12
12
|
|
13
13
|
require "exporter"
|
14
|
-
require '
|
14
|
+
require 'factory_girl'
|
15
15
|
require 'models/user'
|
16
|
-
|
16
|
+
FactoryGirl.find_definitions
|
17
17
|
RSpec.configure do |config|
|
18
18
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
19
19
|
config.run_all_when_everything_filtered = true
|
@@ -32,6 +32,7 @@ ActiveRecord::Base.establish_connection(
|
|
32
32
|
:adapter => 'sqlite3',
|
33
33
|
:database => ':memory:'
|
34
34
|
)
|
35
|
+
|
35
36
|
ActiveRecord::Schema.define do
|
36
37
|
self.verbose = false
|
37
38
|
|
@@ -39,4 +40,4 @@ ActiveRecord::Schema.define do
|
|
39
40
|
t.string :name
|
40
41
|
t.string :email
|
41
42
|
end
|
42
|
-
end
|
43
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Võ Anh Duy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,62 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
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
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: factory_girl
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: activerecord
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: spreadsheet
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
55
111
|
description: A simple gem for export data to other format
|
56
112
|
email:
|
57
113
|
- voanhduy1512@live.com
|
@@ -72,10 +128,13 @@ files:
|
|
72
128
|
- lib/exporter/configuration.rb
|
73
129
|
- lib/exporter/document.rb
|
74
130
|
- lib/exporter/documents/csv_document.rb
|
131
|
+
- lib/exporter/documents/excel_document.rb
|
75
132
|
- lib/exporter/exporter.rb
|
76
133
|
- lib/exporter/exporters/csv_exporter.rb
|
134
|
+
- lib/exporter/exporters/excel_exporter.rb
|
77
135
|
- lib/exporter/version.rb
|
78
|
-
- spec/
|
136
|
+
- spec/factories/user.rb
|
137
|
+
- spec/features/exporter_spec.rb
|
79
138
|
- spec/models/user.rb
|
80
139
|
- spec/spec_helper.rb
|
81
140
|
homepage: ''
|
@@ -98,11 +157,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
157
|
version: '0'
|
99
158
|
requirements: []
|
100
159
|
rubyforge_project:
|
101
|
-
rubygems_version: 2.
|
160
|
+
rubygems_version: 2.1.8
|
102
161
|
signing_key:
|
103
162
|
specification_version: 4
|
104
163
|
summary: A simple data exporter
|
105
164
|
test_files:
|
106
|
-
- spec/
|
165
|
+
- spec/factories/user.rb
|
166
|
+
- spec/features/exporter_spec.rb
|
107
167
|
- spec/models/user.rb
|
108
168
|
- spec/spec_helper.rb
|
data/spec/lib/exporter_spec.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Exporter do
|
4
|
-
let(:data){
|
5
|
-
[
|
6
|
-
Exporter::User.create(:name => 'aaa', :email => 'aaa@aaa.aaa'),
|
7
|
-
Exporter::User.create(:name => 'bbb', :email => 'bbb@bbb.bbb')
|
8
|
-
]
|
9
|
-
}
|
10
|
-
describe '.export' do
|
11
|
-
it 'return an Exporter::Document' do
|
12
|
-
document = Exporter.export(data, :csv)
|
13
|
-
puts document.kind_of? Exporter::Document
|
14
|
-
puts document.class
|
15
|
-
expect(document).to be_kind_of(Exporter::Document)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|