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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2e3bad06d6aaee0001521bcadf5c246b4bb802e8
4
- data.tar.gz: '01082d6a75c2a0c264d2cf0cf7101c3a6632b58f'
2
+ SHA256:
3
+ metadata.gz: 6463c7e00d0f15bafbb55141cd339306bfd404196ebbfd011bec01e464413db4
4
+ data.tar.gz: 0c47bc36726b34dafed802dd81df30ebcc03b76c7bc73cf19ae6c7e02b8e6e09
5
5
  SHA512:
6
- metadata.gz: 59d31aa2289bfe1504a4b3e04303c347f44d05502328049c0910a108c8ef6c6d2dd36945cadfd20d45dcb81dfafa2a04c0a8b765f5428453219d9759401d0e63
7
- data.tar.gz: 7e1d1c3692de8eb4c64aa6fa98fb5abfce4e20620ff069c6eca49d040457375e8770dc6943e599e0f76ce68b8faac435494075a7602ff6732439be4f07ae1fcd
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in xls_exporter.gemspec
data/README.md CHANGED
@@ -26,7 +26,7 @@ end
26
26
 
27
27
  require 'xls_exporter'
28
28
 
29
- XlsExport.export do
29
+ XlsExporter.export do
30
30
  filename 'your-file-name'
31
31
 
32
32
  add_sheet 'your-sheet-name'
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rake/testtask'
3
5
 
@@ -7,4 +9,4 @@ Rake::TestTask.new(:test) do |t|
7
9
  t.test_files = FileList['test/**/*_test.rb']
8
10
  end
9
11
 
10
- task :default => :spec
12
+ task default: :spec
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'xls_exporter'
data/lib/xls_exporter.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'xls_exporter/version'
2
4
  require 'xls_exporter/exporter'
3
5
 
@@ -1,76 +1,80 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spreadsheet'
4
+ require 'xls_exporter/styler'
2
5
 
3
- module XlsExporter
4
- class Exporter
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
- def initialize
12
- @book = Spreadsheet::Workbook.new
13
- end
9
+ attr_writer :filename
14
10
 
15
- def add_sheet(sheet_name = nil)
16
- save_sheet! if @sheet
17
- @headers = []
18
- @body = []
19
- @sheet = @book.create_worksheet
11
+ def self.export(&block)
12
+ exporter = new
13
+ exporter.instance_exec(&block)
14
+ exporter.save!
15
+ end
20
16
 
21
- @sheet.name = sheet_name
22
- end
17
+ def initialize
18
+ @book = Spreadsheet::Workbook.new
19
+ end
23
20
 
24
- def filename(new_filename)
25
- @filename = new_filename
26
- end
21
+ def add_sheet(sheet_name = nil)
22
+ save_sheet! if @sheet
23
+ @headers = []
24
+ @body = []
25
+ @sheet = @book.create_worksheet
27
26
 
28
- def headers(*args)
29
- @headers = args
30
- end
27
+ @sheet.default_format = @format if @format.present?
28
+ @sheet.name = sheet_name
29
+ end
31
30
 
32
- def body(new_body)
33
- @body = new_body
34
- end
31
+ def headers(*args)
32
+ @headers = args
33
+ end
35
34
 
36
- def humanize_columns(columns)
37
- columns.map do |column|
38
- column = column.keys.first if column.is_a? Hash
39
- column.to_s.humanize
40
- end
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
- def export_models(scope, *columns)
44
- headers(*humanize_columns(columns))
45
- to_body = scope.map do |instance|
46
- columns.map do |column|
47
- column = column.values.first if column.is_a? Hash
48
- if column.is_a? Proc
49
- instance.instance_exec(&column)
50
- elsif column.is_a? Symbol
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
- def save_sheet!
59
- @sheet.row(0).concat(@headers)
60
- @body.each_with_index do |row, index|
61
- @sheet.row(index + 1).concat(row)
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
- def save!
66
- save_sheet!
67
- if @filename.present?
68
- filename = "./#{@filename}_#{Time.now.to_i}.xls"
69
- @book.write(filename)
70
- puts "Report has been saved as #{filename}"
71
- else
72
- @book
73
- end
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module XlsExporter
2
- VERSION = '1.0.0'
4
+ VERSION = '1.2'
3
5
  end
data/xls_exporter.gemspec CHANGED
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
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 = %q{Creates xls files with collection attributes.}
13
- spec.homepage = 'https://github.com/kalashnikovisme/xls-exporter'
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.0.0
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: 2017-02-07 00:00:00.000000000 Z
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: rake
29
+ name: minitest
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '10.0'
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: '10.0'
41
+ version: '5.0'
42
42
  - !ruby/object:Gem::Dependency
43
- name: minitest
43
+ name: rake
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '5.0'
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: '5.0'
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/kalashnikovisme/xls-exporter
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
- rubyforge_project:
107
- rubygems_version: 2.5.2
109
+ rubygems_version: 3.1.2
108
110
  signing_key:
109
111
  specification_version: 4
110
- summary: Creates xls files with collection attributes.
112
+ summary: Write a short summary, because Rubygems requires one.
111
113
  test_files: []