xls_exporter 1.0.0 → 1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +18 -0
- data/.rubocop.yml +29 -0
- data/Gemfile +2 -0
- data/README.md +1 -1
- data/Rakefile +3 -1
- data/bin/console +1 -0
- data/lib/xls_exporter.rb +2 -0
- data/lib/xls_exporter/exporter.rb +60 -56
- data/lib/xls_exporter/styler.rb +65 -0
- data/lib/xls_exporter/version.rb +3 -1
- data/xls_exporter.gemspec +7 -5
- metadata +15 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6463c7e00d0f15bafbb55141cd339306bfd404196ebbfd011bec01e464413db4
|
4
|
+
data.tar.gz: 0c47bc36726b34dafed802dd81df30ebcc03b76c7bc73cf19ae6c7e02b8e6e09
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb27c82810662242ad2e2e74ca63fccb9dd6cb83a84bb2ac1d7cbbbd82d494bc1302814a5721912103c79d9ee4942341a0f11c814806d13dffd493bde49d10f3
|
7
|
+
data.tar.gz: fb568ebbc7c9ac5d059a291d0dc8a3f095d6f681e37af2a55c787bf0b1e890fbfdbcefbef1674965b52d29f392626311be03f3094b41679d249f81fcf41309a5
|
@@ -0,0 +1,18 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
steps:
|
9
|
+
- uses: actions/checkout@v1
|
10
|
+
- name: Set up Ruby
|
11
|
+
uses: actions/setup-ruby@v1
|
12
|
+
with:
|
13
|
+
ruby-versions: 2.6.5, 2.7.0, 2.5.7, 2.4.9
|
14
|
+
- name: Build and test with Rake
|
15
|
+
run: |
|
16
|
+
gem install bundler -v '2.1.2'
|
17
|
+
bundle install --jobs 4 --retry 3
|
18
|
+
rubocop
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
Documentation:
|
2
|
+
Enabled: false
|
3
|
+
Metrics/LineLength:
|
4
|
+
Max: 120
|
5
|
+
Metrics/BlockLength:
|
6
|
+
Enabled: false
|
7
|
+
Include:
|
8
|
+
- spec/
|
9
|
+
Metrics/AbcSize:
|
10
|
+
Max: 18
|
11
|
+
Style/ClassAndModuleChildren:
|
12
|
+
EnforcedStyle: compact
|
13
|
+
Exclude:
|
14
|
+
- config/application.rb
|
15
|
+
Layout/ArgumentAlignment:
|
16
|
+
EnforcedStyle: with_fixed_indentation
|
17
|
+
Style/MixinUsage:
|
18
|
+
Exclude:
|
19
|
+
- bin/*
|
20
|
+
AllCops:
|
21
|
+
Include:
|
22
|
+
- app/**/*.rb
|
23
|
+
- config/**/*.rb
|
24
|
+
- db/seeds.rb
|
25
|
+
- lib/**/*.rb
|
26
|
+
- spec/**/*.rb
|
27
|
+
- Gemfile
|
28
|
+
- Rakefile
|
29
|
+
TargetRubyVersion: 2.7
|
data/Gemfile
CHANGED
data/README.md
CHANGED
data/Rakefile
CHANGED
data/bin/console
CHANGED
data/lib/xls_exporter.rb
CHANGED
@@ -1,76 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spreadsheet'
|
4
|
+
require 'xls_exporter/styler'
|
2
5
|
|
3
|
-
|
4
|
-
|
5
|
-
def self.export(&block)
|
6
|
-
exporter = new
|
7
|
-
exporter.instance_exec(&block)
|
8
|
-
exporter.save!
|
9
|
-
end
|
6
|
+
class XlsExporter::Exporter
|
7
|
+
include XlsExporter::Styler
|
10
8
|
|
11
|
-
|
12
|
-
@book = Spreadsheet::Workbook.new
|
13
|
-
end
|
9
|
+
attr_writer :filename
|
14
10
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
def self.export(&block)
|
12
|
+
exporter = new
|
13
|
+
exporter.instance_exec(&block)
|
14
|
+
exporter.save!
|
15
|
+
end
|
20
16
|
|
21
|
-
|
22
|
-
|
17
|
+
def initialize
|
18
|
+
@book = Spreadsheet::Workbook.new
|
19
|
+
end
|
23
20
|
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
def add_sheet(sheet_name = nil)
|
22
|
+
save_sheet! if @sheet
|
23
|
+
@headers = []
|
24
|
+
@body = []
|
25
|
+
@sheet = @book.create_worksheet
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
@sheet.default_format = @format if @format.present?
|
28
|
+
@sheet.name = sheet_name
|
29
|
+
end
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
def headers(*args)
|
32
|
+
@headers = args
|
33
|
+
end
|
35
34
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
attr_writer :body
|
36
|
+
|
37
|
+
def humanize_columns(columns)
|
38
|
+
columns.map do |column|
|
39
|
+
column = column.keys.first if column.is_a? Hash
|
40
|
+
column.to_s.humanize
|
41
41
|
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def export_models(scope, *columns)
|
45
|
+
headers(*humanize_columns(columns))
|
46
|
+
@body = to_body scope, columns
|
47
|
+
end
|
42
48
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
instance.send column
|
52
|
-
end
|
49
|
+
def to_body(scope, columns)
|
50
|
+
scope.map do |instance|
|
51
|
+
columns.map do |column|
|
52
|
+
column = column.values.first if column.is_a? Hash
|
53
|
+
if column.is_a? Proc
|
54
|
+
instance.instance_exec(&column)
|
55
|
+
elsif column.is_a? Symbol
|
56
|
+
instance.send column
|
53
57
|
end
|
54
58
|
end
|
55
|
-
body to_body
|
56
59
|
end
|
60
|
+
end
|
57
61
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
62
|
+
def save_sheet!
|
63
|
+
@sheet.row(0).concat(@headers)
|
64
|
+
@body.each_with_index do |row, index|
|
65
|
+
@sheet.row(index + 1).concat(row)
|
63
66
|
end
|
67
|
+
end
|
64
68
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
69
|
+
def save!
|
70
|
+
save_sheet!
|
71
|
+
@book.worksheets.each { |worksheet| autofit worksheet }
|
72
|
+
if @filename.present?
|
73
|
+
filename = "./#{@filename}_#{Time.now.to_i}.xls"
|
74
|
+
@book.write(filename)
|
75
|
+
puts "Report has been saved as #{filename}"
|
76
|
+
else
|
77
|
+
@book
|
74
78
|
end
|
75
79
|
end
|
76
80
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module XlsExporter::Styler
|
4
|
+
def default_style(**options)
|
5
|
+
@format = Spreadsheet::Format.new(**options)
|
6
|
+
end
|
7
|
+
|
8
|
+
def line_height
|
9
|
+
font_size + 3
|
10
|
+
end
|
11
|
+
|
12
|
+
def words_in_line
|
13
|
+
@words_in_line || 5
|
14
|
+
end
|
15
|
+
|
16
|
+
def words_in_line=(count)
|
17
|
+
@words_in_line = count
|
18
|
+
end
|
19
|
+
|
20
|
+
def font_size
|
21
|
+
@font_size || 10
|
22
|
+
end
|
23
|
+
|
24
|
+
def font_size=(points)
|
25
|
+
@font_size = points
|
26
|
+
end
|
27
|
+
|
28
|
+
def autofit(worksheet)
|
29
|
+
fit_rows worksheet
|
30
|
+
fit_columns worksheet
|
31
|
+
end
|
32
|
+
|
33
|
+
def fit_rows(worksheet)
|
34
|
+
worksheet.rows.each do |row|
|
35
|
+
row.height = row.each_with_index.map do |cell|
|
36
|
+
cell.present? ? cell_height(cell) : line_height
|
37
|
+
end.max
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def fit_columns(worksheet)
|
42
|
+
worksheet.column_count.times do |col_idx|
|
43
|
+
column = worksheet.column(col_idx)
|
44
|
+
column.width = column.each_with_index.map do |cell|
|
45
|
+
cell.present? ? cell_width(cell) : 0
|
46
|
+
end.max
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def cell_height(cell)
|
51
|
+
lines = words(cell).count / words_in_line
|
52
|
+
lines += 1 if words(cell).count % words_in_line != 0
|
53
|
+
lines * line_height
|
54
|
+
end
|
55
|
+
|
56
|
+
def cell_width(cell)
|
57
|
+
words(cell).each_slice(words_in_line).map do |line|
|
58
|
+
line.join(' ').size
|
59
|
+
end.max
|
60
|
+
end
|
61
|
+
|
62
|
+
def words(string)
|
63
|
+
string.split(' ')
|
64
|
+
end
|
65
|
+
end
|
data/lib/xls_exporter/version.rb
CHANGED
data/xls_exporter.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'xls_exporter/version'
|
5
6
|
|
@@ -9,8 +10,9 @@ Gem::Specification.new do |spec|
|
|
9
10
|
spec.authors = ['Artyom Keydunov', 'Pavel Kalashnikov']
|
10
11
|
spec.email = ['kalashnikovisme@gmail.com']
|
11
12
|
|
12
|
-
spec.summary =
|
13
|
-
spec.
|
13
|
+
spec.summary = 'Write a short summary, because Rubygems requires one.'
|
14
|
+
spec.description = 'Write a longer description or delete this line.'
|
15
|
+
spec.homepage = 'https://github.com/uchiru/xls-exporter'
|
14
16
|
|
15
17
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
16
18
|
spec.bindir = 'exe'
|
@@ -18,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
18
20
|
spec.require_paths = ['lib']
|
19
21
|
|
20
22
|
spec.add_development_dependency 'bundler', '~> 1.11'
|
21
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
22
23
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
24
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
23
25
|
spec.add_dependency 'spreadsheet'
|
24
26
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xls_exporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: '1.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artyom Keydunov
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-03-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -26,33 +26,33 @@ dependencies:
|
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '1.11'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
29
|
+
name: minitest
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
34
|
+
version: '5.0'
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
41
|
+
version: '5.0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: rake
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
48
|
+
version: '10.0'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
55
|
+
version: '10.0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: spreadsheet
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,14 +67,16 @@ dependencies:
|
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
|
-
description:
|
70
|
+
description: Write a longer description or delete this line.
|
71
71
|
email:
|
72
72
|
- kalashnikovisme@gmail.com
|
73
73
|
executables: []
|
74
74
|
extensions: []
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
|
+
- ".github/workflows/ruby.yml"
|
77
78
|
- ".gitignore"
|
79
|
+
- ".rubocop.yml"
|
78
80
|
- ".travis.yml"
|
79
81
|
- Gemfile
|
80
82
|
- README.md
|
@@ -83,9 +85,10 @@ files:
|
|
83
85
|
- bin/setup
|
84
86
|
- lib/xls_exporter.rb
|
85
87
|
- lib/xls_exporter/exporter.rb
|
88
|
+
- lib/xls_exporter/styler.rb
|
86
89
|
- lib/xls_exporter/version.rb
|
87
90
|
- xls_exporter.gemspec
|
88
|
-
homepage: https://github.com/
|
91
|
+
homepage: https://github.com/uchiru/xls-exporter
|
89
92
|
licenses: []
|
90
93
|
metadata: {}
|
91
94
|
post_install_message:
|
@@ -103,9 +106,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
106
|
- !ruby/object:Gem::Version
|
104
107
|
version: '0'
|
105
108
|
requirements: []
|
106
|
-
|
107
|
-
rubygems_version: 2.5.2
|
109
|
+
rubygems_version: 3.1.2
|
108
110
|
signing_key:
|
109
111
|
specification_version: 4
|
110
|
-
summary:
|
112
|
+
summary: Write a short summary, because Rubygems requires one.
|
111
113
|
test_files: []
|