export_to 0.1.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f4098b954073cb9a6cb6265f1587f82457bd7221
4
- data.tar.gz: 584865393b553f491f0cdb101a79d18e0fcf0b11
2
+ SHA256:
3
+ metadata.gz: dcdb1f8a1a6dec33c36024fc0f577b1a492d7fe7e1bd7a8cf3d639be76814bde
4
+ data.tar.gz: 8b844513054aba11c5384dfc30a46ba9ae9abded9ed62001c9fb4af9d0e9a0d1
5
5
  SHA512:
6
- metadata.gz: 98dc7b5b192968eaa2d96cb1ee0e451fa07cdba1909e76ed47bcd376905d42fd61c969b2568f1432f17d891017961814eb7e5634b40b116b532227e02fb96189
7
- data.tar.gz: a7da9e422c6d6a41ccc083a85b8658f32cda1a44ae52701c9ed984d4f5f02c1672798617bc40dd2d47a8755ba5f814b25f83af36c5cc6fab10941b0d9f181ced
6
+ metadata.gz: 58e3294ec055895590fe1766d0b0ab54b0c5176942481400ec9d142b25dc2680171888e0a8f9d8338d264bc75870f08ab8d564b198b0ee95d2bac26edacbc66c
7
+ data.tar.gz: e7dd88214c37584d37c164dc1be3ec418adaa7e51bf5fce99b8f60ad648646378584f95d79d9bb7347df8fd8370f8d51b92fc006a9f6a25829ce6319005ebd8d
data/Gemfile CHANGED
@@ -4,3 +4,7 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in export_to.gemspec
6
6
  gemspec
7
+
8
+ gem "activesupport", ">= 6", "< 7"
9
+ gem "railties", ">= 6", "< 7"
10
+ gem "rake", ">= 13"
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- export_to (0.1.0)
5
- activesupport
4
+ export_to (0.1.2)
5
+ activesupport (>= 6, < 7)
6
6
  fast_excel
7
7
  iconv
8
8
  spreadsheet
@@ -10,37 +10,80 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- activesupport (5.2.1)
13
+ actionpack (6.1.7.2)
14
+ actionview (= 6.1.7.2)
15
+ activesupport (= 6.1.7.2)
16
+ rack (~> 2.0, >= 2.0.9)
17
+ rack-test (>= 0.6.3)
18
+ rails-dom-testing (~> 2.0)
19
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
20
+ actionview (6.1.7.2)
21
+ activesupport (= 6.1.7.2)
22
+ builder (~> 3.1)
23
+ erubi (~> 1.4)
24
+ rails-dom-testing (~> 2.0)
25
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
26
+ activesupport (6.1.7.2)
14
27
  concurrent-ruby (~> 1.0, >= 1.0.2)
15
- i18n (>= 0.7, < 2)
16
- minitest (~> 5.1)
17
- tzinfo (~> 1.1)
18
- concurrent-ruby (1.0.5)
19
- fast_excel (0.2.5)
28
+ i18n (>= 1.6, < 2)
29
+ minitest (>= 5.1)
30
+ tzinfo (~> 2.0)
31
+ zeitwerk (~> 2.3)
32
+ builder (3.2.4)
33
+ concurrent-ruby (1.2.0)
34
+ crass (1.0.6)
35
+ erubi (1.12.0)
36
+ fast_excel (0.4.1)
20
37
  ffi (> 1.9, < 2)
21
- ffi (1.9.25)
22
- i18n (1.1.1)
38
+ ffi (1.15.5)
39
+ i18n (1.12.0)
23
40
  concurrent-ruby (~> 1.0)
24
- iconv (1.0.5)
41
+ iconv (1.0.8)
42
+ loofah (2.19.1)
43
+ crass (~> 1.0.2)
44
+ nokogiri (>= 1.5.9)
45
+ method_source (1.0.0)
46
+ mini_portile2 (2.8.1)
25
47
  minitest (5.11.3)
26
- rake (10.5.0)
27
- ruby-ole (1.2.12.1)
48
+ nokogiri (1.14.1)
49
+ mini_portile2 (~> 2.8.0)
50
+ racc (~> 1.4)
51
+ racc (1.6.2)
52
+ rack (2.2.6.2)
53
+ rack-test (2.0.2)
54
+ rack (>= 1.3)
55
+ rails-dom-testing (2.0.3)
56
+ activesupport (>= 4.2.0)
57
+ nokogiri (>= 1.6)
58
+ rails-html-sanitizer (1.5.0)
59
+ loofah (~> 2.19, >= 2.19.1)
60
+ railties (6.1.7.2)
61
+ actionpack (= 6.1.7.2)
62
+ activesupport (= 6.1.7.2)
63
+ method_source
64
+ rake (>= 12.2)
65
+ thor (~> 1.0)
66
+ rake (13.0.6)
67
+ ruby-ole (1.2.12.2)
28
68
  shoulda-context (1.2.2)
29
- spreadsheet (1.1.8)
30
- ruby-ole (>= 1.0)
31
- thread_safe (0.3.6)
32
- tzinfo (1.2.5)
33
- thread_safe (~> 0.1)
69
+ spreadsheet (1.3.0)
70
+ ruby-ole
71
+ thor (1.2.1)
72
+ tzinfo (2.0.6)
73
+ concurrent-ruby (~> 1.0)
74
+ zeitwerk (2.6.6)
34
75
 
35
76
  PLATFORMS
36
77
  ruby
37
78
 
38
79
  DEPENDENCIES
39
- bundler (~> 1.16)
80
+ activesupport (>= 6, < 7)
81
+ bundler (>= 2.0.0)
40
82
  export_to!
41
83
  minitest (~> 5.0)
42
- rake (~> 10.0)
84
+ railties (>= 6, < 7)
85
+ rake (>= 13)
43
86
  shoulda-context
44
87
 
45
88
  BUNDLED WITH
46
- 1.16.6
89
+ 2.3.14
data/export_to.gemspec CHANGED
@@ -23,13 +23,13 @@ Gem::Specification.new do |spec|
23
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  spec.require_paths = ["lib"]
25
25
 
26
- spec.add_development_dependency "bundler", "~> 1.16"
27
- spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "bundler", ">= 2.0.0"
27
+ spec.add_development_dependency "rake", ">= 13"
28
28
  spec.add_development_dependency "minitest", "~> 5.0"
29
29
  spec.add_development_dependency "shoulda-context"
30
30
 
31
31
  spec.add_dependency "fast_excel"
32
32
  spec.add_dependency "spreadsheet"
33
33
  spec.add_dependency "iconv"
34
- spec.add_dependency "activesupport"
34
+ spec.add_dependency "activesupport", ">= 6", "< 7"
35
35
  end
@@ -1,72 +1,36 @@
1
1
  module ExportTo
2
2
  class Base < Struct.new(:records)
3
+ class_attribute :options
3
4
  class_attribute :head_titles
4
5
  class_attribute :body_keys
6
+ class_attribute :column_formats
5
7
  class_attribute :body_column_proc
8
+
6
9
  class_attribute :presenter_klass
7
10
  class_attribute :join_relation
8
11
  class_attribute :each_proc, :each_method
9
- class_attribute :xlsx_file_path, :xlsx_file_name
10
12
 
11
13
  # 預設 presenter
12
14
  self.presenter_klass = Presenter
13
15
  self.each_method = :each
14
- self.xlsx_file_path = '/tmp'
15
- self.xlsx_file_name = '/file'
16
16
 
17
17
  attr_accessor :object
18
18
 
19
19
  def to_csv
20
- CSV.generate(force_quotes: true) do |csv|
21
- rows! do |columns, model, x|
22
- csv << columns
23
- end
24
- end
20
+ ExportTo::Exporter::Csv.new(self).export
25
21
  end
26
22
 
27
23
  # 新版 Excel
28
- def to_xlsx(file_path=nil, file_name=nil)
29
- file_path ||= self.class.xlsx_file_path
30
- file_name ||= self.class.xlsx_file_name
31
- path = to_xlsx_file(file_path, file_name)
32
- # TODO: 讀取檔案回傳
33
- File.open(path, 'rb') { |f| f.read }
34
- end
35
-
36
- # 新版 Excel (outpuut: path)
37
- def to_xlsx_file(file_path="tmp", file_name="export")
38
- path = "#{file_path}/#{file_name}_#{Time.now.to_i}_#{SecureRandom.hex}.xlsx"
39
- workbook = FastExcel.open(path, constant_memory: true)
40
- worksheet = workbook.add_worksheet("Default")
41
-
42
- bold = workbook.bold_cell_format
43
- worksheet.set_row(0, FastExcel::DEF_COL_WIDTH, bold)
44
-
45
- rows! do |columns, model, x|
46
- worksheet.write_row(x, columns)
47
- end
48
-
49
- workbook.close
50
- path
24
+ def to_xlsx
25
+ ExportTo::Exporter::Xlsx.new(self).export
51
26
  end
52
27
 
53
28
  # 舊版 Excel
54
29
  def to_xls
55
- book = Spreadsheet::Workbook.new
56
- sheet = book.create_worksheet
57
-
58
- rows! do |columns, model, x|
59
- sheet.row(x).concat(columns)
60
- end
61
-
62
- spreadsheet = StringIO.new
63
- book.write(spreadsheet)
64
- spreadsheet.string
30
+ ExportTo::Exporter::Xlsx.new(self).export
65
31
  end
66
32
 
67
- protected
68
-
69
- def rows
33
+ def each
70
34
  data = []
71
35
  rows! do |columns, model, x|
72
36
  data.push(columns)
@@ -74,7 +38,7 @@ module ExportTo
74
38
  data
75
39
  end
76
40
 
77
- def rows!
41
+ def each!
78
42
  i = 0
79
43
 
80
44
  yield(self.class.head_titles, nil, i)
@@ -106,6 +70,8 @@ module ExportTo
106
70
  end
107
71
  end
108
72
 
73
+ private
74
+
109
75
  def each_models(&block)
110
76
  case self.class.each_method
111
77
  when :each
@@ -129,13 +95,19 @@ module ExportTo
129
95
 
130
96
  protected
131
97
 
132
- def set(title, key, &block)
98
+ def excel(options)
99
+ self.options = options
100
+ end
101
+
102
+ def set(title, key, format: {}, &block)
133
103
  self.head_titles ||= []
134
104
  self.body_keys ||= []
105
+ self.column_formats ||= []
135
106
  self.body_column_proc ||= []
136
107
 
137
108
  self.head_titles.push(title)
138
109
  self.body_keys.push(key)
110
+ self.column_formats.push(format)
139
111
  self.body_column_proc.push(block)
140
112
  end
141
113
 
@@ -0,0 +1,15 @@
1
+ module ExportTo
2
+ module Exporter
3
+ class Csv < Struct.new(:rows)
4
+
5
+ def export
6
+ CSV.generate(force_quotes: true) do |csv|
7
+ rows.each! do |columns, model, x|
8
+ csv << columns
9
+ end
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ module ExportTo
2
+ module Exporter
3
+ class Xls < Struct.new(:rows)
4
+
5
+ def to_xls
6
+ book = Spreadsheet::Workbook.new
7
+ sheet = book.create_worksheet
8
+
9
+ rows.each! do |columns, model, x|
10
+ sheet.row(x).concat(columns)
11
+ end
12
+
13
+ spreadsheet = StringIO.new
14
+ book.write(spreadsheet)
15
+
16
+ spreadsheet.string
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,62 @@
1
+ module ExportTo
2
+ module Exporter
3
+ class Xlsx < Struct.new(:rows)
4
+
5
+ def export
6
+ rows.each! do |columns, model, x|
7
+ worksheet.set_row(x, height, nil)
8
+ worksheet.write_row(x, columns)
9
+ end
10
+
11
+ workbook.read_string
12
+ end
13
+
14
+ protected
15
+
16
+ def workbook
17
+ @workbook ||= FastExcel.open(constant_memory: true)
18
+ end
19
+
20
+ def worksheet
21
+ @worksheet ||= begin
22
+ ws = workbook.add_worksheet(options.fetch(:worksheet) { "Default" })
23
+ # 設定表頭樣式
24
+ ws.set_row(0, height, head_format)
25
+
26
+ # 表身樣式
27
+ column_formats.each_with_index do |format, i|
28
+ next if format.blank?
29
+
30
+ width = format.delete(:width) { FastExcel::DEF_COL_WIDTH }
31
+
32
+ puts "#{i} -> #{width} -> #{format}"
33
+
34
+ ws.set_column(i, i, width, workbook.add_format(format))
35
+ end
36
+
37
+ ws
38
+ end
39
+ end
40
+
41
+ def head_format
42
+ workbook.add_format(bold: true, bg_color: "#e5dbad", align: { h: :center })
43
+ end
44
+
45
+ def options
46
+ @options ||= (rows.class.options || {})
47
+ end
48
+
49
+ def worksheet_name
50
+ options.fetch(:worksheet) { "Default" }
51
+ end
52
+
53
+ def height
54
+ options.fetch(:height) { 20 }
55
+ end
56
+
57
+ def column_formats
58
+ @column_formats ||= rows.class.column_formats.dup || []
59
+ end
60
+ end
61
+ end
62
+ end
@@ -1,3 +1,3 @@
1
1
  module ExportTo
2
- VERSION = "0.1.2"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/export_to.rb CHANGED
@@ -8,6 +8,9 @@ require 'iconv'
8
8
  require 'export_to/version'
9
9
  require 'export_to/presenter'
10
10
  require 'export_to/base'
11
+ require 'export_to/exporter/csv'
12
+ require 'export_to/exporter/xls'
13
+ require 'export_to/exporter/xlsx'
11
14
 
12
15
  module ExportTo
13
16
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: export_to
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - eddie
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-19 00:00:00.000000000 Z
11
+ date: 2023-02-02 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: '1.16'
19
+ version: 2.0.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: '1.16'
26
+ version: 2.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +114,20 @@ dependencies:
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: '6'
118
+ - - "<"
119
+ - !ruby/object:Gem::Version
120
+ version: '7'
118
121
  type: :runtime
119
122
  prerelease: false
120
123
  version_requirements: !ruby/object:Gem::Requirement
121
124
  requirements:
122
125
  - - ">="
123
126
  - !ruby/object:Gem::Version
124
- version: '0'
127
+ version: '6'
128
+ - - "<"
129
+ - !ruby/object:Gem::Version
130
+ version: '7'
125
131
  description: Export activerecord easiest way (csv, xls, xlsx)
126
132
  email:
127
133
  - eddie.li.624@gmail.com
@@ -141,6 +147,9 @@ files:
141
147
  - export_to.gemspec
142
148
  - lib/export_to.rb
143
149
  - lib/export_to/base.rb
150
+ - lib/export_to/exporter/csv.rb
151
+ - lib/export_to/exporter/xls.rb
152
+ - lib/export_to/exporter/xlsx.rb
144
153
  - lib/export_to/presenter.rb
145
154
  - lib/export_to/version.rb
146
155
  homepage: https://github.com/superlanding/export_to
@@ -162,8 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
171
  - !ruby/object:Gem::Version
163
172
  version: '0'
164
173
  requirements: []
165
- rubyforge_project:
166
- rubygems_version: 2.4.8
174
+ rubygems_version: 3.1.6
167
175
  signing_key:
168
176
  specification_version: 4
169
177
  summary: Export activerecord easiest way (csv, xls, xlsx)