comma 4.2.0 → 4.5.0

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.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +12 -1
  3. data/.rubocop_todo.yml +3 -364
  4. data/.travis.yml +26 -57
  5. data/Appraisals +31 -1
  6. data/Gemfile +5 -1
  7. data/Gemfile.lock +54 -36
  8. data/README.md +3 -3
  9. data/Rakefile +2 -0
  10. data/comma.gemspec +13 -14
  11. data/gemfiles/active5.0.7.2.gemfile +12 -0
  12. data/gemfiles/active5.0.7.2.gemfile.lock +113 -0
  13. data/gemfiles/active5.1.7.gemfile +12 -0
  14. data/gemfiles/active5.1.7.gemfile.lock +113 -0
  15. data/gemfiles/active5.2.4.3.gemfile +12 -0
  16. data/gemfiles/{active5.2.0.gemfile.lock → active5.2.4.3.gemfile.lock} +48 -41
  17. data/gemfiles/active6.0.3.1.gemfile +12 -0
  18. data/gemfiles/active6.0.3.1.gemfile.lock +113 -0
  19. data/gemfiles/active6.1.0.gemfile +12 -0
  20. data/gemfiles/active6.1.0.gemfile.lock +112 -0
  21. data/gemfiles/{rails5.0.1.gemfile → rails5.0.7.2.gemfile} +5 -2
  22. data/gemfiles/rails5.0.7.2.gemfile.lock +204 -0
  23. data/gemfiles/{rails4.2.8.gemfile → rails5.1.7.gemfile} +5 -2
  24. data/gemfiles/{rails5.2.0.gemfile.lock → rails5.1.7.gemfile.lock} +97 -97
  25. data/gemfiles/rails5.2.4.3.gemfile +14 -0
  26. data/gemfiles/rails5.2.4.3.gemfile.lock +212 -0
  27. data/gemfiles/{rails4.1.16.gemfile → rails6.0.3.1.gemfile} +4 -2
  28. data/gemfiles/rails6.0.3.1.gemfile.lock +227 -0
  29. data/gemfiles/{rails4.0.13.gemfile → rails6.1.0.gemfile} +4 -2
  30. data/gemfiles/rails6.1.0.gemfile.lock +230 -0
  31. data/init.rb +2 -0
  32. data/lib/comma.rb +26 -35
  33. data/lib/comma/array.rb +2 -0
  34. data/lib/comma/data_extractor.rb +5 -5
  35. data/lib/comma/data_mapper_collection.rb +9 -3
  36. data/lib/comma/extractor.rb +3 -5
  37. data/lib/comma/generator.rb +11 -11
  38. data/lib/comma/header_extractor.rb +19 -14
  39. data/lib/comma/mongoid.rb +10 -7
  40. data/lib/comma/object.rb +5 -1
  41. data/lib/comma/relation.rb +16 -10
  42. data/lib/comma/version.rb +3 -1
  43. data/spec/comma/comma_spec.rb +71 -50
  44. data/spec/comma/data_extractor_spec.rb +13 -17
  45. data/spec/comma/header_extractor_spec.rb +7 -13
  46. data/spec/comma/rails/active_record_spec.rb +34 -33
  47. data/spec/comma/rails/data_mapper_collection_spec.rb +4 -3
  48. data/spec/comma/rails/mongoid_spec.rb +8 -7
  49. data/spec/controllers/users_controller_spec.rb +83 -70
  50. data/spec/non_rails_app/ruby_classes.rb +13 -6
  51. data/spec/rails_app/active_record/config.rb +3 -1
  52. data/spec/rails_app/active_record/models.rb +4 -2
  53. data/spec/rails_app/data_mapper/config.rb +2 -0
  54. data/spec/rails_app/mongoid/config.rb +4 -2
  55. data/spec/rails_app/rails_app.rb +12 -11
  56. data/spec/rails_app/tmp/.gitkeep +0 -0
  57. data/spec/spec_helper.rb +21 -4
  58. metadata +31 -48
  59. data/gemfiles/active4.0.13.gemfile +0 -10
  60. data/gemfiles/active4.0.13.gemfile.lock +0 -107
  61. data/gemfiles/active4.1.16.gemfile +0 -10
  62. data/gemfiles/active4.1.16.gemfile.lock +0 -106
  63. data/gemfiles/active4.2.8.gemfile +0 -10
  64. data/gemfiles/active4.2.8.gemfile.lock +0 -105
  65. data/gemfiles/active5.0.1.gemfile +0 -10
  66. data/gemfiles/active5.0.1.gemfile.lock +0 -104
  67. data/gemfiles/active5.1.0.gemfile +0 -10
  68. data/gemfiles/active5.1.0.gemfile.lock +0 -104
  69. data/gemfiles/active5.2.0.gemfile +0 -10
  70. data/gemfiles/rails4.0.13.gemfile.lock +0 -158
  71. data/gemfiles/rails4.1.16.gemfile.lock +0 -162
  72. data/gemfiles/rails4.2.8.gemfile.lock +0 -187
  73. data/gemfiles/rails5.0.1.gemfile.lock +0 -194
  74. data/gemfiles/rails5.1.0.gemfile +0 -11
  75. data/gemfiles/rails5.1.0.gemfile.lock +0 -194
  76. data/gemfiles/rails5.2.0.gemfile +0 -11
data/init.rb CHANGED
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'comma'
@@ -1,26 +1,13 @@
1
- # load the right csv library
2
- if RUBY_VERSION >= '1.9'
3
- require 'csv'
4
- CSV_HANDLER = CSV
5
- else
6
- begin
7
- gem 'fastercsv'
8
- require 'fastercsv'
1
+ # frozen_string_literal: true
9
2
 
10
- CSV_HANDLER = FasterCSV
11
- rescue LoadError => e
12
- raise "Error : FasterCSV not installed, please `gem install fastercsv` for faster processing on <Ruby 1.9"
13
- end
14
- end
15
-
16
- raise "Error - This Comma version only supports Rails 3.x. Please use a 2.x version of Comma for use with earlier rails versions." if
17
- defined? Rails and (Rails.version.split('.').map(&:to_i).first < 3)
3
+ require 'csv'
4
+ CSV_HANDLER = CSV
18
5
 
19
6
  module Comma
20
7
  DEFAULT_OPTIONS = {
21
- :write_headers => true,
22
- :style => :default
23
- }
8
+ write_headers: true,
9
+ style: :default
10
+ }.freeze
24
11
  end
25
12
 
26
13
  require 'active_support/lazy_load_hooks'
@@ -38,30 +25,34 @@ require 'comma/generator'
38
25
  require 'comma/array'
39
26
  require 'comma/object'
40
27
 
41
- #Load into Rails controllers
28
+ # Load into Rails controllers
42
29
  ActiveSupport.on_load(:action_controller) do
43
30
  if defined?(ActionController::Renderers) && ActionController::Renderers.respond_to?(:add)
44
31
  ActionController::Renderers.add :csv do |obj, options|
45
32
  filename = options[:filename] || 'data'
46
33
  extension = options[:extension] || 'csv'
47
-
48
- if Rails.version >= "5.0.0"
49
- mime_type = options[:mime_type] || Mime[:csv]
50
- else
51
- mime_type = options[:mime_type] || Mime::CSV
52
- end
53
-
54
- #Capture any CSV optional settings passed to comma or comma specific options
55
- csv_options = options.slice(*CSV_HANDLER::DEFAULT_OPTIONS.merge(Comma::DEFAULT_OPTIONS).keys).each_with_object({}) do |(k, v), h|
34
+ mime_type = if Rails.version >= '5.0.0'
35
+ options[:mime_type] || Mime[:csv]
36
+ else
37
+ options[:mime_type] || Mime::CSV
38
+ end
39
+ with_bom = options.delete(:with_bom) || false
40
+
41
+ # Capture any CSV optional settings passed to comma or comma specific options
42
+ csv_options = options.slice(*CSV_HANDLER::DEFAULT_OPTIONS.merge(Comma::DEFAULT_OPTIONS).keys)
43
+ csv_options = csv_options.each_with_object({}) do |(k, v), h|
56
44
  # XXX: Convert string to boolean
57
45
  h[k] = case k
58
- when :write_headers
59
- v = (v != 'false') if v.is_a?(String)
60
- else
61
- v
62
- end
46
+ when :write_headers
47
+ (v != 'false') if v.is_a?(String)
48
+ else
49
+ v
50
+ end
63
51
  end
64
- send_data obj.to_comma(csv_options), :type => mime_type, :disposition => "attachment; filename=\"#{filename}.#{extension}\""
52
+ data = obj.to_comma(csv_options)
53
+ data = "\xEF\xBB\xBF#{data}" if with_bom
54
+ disposition = "attachment; filename=\"#{filename}.#{extension}\""
55
+ send_data data, type: mime_type, disposition: disposition
65
56
  end
66
57
  end
67
58
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Array
2
4
  def to_comma(style = :default)
3
5
  Comma::Generator.new(self, style).run(:each)
@@ -1,9 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'comma/extractor'
2
4
 
3
5
  module Comma
4
-
5
6
  class DataExtractor < Extractor
6
-
7
7
  class ExtractValueFromInstance
8
8
  def initialize(instance)
9
9
  @instance = instance
@@ -42,7 +42,7 @@ module Comma
42
42
 
43
43
  def null_association
44
44
  @null_association ||= Class.new(Class.const_defined?(:BasicObject) ? ::BasicObject : ::Object) do
45
- def method_missing(symbol, *args, &block)
45
+ def method_missing(_symbol, *_args, &_block)
46
46
  nil
47
47
  end
48
48
  end.new
@@ -56,7 +56,7 @@ module Comma
56
56
  args.each do |arg|
57
57
  case arg
58
58
  when Hash
59
- arg.each do |k, v|
59
+ arg.each do |k, _v|
60
60
  @results << ExtractValueFromAssociationOfInstance.new(@instance, sym).extract(k, &block)
61
61
  end
62
62
  when Symbol
@@ -69,7 +69,7 @@ module Comma
69
69
  end
70
70
  end
71
71
 
72
- def __static_column__(header = nil, &block)
72
+ def __static_column__(_header = nil, &block)
73
73
  @results << (block ? yield(@instance) : nil)
74
74
  end
75
75
  end
@@ -1,5 +1,11 @@
1
- class DataMapper::Collection
2
- def to_comma(style = :default)
3
- Comma::Generator.new(self, style).run(:each)
1
+ # frozen_string_literal: true
2
+
3
+ if defined?(DataMapper)
4
+ module DataMapper
5
+ class Collection
6
+ def to_comma(style = :default)
7
+ Comma::Generator.new(self, style).run(:each)
8
+ end
9
+ end
4
10
  end
5
11
  end
@@ -1,7 +1,7 @@
1
- module Comma
1
+ # frozen_string_literal: true
2
2
 
3
+ module Comma
3
4
  class Extractor
4
-
5
5
  def initialize(instance, style, formats)
6
6
  @instance = instance
7
7
  @style = style
@@ -10,7 +10,7 @@ module Comma
10
10
  end
11
11
 
12
12
  def results
13
- instance_eval &@formats[@style]
13
+ instance_eval(&@formats[@style])
14
14
  @results.map { |r| convert_to_data_value(r) }
15
15
  end
16
16
 
@@ -28,7 +28,5 @@ module Comma
28
28
  def convert_to_data_value(result)
29
29
  result.nil? ? result : result.to_s
30
30
  end
31
-
32
31
  end
33
-
34
32
  end
@@ -1,24 +1,24 @@
1
- module Comma
1
+ # frozen_string_literal: true
2
2
 
3
+ module Comma
3
4
  class Generator
4
-
5
5
  def initialize(instance, style)
6
6
  @instance = instance
7
7
  @style = style
8
8
  @options = {}
9
9
 
10
- if @style.is_a? Hash
11
- @options = @style.clone
12
- @style = @options.delete(:style) || Comma::DEFAULT_OPTIONS[:style]
13
- @filename = @options.delete(:filename)
14
- end
10
+ return unless @style.is_a?(Hash)
11
+
12
+ @options = @style.clone
13
+ @style = @options.delete(:style) || Comma::DEFAULT_OPTIONS[:style]
14
+ @filename = @options.delete(:filename)
15
15
  end
16
16
 
17
17
  def run(iterator_method)
18
18
  if @filename
19
- CSV_HANDLER.open(@filename, 'w', @options){ |csv| append_csv(csv, iterator_method) } and return true
19
+ CSV_HANDLER.open(@filename, 'w', **@options) { |csv| append_csv(csv, iterator_method) } && (return true)
20
20
  else
21
- CSV_HANDLER.generate(@options){ |csv| append_csv(csv, iterator_method) }
21
+ CSV_HANDLER.generate(**@options) { |csv| append_csv(csv, iterator_method) }
22
22
  end
23
23
  end
24
24
 
@@ -26,12 +26,12 @@ module Comma
26
26
 
27
27
  def append_csv(csv, iterator_method)
28
28
  return '' if @instance.empty?
29
+
29
30
  csv << @instance.first.to_comma_headers(@style) unless
30
- @options.has_key?(:write_headers) && !@options[:write_headers]
31
+ @options.key?(:write_headers) && !@options[:write_headers]
31
32
  @instance.send(iterator_method) do |object|
32
33
  csv << object.to_comma(@style)
33
34
  end
34
35
  end
35
-
36
36
  end
37
37
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'comma/extractor'
2
4
  require 'active_support/core_ext/class/attribute'
3
5
  require 'active_support/core_ext/date_time/conversions'
@@ -6,44 +8,47 @@ require 'active_support/core_ext/string/inflections'
6
8
 
7
9
  module Comma
8
10
  class HeaderExtractor < Extractor
9
-
10
11
  class_attribute :value_humanizer
11
12
 
12
- DEFAULT_VALUE_HUMANIZER = lambda do |value, model_class|
13
+ DEFAULT_VALUE_HUMANIZER = lambda do |value, _model_class|
13
14
  value.is_a?(String) ? value : value.to_s.humanize
14
15
  end
15
16
  self.value_humanizer = DEFAULT_VALUE_HUMANIZER
16
17
 
17
- def method_missing(sym, *args, &block)
18
+ def method_missing(sym, *args, &_block)
18
19
  model_class = @instance.class
19
- @results << self.value_humanizer.call(sym, model_class) if args.blank?
20
+ @results << value_humanizer.call(sym, model_class) if args.blank?
20
21
  args.each do |arg|
21
22
  case arg
22
23
  when Hash
23
- arg.each do |k, v|
24
- @results << self.value_humanizer.call(v, get_association_class(model_class, sym))
24
+ arg.each do |_k, v|
25
+ @results << value_humanizer.call(v, get_association_class(model_class, sym))
25
26
  end
26
27
  when Symbol
27
- @results << self.value_humanizer.call(arg, get_association_class(model_class, sym))
28
+ @results << value_humanizer.call(arg, get_association_class(model_class, sym))
28
29
  when String
29
- @results << self.value_humanizer.call(arg, model_class)
30
+ @results << value_humanizer.call(arg, model_class)
30
31
  else
31
32
  raise "Unknown header symbol #{arg.inspect}"
32
33
  end
33
34
  end
34
35
  end
35
36
 
36
- def __static_column__(header = '', &block)
37
+ def __static_column__(header = '', &_block)
37
38
  @results << header
38
39
  end
39
40
 
40
41
  private
41
42
 
42
- def get_association_class(model_class, association)
43
- if model_class.respond_to?(:reflect_on_association)
44
- association = model_class.reflect_on_association(association)
45
- association.klass rescue nil
46
- end
43
+ def get_association_class(model_class, association)
44
+ return unless model_class.respond_to?(:reflect_on_association)
45
+
46
+ begin
47
+ model_class.reflect_on_association(association)&.klass
48
+ rescue ArgumentError, NameError
49
+ # Since Rails 5.2, ArgumentError is raised.
50
+ nil
51
+ end
47
52
  end
48
53
  end
49
54
  end
@@ -1,12 +1,15 @@
1
- #Conditionally set to_comma on Mongoid records if mongoid gem is installed
1
+ # frozen_string_literal: true
2
+
3
+ # Conditionally set to_comma on Mongoid records if mongoid gem is installed
2
4
  begin
3
5
  require 'mongoid'
4
- class Mongoid::Criteria
5
- def to_comma(style = :default)
6
- Comma::Generator.new(self, style).run(:each)
6
+
7
+ module Mongoid
8
+ class Criteria
9
+ def to_comma(style = :default)
10
+ Comma::Generator.new(self, style).run(:each)
11
+ end
7
12
  end
8
13
  end
9
- rescue LoadError
14
+ rescue LoadError # rubocop:disable Lint/HandleExceptions
10
15
  end
11
-
12
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'comma/data_extractor'
2
4
  require 'comma/header_extractor'
3
5
 
@@ -31,6 +33,8 @@ class Object
31
33
  end
32
34
 
33
35
  def raise_unless_style_exists(style)
34
- raise "No comma format for class #{self.class} defined for style #{style}" unless self.comma_formats && self.comma_formats[style]
36
+ return if self.comma_formats && self.comma_formats[style]
37
+
38
+ raise "No comma format for class #{self.class} defined for style #{style}"
35
39
  end
36
40
  end
@@ -1,12 +1,18 @@
1
- class ActiveRecord::Relation
2
- def to_comma(style = :default)
3
- iterator_method =
4
- if arel.ast.limit || !arel.ast.orders.empty?
5
- Rails.logger.warn "#to_comma is being used on a relation with limit or order clauses. Falling back to iterating with :each. This can cause performance issues." if defined?(Rails)
6
- :each
7
- else
8
- :find_each
9
- end
10
- Comma::Generator.new(self, style).run(iterator_method)
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class Relation
5
+ def to_comma(style = :default)
6
+ iterator_method =
7
+ if arel.ast.limit || !arel.ast.orders.empty?
8
+ Rails.logger.warn { <<~WARN } if defined?(Rails)
9
+ #to_comma is being used on a relation with limit or order clauses. Falling back to iterating with :each. This can cause performance issues.
10
+ WARN
11
+ :each
12
+ else
13
+ :find_each
14
+ end
15
+ Comma::Generator.new(self, style).run(iterator_method)
16
+ end
11
17
  end
12
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Comma
2
- VERSION = '4.2.0'
4
+ VERSION = '4.5.0'
3
5
  end
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.dirname(__FILE__) + '/../spec_helper'
2
4
 
3
5
  describe Comma do
4
-
5
6
  it 'should extend object to add a comma method' do
6
7
  expect(Object).to respond_to(:comma)
7
8
  end
@@ -30,7 +31,6 @@ describe Comma do
30
31
  end
31
32
 
32
33
  describe Comma, 'generating CSV' do # rubocop:disable Metrics/BlockLength
33
-
34
34
  before do
35
35
  @isbn = Isbn.new('123123123', '321321321')
36
36
  @book = Book.new('Smalltalk-80', 'Language and Implementation', @isbn)
@@ -40,53 +40,54 @@ describe Comma, 'generating CSV' do # rubocop:disable Metrics/BlockLength
40
40
  end
41
41
 
42
42
  it 'should extend Array to add a #to_comma method which will return CSV content for objects within the array' do
43
- expect(@books.to_comma).to eq("Title,Description,Issuer,ISBN-10,ISBN-13\nSmalltalk-80,Language and Implementation,ISBN,123123123,321321321\n")
43
+ expected = "Title,Description,Issuer,ISBN-10,ISBN-13\nSmalltalk-80,Language and Implementation,ISBN,123123123,321321321\n" # rubocop:disable Metrics/LineLength
44
+ expect(@books.to_comma).to eq(expected)
44
45
  end
45
46
 
46
47
  it 'should return an empty string when generating CSV from an empty array' do
47
- expect(Array.new.to_comma).to eq('')
48
+ expect([].to_comma).to eq('')
48
49
  end
49
50
 
50
- it "should change the style when specified" do
51
+ it 'should change the style when specified' do
51
52
  expect(@books.to_comma(:brief)).to eq("Name,Description\nSmalltalk-80,Language and Implementation\n")
52
53
  end
53
54
 
54
55
  describe 'with :filename specified' do
55
- after{ File.delete('comma.csv') }
56
+ after { File.delete('comma.csv') }
56
57
 
57
- it "should write to the file" do
58
- @books.to_comma(:filename => 'comma.csv')
59
- expect(File.read('comma.csv')).to eq("Title,Description,Issuer,ISBN-10,ISBN-13\nSmalltalk-80,Language and Implementation,ISBN,123123123,321321321\n")
58
+ it 'should write to the file' do
59
+ @books.to_comma(filename: 'comma.csv')
60
+ expected = "Title,Description,Issuer,ISBN-10,ISBN-13\nSmalltalk-80,Language and Implementation,ISBN,123123123,321321321\n" # rubocop:disable Metrics/LineLength
61
+ expect(File.read('comma.csv')).to eq(expected)
60
62
  end
61
63
 
62
- it "should accept FasterCSV options" do
63
- @books.to_comma(:filename => 'comma.csv', :col_sep => ';', :force_quotes => true)
64
- expect(File.read('comma.csv')).to eq("\"Title\";\"Description\";\"Issuer\";\"ISBN-10\";\"ISBN-13\"\n\"Smalltalk-80\";\"Language and Implementation\";\"ISBN\";\"123123123\";\"321321321\"\n")
64
+ it 'should accept FasterCSV options' do
65
+ @books.to_comma(filename: 'comma.csv', col_sep: ';', force_quotes: true)
66
+ expected = "\"Title\";\"Description\";\"Issuer\";\"ISBN-10\";\"ISBN-13\"\n\"Smalltalk-80\";\"Language and Implementation\";\"ISBN\";\"123123123\";\"321321321\"\n" # rubocop:disable Metrics/LineLength
67
+ expect(File.read('comma.csv')).to eq(expected)
65
68
  end
66
-
67
69
  end
68
70
 
69
- describe "with FasterCSV options" do
70
- it "should not change when options are empty" do
71
- expect(@books.to_comma({})).to eq("Title,Description,Issuer,ISBN-10,ISBN-13\nSmalltalk-80,Language and Implementation,ISBN,123123123,321321321\n")
71
+ describe 'with FasterCSV options' do
72
+ it 'should not change when options are empty' do
73
+ expected = "Title,Description,Issuer,ISBN-10,ISBN-13\nSmalltalk-80,Language and Implementation,ISBN,123123123,321321321\n" # rubocop:disable Metrics/LineLength
74
+ expect(@books.to_comma({})).to eq(expected)
72
75
  end
73
76
 
74
77
  it 'should accept the options in #to_comma and generate the appropriate CSV' do
75
- expect(@books.to_comma(:col_sep => ';', :force_quotes => true))
76
- .to eq("\"Title\";\"Description\";\"Issuer\";\"ISBN-10\";\"ISBN-13\"\n\"Smalltalk-80\";\"Language and Implementation\";\"ISBN\";\"123123123\";\"321321321\"\n")
78
+ expected = "\"Title\";\"Description\";\"Issuer\";\"ISBN-10\";\"ISBN-13\"\n\"Smalltalk-80\";\"Language and Implementation\";\"ISBN\";\"123123123\";\"321321321\"\n" # rubocop:disable Metrics/LineLength
79
+ expect(@books.to_comma(col_sep: ';', force_quotes: true)).to eq(expected)
77
80
  end
78
81
 
79
- it "should change the style when specified" do
80
- expect(@books.to_comma(:style => :brief, :col_sep => ';', :force_quotes => true))
82
+ it 'should change the style when specified' do
83
+ expect(@books.to_comma(style: :brief, col_sep: ';', force_quotes: true))
81
84
  .to eq("\"Name\";\"Description\"\n\"Smalltalk-80\";\"Language and Implementation\"\n")
82
85
  end
83
86
  end
84
87
  end
85
88
 
86
89
  describe Comma, 'defining CSV descriptions' do
87
-
88
90
  describe 'with an unnamed description' do
89
-
90
91
  before do
91
92
  class Foo
92
93
  comma do; end
@@ -100,7 +101,6 @@ describe Comma, 'defining CSV descriptions' do
100
101
  end
101
102
 
102
103
  describe 'with a named description' do
103
-
104
104
  before do
105
105
  class Bar
106
106
  comma do; end
@@ -117,9 +117,7 @@ describe Comma, 'defining CSV descriptions' do
117
117
  end
118
118
 
119
119
  describe Comma, 'to_comma data/headers object extensions' do # rubocop:disable Metrics/BlockLength
120
-
121
120
  describe 'with unnamed descriptions' do
122
-
123
121
  before do
124
122
  class Foo
125
123
  attr_accessor :content
@@ -144,11 +142,9 @@ describe Comma, 'to_comma data/headers object extensions' do # rubocop:disable M
144
142
  it 'should return the CSV representation including header and content when called on an array' do
145
143
  expect(Array(@foo).to_comma).to eq("Content\ncontent\n")
146
144
  end
147
-
148
145
  end
149
146
 
150
147
  describe 'with named descriptions' do
151
-
152
148
  before do
153
149
  class Foo
154
150
  attr_accessor :content
@@ -175,11 +171,10 @@ describe Comma, 'to_comma data/headers object extensions' do # rubocop:disable M
175
171
  end
176
172
 
177
173
  it 'should raise an error if the requested description is not avaliable' do
178
- expect { @foo.to_comma(:bad) }.to raise_error
179
- expect { @foo.to_comma_headers(:bad) }.to raise_error
180
- expect { Array(@foo).to_comma(:bad) }.to raise_error
174
+ expect { @foo.to_comma(:bad) }.to raise_error(RuntimeError)
175
+ expect { @foo.to_comma_headers(:bad) }.to raise_error(RuntimeError)
176
+ expect { Array(@foo).to_comma(:bad) }.to raise_error(RuntimeError)
181
177
  end
182
-
183
178
  end
184
179
 
185
180
  describe 'with block' do # rubocop:disable BlockLength
@@ -188,11 +183,11 @@ describe Comma, 'to_comma data/headers object extensions' do # rubocop:disable M
188
183
  attr_accessor :content, :created_at, :updated_at
189
184
  comma do
190
185
  content
191
- content('Truncated Content') {|i| i && i.length > 10 ? i[0..10] : '---' }
192
- created_at { |i| i && i.to_s(:db) }
193
- updated_at { |i| i && i.to_s(:db) }
194
- created_at 'Created Custom Label' do |i| i && i.to_s(:short) end
195
- updated_at 'Updated at Custom Label' do |i| i && i.to_s(:short) end
186
+ content('Truncated Content') { |i| i && i.length > 10 ? i[0..10] : '---' }
187
+ created_at { |i| i&.to_s(:db) }
188
+ updated_at { |i| i&.to_s(:db) }
189
+ created_at 'Created Custom Label' do |i| i&.to_s(:short) end
190
+ updated_at 'Updated at Custom Label' do |i| i&.to_s(:short) end
196
191
  end
197
192
 
198
193
  def initialize(content, created_at = Time.now, updated_at = Time.now)
@@ -209,38 +204,66 @@ describe Comma, 'to_comma data/headers object extensions' do # rubocop:disable M
209
204
 
210
205
  it 'should return yielded values by block' do
211
206
  _header, foo = Array(@foo).to_comma.split("\n")
212
- expect(foo).to eq([@content, @content[0..10], @time.to_s(:db), @time.to_s(:db), @time.to_s(:short), @time.to_s(:short)].join(','))
207
+ expected = [
208
+ @content,
209
+ @content[0..10],
210
+ @time.to_s(:db),
211
+ @time.to_s(:db),
212
+ @time.to_s(:short),
213
+ @time.to_s(:short)
214
+ ].join(',')
215
+ expect(foo).to eq(expected)
213
216
  end
214
217
 
215
218
  it 'should return headers with custom labels from block' do
216
219
  header, _foo = Array(@foo).to_comma.split("\n")
217
- expect(header).to eq(['Content', 'Truncated Content', 'Created at', 'Updated at', 'Created Custom Label', 'Updated at Custom Label'].join(','))
220
+ expected = [
221
+ 'Content',
222
+ 'Truncated Content',
223
+ 'Created at',
224
+ 'Updated at',
225
+ 'Created Custom Label',
226
+ 'Updated at Custom Label'
227
+ ].join(',')
228
+ expect(header).to eq(expected)
218
229
  end
219
230
 
220
231
  it 'should put headers in place when forced' do
221
- header, _foo = Array(@foo).to_comma(:write_headers => true).split("\n")
222
- expect(header).to eq(['Content', 'Truncated Content', 'Created at', 'Updated at', 'Created Custom Label', 'Updated at Custom Label'].join(','))
232
+ header, _foo = Array(@foo).to_comma(write_headers: true).split("\n")
233
+ expected = [
234
+ 'Content',
235
+ 'Truncated Content',
236
+ 'Created at',
237
+ 'Updated at',
238
+ 'Created Custom Label',
239
+ 'Updated at Custom Label'
240
+ ].join(',')
241
+ expect(header).to eq(expected)
223
242
  end
224
243
 
225
244
  it 'should not write headers if specified' do
226
- header, _foo = Array(@foo).to_comma(:write_headers => false).split("\n")
227
- expect(header).to eq([@content, @content[0..10], @time.to_s(:db), @time.to_s(:db), @time.to_s(:short), @time.to_s(:short)].join(','))
245
+ header, _foo = Array(@foo).to_comma(write_headers: false).split("\n")
246
+ expected = [
247
+ @content,
248
+ @content[0..10],
249
+ @time.to_s(:db),
250
+ @time.to_s(:db),
251
+ @time.to_s(:short),
252
+ @time.to_s(:short)
253
+ ].join(',')
254
+ expect(header).to eq(expected)
228
255
  end
229
-
230
256
  end
231
257
 
232
-
233
258
  describe 'on an object with no comma declaration' do
234
-
235
259
  it 'should raise an error mentioning there is no comma description defined for that class' do
236
260
  expect { 'a string'.to_comma }.to raise_error('No comma format for class String defined for style default')
237
- expect { 'a string'.to_comma_headers }.to raise_error('No comma format for class String defined for style default')
261
+ expect { 'a string'.to_comma_headers }
262
+ .to raise_error('No comma format for class String defined for style default')
238
263
  end
239
-
240
264
  end
241
265
 
242
266
  describe 'on objects using Single Table Inheritance' do
243
-
244
267
  before do
245
268
  class MySuperClass
246
269
  attr_accessor :content
@@ -273,9 +296,7 @@ describe Comma, 'to_comma data/headers object extensions' do # rubocop:disable M
273
296
  it 'should return and array of data content, as defined in comma block in super class, if not present in child' do
274
297
  expect(@childNoComma.to_comma).to eq(%w[super-content])
275
298
  end
276
-
277
299
  end
278
-
279
300
  end
280
301
 
281
302
  describe Comma, '__use__ keyword' do