xls_exporter 1.0.0 → 1.2
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 +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: []
|