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 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: []